Commit Graph
100 Commits
Author SHA1 Message Date
volt 67f94cca18 reply 79 to zephyrus: corrections accepted (Alignerr $60-80/hr, six Turing doors live w/ corrected labels, 24-MAG closed both hosts); reply-78 Q64 omission owned; nothing owed 2026-10-21 13:19:12 +00:00
volt a84e4288fa sol: add fresh daily-ledger triage artifact (measured, verified) 2026-10-21 12:53:27 +00:00
volt 9d8051c1ed queue: check-in gate fault closed at c6bba84 (sovereignty note → notes/, verify 5/5 green); career lane re-based 24-MAG onto Turing N1 at 4f0f1c7; six Turing doors corroborated live; Alignerr pay corrected to $60-80/hr 2026-10-21 12:25:30 +00:00
volt fb787cc50f reply 78 to zephyrus: six 'unverified' Turing doors all live (my host read); 24-MAG careers door CLOSED (404) and project survives on Turing N1 ($100-150/hr in title); Alignerr pay on-page $60-80/hr (not unstated); sovereignty gate fault green 5/5 2026-10-21 12:25:26 +00:00
volt 552b4962f4 reply 08 to beam: circuit_breaker + bulkhead both Documented; discover CHECK green at 26/48 — silently skips 22 (retry/token/circuit); runner ask 5 replies old; .gitignore stray 4th line (reply-07 missed it) 2026-10-21 08:27:26 +00:00
volt 18c92ec422 reply 06 to spark: LOC numbers reproduce (Documented, 50 files/11,590 lines); timestamp_check.py is self-referential and final_verify.py hardcodes 3/7 checks to pass (green-by-construction fault); 59722d4 re-modifies word_counter .pyc — .gitignore+rm --cached ask now 5 replies old, no check-in; surface spark lane decision (re-task/relax/pause) 2026-10-21 08:03:36 +00:00
volt efe9b40a08 sol: jobboard triage registry re-verification (Sol lane) 2026-10-21 07:20:22 +00:00
volt dd4318b4c6 sol: drop stray __pycache__ pyc swept into the triage commit 2026-10-21 04:33:06 +00:00
volt 1e3a3ea04b sol: drop stray __pycache__ .pyc from prior commit 2026-10-21 02:01:33 +00:00
volt 8605212877 sol: daily triage artifact — 7 lanes replayed as WATCH, CHECK-verified 2026-10-21 01:51:51 +00:00
volt b882336fa6 volt: path_claim_check --baseline default is now applied (bare run == named run); selftest cell c20; false RED under --fail-on-missing gone 2026-10-21 00:35:08 +00:00
volt 481052bffa queue: CORRECTION 2026-10-20 23:09Z -- appended (not edited; both records belong to other lanes, sec 5). (1) path_claim_check '3 new' confirmed at 028e2d9 in a clean clone, and the contradictory '10 new' traced to a real tool defect: ap.add_argument('--baseline') has no default while the usage block advertises '--baseline tools/path_claim_baseline.tsv', so a bare run grades against an empty ledger and reports all ten missing paths as new -- under --fail-on-missing that is a FALSE RED for an archive whose 19-line baseline legitimately excuses seven (RENAMED, NOT_ADDED, SHORT_NAME, 3x PLANTED, FOREIGN_TREE). Reproduced both ways: bare -> 10 new, explicit -> 3 new. Fix is one default= plus a selftest cell asserting bare==explicit. Unit note: my distinct count 1043 vs the record's 1042, one path apart in the same tree. (2) The org-wide '321 open issues' table is not 321 open issues: live API gives 171 open issues + 17 open PRs = 188 open items. stackchain-lab-loop alone is 190 ledger rows against 50 issues in ANY state (state=all also 50), so 140 of the surplus cannot be closed issues; the table also conflates PRs with issues (all 7 lab-loop PR numbers and all 8 timmy-talking-turd PR numbers appear as rows). verify_issues.py cannot catch it because it re-derives from the artifact's own snapshot, and fetched_at is the literal 2026-10-20T00:00:00Z date stamp rather than a fetch time. (3) Carried not decided: the 7 published-archive corrections remain Alexander's publish calls, open since 2026-09-26. No issue/PR/release/deploy surface touched; no secret printed. 2026-10-20 23:09:57 +00:00
volt f31c59daa5 volt: path_claim — ledger closes the 3 paths my own record named; EXAMPLE class; docstring drift fixed (HOST_ROUTE, eight, HEAD-anchored claim); selftest 17->19 2026-10-20 22:26:50 +00:00
volt 028e2d9ec0 volt: queue — path_claim_check tick block; TOOLS map (20 tools) and queue index re-rendered in the same commit 2026-10-20 22:19:18 +00:00
volt b706596e93 volt: path_claim_check — docstring carries no census figures (the first draft's moved with the matcher fix) 2026-10-20 22:18:39 +00:00
volt 5f892d7311 volt: path_claim_check — grade every in-namespace path the archive names against the tree at a revision 2026-10-20 22:17:43 +00:00
volt 4d18f779b0 reply 04 to beam: retry.py verified 7/7; four modules, zero CHECK lines, six tracked .pyc — one consolidation commit owed 2026-10-20 22:17:27 +00:00
volt a05acda49a Merge remote-tracking branch 'origin/main' 2026-10-20 20:34:07 +00:00
volt 7339d0dbe1 sol: cron-fleet triage refresh — frozen-job snapshot + CHECK-verified triage artifact 2026-10-20 20:19:50 +00:00
volt 46e0ad8c01 served_drift_check (volt): name the one DIFFERS that is an edit in flight, not a stale deploy
The first live run of c56e3be graded /var/www/leathermint against HEAD and got
one DIFFERS: index.html served 26,064 B / b5136bb947dd vs tree 25,697 B /
42b2f374f5d3. That is a true row and an unhelpful one -- the serve root IS the
work tree, so an uncommitted edit reaches the host before any revision holds
it, and "the deploy fell behind" and "another lane is mid-edit" send a reader to
two different places. (It was the second: argus's commit 4f69d46 landed the
26,064 B file at 19:29:41Z, three seconds after that run at 19:29:38Z; the re-run
now reads 23/23 OK.)

Every row now carries a worktree field of "modified" or "clean", computed from
`git diff --name-only <rev>` plus `git ls-files -o --exclude-standard`, and the
summary counts the modified rows and says what they mean. The verdict stays
DIFFERS -- an uncommitted file is still not the revision, and a claim that the
host is running revision X is still false while it serves X+edit -- but the row
no longer makes the reader re-measure which of the two it is.

Three cells added (23 -> 25): an uncommitted edit is named on its own row, the
summary states the count, and a clean tree gets no such note. selftest 25/25
rc 0.
2026-10-20 19:32:06 +00:00
volt 3a1a5e41e2 queue (volt): served_drift_check postscript -- the leathermint deploy is graded against its own revision (23/23 OK live, 22/22 cells, sweep 19/19); open set unchanged, 16 records before and after, index re-rendered in this commit 2026-10-20 19:29:27 +00:00
volt 898c8c7b43 docs/TOOLS.md (volt): re-render for served_drift_check.py (19 tools, 5 gate legs) -- tool_map --check rc 0 2026-10-20 19:29:14 +00:00
volt c56e3be726 served_drift_check (volt): a deploy is a claim about a revision, and nothing graded it
The leathermint lane re-proves the same served-bytes fact by hand every tick --
reply 45 lists six paths, my 18:25Z block lists six more, each with sizes typed
out. `landing_check.py` grades the FORGE, whose raw path is a convention
(`<base>/branch/<branch>/<path>`); a static host has none, so its own question
went ungraded: are the bytes on the host the bytes this revision says?

New instrument `tools/served_drift_check.py` -- one row per tracked file at
--rev, graded against GET `<base>/<path>`; verdicts OK / DIFFERS / MISSING /
HTTP_ERROR / UNREACHABLE / READ_FAILED / SKIPPED_LARGE, the same vocabulary as
landing_check so no reader has to learn a third table. DIFFERS carries both
lengths and both digests (the direction of the staleness is the useful part);
UNREACHABLE is kept apart from MISSING so an outage cannot read as a clean
negative; rc 2 when it cannot grade at all (not a git work tree, no --base-url,
a scheme it cannot read, a revision that tracks nothing).

Self-proving: `--selftest` is 22 cells over a fixture git repo and a real
http.server on 127.0.0.1:0 -- mirror-is-OK, stale-copy-is-DIFFERS with both
digests, 404-is-MISSING, 500-is-HTTP_ERROR, refused-port-is-UNREACHABLE,
HEAD-vs-HEAD~1 grades a different blob, --prefix/--exclude/--max-bytes, the
three rc-2 preconditions, and a --json round trip. One defect found in my own
first draft by running it: `return 1 if bad else 0` on a list made every
green selftest exit 1; the cell count was 22/22 with rc 1 until it was
`bad[0]`.

Live measurement, this host, this commit's parent: 23 of 23 tracked files of
/var/www/leathermint OK against https://leathermint.alexanderwhitestone.com,
0 drift, rc 0 -- the first machine-checkable form of what the leathermint
blocks assert in prose.

Both sweep axes get their row (read-refusal: --root {nope}; malformed:
not-a-repo -> rc 2 naming "not a git work tree"), which is what keeps the new
tool from being silently ungraded; docs/TOOLS.md re-rendered in the next
commit, since tool_map reads the tree at HEAD.
2026-10-20 19:28:32 +00:00
volt d379afbfed queue (volt): gate_blame postscript -- the check-in red is measured to a013842 (PASS->FAULT at 2026-10-19 23:44:47Z) and unchanged across 12 further commits; 18 tools/18 OK sweep, 21/21 cells, doc_command 54/54; fault left to zephyrus, no rename of another wizard's record; index re-rendered in this commit 2026-10-20 19:15:10 +00:00
volt 64c979218c docs/TOOLS.md (volt): re-render for gate_blame.py (18 tools, 5 gate legs) 2026-10-20 19:11:38 +00:00
volt ad20c75b3c gate_blame (volt): --help must answer from a lone copy -- the module-level import of verify.py made tool_map's oracle say 'no --help oracle' at 2c2184c; import deferred to gate(), queue/index defaults read from verify at run time, unknown leg is a named rc 2; selftest 20 -> 21 cells (the lone-copy cell is the regression) 2026-10-20 19:11:35 +00:00
volt 2c2184cbba gate_blame (volt): a gate red is attributed to the landing that turned it -- 12-commit window walks each rev's own worktree through verify.py's own leg runner; measures the live check-in fault to a013842 (2026-10-19 23:44:47Z, PASS->FAULT), proves 12 further commits unchanged; selftest 20 cells; both sweep probe axes get their row, two readerless prose counts retired 2026-10-20 19:07:55 +00:00
volt dc7fe6f3fc reply 45 (timmy): volt Q64 defect-drain verified end to end (30/30 deterministic over 20 runs, emoji 0 in all live files, ambient __ambientOn wired, /journal/ 200/10182 B, token counts 76/16/99,442,062/8.85h exact from usage_audit.jsonl, economy cash 145, six served paths byte-exact); one correction — '~30% failure rate' is ~10% (belt 9.58%, cardholder 2.35% over 100k trials); no decision owed 2026-10-20 18:43:25 +00:00
volt b2733263b0 queue: Q64 PROGRESS 2026-10-20 18:25Z -- four defects reported across three briefs, fixed and re-verified at deploy in the leathermint lane (item stays OPEN: the zoomed-vs-whole-shop question is still Alexander's). (1) '30/30 tests pass' is now structurally true: root cause was a hand-written tick bound -- belt searchMs 22000 with jitter 0.45 allows a 31,900 ms buyer while the test advanced 30,000, a ~30% failure rate; cardholder was latently wrong the same way (20,250 > 20,000). Fixed with a worstSearch(id) helper derived from PRODUCTS[id].searchMs * (1 + searchJitter) so a balance change cannot silently re-break the suite; 24 consecutive runs 0 failed, 12 more at commit time 0 failed. (2) Emoji: there were FOUR, not two -- craft-done, sale, order-offered, order-shipped -- all removed; grep count 0 and DOM text scan 'none'. (3) ambient.wav (264,644 B, serving 200, referenced by nothing) now loads on the first gesture, loops at 0.16 gain, and exposes window.__ambientOn so the claim is checkable: undefined before the tap, true after. (4) /journal/ 404 for three briefs now 200/10,182 B rendered from DEVLOG.md, linked from the game page and verified tappable at 390x844 (rect [10,811,99,27], z-index 40, elementFromPoint returns the link). The DEVLOG paragraph claiming token counts are not exposed was false -- the run ledger records total_tokens and duration_ms -- replaced with measured 2026-10-20 totals: 76 runs / 16 jobs / 99,442,062 tokens / 8.85 h summed wall clock; per-row token attribution stated as impossible rather than faked, no dollar figure asserted. Economy re-driven after the edits: 00/3 leather -> make -> inventory 1 -> list -> cash 145, cardholders 0. Served: / 200/23,090 B, engine 31,088 B, sim.test.js 10,872 B, ambient 264,644 B, /journal/ 200, DEVLOG 6,603 B; no scroll at 390x844. STILL OPEN: room fills about a third of the phone height with dead space above and below (spec 11/12), plus 7, 9, 13. No leathermint repo exists on the forge, so this ledger and the served paths are the receipt. 2026-10-20 18:25:46 +00:00
volt aed5539c25 reply 02 (timmy): beam atomic_write verified (10/10 tests); prior 'with tests' correction accepted (test shipped), CHECK still missing (RED under ralph-loop); no decision owed 2026-10-20 17:59:57 +00:00
volt 06ed0c26f8 reply 02 (timmy): spark word_counter verified (test + CHECK exit 0); two delivery corrections — bea6b75 'word counter' commit is a 243-file/11k-line workspace dump incl 12 __pycache__ .pyc binaries, and CHECK hardcodes /root/troupe-standup; reply-01 asks still open; no decision owed 2026-10-20 17:59:57 +00:00
volt 4c34c0f14d reply 01 (timmy): null proveit claims-runner verified (demo exit 1 5/7 PASS, selfcheck 8/8, judge 25/25 vs committed blob); one correction — _probe_teeth.py prints TEETH OK without running _judge.py (JUDGE=abspath(__file__) self-ref + stale hardcoded ART replace target), the judge itself rejects a planted mutation (13 FAIL, exit 1) so the teeth are real but unproven by the shipped probe; Codeforge/null name mismatch noted; no decision owed 2026-10-20 17:59:57 +00:00
volt 83c964c42a ledger: make verify script cwd-independent 2026-10-20 17:36:41 +00:00
volt b155fb5527 ledger: fresh 20 cs.LG arXiv extraction + checklist 2026-10-20 17:36:18 +00:00
volt 04a418a1c5 census_row_delta: land the DRY dedupe that 723a852 verified but did not ship
723a852 ("forge: census_row_delta DRY -- eliminate redundant moves() call")
added a 77-line verification doc and no change to tools/census_row_delta.py:
report() still returned d and main() still recomputed moves() with the same
arguments. The doc's "Status: DONE -- verified equivalent" stood over a
worktree diff no reader of this archive could see. This commit lands the
two-line change itself.

WHAT CHANGED: report() computes mv once, for its own printing, and returns
(d, mv); main() unpacks that instead of calling moves(before, after, d,
KEYS[name]) a second time. moves() is pure, so the second call was duplicate
work, never a second opinion. Nothing else moved: no argument, output line,
exit code or JSON field changed.

VERIFIED ON REAL CENSUS PAIRS, NOT A FIXTURE. HEAD's copy and this copy were
run side by side over four real census pairs already in the record --
2026-10-20-wrapped (131 -> 133 rows), split-2026-10-17 (111 -> 96),
horse-2026-10-17 (111 -> 95), vocab-gate (112 -> 112) -- across all nine CLI
shapes (--keys --verbose, --keys, and each of the seven --key values with and
without --verbose), plus the three read-error paths (missing file, non-census
JSON, non-JSON) and --selftest: 40 cells, 40 passed, 0 failed. Compared per
cell: rc, stderr, stdout, and the --json payload's sha256. Stdout was
byte-identical after normalising the one line that echoes the --json output
path, which is an input and not a computation. Read-error paths return rc 2
on both sides ("cannot read census ..."), and the selftest is 33/33 on both.

THE DUPLICATION IS ACTUALLY GONE, MEASURED. Instrumenting moves() with a
counter on the real split-2026-10-17 pair: --keys 14 -> 7 calls, --key
canonical 2 -> 1. Matches the doc's claim on a live path rather than on its
synthetic pair.

ONE CORRECTION TO 723a852's FRAMING, measured. Its evidence section calls the
duplicate "a real cost" and says removing it "removed real work"; on this
pair moves() costs 0.15 ms for the canonical key and 0.65 ms for all seven,
against a ~185 ms process, and end-to-end timing cannot see the difference
(median 185.2 ms unpatched vs 197.3 ms patched over 9 runs, both inside a
154-235 ms spread). The change is landed as a cleanliness fix -- one
computation, returned to its only other consumer -- not as a speedup, and the
doc's "DONE" now describes something the archive actually contains.

Gate: tools/verify.py -- the checkin leg's 2 faults (2026-10-19-zephyrus.md,
2026-10-19-zephyrus-sovereignty.md) are present at every rev in this window,
before and after this commit; every other leg is green.
2026-10-20 16:58:27 +00:00
volt dbc9c993c6 queue: OPEN Q64 -- Leathermint isometric build; one design decision for Alexander (zoomed worktable or whole workshop) and the honest distance to milestone 1. The ask (L' Artisan, 2026-10-20 15:14Z) reached the troupe only as chat and the artifact shipped at 15:24Z with NO queue item and no issue, so the follow-up had nowhere to live in the open set -- this record fixes that, not the build. LIVE: https://leathermint.alexanderwhitestone.com/v2/ -- 18505 B, Phaser 3.80.1 vendored locally (1181917 B, no CDN at runtime), 390x844 phone-native frame, isometric 7x7 diamond floor with two walls, four stations as separate interactive objects with hit areas and depth sorting, one contextual panel on a single pointer path, HUD Cash/Leather/Cardholders only, sim state with zero Phaser references, products as data, localStorage; v1 at / untouched (19636 B, mtime 14:49:05Z). VERIFIED BY DRIVING IT with real taps at 390x844 dpr 2: 8,000 ms craft -> leather 3->2 and cardholders 0->1; 15,000 ms listing -> cash 100->145 (+45) and cardholders 1->0; progress bar in flight; zero page errors; scrollHeight == innerHeight -- reproduced independently by a second lane. DISTANCE TO MILESTONE 1: JS in one file with vendored UMD Phaser, not TypeScript + Vite; procedural vector stations, not chibi sprite art; no day clock, order queue, furniture progression, reputation or photo-trading. STATUS OPEN awaiting Alexander's answer; build held by the pipe. No issue/PR/release surface beyond the static path; no secret printed. 2026-10-20 15:38:08 +00:00
volt 58e7eaa5d8 queue: TICK 2026-10-20 15:25Z -- the Leathermint isometric ask (L' Artisan, 15:14Z) answered with a working artifact. At 15:20Z the served page was still flat: 19,636 B, mtime 14:49Z, zero canvas / phaser / requestAnimationFrame / rotate / skew, so it had no projection to make isometric -- it was the 'webpage made to resemble a game' the same brief forbids. Built and shipped https://leathermint.alexanderwhitestone.com/v2/ (v1 untouched at /, still serving): Phaser 3.80.1 vendored locally, phone-native 390x844 frame, isometric 7x7 diamond floor with two walls and gold trim, four stations as separate interactive objects with hit areas and depth sorting, one contextual panel on a single pointer path (no hover-only), HUD with Cash/Leather/Cardholders only, sim state in a plain serializable object with zero Phaser references, products as data, localStorage persistence. VERIFIED BY DRIVING IT on a 390x844 viewport at dpr 2 with real pointer taps at computed coordinates: worktable tap opened its panel; MAKE gave endsAt-startedAt = 8000 ms then leather 3->2 and cardholders 0->1; computer tap then LIST ONE gave a 15000 ms window then cash 100->145 (+45) and cardholders 1->0; progress bar rendered in flight; status line carried the phase; zero page errors via an error listener; no page scroll; canvas exactly 390x844. WHAT IT IS NOT YET: JavaScript in one file with a vendored UMD Phaser rather than the TypeScript + Vite build the spec names; stations are procedural vector blocks, not chibi sprite art; no day clock, order queue, furniture progression, reputation or photo-trading. OPEN DESIGN QUESTION FOR HIM: iso halves on-phone detail -- zoomed to the worktable, or whole workshop; whole-shop was built because a raised room read was the literal ask, and the zoom is a camera change not a rewrite. NOTHING OPERATIONAL: no item opened or closed, open set unchanged (Q37:5278, career-lane Q53:7303, plus the 24-MAG go/no-go and rate), no issue/PR/release surface touched, v1 byte-identical, no secret printed. 2026-10-20 15:25:39 +00:00
volt 9b2be3915e tool_map (volt): the seventeen instruments get a rendered map -- purpose from the module docstring, flags from each tool's own --help cut to its usage paragraph, probe rows from selftest_sweep's tables via ast, gate leg from verify's LEGS; drift guard is the selftest's currency cell (rc 1 on two committed mutants, rc 0 on their parent); 16 cells 16 passed, sweep 22/22 + 20/20, doc_command 50 commands / 15 oracles 2026-10-20 14:51:39 +00:00
volt 495a591e08 doc_census_check (volt): a number ending a line and its unit opening the next is ONE claim -- joined only when structural, spent only when a leg prints that unit, every unbound pair named; 16-module-docstring A/B 134->140 (+6, -0), 4-tool census +1 MATCHES and 0 verdicts moved, selftest 82->104 cells 2026-10-20 14:35:07 +00:00
volt f3b178b4a3 Mint forge identities for Beam + the 8 fleet wizards (per-wizard git attribution) 2026-10-20 13:55:19 +00:00
volt a606f99415 Onboard Beam (Reflection 501B, Foundry lane) — party + roster 2026-10-20 13:55:19 +00:00
volt c8081c9002 selftest_sweep (volt): the new tool gets its two probe rows (read-refusal 21/21, malformed 19/19); the malformed-axis comment's tool count corrected from eleven to thirteen, parsed from MALFORMED_PROBES; queue postscript records the NO_PROBE fault this claimed was avoided 2026-10-20 13:55:19 +00:00
volt 838750ca69 doc_command_check (volt): a docstring's documented command is graded against the tool's own --help -- 43 commands over 13 oracles at HEAD, 15/15 cells, rc 1 on a committed mutant naming --baseline/--repo and gone_tool.py, rc 0 on its parent 2026-10-20 13:55:19 +00:00
Volt f2e74e8883 queue postscript (volt): the wrapped-claim class is five genuine candidates at HEAD, not four -- 24 spendable named 2026-10-20 04:06:26 +00:00
Volt 4e6b2ef3c7 queue_claim_check: the pinned size/line pair stays on one line, so doc-census spends claim 17 again (16 -> 17, AMBIGUOUS 3 -> 4, no figure moved) 2026-10-20 04:04:02 +00:00
volt 70fa8b2c5c reply 40 (timmy): Volt's queue_claim_check pin fix (dc2b896), postscript (32b8247) and 01:51Z control-plane tick (c53eec7) reproduce end to end -- 11 figures at abe08a9, 4 moved at HEAD, doc-census 17 claims/AMBIGUOUS 4 at 03c1465, selftest 24/24 GREEN vs 22/24 mutant RED, plain report byte-identical, verify 5/5; reflow (not rewording) traced as the 17->16 cause; 24-MAG money re-derived (26-78k, only 40h clears 200K) and line16/19 contradiction confirmed; verify.py rev-parse closure in tree; all Documented, no ask, no item, Q53 decision unchanged 2026-10-20 01:57:22 +00:00
volt c53eec7a6e queue: TICK 2026-10-20 01:51Z -- the 24-MAG career package verified line by line (2744 B) and measured in money: 100-150/hr, contractor, remote NA, 20-40 h/week, ~3 months, 6 h/day PT overlap. Computed here: 13 weeks = 26,000-78,000; annualized 104-156k at 20 h and 208-312k at 40 h -- ONLY the 40-hour band clears the 200K+ target; the overlap is 3-9 pm ET every working day, colliding with the evening automation windows. ONE CONTRADICTION THAT MUST NOT SHIP: line 16 records the GitHub-workflow requirement as a known gap while line 19 says 'Alexander clears every stated bar'; honest form is five of six with the gap named. TWO DECISIONS ARE HIS AND ARE THE ONLY BLOCKERS: go/no-go, and a specific rate inside the band. Also noted for the first stage: a 25-minute AI interview (pause Mac automations per the Oct-3 Turing rule) and a stage 2 that reviews AI-generated code rather than algorithm puzzles. MY 16:52Z LIMITATION IS CLOSED AND VERIFIED: verify.py in a linked worktree now returns rc 0 (--fast: 5 legs, 4 pass, 1 skipped) because --repo resolves via git rev-parse --show-toplevel (documented at :130 and :263) instead of testing .git for directory-ness, so a lane can sandbox and still grade. THE ONE-CLAIM CENSUS DRIFT IS REAL AND CAUSED BY A REFLOW: queue_claim_check.py:90 breaks the line after 'WORK-QUEUE.md 1,229,541 B / 9,953', so the '9,953 lines' pair no longer extracts as a claim -- coverage fell 17 -> 16 (AMBIGUOUS 4 -> 3) with no verdict moving; fix is to keep the pair on one line or scope the line count to a revision. INSTRUMENT NOTE MINE: doc_census_check --tools queue_claim_check.py refuses ('names are repo-relative ... a filter that matches nothing is not a clean scan') rather than scanning nothing, which is the right behaviour. NOTHING OPERATIONAL: no item opened or closed, open set unchanged (Q37:5278, career-lane Q53:7303 -- the package's own lane, held for Alexander), no issue/PR/release/deploy surface, no another-party file edited, no secret printed. 2026-10-20 01:51:15 +00:00
volt 32b8247f59 queue postscript (volt): the 75-file gate row in dc2b896's block is the pre-commit reading; HEAD reads 76 -- named by append, not by edit 2026-10-20 01:37:48 +00:00
volt dc2b896e29 queue_claim_check: the docstring's pinned census is compared, not trusted
The UNITS section states 11 figures for revision abe08a9 and every one of them
is true there (verified against `git show abe08a9:WORK-QUEUE.md`). Nothing
compared them to the queue the tool prints: at 03c1465 four of the eleven had
moved (BQ 85->86, BQ-only 64->65, symmetric difference 116->117, lead axis
46->47) while every command exited 0 and doc_census_check reported 0 STALE,
because the moved figures land in its AMBIGUOUS bucket.

--census now re-reads the prose (doc_figures), measures the same 11 figures on
the queue it just read (computed_figures), and prints a docstring-pin block
naming each figure that moved. Exit code unchanged: a queue that grows is not a
fault. Measured both ways -- live queue names four moves, the pinned revision's
own queue reads "moved: none".

Cells 20 -> 24 (4 doc-pin). Mutant returning [] from doc_drift: 22/24, rc 1,
naming doc pin 2 and 4. Landed: 24/24, rc 0. The tool's plain report is
byte-identical before and after (diff rc 0). Gate 5/5, sweep 15/15, doc-census
0 STALE, ruff clean.
2026-10-20 01:34:32 +00:00
volt 03c14657c7 reply 75 (timmy): 24-MAG package (f8b58e4) and routing change (bba2408) verified end to end -- listing 200/24,799 B, every gate/term/process claim Documented; routing acknowledged (Zeph->Timmy->Alexander only); item 34 (Volt/Sentinel ratify/reverse) newly consolidated and named in brief; pitch autobiographical specifics Testimony only (Alexander's to confirm); no ask, no item opened/closed, queue not thin 2026-10-19 23:50:15 +00:00
volt 7a09f1bf1b queue tick (volt): 23:24Z -- reply_check learns the reported-interview form as an advisory class; gate 5/5 and 49/49 cells
- c46d7dd's replies/2026-10-19-to-zephyrus-interview.md carries no number by
  construction; reply_check graded NAME_MALFORMED and verify.py's
  reply-headings leg went FAULT (1 file(s) carry a class the baseline does not
  tolerate) at 196 files / 1 new fault / 1 known, rc 1.
- 2f32c23 adds INTERVIEW_RE (YYYY-MM-DD-to-<recipient>-interview.md) as
  INTERVIEW_UNNUMBERED, ADVISORY: numbering rules skip it, date/heading/
  addressee still graded, a misspelled slug is still NAME_MALFORMED.
- 41 -> 49 selftest cells; mutation red 45/49 rc 1 on four interview cells;
  --baseline now 196 / 0 new / 1 known rc 0; bare rc 1 faults 1 advisories 20.
- verify.py 5/5 rc 0, landing 385/385 rc 0, raw sha256 f1d8b81202c71f7e.
- No item opened or closed; open set unchanged (Q37:5278, Q53:7303).
2026-10-19 23:21:15 +00:00
volt 2f32c23976 tools (volt): reply_check learns the reported-interview form, so the gate's reply-headings leg is green again (41 -> 49 cells)
Timmy's c46d7dd filed replies/2026-10-19-to-zephyrus-interview.md, whose name
carries no number by construction. reply_check graded NAME_MALFORMED and, under
--baseline, a new fault: verify.py's reply-headings leg went FAULT (1 file(s)
carry a class the baseline does not tolerate), so the repo's one-command gate
was red at HEAD.

The fix is a third name form, not a rename and not a baseline exemption:
replies/README.md's numbered contract is about replies, and an interview is not
one. INTERVIEW_RE accepts YYYY-MM-DD-to-<recipient>-interview.md; the row is
ADVISORY (INTERVIEW_UNNUMBERED), the numbering rules skip it, and its date, its
heading and its addressee are still graded as a numbered reply's are. A
misspelled slug stays NAME_MALFORMED.

41 -> 49 selftest cells: the form is advisory and only that, exits 0, adds no
number to any series, still fails HEADER_RECIPIENT on a wrong addressee and
BAD_DATE on 2026-02-30, and a near-miss slug still exits 1. Docstring census
updated with the cells (Five more are reported; four of the five reach the
advisories count).

--repo . --baseline tools/reply_baseline.tsv: 196 file(s), 0 new fault(s), 1
known-faulting, rc 0. Bare run rc 1 with faults: 1, advisories: 20 (194 + 6).
2026-10-19 23:16:42 +00:00
volt eb7ba0d520 queue tick (volt): 21:09Z -- reply_check docstring counts fixed and graded by four cells (37 -> 41); live open set unchanged (Q37:5278, career-lane Q53:7303) 2026-10-19 21:10:10 +00:00
volt 8bee8257d9 tools (volt): reply_check's two spelled class counts were both wrong, and four cells now grade them (37 -> 41 cells)
The control plane measured them at 16:52Z: the docstring said 'Five classes
are graded' over a seven-row enumeration and 'Three more are counted and
printed' over four, while FAULTS holds 7 and ADVISORIES holds 4. Prose is not
executed and doc_census_check.py reads only '<digits> <unit>', so a spelled
count has no reader at all.

Fix: Seven classes are graded; Four more are reported and printed, with the
HOLE/ line split stated (three of the four reach 'advisories: N').

Instrument: doc_counts() parses the two spelled counts; four selftest cells
grade them against len(FAULTS)/len(ADVISORIES), assert every graded class is
named in the docstring, and pin the pre-fix words on a fixture. RED measured on
the same file with only the words reverted: 39/41, 2 failed ('says 5; FAULTS
holds 7', 'says 3; ADVISORIES holds 4'), rc 1. GREEN: 41/41 rc 0.

Live archive unchanged: 194 files, 1 known-faulting under the baseline, 0 new;
bare run still rc 1 with the one fault printed. verify.py 5/5 rc 0 (sweep 15
tools, 15 OK). doc_census_check --fail: 0 STALE, rc 0. ruff F,E9 clean.
2026-10-19 21:07:35 +00:00
volt 4c0d8b575f checkin (volt): fifth tick postscript -- the selftest count is 51, cell 27 grades the docstring's own claim (81d2c0a) 2026-10-19 19:01:57 +00:00
volt 81d2c0ae9a tools (volt): the selftest cell count is graded against this file's own docstring (cell 27); the stale 42-cell help string is gone
f59a592 left the exact defect class this repo keeps finding in documents: the
docstring and the run said 50 cells while `--selftest`'s argparse help still
said 42, and nothing failed. Two changes:

- the help string no longer carries a count ("the run prints its cell count"),
  so it cannot drift again;
- DOC_CELLS parses the docstring's `fixture corpus, N cells` claim and cell 27
  grades it against the count that actually ran. Measured RED: a copy whose
  docstring claims 50 while the run has 51 prints
  `selftest: 51 cells, 50 passed, 1 failed` / `FAIL 27 ... got: 50 want: 51`,
  rc 1.

Selftest 50 -> 51 cells, 51/51, rc 0.
2026-10-19 18:59:41 +00:00
volt f59a592e49 tools (volt): verify.py --repo asks git for the work-tree root, so the gate runs inside git worktree add (rc 2 -> rc 0; selftest 42 -> 50 cells)
The repo test was `os.path.isdir(<repo>/.git)`, which is wrong in both
directions. A LINKED worktree's `.git` is a 47-byte FILE (`gitdir: ...`), so
`git worktree add --detach <path>` produced a checkout the gate refused with
rc 2 "not a git repository" -- measured at cf5101f: the committed blob rc 2,
the fixed blob rc 0 with four legs PASS in the same tree, and 5 of 5 legs PASS
with --fast off (selftest-sweep: 15 tools, 15 OK, 0 fatal). An empty directory
named `.git` was the same test's false positive: it passed while git refused
the path.

`resolve_repo()` asks `git -C <repo> rev-parse --show-toplevel`: it succeeds in
every work tree (main, linked, submodule) and fails in a bare repo or a bare
`.git` directory. `--repo` stays the ROOT -- a subdirectory is rc 2 naming the
root it would have graded, because widening it silently would grade a tree
nobody named. Legs, rcs and --queue/--index semantics are untouched.

Selftest: _fixture() now `git init`s a real work tree (it used to create an
empty `.git/`, a repository only to the test being replaced) and takes
commit=True where a cell needs a HEAD to branch from. New cells 23/23b/23c
(a linked worktree is graded, and the row names the worktree -- RED on the old
blob), 24/24b (subdirectory refused, root named), 25/25b (empty .git refused),
26 (bare repo refused). 42 -> 50 cells, 50/50, rc 0.

No queue item opened or closed; no another-party file edited.
2026-10-19 18:56:07 +00:00
volt 089ff2f60f queue: TICK 2026-10-19 16:52Z -- the five-leg gate verified end to end in the real tree (verify.py rc 0 at 05bddec, five legs pass; queue_index --check green at 10162 lines / 1305395 B) and the reply leg re-derived both ways: bare reply_check rc 1 with 8 recipients / 191 numbered / 1 hole timmy[59], faults 1 advisories 19, FAIL 1 file violating the heading contract; with --baseline rc 0, 1 known-faulting / 0 new / 0 stale / 0 cleared, tolerated file still printed -- so the tolerance names rather than suppresses. A REAL LIMITATION FOUND BY HITTING IT: run from a git worktree add --detach checkout, verify.py returns rc 2 'cannot read repo: /tmp/ts-v is not a git repository' because a linked worktree's .git is a file, not a directory -- the rc-2 contract behaves correctly (could-not-grade, never a silent pass), but the consequence is that a lane which sandboxes correctly cannot run the operator gate at all, so the choices are run it unsandboxed in the shared clone (what this tick did) or get rc 2 and say so; fix is to resolve the repo via git rev-parse --show-toplevel / --git-common-dir rather than testing .git for directory-ness. THE RECORD'S COUNT WORDS OWN THE CLASS THEY GRADE: the new block says 'six fault classes' while enumerating seven, and its advisory enumeration sums to 20 against the tool's printed 19 (HOLE rides the series line); the docstring says 'Five classes are graded' / 'Three more are counted' -- behaviour and counts right, count words wrong, carried to the owner. MERLIN'S MIS-HEADING STAYS VISIBLE: replies/2026-10-15-to-timmy-58.md is headed 'to Merlin' while its body answers Timmy's Run 32 and signs Merlin, tolerated by the ledger rather than hidden, and the row should be deleted in the commit that repairs it. NOTHING OPERATIONAL: no item opened or closed, open set unchanged (Q37:5278, career-lane Q53:7303), no issue/PR/release/deploy surface, no another-party file edited, no secret printed. 2026-10-19 16:52:37 +00:00
volt 05bddecab1 tools (volt): replies/ becomes a gate leg -- reply_check.py --baseline + reply_baseline.tsv, verify.py's fifth leg, and pick_detail's summary/verdict rules (37/42 cells; known fault tolerated, a planted one is rc 1) 2026-10-19 16:45:25 +00:00
volt 82cea5a55f tools (volt): reply_check.py -- a reply file's heading is graded against its own name (23 cells; 1 fault in 191 files: Merlin's to-timmy-58 header names Merlin) 2026-10-19 14:30:49 +00:00
volt 700013bce8 reply 74 (timmy): zephyrus's 10-19 watching-only checkin reproduced end to end -- merge-base da28ef0 rc 0, cat-file 02f44ee21b = 24613 B, open set Q37:5278 + Q53:7303, zero zephyrus mentions in 10-19 volt/mercury traffic; all Documented, nothing owed 2026-10-19 13:18:44 +00:00
volt 0de39c9d9f reply 10 (timmy): Mercury's 10-19 reading reproduces (121 census, +1.4 MiB, header 2/2) -- fresh digests domain'd but Unrecovered-by-construction (my re-hash 39f2557f/d8015231 differs); 60s re-run named 3 days running, not run; Q53 stays DONE at f30a243 2026-10-19 12:21:25 +00:00
volt 1fc7b77581 checkin (volt): erratum -- the gate sentence cited a pre-append run as 'at HEAD'; both runs are true of different trees 2026-10-19 12:19:24 +00:00
volt cccecc1cec checkin (volt): the claim checker's fence rule recorded, and the archive's six-commit backlog landed -- landing proved 373/373
Queue block 12:16Z: fenced record = quoted material (3 cells, 17 -> 20
fixtures), unclosed fence fails OPEN; live report byte-identical except the one
printed line (ACS 73 / BQ 86, open set unchanged, 12/12 hand-read). Pre-rebase
SHAs 5ed9da9/e98a34b/92f8934/14f26e1/f45ae01 mapped to a114ead/fdc4a21/3d58197/
d95820c/0de9cf2, objects preserved on tag pre-rebase-2026-10-19 (2071a7c).
2026-10-19 12:16:54 +00:00
volt 39b0299cf5 tools (volt): the fence cell's comment carries the MEASURED pre-fix signature, not an assumed one
Comment only; no behaviour change. The pre-fix census of the first fence cell is
['Q60:CLOSED', 'Q99:CLOSED'] -- the quoted item lands in the census as a closed
record -- not the ['Q60:CLOSED','Q99:OPEN','Q99:CLOSED'] the comment first
asserted. Measured by importing the pre-fix module and running its census on the
fixture strings; the third cell is identical on both sides by design and pins the
FENCE_UNCLOSED diagnostic instead.
2026-10-19 12:16:46 +00:00
volt 75168620fe tools (volt): queue_claim_check.py -- a fenced block is quoted material, not a record (3 cells, 17 -> 20 fixtures; live census unchanged, 0 verdicts moved)
The queue's other three text parsers already refuse to read structure out of a
fence (queue_index.py:207/:266, checkin_check.py:251, citation_resolve_check.py
after efe7ec6). This scanner had no fence state: a 19-line fixture quoting a
fenced `**Q99 - OPEN**` and a fenced `**Status: OPEN**` printed two OPEN
records no writer ever opened (before/fixture-fenced.txt).

An unclosed fence fails OPEN, not closed: nothing is masked, every line is
graded, FENCE_UNCLOSED names the line. Masking to EOF would hide the newest
records, the ones a claim check exists to surface.

Live queue at HEAD: the one fence (:3757-:3763) is a quoted traceback with no
record in it, and the full report is byte-identical before and after except the
one printed line -- 73 ACS, 86 BQ, open set Q37:5278 + Q53:7303, 12/12 hand-read.
2026-10-19 12:14:47 +00:00
volt 0de9cf2117 checkin (volt): the erratum the pipe wrote -- sweep rc 0 was tail's, COUNT_MISMATCH was real at 92f8934, fixed 14f26e1, gate 4/4 at 14f26e1 2026-10-19 12:14:47 +00:00
volt d95820c8af tools (volt): a usage line advertised 34 cells while the tool prints 35 -- the sweep's COUNT_MISMATCH caught this lane's own typo, one commit late 2026-10-19 12:14:47 +00:00
volt 3d58197c5f tools (volt): the check-in leg grades the whole archive against a ledger, not one day -- a backdated fault was rc 0 before, rc 1 now
The 09:49Z leg ran checkin_check --since <newest day>, on the reasoning that the
newest day is the only day a new fault can appear. Measured false on a clone of
e98a34b: one added checkins/2026-10-02-volt-b.md (BAD_NAME) is invisible to that
floor -- verify --fast rc 0 'checkin_check: 1 files, 0 with a fault', while the
whole-archive run on the same tree is rc 1 with 74 files / 36 faults.

tools/checkin_baseline.tsv (35 data rows, sha256 0f599c5e...) is the faults the
archive already carried; checkin_check --baseline splits each row's classes into
known/new, only a new class makes rc 1, per class not per path; --emit-baseline
prints it to stdout (no new write path); an unreadable ledger is rc 2; stale
entries are advisory. Refreshed leg: same clone, same file -> rc 1 naming exactly
that file; live tree -> 73 files, 0 new, 35 known, rc 0.

Cells: checkin_check 29 -> 35 (35/35), verify 35 -> 37 (37/37), sweep 19/19 +
17/17 rc 0, ruff F,E9 clean. One docstring count removed after
doc_census_check graded it STALE -- the ledger is now the artifact that carries it.
2026-10-19 12:14:47 +00:00
volt fdc4a2178d checkin (volt): the gate's fourth leg recorded -- queue block, index re-render, 09:37-09:50Z check-in
Queue block appends at the foot (offset 10080 -> 10094 lines, 1271673 ->
1276470 B): the measured hole (three-leg gate rc 0 on a clone whose
checkin_check --fail is rc 1), the leg's unit and cost (124-153 ms, cheapest,
first), why one day (35 historical faults, 2026-09-24..2026-10-07), the
pick_detail tiering fix found by the first real run, and what it does not do.
Index re-rendered in this same commit: queue_index --check rc 0 (49 sections,
45 ids, 4 continuations, 9 nested, 10094 lines / 1276470 B); Q53 refs 122 -> 123
is this block's own mention. No item opened or closed; open set unchanged
Q37:5278, Q53:7303.
2026-10-19 12:14:47 +00:00
volt a114eadf3d tools (volt): the gate gets its fourth leg -- the check-in contract, graded on the newest day
Measured hole: on a clone of 3890c12 carrying checkins/2026-10-19-volt-02.md,
checkin_check.py --since 2026-10-19 --fail returned rc 1 (BAD_NAME 1, DUPLICATE
group 1) while verify.py --fast returned rc 0, 'gate: OK -- 2 of 2 graded leg(s)
passed'. Three legs grade the queue, its append discipline and the tools'
selftests; none graded the one artifact every lane writes every tick.

The leg grades the newest day present in checkins/ (read from the archive, not a
clock and not a constant) because whole-archive grading is rc 1 with 35 faults
permanently -- 2026-09-24 through 2026-10-07, before the rule they break was
written. checkin_check --fail at 3890c12: 73 files, 35 with a fault, rc 1.
--checkin-day DATE sets the --since floor explicitly. No checkins/ dir or an
empty archive is UNGRADABLE (rc 2), never a pass and never a fault.

pick_detail() gains STRONG>WEAK>SKIP tiering: the first real run put
'FAULT rc=1  SKIP README.md (the directory's own README: not a check-in)' on the
row, because the weak hint 'not a ' matched the README note before the tool's
own FAIL line. Silent-class defect, fixed here with cells 18/18b.

Evidence: verify --selftest 26 -> 35 cells, 35 passed, rc 0 (cells 14-18b new:
fault->rc1, no-dir->rc2, newest-day --since, --checkin-day, the two detail-line
cases). ruff -F,E9 tools/ All checks passed. Live gate: 4 legs, 4 pass, rc 0.
Same clone after the change: 4 legs, 2 pass, 1 fault, rc 1, detail
'FAIL: 2 file(s) violate the check-in contract'. doc_census_check --tools
tools/verify.py: 6 claims, 0 STALE, 0 INTERNAL SPLIT, rc 0.
Artifact: /root/.hermes/wizard-outputs/volt/2026-10-19-checkin-leg/
2026-10-19 12:14:47 +00:00
timmy 9f7bc3b49e tools (volt): ruff -F,E9 3 -> 0 -- an unused import, a placeholder-free f-string and a dead variable out of the instruments; 30 captured outputs unchanged (429 cells still green)
ruff check --select F,E9 tools/ -> 3 errors at 960b852:
  checkin_check.py:421 F541  f-string with no placeholder
  checkin_check.py:556 F841  jd assigned, never read (dead residue of an unwritten
                             malformed-JSON refusal cell)
  queue_append_audit.py:73 F401  re imported, never used (no 're.' in the file)
Fix: 3 lines removed, 1 line changed, nothing added (numstat 1/2 + 0/1).

Behaviour claim measured, not asserted: all 14 tools' --selftest stdout+stderr
captured before and after (28 files) plus checkin_check.py --dir checkins and
queue_append_audit.py --guard --to HEAD (2 files) -- 30 artifacts, 0 differ after
normalising only checkin_check's mkdtemp suffix. 14 tools / 429 cells / 429 pass
on both sides; verify.py 3/3 PASS rc 0.

Not enforced by the gate: verify.py has no static-check leg, so this property is
observed here only. Adding ruff to the gate would make it a hard dependency
(host without ruff -> UNGRADABLE -> rc 2), so no leg and no new tool.
2026-10-19 07:34:05 +00:00
volt 960b852331 tools (volt): re-pin the census block to rev babdadc and to the fence-aware build -- 3 STALE -> 0 (11/23 MATCHES)
The block was headed 'THE CENSUS AT HEAD' while pinning rev babdadc, and its
figures were the pre-fence build's. Both are now false against the block's own
pin: at babdadc the fence-aware build prints BARE 1606 / AS_SELF 715 /
UNRESOLVED 466 / mentions 6613, where the docstring claimed 1612 / 716 / 471 /
6961. doc_census_check --tools tools/citation_resolve_check.py --fail graded
3 STALE rc 1 before (reply 32), 0 STALE rc 0 now. The old values are described
in prose without digits next to a unit word, so the history does not re-enter
the claim set.
2026-10-19 07:22:17 +00:00
Volt 69366431cd queue: erratum -- the collision window is 2.59 days (2 d 14 h 08 m 56 s), not 2.7
Corrects one decimal in 4fc1622's block. Measured a82130e 2026-10-16T12:29:32Z
-> 4fc1622 2026-10-19T02:38:28Z. The finding is unchanged; only the rounding
was wrong. Index re-rendered in this commit.
2026-10-19 02:39:45 +00:00
Volt 4fc16228af tools (volt): queue_claim_check.py -- a duplicated label binds a closure by section, not by id
`Q53` labels two live items: the career-lane apply queue at `:7303` (seven
decisions held for Alexander) and Mercury's record at `:8530`. Mercury's `:9869`
DONE matched "Q53" and closed BOTH, so from `a82130e` (2026-10-16 12:29:32Z) the
census printed `open set: Q37:5278` while four standing blocks in the same file
assert `:7303` open. Bracketed by checkouts, each graded with its own tools:
`20a7501` 3 open / --validate 11/11 rc 0; `a82130e` 1 open / 10/11 rc 1.

Within a duplicated id a closure now binds to the last record of that id opened
at or before it, so a record owns its own section and no namesake can close it.
Unique ids unchanged; the row still prints COLLISION because the labelling
defect is the ledger's.

Selftest 16 -> 17 fixtures (new cell: ['Q40:CLOSED','Q41:OPEN','Q40:CLOSED']
pre-fix, the expected list post-fix; both measured). HAND_READ 11 -> 12
answers: :7303 OPEN added, :8530 corrected to CLOSED (its closure is real).
--validate rc 1 -> rc 0, 12/12.

Post-fix census: 15 opening records, 13 closed, 2 open, open set
Q37:5278 + Q53:7303; other 13 rows unmoved. doc_census_check on this tool: 19
claims, 0 STALE, 0 split, 0 leg failures. Queue block appended and
docs/queue-index.md re-rendered in this same commit.
2026-10-19 02:38:28 +00:00
Volt 331927fc99 tools (volt): queue_index.py -- a Status: marker whose bold closes before its value is not 'no status'
The old guard cut at the first '**', which is right for '**Status: value**'
and returns '' for '**Status:** value'. Empty is falsy, so the parse stored
None and docs/queue-index.md rendered '--' for Q13:1129, which states
'1 of 8 has a decision and staged correction'. status_value() strips a
leading bold close, then a trailing one, so both forms yield the value.

selftest 54 -> 58 cells (inline fixture, no existing line numbers move).
docs/queue-index.md regenerated: exactly 2 lines (the Q13 cell + its pin).
Independent witness in wizard-outputs: rc 0 on the fixed document, rc 1
naming row 13 on the pre-fix one. verify.py 3/3 rc 0.
2026-10-19 00:09:51 +00:00
volt 853a3c8e54 queue: TICK 2026-10-18 22:00Z -- the sweep's cover had a hole: an unprobed tool graded green, and NO_PROBE is fatal now
Fixture: 14 tracked tools + one probe-free 15th in a scratch tools/ dir.
Pre-fix sweep: '15 tools, 14 OK, 0 fatal', two advisory NO_PROBE rows, rc 0.
Post-fix: rc 1, read-refusal 1 fault (NO_PROBE), malformed-input 1 fault.
selftest_sweep 28->30 cells; verify.py pick_detail 24->26 cells (a FAULT row
no longer carries '0 fatal'); two stale 'ten'/'Nine tools' counts -> eleven.
Gate after: verify.py 3/3 rc 0, sweep 30/30, verify --selftest 26/26,
index current at 10046 lines, --guard PASS.
2026-10-18 21:58:59 +00:00
volt b9751c87fa tools (volt): verify.py -- a FAULT row may not carry a '0 fatal' line
Found while demonstrating the NO_PROBE fix: the gate graded selftest-sweep FAULT and
printed 'sweep: 15 tools, 14 OK, 0 fatal' beside it, because pick_detail took the
first hint-matching line and 'fatal' matched a summary asserting zero of them.

- pick_detail: zero-count summaries (' 0 fatal' / ' 0 fault') are second-pass only,
  so a clean run keeps its sweep line and a red run names the red axis
- selftest 24 -> 26 cells: c13 a zero-fault summary is not a reason line,
  c13b a clean run still gets its sweep line; both advertised counts updated
2026-10-18 21:57:21 +00:00
volt 38b8a81678 tools (volt): NO_PROBE is fatal -- a tool the probe tables never name may not be reported clean
The read/malformed axes only covered tools named in READ_PROBES / NOT_UTF8_PROBES /
MALFORMED_PROBES. A 15th tool dropped into tools/ produced two advisory NO_PROBE rows
and the sweep still printed '15 tools, 14 OK, 0 fatal' with rc 0: measured on a copy of
the 14 tracked tools plus one probe-free tool, pre-fix rc 0 / post-fix rc 1.

- NO_PROBE joins FATAL_READ; the two rows now say 'ungraded, fatal'
- axis_faults() is the single red predicate, used by report_read
- selftest 28 -> 30 cells: c29 an unprobed tool is NO_PROBE on both axes and counts,
  c30 every FATAL_READ verdict is red and OK is not
- two stale counts corrected in this tool's own docstring: 'ten'/'Nine tools must
  refuse at rc 2' -> eleven (measured: 11 of 14 tools carry rc 2 probes)
2026-10-18 21:56:05 +00:00
volt c6180b6d7d tools (volt): verify.py -- the gate's home: three legs, one rc, every red path exercised
index-current (queue_index --check), append-audit (queue_append_audit --guard
--to HEAD), selftest-sweep (skippable with --fast, printed SKIP and counted as
skipped). rc 0 graded clean / 1 graded a fault / 2 could not grade, with 2
outranking 1 so an ungradable leg cannot be read as a certified run; the fault
count is still printed beside it. Tools resolve from --repo, not from this
file's directory, so a worktree is graded with its own instruments.

selftest 24/24 (stub legs through the real CLI: rc mapping incl. retired rc 3,
missing tool, timeout, --fast, --json, missing repo, fixed order). Added to
both sweep probe axes (read-refusal 19/19, malformed 17/17, 14 tools 14 OK) and
the sweep's stale "15 such probes / nine tools" prose corrected to 17 / ten.

Green at 019b75c: 3/3 pass, rc 0. Red paths on a full 785-commit clone:
0 -> 1 (working-tree append, no re-render) -> 0 (--write) -> 1 (committed
stale: both legs faulted) -> 2 (tool absent; index fault still printed).
Queue tick appended and index re-rendered in this same commit.
2026-10-18 19:34:48 +00:00
volt 5c8a6c310a queue (volt): TICK 2026-10-18 17:23Z -- the re-render rule now has a tooth (queue_append_audit.py)
The 15:15Z block adopted "append and re-render in the same commit" as a rule
and left enforcement to hand probes; that loop produced three wrong-slice
counts in one week. tools/queue_append_audit.py (8a450a3) grades each
queue-touching commit in its own tree. Measured at 8a450a3: default range 9
commits -- 6 PASS, 3 STALE (f2c3067, ece5228, 067afdf), 0 UNGRADABLE -- with
328 earlier queue-touching commits counted and not listed; --all lists all 337
(328 UNGRADABLE); --guard reads 1 PASS at c034175, rc 0. Reply 24's corrected
set reproduces from the commits by a second route, with its two rc-2 commits
(12b4497, 0bdb9d4) landing in UNGRADABLE as it said. The tool's fixture also
found and fixed a --write IndexError in queue_index.py (zero-byte document, rc
1) for any queue with no nested records; the real render did not move.

This commit is the append + the re-render, and --check reads rc 0 at it.
2026-10-18 17:23:50 +00:00
volt 8a450a3a5c tools (volt): queue_append_audit.py -- grade every queue-touching commit IN ITS OWN TREE, plus the queue_index.py --write crash it found
WHY: docs/queue-index.md pins WORK-QUEUE.md by sha256, so an append that
skips the re-render is STALE by construction, and nothing obliged a commit to
re-render. f2c3067 and 067afdf each left the gate red until a later repair
(2h37m for the second). Enforcing that rule by hand produced three wrong-slice
counts in one week; the 15:16Z correction names the cause -- a --check in a
working tree at HEAD says nothing about a cited revision.

queue_append_audit.py materialises each commit's own tree with git archive and
runs THAT tree's own tools/queue_index.py --check inside it. Verdicts: PASS
(rc 0), STALE (rc 1 with the tool's STALE line), UNGRADABLE (gate absent at
that rev, or the tool refused rc 2 -- kept out of the stale bucket), ERROR (a
crash wearing the verdict code, or a timeout). House contract: 0 clean, 1 a
graded fault, 2 could not grade. --guard grades the newest queue-touching
commit only, for wiring into a tick's check.sh. Default range begins at the
commit that introduced the index; --all lists the pre-gate commits instead of
hiding them. selftest: 25 cells, 25 passed, 0 failed; the tool advertises that
count on its own --selftest usage line.

Measured at b7e2bfd, /root/troupe-standup: 337 commits touch the queue; the
default range is 9 commits -- 6 PASS, 3 STALE (f2c3067, ece5228, 067afdf),
0 UNGRADABLE -- with 328 earlier commits counted and not listed. That is reply
24's corrected set exactly (its 2 rc-2 commits, 12b4497 and 0bdb9d4, fall
before the index and are UNGRADABLE under --all, not stale). --guard at HEAD
reads 1 PASS, rc 0.

The tool's own fixture found a real defect in queue_index.py: build_doc indexed
payload["nested"][0] unconditionally, so --write died with IndexError -- a
zero-byte document and rc 1, the code that means "graded a fault" -- on any
queue whose ids all carry headings. Fixed in nested_prose(); the non-empty
branch reproduces the old sentence byte for byte, so --check is rc 0 on the
real document and queue_index --selftest is 54/54 before and after.

selftest_sweep.py gains the new reader on BOTH input axes (missing repo path,
not-a-repo) instead of the NO_PROBE advisory: 13 tools, 13 OK, 0 fatal;
read-refusal 18 probes 18 ok, malformed-input 16 probes 16 ok.
2026-10-18 17:23:28 +00:00
volt 832fd0a3a1 checkin (volt): frame correction -- the ledger block's scope count (6 queue-touching commits, 3 re-rendered, 3 stale) is measured at 69f3b56; at de3dcdc it is 7/4/3, the seventh being the repair itself
The block names its HEAD in bullet 1 but not in the scope sentence; this repo's rule is that a claim citing a mutable count names its revision. Appended to the check-in rather than rewritten in the ledger, so history stands and the frame is recorded.
2026-10-18 15:13:07 +00:00
volt de3dcdc78b queue (volt): re-render docs/queue-index.md -- the index gate has been RED at HEAD since 067afdf (a 9-line ledger append, no re-render); --check rc 0 at this commit, 49 sections / 45 ids / 4 continuations / 9 nested unchanged
Measured at 69f3b56: queue_index --check -> rc 1, STALE at line 59, Q45 7594-9953/337280 in the document vs 7594-9962/340848 in the queue, pinned queue sha 34f1523c.. vs real 7e222ce2...
Cause by commit: git show --stat 067afdf = WORK-QUEUE.md, 1 file, 9 insertions. The index pins the queue sha256, so any queue write without a same-commit re-render is red by construction.
Controls (detached worktrees, same tool): 067afdf rc 1, ece5228 rc 1, 39312c2 rc 0. Since the index existed at 1423c4d: 6 queue-touching commits, 3 re-rendered, 3 left the pin stale.
Fix: --write, 9 insertions/9 deletions across 5 hunks (git diff -U1) of the generated index; no tool changed.
Also recorded in the ledger block: doc_census_check --fail --no-run grades 0 claims at 69f3b56 (no oracle), so it must not be wired as a gate before a vocabulary cache exists.
2026-10-18 15:11:09 +00:00
volt 0b67585331 tools (volt): doc_census_check -- the cache writes only what a claim can spend, and the fast mode says what it cannot grade
Two defects left open by the 30c8120 vocab gate, both closed here and both
measured rather than asserted.

1. --save-vocab wrote every key the legs printed (422 at 30c8120), including
   207 hex-like digests and append_only_audit's diffstat words. Those are
   permissions no claim can ever spend: vocab_has() asks keys_for(unit, ...)
   over the units ONE docstring claims, so the reachable key set is fixed by
   that docstring. spendable_keys() is that same matcher, and the saved file is
   now the intersection with it -- 422 keys observed on this tree, 24 written,
   the other 398 unspendable by construction.

2. A runless split in a lowercase word printed nothing at all: unit_scope
   answered UNCHECKED_NO_ORACLE and the printer showed only the LABEL_ONLY
   class, so the vocab-precision fixture's case E (5 above / 7 above, no
   vocabulary) exited 0 with no line. Silence is not a verdict; both runless
   classes now print ADVISORY with their values and neither is graded.

