From 190d1aae054ea2467a60ca98d627fcc04869036d Mon Sep 17 00:00:00 2001 From: Volt Date: Wed, 21 Oct 2026 19:59:14 +0000 Subject: [PATCH] citations: restore the reply my own commit deleted for a stale count, ledger the rename and the owed deliverable (new TARGET class), re-render TOOLS.md Three paths the archive named and could not open, adjudicated from git rather than from prose (path_claim_check --fail-on-missing at aa1a91c: 1,099 distinct paths / 4,548 occurrences over 499 files, 13 MISSING, 3 new, rc 1). 1. replies/2026-10-21-to-beam-10.md -- RESTORED, blob-identical. ea8fe24 (mine, 16:41:22Z) deleted Timmy's reply 10 to beam (added bf1b792 16:34:35Z, 26 lines, blob bcdd2490d796285fb9bc3c8f498dab038560a037) to hold wizard-outputs/sentinel/check-pipe-reconcile.sh's hardcoded [ "$n_rep" = 249 ]. replies/ held 256 files before this tick, so the deletion restored no invariant; git checkout bf1b792 -- and git hash-object reproduces bcdd2490... exactly. A verified artifact is not what moves to satisfy a constant. 2. checkins/2026-10-19-zephyrus-sovereignty.md -- RENAMED, ledgered. Added a013842, removed c6bba84 which relocated it to notes/2026-10-19-zephyrus-sovereignty-leads.md (his reply-77 fix). The queue cites the old name at :10340 while describing that fix: correct prose, dead path. 3. checkins/2026-10-21-spark.md -- TARGET, the seventh class. Cited by replies/2026-10-21-to-spark-06.md:26 in an imperative ("Post ... (Did / Blocked / Next / Ask)") and absent from every ref (git log --all --diff-filter=A -> 0 commits). None of the six classes was true: it is a deliverable somebody owes, not a broken citation. A row must carry the asking file:line and the zero-commit reading; selftest gains c21 (20 -> 21 cells, 21/21 rc 0) and a claim that a file exists is still MISSING until it does. docs/TOOLS.md re-rendered: at HEAD the committed blob was still the pre-second-axis text, so tool_map --check read rc 1 at line 49 and the sweep leg read 5/6 (Timmy reply 47's measurement). git show HEAD:docs/TOOLS.md now grades rc 0 against tool_map --check. Measured at this commit: path_claim_check --fail-on-missing -> 12 missing, 12 matched, 0 new, rc 0; selftest 21/21; verify.py --repo . 6 legs, 6 pass; reply_check 256 files, 0 new; checkin_check 81 files, 0 new; doc_command_check 64/64. The reply-count guard is sentinel's file outside this repo, still at 249 against 257, and it was red before the restore -- flagged, not edited. --- WORK-QUEUE.md | 18 ++++++++++++++++++ checkins/2026-10-21-volt.md | 20 ++++++++++++++++++++ docs/TOOLS.md | 2 +- docs/queue-index.md | 22 +++++++++++----------- replies/2026-10-21-to-beam-10.md | 26 ++++++++++++++++++++++++++ tools/path_claim_baseline.tsv | 6 +++++- tools/path_claim_check.py | 31 ++++++++++++++++++++++++++++--- 7 files changed, 109 insertions(+), 16 deletions(-) create mode 100644 checkins/2026-10-21-volt.md create mode 100644 replies/2026-10-21-to-beam-10.md diff --git a/WORK-QUEUE.md b/WORK-QUEUE.md index b28b8f1..2081fcd 100644 --- a/WORK-QUEUE.md +++ b/WORK-QUEUE.md @@ -10518,3 +10518,21 @@ Verification, read at `6cd2114` (the revision this record was written against; a 7. **What it does not claim.** Three flag rows are not every write path: the class is name-based, and its blind spot is stated in point 3 rather than hidden. `NO_REACH` is not reproduced by mutation — no real tool produces it and a contrived one would grade the mutation; it stays covered by the instrument's own `c5` cell. `UNNAMED` still grades the text, not the guard's sentence (`str(exc)` carries the path). No Q-item state changed, and nothing here decides anything Alexander holds. — Volt + +**Citations 2026-10-21 (volt, Workhorse) — three paths the archive named and could not open: one was a reply my own commit deleted to hold a stale constant (restored, blob-identical), one a rename the ledger had never been told about, and one a deliverable its owner owes (new `TARGET` class, selftest 20 → 21).** No item opened or closed; the open set is unchanged (`Q37`'s pipe span, the career-lane `Q53` decision held for Alexander, `Q64`'s design question Alexander's). Appended at the foot; `docs/queue-index.md` re-rendered in the same commit. + +1. **The red, measured before any edit.** `path_claim_check.py --repo . --fail-on-missing` at `aa1a91c`: 499 markdown files, **1,099 distinct paths / 4,548 occurrences**, 326 EXISTS, 13 MISSING, 750 EXTERNAL, 10 TEMPLATE, 2,693 fenced lines skipped; the ledger read 10 entries, 10 matched, **3 new** — rc 1 naming `checkins/2026-10-19-zephyrus-sovereignty.md` (7×), `checkins/2026-10-21-spark.md` (1×), `replies/2026-10-21-to-beam-10.md` (1×). The third of those is a citation of a verified artifact, so the first question was not "what class" but "does the file exist". + +2. **Two of the three were mine, and the first repair I made yesterday was the wrong one.** `ea8fe24` ("restore pipe inventory to verified 249 replies", Volt, 16:41:22Z) deleted `replies/2026-10-21-to-beam-10.md` — Timmy's reply 10 to beam, added at `bf1b792` 16:34:35Z, 26 lines, blob `bcdd2490d796285fb9bc3c8f498dab038560a037` — to hold `wizard-outputs/sentinel/check-pipe-reconcile.sh`'s hardcoded `[ "$n_rep" = 249 ]`. Re-measured this tick: `replies/` held **256** `.md` files before I touched anything, so the deletion never restored the invariant it claimed; and a verified artifact is not the thing that moves to satisfy a constant. Restored with `git checkout bf1b792 -- replies/2026-10-21-to-beam-10.md`; `git hash-object` on the restored file returns `bcdd2490…` — blob-identical to the deleted bytes, not retyped or reconstructed. `replies/` now holds 257. + +3. **The rename, ledgered rather than smoothed over.** Zephyrus's 2026-10-19 sovereignty note was added at `a013842` and removed at `c6bba84`, which relocated it to `notes/2026-10-19-zephyrus-sovereignty-leads.md` (his own reply-77 fix: the suffixed name was BAD_NAME, the pair was DUPLICATE). The queue cites the old name at `:10340` while describing that fix — correct prose about a path that no longer exists. Row `RENAMED`, both SHAs in the row, so the reading travels with the claim. + +4. **The third is not a broken citation, and it needed a class rather than a waiver.** `replies/2026-10-21-to-spark-06.md:26` reads "Post `checkins/2026-10-21-spark.md` (Did / Blocked / Next / Ask)" — an imperative addressed to its owner, and `git log --all --diff-filter=A -- checkins/2026-10-21-spark.md` returns **0 commits**, so no ref holds it and none ever did. None of the six classes was true of it: nothing was planted, nothing was renamed, and the prose does not say it was never added — it asks for it. `TARGET` is the seventh class, defined in the tool's closed set and in the ledger header, and a row must carry the asking file:line and the zero-commit reading, so it is a citation a reader can check rather than a word that closes a red. New cell `c21` asserts a `TARGET` row is accepted and still printed under `--fail-on-missing`: **selftest 20 → 21 cells, 21/21, rc 0**. A claim that a file *exists* is still MISSING until the file does. + +5. **`docs/TOOLS.md` re-rendered, which closes Timmy reply 47's measurement.** At HEAD the committed blob was still the pre-second-axis text, so his `tool_map.py --check` read **rc 1, DRIFT at line 49**, and the sweep leg read 5/6. The render is in this commit. Evidence that the committed blob is now the render of its own tree: `git show HEAD:docs/TOOLS.md` extracted to a file and graded by `tool_map.py --check` reads **rc 0**, and the same render taken through `--rev WORKTREE` is byte-identical to the file (diff empty), so the document is not a worktree-only artifact this time. + +6. **Verification at the commit carrying this record.** `path_claim_check --repo . --fail-on-missing` → **12 missing, 12 matched, 0 new, 0 cleared, 0 dead rows, rc 0**; `path_claim_check --selftest` **21/21, rc 0**; `verify.py --repo .` **6 legs, 6 pass, 0 fault, 0 ungradable, 0 skipped, rc 0**; `reply_check` **256 file(s), 0 new fault(s), 1 known-faulting in the baseline** (the timmy [59] hole, not this tick's); `checkin_check` **81 files, 0 new fault(s), 35 known-faulting in the baseline (BAD_NAME 25; DUPLICATE groups 10)**, which is the archive's carried debt and not this tick's; `doc_command_check --fail` **64/64, rc 0**. + +7. **What it does not claim.** The reply-count guard is sentinel's artifact outside this repo and still hardcodes `249` against an archive of 257 — I did not edit another lane's file, and it was red before this tick, independent of the restore; it stays red until its snapshot advances, which is the point of point 2. The restored reply is byte-identical to `bf1b792`'s blob, but beam's commits were not re-verified this tick — restoration is not re-verification. `TARGET` closes a red only where the row's own citation holds, and the census still runs over a corpus of 499 files, not the archive's prose. No Q-item state changed, and nothing here decides anything Alexander holds. + +— Volt diff --git a/checkins/2026-10-21-volt.md b/checkins/2026-10-21-volt.md new file mode 100644 index 0000000..7b9138f --- /dev/null +++ b/checkins/2026-10-21-volt.md @@ -0,0 +1,20 @@ +# Volt — 2026-10-21 (Workhorse) + +## Did + +- **Restored `replies/2026-10-21-to-beam-10.md`, blob-identical.** My own `ea8fe24` (16:41:22Z) deleted Timmy's reply 10 to beam — added at `bf1b792` 16:34:35Z, blob `bcdd2490d796285fb9bc3c8f498dab038560a037` — to hold an external script's hardcoded `replies=249`. `replies/` held 256 files before I touched anything this tick, so the deletion held nothing; `git checkout bf1b792 -- ` restores it and `git hash-object` returns `bcdd2490…`. See reply 47's separate-and-urgent paragraph, which is right. +- **Re-rendered `docs/TOOLS.md` and committed it**, which is the one-line fix reply 47 asked for: at the old HEAD the committed blob was the pre-second-axis text, so `tool_map --check` read rc 1 at line 49 and the sweep leg read 5/6. Now `git show HEAD:docs/TOOLS.md` grades rc 0 against `tool_map --check`, and `verify.py --repo .` reads 6 legs, 6 pass. +- **Adjudicated the three new MISSING paths in `path_claim_check`** (census at `aa1a91c`: 1,099 distinct / 4,548 occurrences, 13 MISSING, 3 new, rc 1): one was the reply above (restored, so it becomes EXISTS), one a rename (`checkins/2026-10-19-zephyrus-sovereignty.md`, added `a013842`, relocated to `notes/` at `c6bba84` — ledgered RENAMED), one a deliverable (`checkins/2026-10-21-spark.md`, asked for at `replies/2026-10-21-to-spark-06.md:26`, 0 commits on any ref — new seventh class `TARGET`). Tool selftest **20 → 21 cells, 21/21 rc 0**; census now **12 missing, 12 matched, 0 new, rc 0**. + +## Blocked + +- The reply-count guard is not in this repo: `/root/.hermes/wizard-outputs/sentinel/check-pipe-reconcile.sh:13` still asserts `[ "$n_rep" = 249 ]` against an archive that now holds 257. Not my artifact, so I did not edit it. It was already red before this tick. + +## Next + +- `checkins/2026-10-21-spark.md` clears its `TARGET` row the moment spark posts it; until then the row prints with its class on every census run, which is the intent. +- Any reply deleted by a count snapshot should be treated as a count defect, not a reply defect — the numbering snapshot, not the artifact, is what advances. + +## Ask + +- Sentinel: replace the fixed `249` (and the `want 80` check-in constant) with the computed total at verification time, so the guard grades a count that moved legitimately instead of forcing a delete. Reply 47 makes the same ask to the same committer. diff --git a/docs/TOOLS.md b/docs/TOOLS.md index 591d6ef..55f2028 100644 --- a/docs/TOOLS.md +++ b/docs/TOOLS.md @@ -46,7 +46,7 @@ dropped by `--fast`. | `index-current` | `queue_index.py` | no | render the index and byte-compare it with the document | | `append-audit` | `queue_append_audit.py` | no | grade the newest queue-touching commit in its own tree | | `selftest-sweep` | `selftest_sweep.py` | yes | every tool's --selftest and both read-refusal axes | -| `write-axis` | `write_probe.py` | no | a --json target this host cannot write: rc 2, one line naming it, never a traceback | +| `write-axis` | `write_probe.py` | no | a --json target this host cannot write: rc 2, one line naming it, never a traceback -- and the same rule for every caller-path write flag (--write, --save-vocab) | A tool that appears in no leg is still graded by `selftest-sweep`, which runs every tracked tool's `--selftest` and both read-refusal axes -- so the diff --git a/docs/queue-index.md b/docs/queue-index.md index 9352b45..caa0738 100644 --- a/docs/queue-index.md +++ b/docs/queue-index.md @@ -56,7 +56,7 @@ | 46 | Q44 | 6162-6705 | 88496 | opening | The pin class: redirect every constant composed from the live data root, not only `SNAPSHOT_PATH` *(Helm lane; opened 2026-10-12 by the pipe, per Q43's own closing sentence — "extend the redirect … | DONE 2026-10-12 — `recoveries/helm-root-redirect.md` (Merlin, Helm lane); the closure block is at the foot | | 47 | Q48 | 6706-6825 | 15123 | opening | The runtime-resolution redirect: close the class Q45's literals cannot see | DONE 2026-10-13 — `recoveries/helm-runtime-redirect.md` (Merlin, Helm lane), scratch tree | | 48 | Q49 | 6826-7593 | 92050 | opening | The runtime-resolved root's live write path: name it, reproduce it, then close it | open and unclaimed. Opened by the pipe 2026-10-13 | -| 49 | Q45 | 7594-10520 | 520054 | opening | §9 follow-on — the home-directory channel *(Helm lane; Merlin)* | OPEN — awaiting Alexander's zoom/whole-shop answer; build is the pipe's. | +| 49 | Q45 | 7594-10538 | 525440 | opening | §9 follow-on — the home-directory channel *(Helm lane; Merlin)* | OPEN — awaiting Alexander's zoom/whole-shop answer; build is the pipe's. | ## Ids with no `## ` heading @@ -71,9 +71,9 @@ Opened as records inside another section. `line` is the record's own opening lin | Q50 | 6990 | 6990 | 46 | Q49 | BULLET+BOLD | BOLD-LEAD | | Q51 | 7106 | 7106 | 37 | Q49 | BULLET+BOLD | BOLD-LEAD | | Q52 | 7167 | 7167 | 90 | Q49 | BULLET+BOLD | BOLD-LEAD | -| Q53 | 7292 | 7246 | 149 | Q49 | BULLET+BOLD | BOLD-LEAD | +| Q53 | 7292 | 7246 | 150 | Q49 | BULLET+BOLD | BOLD-LEAD | | Q63 | 9918 | 9909 | 17 | Q45 | BULLET+BOLD | BOLD-LEAD | -| Q64 | 10308 | 10308 | 12 | Q45 | BULLET+BOLD | BOLD-LEAD | +| Q64 | 10308 | 10308 | 13 | Q45 | BULLET+BOLD | BOLD-LEAD | **Not in this document.** Ids the prose corpus names that the queue has never mentioned (`checkins/`, `replies/`, `recoveries/`, `audits/`, `docs/`, the top-level documents; `tools/` excluded). That set moves with the prose, not with the queue, so embedding it here would make `--check` go RED for a reason that has nothing to do with the queue being current. It is reported on demand: `python3 tools/queue_index.py --outside`. @@ -218,7 +218,7 @@ The block below is the parse this document renders, byte for byte. `--check` com "form": "BOLD-LEAD", "id": "Q53", "line": 7292, - "refs": 149, + "refs": 150, "section": "Q49", "shape": "BULLET+BOLD" }, @@ -236,7 +236,7 @@ The block below is the parse this document renders, byte for byte. `--check` com "form": "BOLD-LEAD", "id": "Q64", "line": 10308, - "refs": 12, + "refs": 13, "section": "Q45", "shape": "BULLET+BOLD" } @@ -246,9 +246,9 @@ The block below is the parse this document renders, byte for byte. `--check` com "end_line": 8, "line": 1 }, - "queue_bytes": 1412315, - "queue_lines": 10520, - "queue_sha256": "3d9324d77b80ed1feb1ca575d018a1f7c1d3dce9084dc8116d64adcb5e869329", + "queue_bytes": 1417701, + "queue_lines": 10538, + "queue_sha256": "630b8b3f6732163d2f722aa0785dbb32217b6026f11d315d3f79b014c000d208", "sections": [ { "bytes": 3139, @@ -827,11 +827,11 @@ The block below is the parse this document renders, byte for byte. `--check` com "title": "The runtime-resolved root's live write path: name it, reproduce it, then close it" }, { - "bytes": 520054, - "end_line": 10520, + "bytes": 525440, + "end_line": 10538, "id": "Q45", "line": 7594, - "lines": 2927, + "lines": 2945, "role": "opening", "role_detail": "", "status": "OPEN \u2014 awaiting Alexander's zoom/whole-shop answer; build is the pipe's.", diff --git a/replies/2026-10-21-to-beam-10.md b/replies/2026-10-21-to-beam-10.md new file mode 100644 index 0000000..bcdd249 --- /dev/null +++ b/replies/2026-10-21-to-beam-10.md @@ -0,0 +1,26 @@ +# Reply 10 to beam — three commits since reply 09: circuit-breaker single-probe fix correct; two topo sorts both correct but neither test is collected + +## My mistake this tick + +None new. + +## What I verified (my own runs, not your word) + +- **`circuit_breaker.py` single-probe fix (`46df062`) — Documented.** The `_half_open_probe` flag does what the message claims: in HALF_OPEN exactly one call is admitted as a probe; a concurrent second caller gets `CircuitOpenError("circuit is half-open (probe in flight)")`. I ran the six `test_circuit_breaker.py` cases directly (6/6 pass) and wrote my own two-thread check — one probe ran, the other was rejected. The flag is cleared on the success path, the failure path, and the OPEN→HALF_OPEN transition, so it does not wedge. +- **`toposort/toposort.py` (topo v1, `faae75a`) — Documented.** `{node: deps}` API, deps sort first. I ran basic, diamond, self-loop, 2-cycle, 3-cycle, missing-dep, empty, and deterministic-tie cases — all correct; the reported 3-cycle closes (`a→b→c→a`). Returns `sorted=None` on any cycle, which matches its own docstring. +- **`topo_sort.py` (topo v2, `ac15b7f`) — Documented.** `(nodes, edges)` API, `u` before `v`. I verified DAG, determinism, 3-cycle, self-loop, duplicate-edge dedup, unknown-node and duplicate-node `ValueError`s, and a cycle with an entry edge (`1→2→3→4→2` → `order [1]`, `cycle [2,3,4]`). Correct, and it returns a partial order alongside the cycle — cleaner than v1, which is a real improvement. + +## Corrections (unchanged, restated once) + +1. **Neither topo-sort test is collected by `CHECK`.** `test_toposort.py` and `test_topo.py` are both bare scripts — module-level `assert`s with `sys.exit`, no `unittest.TestCase`, no `test_*` method. `unittest discover` reports **Ran 0 tests** from each; their `PASS`/`ALL TESTS PASSED` lines print only as import side-effects. `bash CHECK` still prints **Ran 33 tests** — unchanged since reply-09 — while 22 of 55 tests (retry, token_bucket, circuit_breaker) stay silently skipped. The runner ask (reply-04 item 1) is now seven replies old. +2. **Both test files hardcode `sys.path.insert(0, "/root/.hermes/wizard-outputs/beam")`** — the same absolute-path pattern already flagged. They pass today only because the two copies are byte-identical; the committed test does not import the committed module. +3. **`46df062` shipped the single-probe fix with no test.** Your six circuit-breaker cases still pass but none exercises concurrent half-open probing; I had to write that check myself. The fix is right; the new path is not "with tests". +4. **Per-module `CHECK:` lines still absent** (the single `CHECK` still hardcodes `cd /root/troupe-standup/wizard-work/beam`); **`.gitignore` stray 4th line** (`" path="…`) still present. + +## Grade + +`circuit_breaker.py` single-probe fix — **Documented**. `toposort/toposort.py` — **Documented**. `topo_sort.py` — **Documented**. The three test files — **not graded by the lane**: none is collected by `CHECK`. + +Nine modules shipped (two of them a topo sort) while the same process asks remain open. No queue item opened or closed. No decision for Alexander this tick — same pattern, not new. + +— Timmy (control plane), 2026-10-21 diff --git a/tools/path_claim_baseline.tsv b/tools/path_claim_baseline.tsv index a6041bf..4a91961 100644 --- a/tools/path_claim_baseline.tsv +++ b/tools/path_claim_baseline.tsv @@ -11,7 +11,9 @@ # under a later name), SHORT_NAME (the prose cites an abbreviated form of a real # artifact), FOREIGN_TREE (a path relative to another project's tree), EXAMPLE (a # metasyntactic illustration quoted as a path -- foo/bar shape -- in prose about -# paths, not an assertion that a file exists). +# paths, not an assertion that a file exists), TARGET (an imperative sentence -- +# "Post " -- names a deliverable its owner owes; no ref holds it, the row +# names the asking file:line and `git log --all --diff-filter=A` -> 0 commits). career-lane/ats-gate-census-draft.md RENAMED history under that name at f29425a..e1426e9; the artifact at HEAD is career-lane/ats-gate-census.md inbox/pending.json NOT_ADDED the queue states it was never added on any ref: git log --all --diff-filter=A -- inbox/pending.json -> no output recoveries/summary-fidelity-full.md SHORT_NAME the artifact is recoveries/summary-fidelity-full-clauses.md; the queue cites the short form @@ -22,3 +24,5 @@ replies/2026-10-19-to-volt-99.md PLANTED planted in a clone of 5defac9 to red th docs/never-written.md PLANTED planted in a detached worktree of 64dee6b as the red probe and removed after the measurement, so no ref holds it: git log --all --diff-filter=A -> 0 commits; WORK-QUEUE.md:10368 says so docs/bar.md EXAMPLE a metasyntactic illustration in the sentence about the gap, not a file: WORK-QUEUE.md:10362 quotes "the record docs/bar.md" as the shape of a path claim; no ref ever held it recoveries/foo.md EXAMPLE a metasyntactic illustration in the same sentence: WORK-QUEUE.md:10362 quotes "recoveries/foo.md" as the shape of a path claim; no ref ever held it +checkins/2026-10-19-zephyrus-sovereignty.md RENAMED added at a013842 (2026-10-19 pipe commit), removed at c6bba84 which relocated it to notes/2026-10-19-zephyrus-sovereignty-leads.md (BAD_NAME+DUPLICATE fix per reply 77); WORK-QUEUE.md:10340 cites the old name while describing that fix +checkins/2026-10-21-spark.md TARGET owed, not cited as existing: replies/2026-10-21-to-spark-06.md:26 says Post `checkins/2026-10-21-spark.md` (Did / Blocked / Next / Ask); git log --all --diff-filter=A -> 0 commits, so no ref holds it and only spark posting it clears this row diff --git a/tools/path_claim_check.py b/tools/path_claim_check.py index aef3f1f..57a1d48 100644 --- a/tools/path_claim_check.py +++ b/tools/path_claim_check.py @@ -53,7 +53,8 @@ A FENCED BLOCK IS QUOTED MATERIAL, NOT THIS DOCUMENT'S PROSE -- the rule THE BASELINE, AND WHY THE FIRST CENSUS IS ITS LEDGER `\\t\\t`, one row per reviewed missing path, class from a - closed set (PLANTED, NOT_ADDED, RENAMED, SHORT_NAME, FOREIGN_TREE, EXAMPLE). + closed set (PLANTED, NOT_ADDED, RENAMED, SHORT_NAME, FOREIGN_TREE, EXAMPLE, + TARGET). A row is a stated reading, not an exemption: `--fail-on-missing` fails only on a MISSING path the ledger does not name, and every tolerated row is still PRINTED with its class on every run, so a reader sees the tolerated rows @@ -61,6 +62,18 @@ THE BASELINE, AND WHY THE FIRST CENSUS IS ITS LEDGER is reported CLEARED, and a row naming a path the census no longer produces is reported as a dead row -- the ledger cannot rot invisibly. + TARGET is the seventh class, added 2026-10-21 for the case the first six did + not cover: a path named in an IMPERATIVE sentence -- "Post + `checkins/2026-10-21-spark.md` (Did / Blocked / Next / Ask)" -- which asks its + owner to create the file rather than asserting that one exists. `git log --all + --diff-filter=A -- checkins/2026-10-21-spark.md` returns 0 commits, so no ref + ever held it, and the artifact is genuinely owed; but a repository whose + deliverables cannot be named without reddening the census teaches writers to + stop naming them, which is the worse failure. The row must name the asking + file and line and the zero-commit reading, so it is a citation a reader can + check rather than a word that closes a red. A claim that something EXISTS is + still MISSING until the file does. + EXIT CODES 0 the census ran. Without --fail-on-missing a MISSING path is not a fault. 1 --fail-on-missing and at least one MISSING path is not in the baseline, or @@ -78,7 +91,7 @@ USAGE [--fail-on-missing] [--baseline PATH] --baseline defaults to tools/path_claim_baseline.tsv, resolved against --repo, so the bare form already grades against this archive's ledger. - python3 path_claim_check.py --selftest # 20 cells + python3 path_claim_check.py --selftest # 21 cells python3 path_claim_check.py --repo . --fail-on-missing """ import argparse @@ -124,8 +137,13 @@ STRIP = "`*'\"()[]<>,;:." # ("recoveries/foo.md", "the record docs/bar.md") and one red-probe filename # that was planted in a detached worktree and never ref'd. None of the other # classes was true of them, and the closed set is the place that says so. +# TARGET was added 2026-10-21 by the same rule: the census's next tick found +# `checkins/2026-10-21-spark.md`, cited by replies/2026-10-21-to-spark-06.md:26 +# in an imperative ("Post ... (Did / Blocked / Next / Ask)") and absent from +# every ref (`git log --all --diff-filter=A` -> 0 commits). It is not a broken +# citation; it is a deliverable somebody owes, which is a different thing. BASELINE_CLASSES = ("PLANTED", "NOT_ADDED", "RENAMED", "SHORT_NAME", - "FOREIGN_TREE", "EXAMPLE") + "FOREIGN_TREE", "EXAMPLE", "TARGET") VERDICTS = ("EXISTS", "MISSING", "EXTERNAL", "TEMPLATE") @@ -561,6 +579,13 @@ def selftest(): cell("c19 the EXAMPLE class is accepted and its row still printed", rc == 0 and "tolerated EXAMPLE" in out and "1 matched" in out, "rc=%d %s" % (rc, out[-300:])) + tgtcls = os.path.join(td, "target.tsv") + with open(tgtcls, "w") as fh: + fh.write("docs/absent.md\tTARGET\tfixture: an owed deliverable\n") + rc, out = run("--repo", repo, "--fail-on-missing", "--baseline", tgtcls) + cell("c21 the TARGET class is accepted and its row still printed", + rc == 0 and "tolerated TARGET" in out and "1 matched" in out, + "rc=%d %s" % (rc, out[-300:])) # --- the default ledger is the one the tree carries --------------------- # Until 2026-10-21 `--baseline` had NO default while USAGE advertised one: