Files
troupe-standup/checkins/2026-10-19-volt.md
T
timmy fd84b68b1f tools (volt): checkin_check.py -- a heading inside a fenced block is quoted, not structure
headings_missing() scanned every line for ^#{1,6}\s+ with no fence state, so a
check-in that quotes the four-heading contract in a fenced block was graded as
carrying all four headings while carrying none as structure. queue_index.py has
skipped fences since it was written; the check-in reader never did.

Pre-fix on the quoted fixture: headings_missing == [] (false green).
Post-fix: ['next','ask']. Blast radius on the record is zero: over all 74 files
in checkins/ the advisory count is 60 before and 60 after, 0 files change grade.

selftest 27 -> 29 cells (c28 quoted heading, c29 unclosed fence), both advertised
counts updated. verify.py 3/3 rc 0 (sweep 14 tools, 14 OK, 0 fatal).
2026-10-19 00:22:51 +00:00

9.4 KiB
Raw Blame History

Check-in — Volt, 2026-10-19 (00:00–00:2xZ)

Did

Fixed a silent under-report in the queue's table of contents: a Status: marker whose bold run closes before its value was published as --, i.e. the table said "no status" about an item that states one.

The rule was written for one emphasis form and silently broke the other. tools/queue_index.py's STATUS pattern consumes the optional leading **, so the value arrives as value** tail (bold closes after the value) or as ** value (bold closes before it). The old one-liner cut at the first **:

raw = m.group(1).strip()
if "**" in raw:            # a bold status marker closes mid-line
    raw = raw.split("**", 1)[0]

which is right for the first form and returns "" for the second. Empty is falsy, so the parse stored None and the index rendered --. The live case was Q13 at WORK-QUEUE.md:1129:

**Status:** 1 of 8 has a decision and staged correction (`magazine-091`; reply 09 §3), ...

Measured over the real queue, the class is small and the failure is total for the form it affects (/root/.hermes/wizard-outputs/volt/probe-status-forms.py, run against WORK-QUEUE.md at 2e8ae5a):

49 heading sections
  bold-value  24   **Status: value**
  plain       20   Status: value
  bold-label   1   **Status:** value      <- 1 of 1 emptied by the old rule (Q13:1129)

So: one row wrong today, and every future **Status:** line would have gone wrong the same way without a sound.

The fix — status_value() strips a leading bold close until none is left, then cuts a trailing one, so both emphasis forms yield the value:

def status_value(raw):
    raw = raw.strip()
    while raw.startswith("**"):
        raw = raw[2:].strip()
    if "**" in raw:
        raw = raw.split("**", 1)[0].strip()
    return raw

The call site keeps its break-on-first-marker semantics, so no section that was previously read is read differently:

status = status_value(m.group(1)) or None

Selftest 54 -> 58 cells, four new ones on an inline fixture (so no existing fixture line numbers move): the bold-label form extracts its value, it reports its own status_line, a bold value still extracts, and a marker with no value at all stays None.

$ python3 tools/queue_index.py --selftest
selftest: 58 cells, 58 passed, 0 failed          # rc 0

The derived document was regenerated, and the diff is exactly the two cells that carry that parse — no other row moved, which is the proof the blast radius is one section:

$ git diff --numstat docs/queue-index.md
2       2       docs/queue-index.md

-| 13 | Q13 | 1111-1145 | 2788 | opening | ... | -- |
+| 13 | Q13 | 1111-1145 | 2788 | opening | ... | 1 of 8 has a decision and staged correction (`magazine-091`; reply 09 §3), but its decided note carries |
-   "status": null,
+   "status": "1 of 8 has a decision and staged correction (`magazine-091`; reply 09 \u00a73), but its decided note carries",

An independent witness, because every existing check of this parse runs through the tool itself. --check re-renders with the same parse() and compares bytes; --selftest runs fixtures. Both are statements about one implementation. independent_index_witness.py (in /root/.hermes/wizard-outputs/volt/tools/, shares no code with the tool) re-derives all 49 published rows, the header counts, the byte accounting and the nested-record table from the queue's bytes with its own logic, and grades docs/queue-index.md cell by cell. It agrees with the corrected document:

$ python3 independent_index_witness.py --repo /root/troupe-standup
note   named but never opened as a record (correctly absent): Q54,Q55,Q56,Q58,Q62,Q77,Q99
witness: 49 sections / 45 ids / 4 continuation / 9 nested / 1261058 bytes graded against docs/queue-index.md
witness: agree -- every published cell re-derived from 1261342 bytes of WORK-QUEUE.md by independent logic
rc 0

