docs(subtract): correct the ground-truth counts and keep the gate re-runnable

Two record fixes, no behaviour change.

The README quoted "35 blocks, 13 genuinely ambiguous" for the hand-built ground
truth. Counting its own rows gives 48 classified blocks and 19 ambiguous — the
headline in the fasit disagreed with the table beneath it, apparently by
collapsing letter-suffixed sub-blocks for the summary while listing them
separately. Labels are untouched in both files; only the counts are restated,
and now as row counts, which are reproducible with a grep rather than by
recounting a classification.

The dogfood gate script that proves the blocking §8 criterion lived only in the
session scratchpad, which would have made "zero load-bearing blocks proposed,
11/18 groups, ~756 tok" unverifiable claims the moment the session ended —
precisely the premise-not-fact class this repo's own rules warn about. It now
lives at scripts/dogfood-subtraction-gate.local.mjs, gitignored via a new
*.local.mjs pattern because it indexes the operator's private config by line
number and must never reach the public mirror.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RW2haJXbxZpKivKHseSXNh
This commit is contained in:
Kjell Tore Guttormsen 2026-07-31 16:28:38 +02:00
commit b8cbbc0f5b
2 changed files with 8 additions and 4 deletions

3
.gitignore vendored
View file

@ -38,5 +38,8 @@ NEXT-SESSION-PROMPT*.local.md
*.local.md *.local.md
*.local.json *.local.json
*.local.sh *.local.sh
# Local-only dogfood harnesses: they index the operator's private config by line
# number (see docs/subtraction-fasit.local.md) and must never reach the public mirror.
*.local.mjs
.DS_Store .DS_Store
.claude/ .claude/

View file

@ -616,10 +616,11 @@ Granularity is the **leaf block** — one list item including its wrapped contin
one paragraph — with two structural exceptions: a paragraph ending in `:` merges with the list one paragraph — with two structural exceptions: a paragraph ending in `:` merges with the list
it introduces, and an *ordered* list is treated as a contract whose steps inherit floor from it introduces, and an *ordered* list is treated as a contract whose steps inherit floor from
any sibling. Unordered lists deliberately do not inherit, so a load-bearing bullet and a any sibling. Unordered lists deliberately do not inherit, so a load-bearing bullet and a
disposable one can coexist in the same list. Measured against a hand-built ground truth disposable one can coexist in the same list. Measured against a hand-built ground truth over
(35 blocks, 13 genuinely ambiguous): zero load-bearing blocks proposed, 11 of 18 deletable a real 250-line CLAUDE.md (48 classified blocks, 19 of them genuinely ambiguous, ~65 % floor):
groups surfaced, ≈18 % of an always-loaded file. On a well-maintained config this axis is **zero load-bearing blocks proposed**, 11 of 18 deletable line-ranges surfaced, ≈18 % of an
mostly a no-op — which is itself the finding. always-loaded file. On a well-maintained config this axis is mostly a no-op — which is itself
the finding, and the reason precision-over-recall is the only defensible tuning.
--- ---