Repository navigation
Conversation
added 2 commits
August 24, 2026 13:32
…stack
`### 4c — VERIFY` dispatched `Skill("code-review", "<level> <PREMERGE_PR>")`
while its own prose claimed the call was "scoped to the refactor".
`<PREMERGE_PR>` is the stack PR, so nothing was scoped: the verify step
re-reviewed the entire stack and the reviewer treated that whole diff as its
scope.
4c is not a discovery pass — it asks "did the polish do harm". Asking a critic
"what is wrong with this stack" answers from an unbounded set, so any blocker
that sample rolled — including one present all along that the green gate had
not sampled — reached the third table arm as "a blocker the polish introduced"
and reverted a correct, behaviour-preserving refactor.
The scope now comes from the checkout rather than from an argument. 4b commits
the polish and deliberately does not push it; 4c reviews with a level and no
target, so the reviewer's own default `git diff @{upstream}...HEAD` — upstream
still at the pre-simplify SHA, via Phase 0c's `push -u` — resolves to exactly
the polish commit. A new `premerge-simplify-push` fence then pushes.
Passing the range explicitly was tried and rejected. On `o48-xhigh-v1` (the
cell `claude-opus-5` xhigh resolves to, and `xhigh` is the default level)
`finderBudgetHint` is false, so `o30` never parses the target and it reaches
the model as prose. An ignored target does not degrade to a wider review: it
falls back to that same default, which on an already-pushed branch is an empty
range over a clean tree — zero findings and a vacuous green from the one phase
that exists to catch a bad polish.
The push runs regardless of `--no-post-simplify-review`; only the review,
triage and gate are gated on it. It is the only push of the simplify commit,
and both the command file and RFC 0021 document that flag as costing the
verification, never the polish.
Also here:
- a third arm for 4b exiting non-zero (wrong branch, untracked files, absent
allowed set, stray files), each of which leaves the lens edits uncommitted
in a dirty tree where the empty-range fallback would sweep them in;
- an arm for 4b's `COMMIT=none REASON=no-edits` early exit;
- RFC 0021 A3 C8 amended: "a two-SHA range is not in that surface" was read
off the review prompt's enumeration rather than executed. `o30` accepts only
no-target or a range and returns on every other shape — a range is the only
target form that code parses. The amendment records the bound as well as the
retraction, which is why 4c passes no target at all;
- rationale extracted to references/ so the body stays on its pinned size
ceiling rather than raising it (#779).
Closes #795
|
Important
This repository does not receive automatic reviews because it has fewer than 10 stars. ⚙️ Run configurationConfiguration used: Organization UI Review profile: ASSERTIVE Plan: Pro Plus Run ID: Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The defect
### 4c — VERIFYdispatchedSkill("code-review", "<level> <PREMERGE_PR>")while its own prose claimed the call was "scoped to the refactor".<PREMERGE_PR>is the stack PR, so nothing was scoped — the verify step re-reviewed the entire stack, and the built-in reviewer's Phase 0 then treats that whole diff as its scope.4c is not a discovery pass. It asks "did the polish do harm?". Asking a critic "what is wrong with this stack?" answers a different question, from an unbounded set.
Failure scenario. The loop gates
STOP_GREENat attempt N. Phase 4 applies behaviour-preserving polish. 4c re-reviews the whole PR atxhigh— on Opus that cell is 10 inline angles, no verify pass, an independent fresh sample. It rolls one correctness-class finding anywhere in the stack, in a file the polish never touched.assert-greenappendsblockers_remaining=1→not_green→ the reason is not waitable → revert the simplify commit, push, reportsimplify=reverted. A correct refactor is reverted, the operator is told the polish did harm when it did not, and the actual finding is discarded with it.The fix
The scope comes from the checkout, not from an argument.
### 4bcommits the polish and deliberately does not push it.### 4cstep 1 reviews with a level and no target, so the reviewer's own defaultgit diff @{upstream}...HEAD— upstream still at the pre-simplify SHA, via Phase 0c'spush -u— resolves to exactly the polish commit.### 4cstep 2 is a newpremerge-simplify-pushfence; steps 3–4 are the existing triage and gate.Passing the range explicitly was tried, reviewed, and rejected
The first version of this PR passed
<parent>..<head>as the target and justified the residual as "benign — a model that ignores the range reviews the whole checkout." That was false. An ignored target falls back to the same no-target default, which on an already-pushed branch is an empty range over a clean tree: zero findings,verdict=green,chore(release)stamped — a vacuous green from the one phase that exists to catch a bad polish, strictly worse than the bug being fixed.Read out of the shipped binary (
2.1.241) rather than off the prompt's enumeration:hLs→qau) joins every post-level token into one free-text target and rejects no shape;o30accepts only no-target or^[@\w][@\w./~^-]*\.\.\.?[@\w][@\w./~^-]*$and returns on everything else — a range is the only target form that code parses;o30runs only when the cell setsfinderBudgetHint, andO_esets it false foro48-xhigh-v1— the cellclaude-opus-5xhigh resolves to, andxhighisPREMERGE_DEFAULT_LEVEL. On premerge's own default cell nothing parses the target.RFC 0021 A3 C8 recorded "a two-SHA range is not in that surface". That is retracted — amended in place, with the bound recorded alongside the retraction, because the bound is why 4c passes no target at all.
Also fixed
--no-post-simplify-review. Moving it into 4c initially put the only push of the simplify commit behind that flag: on--no-post-simplify-review --no-bump, or on any repo without the version ratchet, the polish would be committed locally, never pushed, absent from the stack PR, and destroyed by the nextgit reset --hard origin/.... Bothcommands/premerge.mdand RFC 0021 document the flag as costing the verification, never the polish.### 4bexiting non-zero (wrong branch, untracked files, absent allowed set, stray files). Each leaves the lens edits uncommitted in a dirty tree, where the empty-range fallback would sweep the scope-rejected edits into the review.COMMIT=none REASON=no-edits, which previously sent 4c to verify a commit that was never made.this file's ...pointer that became false when the text moved files.Verification
tests/premerge.test.sh280/0, with new section P23. The no-push row, both 4b-prose rows, the flag rows and the bare-PR row are mutation-tested — reintroducing each defect reds its specific row.assert_in/assert_not_in..github/workflows/test.ymlubuntu run list: 132/132 green, clean single run.skill-sizeratchet holds unraised at 2486 — rationale was extracted intoreferences/rather than bumping the pin (test(skill-size): the premerge-pipeline waiver bought a ratchet bump instead of an extraction #779).Scope deliberately not taken
Scoping the loop's re-review (Phase 1 at attempt ≥ 2) is the larger half and is #796. Blockers are not carried across attempts —
--carry-priorcarries suggestions only — so a naive scope there drops an unfixed blocker out of the review window and gates green with it live, which is worse than the pump it would fix. That needs a blocker-carry change inplanfirst.4c was safe to fix alone because it is a regression check on one commit, not a discovery pass, so it has no carry problem.
Parked
Not merged, no auto-merge.
/mergewhen you want it.Closes #795