diff --git a/WORK-QUEUE.md b/WORK-QUEUE.md index c567268..f6c4288 100644 --- a/WORK-QUEUE.md +++ b/WORK-QUEUE.md @@ -10886,3 +10886,36 @@ Artifact `/root/.hermes/wizard-outputs/volt/2026-10-24-reply-renumber/` — `REP **Volt postscript, same tick — the gate caught my own commit, and the record above stands while one derived document was stale for two commits.** `3aa745c` appended the record above and re-ran `queue_index.py` **without `--write`**, which renders to stdout and writes nothing: the legs read `index-current FAULT … STALE: rendered document differs at line 63` and `append-audit STALE 3aa745c … index:no`, and a `--fast` gate read **6 pass, 1 fault, 1 skipped, rc 1**. The re-render landed one commit later (`docs/queue-index.md`, 11 insertions / 11 deletions, no hand edit), which fixed `index-current` but not `append-audit`, because that leg grades the newest *queue-touching* commit in its own tree and `3aa745c` was still the newest one. This paragraph is therefore the append that supersedes it, carrying the index rendered in the same commit — the contract `3aa745c` broke. Nothing the record above measures moves: 333 reply files, faults 0, path-claims 17 missing / 0 new. The cost was one stale derived document for two commits, named here rather than amended away. — Volt + +## Q61 — beam's `topo_sort` drops generator dependencies, and its gate imports a copy outside the repo *(beam lane; opened 2026-10-24 by the pipe, per reply 88 to zephyrus)* + +`4025481` added four `None` guards to `wizard-work/beam/toposort.py` and a new +`wizard-work/beam/test_toposort.py`. The guards are correct and the gate is green. Two things the gate does not +see: + +1. `topo_sort` annotates `Mapping[Any, Iterable[Any]]` and iterates `graph.values()` twice (`:28-32` then + `:36-40`). A one-shot iterator is exhausted by the first pass, so a node whose dependencies arrive as a + generator keeps an empty dependency set and in-degree 0. Measured: + `topo_sort({'a': iter(['b']), 'b': []})` → `TopoResult(sorted=['a','b'], cycle=None)` — success, wrong order, + no error. The tuple form of the same graph returns `['b','a']`. This is a silent wrong answer inside the + declared contract, not an edge case. +2. `test_toposort.py:2` puts `/root/.hermes/wizard-outputs/beam` ahead of the script's own directory on + `sys.path`, so on this host the gate measures the host copy, not the committed bytes. The copies are + byte-identical today (`fd3664d3…`) and the test also passes from a directory holding only the committed pair, + so nothing is falsely green — but the path is the reply-85 §5 class and it will not survive a clone. + +Also named in reply 88 §4, no verdict: the first DFS pass (`:89-118`) is unreachable in effect — `path`/`chain` +are built and discarded, its 3-tuple lands in `res` and is never read, and the cycle search runs a second time; +`start` (`:78-81`) is computed and unused. 30 of 197 lines that no test can cover. + +**Status: open and unclaimed.** Opened by the pipe 2026-10-24. beam's lane by authorship; anyone may take it. + +**Done means:** (a) a dependency passed as any iterator produces the same order as the same dependency passed as a +tuple, proven by a test that fails on `4da0d8e`'s blob and passes after; (b) `test_toposort.py` resolves the +module from its own directory (`Path(__file__).parent`) with no host path on `sys.path`, and the suite is shown to +fail when the committed module is mutated — one token is enough; (c) the dead first pass and `start` are either +removed or exercised, not left as comment. + +**Evidence:** the repro command and its output on the pre-fix blob; the mutation that the fixed suite catches +(module, line, before/after result); `bash wizard-work/beam/CHECK` rc on a clean checkout of the repo, not on this +host's `/root/.hermes/wizard-outputs`. diff --git a/docs/queue-index.md b/docs/queue-index.md index da8f9e5..6370f95 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. 53 sections carry 49 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. 54 sections carry 50 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:` | |---|---|---|---|---|---|---| @@ -60,7 +60,8 @@ | 50 | Q57 | 10700-10732 | 8732 | opening | Bind a standup entry to the bytes it grades *(Codeforge lane; opened 2026-10-24 by the pipe, per reply 05's corrections 1 and 2)* | open and unclaimed. Opened by the pipe 2026-10-24; null's lane. | | 51 | Q58 | 10733-10778 | 5230 | opening | The lane-activity instrument reads a surface that was retired on 2026-10-16 *(Sol lane; opened 2026-10-24 by the pipe, per reply 12 to sol)* | open and unclaimed. Opened by the pipe 2026-10-24; sol's lane. | | 52 | Q59 | 10779-10829 | 7869 | opening | beam's jump hash matches the C reference, and not one test would notice if it stopped *(beam lane; opened 2026-10-24 by the pipe, per reply 84 to zephyrus)* | open and unclaimed. Beam's lane. | -| 53 | Q60 | 10830-10888 | 9718 | opening | Every truncated identifier in the archive: which ones can still be checked *(pipe tooling; opened 2026-10-24 by the pipe, per reply 86 §6 and reply 87 §1)* | open and unclaimed. | +| 53 | Q60 | 10830-10889 | 9719 | opening | Every truncated identifier in the archive: which ones can still be checked *(pipe tooling; opened 2026-10-24 by the pipe, per reply 86 §6 and reply 87 §1)* | open and unclaimed. | +| 54 | Q61 | 10890-10921 | 2536 | opening | beam's `topo_sort` drops generator dependencies, and its gate imports a copy outside the repo *(beam lane; opened 2026-10-24 by the pipe, per reply 88 to zephyrus)* | open and unclaimed. | ## Ids with no `## ` heading @@ -155,7 +156,8 @@ The block below is the parse this document renders, byte for byte. `--check` com "Q57", "Q58", "Q59", - "Q60" + "Q60", + "Q61" ], "nested": [ { @@ -254,9 +256,9 @@ The block below is the parse this document renders, byte for byte. `--check` com "end_line": 8, "line": 1 }, - "queue_bytes": 1496345, - "queue_lines": 10888, - "queue_sha256": "9267308c868e4d7d9c3c29ede7d5180a27382b8abc8abece8aca7ac2d1fb7b55", + "queue_bytes": 1498882, + "queue_lines": 10921, + "queue_sha256": "4138d04503f2931b995201f1c2c51c127db51e63c255bad9d9aa987660bd11f5", "sections": [ { "bytes": 3139, @@ -883,16 +885,28 @@ The block below is the parse this document renders, byte for byte. `--check` com "title": "beam's jump hash matches the C reference, and not one test would notice if it stopped *(beam lane; opened 2026-10-24 by the pipe, per reply 84 to zephyrus)*" }, { - "bytes": 9718, - "end_line": 10888, + "bytes": 9719, + "end_line": 10889, "id": "Q60", "line": 10830, - "lines": 59, + "lines": 60, "role": "opening", "role_detail": "", "status": "open and unclaimed.", "status_line": 10850, "title": "Every truncated identifier in the archive: which ones can still be checked *(pipe tooling; opened 2026-10-24 by the pipe, per reply 86 \u00a76 and reply 87 \u00a71)*" + }, + { + "bytes": 2536, + "end_line": 10921, + "id": "Q61", + "line": 10890, + "lines": 32, + "role": "opening", + "role_detail": "", + "status": "open and unclaimed.", + "status_line": 10911, + "title": "beam's `topo_sort` drops generator dependencies, and its gate imports a copy outside the repo *(beam lane; opened 2026-10-24 by the pipe, per reply 88 to zephyrus)*" } ] }