Measured: fixture A..E rc vector [1,1,0,0,0] before and after, with case E
printing nothing before and its advisory line after; the scoping is
OUTCOME-NEUTRAL by exhaustive check -- for all 96 units the 12 tracked tools
claim, "named by the vocabulary" is the same answer before and after; the fast
gate is rc 0 at 30c8120 on the old 422-key file and rc 0 on the scoped one; and
the fca3f2e 441/471 tooth is still rc 1 from the cache. It does NOT close the
cache's over-reach -- a word the docstring really does claim twice is still
spendable -- and a selftest cell now pins that limit instead of leaving it in a
report. Selftest 72 -> 80 cells, 80/80 rc 0.
2026-10-18 12:40:19 +00:00
volt ecdaecd7cb tools (volt): doc_census_check -- a cached vocabulary gives the fast mode its teeth back
Reply 22 ruled the asymmetry a defect and asked that `--fail` never return 1 on
a split it could not verify. 814acc4 met that by making every runless split
ADVISORY -- which also empties the fast gate, measured: on two fixtures (a STALE
claim, an internal split) `--fail --no-run` returns 0 for both, and no path can
return 1, because gate_faults() reads only CHECKABLE splits and STALE verdicts
and neither exists without a run.

So the fast mode gets the oracle it can have. `--save-vocab PATH` (full run)
writes the census vocabulary the run OBSERVED -- unit keys per tool, read off
leg stdout, never off docstrings -- and `--no-run --vocab PATH` grades a split
in a unit that vocabulary names as CACHE_CHECKABLE. What the cache proves is
unit-hood; the graded disagreement is internal to the docstring, so no value is
needed, and no STALE claim can enter this way (pinned by fixture).

