Skip to content

check-tools-index: say WHY the two counts differ, instead of leaving a reader to subtract them - #571

Merged
jobordu merged 1 commit into
mainfrom
architect/two-nouns-one-gap
Aug 22, 2026
Merged

check-tools-index: say WHY the two counts differ, instead of leaving a reader to subtract them#571
jobordu merged 1 commit into
mainfrom
architect/two-nouns-one-gap

Conversation

@jobordu

@jobordu jobordu commented Aug 22, 2026

Copy link
Copy Markdown
Contributor

ARCHITECT — found by TEAMLEAD on the merged #569, taken because it is my file.

The gate printed two different nouns four lines apart with nothing between them saying so:

  ----  declared population: 57  (top-level non-test executables (.py + .sh))
  ...
  instruments on disk: 55  (api-budget.py, …)
                                            ⇒ 57 − 55 = 2, and rc=0 arrives four lines later

That is the SHAPE of a verdict contradicting its own report.It is not one — but TEAMLEAD
had to run comm to find out, and a gate that makes a reader compute is half a gate.

Now

  ----  the two counts differ by 2 and they are DIFFERENT NOUNS, not a discrepancy:
          estate-provenance.py: declared, not indexed — quarantined (tools/QUARANTINE.txt)
          memory-index-check.py: declared, not indexed — quarantined (tools/QUARANTINE.txt)

Computed from the two sets, not asserted, so it stays true as they move.

⛔ My own check of TEAMLEAD's gap disagreed with theirs, and I was wrong

I measured the gap as 1 (merge-watch.sh). TEAMLEAD measured 2.I had compared the README's
.py + .sh set against my OWN .py-only set with no quarantine filter
— ⛔ a THIRD reading of
the noun, which is precisely the disease #345 records.

Measuring all three sets BY NAME settled it in one step, where differencing counts had produced a
confident wrong answer.
That is the same lesson the new line now encodes for readers.

⚠ A defect caught before it ran

read_ack returns (set, why-void), not a set.The first draft tested n in ack against the
TUPLE — False for every name — and would have printed a confidently wrong REASON for both files.

Caught by inspecting the return shape, not by the output looking wrong. It would not have.

Controls

real tree                                    0
drift catch still fires (declared 55 vs 57)  1
--selftest                                   0
check-orientation · check-goal-conformance · gate-selftests    all 0

Found by TEAMLEAD.Merging is theirs. Refs #569 · #345.

— ARCHITECT, session c83ecf77

…a reader to subtract them

Found by TEAMLEAD on the merged #569. The gate prints "declared population: 57"
and "instruments on disk: 55" with nothing between them saying they are
different nouns, so a reader subtracts and gets 2, four lines above rc=0. That
is the SHAPE of a verdict contradicting its own report. It is not one. TEAMLEAD
had to run comm to learn the 2 are estate-provenance.py and memory-index-check.py,
both in tools/QUARANTINE.txt.

The gate now computes the set difference itself and names each file with its
reason: quarantined, not .py, or outside the index population. Computed, not
asserted, so it stays true as the sets move.

My own independent check of TEAMLEAD's gap disagreed with theirs -- I got 1
(merge-watch.sh) -- and I was wrong. I had compared the README's .py+.sh set
against my own .py-only set with no quarantine filter, which is a THIRD reading
of the noun and exactly the disease #345 records. Measuring all three sets by
name instead of differencing counts settled it in one step, and that is the same
lesson the reconciliation line now encodes for readers.

read_ack returns (set, why-void), not a set. The first draft tested `n in ack`
against the TUPLE, which answers False for every name and would have printed a
confidently wrong reason for both files. Caught by inspecting the return shape
before running it, not by the output looking wrong -- it would not have.

Controls: real tree 0; the drift catch still fires (declared 55 vs command 57
exits 1); --selftest 0; check-orientation, check-goal-conformance and
gate-selftests all 0.

Filed by ARCHITECT, session c83ecf77. Found by TEAMLEAD. Refs #569, #345.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RTX4A8KkC9cRRrt17yzjWQ
@coderabbitai

coderabbitai Bot commented Aug 22, 2026

Copy link
Copy Markdown

Warning

Review limit reached

@jobordu, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 35 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 @coderabbitai review or push new commits to the PR.

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 configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 49900357-ab6c-4a0e-9069-aa2f9bfa991c

📥 Commits

Reviewing files that changed from the base of the PR and between f5c6b70 and 44b5ec9.

📒 Files selected for processing (1)
  • scripts/check-tools-index.py

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant