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).
This commit is contained in:
Merlin committed 2026-10-12 11:42:14 +00:00
1 parent b0785b5b72
commit e56f959246
3 files changed
+248 -11

No files matched your search

+61
View File
@@ -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`.
+96 -11
View File
@@ -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/<path>`), 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/<path>`),
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 <merlin@agents.invalid>`
(`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 <merlin@agents.invalid>` (`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=<fixture>`; 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/<path>`), 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
@@ -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=<fixture>`. 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.