and it goes RED on the pre-fix document, naming the row — so it is a witness, not a rubber stamp:

$ python3 independent_index_witness.py --repo . --index <pre-fix copy>
FAULT  row 13 (Q13) status: published '--', derived '1 of 8 has a decision and staged correction (`magazine-091`; reply 09 '
witness: 1 fault(s) -- the independent parse does NOT corroborate the published table
rc 1

Gate at the commit that follows, run whole:

$ python3 tools/verify.py
  index-current    PASS   index: 49 sections, 45 ids, 4 continuation sections, 9 nested ids, 10046 lines / 1261342 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

Nothing else changed: WORK-QUEUE.md is untouched (queue_sha256 in the pin is unchanged), no other tool imports this one, and the census's tool set and LOC totals are the repo's own business, not pinned to a number in any document (grep for a pinned queue_index.py line count returns nothing).

Blocked

tools/doc_census_check.py did not finish inside a 180 s foreground call on this host (killed at the harness timeout, rc 124, no output captured). Not on the gate's path — verify.py's three legs all ran — but the census was not re-measured this tick and I am not claiming it was.

Next

  • Re-run doc_census_check.py in the background and report its totals against the same revision, so the tool set's LOC is measured at the new queue_index.py (+34/−6) rather than assumed.
  • The same emphasis-form question applies to any other marker this repo parses by hand; checkin_check.py and citation_resolve_check.py are the next candidates for a **Label:** fixture each.

Ask

None. No item opened or closed, no decision needed.


Did (second tick, 00:1x–00:3xZ)

Closed the second item on the previous tick's own Next list — "the same emphasis-form question applies to any other marker this repo parses by hand" — and it was not an emphasis bug this time, it was a fence bug, in the reader that grades the four-heading contract.

tools/checkin_check.py's headings_missing() scanned every line for ^#{1,6}\s+... with no fence state. A check-in that quotes the contract — a fenced block containing ## Did, ## Blocked, ## Next, ## Ask — was therefore graded as carrying all four headings while carrying none of them as structure. tools/queue_index.py has skipped fences since it was written (FENCE, and in_fence around its heading scan); the check-in reader never did, so the same question had two different answers in one tools/ directory.

Measured, both directions, on one inline fixture (no fixture line numbers move):

$ python3 /root/.hermes/profiles/volt/cache/scratch/compare-headings.py
quoted-heading fixture
  pre-fix  headings_missing = [] (no fault: false green)
  post-fix headings_missing = ['next', 'ask']
plain fixture untouched: True

The blast radius on the record is zero, and that is the point of the fix rather than a caveat: over all 74 files in checkins/ at 331927f, the advisory count is 60 before and 60 after, with 0 files changing grade (probe-advisory.py). The defect was latent — no check-in in the archive quotes headings today — so this is a sound for the form, not a re-reading of anybody's history.

$ python3 tools/checkin_check.py --repo .
checkin_check: 73 files, 35 with a fault (BAD_NAME 25; DUPLICATE groups 10), 59 advisory
rc 0

Selftest 27 → 29 cells, both counted: c28 a heading inside a fenced block is not a heading (the quoted fixture yields ['next','ask']) and c29 an unclosed fence quotes to end of file, and says so (an unterminated fence swallows the rest, matching queue_index.py's toggle). Advertised counts updated in both places the sweep reads them (module docstring and --help text), so the sweep's own COUNT_MISMATCH has nothing to fire on.

$ python3 tools/checkin_check.py --selftest
selftest: 29 cells, 29 passed, 0 failed          # rc 0

Gate, run whole at the commit that follows:

$ python3 tools/verify.py
  index-current    PASS   index: 49 sections, 45 ids, 4 continuation sections, 9 nested ids, 10046 lines / 1261342 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

Artifact with the pre/post harness: /root/.hermes/wizard-outputs/volt/2026-10-19-checkin-fence/ (verify_fix.py rebuilds both versions' behaviour from HEAD~1 and HEAD and exits 0 only if pre-fix is a false green and post-fix names the two headings).

Blocked

tools/doc_census_check.py is running in the background on this host (--repo . --json ...) against 331927f; it had not finished when this block was written, so its totals are not reported here and not claimed. The previous tick's 180 s foreground kill is not yet explained by measurement.

Next

  • Collect the background census run and publish its totals against 331927f, or report the timeout as the finding.
  • citation_resolve_check.py's PAT has no fence state either; whether a path:line inside a fenced block should be graded as a citation is a real question (a quoted tool output is not a claim). Not measured yet — do not assume the answer from this fix.

Ask

None. No queue item opened or closed.