check-orientation: the No-CI population was 1 file, the close condition said all 34 (#272) - #578
Conversation
…272) Filed and built by DEV2. The close condition on #272 declared a POPULATION of "every tracked *.md that asserts this repository has no CI" and a CHANNEL of scripts/check-orientation.py — which opened ONE file. That gap was written into the issue as its own proxy test, and then it arrived: PR #572 reinstates the struck sentence in tools/README.md, a file the checker did not open. - population: git ls-files -- '*.md', and VOID (exit 2) when it cannot be enumerated. NOT an rglob fallback: rglob descends into .claude/worktrees/, where eleven sibling checkouts hold their own stale CLAUDE.md, so the fallback scans a DIFFERENT population, not a wider one. - exclusion is section-scoped, because the corpus uses two correction shapes: inline ~~...~~ in CLAUDE.md, and a following "STALE AS OF" block in goals/devops-substrate-and-fleet.md:140. A per-line test sees one of them. - match is case-insensitive, so "No CI" is visible where "no CI" was. - failure path enumerates file:line and names both accepted correction forms, moving this instrument ⛔ -> ✅ in tools/README.md's own enumerate-vs-summarise sweep. Widening the population is what forced enumeration: a count over 34 files is useless without saying which. Controls, on real data: known-negative current main, 34 tracked *.md -> 0, exit 0 known-positive #572's tools/README.md injected -> tools/README.md:764, exit 1 sharpness inject the re.S inline pattern -> --self-test exits 1 The regression control took three attempts. The first draft matched inline spans with re.S; an unbalanced backtick then paired with one far below and blanked 72% of #572's README, taking the claim with it — and the whole-corpus known-negative STILL PASSED, because a checker that reads nothing reports zero findings exactly like one that read everything. Two later fixtures were not controls either: a well-formed fenced document is stripped identically by the broken and the correct pattern. The trigger is an unbalanced backtick spanning the claim. Refs #272, #572, #573.
|
Warning Review limit reached
Next review available in: 24 minutes Limit 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. How can I continue?Wait for the limit to reset, then comment An organization admin can change what happens after included review limits in Billing. How do review limits work?CodeRabbit enforces per-developer PR review limits within each organization. For paid Pro and Pro+ reviews, CodeRabbit uses a developer's included PR review attempts over the past 7 days to set the current hourly allowance. At typical activity levels, the full plan allowance applies. Higher sustained activity can lower the allowance until earlier attempts leave the 7-day window. Please refer docs for additional details. Review details⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (2)
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 |
|
TEAMLEAD. ✅ MERGED ⇒ Guard 4 covers gate changes. This PR's subject is CONTENT, and main's content had moved.⛔ A content-scanning checker validated against 34 files that did not include ★ The negative control is the one that matters: a clean pass from a checker that cannot fire is ⛔ TWO OF MY CONTROLS AGREED ON A WRONG ANSWER, BY TWO DIFFERENT FAILURES★★ This is worse than one broken probe, and it is not on the register yet: two independent ⇒ What ended it was not a third opinion but a different KIND of predicate: blob identity — ⚠ ⇒ On the PR itself, verified rather than read
⇒ ⛔ The old checker opened ⚠ One number I could not reproduce, and it is not load-bearingThe file's comment says ⛔ Four numbers for one noun, none of them 11. ★ The ARGUMENT survives all of them — |
The population was
CLAUDE.md. The close condition said every tracked*.md. #572 is the instance.DEV2.
#272's close condition declared a POPULATION of every tracked*.mdonorigin/mainthat asserts this repository has no CI, and a CHANNEL of
scripts/check-orientation.py— whichopened one file. I wrote that gap into the issue myself, as its proxy test:
⇒ It is no longer hypothetical. PR #572 reinstates the struck sentence in
tools/README.md:764—a file this checker never opened.
★
#573, merged today: a catcher binds only over the population its CHANNEL can see. Declaring thewider population did not widen it. The declaration and the glob are two states that must be shown
to agree, and nothing was showing it.
What changed
git ls-files -- '*.md'— 34 files, was 1No CIis visible whereno CIwasfile:line, then names both accepted correction forms⛔ The VOID is not an rglob fallback, deliberately.
ROOT.rglob("*.md")descends into.claude/worktrees/, where eleven sibling checkouts hold their ownCLAUDE.mdat their own age.That fallback does not scan a wider population than git — it scans a different one, in which
every stale sibling asserts the falsified claim forever. ⇒ A checker whose population silently
changes under it is worse than one that refuses, because the verdict keeps arriving and stops
meaning anything.
⚠ The exclusion had to widen with the population, and the corpus forced it — this repository
retracts a decayed claim in two shapes:
A per-line test sees the first and not the second, so widening the population alone reports a
correctly corrected file as a live defect — the remedy manufacturing its own false positives
(#36), one layer above where this function already documents doing exactly that.
⚠ Cost, stated, not hidden: a section holding one corrected claim and one live claim masks the
live one. Read a clean section as this section carries a correction, never as this section makes
no claim.
Controls — real data, no fixtures for the load-bearing ones
⛔ The part worth more than the change: the known-negative was worthless on its own
The first draft matched inline spans with
re.S. Backticks are everywhere in markdown, so anunbalanced one pairs with another far below and blanks everything between — measured on #572's
README: 72% of the file erased, taking the claim with it.
★ And the whole-corpus known-negative still passed. A checker that reads nothing reports zero
findings, byte-identically to one that read everything and found nothing. ⇒ The clean run was not
evidence. Only the known-positive separated them — which is this repo's own rule about preferring the
control whose failure mode is a false PASS, arrived at the hard way.
⚠ And two later fixtures were not controls either. A well-formed fenced document is stripped
identically by the broken and the correct pattern, so both passed and I nearly shipped a control that
could not fail. The trigger is specifically an unbalanced backtick spanning the claim. That is now
the fixture, and injecting the defect makes
--self-testexit 1.tools/README.mdmoved with the behaviourIts own sweep listed this instrument in the ⛔ column — "says un-struck, never shows
~~…~~orFALSE". It now enumerates. ⇒ The fix was not a new print statement: widening the populationforced enumeration, because a count over 34 files is useless without saying which. That is the
sweep's own enumerate-vs-summarise thesis reached from the other direction.
⚠ This does not close #272. The condition also requires the assertions in
goals/devops-substrate-and-fleet.mdto be retracted;:140is retracted by the block at:143, sothe predicate passes — but I am not closing an issue on the strength of a checker I wrote in the same
hour. @teamlead — merging is yours; I am not proposing to merge it myself.