#598 names its remedy; and #607 was half a fix — the gate probes garbage bare too - #613
Merged
Conversation
`--force` exists and is documented in --help — "run the subject even if main has not moved" — and the ONLY output a reader sees when the legs did not run never mentioned it. Measured: 0 occurrences of "--force" in a short-circuit run. ⚠ WHAT THAT COST, from the field. A pane probing whether index-watch invokes verdict-census planted a recording stub and watched it fire on run 1 and NOT on runs 2-4. It nearly reported a FALSE NEGATIVE — "this caller does not exist" — because nothing here said the legs could be MADE to run. ⇒ The prose was true and complete about what HAPPENED, and silent about what to DO. That is #73's shape: an absence report that does not name its remedy converts a gap into a wall. Two-poled on an unchanged tree: run 2 (short-circuit) exit 0, now names --force and declares itself a SKIP --force, same tree exit 1, legs actually run ⛔ EXIT 0 IS DELIBERATELY UNCHANGED, and this is a ruling, not a deferral. This file's contract already reads "0 main unchanged, OR checked and the subject reported clean" — two-valued BY DECLARATION, not by accident — and twelve files reference this tool. #598 argues that declaring it does not make it safe; that argument stands and is recorded there. What is settled here: a reader who sees this line now knows the next move, which is the harm the issue actually recorded. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DTMf4EvaTEnDKXY47efRZZ
… ignored it ⛔ I FOUND THIS BY MY OWN CHANGE APPEARING TO REGRESS SOMETHING IT DID NOT. pane-census read UNVERIFIABLE on my branch; the CONTROL — three runs at origin/main, my change absent — read IDENTICALLY. ⇒ Not a regression. The state had FLIPPED under both. ★ AND THE MECHANISM IS THE FINDING. #607 refused an unknown flag only ALONGSIDE `--self-test`. The gate also runs `--zzz-not-a-flag` BARE, and a bare unknown flag fell straight through to the main path — so each tool returned its own CENSUS/SCAN verdict, and the gate read that as "it accepts garbage". ⇒ That verdict depends on LIVE STATE, so the gate's reading of an UNCHANGED FILE moved on its own. Measured, same tree, one hour apart: pane-census --zzz-not-a-flag -> 1 (a divergence was live) gate satisfied pane-census --zzz-not-a-flag -> 0 (sources agreed) gate UNVERIFIABLE ⛔ SO #607 PASSED CI ONLY BECAUSE THE FLEET HAPPENED TO DIVERGE THAT HOUR. A control that holds for an environmental reason is not a control — which is the proposition the gate exists to enforce, and my fix was an instance of violating it. ⚠ pipe-exit-scan had the SAME latent hole and was passing for the SAME kind of accident: bare and garbage both exited 1 because it happens to have findings. If those ever cleared it would exit 0 and go UNVERIFIABLE with nothing changed. ⇒ Both now refuse ANY unrecognised argument. Known flags derived, not assumed: pane-census --self-test/--selftest pipe-exit-scan --self-test/--selftest, --transcripts, --project <value> ⚠ `--project` consumes the NEXT token as its value; the guard skips it, and `--transcripts` is re-run above and still reaches the main path. ⚠ Exit 2 is each file's own documented "established nothing". pane-census bare=0 garbage=2 self=0 self+garbage=2 pipe-exit-scan bare=1 garbage=2 self=0 self+garbage=2 MEASURED, three consecutive runs, now STABLE for a structural reason: 44 control(s) passed · 0 FAILED · 0 UNESTABLISHED · 1 UNVERIFIABLE test_pane_census 0 · test_pipe_exit_scan 0 · test_index_watch 0 · exit-code-gate 0 · check-tools-index 0. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DTMf4EvaTEnDKXY47efRZZ
|
Warning Review limit reachedNext included review available in 35 minutes. View limit detailsLimit details: You’ve used the included review currently available. You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository. Review configuration: ⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Team Run ID: 📒 Files selected for processing (3)
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.
Two commits, one investigation. The second was found by the first appearing to regress something it
did not.
1. #598 — the short-circuit names its own remedy
--forceexists and is documented in--help("run the subject even if main has not moved"), andthe only output a reader sees when the legs did not run never mentioned it. Measured: 0
occurrences of
--forcein a short-circuit run.⚠ What that cost, from the field. A pane probing whether
index-watchinvokesverdict-censusplanted a recording stub and watched it fire on run 1 and not on runs 2–4. It nearly reported a
false negative — "this caller does not exist" — because nothing said the legs could be made
to run.
⇒ The prose was true and complete about what happened, and silent about what to do. That is
#73's shape: an absence report that does not name its remedy converts a gap into a wall.
⛔ Exit 0 is deliberately unchanged, and that is a ruling. This file's contract already reads
"0 main unchanged, or checked and the subject reported clean" — two-valued by declaration,
not by accident — and twelve files reference this tool. #598 argues that declaring it does not make
it safe; that argument stands and is recorded there. What is settled here: a reader who sees this
line now knows the next move, which is the harm the issue actually recorded.
2. ⛔ #607 was half a fix — the gate probes garbage bare too
I found this because my change appeared to regress
pane-census. ⚠ The control says otherwise:three runs at
origin/mainwith my change absent read identically. Not a regression — the statehad flipped under both.
★ The mechanism is the finding. #607 refused an unknown flag only alongside
--self-test. Thegate also runs
--zzz-not-a-flagbare, and a bare unknown flag fell straight through to the mainpath — so each tool returned its own census/scan verdict and the gate read that as "it accepts
garbage".
⇒ That verdict depends on live state, so the gate's reading of an unchanged file moved on its
own:
⛔ So #607 passed CI only because the fleet happened to diverge that hour. A control that holds
for an environmental reason is not a control — which is the proposition the gate exists to enforce,
and my fix was an instance of violating it.
⚠
pipe-exit-scanhad the same latent hole, passing for the same kind of accident: bare andgarbage both exit 1 because it happens to have findings. If those ever cleared it would exit 0 and go
UNVERIFIABLE with nothing changed.
Both now refuse any unrecognised argument. Known flags derived, not assumed:
⚠
--projectconsumes the next token as its value; the guard skips it, and--transcriptsisre-run and still reaches the main path. Exit 2 is each file's own documented "established nothing".
Measured — three consecutive runs, stable for a structural reason
The survivor is
pretooluse-guard.py, a livePreToolUsehook — harness configuration, theoperator's. UNVERIFIABLE by choice.
test_pane_census·test_pipe_exit_scan·test_index_watchscripts/exit-code-gate.sh tools 'test_*.py'scripts/check-tools-index.py🤖 Generated with Claude Code
https://claude.ai/code/session_01DTMf4EvaTEnDKXY47efRZZ