Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
236 commits
Select commit Hold shift + click to select a range
0f2db85
feat: extract shared Agent-construction wiring into noema-core
seonghobae Sep 2, 2026
2528854
test: expose noema-core packaging and CI gaps
seonghobae Sep 2, 2026
a8ea139
test: reproduce reviewer evidence import without noema-core path
seonghobae Sep 2, 2026
66e6a5d
fix: decouple evidence imports from noema-core runtime
seonghobae Sep 2, 2026
32b78b7
test: cover lazy reviewer runtime exports
seonghobae Sep 2, 2026
c9e22f5
fix(packaging): bundle shared core into reviewer wheel
seonghobae Sep 2, 2026
2d52b10
fix(core): require lock-validated PydanticAI API floor
seonghobae Sep 2, 2026
682f9f0
fix(ci): enforce shared-core gates and installed-wheel smoke
seonghobae Sep 2, 2026
37375a6
fix(deps): align reviewer input with validated PydanticAI floor
seonghobae Sep 2, 2026
e94ba8e
docs(adr): align shared-core rollout with installable packaging
seonghobae Sep 2, 2026
2d727ec
docs(reviewer): document installable shared-core packaging
seonghobae Sep 2, 2026
6bd8184
docs(core): align package status with wheel and CI contract
seonghobae Sep 2, 2026
656aeef
test(ci): reproduce invalid reviewer wheel smoke import
seonghobae Sep 2, 2026
49e8f8b
fix(ci): smoke the exported reviewer CLI parser
seonghobae Sep 2, 2026
e60f1dd
test(ddd): keep provider SDK wiring out of noema-core
seonghobae Sep 2, 2026
eed7cf1
fix(ddd): remove provider transport from noema-core
seonghobae Sep 2, 2026
07fb3dd
fix(ddd): narrow noema-core public surface
seonghobae Sep 2, 2026
708d55b
fix(ddd): keep orchestrator transport in reviewer adapter
seonghobae Sep 2, 2026
f66f9f3
test(ddd): verify injected-model agent construction
seonghobae Sep 2, 2026
f8ae2d9
fix(ddd): remove provider extra from noema-core
seonghobae Sep 2, 2026
0d9bd5f
test(ddd): keep provider extra at reviewer adapter
seonghobae Sep 2, 2026
aad5d74
docs(ddd): document provider-neutral core boundary
seonghobae Sep 2, 2026
6b730d4
test(package): expose reviewer sdist gap
seonghobae Sep 2, 2026
6c7c64f
fix(package): stage canonical core for reviewer builds
seonghobae Sep 2, 2026
6bf8313
fix(package): retain reviewer build backend in sdist
seonghobae Sep 2, 2026
aa12283
fix(package): make reviewer sdist self-contained
seonghobae Sep 2, 2026
f899483
fix(package): stage core for all PEP 517 hooks
seonghobae Sep 2, 2026
949da3c
chore(package): ignore reviewer build staging
seonghobae Sep 2, 2026
d4f3261
fix(package): exercise reviewer PEP 517 backend
seonghobae Sep 2, 2026
728ef67
test(package): lock self-contained reviewer sdist contract
seonghobae Sep 2, 2026
c3a1dd9
test(core): reject unresolved model routing strings
seonghobae Sep 2, 2026
5687bb0
fix(core): keep model routing outside shared kernel
seonghobae Sep 2, 2026
364e926
docs(core): require caller-resolved model adapters
seonghobae Sep 2, 2026
939cb8f
test(reviewer): block shared-core site-package leakage
seonghobae Sep 2, 2026
2b9fe6c
test(packaging): require PEP 660 editable hooks
seonghobae Sep 2, 2026
1826bb1
fix(packaging): preserve PEP 660 editable installs
seonghobae Sep 2, 2026
5da998d
test(reviewer): preserve independent-reviewer identity
seonghobae Sep 2, 2026
cb59e9a
fix(reviewer): preserve role identity and resolved-model boundary
seonghobae Sep 2, 2026
5b4201a
test(packaging): exercise clean editable reviewer install
seonghobae Sep 2, 2026
4f3dd33
fix(packaging): keep editable core linked to canonical source
seonghobae Sep 2, 2026
7c72bbe
fix(ci): use explicit empty PYTHONPATH assignment
seonghobae Sep 2, 2026
5363c6e
test(core): require composable role-neutral identity
seonghobae Sep 2, 2026
14891ae
fix(core): make shared Noema identity role-neutral
seonghobae Sep 2, 2026
485739e
fix(reviewer): compose bounded role from shared identity
seonghobae Sep 2, 2026
edd720c
docs(core): document role-neutral identity contract
seonghobae Sep 2, 2026
ab1ec25
test(packaging): reproduce staging races and editable clobbering
seonghobae Sep 2, 2026
a8a762f
test(packaging): require isolated editable installation contract
seonghobae Sep 2, 2026
7391746
fix(packaging): isolate reviewer build staging
seonghobae Sep 2, 2026
27e7ada
fix(packaging): reload staged setuptools context
seonghobae Sep 2, 2026
01f3264
test(packaging): expose isolated backend path loss
seonghobae Sep 2, 2026
1180465
test(packaging): parse editable smoke command tokens
seonghobae Sep 2, 2026
9fa70a3
fix(packaging): preserve isolated backend environment
seonghobae Sep 2, 2026
2dacd1a
Merge 9fa70a39f5a3de822df06afd14c5284ab1017e39 into 1a868c2dc64e7a949…
seonghobae Sep 2, 2026
7d0cc8d
Merge protected main into noema-core shared package
seonghobae Sep 3, 2026
a0c8744
docs(reviewer): align shared-core provider boundary
seonghobae Sep 3, 2026
6429c88
test(core): forbid shared-kernel retry authority
seonghobae Sep 3, 2026
482cb1a
fix(core): remove shared-kernel retry authority
seonghobae Sep 3, 2026
fe6e91f
fix(reviewer): keep retry authority outside noema-core
seonghobae Sep 3, 2026
7f92cee
docs(core): keep retry policy outside shared kernel
seonghobae Sep 3, 2026
6292cc4
fix(ci): skip docs-only changes for ci, reviewer-ci, patch-validator-…
seonghobae Sep 3, 2026
fa4bb2b
test(ci): reject docs-only verification suppression
seonghobae Sep 3, 2026
def52aa
fix(ci): keep application verification mandatory for docs-only changes
seonghobae Sep 3, 2026
6bc6e59
fix(ci): keep reviewer verification mandatory for docs-only changes
seonghobae Sep 3, 2026
60b8333
fix(ci): keep image verification mandatory for docs-only changes
seonghobae Sep 3, 2026
d6c8c5e
fix(reviewer): explain intentional editable-link restaging
seonghobae Sep 3, 2026
02005d0
docs(changelog): record noema-core shared kernel
seonghobae Sep 3, 2026
2d2343b
fix(reviewer): remove empty exception handler
seonghobae Sep 3, 2026
ab74965
test(reviewer): isolate wheel install from source metadata
seonghobae Sep 3, 2026
cb49471
fix(reviewer): isolate wheel smoke installation
seonghobae Sep 3, 2026
a14cbe0
fix(ci): make wheel isolation contract indentation-agnostic
seonghobae Sep 4, 2026
03f08ed
fix(reviewer): bind failed checks to actionable source evidence
seonghobae Sep 4, 2026
182d63e
test(reviewer): require one RCA per failed check
seonghobae Sep 4, 2026
6ff7954
fix(reviewer): model exact failed-check source binding
seonghobae Sep 4, 2026
2ad138f
fix(reviewer): bind each failed check to its own RCA
seonghobae Sep 4, 2026
bd364a0
test(reviewer): bind actionable RCA to exact check
seonghobae Sep 4, 2026
20c35e7
fix(reviewer): require exact failed-check identity in RCA
seonghobae Sep 4, 2026
2361b76
test(reviewer): cover exact failed-check causal binding
seonghobae Sep 4, 2026
1f7d76d
docs(reviewer): document failed-check causal binding
seonghobae Sep 4, 2026
2238410
docs(reviewer): make failed-check RCA contract code-current
seonghobae Sep 4, 2026
0a6fac8
feat(reviewer): enforce actionable finding contract (#549)
seonghobae Sep 4, 2026
b2d2853
docs(reviewer): align sandbox contract with actionable findings
seonghobae Sep 4, 2026
7d4aa92
docs(reviewer): document actionable finding publication
seonghobae Sep 4, 2026
e924c46
Merge fix/codegraph-smoke-semantic-gate into failed-check RCA
seonghobae Sep 4, 2026
8a30e4a
Merge fix/codegraph-smoke-semantic-gate into failed-check RCA
seonghobae Sep 4, 2026
5531a53
Merge protected main into noema-core package lane
seonghobae Sep 4, 2026
83c319b
Merge protected main into docs-gate regression lane
seonghobae Sep 4, 2026
ba480c8
Merge current CodeGraph provenance authority into failed-check RCA
seonghobae Sep 4, 2026
eae8803
Merge current CodeGraph response-classification authority into failed…
seonghobae Sep 4, 2026
dd5c0f0
test(reviewer): inherit lifecycle-prefixed empty-result regression
seonghobae Sep 4, 2026
3e2615f
fix(reviewer): inherit lifecycle-aware CodeGraph classification
seonghobae Sep 4, 2026
ebe554a
style(reviewer): preserve stacked gate structure after restack repair
seonghobae Sep 4, 2026
df7f499
docs(reviewer): inherit semantic empty-result prefix contract
seonghobae Sep 4, 2026
b31de77
merge: restack failed-check RCA on current CodeGraph gate
seonghobae Sep 4, 2026
bc7111a
ci(actions): isolate pull request concurrency
seonghobae Sep 4, 2026
a8d6ba9
test(ci): align image concurrency contract
seonghobae Sep 4, 2026
e4adc92
merge: restack failed-check RCA on reviewer fixture repair
seonghobae Sep 4, 2026
8d0f949
docs(reviewer): carry symbol-seeded recovery contract into failed-che…
seonghobae Sep 4, 2026
39adb66
merge: restack failed-check lane on symbol-seeded reviewer recovery
seonghobae Sep 4, 2026
765757b
fix(actions): centralize hourly development admission
seonghobae Sep 4, 2026
cb04d4f
test(actions): align central development dispatch contract
seonghobae Sep 4, 2026
068ea2f
fix(actions): dispatch centralized product development
seonghobae Sep 4, 2026
f0f9f61
test(actions): reject elapsed model-run termination
seonghobae Sep 4, 2026
b23435f
fix(actions): separate admin timeout from model execution
seonghobae Sep 4, 2026
9e46758
test(actions): drop obsolete model timeout budget assertion
seonghobae Sep 4, 2026
552abc4
test(actions): distinguish admin and model termination
seonghobae Sep 4, 2026
258d0b5
test(actions): remove obsolete elapsed-time budget helper
seonghobae Sep 4, 2026
1cd5cfa
docs(actions): distinguish admin and model termination
seonghobae Sep 4, 2026
482e773
merge: restack failed-check lane on unambiguous CodeGraph recovery
seonghobae Sep 4, 2026
97227ab
merge: inherit bounded CodeGraph recovery coverage
seonghobae Sep 4, 2026
1d8fbdf
merge: inherit lifecycle-safe CodeGraph recovery
seonghobae Sep 4, 2026
dd405f1
merge: inherit exact-whitespace CodeGraph recovery
seonghobae Sep 4, 2026
b61daf1
docs(reviewer): preserve exact-whitespace retrieval contract
seonghobae Sep 4, 2026
3d76ab1
merge: inherit code-current CodeGraph recovery docs
seonghobae Sep 4, 2026
ca300fe
fix(reviewer): preserve exact CodeGraph path scope in failed-check lane
seonghobae Sep 4, 2026
39325bd
docs(reviewer): inherit exact CodeGraph path scope contract
seonghobae Sep 4, 2026
fababd1
test(reviewer): inherit long CodeGraph path identity regression
seonghobae Sep 4, 2026
ef046ed
merge: inherit exact CodeGraph path identity prerequisite
seonghobae Sep 4, 2026
1a2ec03
test(reviewer): inherit CodeGraph scope coverage guard
seonghobae Sep 4, 2026
19c24b4
merge: inherit CodeGraph scope coverage prerequisite
seonghobae Sep 4, 2026
3fdfc1c
docs(reviewer): compose exact long-path recovery with actionable find…
seonghobae Sep 4, 2026
f0ed4b2
merge: inherit exact long-path CodeGraph recovery
seonghobae Sep 4, 2026
32cf314
fix(reviewer): inherit CodeGraph environment isolation
seonghobae Sep 5, 2026
581e5ca
test(reviewer): preserve CodeGraph environment isolation
seonghobae Sep 5, 2026
7c039a8
test(reviewer): inherit ambient CodeGraph authority regression
seonghobae Sep 5, 2026
4df310b
docs(reviewer): retain CodeGraph ambient-authority boundary
seonghobae Sep 5, 2026
99b168e
merge: restack failed-check evidence on CodeGraph isolation
seonghobae Sep 5, 2026
19ebf00
fix(reviewer): preserve actionability while excluding self-check
seonghobae Sep 5, 2026
d3c69c5
test(reviewer): retain self-check cycle regression
seonghobae Sep 5, 2026
70d160e
test(reviewer): retain isolated CodeGraph home regression
seonghobae Sep 5, 2026
a61cc29
fix(reviewer): preserve causal logs with isolated CodeGraph home
seonghobae Sep 5, 2026
491ecad
docs(reviewer): compose actionability with self-check and isolated home
seonghobae Sep 5, 2026
626670d
merge: inherit reviewer self-check and isolated-home prerequisite
seonghobae Sep 5, 2026
61599f8
docs(reviewer): compose complete CodeGraph recovery contract
seonghobae Sep 5, 2026
13749c1
merge: inherit complete CodeGraph recovery boundary
seonghobae Sep 5, 2026
6d9626e
test(reviewer): inherit independent check evidence RED
seonghobae Sep 5, 2026
2c041db
fix(reviewer): compose independent check evidence boundary
seonghobae Sep 5, 2026
1160aca
docs(reviewer): compose independent evidence cycle rule
seonghobae Sep 5, 2026
76c5d70
merge: inherit independent evidence prerequisite
seonghobae Sep 5, 2026
decfcfb
test(actions): keep buyer-gap development work-conserving
seonghobae Sep 5, 2026
5e84885
fix(actions): keep buyer-gap development work-conserving
seonghobae Sep 5, 2026
9032aea
fix(actions): isolate concurrent buyer-gap proposal paths
seonghobae Sep 5, 2026
024a94a
docs(actions): document work-conserving path isolation
seonghobae Sep 5, 2026
da66ec6
docs(doctoring): record work-conserving isolation decision
seonghobae Sep 5, 2026
7d850f6
test(actions): require work-conserving path isolation
seonghobae Sep 5, 2026
3bc5449
fix(reviewer): preserve distinct deterministic findings
seonghobae Sep 5, 2026
10f4241
test(reviewer): retain distinct deterministic finding evidence
seonghobae Sep 5, 2026
08720c9
merge: compose deterministic finding identity prerequisite
seonghobae Sep 5, 2026
db1b6a6
test(reviewer): inherit CodeGraph probe-budget boundary
seonghobae Sep 5, 2026
5b6bdc8
merge: restack #548 on #546 reviewer prerequisite
seonghobae Sep 5, 2026
5bf6ed6
merge: restack #548 on complete CodeGraph recovery
seonghobae Sep 5, 2026
dcb961a
fix(reviewer): preserve complete CodeGraph primary scope
seonghobae Sep 5, 2026
fed0831
docs(reviewer): retain exact CodeGraph scope in actionable lane
seonghobae Sep 5, 2026
52804b1
merge: restack #548 on complete CodeGraph primary scope
seonghobae Sep 5, 2026
76d20ff
merge(reviewer): compose symlink-safe CodeGraph seed boundary
seonghobae Sep 5, 2026
852fae2
merge(reviewer): inherit symlink-parent recovery regression
seonghobae Sep 5, 2026
a80493d
merge(reviewer): document symlink-free recovery on #548
seonghobae Sep 5, 2026
51b3bf8
merge: restack #548 on symlink-safe CodeGraph seed boundary
seonghobae Sep 5, 2026
0b7b911
merge: restack #548 on review-wait cycle repair
seonghobae Sep 5, 2026
c5ed0cf
merge: restack #548 on complete symbol-map recovery
seonghobae Sep 5, 2026
5d97fa8
fix(tests): align commercial dispatch with work-conserving admission
seonghobae Sep 5, 2026
b91b1c4
fix(tests): track path-isolated publisher revalidation
seonghobae Sep 5, 2026
abaf95c
merge: restack #548 on physical CodeGraph checkout provenance
seonghobae Sep 5, 2026
86038ef
merge: restack #548 on exact CodeGraph path identity
seonghobae Sep 5, 2026
f69b3a8
docs: fix stale "active PR #80" references in automation-threat-model.md
claude Sep 5, 2026
0a039bf
merge: restack #548 on Unicode CodeGraph scope parity
seonghobae Sep 5, 2026
7cbdeee
merge: restack #548 on executable CodeGraph retry semantics
seonghobae Sep 5, 2026
fa93ba3
merge: restack #548 on physical Docker checkout provenance
seonghobae Sep 5, 2026
2814e5e
test(docs): bind publisher threat controls to protected implementation
seonghobae Sep 5, 2026
107a973
docs: reflect protected atomic publisher controls
seonghobae Sep 5, 2026
19315d9
merge: restack #548 on complete reviewer context
seonghobae Sep 5, 2026
a7066ea
merge: restack #548 on fail-before-execution reviewer scope
seonghobae Sep 5, 2026
6f57924
fix(reviewer): preserve prompt-data boundary in failed-check lane
seonghobae Sep 5, 2026
7e2522e
merge: restack #548 on JSON-scope reviewer recovery
seonghobae Sep 5, 2026
24c9993
merge: restack #548 on JSON-safe symbol recovery
seonghobae Sep 5, 2026
1209874
docs(reviewer): merge JSON-safe seed contract into #548
seonghobae Sep 5, 2026
bb7aacf
merge: restack #548 on reviewer recovery documentation
seonghobae Sep 5, 2026
dd73533
merge: restack #548 on exact Linux path identity prerequisite
seonghobae Sep 5, 2026
65a256b
test(reviewer): align #548 deterministic identity fixture
seonghobae Sep 5, 2026
bb8fe78
merge: restack #548 on reviewer hosted-RED repair
seonghobae Sep 5, 2026
a545af0
test(actions): make spawn spy test callback async
seonghobae Sep 5, 2026
d3b42ac
merge: restack #548 on reviewer docstring repair
seonghobae Sep 5, 2026
d23a055
test(actions): align readiness fixtures with current authority
seonghobae Sep 5, 2026
4d8f314
test(reviewer): cover failed-check edge branches
seonghobae Sep 5, 2026
2fa21a1
merge: restack #548 on protected reviewer truth
seonghobae Sep 6, 2026
b0f747a
merge: restack #553 on protected reviewer truth
seonghobae Sep 6, 2026
f6c6af5
merge: restack #543 on protected reviewer truth
seonghobae Sep 6, 2026
2de27d2
merge: restack #550 on protected reviewer truth
seonghobae Sep 6, 2026
52b66ca
merge(reviewer): restack shared noema-core on protected reviewer foun…
seonghobae Sep 6, 2026
cf5dfa1
merge(context-fabric): restack shared noema-core on protected context…
seonghobae Sep 6, 2026
6f09d16
merge(context-fabric): restack required-gate regression on protected …
seonghobae Sep 6, 2026
ec3dbdf
merge(context-fabric): restack automation threat-model docs on protec…
seonghobae Sep 6, 2026
a0823f1
merge(context-fabric): restack failed-check evidence on protected con…
seonghobae Sep 6, 2026
158d818
merge(context-fabric): restack concurrency owner on protected context…
seonghobae Sep 6, 2026
6551a86
test(reviewer): expose non-exact finding line admission
seonghobae Sep 6, 2026
5c20453
fix(reviewer): require exact positive finding lines
seonghobae Sep 6, 2026
02ec900
chore(reviewer): keep line-contract repair minimal
seonghobae Sep 6, 2026
908d9cc
docs(release): restore noema-core Unreleased note
seonghobae Sep 6, 2026
f6ec87a
fix(reviewer): retain self-cycle exclusion
seonghobae Sep 6, 2026
fc2655b
merge: converge automation threat model onto protected #533 truth
seonghobae Sep 6, 2026
c9c2d86
merge: converge exact-head gate regression onto protected #533 truth
seonghobae Sep 6, 2026
3cb7261
merge: converge failed-check evidence onto protected #533 truth
seonghobae Sep 6, 2026
6d6e0a4
merge: converge noema-core Shared Kernel onto protected #533 truth
seonghobae Sep 6, 2026
fec1025
chore(hourly): restack run-independence lane on protected main
seonghobae Sep 6, 2026
a1172fc
merge: converge noema-core Shared Kernel onto protected #552 truth
seonghobae Sep 6, 2026
12f8e3d
merge: converge workflow-concurrency lane onto protected #552 truth
seonghobae Sep 6, 2026
a6970ca
merge: converge exact-head gate regression onto protected #552 truth
seonghobae Sep 6, 2026
722fa12
merge: converge automation threat model onto protected #552 truth
seonghobae Sep 6, 2026
75f93fd
merge: converge failed-check evidence onto protected #552 truth
seonghobae Sep 6, 2026
049a57d
merge: restack reviewer evidence after #527 trust integration
seonghobae Sep 6, 2026
8415e3c
merge: restack noema-core after #527 trust integration
seonghobae Sep 6, 2026
f07679d
merge: restack exact-head gate regression after #527 trust integration
seonghobae Sep 6, 2026
4659f8b
merge: restack automation threat model after #527 trust integration
seonghobae Sep 6, 2026
ad0f512
merge: restack workflow concurrency after #527 trust integration
seonghobae Sep 6, 2026
3ed5bd9
merge(main): restack workflow concurrency after protected trust integ…
seonghobae Sep 6, 2026
a016521
merge(main): restack automation threat model after protected trust in…
seonghobae Sep 6, 2026
e255bf1
merge(main): restack exact-head gate regression after protected trust…
seonghobae Sep 6, 2026
82366b2
merge(main): restack noema-core after protected trust integration
seonghobae Sep 6, 2026
e24d310
merge(main): restack reviewer evidence after protected trust integration
seonghobae Sep 6, 2026
b14b37c
merge(restack): rebase #543 onto protected main d9b2a95
seonghobae Sep 7, 2026
4c213e1
merge(restack): converge #553 on protected main d9b2a95
seonghobae Sep 7, 2026
aeb9c46
merge(main): non-force restack workflow concurrency after #526
seonghobae Sep 7, 2026
a5cd666
chore: restack noema-core foundation on protected main
seonghobae Sep 7, 2026
fdf1d8e
docs: preserve noema-core changelog on current main
seonghobae Sep 7, 2026
5cd6341
Merge pull request #543 from ContextualWisdomLab/chore/paths-ignore-fix
seonghobae Sep 7, 2026
4fe6fe8
chore: restack noema-core on protected main
seonghobae Sep 7, 2026
4c92578
merge(main): non-force restack threat-model docs after #543
seonghobae Sep 7, 2026
289fbb0
merge(main): non-force restack workflow concurrency after #543
seonghobae Sep 7, 2026
4c1d174
Merge pull request #536 from ContextualWisdomLab/feat/noema-core-shar…
seonghobae Sep 7, 2026
fb44888
chore(restack): merge protected main into #548 branch
seonghobae Sep 7, 2026
31d2e5c
chore: converge #553 on current protected main
seonghobae Sep 7, 2026
210fd23
chore: converge #550 on protected #536 foundation
seonghobae Sep 7, 2026
e6de53a
Merge pull request #548 from ContextualWisdomLab/codex/noema-failed-c…
seonghobae Sep 7, 2026
c03d946
chore: converge automation threat model after reviewer evidence merge
seonghobae Sep 7, 2026
f2ec2dc
chore: converge workflow concurrency after reviewer evidence merge
seonghobae Sep 7, 2026
6b5b2c8
Merge pull request #550 from ContextualWisdomLab/codex/actions-concur…
seonghobae Sep 7, 2026
3bd9f54
docs: converge automation threat model after workflow concurrency merge
seonghobae Sep 7, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/central-review.yml
Original file line number Diff line number Diff line change
Expand Up @@ -429,7 +429,7 @@ jobs:
- name: Run independent PydanticAI review and publish current-head verdict
env:
GH_TOKEN: ${{ steps.noema_write_app.outputs.token }}
PYTHONPATH: ${{ github.workspace }}/reviewer
PYTHONPATH: ${{ github.workspace }}/reviewer:${{ github.workspace }}/packages/noema-core/src
NOEMA_REVIEW_TOKEN_SOURCE: noema-github-app
NOEMA_LLM_API_URL: ${{ vars.NOEMA_LLM_API_URL }}
NOEMA_LLM_MODEL: ${{ vars.NOEMA_LLM_MODEL }}
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@ on:
- main

concurrency:
group: noema-ci-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
group: ${{ github.workflow }}-${{ github.repository }}-${{ github.event_name == 'pull_request' && github.event.pull_request.number || github.run_id }}
cancel-in-progress: ${{ github.event_name == 'pull_request' }}

jobs:
verify:
Expand Down
116 changes: 89 additions & 27 deletions .github/workflows/hourly-product-development.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,6 @@ on:
required: false
default: false
type: boolean
schedule:
- cron: "47 * * * *"

concurrency:
group: hourly-orchestrator-product-development-${{ github.repository }}
cancel-in-progress: false
Expand All @@ -22,9 +19,6 @@ env:
DEFAULT_BRANCH: main
OPENCODE_VERSION: "1.17.13"
OPENCODE_SHA256: 157afa289d1a8d9372de0ce19ac726119b937a1f6b201808d46f06e4e59bb348
# One gateway-backed session plus setup/diagnostic reserve fits in 55 minutes.
OPENCODE_RUN_TIMEOUT_SECONDS: "2700"
OPENCODE_KILL_GRACE_SECONDS: "30"
MAX_CHANGED_FILES: "40"
MAX_DIFF_BYTES: "500000"
MAX_PR_TITLE_BYTES: "120"
Expand All @@ -51,7 +45,7 @@ jobs:
env:
DRY_RUN: ${{ github.event_name == 'workflow_dispatch' && inputs.dry_run || false }}
steps:
- name: Enforce zero-open-PR single-flight gate
- name: Validate work-conserving single-flight admission
id: gate
shell: bash
env:
Expand Down Expand Up @@ -80,13 +74,9 @@ jobs:
fi

if [ "$(jq 'length' <<<"$open_prs")" -gt 0 ]; then
{
echo "dispatch=false"
echo "reason=open_pull_request"
} >>"$GITHUB_OUTPUT"
echo "An open pull request exists; exact-head PR governance owns this hour." \
echo "open_pull_request_count=at_least_one" >>"$GITHUB_OUTPUT"
echo "Open pull-request lanes remain; a new proposal is allowed only if publication proves path isolation from every live PR." \
>>"$GITHUB_STEP_SUMMARY"
exit 0
fi

if { [ "$ORCHESTRATOR_KEY_CONFIGURED" != "true" ] \
Expand Down Expand Up @@ -141,6 +131,12 @@ jobs:
supportability, or operations gap that can be completed as exactly one bounded
pull request. Do not create another repository.

Existing open pull requests are independent governance lanes, not a global stop.
Select an unrelated buyer gap from current protected main. A trusted publisher will
fail closed if any proposed changed path overlaps any live open pull request or if
protected main advances. Do not intentionally duplicate or replace work already owned
by an active pull-request lane.

Keep Noema independently deployable and preserve its modular MSA role with
ContextualWisdomLab/.github, naruon, contextual-orchestrator, and other CWL
services. Keep interfaces explicit and replaceable. Route every Noema LLM
Expand Down Expand Up @@ -206,7 +202,7 @@ jobs:
run: |
set -euo pipefail
{
echo "Dry run: the zero-open-PR gate permits one bounded OpenCode proposal."
echo "Dry run: work-conserving admission permits one bounded OpenCode proposal; publication still requires current-base and open-PR path isolation."
echo
cat "$RUNNER_TEMP/noema-agent-prompt.md"
} >>"$GITHUB_STEP_SUMMARY"
Expand Down Expand Up @@ -280,8 +276,7 @@ jobs:
run: |
set -euo pipefail
prompt="$(cat "$RUNNER_TEMP/noema-agent-prompt.md")"
if timeout --kill-after="${OPENCODE_KILL_GRACE_SECONDS}s" "${OPENCODE_RUN_TIMEOUT_SECONDS}s" \
env -u GH_TOKEN -u GITHUB_TOKEN \
if env -u GH_TOKEN -u GITHUB_TOKEN \
-u REPOSITORY_TOKEN \
-u ACTIONS_ID_TOKEN_REQUEST_TOKEN \
-u ACTIONS_ID_TOKEN_REQUEST_URL \
Expand Down Expand Up @@ -712,7 +707,7 @@ jobs:
permission-metadata: read
permission-pull-requests: write

- name: Revalidate queue and default-branch head
- name: Revalidate open-PR path isolation and default-branch head
shell: bash
env:
GH_TOKEN: ${{ steps.maintainer_app.outputs.token }}
Expand All @@ -725,20 +720,81 @@ jobs:
exit 1
fi

if ! open_prs="$(
gh pr list \
--repo "$GITHUB_REPOSITORY" \
--state open \
--limit 1 \
--json number,url
proposal_paths="$RUNNER_TEMP/proposal-paths.b64"
git diff --cached --name-only -z | node -e '
const chunks = [];
process.stdin.on("data", (chunk) => chunks.push(chunk));
process.stdin.on("end", () => {
const names = Buffer.concat(chunks).toString("utf8").split("\0").filter(Boolean);
for (const name of names) {
process.stdout.write(Buffer.from(name, "utf8").toString("base64") + "\n");
}
});
' >"$proposal_paths"
LC_ALL=C sort -u -o "$proposal_paths" "$proposal_paths"

isolation_check="$RUNNER_TEMP/verify-open-pr-path-isolation.sh"
cat >"$isolation_check" <<'SCRIPT'
#!/usr/bin/env bash
set -euo pipefail
exclude_pr="${1:-}"
proposal_paths="$RUNNER_TEMP/proposal-paths.b64"
reserved_paths="$RUNNER_TEMP/open-pr-paths.b64"
overlap_paths="$RUNNER_TEMP/open-pr-overlap.b64"
: >"$reserved_paths"

if ! open_pr_numbers="$(
gh api --paginate \
"repos/${GITHUB_REPOSITORY}/pulls?state=open&per_page=100" \
--jq '.[].number'
)"; then
echo "::error::pull_request_inventory_unavailable_after_generation"
exit 1
fi
if [ "$(jq 'length' <<<"$open_prs")" -gt 0 ]; then
echo "::error::open_pull_request_after_generation"

while IFS= read -r pull_number; do
[ -n "$pull_number" ] || continue
if ! [[ "$pull_number" =~ ^[1-9][0-9]*$ ]]; then
echo "::error::pull_request_inventory_invalid_after_generation"
exit 1
fi
if [ -n "$exclude_pr" ] && [ "$pull_number" = "$exclude_pr" ]; then
continue
fi
if ! expected_files="$(
gh api "repos/${GITHUB_REPOSITORY}/pulls/${pull_number}" --jq '.changed_files'
)"; then
echo "::error::pull_request_file_inventory_unavailable_after_generation"
exit 1
fi
if ! [[ "$expected_files" =~ ^[0-9]+$ ]] || [ "$expected_files" -gt 3000 ]; then
echo "::error::pull_request_file_inventory_unbounded_after_generation"
exit 1
fi
before_count="$(wc -l <"$reserved_paths" | tr -d '[:space:]')"
if ! gh api --paginate \
"repos/${GITHUB_REPOSITORY}/pulls/${pull_number}/files?per_page=100" \
--jq '.[].filename | @base64' >>"$reserved_paths"; then
echo "::error::pull_request_file_inventory_unavailable_after_generation"
exit 1
fi
after_count="$(wc -l <"$reserved_paths" | tr -d '[:space:]')"
if [ $((after_count - before_count)) -ne "$expected_files" ]; then
echo "::error::pull_request_file_inventory_incomplete_after_generation"
exit 1
fi
done <<<"$open_pr_numbers"

