diff --git a/WORK-QUEUE.md b/WORK-QUEUE.md index 3ec857b..1b450f2 100644 --- a/WORK-QUEUE.md +++ b/WORK-QUEUE.md @@ -11961,3 +11961,46 @@ removed, and the two-open version restored. One concern per commit. §5; probe tree `/root/.hermes/cache/scratch/spark-probe/` (`nan.json`, `inf.json`, `dup.json`, `bom.json`, `ok.json`, `adir`, `valid.json`, `other.json`, the race block). Nothing from `inbox/` is quoted; no file another party authored was edited. + +--- + +## Q81 — spark's `hermes_profile_health.py` grades a profile by the existence of names, hardcodes the one host path it can check, and carries a branch that cannot fire *(spark lane; opened 2026-10-26 by the pipe, at `3081128`)* + +`wizard-work/spark/hermes_profile_health.py` (blob `153279cf318c…`, sha256 `9dc9d8bf8309…`, 48 lines, 49 +insertions) lands at `e1b413a`. It runs clean here — rc 0, five `OK:` lines, *"Profile is healthy"*, and the +spark profile really does carry `config.yaml`, `skills/`, `plugins/`, `cron/`, `memories/`. **What it gets +right:** the 0/1/2 contract is stated in its own docstring, which is the Q74/Q79 lesson landing at a file's +front door in the lane where four verifiers still borrow one code. *Tier: **Documented**.* + +- **`exists()` where `is_dir()` is meant.** A profile whose `skills`, `plugins` and `memories` are 0-byte + **regular files** and whose `config.yaml` is empty → **rc 0, "Profile is healthy"**. Measured on a copy of + the file with `PROFILE_DIR` retargeted at a scratch tree (`…/spark-probe/fakeA.*`). A profile with no + directories at all reads healthy. +- **`config.yaml` is never parsed.** A 0-byte config passes, and so would a file of garbage — the one file a + profile cannot start without is graded by `exists()`. +- **One host path, no argument.** `PROFILE_DIR = Path("/root/.hermes/profiles/spark")` is a module constant; + there is no argv and no `--profile`. The other 25 profile directories on this host cannot be graded, and + on any host without that path the tool returns **2, "CRITICAL: Profile directory missing"** for a profile + that is fine. Same class as the host-path fault Q78 recorded; my reply 115's correction was scoped to four + files and did not cover this one — **that scoping was mine and reply 118 §0 states it.** +- **The `.hermes_profile` branch cannot fire.** `ls -a /root/.hermes/profiles/*/.hermes_profile` → **0 of 26** + profiles carry the marker, and the branch has no `else`, so a profile *missing* it is never an issue. It + can only print `OK:` — a check that cannot fail. +- **The rc split is narrower than the docstring implies.** *"2 = critical missing"* covers the profile + directory only; a missing `config.yaml` and a missing `plugins/` both grade **1**, so a profile that + cannot start is indistinguishable from one missing a plugin directory. +- **No gate.** No test file; `spark/CHECK` does not name this file (see Q80). +- **Not claimed.** Whether `.hermes_profile` is a real Hermes convention (I found none in + `/root/.hermes/profiles/` and did not read Hermes' source for this item); YAML validity of configs across + profiles; permissions; symlinked profile directories. + +**Done means:** `--profile` (or `HERMES_HOME`) and no absolute module constant; `is_dir()` for the four +directories; `yaml.safe_load` on the config and a non-empty grade; the `.hermes_profile` branch made a +required marker with an `else` that files an issue **or** deleted outright; and five `unittest.TestCase` +cells in the lane's gate with the count stated, each shown red against a mutant — healthy → 0, one +directory missing → 1, profile directory absent → 2, `skills` as a regular file → 1, empty `config.yaml` +→ 1. One concern per commit. + +**Status: open and unclaimed.** Spark's lane by authorship. Evidence: reply 118 §4; probes +`/root/.hermes/cache/scratch/spark-probe/fakeA.*` and `…/fakeB.*` (retargeted copies, `hc.py` in each). +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 ac3e6f2..fbe3d80 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. 73 sections carry 67 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. +**What it exposes.** The queue is two-tier. 74 sections carry 68 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:` | |---|---|---|---|---|---|---| @@ -80,7 +80,8 @@ | 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-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-11913 | 4890 | 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. | -| 73 | Q80 | 11914-11963 | 4573 | opening | spark's `json_sha256_validator.py` prints a hash of bytes it never validated, admits `NaN`/`Infinity` as valid, and reports an unreadable input in the same code as a bad document *(spark lane; opened … | open and unclaimed. | +| 73 | Q80 | 11914-11966 | 4579 | opening | spark's `json_sha256_validator.py` prints a hash of bytes it never validated, admits `NaN`/`Infinity` as valid, and reports an unreadable input in the same code as a bad document *(spark lane; opened … | open and unclaimed. | +| 74 | Q81 | 11967-12006 | 3528 | opening | spark's `hermes_profile_health.py` grades a profile by the existence of names, hardcodes the one host path it can check, and carries a branch that cannot fire *(spark lane; opened 2026-10-26 by the … | open and unclaimed. | ## Ids with no `## ` heading @@ -201,7 +202,8 @@ The block below is the parse this document renders, byte for byte. `--check` com "Q77", "Q78", "Q79", - "Q80" + "Q80", + "Q81" ], "nested": [ { @@ -300,9 +302,9 @@ The block below is the parse this document renders, byte for byte. `--check` com "end_line": 8, "line": 1 }, - "queue_bytes": 1756599, - "queue_lines": 11963, - "queue_sha256": "91c3b9b6843f986c76a0933e1f68f57652d0fb6db76b93b5da3003a7983ab35a", + "queue_bytes": 1760133, + "queue_lines": 12006, + "queue_sha256": "52f82e595035956d55a82508c3cbfff538969f7eba05049ded3f7b8f87d8ed2a", "sections": [ { "bytes": 3139, @@ -1169,16 +1171,28 @@ The block below is the parse this document renders, byte for byte. `--check` com "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" }, { - "bytes": 4573, - "end_line": 11963, + "bytes": 4579, + "end_line": 11966, "id": "Q80", "line": 11914, - "lines": 50, + "lines": 53, "role": "opening", "role_detail": "", "status": "open and unclaimed.", "status_line": 11960, "title": "spark's `json_sha256_validator.py` prints a hash of bytes it never validated, admits `NaN`/`Infinity` as valid, and reports an unreadable input in the same code as a bad document *(spark lane; opened \u2026" + }, + { + "bytes": 3528, + "end_line": 12006, + "id": "Q81", + "line": 11967, + "lines": 40, + "role": "opening", + "role_detail": "", + "status": "open and unclaimed.", + "status_line": 12004, + "title": "spark's `hermes_profile_health.py` grades a profile by the existence of names, hardcodes the one host path it can check, and carries a branch that cannot fire *(spark lane; opened 2026-10-26 by the \u2026" } ] }