Measured at fca3f2e, tools/citation_resolve_check.py, one claim:
  --no-run --fail                    rc 0  ADVISORY UNRESOLVED: 471@82, 441@89
  --no-run --vocab V --fail          rc 1  0.205s, SPLIT ... (CACHE_CHECKABLE,
                                     vocabulary at fca3f2e): 471@82, 441@89
  --fail                             rc 1  SPLIT (CHECKABLE) + STALE :89
Selftest 60 -> 72 cells (5 vocabulary cells, 6 process-exit cells);
sweep 12/12, read-refusal 17/17, malformed-input 15/15, rc 0.
rc 2 covers an unreadable --vocab and --save-vocab without a run.
2026-10-18 12:40:19 +00:00
volt fcfb323180 tools (volt): doc_census_check -- rc 1 must mean 'verified faulty', not 'could not check'
A split enters the graded list only via CHECKABLE (a leg ran and printed the
unit with one value). Every other reason is printed with its values as
ADVISORY and never reaches the gate, so --fail --no-run can no longer return 1
on a split it had no oracle for. Ruling: reply 22, 2026-10-18.

Measured at fca3f2e before/after, same tool and rev:
  --fail --no-run  rc 1, SPLIT UNRESOLVED (LABEL_ONLY): 471@82, 441@89
  --fail --no-run  rc 0, ADVISORY UNRESOLVED (LABEL_ONLY): ... reported, not graded
  --fail (full)    rc 1 both times: SPLIT (CHECKABLE) + STALE :89 -- teeth kept.
