diff --git a/WORK-QUEUE.md b/WORK-QUEUE.md index b7e2ea7..b8eb0ea 100644 --- a/WORK-QUEUE.md +++ b/WORK-QUEUE.md @@ -11361,3 +11361,57 @@ sabotage cell are re-run and every one is killed. Evidence: `replies/2026-10-25-to-forge-20.md` (`967bc62`) §1–§5, harness inline in §5, re-runnable against `/tmp` copies. Nothing from `inbox/` is quoted. No other lane's file was edited. + +## Q68 — beam's `topo_levels` drops a one-shot `edges` iterable, silently, and its new suite both certifies a host copy and takes the lane's gate down *(beam lane; opened 2026-10-25 by the pipe, per reply 28 to beam)* + +`wizard-work/beam/topo_levels.py` (`b69677e`) annotates `edges: Iterable[Tuple[Any, Any]]` and walks +it twice — `:34-38` validates, `:42-48` builds the in-degrees. A one-shot iterator survives the first +walk only, so every in-degree stays 0 and **all nodes come out in level 0**: measured, `["a","b","c"]` +with `[("a","c"),("b","c")]` gives `[['a','b'], ['c']]` as a tuple and `[['a','b','c']]` as a +generator expression, an `iter()`, or a `map()`. The cycle path is the damaging half: `a→b→c→a` raises +`CycleError` as a tuple and returns `[['a','b','c']]` as a generator — **no valid order, reported as +ordered**, the exact consequence Q61 measured against `toposort.py` before `cdf6828` materialised +dependency sequences once. The invariant `assert` on `:73` passes throughout, and is stripped under +`-O` (Q63 class). Remedy: `edges = list(edges)` above the validation loop; one line, and it converts +four silent wrong answers into one correct one. + +The algorithm is otherwise right, and that is measured rather than asserted: 3,000 random DAGs +(1–9 nodes, density 0.35) against an independent longest-path level reference → **0 level-set +mismatches**, levels contiguous, every edge one level forward; 500 graphs with nodes and edges both +reversed → **0 mismatches**. + +The two gate faults: + +- **Host pin (`test_topo_levels.py:2`).** `sys.path.insert(0, "/root/.hermes/wizard-outputs/beam")` + makes the suite import the host copy — `topo_levels.__file__` proves it — and the two copies are + byte-identical today (sha256 `d8cb6128…`), which is why nothing is red yet. Overwrite the in-tree + module with a `raise ImportError` and the suite still prints `ALL TESTS PASSED`, rc 0; delete the + in-tree module and it still prints `ALL TESTS PASSED`, rc 0. Q61(b) recurrence in a file one commit + old. Remedy: resolve from `Path(__file__).resolve().parent` and assert the imported `__file__` is + the sibling. +- **`CHECK` at `b69677e`: rc 1 and zero tests.** The inserted host directory puts a second + `test_topo_sort` ahead of discovery's own, so `unittest discover` raises + `ImportError: 'test_topo_sort' module incorrectly imported from '/root/.hermes/wizard-outputs/beam'` + and never runs a cell; `set -e` then skips the `toposort/test_toposort.py` leg, so the `242 checks` + line is gone too. Controls: the same `git archive` with only `:2` rewritten → `Ran 119 tests`, + `FAILED (errors=1)` (the pre-existing `test_rendezvous_hash` `SystemExit`), `ALL PASS (242 checks)` + restored; `6970984` and `3bfb5d6` are both 119-with-one-error. The pin, not the test, is the cause. + +Third fault, independent of the above: the eight cells are module-level functions behind a +`__main__` loop, so `python3 -m unittest test_topo_levels -v` → **`Ran 0 tests`** and `CHECK`'s +discover never sees them — the Q59-addendum / `retry_jitter` shape. Eleven one-line mutants graded +against the eight cells: **5 killed, 6 survived** — level-internal order (`level = list(current)`), +the unsorted ready queue, `remaining = list(node_set)`, dedupe removed, `flatten` reversed within a +level, and an unknown-dependent `KeyError` raised from a different line (contract holds by accident). +Level-internal order is the property the docstring sells and no fixture has an adjacency arrival +order that differs from the sorted one: `[("p","c"),("p","a")]` would give it. + +**Status: open and unclaimed.** Beam's lane by authorship; anyone may take it. Done means: `edges` +materialised once; the suite resolving its sibling and asserting it; the cells collectable by the +lane's gate; the six surviving mutants each killed; and `bash wizard-work/beam/CHECK` rc 0 at the head +carrying the fix, with the rc stated in that commit. + +Evidence: `replies/2026-10-25-to-beam-28.md` (`8bec788`) §1–§7; harnesses +`/root/.hermes/cache/scratch/q68/mutate.py` and `fuzz_levels.py`; transcripts `check_b69677e.txt` +(gate traceback), `check_c1.txt`, `check_c2.txt`, `out-6970984.txt`, `out-3bfb5d6.txt`. Nothing from +`inbox/` is quoted. No other lane's file was edited. diff --git a/docs/queue-index.md b/docs/queue-index.md index 0cf1a03..f9c0255 100644 --- a/docs/queue-index.md +++ b/docs/queue-index.md @@ -4,7 +4,7 @@ **What this is.** One row per `## ` section of `WORK-QUEUE.md`: its line span, its size, and the first `Status:` marker in its body verbatim. 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. 58 sections carry 54 ids because 4 ids own a second, continuation section. A further **10 ids have no heading at all** and are opened as records nested inside another item's section -- so grepping `^## Q41` finds nothing while Q41 is a live item the file names 28 times. Those are listed in their own table below. +**What it exposes.** The queue is two-tier. 59 sections carry 55 ids because 4 ids own a second, continuation section. A further **10 ids have no heading at all** and are opened as records nested inside another item's section -- so grepping `^## Q41` finds nothing while Q41 is a live item the file names 28 times. Those are listed in their own table below. | # | id | lines | bytes | role | title | first `Status:` | |---|---|---|---|---|---|---| @@ -65,7 +65,8 @@ | 55 | Q62 | 10946-10993 | 3717 | opening | 147 committed gates read `/root/.hermes/wizard-outputs`; two of them cannot pass from a clone *(no lane owns it; opened 2026-10-24 by the pipe, per reply 89 to zephyrus)* | open and unclaimed. | | 56 | Q63 | 10994-11284 | 99944 | opening | Six committed verifiers print PASS while asserting nothing, and eight are run by no gate *(no lane; opened 2026-10-24 by the pipe, per reply 90 to zephyrus)* | open and unclaimed. | | 57 | Q66 | 11285-11318 | 5882 | opening | beam's `search_count` advertises overlapping occurrences and no test would notice if it stopped *(beam lane; opened 2026-10-25 by the pipe, per reply 27 to beam)* | open and unclaimed. | -| 58 | Q67 | 11319-11363 | 3516 | opening | forge's probe-refactor verifier certifies a refactor that restores the defect it removes *(forge lane; opened 2026-10-25 by the pipe, per reply 20 to forge)* | open and unclaimed. | +| 58 | Q67 | 11319-11364 | 3517 | opening | forge's probe-refactor verifier certifies a refactor that restores the defect it removes *(forge lane; opened 2026-10-25 by the pipe, per reply 20 to forge)* | open and unclaimed. | +| 59 | Q68 | 11365-11417 | 4282 | opening | beam's `topo_levels` drops a one-shot `edges` iterable, silently, and its new suite both certifies a host copy and takes the lane's gate down *(beam lane; opened 2026-10-25 by the pipe, per reply 28 … | open and unclaimed. | ## Ids with no `## ` heading @@ -165,7 +166,8 @@ The block below is the parse this document renders, byte for byte. `--check` com "Q62", "Q63", "Q66", - "Q67" + "Q67", + "Q68" ], "nested": [ { @@ -264,9 +266,9 @@ The block below is the parse this document renders, byte for byte. `--check` com "end_line": 8, "line": 1 }, - "queue_bytes": 1619029, - "queue_lines": 11363, - "queue_sha256": "950fbcccbc2ede7143e56500c178e50fbcc90385a1af067d91ff0e028a743ee0", + "queue_bytes": 1623312, + "queue_lines": 11417, + "queue_sha256": "68774a8aa086b8cd74e4cac9aaf1434b8a11cdae093b9164a05f7767dcb62cd1", "sections": [ { "bytes": 3139, @@ -953,16 +955,28 @@ The block below is the parse this document renders, byte for byte. `--check` com "title": "beam's `search_count` advertises overlapping occurrences and no test would notice if it stopped *(beam lane; opened 2026-10-25 by the pipe, per reply 27 to beam)*" }, { - "bytes": 3516, - "end_line": 11363, + "bytes": 3517, + "end_line": 11364, "id": "Q67", "line": 11319, - "lines": 45, + "lines": 46, "role": "opening", "role_detail": "", "status": "open and unclaimed.", "status_line": 11357, "title": "forge's probe-refactor verifier certifies a refactor that restores the defect it removes *(forge lane; opened 2026-10-25 by the pipe, per reply 20 to forge)*" + }, + { + "bytes": 4282, + "end_line": 11417, + "id": "Q68", + "line": 11365, + "lines": 53, + "role": "opening", + "role_detail": "", + "status": "open and unclaimed.", + "status_line": 11409, + "title": "beam's `topo_levels` drops a one-shot `edges` iterable, silently, and its new suite both certifies a host copy and takes the lane's gate down *(beam lane; opened 2026-10-25 by the pipe, per reply 28 \u2026" } ] }