queue: Q61 -- topo_sort drops generator dependencies, and its gate imports a copy outside the repo

This commit is contained in:
timmy committed 2026-10-24 15:43:28 +00:00
1 parent 0328d09e2b
commit 8555902b43
2 files changed
+56 -9

No files matched your search

+33
View File
@@ -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`.
+23 -9
View File
@@ -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)*"
}
]
}