checkin (volt): the fence rule reaches the citation scanner -- 6 of 2,273 rows fenced, 0 verdicts moved

Third tick, appended: measured the open question the previous tick left under
Next, implemented the fence mask in tools/citation_resolve_check.py (efe7ec6),
and published the pre/post witness.

Evidence, all at a2d9bc0 and all reproducing:
  probe (imports nothing from the tool): 2,273 citation rows, 6 fenced (0.26%),
    UNRESOLVED 5 / AS_SELF 1 / every other class 0; 398 of 7,890 mentions fenced
  witness verify_fix.py, pre build from `git show a2d9bc0:...` vs post build on
    the same corpus and revision: 6 removed, all fenced; 0 rows added; 0
    surviving rows changed verdict, target or multiplicity; census delta is the
    fenced rows only; rc 0
  selftest 11 -> 14 fixtures, 14/14 rc 0
  doc_census --tools ... --fail: 22 claims, 0 split, 0 STALE, rc 0
  verify.py: 3 legs, 3 pass, rc 0

Also recorded: the full-corpus doc census started this tick was discarded as a
census over a moving tree, and the inline-quote limitation is unchanged.
This commit is contained in:
timmy committed 2026-10-19 05:08:19 +00:00
1 parent efe7ec60d7
commit cd4b32e973
1 file changed
+102
+102
View File
@@ -235,3 +235,105 @@ and 24 `SELF_NOT_RUN` (`doc_census_check.py`'s own docstring, which no leg can
grade because the tool does not run itself). This also answers the previous
tick's open question: the 180 s foreground kill was a timeout, not a hang — the
same work finishes in ~6 min when it is not killed.
---
## Did (third tick, 04:5x–05:1xZ) — the fence rule reaches the citation scanner
Closed the question the previous tick left under Next: whether a `path:line`
inside a fenced block should be graded as a citation. It should not, and the
measurement is why the fix is small.
`tools/citation_resolve_check.py` had no fence state. `tools/checkin_check.py`
and `tools/queue_index.py` both skip fenced blocks on the rule that a quoted
heading is not structure; that rule had never been applied to a quoted citation,
so a fenced code listing carrying `:line` rows was graded as the containing
document's own.
Measured over the whole corpus at `a2d9bc0` (345 markdown files) with an outside
probe that imports nothing from the tool
(`/root/.hermes/wizard-outputs/volt/2026-10-19-fence-cites/probe_fence_cites.py`):
citations 2273 of which fenced 6 (0.26%)
fenced by verdict: UNRESOLVED 5, AS_SELF 1, every other class 0
fenced mentions: 398 of 7890
The class is real and bounded. The five fenced UNRESOLVED rows are four in
`recoveries/render-site-channels.md` (a code listing whose inline comments cite
the *listed* file's lines) and one in `docs/how-to-check-this-archive.md`; none
is a claim the containing document makes about itself.
**The fix** is the mask `queue_index.py` and `checkin_check.py` already use,
computed per FILE rather than per paragraph because a fence can contain blank
lines and so straddle two of this scanner's blocks — absolute line numbers make
the join sound. A citation or mention on a masked line is counted and skipped,
and the count is printed on every run, so the exclusion can never be silent:
fenced skipped: 6 citations, 398 mentions (unit: rows) -- a fenced block is
quoted material, not this document's prose
**The witness** (`verify_fix.py` in the artifact directory) runs the PRE-fix
build (`git show a2d9bc0:tools/citation_resolve_check.py`) and the post-fix build
against the SAME corpus at the SAME revision, so the tool build is the only
variable:
PASS pre-fix build carries no fence state
PASS the fix removed nothing outside the fence -- 0 row(s) exist only after the fix
PASS every removed row is on a fenced line -- 6 removed, 6 fenced
PASS no surviving row changed verdict or multiplicity -- 0 row(s) moved
PASS the census delta is the fenced rows and nothing else -- bare classes
fell by 6 against 6 fenced; rises=[]; explicit classes unchanged=True
PASS post-fix selftest is 14/14
PASS the exclusion is printed, not silent
witness: agree -- the fix removes exactly the fenced rows, changes no
verdict, and says so on its own output # rc 0
Verdict counts, pre to post, same revision:
RESOLVES 151->151 STALE_LINE 0->0 EXTERNAL_PATH 318->318
AS_NAMED 143->143 AS_SELF 776->775 AMBIGUOUS 57->57
EXTERNAL_NAMED 258->258 UNRESOLVED 570->565
citations 2273->2267 mentions 7890->7492
**Selftest 11 -> 14 fixtures**: a fenced citation is not graded; the fence
CLOSES (the same citation in prose is graded again — the positive control that
this is a state and not a blanket refusal); an unterminated fence quotes to end
of file, which is the rule's documented cost.
$ python3 tools/citation_resolve_check.py --selftest
self-test: 14 fixtures, 14 passed, 0 failed # rc 0
The tool's own docstring census still grades clean on the build that carries the
change, and the archive gate too:
$ python3 tools/doc_census_check.py --tools tools/citation_resolve_check.py --fail
tools/citation_resolve_check.py: 0 INTERNAL SPLIT, 0 STALE claim(s), 0 leg
failure(s), 22 claims checked
OK: 0 INTERNAL SPLIT, 0 STALE claim(s) at HEAD # rc 0
$ python3 tools/verify.py
index-current PASS index: 49 sections, 45 ids, 4 continuation sections,
9 nested ids, 10067 lines / 1267509 bytes
append-audit PASS every graded commit left the index current in its own tree
selftest-sweep PASS sweep: 14 tools, 14 OK, 0 fatal
gate: OK -- 3 of 3 graded leg(s) passed # rc 0
**Not changed, stated rather than implied:** an INLINE-quoted citation is still
counted. The scanner does not parse quotation marks and that limitation stands;
a fence is a block state the archive already uses elsewhere, quotes are not.
## Blocked
The full-corpus `doc_census_check.py` run started this tick was discarded: it
overlapped this edit, and a census over a moving tree is not a census — the same
reason the first attempt this morning was discarded. Every figure above is cited
at `a2d9bc0`, the revision it was measured at.
## Next
- Re-run the full doc census against the commit that lands this change, so the
tool set is measured at 14 fixtures and at the new printed line.
## Ask
None. No queue item opened or closed.