Q31 Run 7: dead digest corrected to the artifact that exists (8a477376), restore-mtime root-caused and fixed, gate re-run 137/137 (Merlin)

This commit is contained in:
timmy committed 2026-10-11 15:39:52 +00:00
1 parent b9d9d0710a
commit 1c0d660c2a
2 files changed
+184

No files matched your search

+83
View File
@@ -911,3 +911,86 @@ in the files it lands — the long strings are snapshot JSON keys, build message
— Merlin
---
## Run 7 — Q31 addendum-2 close-out — 2026-10-11 ≈15:38Z
> Screen. Every claim below carries a command, a digest, or the word `unverified`.
> No secret is printed here or in the files this lands — the long strings are
> snapshot JSON keys and sha256 digests.
### Did
- **Took the top open unit in my lane:** Q31's addendum 2 (2026-10-11 14:15Z)
returned two defects against my own Q31 deliverable — a cited digest that
resolves to no file, and an mtime restore that was never exact. Both closed
this run.
- **Dead digest closed.** `find /root/.helm /root/crucible -type f | xargs
sha256sum | grep 60229227216fb4ab` over **841** hashed files → **0** matches,
so `60229227…` (701 lines / 28,808 B) is a superseded cut. The artifact that
exists, read off disk this pass: gated collector `/root/crucible/q31/helm-collect.py`
**705 lines / 29,085 B / sha256 `8a477376f72c578b0633e07741b44c717482fe62b29a3cc3f8abb7a6696ea76c`**;
gated selftest **753 / 41,687 / `1d58b823809aa76e7db9747f8393cf54cc44e11fb5442e43ca62bdce69e766c8`**;
pristine = deployed collector **687 / 27,907 / `ee0b36a82f23fcf3c…`**; deployed
selftest **609 / 33,647 / `7ed1bca8f9da624f…`**. Identity corroborated **by
construction**: applying the record's own `DIFF.txt` (38 lines, +19/−1) to
`helm-collect-pregate.py` yields a file **byte-identical** to the gated
collector (`cmp` silent, both `8a477376…`; run in `/tmp/merlin-q31/diffcheck/`).
- **Mtime root cause closed.** Old `restore-mtime.py` (517 B /
`1704996c6a1a9615…`) hardcoded microsecond `475780` — dropping the original's
trailing **303 ns** — and passed a **float** to `os.utime`; measured live
mtime_ns **1791479579475780010** (`…475780010`), **−293 ns** below the original
`…475780303`. Rewritten to `os.utime(p, ns=(TARGET_NS, TARGET_NS))` with
`TARGET_NS = 1791479579475780303` (new script 26 lines / 1,270 B /
`1ab1344393d77ce4…`) and re-run against the live snapshot:
**1791479579475780010 → 1791479579475780303, delta 0**, content unchanged at
**14,039 B / `aa842b0fd88037f83115b4a54d617f27666f4de06ef84f9a64c8fd0a5f04656d`**.
- **Gate re-run at the artifact that exists:** `HELM_COLLECTOR=/root/crucible/q31/helm-collect.py
python3 /root/crucible/q31/helm-selftest.py` → exit 0, **137 passed, 0 failed,
VERDICT: ALL GATES PASS** (log 8,752 B / `a5c490d4957d4074…`); live snapshot
delta 0 after the gate.
- **Record corrected, append-only:** `recoveries/helm-collector-run.md` gained a
dated Run 7 section (corrected adoption identities, the mtime root cause and
fix, the gate re-run); nothing above the append was edited.
- **Nothing deployed.** Deployed collector `ee0b36a8…` and selftest `7ed1bca8…`
unchanged; bare `--deploy` never run; `decisions/` and `inbox/` untouched; no
another-party file edited; no secret printed.
### Blocked
- Nothing. **Unverified by construction:** the pre-incident atime is not
recoverable (`snap-before.json` is a copy carrying its own atime) — the fixed
restore sets atime to the same ns value as mtime, stated rather than hidden;
ctime necessarily moved on the restore (the record's fields are digest +
mtime). Run 6's `--skip-tests` caveat stands unchanged.
### Next
- The adoption ask now cites the digest that exists: `cp` of
`8a477376…` + `1d58b823…` into `/root/.helm/bin/`, then Alexander's
collect+render schedule decision — same §4 gate as Q26–Q30.
- No new queue item opened: the executable unclaimed set in the archive lane
remains Q20 (zephyrus-sparkborn's named lane); Q9 blocked on the audio
handover; Q13/Q19 gated on Alexander.
### Ask
1. **Alexander — adopt the gated collector + G8 into the shared tree** at the
corrected identities (705 / 29,085 / `8a477376…` and 753 / 41,687 /
`1d58b823…`)? It is the difference between a bare run silently overwriting
the live snapshot and an explicit `--deploy`, with a gate that proves it.
Scratch until you say so.
2. **Nothing asked of zephyrus-sparkborn this tick.** His lane is Q20.
### Landing evidence (appended after push)
Pushed to `origin/main`; each file read back over the anonymous raw path,
no credential — HTTP 200 and `cmp` byte-identical to disk:
| file | status / bytes | sha256 (first 16) |
|---|---|---|
| `recoveries/helm-collector-run.md` | 200 / <BYTES> | <SHA> |
| `checkins/2026-10-11-merlin.md` | 200 / <BYTES> | <SHA> |
— Merlin
+101
View File
@@ -250,3 +250,104 @@ the Q31 Status block appended to `WORK-QUEUE.md`, and the Run-6 section of
`q31-compare.py`, `q31-diff.py`, `helm-collect.py` (gated),
`helm-collect-pregate.py` (the pre-gate copy), `helm-selftest.py` (G8),
`DIFF.txt`, `snap-before.json`, logs `q31-*.log`, `restore-mtime.py`.
---
## Run 7 — 2026-10-11 ≈15:38Z — the two corrections this record owed, applied
Q31 addendum 2 (WORK-QUEUE.md, 2026-10-11 14:15Z) returned two defects against
this file: the gated-collector digest it cites resolves to no file, and the §0
mtime restore is false on disk. Both are mine; both are corrected here, not
argued with. Every figure below is from a command in this run (host clock
`2026-10-11T15:37:53Z`).
### 1. The cited digest is dead — the artifact that exists is `8a477376…`
`60229227216fb4ab…` (701 lines / 28,808 B) is cited in §4:143-144 and §7:229
above as the gated collector to adopt. It resolves to **no file**:
`find /root/.helm /root/crucible -type f | xargs sha256sum | grep 60229227216fb4ab`
over **841** hashed files → **0** matches. The artifacts that exist, read off
disk this pass:
| role | path | lines | bytes | sha256 |
|---|---|---|---|---|
| gated collector — to adopt | `/root/crucible/q31/helm-collect.py` | 705 | 29,085 | `8a477376f72c578b0633e07741b44c717482fe62b29a3cc3f8abb7a6696ea76c` |
| gated selftest — to adopt | `/root/crucible/q31/helm-selftest.py` | 753 | 41,687 | `1d58b823809aa76e7db9747f8393cf54cc44e11fb5442e43ca62bdce69e766c8` |
| pristine collector = deployed collector | `/root/crucible/q31/helm-collect-pregate.py` = `/root/.helm/bin/helm-collect.py` | 687 | 27,907 | `ee0b36a82f23fcf3c4742de95a205f824715b931fdb80947a897eb88999c4df6` |
| deployed selftest | `/root/.helm/bin/helm-selftest.py` | 609 | 33,647 | `7ed1bca8f9da624f69b03313506097a0ce9b1130cbad9511908776e5015a0f46` |
The identity is corroborated **by construction, not by reading**: applying this
record's own `DIFF.txt` (38 lines, +19/−1) to `helm-collect-pregate.py` in a
clean copy (`/tmp/merlin-q31/diffcheck/`) yields a file **byte-identical** to
`/root/crucible/q31/helm-collect.py` — `cmp` silent, both sides sha256
`8a477376…`. The 701 / 28,808 cut was a superseded intermediate; every adoption
instruction in this file now names **705 lines / 29,085 B / `8a477376…`** (and
the selftest **753 / 41,687 / `1d58b823…`**). Per the standing record rule, the
digest was read off disk in the same pass that cites it.
### 2. The mtime restore was never exact — root cause, fix, and the live file corrected
At 15:3xZ the live snapshot read **mtime_ns 1791479579475780010**
(`2026-10-08T17:12:59.475780010Z`) — **293 ns below** the pre-incident original
`…475780303Z`. Therefore:
- **§0:25-26** ("set the mtime back to the original `…475780303Z`"),
**§4:163-164** ("mtime_ns `…303 → …303` unchanged") and **§6:210** assert the
original as the post-restore state and **cannot stand** as descriptions of the
live file. §4:163-164's before-value was correct at the clock it was measured
(13:22Z, before the 13:28Z incident); it is stale as a current-state claim,
which is how it reads.
- **§1:49** and **§1:69** cite `…303` as the **pre-incident baseline** — correct
readings, retained.
- **§2:69**'s "unchanged …303" was true at the time of that leg (13:19–13:20Z,
pre-incident) and is likewise stale now.
- **§7:241**'s **value** `…010` is the honest one; its **"86 ns above"** is wrong
in sign and magnitude: the gap to the original is **−293 ns**, and the gap to
the restore script's own float target is **−207 ns**.
**Root cause, read from the old script** (`restore-mtime.py` pre-fix: 517 B /
sha256 `1704996c6a1a96159a3acedd64cdf8cf75ffc4703500bc5b5663c0953a5ffa4a`):
`:7` hardcodes `datetime(2026, 10, 8, 17, 12, 59, 475780)` — microsecond
`475780` **discards the original's trailing 303 ns** — and `:8-9` passes a
**float** to `os.utime`, whose float→ns conversion is not exact at this
magnitude. Two compounding defects; the script could never hit its own target.
**Fix:** rewritten to pass integer nanoseconds — `os.utime(p, ns=(TARGET_NS,
TARGET_NS))` with `TARGET_NS = 1791479579475780303`. New script 26 lines /
1,270 B / sha256
`1ab1344393d77ce4fb588e446b35c08423aff348788bc857e66c0ad5d008d054`. The
pre-incident atime is not recoverable (`snap-before.json` is a copy carrying
its own atime), so atime is set to the same value — stated, not hidden.
**Re-run against the live snapshot, measured before and after:**
```
before: mtime_ns 1791479579475780010 delta_ns -293
after : mtime_ns 1791479579475780303 delta_ns 0
content: 14,039 B / sha256 aa842b0fd88037f83115b4a54d617f27666f4de06ef84f9a64c8fd0a5f04656d — unchanged
```
The live file's mtime is now the true pre-incident value, delta 0, content
digest untouched. ctime necessarily moved on the restore; this record's fields
are digest + mtime.
### 3. The gate re-run at the artifact that exists
`HELM_COLLECTOR=/root/crucible/q31/helm-collect.py python3
/root/crucible/q31/helm-selftest.py` → exit 0, **137 passed, 0 failed,
VERDICT: ALL GATES PASS** (log `/tmp/merlin-q31/q31-selftest-rerun.log`,
8,752 B / sha256
`a5c490d4957d40747a24d7a452e8943258e28f8d878e2b51470f7648b4751c43`), including
"G8 the real live snapshot is still untouched after every leg". Live snapshot
after the gate: 14,039 B / `aa842b0f…` / mtime_ns 1791479579475780303 — delta 0.
### 4. What is still Alexander's
Unchanged from §7: adopt `8a477376…` + the G8 selftest (`1d58b823…`) into
`/root/.helm/bin/` (`cp`, two files), then the deploy/schedule decision for
the collector. The mtime fix corrects a field only this record reads; the
digest fix is the one that mattered — an adoption instruction that resolves to
no file is a blocker, not a footnote. Deployed `helm-collect.py` (`ee0b36a8…`)
and `helm-selftest.py` (`7ed1bca8…`) unchanged; the bare `--deploy` was never
run; `decisions/` and `inbox/` untouched; no another-party file edited; no
secret printed here or in any file this lands.