LC_ALL=C sort -u -o "$reserved_paths" "$reserved_paths"
comm -12 "$proposal_paths" "$reserved_paths" >"$overlap_paths"
if [ -s "$overlap_paths" ]; then
echo "::error::open_pull_request_after_generation_path_overlap"
exit 1
fi
SCRIPT
chmod 0500 "$isolation_check"

"$isolation_check"

if ! live_base="$(
gh api \
Expand Down Expand Up @@ -894,13 +950,19 @@ jobs:
echo "::error::created_pull_request_queue_inventory_unavailable"
false
fi
if [ "$open_pr_numbers" != "$pr_number" ]; then
created_pr_occurrences="$(grep -Fxc -- "$pr_number" <<<"$open_pr_numbers" || true)"
if [ "$created_pr_occurrences" -ne 1 ]; then
echo "::error::created_pull_request_queue_conflict"
false
fi

if ! "$RUNNER_TEMP/verify-open-pr-path-isolation.sh" "$pr_number"; then
echo "::error::created_pull_request_queue_conflict_path_overlap"
false
fi

trap - ERR
{
echo "Opened bounded pull request: $pr_url"
echo "Opened bounded path-isolated pull request: $pr_url"
echo "hourly-commercial-readiness owns review, repair, exact-head revalidation, and merge."
} >>"$GITHUB_STEP_SUMMARY"
4 changes: 2 additions & 2 deletions .github/workflows/patch-validator-image.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ on:
workflow_dispatch:

