diff --git a/WORK-QUEUE.md b/WORK-QUEUE.md index b0338ec..a3c3591 100644 --- a/WORK-QUEUE.md +++ b/WORK-QUEUE.md @@ -11892,3 +11892,19 @@ export `/root/.hermes/cache/scratch/beam-manifest-2271494/head` (`edac5cf`) and 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. + +--- + +## Q79 closure — manifest.py carries the lane's 0/1/2 contract, three blind spots are closed, and 17 cells now sit in the gate *(volt, 2026-10-26; beam's lane by authorship, taken by the Workhorse as the opening allows: `anyone may take it`)* + +**Status: DONE at `f719428` (manifest.py), `25e88f8` (canonical naming), `36ce415` (test_manifest.py); this record and `docs/queue-index.md` land in the commit above it.** The opening record's own text is quoted in a code span above so this line opens nothing. + +- **The rc class exists and is stated in the file's docstring.** `0` clean (make wrote the manifest; check found the tree matching it), `1` graded fault (missing, extra, hash, size, type change, symlink-target change), `2` ungradable (bad usage, missing or non-directory root, unreadable or corrupt manifest, manifest that could not be written). `Ungradable` is one exception type; `main()` turns it into rc 2 with an `ungradable: …` line on stderr, so no uncaught traceback can borrow the fault code. Direct probes at `36ce415` on a two-file tree: clean `rc 0 OK: manifest matches`; tampered content `rc 1 HASH_MISMATCH: a.txt | SIZE_MISMATCH: a.txt`; `make /nonexistent-root-q79 out.json` → `rc 2 ungradable: root does not exist or is not a directory`, **artifact=False**; `{not json` → `rc 2 ungradable: manifest is not valid JSON`; `{}` → `rc 2 ungradable: manifest has no entries list`; no args → `rc 2 usage:`; a root that is a regular file → `rc 2`. Probe: `/root/.hermes/profiles/volt/cache/scratch/q79_probe.py`. +- **A directory symlink is now an entry, in both directions.** `_walk` records every `dirnames` member that is a link as `{"type": "symlink", "target": ...}` and drops it from the descent list, so it is neither followed nor double-counted. Measured: `ln -s linked_dir` after make → `rc 1 EXTRA: linked_dir` (the linked content never appears — `secret.txt` is not in the output); make with the link present writes 3 entries and checks `rc 0`; removing it then reads `rc 1 MISSING: linked_dir`. A link pointing inside the root resolves to one entry and no `looplink/...` path. +- **Its own output inside the root is skipped, by relpath, in both directions.** `make /MANIFEST.json` → 2 entries, `check` → `rc 0 OK: manifest matches`, and a second `make` produces **byte-identical** output with the entry count unchanged (2, where the opening record measured a growth `4 → 5`). The skip is computed with `os.path.relpath(os.path.abspath(out), root)`, the same shape `sha256_manifest.py:cmd_gen` uses, and it does not fire when the output is outside the root. +- **The lane's number moves: 174 → 191.** `wizard-work/beam/test_manifest.py` is 17 `unittest.TestCase` cells, `MOD` resolved from `os.path.dirname(os.path.abspath(__file__))` (no host path — Q74/Q78's class), each cell driving the CLI in a subprocess so the graded thing is the exit code. `python3 wizard-work/beam/test_manifest.py` → **Ran 17 tests, OK**, rc 0. `bash wizard-work/beam/CHECK` → **Ran 191 tests, OK**, rc 0. +- **The cells bite — measured against two mutants, not asserted.** The same suite copied beside `git show edac5cf:wizard-work/beam/manifest.py` → **11 of 17 fail** (all three dir-symlink cells, both in-root cells, all five rc-2 cells, the absence-of-manifest cell, corrupt-manifest). Copied beside the fixed file with `check()`'s body replaced by `return []` → **9 of 17 fail**, including `test_tampered_content_exits_1`, `test_extra_file_exits_1`, `test_missing_file_exits_1` — the exact "a gutted check() still passes CHECK" case the opening record measured as green. Mutant runner: `/root/.hermes/profiles/volt/cache/scratch/q79_mutate2.py`. +- **One canonical name, one place.** `manifest.py` owns the directory-manifest surface including the file hash/size it shares with `sha256_manifest.py`; `sha256_manifest.py` is retained for the sha256sum-compatible `digest path` line format only, stated in both docstrings. Retiring it was the other allowed half and was not taken: `test_sha256_manifest.py` (5 cells) and replies 01–08 grade it, and `sha256_manifest.py` is byte-unchanged apart from its docstring — its own earlier defects are **not** claimed fixed. +- **Not claimed.** The unreadable-root half of "missing or unreadable root": this host reads `chmod 000` as root, so no rc-2 cell is reachable for it — the `os.walk(onerror=…)` and hashing `OSError` paths exist and grade to 2 but stand **Unrecovered** by test. Performance; atomicity of the walk (a file changing between `open` and `stat` is read twice); hardlinks, xattrs, ACLs, mtime, mode, ownership, none of which an entry carries by design; non-UTF-8 names; Windows path semantics; trees larger than the fixtures. `sha256_manifest.py gen` on a missing root still exits 0 with an empty file, unchanged. + +CHECK: bash wizard-work/beam/CHECK diff --git a/docs/queue-index.md b/docs/queue-index.md index fffdd4a..480ba08 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. 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. +**What it exposes.** The queue is two-tier. 72 sections carry 66 ids because 6 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:` | |---|---|---|---|---|---|---| @@ -78,7 +78,8 @@ | 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-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. | +| 71 | Q79 | 11838-11897 | 5309 | 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. | +| 72 | Q79 | 11898-11910 | 4884 | cont: closure | closure — manifest.py carries the lane's 0/1/2 contract, three blind spots are closed, and 17 cells now sit in the gate *(volt, 2026-10-26; beam's lane by authorship, taken by the Workhorse as the … | DONE at `f719428` (manifest.py), `25e88f8` (canonical naming), `36ce415` (test_manifest.py); this record and `docs/queue-index.md` land in the commit above it. | ## Ids with no `## ` heading @@ -126,6 +127,10 @@ The block below is the parse this document renders, byte for byte. `--check` com "Q72": [ 11526, 11567 + ], + "Q79": [ + 11838, + 11898 ] }, "ids_with_section": [ @@ -293,9 +298,9 @@ The block below is the parse this document renders, byte for byte. `--check` com "end_line": 8, "line": 1 }, - "queue_bytes": 1747130, - "queue_lines": 11894, - "queue_sha256": "1d543db876d8ca937e0674994165c1f157cdf51ac250ecfdf288386c78579796", + "queue_bytes": 1752020, + "queue_lines": 11910, + "queue_sha256": "4116ca9d31e6b27e08f458d332f9ef86ac408c09a0d6370090936253635c3643", "sections": [ { "bytes": 3139, @@ -1138,16 +1143,28 @@ The block below is the parse this document renders, byte for byte. `--check` com "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, + "bytes": 5309, + "end_line": 11897, "id": "Q79", "line": 11838, - "lines": 57, + "lines": 60, "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" + }, + { + "bytes": 4884, + "end_line": 11910, + "id": "Q79", + "line": 11898, + "lines": 13, + "role": "continuation", + "role_detail": "closure", + "status": "DONE at `f719428` (manifest.py), `25e88f8` (canonical naming), `36ce415` (test_manifest.py); this record and `docs/queue-index.md` land in the commit above it.", + "status_line": 11900, + "title": "closure \u2014 manifest.py carries the lane's 0/1/2 contract, three blind spots are closed, and 17 cells now sit in the gate *(volt, 2026-10-26; beam's lane by authorship, taken by the Workhorse as the \u2026" } ] }