diff --git a/WORK-QUEUE.md b/WORK-QUEUE.md index f530b7b..b0338ec 100644 --- a/WORK-QUEUE.md +++ b/WORK-QUEUE.md @@ -11832,3 +11832,63 @@ my own runs on `git archive` exports of the heads named.* them as overrides. One concern per commit; removal of the transcript is spark's call, not this item's. - **No decision for Alexander**: not a door, a rate, or a design question. Nothing from `inbox/` is quoted; no file of another author was edited. Appended at the foot; `docs/queue-index.md` re-rendered in this commit. + +--- + +## Q79 — beam's `manifest.py` lands 107 lines with no cell in any gate, cannot see a directory symlink, reads its own output as a tamper, and prints a green empty manifest for a root that does not exist *(beam lane; opened 2026-10-26 by the pipe, at `edac5cf`)* + +`wizard-work/beam/manifest.py` (107 lines, blob `297dcef506e8…`, sha256 `4c07f5747c4e…`) lands at `edac5cf` +("beam: deterministic directory manifest tool (make/check)"), the commit's only change. **The core is right +and half of it is better than the tool it duplicates** — determinism is byte-identical across runs, and it +records a symlink's *target string* rather than the target's content digest, so a retarget between two +identical-content files is caught where `sha256_manifest.py` reads rc 0. Neither of the faults below is in +the hash path. *Tier: **Documented** — my own runs on a `git archive edac5cf` export at another path, python +3.14.7, plus a `git clone --no-hardlinks` at `6cb3d7a` for the parent readings.* + +- **No cell, anywhere, and the count says so.** No test file for the module exists in the lane (41 + `test_*.py` files, none of them for `manifest`); + `python3 -m unittest discover -s wizard-work/beam -p test_manifest.py` → `Ran 0 tests`, `NO TESTS RAN`, + **rc 5**. `bash wizard-work/beam/CHECK` → **rc 0, `Ran 174 tests`** at `edac5cf` **and** at `6cb3d7a`: + 107 lines land and the lane's number does not move — the shape Q76 opened on (`Ran 151` unmoved) and Q77 + opened on (100 lines unmoved), third in this lane in one day. `bash wizard-work/volt/CHECK` is identical at + both heads (`q65: 14 fault(s)`, 93 population / 93 rows, 7 unclassed of 122, rc 1); the file is not a + `verify_*.py`, so no census sees it. **Negative cell, carried:** in a full copy of the tree with + `check()`'s body replaced by `return []` (a tool that can never find a fault) → `bash + wizard-work/beam/CHECK` **rc 0, `Ran 174`, `OK`**. +- **A directory symlink is in no entry, in either direction.** After `make` over a real tree, + `ln -s newdir` → **rc 0, `OK: manifest matches`**, and a re-`make` lists only `['a.txt']`; + removing one is equally silent. `os.walk(root, followlinks=False)` puts a symlinked directory in + `dirnames`, and the only `islink` test is inside the `filenames` loop. A dir→symlink *swap* is caught + (rc 1, `MISSING: sub/b.bin`, `EXTRA: sub_real/b.bin`), so the gap is additions and removals of that node + class reading green — which is what a manifest exists to make impossible. +- **Its own output, written inside the root, reads as a tamper.** `make /MANIFEST.json` → rc 0, + then `check` → **rc 1, `EXTRA: MANIFEST.json`**; a second `make` grows `4 → 5` entries. The sibling tool + in the same directory computes the output's relpath and skips it, in `cmd_gen` and `cmd_verify`: + `sha256_manifest.py gen --out /MANIFEST.txt` then `verify` → **rc 0, `OK: 3 files verified`**. Two + tools, one lane, opposite verdicts on the same input. +- **`make` on a root that does not exist writes a green empty manifest.** `make /nonexistent-root-xyz + out.json` → **rc 0**, `manifest written: 0 entries`, `entries: []`. A typo'd path yields an artifact whose + verdict is success. Inherited — `sha256_manifest.py gen /nonexistent-xyz` also rc 0, **0 bytes** — so it is + the lane's contract, and the new file had the chance to break it and did not. +- **An ungradable manifest reports as a graded fault.** `{not json` → uncaught `JSONDecodeError`; `{}` → + `KeyError: 'entries'`; both **exit 1**, the same code as "the tree does not match". No rc 2 class, and the + docstring states no rc contract, where Q74's file states all three codes. +- **Not claimed.** Performance; that the walk is atomic (a file changed between `open` and `stat` is read + twice); hardlinks, xattrs, ACLs, mtime, mode, ownership, none of which the entry carries by design; + non-UTF-8 names on a filesystem that cannot store one; Windows path semantics; trees larger than the + fixtures built here. The permission-denied path is **Unrecovered** — this host reads `chmod 000` files as + root, rc 0, a null. + +**Done means:** `test_manifest.py` lands as `unittest.TestCase` cells that `discover` collects (the lane's +`Ran N` moves and the new count is stated), carrying at least four negative cells — a symlinked directory +added after `make` turning it red, a manifest inside the root reading clean, a missing or unreadable root +exiting **2** with no artifact written, and a corrupt manifest exiting **2** — with `1` reserved for a +graded fault; `sha256_manifest.py`'s overlapping surface is either retired in favour of this file or named as +canonical, one of the two and not both; and the rc stated in the commit that lands the change. One concern +per commit. + +**Status: open and unclaimed.** Beam's lane by authorship; anyone may take it. Evidence: reply 116 §2–§4; +export `/root/.hermes/cache/scratch/beam-manifest-2271494/head` (`edac5cf`) and `…/parent` (`6cb3d7a`); +clone `…/clone-par`; sabotage tree `…/sab`; probes `/root/.hermes/cache/scratch/beam-manifest-probe.py` and +`…-probe2.py`; sibling comparisons `…/sib-*`, `…/sib2-*`, `…/swap-*`, `…/add-*`. Nothing from `inbox/` is +quoted; no file another party authored was edited. diff --git a/docs/queue-index.md b/docs/queue-index.md index ac897ca..fffdd4a 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. 70 sections carry 65 ids because 5 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. 71 sections carry 66 ids because 5 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:` | |---|---|---|---|---|---|---| @@ -77,7 +77,8 @@ | 67 | Q75 | 11651-11664 | 3867 | opening | ledger's two census TSVs carry seven lines that are not rows and one path no file on disk has, and no gate in the lane can see either *(ledger lane; opened 2026-10-26 by the pipe, at `b82b023`)* | open and unclaimed. | | 68 | Q76 | 11665-11705 | 14780 | opening | beam's new median tests reach no gate, and the lane gate that would run them is red for a host path older than the commit *(beam lane; opened 2026-10-26 by the pipe, at `c3ce8dd`)* | open and unclaimed. | | 69 | Q77 | 11706-11787 | 20226 | opening | beam's segment tree lands 100 lines and the lane's count does not move, its failure path reports as an import `SystemExit` rather than a cell, and out-of-range indices are silently clamped *(beam … | open and unclaimed. | -| 70 | Q78 | 11788-11834 | 4643 | opening | spark's `3d72f9d` deletes the Q63 `_check()` failure path from four verifiers and drifts five ledger rows, and the new email-validator suite imports a host path *(spark lane; opened 2026-10-26 by the … | -- | +| 70 | Q78 | 11788-11837 | 4649 | opening | spark's `3d72f9d` deletes the Q63 `_check()` failure path from four verifiers and drifts five ledger rows, and the new email-validator suite imports a host path *(spark lane; opened 2026-10-26 by the … | -- | +| 71 | Q79 | 11838-11894 | 5303 | opening | beam's `manifest.py` lands 107 lines with no cell in any gate, cannot see a directory symlink, reads its own output as a tamper, and prints a green empty manifest for a root that does not exist … | open and unclaimed. | ## Ids with no `## ` heading @@ -192,7 +193,8 @@ The block below is the parse this document renders, byte for byte. `--check` com "Q75", "Q76", "Q77", - "Q78" + "Q78", + "Q79" ], "nested": [ { @@ -291,9 +293,9 @@ The block below is the parse this document renders, byte for byte. `--check` com "end_line": 8, "line": 1 }, - "queue_bytes": 1741821, - "queue_lines": 11834, - "queue_sha256": "97dedce237cae5a3d1942cfc0911e4e7d29c77e7603b6c0546418b1f92390fa4", + "queue_bytes": 1747130, + "queue_lines": 11894, + "queue_sha256": "1d543db876d8ca937e0674994165c1f157cdf51ac250ecfdf288386c78579796", "sections": [ { "bytes": 3139, @@ -1124,16 +1126,28 @@ The block below is the parse this document renders, byte for byte. `--check` com "title": "beam's segment tree lands 100 lines and the lane's count does not move, its failure path reports as an import `SystemExit` rather than a cell, and out-of-range indices are silently clamped *(beam \u2026" }, { - "bytes": 4643, - "end_line": 11834, + "bytes": 4649, + "end_line": 11837, "id": "Q78", "line": 11788, - "lines": 47, + "lines": 50, "role": "opening", "role_detail": "", "status": null, "status_line": null, "title": "spark's `3d72f9d` deletes the Q63 `_check()` failure path from four verifiers and drifts five ledger rows, and the new email-validator suite imports a host path *(spark lane; opened 2026-10-26 by the \u2026" + }, + { + "bytes": 5303, + "end_line": 11894, + "id": "Q79", + "line": 11838, + "lines": 57, + "role": "opening", + "role_detail": "", + "status": "open and unclaimed.", + "status_line": 11890, + "title": "beam's `manifest.py` lands 107 lines with no cell in any gate, cannot see a directory symlink, reads its own output as a tamper, and prints a green empty manifest for a root that does not exist \u2026" } ] }