concurrency:
group: noema-patch-validator-image-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
group: ${{ github.workflow }}-${{ github.repository }}-${{ github.event_name == 'pull_request' && github.event.pull_request.number || github.run_id }}
cancel-in-progress: ${{ github.event_name == 'pull_request' }}

permissions:
contents: read
Expand Down
93 changes: 90 additions & 3 deletions .github/workflows/reviewer-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@ on:
- main

concurrency:
group: noema-reviewer-ci-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
group: ${{ github.workflow }}-${{ github.repository }}-${{ github.event_name == 'pull_request' && github.event.pull_request.number || github.run_id }}
cancel-in-progress: ${{ github.event_name == 'pull_request' }}

permissions:
contents: read
Expand All @@ -20,6 +20,7 @@ jobs:
timeout-minutes: 30
env:
NOEMA_CODEGRAPH_SANDBOX_SOURCE_IMAGE: gcr.io/distroless/java-base-debian13:nonroot
PYTHONPATH: ${{ github.workspace }}/reviewer:${{ github.workspace }}/packages/noema-core/src
defaults:
run:
working-directory: reviewer
Expand Down Expand Up @@ -50,12 +51,98 @@ jobs:
- name: install (hash-pinned dependencies)
run: pip install --require-hashes --no-deps -r requirements-ci-hashes.txt

