(<this commit's clock>, <this commit>) filled with the measured read clock
2026-10-14T20:53:48+00:00 and revision 7bcd373. Append-only family -- no
figure, digest or verdict moves. Merlin <merlin@agents.invalid>.
(renderer 306d4bee / collector 4e45021d / gate 125754b270bf) match their
stated figures as a bundle, stage byte-identically, the gate is 184/1 on the
staged collector (the one failure being G10's deployed-page row), the
re-render payload carries both missing markers, and live state is delta 0
around all of it. Record recoveries/helm-adoption-sequence-readiness.md,
queue block, check-in Run 31. Nothing deployed, no another-party file edited,
decisions/ and inbox/ untouched, no secret printed. Merlin <merlin@agents.invalid>.
Both loci that cited out/R29-MEASURE.json are fixed -- the record's own :25 (the primary) and the candidate renderer's comment -- while the artifact sits at /root/crucible/q59/R29-MEASURE.json (5382 B / d6f142c0e7a7acca). One comment line, anchor unique, compile() before the write, the reply-55-verified pre-image preserved byte-exact at q59/helm-render-g11-pre30.py; post-fix renderer 22731 B / 306d4befee7c9874 / 512 lines, -4 B. Comment-only proved by the emitted bytes: fixed stale render 11819 B / 951a8a7645fe7ef4 byte-identical to Run 29's check-stale.html, fixed fresh 11624 B / 1eec213e9e363d36 identical to check-fresh.html and to the plain renderer at the same clock, plain stale control 11806 B / 3f48643d8e7bac77 -- so the pill's +13 B one-span difference is unchanged and the G11 gate's rows 1-3 stand by byte identity (the 161 KB gate was not re-run; the inference is labelled). Live delta 0 on bytes/sha256/mtime_ns for all four live objects across all four invocations; sandboxes 0; HELM_COLLECTOR still 0, so Q40 stands and nothing is in production. Adoption object superseded: renderer 306d4bee (22731 B) before the cp of collector 4e45021d + gate 125754b270bf. Reply 54's three corrections re-measured and upheld (496/512 by wc -l; twin line 2889; match_qualifier :327-330). Nothing deployed, no another-party file edited, decisions/ and inbox/ untouched, no secret printed.
commit path -- all three rows HTTP 200, served = disk = git at e1fbb14
(record 14,839 B / d4e2e0d15e928959, queue 1,094,415 B / b9b85f86d6e3ea8d,
this file 79,851 B / fc806a4dbad215d9 at e1fbb14 before this append).
Landing deltas from git: 71/0 + 154/0 + 252/0 = 477 insertions, 0 deletions.
Authored with the lane's identity; 93 merlin-authored commits before the push.
No another-party file edited, no secret printed.
The held pin f27326e8b13d1dec (pinned 2026-10-08T16:58:07.100Z) no longer
matches the live body (200 / 217,163 B / c34ae2c245117ca7), yet the
renderer's pill reads the frozen manifest_match field and prints a green
'match' beside 'not re-checked since' in a page whose own verdict pill
reads '0 green / 6 not green'. One renderer edit conditions the pill on
the reading's freshness (stale -> amber 'match (unverified)'; the fresh
branch is byte-identical), and gate G11 adds four checks on Q45S10+G10:
161,122 B / 3,053 lines / 135 registrations. Prediction stated before the
run and met: shipped 184/1 (G10's deployed-page row), twin 183/2.
Live delta 0 on bytes/sha256/mtime_ns/ctime_ns across all four objects;
sandboxes 0/0; HELM_COLLECTOR still 0, so nothing is in production.
Nothing deployed, no another-party file edited, no secret printed.
Readback by /root/crucible/q58/readback_r28.py, artifact out/R28-READBACK.json,
read_at 2026-10-14T13:28:12Z, revision 7af50b5, head_at_read 7af50b5, author
Merlin <merlin@agents.invalid>. All three rows HTTP 200, served = disk =
git cat-file -p 7af50b5:<path>:
recoveries/helm-deployed-page-generation.md 9,953 B bdd5fa1c03586c28...
WORK-QUEUE.md 1,067,607 B a78cc8dff36908a5...
checkins/2026-10-14-merlin.md 65,984 B 0af2ecd2aaaee0f0...
The landing delta is measured from git, not from the append script:
git diff --numstat 7af50b5^ 7af50b5 = 72/0 on the queue, 124/0 on the check-in,
149/0 on the record = 345 insertions, 0 deletions. The queue's byte delta is
1,062,291 -> 1,067,607 B = +5,316 against a block of 5,322 B; the 6-byte
difference is the block's leading newline-dash-dash-dash separator aligning with
the separator the parent already carried, which is also why git counts 72 added
lines rather than the block's own 74. Reconstruction verified byte-exact:
parent[:1060132] + block + parent[1060138:] == rev is True, so the pipe's
"Erratum, mine: the 13:09Z tick" block is intact and keeps its own separator. No
another-party content was clobbered.
ONE DEFECT OF MINE, logged in the check-in's landing block rather than smoothed:
the append script's printed before figure for the queue was 1,060,143 B against a
shared prefix of 1,060,132 B -- 11 bytes stale, because sha(QUEUE) and the later
QUEUE.read_bytes() are two separate reads and the pipe was writing the file
between them (its erratum is stamped 2026-10-14T13:26:06Z, after my 13:25:50Z
append and before my 13:27:05Z commit). The file content is correct and every
assertion that mattered was on bytes read once and written once; only the printed
diagnostic is stale. The git figures are the authoritative ones, and the check-in
was unaffected -- parent is a prefix of rev: True, residual 0 B, 124 lines =
numstat 124/0 -- because the pipe does not write my check-in. This is the
concurrent-writer form of Run 24's logged defect, not its unit form: the units
were bytes throughout.
Live state at the landing, unchanged: deployed page 9,865 B /
427b7b54c69b18d270288910fc810732463129f48ec4bdd7dbc75cdb22997ce4 / mtime_ns
1791709034017837233; snapshot 14,039 B / aa842b0fd880... / mtime_ns
1791479579475780303; held pin 120 B / 5b6d70716153c3f4... / mtime_ns
1791478687099553071. Deployed /root/.helm/bin/ untouched (ee0b36a82f23... /
5c67473d8928... / 7ed1bca8f9da... / 12570786ba70... / 738699986778...),
grep -c HELM_COLLECTOR = 0, so Q40 stands and G10 is not in production. Sandboxes
0/0 both ways. Disk 45 G avail of 154.
Append-only, trailing newline asserted on the written file: check-in 65,984 ->
69,697 B (+3,713, sha256 d1d616878ecbd269...). No another-party file edited,
decisions/ and inbox/ untouched, no secret printed.
The Helm's pinned site now reads HTTP 200 / 217,163 B / sha256 c34ae2c245117ca7...
while the held pin is f27326e8b13d1dec... pinned 2026-10-08T16:58:07.100Z, so
pin_matches_live_now is false. The deployed page /var/www/alexander-whitestone/helm/index.html
is 9,865 B / sha256 427b7b54c69b18d270288910fc810732463129f48ec4bdd7dbc75cdb22997ce4 / mtime
2026-10-11T08:57:14.017Z and renders a green "match" with no "as of" and no "not re-checked
since". The renderer carrying that fix is mtime 2026-10-11T11:12:43.756Z, 8,129.7 s later, and
the real snapshot through it (--out scratch --as-of 2026-10-14T00:00:00.000Z, rc 0) renders
11,798 B / sha256 f32191223931e74b... carrying "as of 2026-10-08T17:12:59.458Z . 5d 6h 47m ago
. not re-checked since". The fix exists, works, and was never deployed.
Why the self-test was green: helm-selftest.py:420-421 runs the qualifier check on a synthetic
fixture at a pinned clock (hr.SNAPSHOT = fp), and :422-425's "build_page() writes nothing"
only proves build_page did not overwrite production. Neither reads the deployed artifact --
the Q34/Q40 law in a new place: a gate that tests the producer cannot vouch for the artifact
in the document root.
The fix is gate G10, four checks, on Q45S10's c56230e5a075... (147,151 / 2,798 / 127):
helm-selftest-q58.py 153,469 B / sha256 3b98b62fa5c7ea626091f6d0f63566de79818ae414bcffe323dd1ddd53956158
/ 2,916 lines / 131 check(" registrations. Shipped (reads the live page): rc 1, 180 passed /
1 failed, stdout 15,055 B / e8304379529c4c83..., the one FAIL being "the deployed page carries
the manifest qualifier". Twin (the same gate with _g10_deployed repointed at a scratch
current-generation render, ast-asserted): rc 0, 181 passed / 0 failed, ALL GATES PASS, stdout
14,824 B / fe8c8c72825962d9.... Prediction stated before the run and met exactly -- a red row
that cannot go green would prove nothing.
Live state delta 0 across all four invocations on bytes + sha256 + mtime_ns: page 9,865 B /
427b7b54c69b18d2... / 1791709034017837233; snapshot 14,039 B / aa842b0fd880... /
1791479579475780303; held pin 120 B / 5b6d7071... / 1791478687099553071. Sandboxes 0/0 both
ways (shallow glob and recursive rglob). No --deploy anywhere in the G10 block. Deployed bin
unchanged, five digests re-read, grep -c HELM_COLLECTOR = 0 so Q40 stands and G10 is not in
production.
Two shipped runs are both 180/1 at 15,055 B while byte_stable_stdout reads false; the
difference is mkdtemp suffixes in the sandbox path the gate prints. The four G10 rows are
byte-identical across both runs, and normalising the four path patterns gives stdout sha256
1958d8212fa60e44... on both with residual differing lines 0.
Six defects of mine are logged first in the record: two claims in one cell (the first G10
check 3 asserted both the predicate's soundness and the finding, which would have made the
twin 180/1 and hidden the discriminator); a report filter written from memory
(startswith("PASS") never matches the two-space rendering -- the lane's own logged class
reproduced on a fresh artifact); a live-path assertion that fired on G5's read-only check and
then on G10's own comment; byte_stable_stdout: false reported as found with the cause
measured; ast.unparse's single quotes; and pathlib.Path in a gate that imports
from pathlib import Path.
No queue item was opened: the Helm executable set was empty at the start of the run (Q49's
"Status: open and unclaimed" at :6847 is stale -- this file's own hygiene ledger at :8026
records Q49 CLOSED), so the unit taken was the one defect the lane had measured and labelled
but never fixed. Owed to Alexander, both decisions rather than tasks: re-render and re-deploy
the Helm page, and the section-4 adoption cp of collector 4e45021d... + gate 3b98b62fa5c7ea62....
Append-only, prefix asserted on bytes before each write, trailing newline asserted on the
written files: queue 1,060,143 -> 1,065,465 B (+5,322, sha256 9f0a02b429eb7ed5...), check-in
58,536 -> 65,984 B (+7,448, sha256 0af2ecd2aaaee0f0...), record 9,953 B / sha256
bdd5fa1c03586c28.... No another-party file edited, decisions/ and inbox/ untouched, no secret
printed.
Deliverable recoveries/helm-pwdir-channel-refusal.md (14,808 B / sha256
d4c381f713e9fe95beefbd14a93220ab4049625f280c116e656419f3e11b7b89) plus the queue block at the foot
of WORK-QUEUE.md (+5,419 B / 63 lines, 951,756 B / d8f54086edbcbbc96e39533d7b6dcf0e9effff108b596ed18685b03d1045e1db)
and checkins/2026-10-14-merlin.md (Run 22). Scratch tree /root/crucible/q55/; nothing deployed, no cp
into /root/.helm/bin/, decisions/ and inbox/ untouched, no another-party file edited, no secret printed.
The class, measured on the shipped Q52 gate before the change: a subject whose root is composed from
the user database (ROOT = Path(pwd.getpwuid(os.getuid()).pw_dir) / ".helm") resolves the live root
under a scratch HOME (rc 0, both fixtures), passes the Q52 home-channel check (the check asserts the
legs' HOME is redirected; pwd.getpwuid never reads HOME), and writes the LIVE held pin through the
gate's own --q52-witness flag (5b6d7071... -> fdd45f74..., restored byte-exact by the guard). A foot
check reports after the legs; only a precondition refuses before them.
The fix: gate cd43284ff009d1cceb3aaa6a65b701d1076eaf801e32b705672601b4122b746a (143,385 B / 2,735
lines / 126 registrations -- unchanged; +3,020 B / +58 lines on the Q52 gate 78b290ec...) -- a
precondition after Q46's parse guard, before the Q39 sandbox, the admission probe and any leg: a
subject whose AST reads the pwd module is refused (exit 2, dated, naming every pwd site with its
line). Disarmed twin 8adad99bdc872ecd09ddea88ae55b5fc55a3886571ffaa5f49a053b52430586d.
25 guarded cells: armed x pwr/pwr-witness/pwn rc 2 refusal (stdout 0 B, live delta {}); disarmed x
pwr-witness reproduces the escape (live pin 5b6d7071... -> ced810a9..., restored byte-exact);
disarmed x pwr 175/1 with Q52 PASS and Q45 FAIL (the shipped behaviour); green pair x5 176/0 at
14,044 B; regressions 11/11. Covered shapes are not over-refused: the witness pin lands inside the
sandbox, and the covered fixtures fail Q43 identically under the shipped gate (measured side by side).
Live delta 0 on bytes/sha256/mtime across all 25 cells (snapshot aa842b0f... / 14,039, pin
5b6d7071... / 120); ctime moved on the pin across the deliberately-live witness cells (guard restores)
-- disclosed. Sandboxes: q55 tree 0/0; the E14 leak re-measured at 26 across /root/crucible and all
26 removed (842,401 B reclaimed) with the q55 __pycache__. Deployed /root/.helm/bin/ untouched,
HELM_COLLECTOR count 0 -- Q40 stands. Disk 45 G avail of 154.
Adoption, Alexander's: the s4 cp is collector 4e45021d... + gate cd43284ff009..., superseding
78b290ec... / e4967da9... / a951dbe8.... Five defects of mine are logged first in the deliverable
(part 1's void d/e rows, its prefix-vs-full restored comparison, its broken Q45 filter, my assumed
d/e expectation, and the gate's first-written Q55 label). No new item opened -- the Helm lane's
executable set is empty; the next unit is a decision, not a task.
The fill for Run 21 (content at 258e3ad). Read back over the anonymous raw path at
revision 258e3ad by /root/crucible/q54/readback_q54.py (artifact out/Q54-READBACK.txt,
398 B, mtime 2026-10-13 23:04:19.489552154Z, host-local): record 200 / 34,311 /
4ba00ce427b85079adedf34524c8334a92e949b205efcc682c8cdd47a99a1cd7, queue 200 / 935,526 /
c5316986a532ce2ba4c479e89b0a4839c7bcd6e6c613d859511616b9fb7323e0, check-in 200 / 94,099 /
1da711a046950f73979bfaa52fe04479c76cbd573ba1421c937d3f53dd8d4ba7 -- all three
served = disk = git, all newline-terminated, ALL ROWS EQUAL.
Clock correction, appended not edited in place: the Run-21 blocks cite "~21:2xZ",
which no instrument supports. The Run-21 content commit 258e3ad was made at
2026-10-13T23:03:50Z (git log -1 --format=%cI) and the readback artifact at
23:04:19.489552154Z. The cite was assumed from reply 42's 21:07Z timestamp rather than
measured -- the same defect class as reply 42 section 1, reproduced by this run's own
Screen line and corrected here.
Live and deployed unchanged across the whole run: snapshot 14,039 B / aa842b0fd880 /
mtime_ns 1791479579475780303; held pin 120 B / 5b6d70716153 / mtime_ns
1791478687099553071; deployed bin ee0b36a8 / 5c67473d / 7ed1bca8 / 12570786 / 73869998
with grep -c HELM_COLLECTOR = 0 on the gate (Q40 stands, nothing of Q31-Q45s9 in
production); disk 45 G avail of 154; worktree clean.
Read-only run: no gate invocation, no live write, no deployment, no edit to another
party's file, decisions/ and inbox/ untouched, no secret printed.
The three sentences replies/2026-10-13-to-merlin-42.md (1b16385) returned against
Run 20's closing note, each re-measured from git with a non-stripping reader
(measure2.py) and cross-checked with sha256sum:
1. Both readback clocks were wrong: readback.py ran at 20:45:43.513552892Z (not
~21:0xZ) and readback_final.py at 20:52:18.142200548Z (not ~21:2xZ); cfae76a
was committed 20:51:49Z, 29.1 s before readback_final.py existed, so the
closing note cites a readback that postdates its commit. The note's table is
sound (cf07003 digests); the clock sentences and the readback description are
the defect.
2. Row 3's equality: the per-revision census shows record and queue byte-identical
across cf07003->cfae76a (34,311 / 4ba00ce4, 927,009 / 7754184c, both 0x0a);
the check-in is 83,854 / 4306bc50 at cf07003 and 85,869 / a1f3ad72 at cfae76a,
which is what disk and branch/main serve. The table row is right; the sentence
above it needs the per-row revision.
3. Three of three, confirmed: at 7673477 all three files end 0x29 (31,219 /
925,786 / 82,262); dc3c2f7 terminated queue+check-in, cf07003 the record
(+22/-1 on the record alone), cfae76a the check-in's closing note (+33).
4. The queue close block's undated 927,009 is cf07003's reading; the queue at HEAD
1b16385 is 933,092 / 114d937e.
Own defect logged first: the take-1 instrument (measure_r42.py) .strip()ed its
captures, so its digests were computed over stripped content; measure2.py is the
authority and the record is sound.
Queue hygiene appended: four "open and unclaimed" status lines name closed items
(Q21, the Q13 fix pack, Q49, Q51); the DONE blocks below them govern.
Read-only run: no gate invocation, no live write, no deployment, no edit to
another party's file, decisions/ and inbox/ untouched, no secret printed.
Live and deployed unchanged: snapshot aa842b0f / 14,039, pin 5b6d7071 / 120,
HELM_COLLECTOR 0 in every deployed file, disk 45 G of 154.
Names the three commits that carry this unit (7673477 corrections +307/-0, dc3c2f7
landing evidence and E17 +76/-2, cf07003 E18 +22/-1) and the final readback at
cf07003: all three rows HTTP 200 and served = disk = git cat-file -p cf07003:<path>,
each newline-terminated -- record 34,311 B / 4ba00ce427b85079..., queue 927,009 B /
7754184c5368..., check-in 83,854 B / 4306bc5035ed... The record's digest is the same
value E18 carries, so the two rows agree rather than one chasing the other; the check-in's
own row is dated at cf07003, the revision before this append, and is not restated.
out/ artifacts (Q53-MEASUREMENTS.json, Q53-READBACK.txt, Q53-READBACK-FINAL.txt) are
host-local and not forge-verifiable -- 0 paths under out/ in the tree, raw path 404 --
E13's rule applied to this run's own artifacts.
Nothing deployed, no cp into /root/.helm/bin/, decisions/ and inbox/ untouched, no
another-party file edited, no secret printed. Live state delta 0 across every measurement:
snapshot 14,039 B / aa842b0fd88037f8... / mtime_ns 1791479579475780303 / ctime_ns
1791907371554631194; held pin 120 B / 5b6d70716153c3f4... / mtime_ns
1791478687099553071 / ctime_ns 1791907371554631194. Deployed bin untouched
(ee0b36a82f23, 5c67473d8928, 7ed1bca8f9da, 12570786ba70, 738699986778), HELM_COLLECTOR
count 0 -- Q40 stands, so none of Q31-Q45s9 is in production. df -h / -> 46 G avail of
154, 71 % used. Sandbox census in the q53 tree 0; E14 records the 26 elsewhere under
/root/crucible.
Landing evidence for Run 20, read back over the anonymous raw path at ~21:0xZ,
instrument /root/crucible/q53/readback.py. All three rows HTTP 200, served = disk =
git cat-file -p 7673477:<path>:
recoveries/helm-home-channel-guard.md 31,219 B / 0f8b7f1617a67f5e8308e85b837e3256d74949080750dbabacc0f09f106464fa
WORK-QUEUE.md 925,786 B / 78feb8441d8f01183c5f57c7248366400d7f5d5720bf3b8a10d12c37b73a2c11
checkins/2026-10-13-merlin.md 82,262 B / 9db0834471415e3a6a4d1844910a8f21d3a558305b9a69ea08785b8ec0bcda94
The check-in row is that file at 7673477, before this append -- a file cannot cite its
own post-append digest, so the row is dated rather than chased. out/Q53-MEASUREMENTS.json
and out/Q53-READBACK.txt are host-local and not forge-verifiable: 0 paths under out/ in
the tree at 7673477, raw path 404 -- E13's own rule applied to this run's artifacts.
E17, found on my own tool before this commit: q53/append.py's append_last() wrote
head + sep + addition and never wrote tail back, and tail was the file's single trailing
newline, so the record, the queue and the check-in each lost it. Measured by
git diff --numstat: the Run-20 append read 16/0 on the queue and 159/0 on the record
(clean), then 19/1 and 28/1 once the landing appends ran -- the 1 in each being the
dropped newline, not a content edit. Restored by writing one newline byte to each file
(WORK-QUEUE.md 927,008 -> 927,009 B; the check-in 83,853 -> 83,854 B); no line of
content moved. It matters beyond hygiene because this lane's readback discipline compares
served = disk = git cat-file byte for byte, so a lost trailing newline is a real delta an
outside reader would have to explain. The rule: write head + sep + tail + addition, and
assert tail is whitespace-only before dropping it -- the count(anchor) == 1 discipline
extended to the tail.
Nothing deployed, no cp into /root/.helm/bin/, decisions/ and inbox/ untouched, no
another-party file edited, no secret printed. Live state unchanged: snapshot 14,039 B /
aa842b0fd88037f8... / mtime_ns 1791479579475780303, held pin 120 B / 5b6d70716153c3f4...
/ mtime_ns 1791478687099553071, ctime_ns 1791907371554631194 on both; deployed bin
untouched, HELM_COLLECTOR count 0 -- Q40 stands, so none of Q31-Q45s9 is in production.
Append-only: E10-E16 in recoveries/helm-home-channel-guard.md (21,230 B /
953ea1a14c5fa49b... -> 31,219 B / 0f8b7f1617a67f5e..., +159/-0) and a Run-20 block in
WORK-QUEUE.md (919,333 B / c5fa27ea61cf43de... -> 925,786 B / 78feb8441d8f01183...,
+16/-0). Scratch tree /root/crucible/q53/; read-only, no gate invocation, no live write,
nothing deployed, no cp into /root/.helm/bin/, decisions/ and inbox/ untouched, no
another-party file edited, no secret printed.
Measured this run, not accepted:
- E10 (reply 38 s1, upheld): E4's legs-caller row said :1160; grep -n
'_q50_rebuild_env(' helm-selftest-q52.py gives :815 def, :977 probe caller, :1162 legs
caller. :1160/:1161 are the two comment lines above it -- a comment read as code. The
record's own s2 cite was right; the erratum's cell was the defect.
- E11 (reply 38 s2 / reply 39 s0, restated scoped and dated): the command as written,
grep -rn 'caff1f504855264a' /root/crucible/q52/, returns 9 lines in 8 files at 20:5xZ
(run19_append_record.py 2, the other seven 1 each); out/ returns 0 (rc 1); the repo
tree at HEAD returns 15 lines in 6 files. The 3 is a Run-18-era reading of the three
scratch prose files it names, 1 each, stale because Run 19's own five scripts quote the
string. Finding unchanged: the figure stays unverified; direction Corroborated by
out/Q52-MATRIX.json's two guard_restored rows with final_live_delta {}.
- E12 (reply 40 s2): the landing block's readback clock is 18:30:31Z, not 18:31:0xZ.
out/Q45S9-RUN19-READBACK.json (1,686 B / ccec083ce40f...) records read_at
2026-10-13T18:30:31.084749+00:00, revision 068ac5f, epoch 1791916231.084749. A +/-360 s
band census reproduces the pipe's supporting measurement to the millisecond: next
write after the read is run19_append_landing.py at +160.699 s = 18:33:11.78Z.
- E13 (reply 40 s3): the readback artifact is host-local, not forge-verifiable --
git ls-tree -r --name-only HEAD gives 244 paths, 0 under out/, no worktree out/, and
the anonymous raw path returns HTTP 404 (11 bytes). Stated as a property of the lane:
every out/*.json across Q31-Q45s9 is host-local.
Two findings of my own, from re-reading rather than from being told:
- E14: the sandbox census is tree-scoped. E7's "both ways -> [] / []" is true of the q52
tree; the recursive census over /root/crucible is 26 -- 19 helm-legs-* (q43 x1,
q43/variants x2, q43z/variants x1, q44 x2, q45/variants x13) and 7 helm-q39-* (q48).
The skill's own logged lesson applied to my own record.
- A sixth line-citation defect: E4's --q52-witness row puts the section comment at
:1261; grep -n gives :1262 (comment) and :1270 (flag test).
E15 re-derives, measured not accepted: gate 78b290ecf2d93e0c... 140,365 B / 2,677 lines
/ 126 check(; disarmed twin be7b306a... 140,390 B; _q52_home_sites :758;
_q50_rebuild_env :815; probe caller :977; check("Q52", ...) :1205;
out/Q52-MATRIX.json 12,308 B / 75bd624e... at 2026-10-13T16:02:51+0000;
out/q52-dis-check.out 191 lines, 174 passed / 2 failed, FAILs at :186 (Q52
home-redirect) and :187 (Q45 module-constant, HELM_HOME /root/.helm and HELD_DIR
/root/.helm/data/held escaping the cut redirect) -- E3 re-derives exactly.
Live delta 0 on bytes/sha256/mtime_ns across every measurement: snapshot 14,039 B /
aa842b0fd88037f8... / mtime_ns 1791479579475780303 / ctime_ns 1791907371554631194; held
pin 120 B / 5b6d70716153c3f4... / mtime_ns 1791478687099553071 / ctime_ns
1791907371554631194, still Run 18's restore trace. Deployed /root/.helm/bin/ untouched
(ee0b36a82f23, 5c67473d8928, 7ed1bca8f9da, 12570786ba70, 738699986778), HELM_COLLECTOR
count 0 -- Q40 stands, so none of Q31-Q45s9 is in production. df -h / -> 46 G avail of
154, 71 % used.
Standing and still human-gated, unchanged: the s4 adoption cp of collector 4e45021d... +
gate 78b290ecf2d93e0cc3087e5ede8baef5c10ca52986706d5da69a13a619dbdd9f; the manifest_match
pin stale since 2026-10-08; Q13's publication call; Q9's checksum handover; Q19's
onboarding. No new item opened: Q42 is zephyrus's, Q52 is Mercury's, Q53 is Alexander's,
so the Helm lane's executable set is empty again and its next unit is a decision, not a
task.
Taken on replies/2026-10-13-to-merlin-37.md section 2, which left five corrections open
on this lane's own file. Nothing above the appended sections was edited; three appends
only, 312 insertions / 0 deletions.
- The label collision is closed by renaming in prose: the item is Q45s9 (the queue's own
section id, and the wording the c559d33 commit subject already carries), not Q52, which
is Mercury's item at WORK-QUEUE.md:7167. The gate's internal check("Q52") registration
and _q52_* helpers are deliberately not renamed -- renaming changes the gate's digest
and would invalidate the byte-level verification reply 37 performed against it.
- The gate digest, measured in full: sha256sum /root/crucible/q52/helm-selftest-q52.py ->
78b290ecf2d93e0cc3087e5ede8baef5c10ca52986706d5da69a13a619dbdd9f (64 hex, 140,365 B /
2,677 lines / 126 registrations). The c559d33 commit subject carries a 63-character
value, one c dropped at index 16; a commit message cannot be edited, so the correction
lives in the record and the queue. The section-4 adoption cite is the 64-character value.
- The disarmed row's transient pin figure is unverified: grep -rn 'caff1f504855264a'
over the scratch tree returns 3 hits, all this lane's prose, 0 in out/; the same for
1791907100434371499. out/Q52-MATRIX.json (12,308 B / 75bd624ef25c5667...) records
10d12a7d20c5f0ac... / 1791907358370548372 for that row and 576a47723957844e... /
1791907371509627497 for the raw row, both guard_restored true. Direction Corroborated,
cited figure unverified.
- The readback pairing is stated: out/Q52-READBACK.json carries revision 6954cc6 and its
check-in row 67,347 B / 912985e3..., against the record's landing table's 65,145 B /
d89b2189... at c559d33 -- both true, the revision field is the pairing.
- Four line citations corrected by grep -n in the shipped gate (_q52_home_sites :786 -> :758,
legs' _q50_rebuild_env caller :1162 -> :1160, check("Q52") :1204 -> :1205, --q52-witness
flag test :1270), and the q52-dis-check row's second failing check named
(out/q52-dis-check.out:187, FAIL Q45 ... HELM_HOME: /root/.helm).
- "Delta 0 across all 21 invocations" is restated as net zero with two disclosed
transient movements: exactly two of five matrix rows carry a non-empty guard_live_delta
with guard_restored true, and final_live_delta is {}.
Artifacts: recoveries/helm-home-channel-guard.md 21,230 B / 953ea1a14c5fa49b6d2d8e0d8324a8ac9d739ca4c39695646a5c05ae9cbf37fb;
WORK-QUEUE.md 909,662 B / 83b62e9d55180c38a12d9c26b8abea2661f033b448745599250fcba8a181a6fc;
checkins/2026-10-13-merlin.md 73,547 B / 43fb28e1fe92f587ce5cfa24fda8461a800b10239f63bd699672c35b21f1b19d.
Live state re-measured 2026-10-13T18:18:06Z, delta 0: snapshot 14,039 B / aa842b0fd88037f8...
/ mtime_ns 1791479579475780303; held pin 120 B / 5b6d70716153c3f4... / mtime_ns
1791478687099553071; ctime 1791907371554631194 on both, unmoved since Run 18. Deployed
/root/.helm/bin/ untouched (ee0b36a8 / 7ed1bca8 / 5c67473d / 12570786 / 73869998),
grep -c HELM_COLLECTOR = 0 -- Q40 stands. No gate invocation, no live write, no cp, no
another-party file edited, decisions/ and inbox/ untouched, no secret printed.
The last runtime-resolution route in Q45 s7-limit-1's family with neither a literal nor an ast-visible env read: HELM_HOME = Path.home() / ".helm" composes the live root because CPython's posixpath.expanduser reads HOME itself. The channel is live in the shipped subject -- the real collector calls Path.home() twice (its himalaya search). Mechanism: an ast inventory of home-database reads (_q52_home_sites, :786) and, inside Q50's one rebuild function (two callers, probe :977 / legs :1162), a redirect of HOME + USERPROFILE to <target>/q52-home -- a redirect, not a refusal -- with a conditional Q52 NOTE and one new check("Q52", :1204). A --q52-witness extra flag (:1261) runs the copy with --deploy --pin --skip-tests --out <sandbox dest>, the pin shape the suite itself refuses (Q44's rule), because the class's write path is unreachable from the green run.
Measured: green 5/5 at 176 passed / 0 failed (= 175 + 1), 14,044 B stdout, live delta {}; the real collector's own .home() read makes the check non-vacuous. Discriminator, five cells under the digest-verified guard: armed x collector-home.py (d62888c4) -- the copy resolves inside the sandbox and the pin lands at q52-home/.helm/data/held/stackchain-home.html.sha256 in the sandbox, live delta 0; armed x collector-expanduser.py (99c49d39) -- same; disarmed x home -- HOME stays /root, the copy resolves HELM_HOME=/root/.helm and the live pin moves to sha256 caff1f504855264a / mtime_ns 1791907100434371499, restored byte-exact; disarmed without the witness flag -- the foot's own check fails (FAIL Q52, home_reads=['.home()'] HOME='/root', 174 passed / 2 failed); direct invocation, ambient env -- the live pin moves (the class's floor). Regressions 11/11 hold; live delta 0 on bytes/sha256/mtime across all 21 invocations (snapshot 14,039 B / aa842b0f, held pin 120 B / 5b6d7071); ctime moved on both objects (1791907371554631194), the guard restores of the two deliberately-live rows -- disclosed. Final tree 0 sandboxes; deployed /root/.helm/bin untouched (7ed1bca8, grep -c HELM_COLLECTOR = 0 -- Q40 stands, so none of Q31-Q52 is in production); disk 46 GiB free of 154.
Five defects of mine logged first in the deliverable: the witness's missing local subprocess import; the witness anchored before the leg copy was written; the witness's live census reading the held directory (IsADirectoryError); the NOTE claiming a redirect that had not fired (the disarmed twin's own FAIL contradicted it -- the NOTE is now derived from the actual env); and the first matrix measuring nothing because the real collector pins only under --pin, which the suite refuses. Limits stated as the item's own: the original-subject legs inherit the ambient environment (Q48's residual); pwd.getpwuid().pw_dir bypasses HOME (the inventory names it, the redirect cannot relocate it); the inventory is static (Q46's limit).
Files: recoveries/helm-home-channel-guard.md (13,173 B / sha256 3f813ca23202590c675f7ac7587f0d5e7d8b0ff9ee9f4f0711996530a2d6d7db), WORK-QUEUE.md (897,771 B), checkins/2026-10-13-merlin.md (Run 18). Scratch tree /root/crucible/q52/ not committed. No deployment, decisions/ and inbox/ untouched, no another-party file edited, no secret printed. The Helm lane's executable set is empty again; the adoption cp (collector 4e45021d + gate 78b290ec, superseding e4967da9) remains Alexander's.
The ordering defect the class hid behind, closed: the run-wide held census
(_q44_held_before) was read ~470 lines after the admission probe spawn, so the
run-wide instrument structurally could not see a probe write. Measured on the
base gate first (Q44 PASS while the guard reports the live pin MOVED), then
fixed by a pure move of the census machinery above the probe branch.
Gate e4967da9bdc4537802993523c7044a762a9a6366576df4e4234444789310107e
(134,427 B / 2,558 lines / 125 registrations) on the Q50 gate a951dbe8...
diff = 2 hunks + 33 added - 27 removed; 2552 + 33 - 27 = 2558 exactly.
Disarmed twin b1d96976... (134,378 / 2,557 / 125).
Cells: armed x named 166/9 with Q44 PASS and Q50 PASS, delta {} on both
objects; disarmed x named 164/11 with Q44 FAIL and Q50 FAIL, the run-wide
check naming the moved held pin and failing on ctime alone after the window
detector's byte-exact restore. Green pair 5/5 at 175/0, 13,929 B. Regressions
11/11 (latin1 and bom green at 13,929 B). Live delta 0 on bytes/sha256/mtime
across all 32 invocations; ctime movement disclosed; 0 sandboxes.
Still open: Merlin's Q45 s9 follow-on (runtime path resolution) and the s4
adoption cp (collector 4e45021d + gate e4967da9), the manifest_match pin, and
the Q13 publication call -- all Alexander's.
Nothing deployed; decisions/ and inbox/ untouched; no another-party file
edited; no secret printed.
Taken on the pipe's own offer (reply 34, asks 1). The Q48 value-redirect and Q49
default-redirect are factored into _q50_rebuild_env(_target) and called twice: at the
rule's original site for the legs (target the legs' sandbox) and above the admission
probe's spawn for the probe (target the probe's own tree, which exists before the
spawn -- the legs' sandbox does not). The spawn now carries env=, and a per-window
census of both live objects around the spawn is the class's detector: a move is
restored byte-exact in-gate, recorded, printed as a dated Q50 DETECTOR note, and
fails the named check "Q50 the admission probe's spawn moved neither live object".
Measured, all five matrix cells under a digest-verified guard (subject env-root-v1.py):
base-q49 x named MOVED held pin 120 B / 5b6d7071... -> 14 B / 784b9bde..., guard-restored
q50-armed x unset delta 0 0 value + 1 default redirect
q50-armed x named delta 0 1 value redirect -- the blank cell, filled
q50-dis x unset delta 0 the probe copy's own Q45 literal relocation covers the
default shape; the redirect is load-bearing only in the named cell
q50-dis x named delta 0 the DETECTOR fires: pin moves inside the gate, restored
byte-exact, foot prints FAIL Q50 (165/10 vs armed 166/9)
Green 5 x rc 0 / 175 passed / 0 failed (174 + 1) / 13,929 B / live delta 0.
Regressions 11/11 hold (n1-n5, noparse, dep-unparseable, undecodable, broken_dep rc 2;
latin1 and bom green 175/0). Live objects byte-identical to session start on
(bytes, sha256, mtime_ns); deployed bin untouched (ee0b36a8... / 7ed1bca8...,
HELM_COLLECTOR count 0 -- Q40's finding stands). Named follow-on, not fixed here:
hoist the run-wide held census above the probe. Three harness defects of mine logged
first in the record. Nothing deployed; no another-party file edited; no secret.
The record's deferred table and the check-in's deferred line are filled from the
anonymous raw read at main, taken after the push (a pre-push readback returns 404
for a new file), so the figures are stable for any outsider. All three HTTP 200
and byte-identical to disk.
- (a) ATTRIBUTION, measured not withdrawn. env-root-v1.py = q48/env-root.py with its
two default literals returned to /root/.helm (asserted count 2). Under a
digest-verified guard: the fixture run --dry-run / bare / --deploy --out <scratch>
with Q48_ROOT UNSET each moved the live held pin, and
HELM_COLLECTOR=<that fixture> Q48_ROOT unset python3 q48/helm-selftest.py moved it
too. All three Q48_ROOT=<scratch> controls: no move. Written bytes measured by a
5 ms watcher: 14 B / sha 784b9bded20e9e22... / 'q48-env-pin\n'. Q48's 6.2
attribution is upheld as a measurement; the pipe's negative reproduces exactly.
The writing leg is named verbatim by the per-leg census: the G8 --dry-run
original-subject leg, whose own source comment asserts "it writes nothing".
- (b) THE CLASS IS CLOSED, green 5/5. helm-selftest-q49.py (128,948 B / 2,445 lines /
085ddf4f42ae80ea...): the DEFAULT redirect (every os.environ.get("X","<default>")
pair inventoried by ast; a default literal resolving inside the live data root is
redirected to the per-invocation sandbox), a per-leg census of BOTH live objects as
detection, and a guard on the in-process --deploy leg. Checks 120 -> 123
(+3 check("Q49"), nothing else moved). Five green runs: rc 0, 174 passed /
0 failed, 13,863 B stdout, digests 13cf5cf7 / d4666b9f / 0abd28cd / 5ed81c37 /
bbbd1901, live delta 0 on both objects.
- TWO FINDINGS BEYOND THE ITEM. (i) G8's --deploy branch calls hcg.main() IN-PROCESS
with only SNAPSHOT_PATH patched, so a subject that resolved its root at import time
wrote the LIVE SNAPSHOT (14,039 B -> 137 B) -- reproduced, restored, and now
guarded. (ii) In the fully disarmed configuration the live pin still moves and no
spawn the traced instrument can attribute it: one fixture main() per run, banner
naming the sandbox, both censuses silent, watcher still seeing 120 B -> 14 B at
t+280 ms. The write is real, the mechanism is UNATTRIBUTED, and it is named as the
Helm lane's next unit rather than guessed at.
- Six live writes under guard, every one restored from a digest-verified backup that
refuses to restore unless the backup digest matches. Both live objects byte-identical
at session end: snapshot aa842b0fd88037f8... / 14,039 B and held pin
5b6d70716153c3f4... / 120 B. Nothing deployed: /root/.helm/bin/helm-selftest.py is
still 7ed1bca8... and reads HELM_COLLECTOR 0 times, so none of Q31-Q49 is in
production and the cp of collector 4e45021d... + gate 085ddf4f... stays Alexander's.
Deliverable: recoveries/helm-resolved-root-live-path.md (15,220 B).
Scratch tree /root/crucible/q49/. Record, check-in Run 15 and queue block.
The subject's source is now read the way CPython reads it: bytes through
tokenize.detect_encoding (BOM stripped, PEP 263 cookie honoured), with a
dated exit-2 refusal for a file that cannot be read that way, at Q46's
guard point — after Q35's precondition, before the admission probe,
before any leg, before any sandbox. All four subject-source reads route
through the one reader; one stderr NOTE when the encoding is not plain
utf-8; the Q46 parse guard, the Q45 redirect, every check() and the 169
count untouched.
Deliverable recoveries/helm-read-path-guard.md (12,821 B), scratch tree
/root/crucible/q47/, evidence out/Q47-NEGATIVES.json (21 rows),
out/Q47-VERDICT.json, out/Q47-GREEN.json, out/DIFF-vs-q46.txt.
Measured, not asserted: latin-1 cookie subject rc 0 / 169 passed / ALL
GATES PASS under the shipped gate (Q39-Q45 crash with UnicodeDecodeError);
BOM'd collector rc 0 / 169 passed (Q43/Q45 SyntaxError at the sandbox
copy, Q44 AttributeError, sandboxes left); genuinely undecodable subject
rc 2 with the dated Q47 REFUSAL and no sandbox. Q39 runs the BOM subject
green with 164 passed — the read-path class is the text-compiling gates
(Q43-Q46), not subject handling generally. Green pair 5x rc 0, 169/0,
13,312 B stdout / 425 B stderr, live and held delta 0 on all 26
invocations. Adoption pair moves to collector 4e45021d + gate 76f2292b.
Nothing deployed, no cp into /root/.helm/bin/, decisions/ and inbox/
untouched, no another-party file edited, no secret. Run 13 in the
check-in; queue block appended.
An unparseable subject is refused with exit 2 and a dated message naming the
parse failure, not admitted-then-crashed. Discriminator on all five gates,
digest-identical to the revision history: Q39 rc 1 SyntaxError at the legs
import of the original subject, Q43 rc 1 SyntaxError at the sandbox-copy
import, Q44 rc 1 AttributeError at the unguarded _q39_tree.body, Q45 rc 1
SyntaxError at the sandbox-copy import, Q46 rc 2 dated refusal with stdout 0
B and no sandbox created. dep-unparseable refused by Q39 repair 3 on all five
gates. C2 reproduced: the ROOT glob sees no leftover while the recursive
census sees legacy/q4X/helm-legs-*. Green pair 5x rc 0, 169 passed, 13,312 B,
live delta 0; atexit sandbox cleanup closes the n5 leak measured before and
after. Live snapshot aa842b0f 14,039 B and held pin 5b6d7071 delta 0 across
27 invocations. Adoption pair is now collector 4e45021d + gate ae69d5dd.