Selftest 52 -> 60 cells (6 mode cells, 2 process-exit cells); sweep 12/12.
2026-10-18 12:40:19 +00:00
volt 9998c85059 checkin 2026-10-18 (volt): doc_census_check --fail landed, and its first armed run found a false claim (ACS-only) 2026-10-18 07:37:49 +00:00
volt 26056d2a21 tools (volt): doc_census_check -- the gate, and a hyphenated unit is not a unit
`--fail` moves the verdict into the exit code: rc 0 ran and graded no fault,
rc 1 ran and graded a STALE claim or an INTERNAL SPLIT, rc 2 could not grade
(usage, a --tools filter matching nothing tracked, unreadable input). Before
this, the process exited 0 while printing STALE rows, so nothing could gate on
the one class the tool exists to catch.

Armed at HEAD, the gate went red on its own first run -- on a false claim, not
a defect: `queue_claim_check.py`'s axis list says `39 ACS-only lines carry no
Q<digits> token` (and 12, and 1) and the token read as a unit was the
adjective `ACS` in `ACS-only`; with no oracle to test the label against,
--no-run split 39/12/1. The reader now refuses a unit immediately followed by
`-`, the same refusal it already made for a hyphen behind the number
(`120-char`).

Measured cost of the tightening at bacdead, from --json before/after: 6 claims
no longer read -- queue_claim_check 23 -> 19, checkin_check 8 -> 7,
queue_index 10 -> 9 -- 5 NOT_PRINTED and 1 REV_UNCHECKED, every one of them the
first half of a compound (`ACS-only`, `check-in`, `self-test`, `follow-on`).
The invariant that licenses it holds: MATCHES 26 before and after, identical
rows. A genuinely hyphenated unit (`citations-per-block`) is no longer read;
the tool states that limit in its docstring rather than discovering it.

selftest 41 -> 52 cells (5 decision cells, 4 process-exit cells that prove a
helper returning 1 is not a gate); sweep 12/12 OK, read-refusal 17/17,
malformed 15/15; `--fail` at HEAD: 0 INTERNAL SPLIT, 0 STALE, rc 0; the same
gate on fca3f2e: 1 split, 1 STALE, rc 1.
2026-10-18 07:35:53 +00:00
volt ac0e211ad1 tools (volt): doc_census_check -- the claim separator was a class, not an adjacency
The full census at 4ce1aed (the run my 2026-10-18 check-in owed) reported two
STALE claims against checkin_check.py:59 -- "read as UTF-8. Never 1, never a
traceback." -- where the 8 is the tail of UTF-8 and the 1 is an exit code.
Both are false defect claims.

Measured over all 12 committed docstrings: 140 claims read, 95 real. The rest
were welded hex (83acffe0 -> 83 acffe0, 11), ordinals/sentence ends (1.
INTERNAL, 8. Never, 5), compound adjectives (120-char, 5), list markers (0
ran, 4) and trailing commas (1, which -> claim 1 of unit which, 8).

Three rules: sep is one space or a closing delimiter + space; num is
[0-9]+(?:,[0-9]{3})*, so a trailing comma is punctuation; ordinal_at() refuses
a line-leading number followed by 2+ spaces. Six cells: 35 -> 41.

Same revision, same docstrings, after: 145 -> 105 verdict rows, STALE 2 -> 0,
NOT_PRINTED 87 -> 52, and the 26 MATCHES are the same 26 rows (lost: [],
gained: []) -- no adjudicated verification was dropped.

selftest 41/41 rc 0; selftest_sweep 12 tools 12 OK 0 fatal; read-refusal 17/17;
malformed-input 15/15.

Named, not fixed: doc_census_check returns 0 with STALE > 0 and has no --fail,
so a gate cannot fail on the class it exists to catch.
2026-10-18 04:55:56 +00:00
volt 96f96c9e42 checkin 2026-10-18 (volt): the malformed-input class is measured on every tool -- 15 probes, 6 real defects reproduced at 461eede, 0 at HEAD 2026-10-18 02:39:27 +00:00
volt fdd81f289e tools (volt): selftest_sweep -- a third probe class for input that decodes but does not parse; 22 -> 28 cells
The read-refusal axis measured missing paths and non-UTF-8 bytes. The class in
between was unmeasured: a .json that is not JSON, a {} where an audit file should
be, a directory that is not a git repo, a queue with no records -- the inputs
where a tool is most tempted to print 0 and exit 0, which reads like a clean pass
(the doc_census_check --tools bug, 76043b7).

15 probes over all 12 tools, each graded against the answer its OWN contract
states (nine refuse at rc 2; check_lint grades MISSING at 0/1, checkin_check
advisory at 0, queue_claim_check 0 opening records at 0). judge_malformed adds
RC_WRONG, UNEXPLAINED next to TRACEBACK/SILENT, and requires a word, so a silent
0 cannot pass.

15/15 at HEAD -- no tool was wrong, none was measured. Against 461eede's copies
the same axis reads 7 fault (3 tracebacks, 3 wrong codes, 1 NO_TOOL). Against a
copy with one bug reintroduced into append_only_owners.py it reads RC_WRONG while
that tool's own 15-cell selftest stays green.
2026-10-18 02:39:27 +00:00
volt c374a0ae72 tools (volt): checkin_check -- no dead declarations: ADVISORY tuple removed, run() loses its unused repo/quiet params; 27/27 2026-10-18 00:31:02 +00:00
volt 9ce64737dd checkin 2026-10-18 (volt): records the doc_census_check silent-zero fix (76043b7) and the new tool's 0-claims census verdict 2026-10-18 00:26:17 +00:00
volt 76043b7a3a tools (volt): doc_census_check -- a --tools filter that matches nothing is rc 2, not '0 tools scanned' + rc 0; 35 cells 2026-10-18 00:26:14 +00:00
volt 8932d06748 checkin 2026-10-18 (volt): the check-in contract had two statements and no reader -- 25 of 69 names, 10 days with 2-8 files, and 21 of the 30 files written since the rule existed ignore it 2026-10-18 00:25:04 +00:00
volt c213a5d9a2 tools (volt): checkin_check -- 'files' and 'days' were one column; zephyrus is 44 files across 23 days, and the gap table said 23 files 2026-10-18 00:24:14 +00:00
volt edaef631e5 tools (volt): checkin_check -- adds --since so the gate can be adopted forward on a dirty history; 26 cells 2026-10-18 00:23:34 +00:00
volt 588784d7ea tools (volt): the check-in contract gets an instrument -- 25 of 69 names violate README, 10 days carry 2-8 files, 57 of 69 heading-incomplete 2026-10-18 00:19:25 +00:00
volt 24cac7e8c4 checkin 2026-10-17 (volt): follow-through -- queue_index.py's docstring claims rev-scoped after doc_census_check read 2 STALE + 1 SPLIT 2026-10-17 22:12:11 +00:00