- name: test noema-core (100% line+branch coverage gate)
working-directory: packages/noema-core
run: python -m pytest

- name: docstring coverage noema-core (100% gate)
working-directory: packages/noema-core
run: python -m interrogate -c pyproject.toml src/noema_core

- name: test (100% line+branch coverage gate)
run: python -m pytest

- name: docstring coverage (100% gate)
run: python -m interrogate -c pyproject.toml noema_reviewer

- name: smoke-test installed reviewer wheel and sdist-to-wheel path
run: |
set -euo pipefail
wheel_dir="$RUNNER_TEMP/noema-reviewer-wheel"
sdist_dir="$RUNNER_TEMP/noema-reviewer-sdist"
sdist_wheel_dir="$RUNNER_TEMP/noema-reviewer-sdist-wheel"
direct_venv="$RUNNER_TEMP/noema-reviewer-install-smoke"
sdist_venv="$RUNNER_TEMP/noema-reviewer-sdist-install-smoke"
mkdir -p "$wheel_dir" "$sdist_dir" "$sdist_wheel_dir"

python -m pip wheel . --no-deps --no-build-isolation --wheel-dir "$wheel_dir"
direct_wheel="$(find "$wheel_dir" -maxdepth 1 -type f -name 'noema_reviewer-*.whl' -print -quit)"
test -n "$direct_wheel"

