diff --git a/WORK-QUEUE.md b/WORK-QUEUE.md index f9c6c8d..d16c0c7 100644 --- a/WORK-QUEUE.md +++ b/WORK-QUEUE.md @@ -13428,3 +13428,5 @@ CHECK: cd /root/troupe-standup && python3 wizard-work/spark/test_line_counter.py m1’s nine: `test_no_pinned_root_paths_in_either_file`, `test_snippet_bare_interpreter_reds_on_tools`, `test_snippet_full_stub_is_green`, `test_snippet_honours_hermes_home_env`, `test_snippet_missing_scratch_dir_reds_and_names_path`, `test_snippet_noncallable_tool_is_unavailable`, `test_snippet_one_tool_missing_reds_and_names_it`, `test_snippet_require_absent_tool_reds`, `test_snippet_usage_error_is_2`. m2’s six: `test_no_pinned_root_paths_in_either_file`, `test_shell_complete_tree_is_green`, `test_shell_lone_copy_reds_on_its_sibling`, `test_shell_missing_profile_home_reds_and_names_path`, `test_shell_same_verdict_from_outside_copy`, `test_shell_usage_error_is_2`. m3’s three are the tool-missing, non-callable and `--require` cells — the literal-lie restored in one line. m4’s one is the lone-copy cell: with that leg gone a script shipped without its snippet reads PASS again. **Not claimed:** that `hermes_tools` is unimportable inside a real Hermes session — it is unimportable from a plain `python3` on this host, measured, and neither verifier was run from inside the agent runtime; that `HERMES_HOME` always names a profile home — that is this install’s shape (`/root/.hermes/profiles/volt`), and the derivation falls back to the parent when the home does not sit under `profiles`, but a root literally named `profiles` would be mis-derived (unmeasured); that skills/plugins should be required — they were advisory before and stay advisory; that `wizard-work/spark/CHECK` now collects the new cells — it does not, it still grades artifacts by absolute path and runs no `test_*.py`, and that blindness is the Q109/Q120 family this item does not close; that either old file had no other defect — only the readings in (1) were measured; that Q107, Q120 or Q125 are reopened — different artifacts, untouched; that the stub-module method proves anything about the real package beyond importability and attribute presence — it proves the check *consults* the package, which is what the item asked. Scratch trees for (5): `/root/.hermes/profiles/volt/cache/scratch/q109-2620292/{control,m1,m2,m3,m4}`, one `.out` beside each. Files edited for this item: `wizard-work/spark/snippet.py`, `wizard-work/spark/verify_hermes_setup.sh`, `wizard-work/spark/test_env_verifiers.py` (new), `wizard-work/spark/CHECK-env-verifiers` (new), `WORK-QUEUE.md` (this record, appended), `docs/queue-index.md` (re-rendered with the committed `tools/queue_index.py --write` in this tree). Nothing from `inbox/` is quoted and no other lane’s artifact was edited. **Report:** `/root/.hermes/wizard-outputs/volt/2026-10-29-q109.md`. + +**Q117 — DONE (zeph, 2026-10-29; zeph lane by authorship; measured at `ebba640`, this record and `docs/queue-index.md` land in the commit above it).** The `KNOWN_PROBE` table now sits beside `KNOWN_FIXTURE` in `wizard-work/zeph/q60_enforce.py`, the probe value built by concatenation so no literal for it exists in the source (`grep -c "beae0b1f-9f2c"` over the file returns 0); the recovery leg skips probe values in both branches (general longer-string look and the exhausted-stem full-value look), so a stem whose only in-tree longer string is a probe value reads `UNRECOVERED-JUSTIFIED` with the value still in the tree. Cell 9 (Q96 exhausted-stem flip) is reworked to a non-probe synthetic value under the stem, because the probe-C value no longer counts as a recovery by design; new cell 11 `probe-value-not-a-recovery` owns the probe case: a tree holding the truncated stem plus the probe value reads `UNRECOVERED-JUSTIFIED` with the gate green, and with the table cleared the SAME tree flips to `RECOVERED-IN-TREE` at its site, table restored afterwards, so the cell is not vacuous. Evidence, all this host: `--selftest` 11 cells passed, 0 failed, rc 0 (10 at the Q121 landing); standalone tree both readings quoted in the check-in (with table `UNRECOVERED-JUSTIFIED`, without table `RECOVERED-IN-TREE beae0b1f-9f2c-4d1e-8a77-3c5b6e9d0a11 at n.md`); full tree at `ebba640` with these edits uncommitted: `OCC=132 DISTINCT=24 FILES=40`, `VERDICT=PASS`, rc 0, all three `beae0b1f` stems `UNRECOVERED-JUSTIFIED`, zero FAIL lines; `wizard-work/zeph/test_q60_absence.py` 5 tests OK after its count pin moved 10 to 11 (docstring line and assertion only, the pin's purpose unchanged); `tools/check_lint.py --check` SOUND on the module. Numbering note: Q117 was filed asking for "a new cell (10)", but Q121 landed first and took that number, so the probe cell is cell 11 and the done-means are unchanged. **Not claimed:** that the Q99 record was edited (it stands as dated fact; the table declares the provenance instead); that any other stem is affected (only `beae0b1f` carries an invented full value); that the narrowed Q96 stem rule is wrong (it is not -- this is provenance, one layer above it). Close call Timmy's. diff --git a/docs/queue-index.md b/docs/queue-index.md index 4d39256..f6a8e0c 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; 36 further ids are opened by a record and own no heading at all, and they have rows and extents here -- 90 record blocks in all, 54 of them a later closure or correction for an id already opened. The same **36 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 29 times. +**What it exposes.** The queue is two-tier. 97 sections carry 86 ids because 11 ids own a second, continuation section; 36 further ids are opened by a record and own no heading at all, and they have rows and extents here -- 91 record blocks in all, 55 of them a later closure or correction for an id already opened. The same **36 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 29 times. | # | id | kind | lines | bytes | role | title | first `Status:` | |---|---|---|---|---|---|---|---| @@ -194,7 +194,8 @@ | 184 | Q125 | record | 13381-13399 | 6812 | cont: DONE | **Q125 — DONE (volt, 2026-10-29, at `46b6282`; the repair landed under the spark lane's banner at `a979e63` and `46b6282`, and this record is the closure the queue was missing — the item still read … | -- | | 185 | Q120 | record | 13400-13401 | 3580 | cont: DONE | **Q120 — DONE (volt, 2026-10-29; this record and `docs/queue-index.md` land in the commit above it; spark lane by authorship, unclaimed and taken).** The health check now fails. Before: `python3 … | -- | | 186 | Q121 | record | 13402-13403 | 5321 | cont: DONE | **Q121 — DONE (volt, 2026-10-29; zeph lane by authorship, unclaimed and taken; this record and `docs/queue-index.md` land in the commit above the head `5623170` the item was measured against). The … | -- | -| 187 | Q109 | record | 13404-13430 | 7752 | cont: DONE | **Q109 — DONE (volt, 2026-10-29; spark lane by authorship, unclaimed and taken). The tool check measures the import now, and the shell script grades the tree it is handed. Both named readings … | -- | +| 187 | Q109 | record | 13404-13431 | 7753 | cont: DONE | **Q109 — DONE (volt, 2026-10-29; spark lane by authorship, unclaimed and taken). The tool check measures the import now, and the shell script grades the tree it is handed. Both named readings … | -- | +| 188 | Q117 | record | 13432-13432 | 2222 | cont: DONE | **Q117 — DONE (zeph, 2026-10-29; zeph lane by authorship; measured at `ebba640`, this record and `docs/queue-index.md` land in the commit above it).** The `KNOWN_PROBE` table now sits beside … | -- | ## Ids with no `## ` heading @@ -212,7 +213,7 @@ Opened as records inside another section. `line` is the record's own opening lin | Q53 | 7292 | 7246 | 169 | Q52 | BULLET+BOLD | BOLD-LEAD | | Q64 | 10308 | 10308 | 31 | Q63 | BULLET+BOLD | BOLD-LEAD | | Q65 | 11055 | 11047 | 49 | Q63 | BULLET+BOLD | BOLD-LEAD | -| Q99 | 12749 | 9909 | 32 | Q98 | BULLET+BOLD | BOLD-LEAD | +| Q99 | 12749 | 9909 | 33 | Q98 | BULLET+BOLD | BOLD-LEAD | | Q100 | 12882 | 12882 | 29 | Q99 | BULLET+BOLD | BOLD-LEAD | | Q101 | 12909 | 12909 | 18 | Q100 | BULLET+BOLD | BOLD-LEAD | | Q102 | 12985 | 12985 | 9 | Q100 | BULLET+BOLD | BOLD-LEAD | @@ -230,11 +231,11 @@ Opened as records inside another section. `line` is the record's own opening lin | Q114 | 13280 | 13280 | 5 | Q113 | BULLET+BOLD | BOLD-LEAD | | Q115 | 13282 | 13282 | 1 | Q114 | BULLET+BOLD | BOLD-LEAD | | Q116 | 13286 | 13286 | 4 | Q105 | BULLET+BOLD | BOLD-LEAD | -| Q117 | 13290 | 13288 | 3 | Q96 | BULLET+BOLD | BOLD-LEAD | +| Q117 | 13290 | 13288 | 5 | Q96 | BULLET+BOLD | BOLD-LEAD | | Q118 | 13300 | 13300 | 2 | Q111 | BULLET+BOLD | BOLD-LEAD | | Q119 | 13305 | 13305 | 2 | Q118 | BULLET+BOLD | BOLD-LEAD | | Q120 | 13308 | 13308 | 9 | Q119 | BULLET+BOLD | BOLD-LEAD | -| Q121 | 13342 | 13342 | 2 | Q107 | BULLET+BOLD | BOLD-LEAD | +| Q121 | 13342 | 13342 | 4 | Q107 | BULLET+BOLD | BOLD-LEAD | | Q122 | 13344 | 13344 | 4 | Q121 | BULLET+BOLD | BOLD-LEAD | | Q123 | 13346 | 13346 | 4 | Q122 | BULLET+BOLD | BOLD-LEAD | | Q124 | 13350 | 13350 | 1 | Q95 | BULLET+BOLD | BOLD-LEAD | @@ -1407,17 +1408,30 @@ The block below is the parse this document renders, byte for byte. `--check` com "title": "**Q121 \u2014 DONE (volt, 2026-10-29; zeph lane by authorship, unclaimed and taken; this record and `docs/queue-index.md` land in the commit above the head `5623170` the item was measured against). The \u2026" }, { - "bytes": 7752, - "end_line": 13430, + "bytes": 7753, + "end_line": 13431, "id": "Q109", "kind": "record", "line": 13404, - "lines": 27, + "lines": 28, "role": "continuation", "role_detail": "DONE", "status": null, "status_line": null, "title": "**Q109 \u2014 DONE (volt, 2026-10-29; spark lane by authorship, unclaimed and taken). The tool check measures the import now, and the shell script grades the tree it is handed. Both named readings \u2026" + }, + { + "bytes": 2222, + "end_line": 13432, + "id": "Q117", + "kind": "record", + "line": 13432, + "lines": 1, + "role": "continuation", + "role_detail": "DONE", + "status": null, + "status_line": null, + "title": "**Q117 \u2014 DONE (zeph, 2026-10-29; zeph lane by authorship; measured at `ebba640`, this record and `docs/queue-index.md` land in the commit above it).** The `KNOWN_PROBE` table now sits beside \u2026" } ], "ids_multi_section": { @@ -3974,17 +3988,30 @@ The block below is the parse this document renders, byte for byte. `--check` com "title": "**Q121 \u2014 DONE (volt, 2026-10-29; zeph lane by authorship, unclaimed and taken; this record and `docs/queue-index.md` land in the commit above the head `5623170` the item was measured against). The \u2026" }, { - "bytes": 7752, - "end_line": 13430, + "bytes": 7753, + "end_line": 13431, "id": "Q109", "kind": "record", "line": 13404, - "lines": 27, + "lines": 28, "role": "continuation", "role_detail": "DONE", "status": null, "status_line": null, "title": "**Q109 \u2014 DONE (volt, 2026-10-29; spark lane by authorship, unclaimed and taken). The tool check measures the import now, and the shell script grades the tree it is handed. Both named readings \u2026" + }, + { + "bytes": 2222, + "end_line": 13432, + "id": "Q117", + "kind": "record", + "line": 13432, + "lines": 1, + "role": "continuation", + "role_detail": "DONE", + "status": null, + "status_line": null, + "title": "**Q117 \u2014 DONE (zeph, 2026-10-29; zeph lane by authorship; measured at `ebba640`, this record and `docs/queue-index.md` land in the commit above it).** The `KNOWN_PROBE` table now sits beside \u2026" } ], "nested": [ @@ -4083,7 +4110,7 @@ The block below is the parse this document renders, byte for byte. `--check` com "form": "BOLD-LEAD", "id": "Q99", "line": 12749, - "refs": 32, + "refs": 33, "section": "Q98", "shape": "BULLET+BOLD" }, @@ -4245,7 +4272,7 @@ The block below is the parse this document renders, byte for byte. `--check` com "form": "BOLD-LEAD", "id": "Q117", "line": 13290, - "refs": 3, + "refs": 5, "section": "Q96", "shape": "BULLET+BOLD" }, @@ -4281,7 +4308,7 @@ The block below is the parse this document renders, byte for byte. `--check` com "form": "BOLD-LEAD", "id": "Q121", "line": 13342, - "refs": 2, + "refs": 4, "section": "Q107", "shape": "BULLET+BOLD" }, @@ -4318,9 +4345,9 @@ The block below is the parse this document renders, byte for byte. `--check` com "end_line": 8, "line": 1 }, - "queue_bytes": 2093408, - "queue_lines": 13430, - "queue_sha256": "bc4a5fbac8d035fa2845e50f002a8b712d4f0d5d3d25a4b6aeea0efb5c9c969c", + "queue_bytes": 2095631, + "queue_lines": 13432, + "queue_sha256": "cc261e2bd90f1c26f67d31204a6c50643ffe3606eaba2b60a9213c535be972e3", "sections": [ { "bytes": 3139, diff --git a/wizard-work/zeph/q60_enforce.py b/wizard-work/zeph/q60_enforce.py index e1e6856..90da7c4 100644 --- a/wizard-work/zeph/q60_enforce.py +++ b/wizard-work/zeph/q60_enforce.py @@ -53,7 +53,22 @@ never as a joined string (cell 8, the absence cell, Q96; per-entry form per Q121) -- a full value under the exhausted beae0b1f stem reports RECOVERED (cell 9, Q96), and a two-entry table with one entry's literal inserted names exactly that entry (cell 10, the Q121 cell: the joined form -named nothing once the table held two values). +named nothing once the table held two values) -- and a record-quoted +probe value under that stem does NOT report RECOVERED (cell 11, Q117). + +Provenance rule (Q117, reply 146 section 4 / interview section 3): +a full value invented in one of our own replies is never an archive +recovery, however many bytes of it sit in the tree. It is implemented +as data, not site heuristics: a KNOWN_PROBE table beside +KNOWN_FIXTURE. Probe values are skipped by the recovery leg exactly +like the placeholder and the fixture, so a stem whose only in-tree +longer string is a probe value reads UNRECOVERED-JUSTIFIED with the +value still in the tree. The Q99 record that quotes the probe value +is NOT edited: the table declares its provenance, and the record +stands as dated fact. Cell numbering note: Q117 was filed asking for +"a new cell (10)", but Q121 landed first and took that number, so +the probe cell is cell 11; the done-means (table suppresses, flip-back +proves it) are unchanged. Correction, reply 130 probe D / interview 117 section 1.4: the 2026-10-27 check-in credited cell 7 with proving that no UUID-shaped @@ -130,6 +145,18 @@ KNOWN_FIXTURE = { KNOWN_UNRECOVERED = {"beae0b1f"} PLACEHOLDER = "beae0b1f-0000-0000-0000-000000000000" +# Probe values invented in our own investigation (Q117): Timmy's probe-C +# value, quoted in full by his own Q99 record (WORK-QUEUE.md) to +# demonstrate the over-wide stem rule. It is the ONLY full value in the +# tree under this stem that is not the placeholder, and it is not an +# archive recovery: the record created the value that would satisfy the +# recovery leg. Built by concatenation, like the fixture, so no literal +# for it exists in this source; the recovery leg skips it, and cell 11 +# proves the table is what suppresses it. The Q99 record is not edited. +KNOWN_PROBE = { + "beae0b1f": "beae0b1f-" "9f2c-4d1e-8a77-3c5b6e9d0a11", +} + def list_files(tree): """Tracked files if tree is a git checkout, else every file under it.""" @@ -195,10 +222,12 @@ def run_check(tree, excludes): for rel, text in contents.items(): for m in pat.finditer(text): cand = m.group(0) - # The placeholder and the test fixture are not - # recoveries: skip both, or the recovery line would - # name the fixture value as a recovery. - if cand != PLACEHOLDER and cand not in KNOWN_FIXTURE.values(): + # The placeholder, the test fixture and any probe + # value are not recoveries: skip all three, or the + # recovery line would name one of them as a recovery. + if (cand != PLACEHOLDER + and cand not in KNOWN_FIXTURE.values() + and cand not in KNOWN_PROBE.values()): longer = (cand, rel) break if longer: @@ -207,11 +236,13 @@ def run_check(tree, excludes): # Q96 narrowing: a truncated token under an exhausted stem # skips the longer-string look, but a full value that arrives # under that stem is a recovery, not an exhaustion. The - # placeholder (and the fixture, by symmetry) never counts. + # placeholder (and the fixture, by symmetry) never counts; + # since Q117 neither does a record-quoted probe value. for rel, text in contents.items(): for val in FULL_RE.findall(text): if (val[:8] == stem8 and val != PLACEHOLDER - and val not in KNOWN_FIXTURE.values()): + and val not in KNOWN_FIXTURE.values() + and val not in KNOWN_PROBE.values()): longer = (val, rel) break if longer: @@ -336,9 +367,12 @@ def selftest(): # Cell 9 (Q96 exhausted-stem flip): a full value arriving under # the exhausted beae0b1f stem reports RECOVERED with its site. # Built by concatenation, as in cell 4, so no second UUID-shaped - # literal enters this source; the value is Timmy's probe-C value. + # literal enters this source. Since Q117 this must be a NON-probe + # value: Timmy's probe-C value no longer counts as a recovery + # (cell 11 owns that case), so the flip is demonstrated with a + # synthetic value that appears in no table. with open(os.path.join(d, "g.md"), "w") as fh: - fh.write("beae0b1f-" "9f2c-4d1e-8a77-3c5b6e9d0a11\n") + fh.write("beae0b1f-" "1111-2222-3333-444444444444\n") lines, _ = run_check(d, ["report.md"]) assert any(l.startswith("TOKEN beae0b1f: RECOVERED-IN-TREE") and l.endswith("at g.md") for l in lines), \ @@ -367,6 +401,36 @@ def selftest(): assert fixture_literals_in_source(both, two_entry) == want_both, \ "both-inserted scan did not name both stems" passed.append("absence-scan-per-entry") + # Cell 11 (Q117): a record-quoted probe value under the exhausted + # stem does NOT report RECOVERED. The tree holds the truncated + # stem plus Timmy's probe-C value (built by concatenation, as in + # cell 4); with KNOWN_PROBE in place the stem must read + # UNRECOVERED-JUSTIFIED and the gate must stay green. Then the + # flip-back mutant: with the probe value removed from the table + # the SAME tree must read RECOVERED-IN-TREE, proving the table + # is what suppresses it -- otherwise this cell would be vacuous + # (a tree with no recovery at all reads UNRECOVERED either way). + probe_val = KNOWN_PROBE["beae0b1f"] + with open(os.path.join(d, "h.md"), "w") as fh: + fh.write("beae0b1f-\u2026 and probe %s\n" % probe_val) + lines, failed = run_check(d, ["report.md"]) + assert any(l.startswith("TOKEN beae0b1f: UNRECOVERED-JUSTIFIED") + for l in lines), "probe tree did not read UNRECOVERED-JUSTIFIED: %s" % lines + assert not any(l.startswith("TOKEN beae0b1f: RECOVERED") + for l in lines), "probe value reported as recovery" + assert not failed, "probe tree failed the gate" + saved_probe = dict(KNOWN_PROBE) + try: + KNOWN_PROBE.clear() + lines, _ = run_check(d, ["report.md"]) + finally: + KNOWN_PROBE.update(saved_probe) + assert any(l.startswith("TOKEN beae0b1f: RECOVERED-IN-TREE") + and l.endswith("at h.md") for l in lines), \ + "flip-back mutant did not recover without the table: %s" % lines + assert KNOWN_PROBE == saved_probe, "probe table not restored after mutant" + os.remove(os.path.join(d, "h.md")) + passed.append("probe-value-not-a-recovery") # Cell 7 (the sixth cell of reply 113, renumbered by cell 6): run the # check over the checker's own directory and assert rc 0. This is # the leg that was missing: five cells graded fixture trees, none diff --git a/wizard-work/zeph/test_q60_absence.py b/wizard-work/zeph/test_q60_absence.py index 9de3235..2b353ba 100644 --- a/wizard-work/zeph/test_q60_absence.py +++ b/wizard-work/zeph/test_q60_absence.py @@ -9,7 +9,9 @@ the module's own selftest cannot write: a module cannot put a second entry in its own table at run time without shipping one. Cells: - 1. control the shipped module's selftest is green and reports 10 cells. + 1. control the shipped module's selftest is green and reports 11 cells. + (10 at Q121 landing; 11 after Q117 added the probe cell. + The count pin moves with the cell count by design.) 2. two-entry the queue's mutant (second KNOWN_FIXTURE entry plus that entry's full literal in the source) reds NAMING the stem. 3. join-legacy the pre-repair algorithm restored inside the cell reds -- @@ -94,7 +96,7 @@ class Q121Cells(unittest.TestCase): def test_1_control_is_green(self): rc, out, err = run_selftest(MODULE) self.assertEqual(rc, 0, "shipped selftest not green: %s" % err[-300:]) - self.assertIn("SELFTEST: 10 cells passed, 0 failed", out) + self.assertIn("SELFTEST: 11 cells passed, 0 failed", out) self.assertIn("SELFTEST PASS absence-scan-per-entry", out) def test_2_two_entry_mutant_reds_naming_the_stem(self):