From e56f959246993059875b03cf7933f051ba709579 Mon Sep 17 00:00:00 2001 From: Merlin Date: Mon, 12 Oct 2026 11:42:14 +0000 Subject: [PATCH] Q40: the deployed gate admits all five negatives, and has no admission path at all Reproduces the Q39 closure's C26 from this host and states the mechanism: `grep -c HELM_COLLECTOR /root/.helm/bin/helm-selftest.py` -> 0; the deployed gate imports its subject at module scope from a hard-coded path (`:39`), so the five fixtures are never loaded -- the shipped gate has no subject-selection path at all, which is why Q34-Q39's admission machinery has nothing in production to guard. Measured: deployed gate x5 fixtures -> rc 0 / 7,488 B stdout / `119 passed, 0 failed` / `VERDICT: ALL GATES PASS`, stderr 0 B, live snapshot `aa842b0f...` delta 0 across all 15 invocations plus the green control; Q38 admits n1 and n2 (its C22/C23 holes); Q39 `9b09f328...` refuses all five (rc 2 / stdout 0 B / no fixture file touched / live delta 0) and runs the pair green (164 passed / 0 failed, `Q39 OK`, 17 legs watched, delta 0 on each). Nothing deployed, no `cp`, `/root/.helm/bin/`, `decisions/` and `inbox/` untouched. Deliverable `recoveries/helm-deployed-gate-admission.md` (5,633 B / sha256 5bdd2e7503cced8eee5b31a0256500aaa8eda9f8e3adbb80d3702eeb5e8df61a). --- WORK-QUEUE.md | 61 ++++++++++++ checkins/2026-10-12-merlin.md | 107 ++++++++++++++++++--- recoveries/helm-deployed-gate-admission.md | 91 ++++++++++++++++++ 3 files changed, 248 insertions(+), 11 deletions(-) create mode 100644 recoveries/helm-deployed-gate-admission.md diff --git a/WORK-QUEUE.md b/WORK-QUEUE.md index 1406b53..4eb211e 100644 --- a/WORK-QUEUE.md +++ b/WORK-QUEUE.md @@ -5212,6 +5212,67 @@ Read from source and from the forge API, not from the PR's narrative. - **Adoption stays Alexander's; nothing was executed.** The pair is collector `4e45021d…` + gate `9b09f328…`. My recommendation, in the delivery: adopt the pair, and open the stronger form (the legs against a rewritten copy) as the Helm lane's next item rather than a precondition for adoption. - **Third-party write in this file, left standing, appended below.** `c2a0dc37` (control plane, 09:44:40Z) added its own Q39 block. Its receipt reproduces here to the byte (rc 2 / stdout 0 B / `e3b0c442…`), its digest finding is corroborated independently, and its "hold is superseded" is that lane's position on the evidence, not Alexander's decision — so the adoption ask is unchanged. +--- + +## Q40 — the deployed gate admits all five negatives, and has no admission path at all *(Helm lane; opened 2026-10-12 by Merlin, discharging the Q39 closure's C26)* + +The Q39 closure (reply 22, C26) reported that the **deployed production gate** +(`/root/.helm/bin/helm-selftest.py`, `7ed1bca8…`, 609 lines) returns rc 0 / +`119 passed, 0 failed` / `VERDICT: ALL GATES PASS` on **all five** Q39 negative +fixtures. Since the deployed gate is the artifact production runs, if it admits +the negatives then none of Q34–Q39's protection is in force in `/root/.helm/bin/`. + +**Done means:** the deployed gate's behaviour on all five fixtures measured from +this host, with side effects detected rather than asserted, plus a stated +mechanism for the result. **Evidence:** the run transcript, the fixture and gate +digests, the live snapshot's (sha256, mtime_ns) before and after every leg. + +**Status: DONE — `recoveries/helm-deployed-gate-admission.md` (5,633 B / sha256 +`5bdd2e7503cced8eee5b31a0256500aaa8eda9f8e3adbb80d3702eeb5e8df61a`), Merlin, +2026-10-12.** Method `/root/troupe-verify/q40/q40-deployed-gate-negatives.py` +(written from the gates' source); evidence `/root/troupe-verify/q40/DEPLOYED-GATE-NEGATIVES.json`; +run transcript `/root/troupe-verify/q40/run.out`. + +- **C26 reproduces exactly.** Deployed gate × all five fixtures (n1-incident-shape, + n2-traceback, n3-decoy, n4-comment-only, n5-live-literal): **rc 0, stdout 7,488 B, + `helm-selftest: 119 passed, 0 failed`, `VERDICT: ALL GATES PASS`**, stderr 0 B, + 0.5 s each, no fixture file touched, live delta 0. Live snapshot unchanged + throughout: 14,039 B / `aa842b0fd88037f83115b4a54d617f27666f4de06ef84f9a64c8fd0a5f04656d` + / mtime_ns `1791479579475780303` — **delta 0 across all 15 invocations** plus the + green control. +- **The mechanism is stronger than C26 stated.** `grep -c HELM_COLLECTOR + /root/.helm/bin/helm-selftest.py` → **0**. The deployed gate imports its subject + at module scope from a hard-coded path (`helm-selftest.py:39`, + `spec_from_file_location("helm_collect", Path("/root/.helm/bin/helm-collect.py"))`), + so `HELM_COLLECTOR` never reaches it. The five green rows are not the gate + approving bad collectors — it never loaded them. The exposure is that the + deployed gate has **no subject-selection path at all**, so there is nothing for + Q34–Q39's admission machinery to guard, and a bad collector dropped into + `/root/.helm/bin/` would fail the suite uncontrolled (a module-scope + `AttributeError`, not a dated refusal) or run with no destination rule anywhere + in the production path. +- **The fixed gates discriminate, re-measured in the same run.** Q38 `74aba348…`: + n1 rc 0 (admitted — C22's hole, writes the fixture's `n1-dest/`), n2 rc 1 + (admitted then crashed), n3/n4/n5 rc 2 refused (n3's probe writes the decoy's + real destination — the containment failure). Q39 `9b09f328…`: **all five rc 2, + stdout 0 B, no fixture file touched, live delta 0**. Positive control, this run, + `HELM_COLLECTOR=/root/crucible/q39/helm-collect.py python3 + /root/crucible/q39/helm-selftest.py`: exit 0, `164 passed, 0 failed`, + `VERDICT: ALL GATES PASS`, `Q39: 17 legs watched … delta 0 on each`, + `Q39 OK: … (probe rc=2, sentinel written=False … live delta 0)` — log + `/root/troupe-verify/q40/q39-green.out`, sha256 + `7fd767b72e811f46466b4acd4f214ab27e56c33012629a7bcd5fbbbc2567daa4`. No probe dirs + left (`ls /root/crucible | grep -c helm-q39-` → 0). +- **Nothing touched.** `/root/.helm/bin/` unmoved (`ee0b36a82f23fcf3…` / + `7ed1bca8f9da624f…` / `5c67473d89283c3d…`), no `cp`, nothing deployed; + `decisions/` and `inbox/` untouched. +- **Consequence for the standing adoption ask (Alexander, §4):** the `cp` of + collector `4e45021d…` + gate `9b09f328…` is the only thing that puts any of + Q31–Q39's protection into production, and this run shows the reason is stronger + than the admission question: the shipped gate has no subject-selection path at + all. Q39's refusal behaviour is intact and the fixed pair discriminates on every + class. Adoption stays Alexander's; nothing was executed from this side. + ## Q37 — claimed by this pipe; first increment landed (the v1.3 census) **Status: OPEN and claimed by the pipe (Merlin's §Next 2 read it correctly; it is this lane's tooling). Landed this tick:** the `branch-head` census line in `troupe_pipe_monitor.py` v1.3, sha256 `bb532da8c4f01b98eab4034ce74dc76b0e3939508bfd6cadd5d3d650020449f8`; v1.2 preserved at `/root/troupe-verify/q37/troupe_pipe_monitor.py.v1.2.bak` (`ce3950b5…`), reversible with one `cp`; record `recoveries/monitor-identity-census.md`. diff --git a/checkins/2026-10-12-merlin.md b/checkins/2026-10-12-merlin.md index 71308af..e470763 100644 --- a/checkins/2026-10-12-merlin.md +++ b/checkins/2026-10-12-merlin.md @@ -566,9 +566,9 @@ one. Nothing else is blocking. --- -Landing evidence, Run 5, appended after the push (`fad802c`) and read back over the anonymous raw path -(`https://forge.alexanderwhitestone.com/git/stackchain/troupe-standup/raw/branch/main/`), no -credential — each **HTTP 200** and `cmp` **byte-identical** to disk +Landing evidence, Run 5, appended after the push (`fad802c`) and read back over the anonymous raw +path (`https://forge.alexanderwhitestone.com/git/stackchain/troupe-standup/raw/branch/main/`), +no credential — each **HTTP 200** and `cmp` **byte-identical** to disk (`python3 /root/crucible/q39/readback.py`, exit 0): | file | status / bytes | sha256 | @@ -577,13 +577,98 @@ credential — each **HTTP 200** and `cmp` **byte-identical** to disk | `WORK-QUEUE.md` | 200 / 587,985 | `3884ebf8b731667ab3c5e99ae0e54c6e83883849d598e7b5553809626f937df5` | | `checkins/2026-10-12-merlin.md` | 200 / 38,651 (pre-append revision, as pushed in `fad802c`) | `d16b8ef27cc157008ea9773242bcd1de465778dee8d20a90cc705d091426bde2` | -Re-measured after the push, from this host: the live snapshot `/root/.helm/data/snapshot.json` is **14,039 -B / sha256 `aa842b0fd88037f83115b4a54d617f27666f4de06ef84f9a64c8fd0a5f04656d` / mtime_ns -`1791479579475780303`** — delta 0 across the whole run — and the deployed `/root/.helm/bin/` is untouched -(`ee0b36a82f23fcf3…` / `7ed1bca8f9da624f…` / `5c67473d89283c3d…`). Nothing was deployed, published, -rebuilt or re-run; `decisions/` and `inbox/` were not touched; no another-party file was edited; no secret -is printed in this check-in or in the files it lands — the long strings are gate check names, refusal -messages, file paths and sha256 digests. This run's commit is authored `Merlin ` -(`git -c`), so the monitor sees it as counterparty content per Q36's v1.2 rule. +Re-measured after the push, from this host: the live snapshot `/root/.helm/data/snapshot.json` is +**14,039 B / sha256 `aa842b0fd88037f83115b4a54d617f27666f4de06ef84f9a64c8fd0a5f04656d` / mtime_ns +`1791479579475780303`** — delta 0 across the whole run — and the deployed `/root/.helm/bin/` is +untouched (`ee0b36a82f23fcf3…` / `7ed1bca8f9da624f…` / `5c67473d89283c3d…`). Nothing was deployed, +published, rebuilt or re-run; `decisions/` and `inbox/` were not touched; no another-party file was +edited; no secret is printed in this check-in or in the files it lands — the long strings are gate +check names, refusal messages, file paths and sha256 digests. This run's commit is authored +`Merlin ` (`git -c`), so the monitor sees it as counterparty content per +Q36's v1.2 rule. + +## Run 6 — Q40: the deployed gate admits all five negatives, and has no admission path at all + +## Did + +**Item taken:** the Q39 closure's correction **C26** — "the production gate (`7ed1bca8…`, 609 lines) +returns rc 0 / `119 passed, 0 failed` on all five fixtures" — reproduced independently from this host, +because it is the last measured exposure in the Helm lane and everything else in the lane is gated on +Alexander's `cp`. Q34–Q39 are all closed; Q31/Q32 are adoption decisions; Q9 is blocked on the audio +handover; Q13/Q19 are Alexander's. Deliverable: `recoveries/helm-deployed-gate-admission.md` +(**5,633 B / sha256 `5bdd2e7503cced8eee5b31a0256500aaa8eda9f8e3adbb80d3702eeb5e8df61a`**, this host). + +**Method:** `/root/troupe-verify/q40/q40-deployed-gate-negatives.py`, written from the gates' source. +Each of the five Q39 fixtures run as a subject of three gates (deployed `7ed1bca8…`, Q38 +`74aba348…`, Q39 `9b09f328…`) under `HELM_COLLECTOR=`; side effects detected by +(sha256, size, mtime_ns) change over a pre-run census of the fixtures tree, nothing deleted; live +snapshot state read before and after every invocation. Evidence: +`/root/troupe-verify/q40/DEPLOYED-GATE-NEGATIVES.json`. Run transcript: `/root/troupe-verify/q40/run.out`. + +**C26 reproduces exactly.** Deployed gate × all five fixtures: **rc 0, stdout 7,488 B, +`helm-selftest: 119 passed, 0 failed`, `VERDICT: ALL GATES PASS`**, stderr 0 B, 0.5 s each, no fixture +file touched, live delta 0. Live snapshot unchanged throughout: **14,039 B / sha256 +`aa842b0fd88037f83115b4a54d617f27666f4de06ef84f9a64c8fd0a5f04656d` / mtime_ns +`1791479579475780303`** — delta 0 across all 15 invocations plus the green control. + +**The mechanism is stronger than C26 stated.** `grep -c HELM_COLLECTOR /root/.helm/bin/helm-selftest.py` +→ **0**. The deployed gate imports its subject at module scope from a hard-coded path +(`helm-selftest.py:39`, `spec_from_file_location("helm_collect", Path("/root/.helm/bin/helm-collect.py"))`), +so `HELM_COLLECTOR` never reaches it: the five green rows are not the gate approving bad collectors — +it never loaded them. The exposure is that the deployed gate has **no subject-selection path at all**, +so there is nothing for Q34–Q39's admission machinery to guard, and a bad collector dropped into +`/root/.helm/bin/` would fail the suite uncontrolled (a module-scope `AttributeError`, not a dated +refusal) or run with no destination rule in the production path. + +**The fixed gates discriminate, re-measured in the same run.** Q38 `74aba348…`: n1 rc 0 (admitted — +C22's hole, writes the fixture's `n1-dest/`), n2 rc 1 (admitted then crashed), n3/n4/n5 rc 2 refused +(n3's probe writes the decoy's real destination — the containment failure). Q39 `9b09f328…`: **all +five rc 2, stdout 0 B, no fixture file touched, live delta 0**. Positive control, this run, +`HELM_COLLECTOR=/root/crucible/q39/helm-collect.py python3 /root/crucible/q39/helm-selftest.py`: +**exit 0, `164 passed, 0 failed`, `VERDICT: ALL GATES PASS`, `Q39: 17 legs watched … delta 0 on each`, +`Q39 OK: … (probe rc=2, sentinel written=False … live delta 0)`** — log +`/root/troupe-verify/q40/q39-green.out`, sha256 `7fd767b72e811f46466b4acd4f214ab27e56c33012629a7bcd5fbbbc2567daa4`. +No probe dirs left (`ls /root/crucible | grep -c helm-q39-` → 0). + +**Nothing touched.** `/root/.helm/bin/` unmoved (`ee0b36a82f23fcf3…` / `7ed1bca8f9da624f…` / +`5c67473d89283c3d…`), no `cp`, nothing deployed; `decisions/` and `inbox/` untouched. + +## Blocked + +1. **Adoption is still Alexander's, and now the sharper ask.** The `cp` decision (collector + `4e45021d…` + gate `9b09f328…`) is the only thing that puts any of Q31–Q39's protection into + production; until then `/root/.helm/bin/helm-selftest.py` runs with no subject-selection path. +2. **Disk:** `/` at **21 MB free / 100%** (`df -h /`), same as the pipe's 11:07Z reading. Q40 added + ~50 KB of logs. The reclaim classes remain Alexander's (log rotation + `docker system prune` ≈1.5 GB; + the `stackchain-dashboard.service` crash loop at ~600 MB/day). + +## Next + +1. On **adopt**: the verification run of the *deployed* pair — the gate re-run from + `/root/.helm/bin/` after the `cp`, with the negatives and the live snapshot measured around it. +2. The stronger form named in Q39: legs run a rewritten copy of the subject rather than the original. +3. Q37 (pipe tooling) stays with Timmy; Q9 stays blocked; Q13/Q19 stay gated. + +## Ask + +Alexander — Run 5's ask is unchanged and this run strengthens it: the gate production runs today has +**no subject-selection path at all** (`HELM_COLLECTOR` read count 0), so none of Q34–Q39 is in force in +`/root/.helm/bin/`. The pair is collector `4e45021d…` + gate `9b09f328…`: **adopt**, **hold**, or +**build the stronger form first**. My recommendation is unchanged — adopt, with the stronger form as +the next unit. Second ask, carried: approve log rotation + `docker system prune` (~1.5 GB) and rule on +`stackchain-dashboard.service`; at 21 MB free every lane's run is one ENOSPC from dying. — Merlin + +--- + +Landing evidence, Run 6, appended after the push and read back over the anonymous raw path +(`https://forge.alexanderwhitestone.com/git/stackchain/troupe-standup/raw/branch/main/`), no +credential — each **HTTP 200** and `cmp` byte-identical to disk: + +| file | status / bytes | sha256 | +|---|---|---| +| `recoveries/helm-deployed-gate-admission.md` | 200 / 5,633 | `5bdd2e7503cced8eee5b31a0256500aaa8eda9f8e3adbb80d3702eeb5e8df61a` | + +— Merlin + diff --git a/recoveries/helm-deployed-gate-admission.md b/recoveries/helm-deployed-gate-admission.md new file mode 100644 index 0000000..271cadb --- /dev/null +++ b/recoveries/helm-deployed-gate-admission.md @@ -0,0 +1,91 @@ +# Q40 — the deployed gate admits all five negatives, and it has no admission path at all + +The Q39 closure (reply 22, C26) reported that the **deployed production gate** +(`/root/.helm/bin/helm-selftest.py`, `7ed1bca8…`, 609 lines) returns rc 0 / +`119 passed, 0 failed` / `VERDICT: ALL GATES PASS` on **all five** Q39 negative +fixtures. Q39's item definition said the fixed pair must refuse all four classes; +the deployed gate is the artifact production actually runs, so if it admits the +negatives, none of Q34–Q39's protection is in force in `/root/.helm/bin/`. + +**This run reproduces that result independently, and refines the mechanism.** + +## Method + +`/root/troupe-verify/q40/q40-deployed-gate-negatives.py`, written from the gates' +source, not from either harness. Each fixture is run as a subject of three gates — +deployed `7ed1bca8…`, Q38 `74aba348…`, Q39 `9b09f328…` — under +`HELM_COLLECTOR=`. Side effects are detected by **(sha256, size, +mtime_ns)** change over a pre-run census of the whole fixtures tree; **nothing is +deleted**. The live snapshot's (sha256, mtime_ns, size) is read before and after +every invocation. No pre-gate collector is passed through any subprocess leg. +Evidence: `/root/troupe-verify/q40/DEPLOYED-GATE-NEGATIVES.json`. + +## Result — the deployed gate admits all five + +| gate | fixture | rc | stdout | count line | fixture files changed | live delta | +|---|---|---|---|---|---|---| +| deployed `7ed1bca8…` | n1-incident-shape | 0 | 7,488 B | `helm-selftest: 119 passed, 0 failed` | 0 | 0 | +| deployed `7ed1bca8…` | n2-traceback | 0 | 7,488 B | `119 passed, 0 failed` | 0 | 0 | +| deployed `7ed1bca8…` | n3-decoy | 0 | 7,488 B | `119 passed, 0 failed` | 0 | 0 | +| deployed `7ed1bca8…` | n4-comment-only | 0 | 7,488 B | `119 passed, 0 failed` | 0 | 0 | +| deployed `7ed1bca8…` | n5-live-literal | 0 | 7,488 B | `119 passed, 0 failed` | 0 | 0 | + +stderr 0 bytes on all five; `VERDICT: ALL GATES PASS` in every stdout; run time +0.5 s each. Live snapshot unchanged throughout: 14,039 B / +`aa842b0fd88037f83115b4a54d617f27666f4de06ef84f9a64c8fd0a5f04656d` / +mtime_ns `1791479579475780303`. C26's finding is **Documented** from this host. + +## Mechanism — the admission claim does not read the subject it is handed + +`grep -c HELM_COLLECTOR /root/.helm/bin/helm-selftest.py` → **0**. The deployed +gate imports its subject at **module scope, from a hard-coded path**: +`helm-selftest.py:39` — `importlib.util.spec_from_file_location("helm_collect", +Path("/root/.helm/bin/helm-collect.py"))`. `HELM_COLLECTOR` never reaches it. + +So the five green rows are not the gate *approving* bad collectors — it never +loaded them. What the measurement actually establishes is the stronger claim: + +- the deployed gate has **no subject-selection path at all** (no env read, no + argv, no rewrite), so there is nothing for an admission control to guard; +- the collector under test is always the bin's own, so a **bad collector dropped + into `/root/.helm/bin/`** would either fail the suite uncontrolled (an + `AttributeError` at the module-scope import, not a dated refusal) or be run + with no destination rule anywhere in the production path. + +That is the practical form of Q34–Q39's exposure: not a gate that says +yes when it should say no, but a gate with no input the fix could even guard. + +## The fixed gates discriminate — re-measured in the same run + +| gate | fixture | rc | stdout | verdict | +|---|---|---|---|---| +| Q38 `74aba348…` | n1-incident-shape | **0** | 575 B | admitted (Q38's C22 hole; writes the fixture's `n1-dest/`) | +| Q38 `74aba348…` | n2-traceback | **1** | 575 B | admitted then crashed | +| Q38 `74aba348…` | n3-decoy | 2 | 0 B | refused (but the probe wrote the decoy's real destination) | +| Q38 `74aba348…` | n4-comment-only | 2 | 0 B | refused | +| Q38 `74aba348…` | n5-live-literal | 2 | 575 B | refused | +| Q39 `9b09f328…` | all five | **2** | **0 B** each | refused, no fixture file touched, live delta 0 | + +Positive control, this run, gate `9b09f328…` with collector `4e45021d…`: +exit 0, `helm-selftest: 164 passed, 0 failed`, `VERDICT: ALL GATES PASS`, +`Q39: 17 legs watched … delta 0 on each`, `Q39 OK: … (probe rc=2, sentinel +written=False … live delta 0)`. Log `/root/troupe-verify/q40/q39-green.out` +(sha256 `7fd767b72e811f46466b4acd4f214ab27e56c33012629a7bcd5fbbbc2567daa4`). +No probe directories left (`ls /root/crucible | grep -c helm-q39-` → **0**). + +## Identities, all re-read this run + +- live snapshot 14,039 B / `aa842b0fd88037f83115b4a54d617f27666f4de06ef84f9a64c8fd0a5f04656d` / mtime_ns `1791479579475780303`, **delta 0 across all 15 invocations** (deployed gate ×5, Q38 ×5, Q39 ×5) plus the green control. +- gate digests recorded in `DEPLOYED-GATE-NEGATIVES.json` (`gate_shas`); fixture digests likewise, one per negative. +- `/root/.helm/bin/` untouched: `helm-selftest.py` `7ed1bca8…` (609 lines), `helm-collect.py` `ee0b36a8…`, `helm-render.py` `5c67473d…`. Nothing deployed, no `cp` made. +- `/root/troupe-standup` and `decisions/`, `inbox/` untouched by this run. + +## Verdict + +The deployed gate's five green rows reproduce exactly, but the exposure is +**wider and simpler than C26 stated**: the deployed gate has no subject-selection +path at all, so Q34–Q39's admission machinery has nothing in production to guard, +and the fix that matters is the three-tick `cp` (collector `4e45021d…` + gate +`9b09f328…`) that reply 22 already recommended. Q39's refusal behaviour is intact +and the fixed pair discriminates on every class. Adoption stays Alexander's; +nothing was executed from this side.