Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
340 commits
Select commit Hold shift + click to select a range
feeaf7f
fix: resolve slash-relative Codex commands on Windows
Oct 16, 2026
ce48c9f
fix(github): isolate pinned App author trust
Oct 16, 2026
d41a68f
fix(explain): use the validated check App pin
Oct 16, 2026
3a70d85
Merge pinned App author isolation into collection handling
Oct 16, 2026
2fb64ae
feat(runtime): bind public evaluation identity and publication metadata
Oct 16, 2026
d0e8fc5
fix(eval): define Phase 2 measurement admission
Oct 16, 2026
6d41f52
Merge main into residual critic parity fix
Oct 16, 2026
09f7538
fix(runtime): preserve private identity drift and reject opaque compa…
Oct 16, 2026
4c9b431
fix(eval): withhold private identity read diagnostics
Oct 16, 2026
fa828e1
fix(eval): reject unknown ACP identity and private attestation labels
Oct 16, 2026
d29ad6a
fix(eval): bind declared credentials and platform launcher names
Oct 16, 2026
2538397
Merge main into untrusted policy review branch
Oct 16, 2026
6b101d7
test(eval): reproduce Windows public launcher metadata failures
Oct 16, 2026
7164f44
fix(eval): normalize Windows public launcher metadata
Oct 16, 2026
6b21217
Keep Grok startup outside target repository policy
Oct 16, 2026
2f7339e
test(eval): reject drive-dependent Windows launcher metadata
Oct 16, 2026
6fa5ace
fix(eval): require fully qualified Windows launcher paths
Oct 16, 2026
17fc8e3
test(eval): reproduce embedded private publication labels
Oct 16, 2026
4680af3
fix(eval): reject embedded private publication labels
Oct 16, 2026
32b8d8a
fix(eval): constrain slash labels to public selectors
Oct 16, 2026
67a16bc
Merge caller launch isolation for Codex key selection
Oct 16, 2026
1706db3
feat(connections): bind Codex API keys to explicit routes
Oct 16, 2026
0122a97
test(publication): expose unchecked site drift
Oct 16, 2026
e6f7e33
test(publication): cover site runtime block drift
Oct 16, 2026
f2b2880
fix(publication): check generated site runtime block
Oct 16, 2026
8269b0a
fix(connections): reject encoded credentials in Codex routes
Oct 16, 2026
ad026b0
test(connections): expose encoded Codex credential output leaks
Oct 16, 2026
b9b27c9
fix(connections): withhold percent-encoded Codex credentials
Oct 16, 2026
b89602a
Merge immutable review capture into ordered fallback integration
Oct 16, 2026
6ce7630
Merge native Codex JSONL boundary into fallback integration
Oct 16, 2026
438de3b
Merge route capability preflight into fallback integration
Oct 16, 2026
1812959
Merge current documentation and source into fallback integration
Oct 16, 2026
c4eae4f
fix(review): preserve option-aware capability planning after parent m…
Oct 16, 2026
96bbd1a
test(connections): cover mixed encoding of percent-bearing keys
Oct 16, 2026
9fb7ce8
feat(codex): classify verified terminal quota failures without retry
Oct 16, 2026
313981d
fix(connections): match partial encoding without changing key bytes
Oct 16, 2026
9e7b70f
test(connections): preserve safe malformed UTF-8 diagnostics
Oct 16, 2026
9ed776a
fix(connections): preserve invalid UTF-8 during credential screening
Oct 16, 2026
d82cc18
feat(review): share captured source and deadline across whole-route f…
Oct 16, 2026
c3b00a1
fix(codex): recognize observed native quota reconnect envelopes
Oct 16, 2026
475b4f2
fix(publication): preserve drift diagnostics on Node 20
Oct 16, 2026
d2ca8a9
test(connections): retain Unicode case screening through percent enco…
Oct 16, 2026
7ee0672
fix(connections): strictly decode valid UTF-8 credential views
Oct 16, 2026
360a5bf
docs(shift-left): add a shared pre-PR review gate
Oct 16, 2026
15c9909
fix(shift-left): stop review processes on terminal hangup
Oct 16, 2026
baca5ab
feat(connections): route ordered whole reviews through one resolution…
Oct 16, 2026
8c25ee9
Merge commit '7ee0672f86f53477eef2cda05a25a12491679e49' into codex/is…
Oct 16, 2026
bbb13b6
fix(review): retain session evidence through integrity and cleanup fa…
Oct 16, 2026
407b53b
test(cache): reproduce untrimmed persisted quotes
Oct 16, 2026
fc6f861
fix(cache): reject untrimmed persisted quotes
Oct 16, 2026
436d34b
Merge commit 'fc6f8616ab383e65a66dd9ca2b83cf2219119803' into codex/is…
Oct 16, 2026
7deabb9
test: reproduce branch-to-tag pre-push bypass
Oct 16, 2026
93de928
fix: reject non-branch pre-push destinations
Oct 16, 2026
ca114ec
Merge commit '436d34bc6844f4732235e85eb28080ca47afacef' into codex/is…
Oct 16, 2026
288fdbe
Merge Codex key-route and latest policy into qualification admission
Oct 16, 2026
7c0b140
fix(review): enforce ordered output guards and preview budget
Oct 16, 2026
a937164
Merge source evidence into qualification admission
Oct 16, 2026
edb60d2
test: expose blocked shift-left diagnostic loss
Oct 16, 2026
1c8b716
test: assert real verdict failure diagnostics
Oct 16, 2026
75c65e7
fix: retain bounded shift-left failure diagnostics
Oct 16, 2026
2d39346
merge: integrate descendant controller into admission candidate
Oct 16, 2026
12e7c91
feat(trace): observe private native Codex command receipts
Oct 16, 2026
32169db
merge: integrate managed doctor probes into admission candidate
Oct 16, 2026
7183ea7
test(lifecycle): require idle cleanup after termination finalizers
Oct 16, 2026
7f43a30
fix(review): preserve deep failure results and clean drained Linux se…
Oct 16, 2026
6bf3c5e
merge: integrate critic residual provenance into admission candidate
Oct 16, 2026
6397a63
fix(trace): keep contradictory native receipts incomplete
Oct 16, 2026
573d211
Merge commit '7f43a306b5c377d2c7a1cc86a418daa1680943b0' into codex/is…
Oct 16, 2026
b93fbfd
merge: retain connection and runtime contracts with current guides
Oct 16, 2026
195db3e
Merge commit 'ba6c34f04b252c97aca4dc3b2c2baa5fb66daa94' into codex/is…
Oct 16, 2026
525f06f
test: expose shift-left resource budget violations
Oct 16, 2026
3c5af7f
test(review): cover selected capability and captured quotes
Oct 16, 2026
ccdcec6
fix: enforce whole-gate shift-left resource limits
Oct 16, 2026
0dfd11f
merge: preserve delivery lifecycle with connection runtime support
Oct 16, 2026
6e8ecb6
fix(review): verify quotes against captured fixed refs
Oct 16, 2026
bac8e8b
Merge commit '6e8ecb639e8cbc589512d5de0d595595d5e6f486' into codex/is…
Oct 16, 2026
e54bc52
fix(eval): version concurrency plan after runner integration
Oct 16, 2026
8aa2a47
merge: integrate incomplete review and delivery contracts into admission
Oct 16, 2026
bb68fae
merge: integrate conservative binary coverage into admission
Oct 16, 2026
1d36824
feat(github): record public review measurements in check output
Oct 16, 2026
f022922
feat(connections): add atomic raw-document machine editor
Oct 16, 2026
fde7327
Merge commit '6e8ecb639e8cbc589512d5de0d595595d5e6f486' into codex/is…
Oct 16, 2026
88ad5b5
Merge commit 'e54bc52fa58f663a0bdd0ecdab86fe42785938c0' into codex/is…
Oct 16, 2026
d9acefc
Allow managed callers to force-stop their process group
Oct 16, 2026
4efe377
test: reproduce size-capped input bypassing review coverage
Oct 16, 2026
25cbcd1
fix(eval): require an explicit job identity contract for measurements
Oct 16, 2026
952338b
Collect bounded literal context from fixed Git snapshots
Oct 16, 2026
fbae2ef
merge: integrate ordered captured review sessions
Oct 16, 2026
33e7220
merge: preserve versioned offline concurrency protocol
Oct 16, 2026
4fe760d
merge: integrate ordered connection sessions and fixed measurement plan
Oct 16, 2026
765c600
Merge commit '6e8ecb639e8cbc589512d5de0d595595d5e6f486' into codex/is…
Oct 16, 2026
dd5879a
fix: reject reviews with size-capped untracked content
Oct 16, 2026
f851303
test: distinguish shift-left timeout configuration errors
Oct 16, 2026
3658f83
fix: explain invalid shift-left timeout configuration
Oct 16, 2026
070ae6e
docs(github): define measurement scope for ordered review sessions
Oct 16, 2026
90a4e7e
fix(connections): persist directory creation and lock removal
Oct 16, 2026
fe01a98
fix: preserve binary dry-run and asynchronous doctor integration
Oct 16, 2026
dc2f6c6
test: reproduce cleanup exceeding the termination deadline
Oct 16, 2026
36d0d77
fix: bound Linux temp cleanup by the termination deadline
Oct 16, 2026
2f2d409
test: exercise credential fencing with owned GitHub checks
Oct 16, 2026
63e499c
merge: integrate private native command receipts
Oct 16, 2026
ebdf089
fix(connections): bound syncs to the created directory chain
Oct 16, 2026
acc5210
merge: reject capped source through the shared review plan
Oct 16, 2026
0fd41ad
test: pass runner options to the shared omission guard
Oct 16, 2026
959e5b9
merge: preserve bounded Linux shutdown and ownership recovery
Oct 16, 2026
359d242
refactor(connections): require an existing configuration directory
Oct 16, 2026
303c108
Merge commit '36d0d77e6489af27cb02ae5be8bc3265abb81f68' into codex/is…
Oct 16, 2026
26bfa72
merge: integrate bounded literal collector
Oct 16, 2026
dfa687f
Merge shutdown deadline parent into private receipt branch
Oct 16, 2026
6437677
fix(ci): fetch history for pinned study replay
Oct 16, 2026
f056293
feat(eval): join historical review measurements into adoption reports
Oct 16, 2026
2378967
test(github): provide owned checks in connection fixtures
Oct 16, 2026
5ea4508
test(github): assert exact connection error diagnostic
Oct 16, 2026
8c3cc5f
eval: seal packet span consumer holdout
Oct 16, 2026
70f1f66
test: reproduce replaced-root termination cleanup
Oct 16, 2026
a4eef81
fix(ci): fetch history for pinned study replay
Oct 16, 2026
491f5f0
feat(core): feed bounded literal context to large deep reviews
Oct 16, 2026
fc6c4ce
fix: anchor terminating cleanup to allocated directories
Oct 16, 2026
2ed95cd
docs(connections): scope timeout to stdin collection
Oct 16, 2026
7b015f7
merge: preserve suspended OpenCode admission with captured review routes
Oct 16, 2026
f60d264
test(eval): reproduce partial receipt weekly admission
Oct 16, 2026
8967c80
test: cover root replacement across final removal
Oct 16, 2026
a56bab7
fix(eval): keep incomplete receipt delivery unknown
Oct 16, 2026
7d58e44
fix: retain owner when final removal hits a replacement
Oct 16, 2026
45bd015
merge: keep captured LFS fallback within the shared review deadline
Oct 16, 2026
ea38c1b
feat(connections): add session-only machine review ingress
Oct 16, 2026
38881eb
merge: retain closed-application fixture version and historical loader
Oct 16, 2026
9eb40e0
merge: preserve sealed Tier-1 fixture families
Oct 16, 2026
7cea9fb
merge: retain Phase 2 unknown admission across the combined catalog
Oct 16, 2026
2f26f2f
Merge commit '7d58e44060b4e88ce5e8a19ad2e514519570087c' into codex/is…
Oct 16, 2026
46d03b9
Merge shutdown root identity protection into connections editor
Oct 16, 2026
2026e6c
Merge commit '7d58e44060b4e88ce5e8a19ad2e514519570087c' into codex/is…
Oct 16, 2026
86e1d0a
merge: preserve public runtime identity and current publication binding
Oct 16, 2026
1ac741c
merge: retain bounded shift-left review gate
Oct 16, 2026
edbfad2
merge: retain refreshed private receipt parent ancestry
Oct 16, 2026
91d8606
fix(ci): fetch history for pinned study replay
Oct 16, 2026
51d0aa3
merge: preserve descriptor-owned Linux cleanup roots
Oct 16, 2026
46b0da7
fix(ci): retain ownership receipts for suspended runner results
Oct 16, 2026
276e78c
fix(review): refuse suspended automatic selection before fast paths
Oct 16, 2026
c720908
test: expose shared snapshot metadata loss after quota
Oct 17, 2026
0a3004e
test(github): reproduce measurement feedback regressions
Oct 17, 2026
ff11c32
fix: retain snapshot integrity across ordered routes
Oct 17, 2026
4439579
test(review): reproduce template tokens inside runner input data
Oct 17, 2026
9753a6b
Merge bounded literal context caller into qualification candidate
Oct 17, 2026
962e002
fix(review): substitute prompt fields in one literal pass
Oct 17, 2026
4deea1e
Update catalog metadata for literal context holdout union
Oct 17, 2026
21f799d
Merge captured session ingress into qualification candidate
Oct 17, 2026
83960c6
fix(github): preserve measurement phases and safe upgrades
Oct 17, 2026
8b31a60
Merge fallback snapshot integrity fixes without losing captured sessi…
Oct 17, 2026
ae82953
Preserve selected connection through model-free review paths
Oct 17, 2026
b167199
Merge historical adoption and weekly measurement tooling into qualifi…
Oct 17, 2026
125dbdc
Merge commit '46d03b9e71b5885420dc536604d7df2beb3db9b8' into codex/in…
Oct 17, 2026
0bf5f3c
Merge commit '962e002d8f7db0e6d1f31b747ed8e7042e3472e3' into codex/in…
Oct 17, 2026
538bb2d
test(github): reproduce symbolic refs and paginated rules
Oct 17, 2026
a748c93
fix(github): support symbolic refs and complete rule pagination
Oct 17, 2026
249cdf6
Keep template regression assertions aligned with bounded context packets
Oct 17, 2026
d373ab1
test(eval): reject private placeholders at public admission
Oct 17, 2026
fecd3fa
fix(eval): reject redacted environment attestation
Oct 17, 2026
8832cec
Merge commit 'ff11c32eaa8d3b45f09b50ad75d57a96c368a2fc' into codex/is…
Oct 17, 2026
c59a183
Merge commit 'fecd3fa663391f889e46200f742b85f98197f1c4' into codex/in…
Oct 17, 2026
e21db39
test: preserve raw transcripts around private schema diagnostics
Oct 17, 2026
c3896f7
Merge current measurement delivery and workflow fixes while retaining…
Oct 17, 2026
d8b59e4
fix(runner): keep schema diagnostics out of raw transcripts
Oct 17, 2026
678fed7
Align runtime controls with suspended OpenCode admission
Oct 17, 2026
e67fcd7
Merge private runner diagnostics while preserving raw and native trac…
Oct 17, 2026
e7c29fb
Verify private diagnostic and native receipt trace coexistence
Oct 17, 2026
9527d96
test: provide valid bundles for OpenCode suspension checks
Oct 17, 2026
7f86fbc
fix: defer fast-path auth and enforce collector boundaries
Oct 17, 2026
85194ac
fix: validate review and delivery boundaries
Oct 17, 2026
83ae938
Merge verified review boundary fixes
Oct 17, 2026
76a82c1
feat: bind native Codex runtime to admitted qualification proof
Oct 17, 2026
1d4c9a4
Merge supported native Codex runtime qualification
Oct 17, 2026
a615834
Fix CI fixtures for lifecycle roots and App review identity
Oct 17, 2026
a70cec3
Wait for stdin readiness before testing machine cancellation
Oct 17, 2026
76f8e20
Bound optional runtime identity probe by the review deadline
Oct 17, 2026
ed58666
Close optional version probe stdin without an empty write
Oct 17, 2026
0f5f763
Merge commit 'ed5866633b7ab8700cc79cb05bf0d85328ceb9d5' into codex/pr…
Oct 17, 2026
683b84d
test: reproduce missing captured Codex home at startup
Oct 17, 2026
5a44bba
fix: create captured Codex home before env-auth startup
Oct 17, 2026
c032659
test: keep Codex home permission check portable
Oct 17, 2026
86ff663
Merge independent doctor ancestry into reviewed core
Oct 17, 2026
a1e2ebf
test: reproduce bare CR binary filename rendering
Oct 17, 2026
023b77f
fix: fold bare CR before rendering review Markdown
Oct 17, 2026
c16b00c
test: cover binary diagnostics and isolated native version checks
Oct 17, 2026
b571e3e
fix: preserve binary coverage and isolate native proof version checks
Oct 17, 2026
88c0b44
test: reproduce captured Codex executable drift
Oct 17, 2026
1455e66
fix: reject drifted captured Codex executables before launch
Oct 17, 2026
72e2f0a
test: add sealed table option forwarding holdout
Oct 17, 2026
7e3dc47
test: reject captured executable replacement during review
Oct 17, 2026
63002fe
fix: materialize critic findings from a total decision ledger
Oct 17, 2026
8e292fe
test: expose retries of drifted captured Codex executables
Oct 17, 2026
feae94d
fix: stop retrying drifted captured Codex executables
Oct 17, 2026
dcd84a4
test: migrate remaining connection and schema critic stubs
Oct 17, 2026
3e3cdbe
Merge commit 'dcd84a4e1ffe365104a5692b60d059f9a456f2e6' into codex/pr…
Oct 17, 2026
bd3d269
Merge commit '72e2f0adcd4c0cee0f4ef61a9f40136b85457fa3' into codex/pr…
Oct 17, 2026
e3cdadb
fix: require explicit critic drop decisions
Oct 17, 2026
db01986
test: align catalog metadata and termination critic stub
Oct 17, 2026
981cf20
test: reproduce repeated ABA local capture classification
Oct 17, 2026
9fc1aa3
fix: derive uncommitted metadata from captured patch
Oct 17, 2026
1f7f167
test: cover protected source ownership allowance
Oct 17, 2026
410b139
fix: retain trust for resolved source metadata lookups
Oct 17, 2026
c36ccab
fix: classify captured paths with native patch metadata
Oct 17, 2026
120696a
test: reproduce configurable local diff prefix failures
Oct 17, 2026
b1fca3a
fix: pin local patch prefixes and disable diff color
Oct 17, 2026
fbac46d
fix: keep uncommitted source git reads read-only
Oct 17, 2026
37bf309
test: reproduce source index refresh during local capture
Oct 17, 2026
edb2672
fix: prevent local diff reads from refreshing the source index
Oct 17, 2026
c795778
test: cover session review verdict exit status
Oct 17, 2026
21f1e9a
fix: align session review exits with verdict contract
Oct 17, 2026
6485c1c
Merge verified source-read and session-review repairs
Oct 17, 2026
9871b3d
test: resolve checkout before simulating protected ownership
Oct 17, 2026
ba1f637
test: reject private placeholders in public reproduction commands
Oct 17, 2026
febd3ff
fix: reject unusable public reproduction commands and stale hosted gu…
Oct 17, 2026
5d18f78
test(local): isolate protected ownership configuration
Oct 17, 2026
4f95b9d
Merge reviewed ownership and publication corrections
Oct 17, 2026
8fad9d9
test: reproduce managed temp allocation failure leaks
Oct 17, 2026
d9cd40c
test: reject contradictory Codex quota terminals
Oct 17, 2026
a302d16
test: cover allocation registry cleanup and descriptor reuse
Oct 17, 2026
14460ec
fix: release managed temp allocation resources on failure
Oct 17, 2026
44f7d0b
fix: reject quota fallback after contradictory Codex terminals
Oct 17, 2026
42ac0ea
test: cover termination during temp owner acquisition
Oct 18, 2026
11819f8
test: expose contradictory native errors crossing provider boundaries
Oct 18, 2026
2f70940
fix: complete failed temp cleanup before termination can exit
Oct 18, 2026
b421be8
fix: keep contradictory native streams from provider fallback
Oct 18, 2026
cf9a32b
docs: remove redundant fallback workflow comment
Oct 18, 2026
e7725bc
Merge current main into PR293 repair candidate
Oct 18, 2026
adca4fe
fix(eval): retain call stats from failed reviews and routes
Oct 18, 2026
cb04b64
docs: define operator-supplied native reproduction contract
Oct 17, 2026
87480d8
Constrain Codex critic output with an internal schema
Oct 18, 2026
e96876d
docs(eval): record incomplete PR293 Class R threshold failure
Oct 18, 2026
fbbff7c
test: isolate pipeline deadline and filesystem capability controls
Oct 18, 2026
3df8e80
fix: reject unresolved effective runner identity labels
Oct 18, 2026
2c98fc6
fix: share runner defaults with public identity attestation
Oct 18, 2026
2017bdd
Merge pull request #297 from frankekn/codex/pr293-temp-allocation-cle…
frankekn Oct 18, 2026
b7a920b
Merge pull request #298 from frankekn/codex/pr293-native-terminal-order
frankekn Oct 18, 2026
dc8a7e2
chore(core): remove redundant accounting narration
Oct 18, 2026
8038e43
Merge reviewed cleanup and native terminal fixes into qualification r…
Oct 18, 2026
f6f70e0
Merge current main into qualification repair
Oct 18, 2026
9807752
test(eval): isolate accounting runner auth from operator home
Oct 18, 2026
2742b12
fix(eval): capture Grok model before report attestation
Oct 18, 2026
c5b9632
fix: align report contracts and schema cleanup assertions
Oct 18, 2026
6d7b4d1
fix: reject final line terminators in public quotes
Oct 18, 2026
f5e238a
test(eval): require captured Pi effort in weekly checks
Oct 18, 2026
047c100
fix(eval): require exact workflow job check association
Oct 18, 2026
194c734
fix(eval): version logical call accounting comparisons
Oct 18, 2026
3376a4b
Merge main capability preflight into integrated qualification
Oct 18, 2026
e4fbf9f
fix: align persisted and critic boundary validation
Oct 18, 2026
41d55e4
fix(action): keep author gate compatible with Bash 3
Oct 18, 2026
f81e2e4
test(schema): reject invalid URLs in either persisted surface
Oct 18, 2026
cf6bd7e
Merge current incomplete-review delivery rules from main
Oct 18, 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
6 changes: 5 additions & 1 deletion .github/workflows/adoption-weekly.yml
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,11 @@ jobs:
- name: Collect the previous seven UTC days
env:
GH_TOKEN: ${{ github.token }}
run: pnpm exec tsx eval/tools/adoption-weekly.ts adoption-weekly
run: >-
pnpm exec tsx eval/tools/adoption-weekly.ts adoption-weekly
Comment thread
frankekn marked this conversation as resolved.
Resolved
--measurement-workflow .github/workflows/review.yml
Comment thread
frankekn marked this conversation as resolved.
Resolved
--measurement-job-key review
--measurement-job-name review
- name: Preserve report and diagnostics
if: always()
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
Expand Down
1 change: 1 addition & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ jobs:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
fetch-depth: 0
- uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1 # v7.1.0
with:
node-version: 20
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/commands.yml
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ jobs:
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
gh workflow run review.yml -R "${{ github.repository }}" -f pr_number="${{ github.event.issue.number }}"
gh workflow run review.yml -R "${{ github.repository }}" -f pr_number="${{ github.event.issue.number }}" -f recheck=true

explain:
# Runs on the ephemeral x64-review pool (on the tailnet, reaches CLIProxyAPI); same lane as review.
Expand Down
6 changes: 6 additions & 0 deletions .github/workflows/hosted-review.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,11 @@ on:
pr:
description: PR number to review
required: false
recheck:
description: Force a full review and reset the automatic recovery limit
type: boolean
required: false
default: false
pr_number:
description: PR number supplied by reconciliation
required: false
Expand All @@ -20,6 +25,7 @@ jobs:
uses: ./.github/workflows/review.yml
with:
pr_number: ${{ inputs.pr_number || inputs.pr }}
recheck: ${{ inputs.recheck || false }}
runner: codex
# Self-hosted lane via CLIProxyAPI (frank_infra x64-review pool); eval #172.
model: deepseek-v4.1-flash
Expand Down
123 changes: 114 additions & 9 deletions .github/workflows/review.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,13 @@ on:
pr_number:
description: PR number to review (manual trigger; bypasses pull_request webhook)
required: true
recheck:
description: Force a full review even when this head was already reviewed
type: boolean
required: false
default: false
runner:
description: "Model runner: codex, claude, opencode, grok, or pi"
description: "Model runner: codex, claude, grok, or pi. OpenCode is temporarily disabled (#207)."
required: false
default: codex
model:
Expand All @@ -24,7 +29,7 @@ on:
description: Optional per-call timeout in milliseconds
required: false
idle_timeout_ms:
description: Optional opencode inactivity timeout in milliseconds
description: Reserved while OpenCode reviews are disabled (#207)
required: false
codex_reasoning_effort:
description: "Codex reasoning effort: medium, high, or xhigh"
Expand All @@ -51,8 +56,13 @@ on:
description: PR number (optional; defaults to the event PR)
type: string
required: false
recheck:
description: Force a full review even when this head was already reviewed
type: boolean
required: false
default: false
runner:
description: "Model runner: codex, claude, opencode, grok, or pi"
description: "Model runner: codex, claude, grok, or pi. OpenCode is temporarily disabled (#207)."
type: string
required: false
default: codex
Expand All @@ -65,7 +75,7 @@ on:
type: string
required: false
idle_timeout_ms:
description: Optional opencode inactivity timeout in milliseconds
description: Reserved while OpenCode reviews are disabled (#207)
type: string
required: false
codex_reasoning_effort:
Expand Down Expand Up @@ -172,11 +182,36 @@ jobs:
elif [ "$trusted_author" != true ] && [ -z "$ALLOW_UNTRUSTED_AUTHOR" ]; then
skip=true
skip_reason="PR author (association ${author_association:-unknown}, type ${author_type:-unknown}) is not trusted"
random="$(od -An -N16 -tx1 /dev/urandom | tr -d ' \n')"
invocation="${random:0:8}-${random:8:4}-4${random:13:3}-8${random:17:3}-${random:20:12}"
measurement=$(jq -cn --arg repository "$REPO" --arg pr "$PR_NUM" --arg head "$head" \
--arg invocation "$invocation" \
--arg run "${GITHUB_RUN_ID:-}" --arg attempt "${GITHUB_RUN_ATTEMPT:-}" --arg job "${GITHUB_JOB:-}" '
{schemaVersion: 1, invocationId: $invocation, repository: $repository, prNumber: ($pr | tonumber), targetHeadSha: $head,
workflow: (if ($run | test("^[1-9][0-9]{0,19}$")) and ($attempt | test("^[1-9][0-9]{0,8}$")) and ($job | test("^[A-Za-z_][A-Za-z0-9_-]{0,99}$"))
then {status: "recorded", runId: $run, runAttempt: ($attempt | tonumber), jobKey: $job} else {status: "unknown"} end),
execution: {ordinal: 1, role: "unknown"}, summaryReviewId: null, inlineReviewIds: [],
runtime: {status: "unknown"}, pipeline: {status: "unknown"}, outcome: "skipped", verdict: null, delivery: "not_applicable"}')
if ! live_pr="$(gh api "repos/$REPO/pulls/$PR_NUM" --jq '.state, .head.sha')"; then
echo "::error::could not revalidate PR before posting an author-skip check" >&2
exit 1
fi
live_fields=()
while IFS= read -r field; do live_fields+=("$field"); done <<< "$live_pr"
if [ "${live_fields[0]:-}" != "open" ] || [ "${live_fields[1]:-}" != "$head" ]; then
echo "skip=true" >> "$GITHUB_OUTPUT"
echo "skip_reason=closed_or_stale_head" >> "$GITHUB_OUTPUT"
exit 0
fi
gh api -X POST "repos/$REPO/check-runs" \
Comment thread
frankekn marked this conversation as resolved.
Resolved
-f name="Needlefish" \
-f head_sha="$head" \
-f status="completed" \
-f conclusion="neutral" \
-f external_id="$(jq -cn --argjson pr "$PR_NUM" \
--arg run "${GITHUB_RUN_ID:-}" --arg round "$(jq -r .invocationId <<<"$measurement")" \
'{v: 2, prNumber: $pr, roundId: $round, runId: $run}')" \
-f "output[text]=$measurement" \
-f "output[title]=Needlefish: skipped (author not trusted)" \
-f "output[summary]=Needlefish runs model CLIs unrestricted on trusted runners, so it reviews only PRs opened by an OWNER, MEMBER, or COLLABORATOR that is not a bot. $skip_reason. A maintainer who has read this PR can review it by running the review workflow manually with allow_untrusted_author: true." >/dev/null
fi
Expand Down Expand Up @@ -327,9 +362,25 @@ jobs:
PI_AUTH_MODE: proxy
# npm-global bin is not on the runner service PATH.
PI_BIN: /home/termtek/.npm-global/bin/pi
NEEDLEFISH_RECHECK_INPUT: ${{ github.event_name == 'workflow_dispatch' && '1' || '' }}
NEEDLEFISH_CHECK_APP_ID: ""
NEEDLEFISH_RECHECK_INPUT: ${{ inputs.recheck && '1' || '' }}
NEEDLEFISH_ALLOW_UNTRUSTED_AUTHOR: ${{ inputs.allow_untrusted_author && '1' || '' }}
run: |
if [ "${NEEDLEFISH_RUNNER_INPUT:-}" = "opencode" ]; then
summary="OpenCode reviews are temporarily disabled because startup configuration isolation is incomplete. Choose another runner explicitly; see issue #207."
gh api -X POST "repos/$GITHUB_REPOSITORY/check-runs" \
-f name="Needlefish" \
-f head_sha="$PR_HEAD_SHA" \
-f status="completed" \
-f conclusion="failure" \
-f external_id="$(jq -cn --argjson pr "$PR_NUM" \
--arg run "${GITHUB_RUN_ID:-}" --arg round "runner-unavailable-${GITHUB_RUN_ID:-}-${GITHUB_RUN_ATTEMPT:-}" \
'{v: 2, prNumber: $pr, roundId: $round, runId: $run}')" \
-f "output[title]=Needlefish: runner unavailable" \
-f "output[summary]=$summary" >/dev/null || true
echo "$summary" >&2
exit 1
fi
if [ -z "${NEEDLEFISH_BIN:-}" ] || [ ! -x "$NEEDLEFISH_BIN" ]; then
echo "Selected self-managed Needlefish is unavailable. Reinstall the local bundle on this runner." >&2
exit 1
Expand Down Expand Up @@ -425,7 +476,22 @@ jobs:
const checks = JSON.parse(input).check_runs;
const previous = process.env.NEEDLEFISH_PREVIOUS_CHECK_ID ?? "";
if (!/^[0-9]+$/.test(previous)) process.exit(1);
const check = checks.filter(c => c.id > Number(previous) && c.name === "Needlefish" && c.external_id === process.env.GITHUB_RUN_ID && c.app?.slug === "github-actions").sort((a, b) => b.id - a.id)[0];
const appIdInput = process.env.NEEDLEFISH_CHECK_APP_ID || "";
const appId = appIdInput ? Number(appIdInput) : null;
if (appIdInput && (!/^[1-9][0-9]*$/.test(appIdInput) || !Number.isSafeInteger(appId))) process.exit(1);
const currentRun = externalId => {
if (externalId === process.env.GITHUB_RUN_ID) return true;
try {
const round = JSON.parse(externalId);
return round?.v === 2 && round.runId === process.env.GITHUB_RUN_ID && round.prNumber === Number(process.env.PR_NUM);
} catch { return false; }
};
const check = checks.filter(c =>
c.id > Number(previous) &&
c.name === "Needlefish" &&
currentRun(c.external_id) &&
(appId === null ? c.app?.slug === "github-actions" : c.app?.id === appId)
).sort((a, b) => b.id - a.id)[0];
const prefix = "Review errored and did NOT pass this PR.\n\n```\n";
const error = check?.output?.summary?.startsWith(prefix) ? check.output.summary.slice(prefix.length).split("\n")[0] : "";
const failed = check?.status === "completed" && check.conclusion === "failure" && check.output.title === "Needlefish: review failed";
Expand All @@ -440,9 +506,11 @@ jobs:
if run_review ""; then exit 0; else rc=$?; fi
for next in "${chain[@]}"; do
[ -n "$next" ] || continue
# Prefer the controlled terminal outcome. Legacy runner faults require this run own check.
outcome_line="$(grep -a '^needlefish-outcome ' <<<"$out" | tail -n 1 || true)"
if ! node -e 'let s="";process.stdin.on("data",(d)=>{s+=d});process.stdin.on("end",()=>{let o;try{o=JSON.parse(s)}catch{process.exit(1)}process.exit(o&&o.outcome==="failure"&&o.operational===true?0:1)});' <<<"${outcome_line#needlefish-outcome }"; then
if node -e 'let s="";process.stdin.on("data",d=>{s+=d});process.stdin.on("end",()=>{let o;try{o=JSON.parse(s)}catch{process.exit(1)}process.exit(o?.outcome==="failure"&&o.operational===false&&o.prNumber===Number(process.env.PR_NUM)&&o.headSha===process.env.PR_HEAD_SHA?0:1)});' <<<"${outcome_line#needlefish-outcome }"; then
echo "needlefish: current failure is not operational; not switching provider" >&2; exit $rc
fi
if ! runner_check_failed; then
echo "needlefish: no verified operational runner failure; not switching provider" >&2; exit $rc
fi
Expand Down Expand Up @@ -478,6 +546,8 @@ jobs:
PR_NUM: ${{ inputs.pr_number || github.event.inputs.pr_number || github.event.pull_request.number }}
WORKFLOW_REF: ${{ github.workflow_ref }}
RUN_ID: ${{ github.run_id }}
NEEDLEFISH_CHECK_APP_ID: ""
NEEDLEFISH_RUNNER_INPUT: ${{ inputs.runner || github.event.inputs.runner || 'codex' }}
run: |
set -eu
if [ -z "$PR_NUM" ]; then
Expand Down Expand Up @@ -506,18 +576,53 @@ jobs:
-f head_sha="$head" \
-f status="completed" \
-f conclusion="failure" \
-f external_id="$(jq -cn --argjson pr "$PR_NUM" \
--arg run "$RUN_ID" --arg round "retry-required-$RUN_ID-$GITHUB_RUN_ATTEMPT" \
'{v: 2, prNumber: $pr, roundId: $round, runId: $run}')" \
-f "output[title]=Needlefish: caller retry required" \
-f "output[summary]=$summary" >/dev/null
}
# filter=all: the default (latest) returns one check-run per name, and
# every review check is named "Needlefish", so the retry cap below would
# otherwise never see more than one failure and could never trip.
runs_url="repos/$REPO/commits/$head/check-runs?check_name=Needlefish&per_page=100&filter=all"
valid=$(gh api "$runs_url" --jq '[.check_runs[] | select(.conclusion == "success" or .conclusion == "neutral" or (.conclusion == "failure" and ((.output.title // "") | test("^Needlefish: review (failed|terminated)$") | not)))] | length')
app_id="${NEEDLEFISH_CHECK_APP_ID:-}"
if [ -n "$app_id" ] && { [[ ! "$app_id" =~ ^[1-9][0-9]*$ ]] || [ "${#app_id}" -gt 16 ] || [ "$app_id" -gt 9007199254740991 ]; }; then
echo "::error::NEEDLEFISH_CHECK_APP_ID must be a positive safe integer"
exit 1
fi
app_filter='.app.slug == "github-actions"'
if [ -n "$app_id" ]; then app_filter=".app.id == $app_id"; fi
owned_checks=$(gh api "$runs_url" --jq "[
.check_runs[]
| select(.name == \"Needlefish\" and ($app_filter))
| ((.external_id // \"\" | fromjson?) // null) as \$round
| select(if (\$round | type) == \"object\" then
(\$round.v == 2 and \$round.prNumber == $PR_NUM
and (\$round.roundId | type) == \"string\" and (\$round.roundId | length) > 0
and (\$round.runId | type) == \"string\")
else ((.external_id // \"\") | test(\"^[1-9][0-9]*$\")) end)
]")
valid=$(printf '%s' "$owned_checks" | jq '[.[] | select(.conclusion == "success" or .conclusion == "neutral" or (.conclusion == "failure" and ((.output.title // "") | test("^Needlefish: review (failed|terminated)$") | not)))] | length')
if [ "$valid" -gt 0 ]; then
echo "head $head already has a terminal Needlefish verdict; nothing to reconcile"
exit 0
fi
if [ "${NEEDLEFISH_RUNNER_INPUT:-}" = "opencode" ]; then
summary="OpenCode reviews are temporarily disabled because startup configuration isolation is incomplete. Choose another runner explicitly; see issue #207."
gh api -X POST "repos/$REPO/check-runs" \
-f name="Needlefish" \
-f head_sha="$head" \
-f status="completed" \
-f conclusion="failure" \
-f external_id="$(jq -cn --argjson pr "$PR_NUM" \
--arg run "$RUN_ID" --arg round "runner-unavailable-$RUN_ID-$GITHUB_RUN_ATTEMPT" \
'{v: 2, prNumber: $pr, roundId: $round, runId: $run}')" \
-f "output[title]=Needlefish: runner unavailable" \
-f "output[summary]=$summary" >/dev/null
echo "$summary"
exit 0
fi
workflow_file="${WORKFLOW_REF#"$REPO/.github/workflows/"}"
workflow_file="${workflow_file%@*}"
if [ -z "$workflow_file" ] || [ "$workflow_file" = "$WORKFLOW_REF" ] || [[ "$workflow_file" == */* ]]; then
Expand Down Expand Up @@ -546,7 +651,7 @@ jobs:
echo "a $workflow_file run for PR #$PR_NUM is still active or queued; letting it finish"
exit 0
fi
infra_fails=$(gh api "$runs_url" --jq '[.check_runs[] | select(.conclusion == "failure" and ((.output.title // "") | test("^Needlefish: review (failed|terminated)$")))] | length')
infra_fails=$(printf '%s' "$owned_checks" | jq '[.[] | select(.conclusion == "failure" and ((.output.title // "") | test("^Needlefish: review (failed|terminated)$")))] | length')
if [ "$infra_fails" -ge 2 ]; then
echo "::error::head $head has $infra_fails infra-failed reviews; retry cap reached, not re-dispatching"
exit 0
Expand Down
2 changes: 1 addition & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ needlefish/
| Local review | `src/adapters/local.ts` | Writes `~/.cache/needlefish/<repo>/last-review.json`. |
| GitHub review | `src/adapters/github.ts` | Posts COMMENT review plus `Needlefish` check-run. |
| Runner invocation | `src/shared/codex.ts`, `src/shared/runner-process.ts` | Timeout, retry, target isolation, and runner env behavior live here. |
| Git/PR bundle shape | `src/shared/repo.ts`, `src/shared/schema.ts` | `agentsMd` is read only via `readAgentsAt` (`git show <ref>:AGENTS.md`); no filesystem read of `AGENTS.md` (issue #211). |
| Git/PR bundle shape | `src/shared/repo.ts`, `src/shared/schema.ts` | `agentsMd` is read only via `readAgentsAt` at the merge base (`git show <ref>:AGENTS.md`); no filesystem read of `AGENTS.md` (issues #211, #240). |
| Prompt behavior | `prompts/*.md` | Must remain read-only and output JSON contracts exactly. |
| Tests | `src/**/*.test.ts`, `scripts/test.mjs` | Node test runner, no Jest/Vitest. |
| CI/deploy | `.github/workflows/ci.yml`, `.github/workflows/deploy.yml`, `scripts/deploy-ubuntu.sh` | `needlefish-ci` is the merge gate. `needlefish-deploy` only verifies an operator-installed self-managed release; `deploy-ubuntu.sh` is a separate source-install path. |
Expand Down
Loading
Loading