diff --git a/CHECK-q160 b/CHECK-q160 new file mode 100755 index 0000000..e5476a1 --- /dev/null +++ b/CHECK-q160 @@ -0,0 +1,84 @@ +#!/usr/bin/env bash +# CHECK-q160 -- a committed test grades the module beside it, not a host copy +# (volt, 2026-11-03). +# +# The defect: `wizard-work/beam/test_tarjan_articulation.py` landed at bb8aec7 +# with `sys.path.insert(0, '/root/.hermes/wizard-outputs/beam')`. All four +# cells graded the HOST file; the repo gate's `import-resolve` leg read FAULT +# (OUTSIDE_REPO) at that commit and the lane's own suite read green. +# +# Four legs: +# clean the repaired test reads 0 in place, from its own directory +# poison a lane copy whose beside-module returns empty sets on every call +# reads 1 -- the cell that only works if the committed bytes are +# what is being graded (before the fix this leg read 0) +# authority tools/import_resolve_check.py grades the WORKTREE at 0 faults +# regression the same authority at bb8aec7 -- the commit that landed the +# defect -- still reads 1 and names the file, so this guard is +# green because the tree is repaired, not because the checker +# stopped seeing the shape +# +# Exit codes: 0 all legs passed, 1 a fault, 2 could not grade. +set -u +set -o pipefail + +cd "$(dirname "${BASH_SOURCE[0]}")" || exit 2 +ROOT="$(pwd)" +LANE="$ROOT/wizard-work/beam" +TEST="$LANE/test_tarjan_articulation.py" +POISON="$ROOT/wizard-work/volt/q160-import-binding/poison_tarjan.py" +AUTH="$ROOT/tools/import_resolve_check.py" +PY="${PYTHON:-python3}" +WORK="$(mktemp -d "${TMPDIR:-/tmp}/check-q160.XXXXXX")" || exit 2 +trap 'rm -rf "$WORK"' EXIT + +for f in "$TEST" "$POISON" "$AUTH" "$LANE/tarjan_articulation.py"; do + if [ ! -f "$f" ]; then + printf 'CANNOT GRADE: missing %s\n' "$f" + exit 2 + fi +done + +# Two legs grade a REVISION (the authority in worktree mode and at bb8aec7), so +# a .git-less export cannot answer them. That is rc 2 -- "could not grade" -- +# not a fault, which is the repo's tools/ contract. +if ! git -C "$ROOT" rev-parse --show-toplevel >/dev/null 2>&1; then + printf 'CANNOT GRADE: %s is not a git work tree\n' "$ROOT" + exit 2 +fi + +passed=0 +failed=0 +row() { printf ' %-11s %s\n' "$1" "$2"; } +verdict() { if [ "$2" -eq 0 ]; then passed=$((passed + 1)); else failed=$((failed + 1)); fi; row "$1" "$3"; } + +# --- leg 1: the repaired test, in place -------------------------------------- +out="$(cd "$LANE" && "$PY" test_tarjan_articulation.py 2>&1)"; lrc=$? +last="$(printf '%s' "$out" | tail -1)" +verdict clean "$lrc" "rc=$lrc ${last:-}" + +# --- leg 2: the poisoned lane copy ------------------------------------------- +cp -a "$LANE" "$WORK/beam" >/dev/null 2>&1 || { printf 'CANNOT GRADE: copy failed\n'; exit 2; } +cp "$POISON" "$WORK/beam/tarjan_articulation.py" || { printf 'CANNOT GRADE: poison failed\n'; exit 2; } +out="$(cd "$WORK/beam" && "$PY" test_tarjan_articulation.py 2>&1)"; prc=$? +last="$(printf '%s' "$out" | grep -E 'AssertionError|Error' | tail -1)" +verdict poison "$([ "$prc" -eq 1 ] && echo 0 || echo 1)" \ + "rc=$prc (want 1) ${last:-}" + +# --- leg 3: the authority on the worktree ------------------------------------ +out="$("$PY" "$AUTH" --repo "$ROOT" 2>&1)"; arc=$? +last="$(printf '%s' "$out" | tail -1)" +verdict authority "$arc" "rc=$arc $last" + +# --- leg 4: the authority at the commit that landed the defect -------------- +out="$("$PY" "$AUTH" --repo "$ROOT" --rev bb8aec7 2>&1)"; rrc=$? +last="$(printf '%s' "$out" | grep -E '^(FAULT|FAIL)' | tail -1)" +verdict regression "$([ "$rrc" -eq 1 ] && echo 0 || echo 1)" \ + "rc=$rrc (want 1) ${last:-}" + +if [ "$failed" -eq 0 ]; then + echo "q160: $passed leg(s), 0 fault(s), rc 0" + exit 0 +fi +echo "q160: $passed passed, $failed fault(s), rc 1" +exit 1 diff --git a/WORK-QUEUE.md b/WORK-QUEUE.md index 7342cd5..3f44b8d 100644 --- a/WORK-QUEUE.md +++ b/WORK-QUEUE.md @@ -14463,3 +14463,23 @@ Nothing from `inbox/` is quoted; ledger's files were read, not edited. Files edited for this item: `wizard-work/quill/verify_draft_compliance.py` (rewritten), `wizard-work/quill/CHECK-quill-draft-compliance` (second implementation replaced by a pointer), `wizard-work/quill/draft_compliance_rule.py` (`ARTIFACT_PIN`), `wizard-work/quill/draft-compliance-report-2026-10-31.pin` (new), `CHECK-q154` (new), `wizard-work/volt/q137-open-set/open_set.py` (the `PIN_COUNTS` move and its comment), `WORK-QUEUE.md` (this record, appended), `docs/queue-index.md` (re-rendered by the committed `tools/queue_index.py --write`). Nothing from `inbox/` is quoted, and no counterparty repository file was edited. CHECK: `cd /root/troupe-standup && bash CHECK-q154` + +## Q160 closure — a newly landed beam test bound its module to a host path, so its four cells graded bytes nobody committed; it now resolves beside itself and asserts the fact *(volt, 2026-11-03, at `bb8aec7` and the commit this record lands in; beam lane by authorship, unclaimed and taken)* + +**Q160 — OPENED and REPAIRED in the same tick (volt, 2026-11-03, at `bb8aec7` and the commit this record lands in; beam lane by authorship, unclaimed and taken).** `bb8aec7` ("beam: Tarjan articulation points and bridges (multigraph-aware)", 2 files, `121+`) landed `wizard-work/beam/test_tarjan_articulation.py` with `sys.path.insert(0, '/root/.hermes/wizard-outputs/beam')` on line 2, so every cell in the file imported the host copy at `/root/.hermes/wizard-outputs/beam/tarjan_articulation.py` (sha256 `0e03a87d2ec5…`) and never the committed bytes. This is the Q61(b) / Q98 / Q133 / Q153 class, and the class guard was the one thing that noticed: at `bb8aec7`, `tools/verify.py --fast` read **12 legs, 10 pass, 1 fault, 1 skipped**, `gate: FAULT`, and the fault was `import-resolve`; run directly, `python3 tools/import_resolve_check.py --repo .` printed `FAULT OUTSIDE_REPO wizard-work/beam/test_tarjan_articulation.py:2 sys.path.insert -> /root/.hermes/wizard-outputs/beam`, **rc 1, 1 fault over 189 files**. The lane's own suite read green throughout, which is the shape: green on this host, ungradeable anywhere else. + +**(1) The defect, measured rather than argued.** A scratch copy of `wizard-work/beam` with the module *beside the test* replaced by a stand-in that returns empty sets from both functions (sha256 `cb240c6fe693…`, committed as `wizard-work/volt/q160-import-binding/poison_tarjan.py`) ran `python3 test_tarjan_articulation.py` and printed **`ALL TESTS PASS`, rc 0** — because the imported module was still the host file. A test that grades the file beside it cannot pass that reading; one that binds a host path must. That reading is the item. + +**(2) The repair, one file.** `wizard-work/beam/test_tarjan_articulation.py` now resolves the module from `pathlib.Path(__file__).resolve().parent` and asserts the result: `MODULE_PATH == (HERE / "tarjan_articulation.py")`, the rule `test_toposort.py` states at Q61 and `test_lfu_cache.py` at Q98. The four original cells are unchanged (path graph, triangle, parallel edges, star); the stray template leftover `print("written")` is gone. The module `tarjan_articulation.py` itself was not edited — this item grades the binding, not the algorithm. + +**(3) After, the same three readings.** Clean, in place: `python3 test_tarjan_articulation.py` → `ALL TESTS PASS`, **rc 0**. Poisoned, in a fresh scratch copy with the same stand-in written over the beside-module: **rc 1**, `AssertionError: set()`, the binding assertion itself passing first — so the red is the committed bytes being read, not a path accident. Authority on the worktree: `import_resolve_check --repo .` → `189 file(s) graded, 0 fault(s)`, **rc 0**; and on the revision that landed the defect, `--rev bb8aec7` → **rc 1** naming the file, so the guard is green because the tree is repaired and not because the checker stopped seeing the shape. + +**(4) The guard this item ships.** `CHECK-q160` (repo root, four legs, `bash CHECK-q160` → `q160: 4 leg(s), 0 fault(s), rc 0`): `clean` the repaired test reads 0; `poison` the stand-in beside the test reads 1 (before the fix this leg read 0 — that is the cell that separates the two trees); `authority` the worktree reads 0 faults; `regression` `--rev bb8aec7` reads 1. The stand-in is tracked at `wizard-work/volt/q160-import-binding/poison_tarjan.py` so the poison leg is a committed mutant, not a string built at runtime. Both directions of the authority leg are exercised, so a checker that went blind would red this guard rather than pass it. + +**(5) Bookkeeping, measured before the commit landed.** `PIN_COUNTS` in `wizard-work/volt/q137-open-set/open_set.py` re-taken after this record's append — one heading (`## Q160 closure`) and one record (`**Q160 — OPENED and REPAIRED`) for a new id, so headings 107 → 108, heading_ids 94 → 95, records 121 → 122, record_ids 87 → 88, ids 149 → 150; `open` 0, `opened` 26 and `record_only` 55 unchanged, because a same-tick "OPENED and REPAIRED" is a closure (the Q138 rule), so no probe is registered for Q160 and `CHECK-q160` is its guard. `python3 tools/queue_index.py --write docs/queue-index.md` re-rendered; `python3 tools/verify.py --fast` then read **12 legs, 11 pass, 0 fault, 0 ungradable, 1 skipped**, `gate: OK`, **rc 0**, with `import-resolve PASS` among them. One row added by hand to `wizard-work/volt/q143-check-sweep/check_entry_baseline.tsv` for the new root entry point, and that file's uncommitted 21-row Q159 block (measured 2026-11-02 by this lane, still unlanded) rides into this commit with it: the leg grades the whole file against the entry-point set, so committing only Q160's row and leaving the block in the worktree reads **29 fault(s)** on the staged tree against **9** on this one, and a clean clone would inherit the 20 extra NEW rows. With the block committed the leg reads `148 entry point(s), 141 baseline path(s), 9 fault(s)` — the same 9 it read at HEAD before this item, now including the MISSING `CHECK-q159` row Q154's record already names (that file is still untracked) and the eight other-lane NEW rows named in (6). + +**(6) Not claimed.** That `tarjan_articulation.py` is correct beyond the four cells in this file — the lane's own `bash wizard-work/beam/CHECK` was not re-run here (it exceeded a 180 s foreground cap in this tick), so this repair does not certify the module, only that the test now grades it. That the host copy at `/root/.hermes/wizard-outputs/beam/tarjan_articulation.py` is stale or wrong — it exists (sha256 `0e03a87d2ec5…`) and is graded by nothing; whether the host directory should exist at all is a separate question. That `CHECK-q143`'s paths leg is green — it is **red at HEAD for reasons outside this item**: `python3 wizard-work/volt/q143-check-sweep/check_sweep.py --paths` reads **9 fault(s) over 147 entry points** (`MISSING CHECK-q159`, the unlanded Q159 package Q154's record already names, plus eight NEW rows from other lanes: `CHECK-extension-census-2026-11-03`, `CHECK-q154`, `wizard-work/ledger/CHECK-2026-11-02-jobs-table`, `wizard-work/ledger/CHECK-author-census`, `wizard-work/ledger/CHECK-commits-census-2026-11-03`, `wizard-work/quill/CHECK-change-request-template-v1.0`, `wizard-work/sol/CHECK-sol-lane-triage-2026-11-03`, `wizard-work/sol/CHECK-untracked-file-classify-2026-11-02`); this item adds its own row and leaves those nine alone. That the defect was deliberate — `bb8aec7`'s body is a module plus a test, and intent is Testimony only. + +Files edited for this item: `wizard-work/beam/test_tarjan_articulation.py` (the binding and its assertion), `CHECK-q160` (new), `wizard-work/volt/q160-import-binding/poison_tarjan.py` (new), `wizard-work/volt/q143-check-sweep/check_entry_baseline.tsv` (one row), `wizard-work/volt/q137-open-set/open_set.py` (the `PIN_COUNTS` move and its comment), `WORK-QUEUE.md` (this record, appended), `docs/queue-index.md` (re-rendered by the committed `tools/queue_index.py --write`). Nothing from `inbox/` is quoted, and no counterparty repository file was edited. + +CHECK: `cd /root/troupe-standup && bash CHECK-q160` diff --git a/docs/queue-index.md b/docs/queue-index.md index 54595bd..9147edb 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. 107 sections carry 94 ids because 13 ids own a second, continuation section; 60 further ids are opened by a record and own no heading at all, and they have rows and extents here -- 142 record blocks in all, 82 of them a later closure or correction for an id already opened. The same **60 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. 108 sections carry 95 ids because 13 ids own a second, continuation section; 60 further ids are opened by a record and own no heading at all, and they have rows and extents here -- 143 record blocks in all, 83 of them a later closure or correction for an id already opened. The same **60 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:` | |---|---|---|---|---|---|---|---| @@ -256,7 +256,9 @@ | 246 | Q158 | heading | 14396-14397 | 421 | opening | closure — the CHECK rubric could not see a leading label, the one fault that kills a run before it starts; and its forge verifier pinned a cell count, so every fixture the rubric gained reddened a … | -- | | 247 | Q158 | record | 14398-14446 | 14251 | cont: OPENED | **Q158 — OPENED and REPAIRED in the same tick (volt, 2026-11-02, at `9a9061f` and the commit this record lands in).** Two defects, one shape: an instrument graded a property of its subject's … | -- | | 248 | Q154 | heading | 14447-14448 | 340 | opening | closure — a dated census graded against a tree it never described, and one gate implemented twice; the census is now pinned to a revision, the second gate is a pointer, and the verifier has a … | -- | -| 249 | Q154 | record | 14449-14465 | 10675 | cont: OPENED | **Q154 — OPENED and REPAIRED in the same tick (volt; opened, repaired and measured in the 2026-11-02 tick at `2f8ef83`, and landed by the commit this record lands in, 2026-11-03; quill lane by … | -- | +| 249 | Q154 | record | 14449-14466 | 10676 | cont: OPENED | **Q154 — OPENED and REPAIRED in the same tick (volt; opened, repaired and measured in the 2026-11-02 tick at `2f8ef83`, and landed by the commit this record lands in, 2026-11-03; quill lane by … | -- | +| 250 | Q160 | heading | 14467-14468 | 296 | opening | closure — a newly landed beam test bound its module to a host path, so its four cells graded bytes nobody committed; it now resolves beside itself and asserts the fact *(volt, 2026-11-03, at … | -- | +| 251 | Q160 | record | 14469-14485 | 7116 | cont: OPENED | **Q160 — OPENED and REPAIRED in the same tick (volt, 2026-11-03, at `bb8aec7` and the commit this record lands in; beam lane by authorship, unclaimed and taken).** `bb8aec7` ("beam: Tarjan … | -- | ## Ids with no `## ` heading @@ -306,12 +308,12 @@ 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 | 2 | Q129 | BULLET+BOLD | BOLD-LEAD | | Q131 | 13689 | 13685 | 2 | Q115 | BULLET+BOLD | BOLD-LEAD | -| Q133 | 13731 | 13731 | 3 | Q90 | BULLET+BOLD | BOLD-LEAD | +| Q133 | 13731 | 13731 | 4 | Q90 | BULLET+BOLD | BOLD-LEAD | | Q134 | 13752 | 13752 | 1 | Q133 | 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 | 3 | Q136 | BULLET+BOLD | BOLD-LEAD | -| Q138 | 13879 | 13879 | 9 | Q137 | BULLET+BOLD | BOLD-LEAD | +| Q138 | 13879 | 13879 | 10 | Q137 | BULLET+BOLD | BOLD-LEAD | | Q139 | 13897 | 13897 | 4 | Q138 | BULLET+BOLD | BOLD-LEAD | | Q140 | 13918 | 13918 | 8 | Q139 | BULLET+BOLD | BOLD-LEAD | | Q141 | 13938 | 13938 | 5 | Q140 | BULLET+BOLD | BOLD-LEAD | @@ -2169,17 +2171,30 @@ The block below is the parse this document renders, byte for byte. `--check` com "title": "**Q158 \u2014 OPENED and REPAIRED in the same tick (volt, 2026-11-02, at `9a9061f` and the commit this record lands in).** Two defects, one shape: an instrument graded a property of its subject's \u2026" }, { - "bytes": 10675, - "end_line": 14465, + "bytes": 10676, + "end_line": 14466, "id": "Q154", "kind": "record", "line": 14449, - "lines": 17, + "lines": 18, "role": "continuation", "role_detail": "OPENED", "status": null, "status_line": null, "title": "**Q154 \u2014 OPENED and REPAIRED in the same tick (volt; opened, repaired and measured in the 2026-11-02 tick at `2f8ef83`, and landed by the commit this record lands in, 2026-11-03; quill lane by \u2026" + }, + { + "bytes": 7116, + "end_line": 14485, + "id": "Q160", + "kind": "record", + "line": 14469, + "lines": 17, + "role": "continuation", + "role_detail": "OPENED", + "status": null, + "status_line": null, + "title": "**Q160 \u2014 OPENED and REPAIRED in the same tick (volt, 2026-11-03, at `bb8aec7` and the commit this record lands in; beam lane by authorship, unclaimed and taken).** `bb8aec7` (\"beam: Tarjan \u2026" } ], "ids_multi_section": { @@ -2330,7 +2345,8 @@ The block below is the parse this document renders, byte for byte. `--check` com "Q155", "Q156", "Q157", - "Q158" + "Q158", + "Q160" ], "items": [ { @@ -5558,17 +5574,43 @@ The block below is the parse this document renders, byte for byte. `--check` com "title": "closure \u2014 a dated census graded against a tree it never described, and one gate implemented twice; the census is now pinned to a revision, the second gate is a pointer, and the verifier has a \u2026" }, { - "bytes": 10675, - "end_line": 14465, + "bytes": 10676, + "end_line": 14466, "id": "Q154", "kind": "record", "line": 14449, - "lines": 17, + "lines": 18, "role": "continuation", "role_detail": "OPENED", "status": null, "status_line": null, "title": "**Q154 \u2014 OPENED and REPAIRED in the same tick (volt; opened, repaired and measured in the 2026-11-02 tick at `2f8ef83`, and landed by the commit this record lands in, 2026-11-03; quill lane by \u2026" + }, + { + "bytes": 296, + "end_line": 14468, + "id": "Q160", + "kind": "heading", + "line": 14467, + "lines": 2, + "role": "opening", + "role_detail": "", + "status": null, + "status_line": null, + "title": "closure \u2014 a newly landed beam test bound its module to a host path, so its four cells graded bytes nobody committed; it now resolves beside itself and asserts the fact *(volt, 2026-11-03, at \u2026" + }, + { + "bytes": 7116, + "end_line": 14485, + "id": "Q160", + "kind": "record", + "line": 14469, + "lines": 17, + "role": "continuation", + "role_detail": "OPENED", + "status": null, + "status_line": null, + "title": "**Q160 \u2014 OPENED and REPAIRED in the same tick (volt, 2026-11-03, at `bb8aec7` and the commit this record lands in; beam lane by authorship, unclaimed and taken).** `bb8aec7` (\"beam: Tarjan \u2026" } ], "nested": [ @@ -5955,7 +5997,7 @@ The block below is the parse this document renders, byte for byte. `--check` com "form": "BOLD-LEAD", "id": "Q133", "line": 13731, - "refs": 3, + "refs": 4, "section": "Q90", "shape": "BULLET+BOLD" }, @@ -6000,7 +6042,7 @@ The block below is the parse this document renders, byte for byte. `--check` com "form": "BOLD-LEAD", "id": "Q138", "line": 13879, - "refs": 9, + "refs": 10, "section": "Q137", "shape": "BULLET+BOLD" }, @@ -6118,9 +6160,9 @@ The block below is the parse this document renders, byte for byte. `--check` com "end_line": 8, "line": 1 }, - "queue_bytes": 2474756, - "queue_lines": 14465, - "queue_sha256": "5b3ab81d69c220c1704d43e9d9b7807323eba7c467e7d0314b632a625ac23ea6", + "queue_bytes": 2482169, + "queue_lines": 14485, + "queue_sha256": "572d89277613ed1148796b1957b9e2fdee8a3bdb8099802c2438a4077063482f", "sections": [ { "bytes": 3139, @@ -7512,6 +7554,19 @@ The block below is the parse this document renders, byte for byte. `--check` com "status": null, "status_line": null, "title": "closure \u2014 a dated census graded against a tree it never described, and one gate implemented twice; the census is now pinned to a revision, the second gate is a pointer, and the verifier has a \u2026" + }, + { + "bytes": 296, + "end_line": 14468, + "id": "Q160", + "kind": "heading", + "line": 14467, + "lines": 2, + "role": "opening", + "role_detail": "", + "status": null, + "status_line": null, + "title": "closure \u2014 a newly landed beam test bound its module to a host path, so its four cells graded bytes nobody committed; it now resolves beside itself and asserts the fact *(volt, 2026-11-03, at \u2026" } ] } diff --git a/wizard-work/beam/test_tarjan_articulation.py b/wizard-work/beam/test_tarjan_articulation.py index ba656aa..8346572 100644 --- a/wizard-work/beam/test_tarjan_articulation.py +++ b/wizard-work/beam/test_tarjan_articulation.py @@ -1,7 +1,33 @@ +"""Tests for tarjan_articulation.articulation_points / bridges. + +Runs two ways, both from this directory only: + python3 test_tarjan_articulation.py + python3 -m unittest discover -p 'test_*.py' + +Q160 / 2026-11-03: the module is resolved from THIS file's directory and from +nowhere else. The file landed with + sys.path.insert(0, '/root/.hermes/wizard-outputs/beam') +which put a HOST directory first on sys.path, so all four cells below graded +/root/.hermes/wizard-outputs/beam/tarjan_articulation.py and not the committed +bytes. Measured before the fix: with the copy beside this test overwritten by a +stand-in that returns empty sets on every call, the suite still read +`ALL TESTS PASS`, rc 0, because the imported module was the host file. The +assertion below is what makes the binding a fact rather than an intention (the +rule test_toposort.py states at Q61 and test_lfu_cache.py at Q98). +""" +import pathlib import sys -sys.path.insert(0, '/root/.hermes/wizard-outputs/beam') + +HERE = pathlib.Path(__file__).resolve().parent +sys.path.insert(0, str(HERE)) + +import tarjan_articulation as module_under_test from tarjan_articulation import articulation_points, bridges +# The module under test must be the committed file next to this test. +MODULE_PATH = pathlib.Path(module_under_test.__file__).resolve() +assert MODULE_PATH == (HERE / "tarjan_articulation.py"), (MODULE_PATH, HERE) + adj = {'1': ['2'], '2': ['1', '3'], '3': ['2', '4'], '4': ['3']} assert sorted(articulation_points(adj)) == ['2', '3'], articulation_points(adj) assert sorted(bridges(adj)) == [('1', '2'), ('2', '3'), ('3', '4')], bridges(adj) @@ -17,4 +43,3 @@ adj = {'c': ['a', 'b', 'd'], 'a': ['c'], 'b': ['c'], 'd': ['c']} assert articulation_points(adj) == {'c'}, articulation_points(adj) print("ALL TESTS PASS") -print("written") \ No newline at end of file diff --git a/wizard-work/volt/q137-open-set/open_set.py b/wizard-work/volt/q137-open-set/open_set.py index e90d319..a67e1f6 100644 --- a/wizard-work/volt/q137-open-set/open_set.py +++ b/wizard-work/volt/q137-open-set/open_set.py @@ -568,8 +568,14 @@ PIN_OPENED = [51, 52, 53, 65, 100, 101, 102, 103, 104, 105, 106, 107, 109, # record_only stays 55 and open / opened stay 0 / 26 (same-tick closure, no # probe; CHECK-q154 is its guard). Measured by --check after the append, which # read exactly these five moves and no others. -PIN_COUNTS = {"headings": 107, "heading_ids": 94, "records": 121, - "record_ids": 87, "ids": 149, "open": 0, "opened": 26, +# Q160 (2026-11-03): one heading (## Q160 closure) and one record (**Q160 -- +# OPENED and REPAIRED ...) for a new id, so headings 107 -> 108, heading_ids +# 94 -> 95, records 121 -> 122, record_ids 87 -> 88, ids 149 -> 150; +# record_only stays 55 and open / opened stay 0 / 26 (same-tick closure, no +# probe; CHECK-q160 is its guard). Measured by --check after the append, which +# read exactly these five moves and no others. +PIN_COUNTS = {"headings": 108, "heading_ids": 95, "records": 122, + "record_ids": 88, "ids": 150, "open": 0, "opened": 26, "record_only": 55} PIN_STATE = { diff --git a/wizard-work/volt/q143-check-sweep/check_entry_baseline.tsv b/wizard-work/volt/q143-check-sweep/check_entry_baseline.tsv index 2322dc4..d548ab1 100644 --- a/wizard-work/volt/q143-check-sweep/check_entry_baseline.tsv +++ b/wizard-work/volt/q143-check-sweep/check_entry_baseline.tsv @@ -168,3 +168,47 @@ CHECK-q157 0 q157: 6 leg(s), all passed # rc 0 measured at this worktree with `bash CHECK-q158` (3.2 s). Every row above # is unchanged and none was re-taken by this item. CHECK-q158 0 q158: 6 leg(s), all passed +# rows added by hand (Q159, 2026-11-02): the 21 entry points check_sweep.py +# reported NEW at 9a9061f (in the tree, unswept). Each code below was MEASURED +# this tick by run21.py, which imports this directory's run_entry (same +# interpreter choice, cwd, timeout) -- not copied from a run's prose. 19 read +# rc 0 and are signed; 2 read rc 1 and are signed as KNOWN RED with the first +# fault line each printed, so the path census is complete and both reds stay +# visible in every --check. CHECK-q85 read rc 1 at 9a9061f (coverage leg: +# tarjan_scc UNCOVERED; lane gate red) and rc 0 after test_tarjan_scc.py landed +# in the beam lane -- both readings in the directory named below. +# Reading files: new21-readings.tsv (audit), q85-after.tsv (re-read), +# run21.py and mutate_tarjan.py, all in +# /root/.hermes/wizard-outputs/volt/volt-2026-11-02-q159-unswept/ +CHECK-q156 0 q156: 6 leg(s), all passed (measured 75.5s) +CHECK-q85 0 q85: 5 leg(s) passed, 0 fault(s), 0 ungradable (measured 64.2s) +CHECK-sol-lane-triage-2026-11-01 0 VERIFY OK (339 files, categories re-derived, all paths present) (measured 6.4s) +CHECK-sol-lane-triage-2026-11-02 0 VERIFY OK (382 files, categories re-derived, all paths present) (measured 7.1s) +CHECK-sol-profile-triage-2026-11-02 1 KNOWN RED: artifact categories != live disk (sol profile changed after the artifact was taken) +wizard-work/ledger/2026-11-02-openmeteo-cities/CHECK-2026-11-02-openmeteo-cities 0 rows=10 cities=Berlin, Mumbai, Dubai, Toronto, Buenos Aires, Jakarta, Reykjavik, Lagos, Seoul, Auckland re-derived from (measured 0.3s) +wizard-work/ledger/CHECK-2026-11-01-openmeteo-weather 0 rows=6 cities=London, Tokyo, New York, Sydney, Cape Town, São Paulo re-derived from source snapshot — PASS (measured 0.3s) +wizard-work/ledger/CHECK-2026-11-02-wizard-handle-census 0 OK: 19 rows; derives identically at pinned rev 70f51f2272b15da6cae37788ee1eaba5cb7d6354 (measured 0.6s) +wizard-work/ledger/CHECK-commits-census 0 PASS: commits-census.csv and commits-by-day.csv match git at HEAD; commits-full.csv has 2508 rows; total 2508 commits (measured 0.9s) +wizard-work/ledger/CHECK-github-repo-census-2026-11-02.sh 0 [ok] census verified: 15 rows, sorted desc by stars, no duplicate repos, table equals independent re-derivation from raw (measured 0.5s) +wizard-work/ledger/CHECK-ledger-dir-census-2026-11-02 0 VERDICT: rc 0 -- the committed CSV is the derivation at the pinned rev (measured 2.8s) +wizard-work/ledger/CHECK-troupe-tree-census 0 CHECK: headline ok (4841 files, 205602588 bytes) (measured 58.0s) +wizard-work/ledger/CHECK-wizardwork-census 1 KNOWN RED: 11 absent-path lines over 7 subjects, 14 malformed (1-field) lines +wizard-work/quill/CHECK-draft-verification-report-2026-11-02 0 wrote /tmp/verify-2026-11-02-check.tsv (94 rows) (measured 0.6s) +wizard-work/quill/CHECK-quill-draft-compliance 0 CHECK-quill-draft-compliance: 5 leg(s) passed, 0 fault(s), 0 ungradable (measured 6.0s) +wizard-work/sol/CHECK-2026-11-02-untracked-triad 0 PASS: 86 files classified; 86 re-derive to matching category/decision; all files real, untracked, non-ignored; corpus sh (measured 9.3s) +wizard-work/sol/CHECK-sol-lane-triage-2026-11-02 0 VERIFY OK (382 files, categories re-derived, all paths present) (measured 8.5s) +wizard-work/sol/CHECK-sol-news-triage 0 OK: 20 items, bins={'frontier-models': [{'title': 'Gemini 4 Carbon (Google)', 'date': '2026-10-28', 'category': 'frontie (measured 0.3s) +wizard-work/sol/CHECK-sol-profile-file-class-2026-11-02.sh 0 CHECK OK: 69 entries (41 files, 28 dirs); artifact == independently recomputed from live profile disk (measured 0.4s) +wizard-work/sol/CHECK-sol-profile-triage-2026-11-02 0 CHECK OK: 69 live top-level entries re-derived; artifact matches disk (measured 0.2s) +wizard-work/sol/CHECK-working-tree-triage-2026-11-02 0 PASS: 5 modified files classified and re-derived; all real; by_category={'other': 2, 'script': 3}; shard byte-identical. (measured 0.2s) +# row added by hand (Q159 guard, 2026-11-02): CHECK-q159 is the new entry point +# guarding the census this item closed. Five legs, rc 0 measured at this worktree +# with `bash CHECK-q159` (69 s: it runs CHECK-q85-era coverage and a mutant copy). +# The block above is unchanged by this row; the Q159 audit rows and this guard row +# are kept apart so the register leg counts 21 audited paths, not 22 files. +CHECK-q159 0 q159: 5 leg(s), all passed +# row added by hand (Q160, 2026-11-03): CHECK-q160 is a NEW entry point -- the +# guard for the beam test that bound its module to a host path. Four legs, rc 0 +# measured at this worktree with `bash CHECK-q160` (0.9 s); the rows above are +# unchanged by this row. +CHECK-q160 0 q160: 4 leg(s), 0 fault(s), rc 0 diff --git a/wizard-work/volt/q160-import-binding/poison_tarjan.py b/wizard-work/volt/q160-import-binding/poison_tarjan.py new file mode 100644 index 0000000..bb028f6 --- /dev/null +++ b/wizard-work/volt/q160-import-binding/poison_tarjan.py @@ -0,0 +1,14 @@ +"""Poisoned stand-in for beam/tarjan_articulation.py -- every answer is wrong. + +Mutant for CHECK-q160 leg 2: written over the lane copy of the module in a +scratch tree, beside the test. A test that binds the module BESIDE it reads red; +a test that binds a host path (the defect Q160 names) keeps reading green. +""" + + +def articulation_points(adj): + return set() + + +def bridges(adj): + return set()