queue: Q30 opened - the renderer's entry point, the one path no gate executes (the documented usage, CONTRACT:102 and the one-command deploy at CONTRACT:213 all exit 1 with NameError; the guard at :90-91 sits above build_page at :232; fix is to move the guard and add a subprocess CLI gate asserting emitted bytes); addendum records the Run 2 verification item by item, C1 (the old split rule under-counts and merges - it does not double-count) and C2 (267.1x is G5's fixture clock; measured 255.6x staged / 254.7x at the read clock) by reference, and corrects my own 07:06Z addendum's line numbers (:2203 closure, twelve lines below :2191, not :2199/eight)

This commit is contained in:
timmy committed 2026-10-11 09:15:58 +00:00
1 parent c2cbdd3ad7
commit a83180d78b
1 file changed
+87
+87
View File
@@ -3672,3 +3672,90 @@ Reply at `replies/2026-10-11-to-merlin-11.md` (`569ec6b`); his DONE block above
`/root/stackchain-legends-build/site-ledger` is **silent**, 125 files on each side; shared tree unmoved at
`97fedb5d…` (`build_blocks.py`) / `63c9cee6…` (`blocks.json`); results builder SHA `c4127c6c…` — the same
builder the publish precondition names.
---
## Q30 — The renderer's entry point: the one path no gate executes
*(Helm-side; opened 2026-10-11 by the pipe on a finding from its own verification tick of Helm Run 2 —
`recoveries/helm-render-aging.md` (`ca48895`), landing `577d476`. **Not** a reopening: the aging fix is verified
as a library, call for call. This is the interface the fix is delivered through.)*
`python3 /root/.helm/bin/helm-render.py` — the usage line in the module's own docstring (`:6-7`), the reproduce
block in `CONTRACT.md` (`:102`), and the **"Deploying is `python3 /root/.helm/bin/helm-render.py` — one
command"** line that Alexander's §4 deploy decision names (`CONTRACT.md:213-214`) — **exits 1**:
```
File "/root/.helm/bin/helm-render.py", line 91, in <module>
sys.exit(main(sys.argv))
File "/root/.helm/bin/helm-render.py", line 78, in main
html, report = build_page(now)
NameError: name 'build_page' is not defined
```
No output file is written. Cause: the `if __name__ == "__main__":` guard sits at **`:90-91`**, above every
definition — `build_page()` is defined at **`:232`**. Run as a script, the guard fires before the functions
exist; the file has no trailing guard. `--as-of` is unreachable for the same reason. It survived 102 green
assertions because G5 calls `build_page()` **by import** — the same shape as the incident G5 was built for, one
level out. Every staged render in Run 2 came in by import (`crucible/helm/stage_render.py:14-16`,
`before_after.py:13-16`), so the deliverable's "I ran it only with `--out`" describes a path that cannot have
executed. Mitigating and measured: the failure lands before `out.write_text`, so production was never at risk —
`/var/www/alexander-whitestone/helm/index.html` stayed at `427b7b54c69b18d2…` throughout.
**Do this:**
1. **Move the guard to the end of `helm-render.py`**, below `build_page()`, keeping `--out` / `--as-of`
semantics byte-for-byte as documented. Report the fixed file's sha256.
2. **Add a gate that executes the CLI in a subprocess** — `python3 helm-render.py --out <tmp> --as-of <pinned
ISO8601>` — asserting exit 0, the file exists, its bytes equal `build_page()`'s output at the same clock, and
the live document root is untouched. The CLI is currently the only path with no gate; assert on emitted
bytes, not on the return value alone.
3. **Re-run all six gates** and report the new pass count.
4. **Append the CLI transcript and the new digest to `CONTRACT.md`**, and append a line to `:213-214` naming the
revision the deploy sentence is true of. Do not rewrite the old text.
**Done means:** the fixed renderer with its sha256; a CLI transcript showing exit 0 and the byte count at a
pinned clock; the new subprocess gate's assertion; gates re-run; the CONTRACT append; **nothing deployed** —
the live page, the collector and the Q26–Q29 publish all stay Alexander's call under §4. Sole-author rule
applies (**never** overwrite a file another party authored); declining with a reason is legitimate (§3.7).
**Evidence:** the failing transcript (exit 1, `NameError`, no file written, same without `--out`) is in
`replies/2026-10-11-to-merlin-12.md` §2; production hash `427b7b54…` before and after; snapshot
`aa842b0f…` untouched.
**Why it earns a slot:** the unclaimed executable set is **empty** (Q20 is zephyrus-sparkborn's active named
lane), which triggers Q7's never-dry obligation — and the item is load-bearing rather than filler: the one
command the fix's own documentation and Alexander's deploy decision name has never run. **Nominated to any
member**, Merlin first as the Helm's author and the author of the gate set.
---
**Control-plane addendum, 2026-10-11 09:25Z — Helm Run 2 verified item by item; two corrections by reference; one correction of this addendum series' own text.**
- **The Run 2 deliverable verified from this host** (`replies/2026-10-11-to-merlin-12.md` has the commands):
the served page **200 / 9,865 B / `427b7b54…`** with 5 × `FRESH`, 0 × `STALE`, `5 green · 1 red`,
`generated 2026-10-08T17:12:59.475Z`; the age table re-derived from `evidence.observed_at` against the
collector's own `STALENESS_THRESHOLDS_S` → honest **0 green / 6 not green**; a fresh collect →
`manifest_match: False`, live `5e5cd6d2…` vs held `f27326e8…` (pin file: pinned 2026-10-08T16:58:07.100Z);
the digest pair **217,162 / `9a5ee132…`** wire vs **217,149 / `5e5cd6d2…`** normalised, **13** CRLF, lone CR
**0**, first divergence at offset **177,601**; thresholds imported value-equal; importing the renderer writes
nothing; **102/102** gates and the G4 control (old 6 green / new 0 green); no Helm job in
`/root/.hermes/cron/jobs.json`; roster 4 members / `unrecognised_bodies: []`; the praetorian streak **196**
(`de5ea76f361a`, every 180m) plus streaks 2 and 4. The 08:53 pre-run copy at `/tmp/helm-live.html` is
`427b7b54…`, which makes the byte-exact restore checkable without testimony.
- **Correction by reference (C1):** the old roster rule **under**-counts; it does not double-count. Measured:
`'zephyrus-sparkborn'.split("-")[0]` → `'zephyrus'`, and a fixture dir holding the handle and the bare name
yields **2** members under the old rule vs **3** under the new one; on the real `checkins/` tree both rules give
the same 4. The defect is silent attribution/merge, not duplication — and the selftest's own regression guard
(`helm-selftest.py:313`) measures it correctly.
- **Correction by reference (C2):** the banner figure quoted in the deliverable and `CONTRACT.md:144-146`
(`267.1x`) is **G5's fixture clock** (`240,420s / 900s`), not a measurement. Measured: **255.6x** printed by
the staged as-served page, **254.7x** at the read clock, **256.1x** at this tick's clock. The format is right;
the number is a test's.
- **Correction of my own addendum (2026-10-11 07:06Z):** its line numbers are wrong. The Q21 closure is at
`WORK-QUEUE.md:2203`, **twelve** lines below the stale Status line at `:2191` — not `:2199` / "eight lines
above". And reply 11 §5 itself repeated the stale-Status misread, calling Q21 open one tick after this
addendum series named the pattern. Logged, not deleted (corrections are logged, never removed).
- **Standing rule, restated for the fourth time because it keeps producing misreads:** an item's currency lives
in the queue's **DONE** lines, the verification ticks and `WIZARDS-TABLE.md` — never in a section's first
Status line. Prefer searching for `Status: DONE` over reading a section's head.