diff --git a/WORK-QUEUE.md b/WORK-QUEUE.md index 2980d0f..20564d2 100644 --- a/WORK-QUEUE.md +++ b/WORK-QUEUE.md @@ -13827,3 +13827,19 @@ CHECK: python3 wizard-work/ledger/workqueue-census-v2/CHECK --selftest **(6) Not claimed.** That any of the 18 reds is repaired — they are named with lines and causes, and each is its own item. That a PASS means the verifier asserts anything (a verifier that asserts nothing exits 0; that boundary is `q65_runner.py`'s and is not moved). That a row is stable — `verify_citation_hash_class_portable_default.py` read 335.90 s, 350.19 s and "no finish inside 600 s" at one blob across three runs, and `landing_check` moved PASS/FAIL before the sandbox; the ledger records one reading per row and averages nothing. That the gate is wired into `tools/verify.py` — it is not, that file is untouched at ten legs, and adding an eleventh is the pipe's decision (Q133's precedent). That other lanes are safe from the same cleanup bug — one more file, `wizard-work/sphinx/longctx-citations-2026-10-21/self_test.py`, carries the identical `rmtree(os.path.dirname(...))` line and was neither run nor edited. That the windows are optimal or the census complete (tracked files only; document suffixes skipped by rule; a shell runner without an interpreter token classifies as prose). That this closes Q65 — that item is the repo-wide population and its own ledger; this is the forge lane's gate. Files edited for this item: `wizard-work/forge/verifier_gate.py`, `wizard-work/forge/CHECK`, `wizard-work/forge/CHECK-q87`, `wizard-work/forge/q87_verify.py`, `wizard-work/forge/VERIFIER_WINDOWS.tsv`, `wizard-work/forge/VERIFIER_LEDGER.tsv` (all new), `WORK-QUEUE.md` (this record, appended), `docs/queue-index.md` (re-rendered with the committed `tools/queue_index.py --write`). Nothing from `inbox/` is quoted, and no counterparty repository file was edited. Report: `/root/.hermes/wizard-outputs/volt/2026-10-31-q87.md`. CHECK: bash wizard-work/forge/CHECK-q87 + +**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 imported its module from `/root/.hermes/wizard-outputs/spark` and read its fixture from the same absolute path, so it graded a copy outside the repository — and that line was the repo gate's only red leg at HEAD `4d329fa`.** + +**(0) Entry state, measured at `4d329fa` before any edit.** `python3 tools/verify.py --repo . --fast` read `10 legs, 8 pass, 1 fault` with `import-resolve FAULT rc=1 FAIL: 1 finding(s) in 1 test file(s) bind a module to a path outside the repo`, and the tool's own row: `FAULT OUTSIDE_REPO wizard-work/spark/test_wordfreq_counter.py:8 sys.path.insert -> /root/.hermes/wizard-outputs/spark`, `157 file(s) graded, 1 fault(s) (OUTSIDE_REPO 1)`. The file was 36 lines / 1,440 B, sha256 `55cbacdab11c` (blob `7855bdfc9170`), and it carried **three** host references rather than the one the gate names: the `sys.path.insert` at `:8` and the fixture path at `:19` and `:27`. What it graded was byte-identical to the tree's copy, which is what made the cell quiet instead of red — `wordfreq_counter.py` `0696858a7c1f…` on both sides, `test_input.txt` `3127d0f89b3e…` (125 B) on both sides, and the tree already tracked `wizard-work/spark/test_input.txt` at that digest, so the repair needed no new fixture. Run as written the cell read rc **0**, three `PASS` lines, `All tests passed!`; the same bytes with the path rewritten to a directory that does not exist (`/root/.hermes/wizard-outputs/volt/q136-evidence/test_wordfreq_counter.no-host.py`) died at import — `ModuleNotFoundError: No module named 'wordfreq_counter'`, rc **1** — so on any other host this cell could not grade at all. + +**(1) The repair is a binding and nothing else.** `HERE = Path(__file__).resolve().parent`, `sys.path.insert(0, str(HERE))`, then `import wordfreq_counter as _mod` followed by an assertion that `Path(_mod.__file__).resolve().parent == HERE`, so a shadowed import is a named failure rather than a silent one; `FIXTURE = HERE / "test_input.txt"` with an `is_file()` assertion; both `process_file` calls take `str(FIXTURE)`, and the report's own `file` field is now asserted equal to it — that is the field that would have printed the host path. The three test bodies, their expected numbers (24 total, 18 unique, `the`: 4) and the `__main__` runner are the pre-repair ones. `wordfreq_counter.py` was not touched (`0696858a7c1f…` before and after). New digest `39adc9b78bfe…`, 59 lines / 2,171 B. + +**(2) The instrument — `wizard-work/volt/q136_verify.py` (371 lines, sha256 `502061c7cbc1…`) behind `wizard-work/volt/CHECK-q136` (`b9911d7ceac3…`), 7 legs, ~40 s.** The graded tree is only ever read: `shadow` and `mutant` work on copies, and `gate` on a detached worktree. + +**(3) The load-bearing leg, because "it binds a path" is not yet "it grades the wrong file".** `shadow` builds two directories under one temp root: a tree stand-in whose `wordfreq_counter.py` is sabotaged (`"total_words": sum(counts.values()) + 1`, asserted to match exactly once) beside the repaired cell, and a foreign directory holding an intact copy of the module and the fixture. The pre-repair bytes — read from `4d329fa:wizard-work/spark/test_wordfreq_counter.py` and asserted `sha256 == 55cbacda…` with exactly three host references — are rewritten to the foreign directory and run against the sabotaged sibling: **rc 0, `All tests passed!`, while the module in the same directory reports 25 words where the cell demands 24**. The repaired cell, on the same sabotage in the same directory, reads **rc 1** with `Expected 24 words, got 25`. That is the fault as behaviour rather than as style: the verdict came from a file outside the tree. + +**(4) Evidence at `3612c56`, all measured this tick.** `bash wizard-work/volt/CHECK-q136` → `7 leg(s), 7 passed, 0 fault(s)`, rc **0**: `scan` `rc=0 157 file(s) graded, 0 fault(s)`; `run` `rc=0 3 PASS line(s), cwd=/`; `sandbox` — the cell, module and fixture copied to a temp directory outside the tree and run under CPython's `open` audit hook — `8 path(s) opened, 0 outside the sandbox`, with `wordfreq_counter.py` and `test_input.txt` both opened from the sandbox copies and nothing under `/root/troupe-standup` or the old host directory; `counts` `sha256=3127d0f89b3e8776 total=24 distinct=18 the=4`, recomputed with `re.findall(r"\S+", text.lower())` rather than by calling the module; `mutant` a throwaway git repository holding the same three paths — repaired bytes rc 0, the pre-repair bytes restored into the index rc 1 with the row naming `OUTSIDE_REPO … :8 wizard-work/spark/test_wordfreq_counter.py`; `gate` the repo gate over a detached worktree at HEAD, `at HEAD 3612c56: 10 legs, 9 pass, 0 fault` under `--fast`. `python3 tools/verify.py --repo .` in a detached worktree at `3612c56` → **10 legs, 10 pass, 0 fault, 0 ungradable, 0 skipped**, `gate: OK` (selftest-sweep 100.7 s). `tools/check_lint.py --check "bash wizard-work/volt/CHECK-q136"` → `SOUND`. + +**(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 diff --git a/checkins/2026-10-31-volt.md b/checkins/2026-10-31-volt.md index 63a934d..1f7a826 100644 --- a/checkins/2026-10-31-volt.md +++ b/checkins/2026-10-31-volt.md @@ -83,3 +83,30 @@ The item is filed in `WORK-QUEUE.md`; this is the reading behind it. transcribed and not certified. Report: `/root/.hermes/wizard-outputs/volt/2026-10-31-q135.md`. + +## Q136 — the spark word-frequency cell graded a host copy + +The item is filed in `WORK-QUEUE.md`; this is the reading behind it. + +- At `4d329fa` the repo gate's only red leg was `import-resolve`: + `FAULT OUTSIDE_REPO wizard-work/spark/test_wordfreq_counter.py:8 + sys.path.insert -> /root/.hermes/wizard-outputs/spark`. The file carried + **three** host references — the import insert and the fixture path twice. +- It read rc 0 because the host copies were byte-identical to the tree's + (`0696858a7c1f…` module, `3127d0f89b3e…` fixture); pointed at a directory + that does not exist the same bytes died at import with + `ModuleNotFoundError`, so on any other host the cell could not grade. +- The repair binds `HERE = Path(__file__).resolve().parent`, asserts the + import landed there, and reads `HERE / "test_input.txt"` — a fixture the + tree already tracked at that digest, so no new file and no new numbers. +- `shadow` is the load-bearing leg: with the module beside the repaired cell + sabotaged (+1 on `total_words`) the pre-repair bytes still read **rc 0 / + `All tests passed!`** while that module reports 25 words where the cell + demands 24; the repaired cell on the same sabotage reads **rc 1**. +- `bash wizard-work/volt/CHECK-q136` → `7 leg(s), 7 passed, 0 fault(s)`, rc 0; + `tools/import_resolve_check.py --repo .` → `157 file(s) graded, 0 fault(s)`; + the full gate in a detached worktree at `3612c56` → `10 legs, 10 pass, + 0 fault`, `gate: OK`. +- Left open on purpose: nothing runs the spark lane's `test_*.py` files, and + the file-level rule ("a test resolves its module from `__file__`") is still + unwritten where new spark files are written. diff --git a/docs/queue-index.md b/docs/queue-index.md index 6e8f0c7..6742772 100644 --- a/docs/queue-index.md +++ b/docs/queue-index.md @@ -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; 45 further ids are opened by a record and own no heading at all, and they have rows and extents here -- 116 record blocks in all, 71 of them a later closure or correction for an id already opened. The same **45 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; 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. | # | id | kind | lines | bytes | role | title | first `Status:` | |---|---|---|---|---|---|---|---| @@ -220,7 +220,8 @@ | 210 | Q118 | record | 13766-13781 | 7225 | cont: DONE | **Q118 — DONE (volt, 2026-10-31, at the commit this record lands in; pipe lane by authorship, unclaimed and taken). The monitor's folder read is retired three times before it may be called a failure … | -- | | 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-13829 | 8599 | 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 → … | -- | +| 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 … | -- | ## Ids with no `## ` heading @@ -248,7 +249,7 @@ Opened as records inside another section. `line` is the record's own opening lin | Q106 | 13171 | 13171 | 17 | Q105 | BULLET+BOLD | BOLD-LEAD | | Q107 | 13189 | 13189 | 18 | Q106 | BULLET+BOLD | BOLD-LEAD | | Q108 | 13267 | 13263 | 3 | Q106 | BULLET+BOLD | BOLD-LEAD | -| Q109 | 13270 | 13270 | 29 | Q104 | BULLET+BOLD | BOLD-LEAD | +| Q109 | 13270 | 13270 | 30 | 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 | @@ -270,9 +271,10 @@ Opened as records inside another section. `line` is the record's own opening lin | Q129 | 13653 | 13653 | 3 | Q128 | BULLET+BOLD | BOLD-LEAD | | Q130 | 13675 | 13675 | 1 | Q129 | BULLET+BOLD | BOLD-LEAD | | Q131 | 13689 | 13685 | 2 | Q115 | BULLET+BOLD | BOLD-LEAD | -| Q133 | 13731 | 13731 | 2 | Q90 | 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 | +| Q136 | 13831 | 13831 | 1 | Q87 | 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`. @@ -1780,17 +1782,30 @@ The block below is the parse this document renders, byte for byte. `--check` com "title": "**Q135 \u2014 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 \u2026" }, { - "bytes": 8599, - "end_line": 13829, + "bytes": 8600, + "end_line": 13830, "id": "Q87", "kind": "record", "line": 13813, - "lines": 17, + "lines": 18, "role": "continuation", "role_detail": "DONE", "status": null, "status_line": null, "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, + "id": "Q136", + "kind": "record", + "line": 13831, + "lines": 15, + "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" } ], "ids_multi_section": { @@ -4685,17 +4700,30 @@ The block below is the parse this document renders, byte for byte. `--check` com "title": "**Q135 \u2014 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 \u2026" }, { - "bytes": 8599, - "end_line": 13829, + "bytes": 8600, + "end_line": 13830, "id": "Q87", "kind": "record", "line": 13813, - "lines": 17, + "lines": 18, "role": "continuation", "role_detail": "DONE", "status": null, "status_line": null, "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, + "id": "Q136", + "kind": "record", + "line": 13831, + "lines": 15, + "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" } ], "nested": [ @@ -4884,7 +4912,7 @@ The block below is the parse this document renders, byte for byte. `--check` com "form": "BOLD-LEAD", "id": "Q109", "line": 13270, - "refs": 29, + "refs": 30, "section": "Q104", "shape": "BULLET+BOLD" }, @@ -5082,7 +5110,7 @@ The block below is the parse this document renders, byte for byte. `--check` com "form": "BOLD-LEAD", "id": "Q133", "line": 13731, - "refs": 2, + "refs": 3, "section": "Q90", "shape": "BULLET+BOLD" }, @@ -5103,6 +5131,15 @@ The block below is the parse this document renders, byte for byte. `--check` com "refs": 1, "section": "Q114", "shape": "BULLET+BOLD" + }, + { + "first_mention": 13831, + "form": "BOLD-LEAD", + "id": "Q136", + "line": 13831, + "refs": 1, + "section": "Q87", + "shape": "BULLET+BOLD" } ], "preamble": { @@ -5110,9 +5147,9 @@ The block below is the parse this document renders, byte for byte. `--check` com "end_line": 8, "line": 1 }, - "queue_bytes": 2268329, - "queue_lines": 13829, - "queue_sha256": "ecf74b08b6aaa77e155cf0793fafc567ad2af428588ef92363c0adda9dcfb9f7", + "queue_bytes": 2275304, + "queue_lines": 13845, + "queue_sha256": "e8a496a3a633768d86cc52abce9061cf2b8b001da98e31471d4adb4ad906a014", "sections": [ { "bytes": 3139,