fix(ci): fork first-principles sweep passes the computed verdict - #5966
Conversation
The reference lane's stranded-run sweep completed check-runs with a hardcoded neutral / 'review incomplete (advisory)', while the four ported lanes pass the run's computed verdict at their sweep sites. A hardcoded conclusion either outvotes a genuine green re-run under pr-readiness's fail-precedence, or launders a genuine BLOCK whose own PATCH lost both attempts into an un-gated neutral. Pass $conclusion / $title instead; with no verdict computed they already hold the incomplete/advisory posture, so a genuinely-stranded run is unchanged. Extends the TestForkLaneStrandedRunSweeps ratchet: the reference lane joins FORK_SWEEP_LANES (all three existing pins hold on it), and a new computed-verdict assertion covers all five lanes. Closes #5949
Design Review (Fable 5) — ✅ PASSDesign-level review of Design-Verdict: PASS One-line convergence to the shape the four ported lanes already carry, with a ratchet test that pins all five — sound and minimal. [DESIGN-REVIEWED] edc99ed |
GPT 5.6 Review — ✅ no blocking findingsGPT 5.6 completed its review of This comment is updated in place on each push. Review detailsNo findings. False positive or not applicable? A repository writer can comment: |
Opus 4.8 Review — ✅ no blocking findingsReviewed Review detailsThe diff is fully contained in one No findings. [OPUS-REVIEWED] edc99ed Verdict parsed from the review's SHA-scoped output markers for commit False positive or not applicable? A repository writer can comment: |
First Principles Review (Fable 5) — ✅ PASSPremise-level review of All claims verified. Ready to emit the review. First-Principles-Verdict: PASS One-line change deletes the last hardcoded sweep verdict; every item is the fix, its ratchet, or its pin — nothing rides along. What this change shipsIntent: make the reference fork lane's stranded-run sweep publish the verdict the run actually computed instead of a hardcoded neutral — a FIX (#5949).
The fix is the deletion this lane would have asked for: it removes the one divergent spelling rather than guarding it. Grepped Subtractions
[FIRST-PRINCIPLES-REVIEWED] edc99ed |
NicholasRBowers
left a comment
There was a problem hiding this comment.
Tier 1 auto-approve: fix (2 files). Criteria: no conflict, no requested changes, security path denylist clean, design-doc gate clean, SAST annotations clean, security checklist all-NO, AI reviewers green. Category: fix(ci) with a clear root cause — the fork first-principles finalize sweep passed a hardcoded neutral instead of the run's computed verdict; one-line call-site fix mirroring the four already-ported lanes, plus a mutation-verified ratchet test pinning all five lanes.
Problem / Motivation
The four ported fork reviewer lanes (design/gpt/opus/ux) complete their stranded check-runs during the finalize sweep by passing the run's own computed verdict (
$conclusion/$title). The reference lane,fork-first-principles-review.yml, still passed a hardcodedneutral/ "review incomplete (advisory)" at its sweep call site -- the shape #5928 fixed in the four lanes it ported the sweep to, deferred there only because that PR's spec pinned the reference lane as unmodifiable.Why it matters
A hardcoded conclusion at the sweep site can do one of two bad things on a fork PR:
What changed (motivation -> approach -> change)
The sweep's job is to close the stranded-run wedge, not to decide the verdict. The run already computes the correct verdict: the
casestatement earlier in the same step assigns$conclusion/$titleon every path (unconditional*)arm), and with no verdict computed they already hold the neutral/"review incomplete" posture. So the fix is the same one-line shape the ported lanes carry: the sweep call passes"$conclusion" "$title"instead of the hardcoded pair, with the ported lanes' justifying comment mirrored above it. A genuinely-stranded run's advisory behavior is unchanged; only the case where a real verdict exists changes -- it now propagates.The
TestForkLaneStrandedRunSweepsratchet (added by #5928) is extended: the reference lane joinsFORK_SWEEP_LANES(all three existing pins -- PR-scopedexternal_idat creation, sweep presence, external_id-scoped selection -- hold on it unchanged), and a newtest_sweep_completes_with_the_computed_verdictasserts all five lanes pass the computed verdict and the hardcoded-neutral sweep shape cannot come back.Tests
test/test_ai_review_workflows.py: 168/168 pass;TestForkLaneStrandedRunSweeps20/20 (4 tests x 5 lanes).isort/flake8clean; full backend pytest run -- the only failures are environment-owned (byte-identical failure set on pristine main in the same environment, A/B verified via stash).gh/jqacross allVERDICTvalues (BLOCK/PASS/CONCERNS/SKIPPED/empty/UNKNOWN/WITHHELD) withset -u: no unbound variable on any path, and the negative assertion does not false-positive on the legitimatePOSTfallback's-f conclusion="neutral".Manual verification
Verified all five lanes now carry the identical sweep call literal (
fork-design:644,fork-first-principles:683,fork-gpt:785,fork-opus:520,fork-ux:836), and that$conclusion/$titleare assigned on a flat path with no early exit between thecaseand the sweep.Screenshots / video
CI-workflow + backend-test change only; no visual surface.
Related Issues
Closes #5949
Checklist
Contribution License Agreement
By submitting this pull request, I confirm my contribution is made under the terms of the repository's license.