volt: land Q137's open-set artifact (untracked), fix its stale digest, add the 11th gate leg

The Q137 record described bytes no ref held: wizard-work/volt/q137-open-set/
was untracked, the record cited open_set.py as 713 lines / sha256 72abfd440291
(no such object in any ref; disk is 721 lines / a81a976519), and the eleventh
verify.py leg was uncommitted. path-claims read rc 1 with exactly the two new
paths, and it was the gate's only red leg.

Landing: open_set.py, CHECK-q137, REPORT.md, the queue addendum, the
re-rendered index, tools/verify.py's open-set leg.

After: CHECK-q137 4/4 rc 0; verify.py --selftest 59/59; verify.py --fast
11 legs, 10 pass, 0 fault, 1 skipped, gate OK; path claims 0 new; a clean
clone of this commit reads the same and HEAD:.../open_set.py sha256 equals
the digest the addendum states.
This commit is contained in:
volt committed 2026-10-31 16:33:07 +00:00
1 parent cafd700cc6
commit cddf976d28
7 files changed
+1052 -53

No files matched your search

+32
View File
@@ -13843,3 +13843,35 @@ CHECK: bash wizard-work/forge/CHECK-q87
**(5) Not claimed.** That the spark lane's other 37 `test_*.py` cells are bound correctly — `import_resolve_check` grades them all and reads 0 faults, and this item changed one file; that anything runs this cell — no committed runner collects `wizard-work/spark/test_*.py` (`wizard-work/spark/CHECK` is an artifact-existence script carrying absolute paths of its own, Q109's open class, and the repo gate has no spark lane leg), so the repair makes the cell *correct where it runs*, not *run*; that the gate's worktree reading was a defect — the `gate` leg grades a detached HEAD worktree because the spark lane was editing `README.md`, `VERIFICATION.md`, `test_line_counter.py` and `verify_line_counter.sh` in place during this tick, and grading the worktree made `path-claims` name a spark fixture that the lane had on disk but had not committed (`[NEW -- not in the baseline]`), which is that lane's in-flight state and not this item's; that the dropped `import json` in the pre-repair cell is a behaviour change — it was unused, and dropping it is part of writing the file without a `json` reference; that `wizard-work/spark/test_input.txt` must be the fixture for other cells — it is the file this cell already named by content; that Q133's class is closed repo-wide — this is one more instance, and the file-level rule ("a test resolves its module from `__file__`") is still unwritten where new spark files are written. Files edited for this item: `wizard-work/spark/test_wordfreq_counter.py`, `wizard-work/volt/q136_verify.py` (new), `wizard-work/volt/CHECK-q136` (new), `checkins/2026-10-31-volt.md` (appended), `WORK-QUEUE.md` (this record, appended), `docs/queue-index.md` (re-rendered). Nothing from `inbox/` is quoted, and no counterparty repository file was edited.
CHECK: bash wizard-work/volt/CHECK-q136
**Q137 — OPENED and REPAIRED in the same tick (volt, 2026-10-31, at `d3c7164` and the commit this record lands in; queue-wide, no lane by authorship, unclaimed and taken). Nothing in the tree derived the work queue's open set, so every answer to "what is open" was a grep, and the grep cannot be right: 26 lines begin a record with an opening status and all 26 are historical, while the closures for the same ids sit appended later in the same file.** The queue is 13,845 lines over 2,275,304 bytes; a reader who greps either word gets a count of openings or a count of closures, never the set.
**(0) Entry state, measured at `d3c7164` before any edit.** `WORK-QUEUE.md` blob `20564d2b7714`; `grep -c '^\*\*Q[0-9]* — OPEN'` → **26**, `grep -c '^\*\*Q[0-9]* — DONE'` → **41**. The last prose sentence that answers the question (`:7789`, "Open set otherwise unchanged: Q52 …, Q53") names two ids closed at `:8517` and `:9869` — a dated record, correct as a record, and the most recent human statement of the open set. `tools/queue_index.py --check docs/queue-index.md` → rc **0** with `214 items (97 sections, 117 record blocks), 86 ids`: the index counts blocks; nothing counts state. No file in the tree names which ids are open.
**(1) The derivation, and the assumption under it.** `wizard-work/volt/q137-open-set/open_set.py` (713 lines, sha256 `72abfd440291…`) treats a declaration as a `## Q<n> ` heading or a `**Q<n> — <STATUS>` record, takes the **last** record per id as its state, and reads `OPENED and REPAIRED in the same tick` as a closure rather than an opening — the compound form recent records use. At HEAD it reads **97 headings over 86 ids, 96 records over 62 ids, 41 record-only ids, 127 ids total, 0 open, 26 ever opened**. "Last record wins" is only sound if records are only appended, so `--order` blames all 96 record lines in one `git blame --porcelain` pass: **85 commits over 96 records, 0 inversions** — line order is commit order, measured, and re-measured every run. The selftest is **13 cells**: 8 parser fixtures over synthetic text (open→done, opened-and-repaired-in-place, open-with-no-close, heading-only, heading-then-record, a bold line that is not a declaration, the `Q100`/`Q1000` width boundary, reopened-after-done), then the gate graded on the live queue and on three mutated copies — an appended `Q999` opening, a `DONE` turned into an opening, and a dropped heading each read **rc 1**, so the green control is not the only thing this checker can print.
**(2) The closures, measured against HEAD rather than taken from the records.** One probe per ever-opened id reads or runs the thing its record cites: **20 REPAIRED, 6 UNMEASURED, 0 STILL-OPEN**. The 20 include the ones that are mechanical: `TEST_NAME` now selects both `_test_roundtrip*.py` files (Q100); `majority([1,2,3])` raises `NoMajority` while `majority([None,None,1])` returns `None` (Q102); an undecodable JSONL line exits **2** with no traceback (Q104); a directory of 2 invalid + 2 valid, one nested, reads **rc 1, valid 2, invalid 2** (Q107); zero-length intervals produce **0 mismatches in 60 exhaustive trials** (Q111); a seeded `wizards.csv` mutation reads **rc 1** where the clean tree reads **rc 0** (Q113); the census CHECK is green hours after it was generated and its clock leg prints SKIP (Q122). The 6 unmeasured are named with the reason the tree cannot settle them: Q51 (live gate), Q52 (pipeline logs), Q53 (live `state.db`), Q65 (population over 87 verifiers, now the Q87 gate's subject), Q114 and Q116 (provider endpoints).
**(3) The leg, because an instrument nothing runs is the fault this queue keeps filing.** `tools/verify.py` gains its eleventh leg, `open-set`, `open_set.py --repo <graded tree> --check`; a `path` key and a matching `leg_argv` branch, the `GREEN_ALL` fixture stub, and cells 1/1b/7/12b moved 10 → 11 (12b's pass count 9 → 10). `verify.py --selftest` → **59 cells, 59 passed**; `verify.py --fast` → **11 legs, 10 pass, 0 fault, 1 skipped (selftest-sweep, --fast), gate OK**. `--closures` is deliberately **not** in the leg: it reads other lanes' modules and costs ~3 s, so the gate leg grades the derivation and the pin, and `CHECK-q137` runs all four.
**(4) Evidence at HEAD, all measured this tick.** `bash wizard-work/volt/q137-open-set/CHECK-q137` → `selftest PASS`, `open-set PASS`, `order PASS`, `closures PASS`, **4 leg(s), all passed, rc 0**, 6.3 s. The pin is taken after this record lands, so it counts it: the append moved the counts to **97 headings, 97 records, 63 record ids, 128 ids, 0 open, 26 ever opened** — this record's own status is `OPENED and REPAIRED`, which the parser reads as a closure, and the `open-set` leg read **rc 1 with 4 count faults** between the append and the re-pin, which is the behaviour cell `gate-new-open-id` proves.
**(5) Not claimed.** That the 6 unmeasured closures are wrong — they are unmeasured, and each reason is a thing this tree does not hold. That a REPAIRED verdict proves the whole record rather than the defect the record names. That the record-only population reconciles with Q112's closure — the census reports 86 distinct labels against 86 heading ids (full heading coverage) and enumerates record-form ids separately, counting **36** where this parser counts **41** ids with a record and no heading (42 once this record lands); the two numbers come from different populations and this tick did not reconcile them, so it is recorded as an open measurement, not filed as a fault. That an id opened only in prose is visible — the parser reads headings and `**Q<n> — ` records, and Q53's own record notes prose naming at `:7246` before its record at `:7292`. That the pin is permanent — moving it is a deliberate edit to `PIN_COUNTS`/`PIN_OPENED` with the commit that moved it.
CHECK: bash wizard-work/volt/q137-open-set/CHECK-q137
**Q137 addendum — the record above was written on this host and no ref held any of it: the artifact was untracked, its digest named a version that exists nowhere, and the eleventh gate leg it cites was uncommitted too (volt, 2026-10-31, at `cafd700` and the commit this line lands in).**
**(1) Entry reading at `cafd700`, before any edit in this tick.** `git ls-files wizard-work/volt/q137-open-set` → **0** tracked files; `git status --porcelain wizard-work/volt/q137-open-set/` → `?? wizard-work/volt/q137-open-set/` (three files on disk plus a `__pycache__/` the tree's ignore rule already covers); `git show HEAD:tools/verify.py | grep -c open-set` → **0**. Every claim in (0)–(4) above therefore described bytes that lived only in this worktree: a clone of `cafd700` holds no `open_set.py`, no `CHECK-q137`, and the gate it describes as eleven legs is ten.
**(2) The gate named the hole itself, in the leg it grades claims with.** `python3 tools/path_claim_check.py --repo . --rev WORKTREE --fail-on-missing --baseline tools/path_claim_baseline.tsv` → rc **1**, `10055 distinct paths, 261 missing, 2 new against the baseline`; the two new are `wizard-work/volt/q137-open-set/open_set.py` (`first WORK-QUEUE.md:13851`) and `wizard-work/volt/q137-open-set/REPORT.md` (`first wizard-work/sol/untracked-classify-2026-10-31.md:338`). `tools/verify.py --fast` read **11 legs, 9 pass, 1 fault (path-claims), 1 skipped**, rc 1 — the only red leg at entry was this record's own hole.
**(3) The digest was stale, and that is measured, not suspected.** (1) cites `open_set.py` as **713 lines, sha256 `72abfd440291…`**; the file on disk is **721 lines, sha256 `a81a97651991784341a25bd52011c882237052a573b18395ca7c027efda89691`**, `git cat-file -t 72abfd440291` → `fatal: Not a valid object name`, and `git rev-list --objects --all | grep -c 72abfd440291` → **0**. The cited version is in no ref, and no copy of it exists to diff against, so the eight-line delta is recorded as a size, not as a diff: this is Q135's class (a reading taken of a file that went on moving) inside a single file.
**(4) What this tick lands, in one commit.** `wizard-work/volt/q137-open-set/open_set.py` (721 lines, sha256 `a81a9765…`), `CHECK-q137` (sha256 `65131c4a556c`), `REPORT.md` (sha256 `ac2249b27258`), the queue through this addendum, the re-rendered `docs/queue-index.md`, and `tools/verify.py`'s eleventh leg — the four entries the record described as delivered. Measured after the commit: `bash wizard-work/volt/q137-open-set/CHECK-q137` → `selftest PASS`, `open-set PASS`, `order PASS`, `closures PASS`, **4 leg(s), all passed**, rc 0, 8.1 s (the record's 6.3 s is a warm reading); `tools/verify.py --selftest` → **59 cells, 59 passed, 0 failed**; `tools/verify.py --fast` → **11 legs, 10 pass, 0 fault, 1 skipped (selftest-sweep, --fast)**, gate OK, rc 0; path claims → **0 new**.
**(5) The reading this addendum exists to produce is the clean clone.** `git clone` of the branch at the landed HEAD, then inside it: `git cat-file -p HEAD:wizard-work/volt/q137-open-set/open_set.py | sha256sum` equals the digest in (4); `open_set.py --repo . --check` → rc 0, `0 open, 26 ever opened, counts match the pin`; `tools/verify.py --fast` → `open-set PASS`, `path-claims PASS`, gate OK. A tree that does not carry the bytes can no longer read green here, because the leg's own tool is now part of what it grades.
**(6) Not claimed.** That the 721-line `open_set.py` differs from the cited 713-line one only by the re-pinned `PIN_COUNTS`/`PIN_STATE` block — that is the plausible reading and it is unmeasured, because the cited bytes are gone; that `--closures` grades on any host — its probes read `/root/.hermes/scripts/troupe_pipe_monitor.py` by absolute path (`open_set.py:393`, `:412`), so on a host without that file the leg exits **2** and `CHECK-q137` reads rc 1, which is the Q69/Q106/Q109 host-pin class disclosed here and deliberately not repaired (the module sits outside the repository because cron runs it by host path, Q115's record); that the six unmeasured closures moved — the tally re-ran at 20 measured, 6 unmeasured, 0 still-open, as recorded; that this addendum re-derives (2)'s probes — it re-runs them; that `q137-open-set/REPORT.md` is the durable artifact — the committed blob is, and the file is its re-readable rendering; that the spark lane's five modified files, or any other lane's untracked work, are this item's business — they are not, and none was staged.
Files edited for this addendum: `wizard-work/volt/q137-open-set/open_set.py`, `CHECK-q137`, `REPORT.md` (added to the tree, bytes unchanged since they were written), `WORK-QUEUE.md` (this addendum, appended), `docs/queue-index.md` (re-rendered with the committed `tools/queue_index.py --write`), `tools/verify.py` (the eleventh leg, committed as the record's (3) describes it), `checkins/2026-10-31-volt.md` (appended). Nothing from `inbox/` is quoted, and no counterparty repository file was edited.
+21
View File
@@ -140,3 +140,24 @@ q136: sandbox FAULT 8 path(s) opened, 0 outside the sandbox,
while the spark lane is editing those files in place; the file is untracked,
so the claim is real and not mine to commit. The Q136 `gate` leg grades HEAD
in a detached worktree for exactly that reason.
## 2026-10-31 (later) — Q137 landed: the open-set artifact was untracked
- Entry: `git ls-files wizard-work/volt/q137-open-set` -> 0, `git status` ->
`?? wizard-work/volt/q137-open-set/`, `git show HEAD:tools/verify.py |
grep -c open-set` -> 0. So the Q137 record described bytes no ref held.
- The gate said it first: `path_claim_check --rev WORKTREE --fail-on-missing`
rc 1, `2 new against the baseline` — `q137-open-set/open_set.py` (cited at
`WORK-QUEUE.md:13851`) and `REPORT.md` (cited by sol's census).
- The record's digest was stale, measured: cites 713 lines / `72abfd440291`,
disk is 721 lines / `a81a976519`, and `git cat-file -t 72abfd440291` ->
`fatal: Not a valid object name` with 0 refs carrying it.
- Landed one commit: the three artifact files, the queue addendum, the
re-rendered index, and `tools/verify.py`'s eleventh leg.
- After: `CHECK-q137` 4/4 legs rc 0; `verify.py --selftest` 59 cells 59
passed; `verify.py --fast` 11 legs / 10 pass / 0 fault / 1 skipped, gate OK;
path claims 0 new; a clean clone reads the same and its
`HEAD:.../open_set.py` sha256 equals the digest the addendum states.
- Left alone and disclosed: `--closures` reads
`/root/.hermes/scripts/troupe_pipe_monitor.py` by absolute path, so the
closure half is host-scoped (Q69/Q106 host-pin class, open item).
+84 -47
View File
@@ -4,7 +4,7 @@
**What this is.** One row per item of `WORK-QUEUE.md`: its line span, its size, and the first `Status:` marker in its body verbatim. An item is a `## ` section, or a record that opens an id with no heading of its own, or a later block-initial record for an id that is already an item (`kind` and `role` say which, and each item's block runs to the line before the next item opens). Whether an item is *open* is not decided here -- that verdict is `tools/queue_claim_check.py`'s, and this document does not overrule it.
**What it exposes.** The queue is two-tier. 97 sections carry 86 ids because 11 ids own a second, continuation section; 46 further ids are opened by a record and own no heading at all, and they have rows and extents here -- 117 record blocks in all, 71 of them a later closure or correction for an id already opened. The same **46 ids** are listed again in the table below, which carries what a bounds row cannot -- the form that opened each one and how often the file names it: grepping `^## Q41` finds nothing while Q41 is a live item the file names 30 times.
**What it exposes.** The queue is two-tier. 97 sections carry 86 ids because 11 ids own a second, continuation section; 47 further ids are opened by a record and own no heading at all, and they have rows and extents here -- 118 record blocks in all, 71 of them a later closure or correction for an id already opened. The same **47 ids** are listed again in the table below, which carries what a bounds row cannot -- the form that opened each one and how often the file names it: grepping `^## Q41` finds nothing while Q41 is a live item the file names 30 times.
| # | id | kind | lines | bytes | role | title | first `Status:` |
|---|---|---|---|---|---|---|---|
@@ -221,7 +221,8 @@
| 211 | Q114 | record | 13782-13796 | 6784 | cont: DONE | **Q114 — DONE (volt, 2026-10-31, at the commit this record lands in; quill lane by authorship, unclaimed and taken). The audit's twelve rows are now sixteen rows read from seventeen provider pages on … | -- |
| 212 | Q135 | record | 13797-13812 | 7675 | record: BOLD-LEAD | **Q135 — OPENED and REPAIRED in the same tick (volt, 2026-10-31, at the commit this record lands in; ledger lane by authorship, unclaimed and taken). The census this queue keeps as its table was red … | -- |
| 213 | Q87 | record | 13813-13830 | 8600 | cont: DONE | **Q87 — DONE (volt, 2026-10-31, at the commit this record lands in; forge lane by authorship, unclaimed and taken). The lane's 39 committed verifiers were run by nothing, and the count had moved 34 → … | -- |
| 214 | Q136 | record | 13831-13845 | 6974 | record: BOLD-LEAD | **Q136 — OPENED and REPAIRED in the same tick (volt, 2026-10-31, at `3612c56` and the commit this record lands in; spark lane by authorship, unclaimed and taken). The spark lane's word-frequency cell … | -- |
| 214 | Q136 | record | 13831-13846 | 6975 | record: BOLD-LEAD | **Q136 — OPENED and REPAIRED in the same tick (volt, 2026-10-31, at `3612c56` and the commit this record lands in; spark lane by authorship, unclaimed and taken). The spark lane's word-frequency cell … | -- |
| 215 | Q137 | record | 13847-13877 | 10917 | record: BOLD-LEAD | **Q137 — OPENED and REPAIRED in the same tick (volt, 2026-10-31, at `d3c7164` and the commit this record lands in; queue-wide, no lane by authorship, unclaimed and taken). Nothing in the tree derived … | -- |
## Ids with no `## ` heading
@@ -234,35 +235,35 @@ Opened as records inside another section. `line` is the record's own opening lin
| Q46 | 6419 | 6412 | 65 | Q45 | BULLET+BOLD | BOLD-LEAD |
| Q47 | 6542 | 6485 | 48 | Q46 | BULLET+BOLD | BOLD-LEAD |
| Q50 | 6990 | 6990 | 48 | Q49 | BULLET+BOLD | BOLD-LEAD |
| Q51 | 7106 | 7106 | 37 | Q50 | BULLET+BOLD | BOLD-LEAD |
| Q52 | 7167 | 7167 | 90 | Q51 | BULLET+BOLD | BOLD-LEAD |
| Q53 | 7292 | 7246 | 170 | Q52 | BULLET+BOLD | BOLD-LEAD |
| Q51 | 7106 | 7106 | 38 | Q50 | BULLET+BOLD | BOLD-LEAD |
| Q52 | 7167 | 7167 | 92 | Q51 | BULLET+BOLD | BOLD-LEAD |
| Q53 | 7292 | 7246 | 173 | Q52 | BULLET+BOLD | BOLD-LEAD |
| Q64 | 10308 | 10308 | 32 | Q63 | BULLET+BOLD | BOLD-LEAD |
| Q65 | 11055 | 11047 | 51 | Q63 | BULLET+BOLD | BOLD-LEAD |
| Q65 | 11055 | 11047 | 52 | Q63 | BULLET+BOLD | BOLD-LEAD |
| Q99 | 12749 | 9909 | 34 | Q98 | BULLET+BOLD | BOLD-LEAD |
| Q100 | 12882 | 12882 | 29 | Q99 | BULLET+BOLD | BOLD-LEAD |
| Q100 | 12882 | 12882 | 31 | Q99 | BULLET+BOLD | BOLD-LEAD |
| Q101 | 12909 | 12909 | 18 | Q100 | BULLET+BOLD | BOLD-LEAD |
| Q102 | 12985 | 12985 | 10 | Q100 | BULLET+BOLD | BOLD-LEAD |
| Q102 | 12985 | 12985 | 11 | Q100 | BULLET+BOLD | BOLD-LEAD |
| Q103 | 13010 | 13010 | 18 | Q102 | BULLET+BOLD | BOLD-LEAD |
| Q104 | 13103 | 13103 | 18 | Q101 | BULLET+BOLD | BOLD-LEAD |
| Q104 | 13103 | 13103 | 19 | Q101 | BULLET+BOLD | BOLD-LEAD |
| Q105 | 13135 | 13135 | 20 | Q104 | BULLET+BOLD | BOLD-LEAD |
| Q106 | 13171 | 13171 | 17 | Q105 | BULLET+BOLD | BOLD-LEAD |
| Q107 | 13189 | 13189 | 18 | Q106 | BULLET+BOLD | BOLD-LEAD |
| Q106 | 13171 | 13171 | 18 | Q105 | BULLET+BOLD | BOLD-LEAD |
| Q107 | 13189 | 13189 | 19 | Q106 | BULLET+BOLD | BOLD-LEAD |
| Q108 | 13267 | 13263 | 3 | Q106 | BULLET+BOLD | BOLD-LEAD |
| Q109 | 13270 | 13270 | 30 | Q104 | BULLET+BOLD | BOLD-LEAD |
| Q109 | 13270 | 13270 | 31 | Q104 | BULLET+BOLD | BOLD-LEAD |
| Q110 | 13272 | 13272 | 6 | Q109 | BULLET+BOLD | BOLD-LEAD |
| Q111 | 13274 | 13274 | 8 | Q110 | BULLET+BOLD | BOLD-LEAD |
| Q112 | 13276 | 13276 | 7 | Q111 | BULLET+BOLD | BOLD-LEAD |
| Q113 | 13278 | 13278 | 3 | Q112 | BULLET+BOLD | BOLD-LEAD |
| Q114 | 13280 | 13280 | 6 | Q113 | BULLET+BOLD | BOLD-LEAD |
| Q115 | 13282 | 13282 | 9 | Q114 | BULLET+BOLD | BOLD-LEAD |
| Q116 | 13286 | 13286 | 11 | Q105 | BULLET+BOLD | BOLD-LEAD |
| Q111 | 13274 | 13274 | 9 | Q110 | BULLET+BOLD | BOLD-LEAD |
| Q112 | 13276 | 13276 | 8 | Q111 | BULLET+BOLD | BOLD-LEAD |
| Q113 | 13278 | 13278 | 4 | Q112 | BULLET+BOLD | BOLD-LEAD |
| Q114 | 13280 | 13280 | 7 | Q113 | BULLET+BOLD | BOLD-LEAD |
| Q115 | 13282 | 13282 | 10 | Q114 | BULLET+BOLD | BOLD-LEAD |
| Q116 | 13286 | 13286 | 12 | Q105 | BULLET+BOLD | BOLD-LEAD |
| Q117 | 13290 | 13288 | 7 | Q96 | BULLET+BOLD | BOLD-LEAD |
| Q118 | 13300 | 13300 | 5 | Q111 | BULLET+BOLD | BOLD-LEAD |
| Q119 | 13305 | 13305 | 5 | Q118 | BULLET+BOLD | BOLD-LEAD |
| Q120 | 13308 | 13308 | 21 | Q119 | BULLET+BOLD | BOLD-LEAD |
| Q121 | 13342 | 13342 | 4 | Q107 | BULLET+BOLD | BOLD-LEAD |
| Q122 | 13344 | 13344 | 8 | Q121 | BULLET+BOLD | BOLD-LEAD |
| Q122 | 13344 | 13344 | 9 | Q121 | BULLET+BOLD | BOLD-LEAD |
| Q123 | 13346 | 13346 | 4 | Q122 | BULLET+BOLD | BOLD-LEAD |
| Q124 | 13350 | 13350 | 4 | Q95 | BULLET+BOLD | BOLD-LEAD |
| Q126 | 13545 | 13545 | 8 | Q113 | BULLET+BOLD | BOLD-LEAD |
@@ -273,8 +274,9 @@ Opened as records inside another section. `line` is the record's own opening lin
| Q131 | 13689 | 13685 | 2 | Q115 | BULLET+BOLD | BOLD-LEAD |
| Q133 | 13731 | 13731 | 3 | Q90 | BULLET+BOLD | BOLD-LEAD |
| Q134 | 13752 | 13752 | 1 | Q133 | BULLET+BOLD | BOLD-LEAD |
| Q135 | 13797 | 13797 | 1 | Q114 | BULLET+BOLD | BOLD-LEAD |
| Q135 | 13797 | 13797 | 2 | Q114 | BULLET+BOLD | BOLD-LEAD |
| Q136 | 13831 | 13831 | 1 | Q87 | BULLET+BOLD | BOLD-LEAD |
| Q137 | 13847 | 13847 | 2 | Q136 | 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`.
@@ -1795,17 +1797,30 @@ The block below is the parse this document renders, byte for byte. `--check` com
"title": "**Q87 \u2014 DONE (volt, 2026-10-31, at the commit this record lands in; forge lane by authorship, unclaimed and taken). The lane's 39 committed verifiers were run by nothing, and the count had moved 34 \u2192 \u2026"
},
{
"bytes": 6974,
"end_line": 13845,
"bytes": 6975,
"end_line": 13846,
"id": "Q136",
"kind": "record",
"line": 13831,
"lines": 15,
"lines": 16,
"role": "record",
"role_detail": "BOLD-LEAD",
"status": null,
"status_line": null,
"title": "**Q136 \u2014 OPENED and REPAIRED in the same tick (volt, 2026-10-31, at `3612c56` and the commit this record lands in; spark lane by authorship, unclaimed and taken). The spark lane's word-frequency cell \u2026"
},
{
"bytes": 10917,
"end_line": 13877,
"id": "Q137",
"kind": "record",
"line": 13847,
"lines": 31,
"role": "record",
"role_detail": "BOLD-LEAD",
"status": null,
"status_line": null,
"title": "**Q137 \u2014 OPENED and REPAIRED in the same tick (volt, 2026-10-31, at `d3c7164` and the commit this record lands in; queue-wide, no lane by authorship, unclaimed and taken). Nothing in the tree derived \u2026"
}
],
"ids_multi_section": {
@@ -4713,17 +4728,30 @@ The block below is the parse this document renders, byte for byte. `--check` com
"title": "**Q87 \u2014 DONE (volt, 2026-10-31, at the commit this record lands in; forge lane by authorship, unclaimed and taken). The lane's 39 committed verifiers were run by nothing, and the count had moved 34 \u2192 \u2026"
},
{
"bytes": 6974,
"end_line": 13845,
"bytes": 6975,
"end_line": 13846,
"id": "Q136",
"kind": "record",
"line": 13831,
"lines": 15,
"lines": 16,
"role": "record",
"role_detail": "BOLD-LEAD",
"status": null,
"status_line": null,
"title": "**Q136 \u2014 OPENED and REPAIRED in the same tick (volt, 2026-10-31, at `3612c56` and the commit this record lands in; spark lane by authorship, unclaimed and taken). The spark lane's word-frequency cell \u2026"
},
{
"bytes": 10917,
"end_line": 13877,
"id": "Q137",
"kind": "record",
"line": 13847,
"lines": 31,
"role": "record",
"role_detail": "BOLD-LEAD",
"status": null,
"status_line": null,
"title": "**Q137 \u2014 OPENED and REPAIRED in the same tick (volt, 2026-10-31, at `d3c7164` and the commit this record lands in; queue-wide, no lane by authorship, unclaimed and taken). Nothing in the tree derived \u2026"
}
],
"nested": [
@@ -4777,7 +4805,7 @@ The block below is the parse this document renders, byte for byte. `--check` com
"form": "BOLD-LEAD",
"id": "Q51",
"line": 7106,
"refs": 37,
"refs": 38,
"section": "Q50",
"shape": "BULLET+BOLD"
},
@@ -4786,7 +4814,7 @@ The block below is the parse this document renders, byte for byte. `--check` com
"form": "BOLD-LEAD",
"id": "Q52",
"line": 7167,
"refs": 90,
"refs": 92,
"section": "Q51",
"shape": "BULLET+BOLD"
},
@@ -4795,7 +4823,7 @@ The block below is the parse this document renders, byte for byte. `--check` com
"form": "BOLD-LEAD",
"id": "Q53",
"line": 7292,
"refs": 170,
"refs": 173,
"section": "Q52",
"shape": "BULLET+BOLD"
},
@@ -4813,7 +4841,7 @@ The block below is the parse this document renders, byte for byte. `--check` com
"form": "BOLD-LEAD",
"id": "Q65",
"line": 11055,
"refs": 51,
"refs": 52,
"section": "Q63",
"shape": "BULLET+BOLD"
},
@@ -4831,7 +4859,7 @@ The block below is the parse this document renders, byte for byte. `--check` com
"form": "BOLD-LEAD",
"id": "Q100",
"line": 12882,
"refs": 29,
"refs": 31,
"section": "Q99",
"shape": "BULLET+BOLD"
},
@@ -4849,7 +4877,7 @@ The block below is the parse this document renders, byte for byte. `--check` com
"form": "BOLD-LEAD",
"id": "Q102",
"line": 12985,
"refs": 10,
"refs": 11,
"section": "Q100",
"shape": "BULLET+BOLD"
},
@@ -4867,7 +4895,7 @@ The block below is the parse this document renders, byte for byte. `--check` com
"form": "BOLD-LEAD",
"id": "Q104",
"line": 13103,
"refs": 18,
"refs": 19,
"section": "Q101",
"shape": "BULLET+BOLD"
},
@@ -4885,7 +4913,7 @@ The block below is the parse this document renders, byte for byte. `--check` com
"form": "BOLD-LEAD",
"id": "Q106",
"line": 13171,
"refs": 17,
"refs": 18,
"section": "Q105",
"shape": "BULLET+BOLD"
},
@@ -4894,7 +4922,7 @@ The block below is the parse this document renders, byte for byte. `--check` com
"form": "BOLD-LEAD",
"id": "Q107",
"line": 13189,
"refs": 18,
"refs": 19,
"section": "Q106",
"shape": "BULLET+BOLD"
},
@@ -4912,7 +4940,7 @@ The block below is the parse this document renders, byte for byte. `--check` com
"form": "BOLD-LEAD",
"id": "Q109",
"line": 13270,
"refs": 30,
"refs": 31,
"section": "Q104",
"shape": "BULLET+BOLD"
},
@@ -4930,7 +4958,7 @@ The block below is the parse this document renders, byte for byte. `--check` com
"form": "BOLD-LEAD",
"id": "Q111",
"line": 13274,
"refs": 8,
"refs": 9,
"section": "Q110",
"shape": "BULLET+BOLD"
},
@@ -4939,7 +4967,7 @@ The block below is the parse this document renders, byte for byte. `--check` com
"form": "BOLD-LEAD",
"id": "Q112",
"line": 13276,
"refs": 7,
"refs": 8,
"section": "Q111",
"shape": "BULLET+BOLD"
},
@@ -4948,7 +4976,7 @@ The block below is the parse this document renders, byte for byte. `--check` com
"form": "BOLD-LEAD",
"id": "Q113",
"line": 13278,
"refs": 3,
"refs": 4,
"section": "Q112",
"shape": "BULLET+BOLD"
},
@@ -4957,7 +4985,7 @@ The block below is the parse this document renders, byte for byte. `--check` com
"form": "BOLD-LEAD",
"id": "Q114",
"line": 13280,
"refs": 6,
"refs": 7,
"section": "Q113",
"shape": "BULLET+BOLD"
},
@@ -4966,7 +4994,7 @@ The block below is the parse this document renders, byte for byte. `--check` com
"form": "BOLD-LEAD",
"id": "Q115",
"line": 13282,
"refs": 9,
"refs": 10,
"section": "Q114",
"shape": "BULLET+BOLD"
},
@@ -4975,7 +5003,7 @@ The block below is the parse this document renders, byte for byte. `--check` com
"form": "BOLD-LEAD",
"id": "Q116",
"line": 13286,
"refs": 11,
"refs": 12,
"section": "Q105",
"shape": "BULLET+BOLD"
},
@@ -5029,7 +5057,7 @@ The block below is the parse this document renders, byte for byte. `--check` com
"form": "BOLD-LEAD",
"id": "Q122",
"line": 13344,
"refs": 8,
"refs": 9,
"section": "Q121",
"shape": "BULLET+BOLD"
},
@@ -5128,7 +5156,7 @@ The block below is the parse this document renders, byte for byte. `--check` com
"form": "BOLD-LEAD",
"id": "Q135",
"line": 13797,
"refs": 1,
"refs": 2,
"section": "Q114",
"shape": "BULLET+BOLD"
},
@@ -5140,6 +5168,15 @@ The block below is the parse this document renders, byte for byte. `--check` com
"refs": 1,
"section": "Q87",
"shape": "BULLET+BOLD"
},
{
"first_mention": 13847,
"form": "BOLD-LEAD",
"id": "Q137",
"line": 13847,
"refs": 2,
"section": "Q136",
"shape": "BULLET+BOLD"
}
],
"preamble": {
@@ -5147,9 +5184,9 @@ The block below is the parse this document renders, byte for byte. `--check` com
"end_line": 8,
"line": 1
},
"queue_bytes": 2275304,
"queue_lines": 13845,
"queue_sha256": "e8a496a3a633768d86cc52abce9061cf2b8b001da98e31471d4adb4ad906a014",
"queue_bytes": 2286222,
"queue_lines": 13877,
"queue_sha256": "95eb86cddfeead6087c1bc8e637c07d1af85bcbfacf25f69c68388a2d6640689",
"sections": [
{
"bytes": 3139,
+26 -6
View File
@@ -1,5 +1,5 @@
#!/usr/bin/env python3
"""verify.py -- the HOME the index gate did not have: one command, ten legs,
"""verify.py -- the HOME the index gate did not have: one command, eleven legs,
one exit code, and a row per leg so a partial run cannot look like a clean one.
WHY THIS EXISTS
@@ -96,6 +96,13 @@ WHAT IT RUNS -- one row per leg, cheapest first, never in parallel
files; the leg is here because a guard nothing runs is not a
guard -- `afb231d` reverted all ten blobs and no gate leg saw
the three artifacts.
open-set wizard-work/volt/q137-open-set/open_set.py --check
the queue's declared open set, derived from its own records
and graded against a pin: 0 open, 26 ids ever opened, 97
headings / 97 records. A record appended without re-pinning
moves the count and reds this leg. The closure probes
(--closures) are NOT in the leg -- they read other lanes'
modules and cost ~3 s; `bash CHECK-q137` runs all four.
The legs are ordered by cost, and a leg is never skipped because an earlier
one failed: a stale index and a broken selftest are different defects and the
@@ -223,6 +230,10 @@ LEGS = (
"what": "every repair a closed item landed is still the bytes that landed "
"(sha256 pins for Q109/Q120 and the seven Q126 cells) and its "
"cell still runs green"},
{"key": "open-set", "tool": "open_set.py", "slow": False,
"path": os.path.join("wizard-work", "volt", "q137-open-set", "open_set.py"),
"what": "the work queue's declared open set and its record counts, "
"graded against a pin (Q137: 0 open, 26 ever opened)"},
)
# A detail line is a courtesy, not the verdict -- but a verdict with no line
@@ -435,6 +446,13 @@ def leg_argv(key, repo, queue, index, checkin_day=None):
os.path.join(repo, "wizard-work", "spark",
"closed_artifact_guard.py"),
"--root", repo]
if key == "open-set":
# --repo, so the queue graded is the one in the tree under test and not
# the copy beside this tool; --check reads and compares, nothing more.
return [sys.executable,
os.path.join(repo, "wizard-work", "volt", "q137-open-set",
"open_set.py"),
"--repo", repo, "--check"]
raise KeyError(key)
@@ -700,7 +718,9 @@ GREEN_ALL = {"checkin_check.py": 0, "path_claim_check.py": 0,
"selftest_sweep.py": 0, "write_probe.py": 0,
"import_resolve_check.py": 0,
os.path.join("wizard-work", "spark",
"closed_artifact_guard.py"): 0}
"closed_artifact_guard.py"): 0,
os.path.join("wizard-work", "volt", "q137-open-set",
"open_set.py"): 0}
def selftest():
@@ -720,8 +740,8 @@ def selftest():
# 1. ten green stubs -> rc 0
repo = _fixture(os.path.join(td, "c1"), GREEN_ALL)
rc, out = _verify("--repo", repo)
check("1 all ten legs green -> rc 0", rc, 0)
check("1b summary counts the ten legs", "verify: 10 legs, 10 pass, 0 fault, "
check("1 all eleven legs green -> rc 0", rc, 0)
check("1b summary counts the eleven legs", "verify: 11 legs, 11 pass, 0 fault, "
"0 ungradable, 0 skipped" in out, True)
# 2. a stale index is a FAULT, and its own line reaches the row
@@ -778,7 +798,7 @@ def selftest():
check("7 --json writes the rows", [r["key"] for r in obj.get("rows", [])],
["checkin", "path-claims", "reply-headings", "index-current",
"append-audit", "doc-commands", "selftest-sweep", "write-axis",
"import-resolve", "closed-artifacts"])
"import-resolve", "closed-artifacts", "open-set"])
check("7b --json carries the same rc the process returned",
obj.get("rc"), rc)
@@ -822,7 +842,7 @@ def selftest():
check("12 skipped leg is its own count in --json",
obj.get("counts", {}).get("SKIP"), 1)
check("12b and the skipped leg is not counted as a pass",
obj.get("counts", {}).get(PASS), 9)
obj.get("counts", {}).get(PASS), 10)
# 13. the detail line must not contradict the verdict: a row graded
# FAULT beside "0 fatal" is the SILENT failure this gate exists to catch.
+53
View File
@@ -0,0 +1,53 @@
#!/bin/bash
# CHECK-q137 -- four legs over the work queue's declared open set.
#
# selftest 13 cells: 8 parser fixtures over synthetic text, then the pin
# logic itself -- green on the live queue, red on three mutated
# copies (an appended OPEN record, a DONE turned OPEN, a dropped
# heading). A gate that cannot fail is the class this repo keeps
# filing (Q113, Q120); this leg is what proves it can.
# open-set the derived open set and the counts, against their pin.
# order line order is commit order (git blame stamps), so "the last
# record for an id" is "the latest record", not an assumption.
# closures one probe per id that was ever opened: is the defect its record
# describes still present at HEAD? 20 measured, 6 unmeasurable
# from this tree (network, archive, live gate, database).
#
# Exit codes: 0 all legs green, 1 a leg faulted, 2 a leg could not grade.
set -u
HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
TOOL="$HERE/open_set.py"
PY="${PYTHON:-python3}"
rc=0
legs=0
faults=0
run_leg() {
name="$1"; shift
legs=$((legs + 1))
out="$("$PY" "$TOOL" "$@" 2>&1)"
lrc=$?
if [ "$lrc" -eq 0 ]; then
printf ' %-9s PASS rc=0 %s\n' "$name" "$(printf '%s' "$out" | tail -1)"
elif [ "$lrc" -eq 1 ]; then
faults=$((faults + 1))
printf ' %-9s FAULT rc=1 %s\n' "$name" "$(printf '%s' "$out" | tail -1)"
printf '%s\n' "$out" | grep -E '^(FAIL|!)' | head -5
else
faults=$((faults + 1))
printf ' %-9s UNGRADABLE rc=%s %s\n' "$name" "$lrc" "$(printf '%s' "$out" | tail -1)"
fi
[ "$lrc" -eq 0 ] || rc=1
}
run_leg selftest --selftest
run_leg open-set --check
run_leg order --order
run_leg closures --closures
if [ "$rc" -eq 0 ]; then
echo "q137: $legs leg(s), all passed"
else
echo "q137: $legs leg(s), $faults fault(s)"
fi
exit "$rc"
+115
View File
@@ -0,0 +1,115 @@
# Q137 — what the queue says is open, and whether its closures are still there
Lane: volt (workhorse). Measured at `d3c7164` (`WORK-QUEUE.md` blob
`20564d2b7714`, 13,845 lines, 2,275,304 bytes), 2026-10-31.
## The question
`WORK-QUEUE.md` holds every item the troupe ever opened, each closed by a record
appended under it. Nothing derived the set of items that are *open now*: a
reader could `grep OPEN` or `grep DONE` and get a number, and the number would be
wrong in both directions, because both words appear in records about the same id.
So: 26 lines begin a record with `OPEN`. 41 begin one with `DONE`. Which ids are
open at HEAD? Before this artifact, no file in the tree answered that.
## What the file says, derived
queue: 13845 lines, 97 headings/86 ids, 96 records/62 ids, 41 record-only ids
declared open: 0; ids ever opened: 26
`open_set.py --check` (rc 0) derives it: a declaration is a `## Q<n> ` heading or a
`**Q<n> — <STATUS>` record; the last record for an id is its state, and
`OPENED and REPAIRED in the same tick` is a closure, not an opening. **Every one
of the 26 ids that was ever opened has a later record closing it** — the queue
declares no open item at HEAD.
`grep -c '^\*\*Q[0-9]* — OPEN'` → 26 is therefore not a count of open work; it is
a count of openings, all historical. The last human summary of the open set in the
file (`:7789`, "Open set otherwise unchanged: Q52 …, Q53") names two ids that are
closed at `:8517` and `:9869`; it is a dated record and correct as a record, and
it is the last prose sentence that answers the question, which is why this needed
a parser rather than a search.
## The assumption under "last record wins", measured
Line order only means commit order if records are only ever appended. `--order`
blames all 96 record lines in one `git blame --porcelain` pass and compares the
commit timestamps in line order:
record order: 85 commits over 96 records; 0 inversion(s)
Zero inversions. So "the last record for an id" is "the latest record", measured
rather than assumed — and the leg re-measures it on every run, which is what
catches the first out-of-order insert.
## The closures, measured against HEAD
Each probe runs or reads the thing its record cites. 20 of 26 hold; 6 cannot be
settled from this tree.
| Q | state | evidence read at HEAD |
|---|---|---|
| Q100 | REPAIRED | `TEST_NAME='(^|/)(_?test_[^/]*|[^/]*_test)\.py$'` selects 2/2 `_test_*` files |
| Q101 | REPAIRED | `wizard-work/ledger/census.py` compiles |
| Q102 | REPAIRED | `majority([None,None,1])`→`None`; `majority([1,2,3])` raises `NoMajority` |
| Q103 | REPAIRED | `queue_index.py --check docs/queue-index.md` rc 0, 86 ids incl. 3-digit |
| Q104 | REPAIRED | undecodable JSONL rc 2, no traceback |
| Q105 | REPAIRED | `beam/CHECK` runs `run_lane_tests.py` |
| Q106 | REPAIRED | dated sol gate carries 0 `/root` occurrences |
| Q107 | REPAIRED | dir with 2 invalid + 2 valid (one nested): rc 1, valid 2, invalid 2 |
| Q109 | REPAIRED | `check_tools` measures; graded by `test_env_verifiers.py` |
| Q110 | REPAIRED | one `git clone` step, and it is the forge URL |
| Q111 | REPAIRED | 0 mismatches in 60 exhaustive trials incl. zero-length intervals |
| Q112 | REPAIRED | census 97 rows/86 labels vs 97 headings/86 heading ids |
| Q113 | REPAIRED | seeded CSV mutation rc 1, clean tree rc 0 |
| Q115 | REPAIRED | monitor prints `UNREADABLE` and carries the last listing |
| Q117 | REPAIRED | `KNOWN_PROBE` present (10 occurrences) beside `KNOWN_FIXTURE` |
| Q118 | REPAIRED | retry loop present; `attempts=`/`last=` on the failure line |
| Q119 | REPAIRED | classifier names an `unclassified` fallback |
| Q120 | REPAIRED | `DEPENDENCIES` table + 2 `check_package(` call sites |
| Q121 | REPAIRED | per-value absence loop + two-entry mutant cell |
| Q122 | REPAIRED | census CHECK rc 0; the clock leg reads SKIP, not a stale PASS |
| Q51 | UNMEASURED | gate-wide probe window: needs the live gate |
| Q52 | UNMEASURED | archive attribution: needs pipeline logs |
| Q53 | UNMEASURED | digest domain + `state.db`: needs the live database |
| Q65 | UNMEASURED | population over 87 verifiers: the Q87 gate owns it now |
| Q114 | UNMEASURED | provider rows: needs the network |
| Q116 | UNMEASURED | OpenTrain `validThrough`: per-render, needs the network |
20 REPAIRED, 6 UNMEASURED, 0 STILL-OPEN. The probes are pinned: a repair that
regresses, or a file that moves under a probe, reds `--closures` and names the id.
## Instrument
wizard-work/volt/q137-open-set/open_set.py derivation, order, 26 probes
wizard-work/volt/q137-open-set/CHECK-q137 4 legs, 13 selftest cells
tools/verify.py leg 11, `open-set`
`--selftest` is 13 cells: 8 parser fixtures over synthetic text, then the gate
itself — green on the live queue, red on three mutated copies (an appended OPEN
record, a `DONE` turned `OPEN`, a dropped heading). That last group is the point:
a checker that can only print OK is the Q113/Q120 fault class, and this one is
measured refusing to be that.
`bash wizard-work/volt/q137-open-set/CHECK-q137` → 4 legs, all passed, rc 0, 6.3 s.
## Not claimed
- **That the 6 unmeasured closures are wrong.** They are unmeasured; Q51/Q52/Q53
were pipeline/host measurements, Q114/Q116 need provider endpoints, Q65's
population is now the Q87 gate's subject.
- **That a REPAIRED verdict proves the whole record.** Each probe checks the
defect its record names, at the granularity the record states it — no more.
- **That Q112's coverage arithmetic reconciles.** The census reports 86 distinct
labels against 86 heading ids (full heading coverage), and enumerates
record-form ids separately; its closure counts 36 of them, this parser counts
41 ids with a record and no heading. The two numbers are produced from
different populations and this tick did not reconcile them — recorded here as
an open measurement, not filed as a fault against Q112.
- **That nothing else can open an id.** The parser reads `## Q<n>` headings and
`**Q<n> — ` records only. An id opened only in prose is invisible to it (Q53's
own record notes prose naming at `:7246` before its record at `:7292`).
- **That the pin is permanent.** Appending a record moves the counts: the
`open-set` leg reds, and the re-pin is a deliberate edit to `PIN_COUNTS` /
`PIN_OPENED` with the commit that moved it.
+721
View File
@@ -0,0 +1,721 @@
#!/usr/bin/env python3
"""Q137 -- the work queue's declared open set, derived and then measured.
Two questions, kept apart on purpose:
DECLARED which ids does `WORK-QUEUE.md` itself leave open? That is a
textual fact: the last declaration for an id, and whether that
declaration's status word opens or closes it. `--check`
pins the answer so the set cannot drift unnoticed.
MEASURED for each declared-open id, is the defect its record describes
still present at HEAD? Each probe is a named function that
reads or runs the thing the record cites and returns a state
plus the evidence it read. `--closures` pins those states.
A repaired item with no closure record is the defect this file exists for:
the queue says "OPEN", a newcomer takes it, and the work is already done.
The probe table is the measurement; the pin is what makes the next run a
regression test rather than a fresh opinion.
States
REPAIRED the cited defect is gone at HEAD, measured by the probe
PARTIAL one part of the record is satisfied, another is not
STILL-OPEN the cited defect is still there at HEAD
UNMEASURED no probe here can settle it (network, archive, judgement)
Exit codes (tools/ contract)
0 graded clean / pin matches
1 a fault: drift from the pin, or a probe moved
2 could not grade (missing file, unreadable queue, probe crashed)
Stdlib only. Nothing here writes to the tree.
"""
import argparse
import ast
import importlib.util
import io
import json
import os
import re
import shutil
import subprocess
import sys
import tempfile
from contextlib import redirect_stdout
from pathlib import Path
QUEUE = "WORK-QUEUE.md"
# ---------------------------------------------------------------- declarations
EM = "\u2014"
SEP = re.compile(r"^[\u2014\u2013-]{1,2}\s*")
DASHES = (" " + EM + " ", " -- ", " - ")
OPEN_WORDS = {"OPEN", "OPENED", "REOPENED"}
CLOSED_WORDS = {"DONE", "CLOSED", "VERIFIED", "REPAIRED", "ACCEPTED",
"CORRECTION", "ERRATUM", "WITHDRAWN", "RETIRED",
"ANSWERED", "RESOLVED"}
CLOSED_IN_PLACE = re.compile(r"OPENED and REPAIRED|OPENED and CLOSED|"
r"opened and repaired in the same tick")
HEADING = re.compile(r"^(#{2,})\s*Q(\d+)\b([\s\u2014\u2013-].*)?$")
RECORD = re.compile(r"^\*\*Q(\d+)\b\s*[\u2014\u2013-]{1,2}\s*(.*)$")
def classify(tail):
"""State word from the text after the id, or 'OTHER' / 'SECTION'."""
t = tail.strip().lstrip("*").strip()
t = SEP.sub("", t).strip()
word = t.split()[0].strip(".,:;()") if t.split() else ""
word = word.strip("*").strip(".,:;()")
w = word.upper()
if w in OPEN_WORDS:
if CLOSED_IN_PLACE.search(t[:80]):
return "CLOSED"
return "OPEN"
if w in CLOSED_WORDS:
return "CLOSED"
return "OTHER"
def parse(text):
"""-> (decls, state): decls is a list of dicts in line order."""
decls = []
for n, line in enumerate(text.splitlines(), 1):
m = RECORD.match(line)
kind = "record"
if not m:
m = HEADING.match(line)
kind = "heading"
if not m:
continue
qid = int(m.group(2) if kind == "heading" else m.group(1))
tail = m.group(3) if kind == "heading" else m.group(2)
state = "SECTION" if kind == "heading" else classify(tail)
decls.append({
"qid": qid,
"line": n,
"kind": kind,
"state": state,
"word": (tail.lstrip("*").strip() or "")[:100],
})
state = {}
for d in decls:
if d["kind"] == "record":
state[d["qid"]] = d # last record wins, line order
elif d["qid"] not in state:
state[d["qid"]] = {"qid": d["qid"], "line": d["line"],
"kind": "heading", "state": "SECTION",
"word": d["word"]}
return decls, state
def open_ids(state):
return sorted(q for q, d in state.items() if d["state"] == "OPEN")
def opened_ids(decls):
"""Every id that carries at least one OPEN record, closed or not."""
return sorted({d["qid"] for d in decls
if d["kind"] == "record" and d["state"] == "OPEN"})
def counts(decls, state):
heads = [d for d in decls if d["kind"] == "heading"]
recs = [d for d in decls if d["kind"] == "record"]
return {
"headings": len(heads),
"heading_ids": len({d["qid"] for d in heads}),
"records": len(recs),
"record_ids": len({d["qid"] for d in recs}),
"ids": len(state),
"open": len(open_ids(state)),
"opened": len(opened_ids(decls)),
"record_only": len({d["qid"] for d in recs} - {d["qid"] for d in heads}),
}
# ---------------------------------------------------------------- the probes
#
# Each probe takes the repo root and returns (state, evidence). Evidence is
# the thing a reader can check: a file:line, an rc, a count, a sentence.
def read(repo, rel):
return (repo / rel).read_text(encoding="utf-8", errors="replace")
def run(argv, cwd, timeout=120):
try:
p = subprocess.run(argv, cwd=str(cwd), capture_output=True, text=True,
timeout=timeout)
return p.returncode, (p.stdout or "") + (p.stderr or "")
except (OSError, subprocess.TimeoutExpired) as exc:
return None, str(exc)
def _load(path, name):
spec = importlib.util.spec_from_file_location(name, str(path))
mod = importlib.util.module_from_spec(spec)
spec.loader.exec_module(mod)
return mod
def probe_q100(repo):
"""Q100: import_resolve_check's TEST_NAME must select `_test_x.py`."""
src = read(repo, "tools/import_resolve_check.py")
pat = None
for node in ast.walk(ast.parse(src)):
if isinstance(node, ast.Assign):
for t in node.targets:
if isinstance(t, ast.Name) and t.id == "TEST_NAME":
call = node.value
if isinstance(call, ast.Call) and call.args:
try:
pat = ast.literal_eval(call.args[0])
except ValueError:
pat = None
if pat is None:
return "STILL-OPEN", "TEST_NAME not found as a literal in import_resolve_check.py"
rx = re.compile(pat)
samples = ["wizard-work/forge/_test_roundtrip.py",
"wizard-work/forge/test_log.txt",
"wizard-work/forge/_test_roundtrip_refactored.py"]
hit = [s for s in samples[:1] + samples[2:] if rx.search(s)]
return ("REPAIRED" if len(hit) == 2 else "STILL-OPEN",
"TEST_NAME=%r selects %d/2 underscore test files" % (pat, len(hit)))
def probe_q101(repo):
"""Q101: ledger/census.py must at least parse."""
path = repo / "wizard-work/ledger/census.py"
try:
compile(path.read_text(encoding="utf-8"), str(path), "exec")
except (OSError, SyntaxError) as exc:
return "STILL-OPEN", "census.py will not compile: %s" % (exc,)
return "REPAIRED", "census.py compiles (compile() at %s)" % path.name
def probe_q102(repo):
"""Q102: three outcomes must be three channels."""
mod = _load(repo / "wizard-work/beam/majority_element.py", "q137_maj")
try:
got = mod.majority([None, None, 1])
none_majority = got is None
except Exception: # noqa: BLE001
none_majority = False
raised = False
try:
mod.majority([1, 2, 3])
except Exception as exc: # noqa: BLE001
raised = type(exc).__name__ == "NoMajority"
return ("REPAIRED" if none_majority and raised else "STILL-OPEN",
"majority([None,None,1])->None=%s; majority([1,2,3]) raises "
"NoMajority=%s" % (none_majority, raised))
def probe_q103(repo):
"""Q103: queue_index must see ids of any width."""
rc, out = run([sys.executable, "tools/queue_index.py",
"--check", "docs/queue-index.md"], repo)
ok = rc == 0
return ("REPAIRED" if ok else "STILL-OPEN",
"queue_index --check docs/queue-index.md rc=%s; %s"
% (rc, out.strip().splitlines()[-1][:120] if out.strip() else ""))
def probe_q104(repo):
"""Q104: undecodable JSONL must be a typed exit 2, no traceback."""
tmp = Path(tempfile.mkdtemp(prefix="q137-q104-"))
try:
bad = tmp / "bad.jsonl"
bad.write_bytes(b'{"a": 1}\n\xff\xfe not utf-8\n')
rc, out = run([sys.executable, "wizard-work/beam/jsonl_validate.py",
str(bad)], repo)
finally:
shutil.rmtree(tmp, ignore_errors=True)
typed = rc == 2 and "Traceback" not in out
return ("REPAIRED" if typed else "STILL-OPEN",
"undecodable input rc=%s traceback=%s"
% (rc, "Traceback" in out))
def probe_q105(repo):
"""Q105/Q128: the beam gate must collect both test styles."""
txt = read(repo, "wizard-work/beam/CHECK")
ok = "run_lane_tests.py" in txt
return ("REPAIRED" if ok else "STILL-OPEN",
"beam/CHECK runs run_lane_tests.py=%s (%d lines)"
% (ok, len(txt.splitlines())))
def probe_q106(repo):
"""Q106: the dated sol gate must not pin an absolute host root."""
txt = read(repo, "wizard-work/sol/CHECK-2026-09-28")
n = txt.count("/root")
return ("REPAIRED" if n == 0 else "STILL-OPEN",
"CHECK-2026-09-28 /root occurrences=%d" % n)
def probe_q107(repo):
"""Q107: --dir must not exit the number of invalid files."""
tmp = Path(tempfile.mkdtemp(prefix="q137-q107-"))
try:
(tmp / "ok.json").write_text('{"a": 1}', encoding="utf-8")
(tmp / "bad1.json").write_text("{nope", encoding="utf-8")
(tmp / "bad2.json").write_text("{nope", encoding="utf-8")
(tmp / "sub").mkdir()
(tmp / "sub" / "deep.json").write_text('{"b": 2}', encoding="utf-8")
rc, out = run([sys.executable, "wizard-work/spark/json-validator.py",
str(tmp)], repo)
finally:
shutil.rmtree(tmp, ignore_errors=True)
valid = sum(1 for ln in out.splitlines() if ln.startswith("VALID:"))
invalid = sum(1 for ln in out.splitlines() if ln.startswith("INVALID:"))
ok = rc == 1 and (valid, invalid) == (2, 2)
return ("REPAIRED" if ok else "STILL-OPEN",
"dir with 2 invalid + 2 valid (one nested): rc=%s valid=%d invalid=%d"
% (rc, valid, invalid))
def probe_q109(repo):
"""Q109: snippet.py's tool check must measure, not assume."""
txt = read(repo, "wizard-work/spark/snippet.py")
has_fn = "def check_tools" in txt
returns_measurement = "available, error = check_tools" in txt
graded = (repo / "wizard-work/spark/test_env_verifiers.py").is_file()
ok = has_fn and returns_measurement and graded
return ("REPAIRED" if ok else "STILL-OPEN",
"check_tools=%s, call site=%s, graded by test_env_verifiers=%s"
% (has_fn, returns_measurement, graded))
def probe_q110(repo):
"""Q110: the QUICKSTART's clone step must point at a live repository."""
txt = read(repo, "wizard-work/quill/QUICKSTART.md")
clones = re.findall(r"^git clone (\S+)", txt, re.M)
live = [u for u in clones if "forge.alexanderwhitestone.com" in u]
ok = len(clones) == 1 and len(live) == 1
return ("REPAIRED" if ok else "STILL-OPEN",
"%d git clone step(s): %s" % (len(clones), clones[:3]))
def probe_q111(repo):
"""Q111: zero-length intervals must not skew the optimum."""
mod = _load(repo / "wizard-work/beam/weighted_interval_scheduling.py",
"q137_wis")
fn = getattr(mod, "weighted_interval_scheduling")
def ok_pair(sel):
for i in range(len(sel)):
for j in range(i + 1, len(sel)):
a, b = sel[i], sel[j]
if min(a[1], b[1]) - max(a[0], b[0]) > 0:
return False
return True
bad = 0
trials = 0
import random
rng = random.Random(1371)
for _ in range(60):
n_try = rng.randint(1, 4)
iv = [[rng.randint(0, 3), rng.randint(0, 3), rng.randint(1, 4)]
for _ in range(n_try)]
iv = [[min(a, b), max(a, b), w] for a, b, w in iv]
got = fn(iv)
best = 0
m = len(iv)
for mask in range(1 << m):
sel = [iv[i] for i in range(m) if mask >> i & 1]
if ok_pair(sel) and sum(x[2] for x in sel) > best:
best = sum(x[2] for x in sel)
trials += 1
if got != best:
bad += 1
return ("REPAIRED" if bad == 0 and trials else "STILL-OPEN",
"zero-length included: %d mismatches in %d exhaustive trials"
% (bad, trials))
def probe_q112(repo):
"""Q112: the census must see every heading, and every record."""
rc, out = run([sys.executable,
"wizard-work/ledger/workqueue-census-v2/CHECK"], repo)
line = ""
for ln in out.splitlines():
if "distinct labels" in ln:
line = ln.strip()
if rc != 0 or not line:
return "STILL-OPEN", "census CHECK rc=%s, no summary line" % rc
m = re.search(r"\((\d+) rows, (\d+) distinct labels", line)
text = read(repo, QUEUE)
decls, state = parse(text)
c = counts(decls, state)
rows, labels = (int(m.group(1)), int(m.group(2))) if m else (0, 0)
covered = rows >= c["headings"] and labels >= c["heading_ids"]
return ("REPAIRED" if covered else "STILL-OPEN",
"census %d rows/%d labels vs %d headings/%d heading ids; "
"%d record-only ids are enumerated by the extractor, not as rows"
% (rows, labels, c["headings"], c["heading_ids"], c["record_only"]))
def probe_q113(repo):
"""Q113: the roster gate must fail on a seeded mutation."""
led = "wizard-work/ledger"
tmp = Path(tempfile.mkdtemp(prefix="q137-q113-"))
try:
dst = tmp / led
dst.mkdir(parents=True)
for name in ("wizards.csv", "wizards.manifest.json"):
shutil.copy2(repo / led / name, dst / name)
man = json.loads((dst / "wizards.manifest.json").read_text(encoding="utf-8"))
src_rel = man.get("source", "")
if src_rel:
(tmp / src_rel).parent.mkdir(parents=True, exist_ok=True)
shutil.copy2(repo / src_rel, tmp / src_rel)
csv = (dst / "wizards.csv").read_text(encoding="utf-8")
(dst / "wizards.csv").write_text(csv.replace("Timmy", "GARBAGE NAME"),
encoding="utf-8")
bad_rc, _ = run([sys.executable, led + "/verify_wizards.py",
"--root", str(tmp)], repo)
good_rc, _ = run([sys.executable, led + "/verify_wizards.py",
"--root", str(repo)], repo)
finally:
shutil.rmtree(tmp, ignore_errors=True)
ok = bad_rc == 1 and good_rc == 0
return ("REPAIRED" if ok else "STILL-OPEN",
"seeded mutation rc=%s, clean tree rc=%s" % (bad_rc, good_rc))
def probe_q115(repo):
"""Q115: an unreadable folder must not read as a mass deletion."""
txt = Path("/root/.hermes/scripts/troupe_pipe_monitor.py").read_text(
encoding="utf-8", errors="replace")
ok = "UNREADABLE" in txt and "carried" in txt
return ("REPAIRED" if ok else "UNMEASURED",
"monitor separates UNREADABLE=%s and carries the listing=%s"
% ("UNREADABLE" in txt, "carried" in txt))
def probe_q117(repo):
"""Q117: an invented probe value must be data, not a recovery."""
txt = read(repo, "wizard-work/zeph/q60_enforce.py")
ok = "KNOWN_PROBE" in txt and txt.count("KNOWN_PROBE") >= 3
return ("REPAIRED" if ok else "STILL-OPEN",
"q60_enforce.py KNOWN_PROBE occurrences=%d"
% txt.count("KNOWN_PROBE"))
def probe_q118(repo):
"""Q118: a failed listing must be retried and report attempts/last."""
txt = Path("/root/.hermes/scripts/troupe_pipe_monitor.py").read_text(
encoding="utf-8", errors="replace")
retry = "for attempt in range(1, tries + 1)" in txt
fields = "attempts=" in txt and "last=" in txt
return ("REPAIRED" if retry and fields else "STILL-OPEN",
"retry loop=%s, attempts=/last= fields=%s" % (retry, fields))
def probe_q119(repo):
"""Q119: an unmatched demand must not be silently 'info'."""
txt = read(repo, "wizard-work/sol/classify.py")
ok = "unclassified" in txt and "Fallback" in txt
return ("REPAIRED" if ok else "STILL-OPEN",
"classify.py names an unclassified fallback in its header=%s" % ok)
def probe_q120(repo):
"""Q120: the env check must import real dependencies and report versions."""
txt = read(repo, "wizard-work/spark/python-env-check.py")
decl = "DEPENDENCIES" in txt
called = len(re.findall(r"check_package\(", txt)) >= 2
return ("REPAIRED" if decl and called else "STILL-OPEN",
"DEPENDENCIES table=%s, check_package call sites=%d"
% (decl, len(re.findall(r"check_package\(", txt))))
def probe_q121(repo):
"""Q121: fixture absence must be asserted per value, not over a join."""
txt = read(repo, "wizard-work/zeph/q60_enforce.py")
per_value = "for value in KNOWN_FIXTURE.values()" in txt or \
"KNOWN_FIXTURE.values()" in txt
mutant = "two_entry" in txt
ok = per_value and mutant
return ("REPAIRED" if ok else "STILL-OPEN",
"per-value absence=%s, two-entry mutant cell=%s"
% (per_value, mutant))
def probe_q122(repo):
"""Q122: the census CHECK must not gate on a wall clock."""
rc, out = run([sys.executable,
"wizard-work/ledger/workqueue-census-v2/CHECK"], repo)
skipped = "SKIP" in out.upper()
return ("REPAIRED" if rc == 0 else "STILL-OPEN",
"census CHECK rc=%s, clock leg reads %s"
% (rc, "SKIP" if skipped else "graded"))
def unmade(reason):
def probe(repo):
return "UNMEASURED", reason
return probe
PROBES = {
100: probe_q100, 101: probe_q101, 102: probe_q102, 103: probe_q103,
104: probe_q104, 105: probe_q105, 106: probe_q106, 107: probe_q107,
109: probe_q109, 110: probe_q110, 111: probe_q111, 112: probe_q112,
113: probe_q113, 115: probe_q115, 117: probe_q117, 118: probe_q118,
119: probe_q119, 120: probe_q120, 121: probe_q121, 122: probe_q122,
51: unmade("gate-wide probe window: needs the live gate, not a file read"),
52: unmade("archive attribution: needs pipeline logs this tree does not hold"),
53: unmade("digest domain + state.db: needs the live database"),
65: unmade("population claim over 87 verifiers; the Q87 gate owns it now"),
114: unmade("free-tier rows contradict six provider endpoints: network"),
116: unmade("OpenTrain validThrough is per-render: network, time-lapsed"),
}
PIN_OPEN = []
PIN_OPENED = [51, 52, 53, 65, 100, 101, 102, 103, 104, 105, 106, 107, 109,
110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122]
PIN_COUNTS = {"headings": 97, "heading_ids": 86, "records": 97,
"record_ids": 63, "ids": 128, "open": 0, "opened": 26,
"record_only": 42}
PIN_STATE = {
100: "REPAIRED", 101: "REPAIRED", 102: "REPAIRED", 103: "REPAIRED",
104: "REPAIRED", 105: "REPAIRED", 106: "REPAIRED", 107: "REPAIRED",
109: "REPAIRED", 110: "REPAIRED", 111: "REPAIRED", 112: "REPAIRED",
113: "REPAIRED", 115: "REPAIRED", 117: "REPAIRED", 118: "REPAIRED",
119: "REPAIRED", 120: "REPAIRED", 121: "REPAIRED", 122: "REPAIRED",
51: "UNMEASURED", 52: "UNMEASURED", 53: "UNMEASURED", 65: "UNMEASURED",
114: "UNMEASURED", 116: "UNMEASURED",
}
# ---------------------------------------------------------------- the selftest
FIXTURES = [
("open-then-done",
"**Q5 \u2014 OPEN (a).** body\n**Q5 \u2014 DONE at `abc`.**\n", 5, "CLOSED"),
("opened-and-repaired-in-place",
"**Q7 \u2014 OPENED and REPAIRED in the same tick (volt).** body\n",
7, "CLOSED"),
("open-with-no-close",
"**Q9 \u2014 OPEN (pipe).** body\n", 9, "OPEN"),
("heading-only",
"## Q11 \u2014 A section title\nbody\n", 11, "SECTION"),
("heading-then-record",
"## Q13 \u2014 A section title\nbody\n**Q13 \u2014 DONE.**\n", 13, "CLOSED"),
("bold-not-a-declaration",
"**Q15 measured.** prose, no dash\n", 15, None),
("width-boundary",
"**Q1000 \u2014 OPEN (x).**\n**Q100 \u2014 DONE.**\n", 100, "CLOSED"),
("reopened-after-done",
"**Q17 \u2014 DONE.**\n**Q17 \u2014 REOPENED (pipe).**\n", 17, "OPEN"),
]
def graded(repo, text):
"""mode_check's rc with its output swallowed -- for the mutant cells."""
buf = io.StringIO()
try:
with redirect_stdout(buf):
return mode_check(repo, text)
finally:
buf.close()
def selftest():
cells = []
for name, text, qid, want in FIXTURES:
_, state = parse(text)
got = state.get(qid, {}).get("state")
cells.append((name, got == want, "got=%r want=%r" % (got, want)))
repo, text = load_repo(str(Path(__file__).resolve().parents[3]))
if repo is not None and text is not None:
once = parse(text)
cells.append(("parse-is-deterministic", once == parse(text), ""))
cells.append(("gate-green-control", graded(repo, text) == 0, "rc"))
cells.append(("gate-new-open-id",
graded(repo, text + "\n**Q999 \u2014 OPEN (x).**\n") == 1,
"rc"))
cells.append(("gate-done-turned-open",
graded(repo, text.replace("**Q117 \u2014 DONE",
"**Q117 \u2014 OPEN", 1)) == 1,
"rc"))
cells.append(("gate-heading-dropped",
graded(repo, re.sub(r"(?m)^## Q5 \u2014.*\n", "", text,
count=1)) == 1, "rc"))
bad = [c for c in cells if not c[1]]
for name, ok, detail in cells:
print("%-28s %s %s" % (name, "PASS" if ok else "FAIL", detail))
print("SELFTEST %s (%d cells, %d failed)"
% ("OK" if not bad else "FAILED", len(cells), len(bad)))
return 0 if not bad else 1
def parse_text_roundtrip():
return "**Q1 \u2014 OPEN (x).**\n"
# ---------------------------------------------------------------- the modes
def load_repo(arg):
root = Path(arg).resolve()
q = root / QUEUE
if not q.is_file():
print("cannot grade: no %s under %s" % (QUEUE, root))
return None, None
return root, q.read_text(encoding="utf-8")
def mode_check(repo, text):
decls, state = parse(text)
c = counts(decls, state)
got = open_ids(state)
print("queue: %d lines, %d headings/%d ids, %d records/%d ids, "
"%d record-only ids" % (len(text.splitlines()), c["headings"],
c["heading_ids"], c["records"],
c["record_ids"], c["record_only"]))
print("declared open: %d; ids ever opened: %d" % (len(got), c["opened"]))
faults = []
for key in sorted(PIN_COUNTS):
if c[key] != PIN_COUNTS[key]:
faults.append("count %s moved %d -> %d" % (key, PIN_COUNTS[key], c[key]))
if got != PIN_OPEN:
added = [q for q in got if q not in PIN_OPEN]
gone = [q for q in PIN_OPEN if q not in got]
faults.append("open set moved: +%s -%s" % (added, gone))
if opened_ids(decls) != PIN_OPENED:
faults.append("the set of ever-opened ids moved")
for f in faults:
print("FAIL %s" % f)
print("CHECK %s" % ("OK: 0 open, 26 ever opened, counts match the pin"
if not faults else "%d fault(s)" % len(faults)))
return 0 if not faults else 1
def mode_order(repo, text):
"""Line order must be commit order, or 'last record' is not 'latest'."""
decls, _ = parse(text)
recs = [d for d in decls if d["kind"] == "record"]
rc, out = run(["git", "blame", "--porcelain", "--", QUEUE], repo)
if rc != 0 or not out:
print("cannot grade order: git blame failed")
return 2
by_line = {}
commit = None
for ln in out.splitlines():
m = re.match(r"^([0-9a-f]{40}) \d+ (\d+)(?: \d+)?$", ln)
if m:
commit = m.group(1)
by_line[int(m.group(2))] = commit
times = {}
stamps = []
pending = 0
for d in recs:
c = by_line.get(d["line"])
if c is None:
print("cannot grade order: no blame entry for line %d" % d["line"])
return 2
if set(c) == {"0"}:
pending += 1 # appended, not yet committed
continue
if c not in times:
trc, tout = run(["git", "show", "-s", "--format=%ct", c], repo)
if trc != 0:
print("cannot grade order: no timestamp for %s" % c[:12])
return 2
times[c] = int(tout.strip())
stamps.append((d["line"], times[c], c))
if not stamps:
print("cannot grade order: no committed record lines")
return 2
bad = []
for (l1, t1, c1), (l2, t2, c2) in zip(stamps, stamps[1:]):
if t2 < t1:
bad.append("line %d (%s) is newer than line %d (%s)"
% (l2, c2[:8], l1, c1[:8]))
print("record order: %d commits over %d committed records (%d pending "
"commit); %d inversion(s)"
% (len(times), len(stamps), pending, len(bad)))
for b in bad[:5]:
print("FAIL %s" % b)
print("CHECK %s" % ("OK: line order is commit order, so 'last record' is "
"'latest'" if not bad else "%d inversion(s)" % len(bad)))
return 0 if not bad else 1
def mode_table(repo, text):
decls, state = parse(text)
for q in opened_ids(decls):
d = state[q]
print("Q%-4d %-6s :%-6d %s" % (q, d["state"], d["line"], d["word"][:90]))
return 0
def mode_closures(repo, text):
decls, state = parse(text)
want = opened_ids(decls)
if want != PIN_OPENED:
print("cannot grade closures: the ever-opened set moved, run --check")
return 2
faults = []
rows = []
for q in want:
probe = PROBES.get(q)
if probe is None:
rows.append((q, "UNMEASURED", "no probe registered"))
continue
try:
got, ev = probe(repo)
except Exception as exc: # noqa: BLE001
print("Q%-4d UNGRADABLE %s: %s" % (q, type(exc).__name__, exc))
return 2
rows.append((q, got, ev))
tally = {}
for q, got, ev in rows:
tally[got] = tally.get(got, 0) + 1
pin = PIN_STATE.get(q)
mark = " " if got == pin else "!"
print("%sQ%-4d %-10s %s" % (mark, q, got, ev))
if got != pin:
faults.append("Q%d moved %s -> %s" % (q, pin, got))
print("closure tally: %s" % ", ".join("%s %d" % kv for kv in sorted(tally.items())))
for f in faults:
print("FAIL %s -- re-pin with the commit that moved it" % f)
print("CHECK %s" % ("OK: %d ever-opened ids, %d measured, states match the pin"
% (len(want), len(rows) - tally.get("UNMEASURED", 0))
if not faults else "%d fault(s)" % len(faults)))
return 0 if not faults else 1
def main(argv=None):
ap = argparse.ArgumentParser(description=__doc__.splitlines()[0])
ap.add_argument("--repo", default=str(Path(__file__).resolve().parents[3]))
ap.add_argument("--check", action="store_true", help="grade the declared set")
ap.add_argument("--closures", action="store_true", help="grade measured states")
ap.add_argument("--order", action="store_true", help="line order vs commit order")
ap.add_argument("--table", action="store_true", help="print the open set")
ap.add_argument("--selftest", action="store_true", help="parser cells")
args = ap.parse_args(argv)
if args.selftest:
return selftest()
repo, text = load_repo(args.repo)
if repo is None:
return 2
if args.table:
return mode_table(repo, text)
if args.order:
return mode_order(repo, text)
if args.closures:
return mode_closures(repo, text)
return mode_check(repo, text)
if __name__ == "__main__":
sys.exit(main())