SDIST_DIR="$sdist_dir" SDIST_NAME_FILE="$RUNNER_TEMP/noema-reviewer-sdist-name" python - <<'PY'
import os
from pathlib import Path
from build_backend import build_sdist

sdist_name = build_sdist(os.environ["SDIST_DIR"])
Path(os.environ["SDIST_NAME_FILE"]).write_text(sdist_name, encoding="utf-8")
PY
sdist="$sdist_dir/$(cat "$RUNNER_TEMP/noema-reviewer-sdist-name")"
test -f "$sdist"
python -m pip wheel "$sdist" --no-deps --no-build-isolation --wheel-dir "$sdist_wheel_dir"
sdist_wheel="$(find "$sdist_wheel_dir" -maxdepth 1 -type f -name 'noema_reviewer-*.whl' -print -quit)"
test -n "$sdist_wheel"

for contract in direct sdist; do
if [ "$contract" = direct ]; then
wheel="$direct_wheel"
venv_dir="$direct_venv"
else
wheel="$sdist_wheel"
venv_dir="$sdist_venv"
fi
python -m venv --system-site-packages "$venv_dir"
(
cd "$RUNNER_TEMP"
PYTHONPATH='' "$venv_dir/bin/python" -m pip install --no-deps "$wheel"
PYTHONPATH='' "$venv_dir/bin/python" - <<'PY'
import hashlib
import os
from pathlib import Path

import noema_core
import noema_core.agent
import noema_reviewer
from noema_reviewer.cli import parse_args

canonical_agent = Path(os.environ["GITHUB_WORKSPACE"]) / "packages" / "noema-core" / "src" / "noema_core" / "agent.py"
installed_agent = Path(noema_core.agent.__file__)
assert hashlib.sha256(installed_agent.read_bytes()).digest() == hashlib.sha256(canonical_agent.read_bytes()).digest()
assert noema_core.NOEMA_PERSONA
assert noema_reviewer.build_agent is not None
assert parse_args([]).repo == ""
PY
)
done

- name: smoke-test isolated editable reviewer with locked runtime dependencies
run: |
set -euo pipefail
editable_venv="$RUNNER_TEMP/noema-reviewer-editable-smoke"
python -m venv "$editable_venv"
"$editable_venv/bin/python" -m pip install --require-hashes --no-deps -r requirements-ci-hashes.txt
"$editable_venv/bin/python" -m pip install --no-deps -e .
(
cd "$RUNNER_TEMP"
PYTHONPATH='' "$editable_venv/bin/python" - <<'PY'
import noema_core
import noema_reviewer

assert noema_core.build_agent is not None
assert noema_reviewer.build_agent is not None
PY
)

- name: install lock-pinned CodeGraph tooling for sandbox smoke test
env:
NPM_CONFIG_IGNORE_SCRIPTS: "true"
Expand Down Expand Up @@ -98,7 +185,7 @@ jobs:
source_root="$RUNNER_TEMP/noema-codegraph-smoke"
mkdir -p "$source_root"
printf 'export const commercialReadiness = true;\n' >"$source_root/example.ts"
PYTHONPATH=. python - <<'PY'
python - <<'PY'
import os
from noema_reviewer.sandbox import DockerCodeGraphRunner

Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -11,3 +11,4 @@ exchange-30d.ndjson
exchange-30d.ndjson.provenance.json
noema-kpi-evidence.json
noema-smoke-evidence.json
reviewer/_build_include/
Loading
Loading