diff --git a/WORK-QUEUE.md b/WORK-QUEUE.md index a0b4fed..b03f4fa 100644 --- a/WORK-QUEUE.md +++ b/WORK-QUEUE.md @@ -12188,3 +12188,31 @@ another party authored was edited. - **Each mutant kills at least one named cell** (scratch `q84_mutants.py`, results `q84-mutants.json`): M1 kind ordering flipped → rc 1, five dead cells incl. `test_half_open_adjacency_both_orders`; M2 `if s >= e: continue` removed → rc 1, five dead incl. `test_zero_length_against_wide_interval`; M3 start-pair loop removed → rc 1, four dead incl. `test_nested_and_disjoint_pairs`; M4 `has_any_overlap` reverted to the pair-list body → rc 1, exactly `test_has_any_overlap_does_not_build_pair_list` and the timing cell; M5 the early-exit boundary `s < max_end` → `s <= max_end` → rc 1, `test_has_any_overlap_true_and_false`. Baseline copy unpatched: rc 0. - **The timing claim, measured on this host.** `has_any_overlap([(0,1000)]*2000)` → `True` in **0.004137 s** (new) against **48.54 s** for the old body (the pipe's reading at `517362f`). The pair function is untouched apart from its docstring: same sweep, same event kinds, same sorted output, same `ValueError`. - **No scope creep and no other author's text edited.** The diff is 151 insertions across the two files; no other lane file, no `inbox/` quotation, no decision asked of Alexander — nothing here is a door, a rate, or a design question. One concern per commit holds: the cells, the docstring correction and the early exit are the item's own four asks. Report and mutant battery: `/root/.hermes/wizard-outputs/volt/q84-report.md`, `/root/.hermes/wizard-outputs/volt/q84-mutants.json`. + +--- + +## Q83 closure — the five unpinned `hermes_profile_health.py` branches are five cells (spark gate 9 → 14), and the item's own first row is corrected *(volt, 2026-10-27; spark's lane by authorship, taken as the opening record says `open and unclaimed`)* + +**Status: DONE at `fe09917`; this record and `docs/queue-index.md` land in the commit above it.** The opening record's own `Status: open and unclaimed.` line is left standing, as append-only discipline requires; the closure is this line, not an edit above it. Report: `/root/.hermes/wizard-outputs/volt/q83-report.md`. + +- **Five cells, one per row, each asserting the exact string and the exact rc** — appended to `wizard-work/spark/test_hermes_profile_health.py` (193 lines): `test_config_missing_exits_1` (rc 1, `config.yaml missing`), `test_config_as_directory_exits_1` (rc 1, `config.yaml exists but is not a regular file`), `test_config_no_document_exits_1` (rc 1, `config.yaml parses to no document`, and **not** `not a mapping`), `test_config_empty_mapping_exits_1` (rc 1, `config.yaml is an empty mapping`), `test_profile_home_is_a_file_exits_2` (rc 2, `profile home is not a directory`, empty stdout). Each cell also splits the streams: a rc 1 is a verdict with empty stderr, a rc 2 is a refusal with empty stdout. All five feed the same `_fixture` shapes the item measured; `hermes_profile_health.py` is **not touched** (no tool byte moved). +- **The gate's count, before and after, same host and same command.** `bash wizard-work/spark/CHECK` at `f2ff9c7` → `Ran 9 tests in 7.719s`, `OK`, `VERIFIED`, rc 0; at `fe09917` → `Ran 14 tests in 10.466s`, `OK`, `VERIFIED`, rc 0. The `CHECK` comment now states the 14 and names the five Q83 cells. +- **Six mutant trees, six kills, dead cell names printed** (harness `/root/.hermes/wizard-outputs/volt/q83_mutants.py`, results `/root/.hermes/wizard-outputs/volt/q83-mutants.json`, trees `/root/.hermes/profiles/volt/cache/scratch/q83mut-*/`; each tree = a copy of the tool with one unique-anchor patch plus the committed suite, CLI run against that row's fixture and then `unittest discover -v`): + + | mutant | CLI before → after | dead cells | + |---|---|---| + | M0 baseline copy | rc 1, `config.yaml missing` (suite rc 0, 0 dead) | — | + | M9 `exists` refusal deleted | rc 1 → rc 1, message → `exists but is not a regular file` | `test_config_missing_exits_1` | + | M9b `exists` + `is_file` refusals deleted | rc 1 → rc 2 `ungradable: config.yaml unreadable: [Errno 2]` | `test_config_missing_exits_1`, `test_config_as_directory_exits_1` | + | M10 `is_file` refusal deleted | rc 1 → rc 2 `ungradable: … [Errno 21] Is a directory` | `test_config_as_directory_exits_1` | + | M11 `data is None` grade deleted | rc 1 → rc 1, message → `config.yaml is a NoneType, not a mapping` | `test_config_no_document_exits_1` | + | M12 `if not data:` → `if False:` | rc 1 → rc 0, `Profile is healthy` | `test_config_empty_mapping_exits_1` | + | M13 `is_dir` refusal deleted | rc 2 → rc 1, `Profile is unhealthy: 5 issue(s)` | `test_profile_home_is_a_file_exits_2` | + + M13's five issues are `config.yaml missing`, `skills/ missing`, `plugins/ missing`, `cron/ missing`, `memories/ missing` — the item's "five named faults" row reproduced. +- **The item's first row is corrected, not edited in place.** Q83's table reads *"refusal deleted → rc 0, 'Profile is healthy'"* for `config.yaml missing`. Deleting only that refusal does **not** produce rc 0: the next check, `if not cfg.is_file():`, is also true for a missing path, so the tool still exits 1 and mislabels a missing config as `exists but is not a regular file` (M9, measured). A rc-only cell would have stayed green there; the string assertion is what kills it. Reaching rc 0 needs a patch that makes `grade_config` pass a missing config, and removing both refusals gives rc 2 unreadable (M9b) — both variants kill the same cell, so the branch is pinned either way. +- **Live behaviour unchanged.** `for d in /root/.hermes/profiles/*/` at this revision: **27 profiles, 26 rc 0, 1 rc 1** — `spark-snippet-wizard`, the single issue `config.yaml missing` — now the branch `test_config_missing_exits_1` pins. +- **One concern in one commit.** `fe09917` = five cells + module docstring + the `CHECK` comment's count, two files, +54/−2. The queue-index render is its own commit. +- **Not claimed.** That every branch of the tool is pinned (six rows cover the five branches this item named, not an enumeration of the file); that the suite is fast (14 cells, ~10 s, subprocess per cell); `--profiles-root`/`HERMES_PROFILES_DIR` precedence beyond Q81's existing cell; anything about `inbox/`. + +CHECK: cd /root/troupe-standup && bash wizard-work/spark/CHECK && grep -c '^ def test_' wizard-work/spark/test_hermes_profile_health.py diff --git a/docs/queue-index.md b/docs/queue-index.md index f460015..8410067 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. 79 sections carry 71 ids because 8 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. 80 sections carry 71 ids because 9 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:` | |---|---|---|---|---|---|---| @@ -86,7 +86,8 @@ | 76 | Q82 | 12049-12077 | 5314 | cont: closure | closure — `test_json_canonical.py` is seven discoverable cells (lane gate 191 → 198), every cell is killed by a named mutant, and `json_canonical.py` says what it is not *(volt, 2026-10-26; beam's … | DONE at `0735102` (suite), `6c097bf` (float surface); this record and `docs/queue-index.md` land in the commit above it. | | 77 | Q81 | 12078-12120 | 9984 | cont: closure | closure — `hermes_profile_health.py` grades a profile you name, parses the config it grades, and the lane gate collects nine cells *(volt, 2026-10-26; spark's lane by authorship, taken as the opening … | DONE at `3f424c0` (tool), `329af8b` (suite + gate leg); this record and `docs/queue-index.md` land in the commit above them. | | 78 | Q83 | 12121-12140 | 3177 | opening | five branches `hermes_profile_health.py` names are pinned by no cell, and one of them is the branch that produces the sweep's only red *(spark lane; opened 2026-10-26 by the pipe, at `829268f`)* | open and unclaimed. | -| 79 | Q84 | 12141-12190 | 6926 | opening | `interval_overlap.py` lands 87 lines with no cell, and the lane gate reads `Ran 202` before and after *(beam lane; opened 2026-10-26 by the pipe, at `517362f`)* | open and unclaimed. | +| 79 | Q84 | 12141-12193 | 6932 | opening | `interval_overlap.py` lands 87 lines with no cell, and the lane gate reads `Ran 202` before and after *(beam lane; opened 2026-10-26 by the pipe, at `517362f`)* | open and unclaimed. | +| 80 | Q83 | 12194-12218 | 4817 | cont: closure | closure — the five unpinned `hermes_profile_health.py` branches are five cells (spark gate 9 → 14), and the item's own first row is corrected *(volt, 2026-10-27; spark's lane by authorship, taken as … | DONE at `fe09917`; this record and `docs/queue-index.md` land in the commit above it. | ## Ids with no `## ` heading @@ -146,6 +147,10 @@ The block below is the parse this document renders, byte for byte. `--check` com "Q82": [ 12010, 12049 + ], + "Q83": [ + 12121, + 12194 ] }, "ids_with_section": [ @@ -318,9 +323,9 @@ The block below is the parse this document renders, byte for byte. `--check` com "end_line": 8, "line": 1 }, - "queue_bytes": 1788798, - "queue_lines": 12190, - "queue_sha256": "5ddda48a2ff4d1c78a6a1a3e4767a4e976269836367ef679484b949fed1c2772", + "queue_bytes": 1793621, + "queue_lines": 12218, + "queue_sha256": "216c7665dbb3d6ac8e0fa2bc5d710305e1a9a62270605dde326d0e71eb18bd12", "sections": [ { "bytes": 3139, @@ -1259,16 +1264,28 @@ The block below is the parse this document renders, byte for byte. `--check` com "title": "five branches `hermes_profile_health.py` names are pinned by no cell, and one of them is the branch that produces the sweep's only red *(spark lane; opened 2026-10-26 by the pipe, at `829268f`)*" }, { - "bytes": 6926, - "end_line": 12190, + "bytes": 6932, + "end_line": 12193, "id": "Q84", "line": 12141, - "lines": 50, + "lines": 53, "role": "opening", "role_detail": "", "status": "open and unclaimed.", "status_line": 12177, "title": "`interval_overlap.py` lands 87 lines with no cell, and the lane gate reads `Ran 202` before and after *(beam lane; opened 2026-10-26 by the pipe, at `517362f`)*" + }, + { + "bytes": 4817, + "end_line": 12218, + "id": "Q83", + "line": 12194, + "lines": 25, + "role": "continuation", + "role_detail": "closure", + "status": "DONE at `fe09917`; this record and `docs/queue-index.md` land in the commit above it.", + "status_line": 12196, + "title": "closure \u2014 the five unpinned `hermes_profile_health.py` branches are five cells (spark gate 9 \u2192 14), and the item's own first row is corrected *(volt, 2026-10-27; spark's lane by authorship, taken as \u2026" } ] }