Repository navigation
feat(planning): run the plan reviewer only for risky plans - #15398
Conversation
Under plan_stress_test auto, /planning:plan dispatches the plan-reviewer subagent only when the blast radius is HIGH or CRITICAL, a stress-test trigger matches, or the user asks for a review; other plans skip it and say so in a Reviewer: line. reviewer, both and verification strict still force it; devils-advocate and verification light/off still skip it. A new eval case checks that a low-risk plan skips the reviewer. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VQb9Q4F46UumaUgXeUdpYZ
1b51fab to
9129583
Compare
Codex Review Summary: ✅ CompletedThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 91295837c5
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
|
claude-security-review reviewed Security review: PR #15398,
|
|
claude-review reviewed claude-review (blocking only: this lane already reviewed an earlier head, so only blocking findings are reported here and advisory ones are left out). No blocking findings at What I checked:
Spend (not a hold): the new eval case runs 3 times, each capped at 60 turns and 1200 s, every time the eval suite runs. Under the default |
… plan Under auto, Step 3 rates blast radius before dispatching the reviewer and Step 3b presents that rating. A reviewer fix can widen the plan, so Step 3b now reassesses when an item-5 fix changed the plan's files or scope. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VQb9Q4F46UumaUgXeUdpYZ
|
Held for eval evidence of no loss (docs/review/skills-and-agents.md:6-8). This PR cuts the plan reviewer from low- and medium-risk plans, so the owner chose (2026-11-11) to measure before and after first. Next: a pre-registered design comment on this PR (cases, arms, negative control, decision rule), then the paid run, then the paired result. The label comes off through the eval-pair record when the run is VALID and shows no loss; if the suite cannot detect a loss, the hold stays and the question returns to the owner. |
Twelve plan requests (six rated LOW by design, six MEDIUM), each a seeded draft with two defects the plan-reviewer checks and the main thread's scripts do not, plus a must-not-flag guard and an arm-conformance check on reviewer dispatch. Frozen for the before/after measurement this PR is held on; fixtures/plan-reviewer-cut builds each arm and the degraded-reviewer control. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VQb9Q4F46UumaUgXeUdpYZ
…ases Spell "unparsable" in the notes-since case and its samples, spell out the "exclud" regex stem in two out-of-scope graders (same matches), and drop the status-marker word from init-repo.sh's comment. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VQb9Q4F46UumaUgXeUdpYZ
Pre-registration: plan-reviewer cut, before vs afterWritten before any after-version run. Cases frozen at b684380 ( Question. Does removing the always-on Arms. Same cases, same flags, launched together,
Cases. 12 seeded drafts, 2 defects each from what Calibration (pre-freeze, A and a degraded-reviewer copy, 4 cases, 1 run). A fixed 8 of 8 seeds; the degraded reviewer (agent body and dispatch prompt replaced by text with no procedure) fixed 7 of 8 and, in the trace read, still surfaced the seeded defect itself. Both smoke "medium" cases rated themselves LOW. Why no detection control decides this. The protocol's control is the before text with the changed rule removed ( Grouping. By the Blast-radius rating each run writes. MEDIUM is reported only if runs rate MEDIUM; otherwise MEDIUM is stated unmeasured. Exclusions. A run is excluded when its arm's reviewer behaviour is wrong (A did not dispatch Decision rule.
|
The owner chose a before/after compare without the degraded-reviewer arm, so its two fixture texts and prepare-arm.sh's --degrade-reviewer option go (orphaned-fixtures). Case descriptions say "before behavior", not the retired "contract" sense near "Brief" (vocabulary). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VQb9Q4F46UumaUgXeUdpYZ
Result: plan-reviewer cut, before vs afterRan per the pre-registration above: 12 cases x 3 runs x 2 arms, LOW-designed cases (6; every run rated LOW and conformed):
MEDIUM-designed cases (6): A rated MEDIUM in 3 of 18 runs, never twice in one case, so MEDIUM is unmeasured. By case, over conforming runs: B scored 1.00 everywhere; A scored 0.83 (catalogue-author-search) and 0.67 (reorder-points) with the reviewer running. B dispatched Decision rule. Rule 1 (B loses: a case drop of 1/3 or more, or a mean fall of 0.15 or more) is not met. By rule 2, the numbers go to the owner, who decides whether to waive |
The before/after eval measured only LOW plans (change -0.03, interval -0.08 to +0.03, no case drop); MEDIUM went unmeasured. So auto now skips the plan-reviewer on a LOW plan with no trigger only, and runs it at MEDIUM or higher, as the owner decided (ship only measured parts). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VQb9Q4F46UumaUgXeUdpYZ
|
Hold lifted by owner decision (2026-11-11, in session): waive the no-loss rule for the LOW cut only, on the eval result above. The reviewer now skips only LOW plans with no trigger; MEDIUM and higher keep it until MEDIUM is measured (c4edfd2). Removing the label and re-arming auto-merge at this head. |
158 case files pushed this PR past one review's read budget, so both review lanes read it only in part. The cases land in a separate PR on branch test/plan-reviewer-cut-evals; this PR keeps the skill change and the plan-low-risk-skips-reviewer case. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VQb9Q4F46UumaUgXeUdpYZ
No related issue: owner-confirmed decisions Q303 and Q307 (Wayfinder absorb).
Summary
/planning:plandispatched a fresh-context plan-reviewer subagent on every plan it presented. Anthropic's current guidance says separate verification steps and "use a subagent to verify" cause over-verification, and removing them "reduces wasted tokens with no loss in quality" (Prompting Claude Opus 5, Task scope and over-verification). The reviewer now runs only for risky plans.Fix
light/offskips;plan_stress_testdevils-advocateskips;reviewer,bothor verificationstrictruns; underautoit runs when the Step 3b blast radius is MEDIUM or higher, a stress-test trigger matches, or the user asks for a review (a/planning:plan reviewre-plan included). Otherwise it is skipped and the plan saysReviewer: skipped (<reason>); a skip is never replaced by inline self-review.auto, Step 3 makes the blast-radius and trigger assessment first; Step 3b presents it. Step numbers are unchanged.config.md, schema, README, triggers file and the verification-level contract row say the same.plan-low-risk-skips-reviewer: a LOW plan with no config writes the skip line and dispatches no reviewer.Verification
plan-stress-test77/0,reattach-slice25/0,standards-binding9/0,plan-size-keys17/0,interview-defenses185/0.check-matchersOK,check-summary-reader-parity35/0,validate-plugin-contracts232/0,check-data-root18/0.scripts/check-changed-skills.sh HEAD: pass (pre-existing size warnings).check-changelog-fragments.sh --check: valid. markdownlint: 0 issues.validate-cases.py plugins/planning/evals: no FAIL; the new case's graders pass against its samples offline.check-affected.sh --tests) with a realnodefirst on PATH; the misenodeshim fails under a fakeHOME, which had failed 4setup-apply.test.shcases locally on main too.test/plan-reviewer-cut-evalsPR): on LOW plans the change measured -0.03 (95% interval -0.08 to +0.03), with no case drop. Non-inferiority at 0.05 was not shown, and MEDIUM went unmeasured, so the owner waived the no-loss rule for LOW only and MEDIUM keeps the reviewer.Related
Follow-ups
🤖 Generated with Claude Code
https://claude.ai/code/session_01VQb9Q4F46UumaUgXeUdpYZ