docs(framing): revision 10 --- awaiting approval; fix the corrupted provenance

Two findings, both upheld.

1. The portable provenance was corrupted and incomplete --- worse than
   the machine-local pointer it replaced, because it looked verifiable
   and was not. Every log digest had lost its leading hex character
   (A#1 recorded as 1c0fe47d55d8f5e... where the value is
   e1c0fe47d55d8f5e): the extraction started one byte late in
   `logsha=<value>`. The captured /tmp and MemAvailable columns were
   dropped, and the command block used ellipsed paths. All ten digests
   are corrected, both columns restored, and the command is written out
   in full with only two named placeholders.

   Separately: `uptime` was NEVER CAPTURED. §7's condition list names
   it; the harness kept the load averages from it and discarded the
   elapsed time. It is now recorded as UNKNOWN for all ten runs, with
   the condition list marked as only partially satisfied rather than
   implied met. The classifications stand --- none depends on uptime ---
   and D1/D2's harness must capture the whole list.

2. Retiring D0b materially changes the approved diagnostic sequence,
   which made D0b mandatory before every other diagnostic. The document
   still claimed revision 9, approved at 15c25ec, for a decision that
   approval does not contain. Promoted to revision 10 and marked
   AWAITING APPROVAL; D0a's execution and result are reported under
   revision 9, and D1/D2 do not begin until revision 10 is approved.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016bqGA6s9tTUFzYpbeW3tai
This commit is contained in:
Levi Neuwirth 2026-08-19 13:39:46 +02:00
parent ea0f3bfb14
commit 5f5fde6dde
No known key found for this signature in database
3 changed files with 75 additions and 28 deletions

View File

@ -279,8 +279,11 @@ from #171 and #215.
**`72da24a`**, worktree
`/home/jeans/Repos/personal/pmacs-probe-sigint`. Recover with
`git fetch githubsucks && git checkout gpu-probe-sigint-teardown`.
- **No PR. Framing revision 9 at `docs/gpu-probe-sigint-framing.md`,
APPROVED 2026-08-19 at `15c25ec`; NO IMPLEMENTATION and no fix
- **No PR. Framing revision 10 at `docs/gpu-probe-sigint-framing.md`,
AWAITING APPROVAL** — revision 9 was approved at `15c25ec`, but that
approval does **not** cover retiring D0b, which changes the approved
diagnostic sequence. **D1/D2 do not begin until revision 10 is
approved.** Also: NO IMPLEMENTATION and no fix
proposed** — the mechanism is not known yet, and the framing says so
rather than guessing. Revisions 1, 2 and 3 were each rejected on
findings, all upheld; run provenance lives in
@ -301,7 +304,13 @@ from #171 and #215.
- **The useful product is a RELIABLE REPRODUCTION** — 10/10 across two
commits at ~4 min/run. D1/D2 no longer wait on a rare event and are
the next step. Per-run provenance in `docs/probe-sigint-evidence.md`
§D0a and `/home/jeans/build/pmacs-gate-targets/d0a/results.tsv`.
§D0a, transcribed in full into that committed document — after the
first transcription corrupted every log digest by one hex character
and dropped `/tmp` and `MemAvailable`. **`uptime` was never captured**
and is `UNKNOWN` for all ten runs: §7 names it, the harness kept only
the load averages, so that condition list was **not fully
satisfied**. The classifications stand; D1/D2's harness must capture
the whole list.
- **Why it exists.** `ctrl_c_on_launcher_group_does_not_reach_spawned_daemon`
fails in gate stage `sweep-crdt` with "child did not exit within 5s".
**Pre-existing on `main`** — `72da24a` fails it in a clean worktree

View File

@ -1,8 +1,14 @@
# GPU launcher / probe SIGINT teardown — framing
Revision 9, approved 2026-08-19 at `15c25ec`.
Status: **D0a EXECUTED — see §4b. No fix implemented; mechanism still
unknown.**
Revision 10. Status: **AWAITING APPROVAL. No fix implemented;
mechanism still unknown.**
Revision 9 was approved 2026-08-19 at `15c25ec`. **That approval does
not extend to this revision**, because retiring D0b (§7) materially
changes the approved diagnostic sequence — the approved text made D0b
mandatory before every other diagnostic. D0a's execution and result
(§4b) are reported under it, and D1/D2 do not begin until this revision
is approved.
Revisions 1 and 2 were each rejected on five findings. Every correction
is recorded in place rather than quietly rewritten, because three of
@ -22,6 +28,15 @@ them were claims this document itself had advanced:
(manifest); ledgers still carried the falsified R9 conclusions (§11).
**And a finding that reframes the lane: the failure has a datable
onset (§4a) and is not long-standing.**
- r9 → r10: **D0b retired as a precondition** (§7), which changes the
approved sequence and is why this revision needs its own approval;
D0a executed and its causal conclusion narrowed twice — "source
hypothesis eliminated" withdrawn in favour of "the commits do not
discriminate under current conditions" (§4b, and the endpoint
table's two uniform-same rows); portable provenance corrected after
it corrupted every log digest and silently dropped `/tmp` and
`MemAvailable`; and `uptime` recorded as **UNKNOWN**, since §7 names
it but the harness kept only the load averages.
- r8 → r9: D0a's classifier was not total — it named only "clean
split" and "mixed", leaving both-green, both-red, non-execution,
copy-disagreement and unrelated-failure outcomes unprescribed, all of
@ -381,7 +396,10 @@ group.
confounding*; with an even run count one arm still holds the last
slot, and that residue is accepted and stated rather than papered
over.
- **Identical captured conditions per run**: same harness as D0b —
- **Identical captured conditions per run** — and D0a satisfied this
list only **partially**: it captured everything below except
`uptime`, keeping the load averages and discarding elapsed time.
D1/D2's harness must capture the whole list. Same harness as D0b —
argv, worktree, `git rev-parse HEAD`, `git status --porcelain`
emptiness, the Cargo suffixes executed, result, log digest — plus
the machine facts that have already misled this lane once

View File

@ -178,33 +178,53 @@ precondition then the `sweep-crdt` command. `dirty=0` verified per run.
| A#5 | A | `7599661` | **red** | 0 / 2 | 3 | `d0a/A-5.log` |
| B#5 | B | `724b785` | **red** | 0 / 2 | 2 | `d0a/B-5.log` |
**Exact commands.** Per run, with `TMPDIR=…/tmp/d0a` and
`CARGO_TARGET_DIR=…/d0a-A` or `…/d0a-B`, executed in
**Exact commands.** Every run, in full. `<WT>` is
`/home/jeans/Repos/personal/pmacs-d0a-A` (detached at `7599661`) or
`…-d0a-B` (detached at `724b785`):
`/home/jeans/Repos/personal/pmacs-d0a-B` (detached at `724b785`);
`<TD>` is `/home/jeans/build/pmacs-gate-targets/d0a-A` or `…/d0a-B`
correspondingly:
```
cargo build --workspace --no-default-features --features luajit,crdt \
&& cargo test --workspace --features crdt --no-fail-fast -- --skip basedpyright
env TMPDIR=/home/jeans/build/pmacs-gate-targets/tmp/d0a \
CARGO_TARGET_DIR=<TD> \
sh -c 'cd <WT> \
&& cargo build --workspace --no-default-features --features luajit,crdt \
&& cargo test --workspace --features crdt --no-fail-fast -- --skip basedpyright'
```
**Per-run provenance, transcribed** (all runs `exit=101`, `dirty=0`,
`ok=0 failed=2`, suffixes `-5d9105cb` / `-d4dae4f0`). Times are local
2026-08-19; `load` is the 1/5/15 average at run start; `freeMB` is
`MemFree`; `daemons` counts live `pmacs --daemon` processes:
**Per-run provenance, transcribed.** All runs: `exit=101`, `dirty=0`,
`ok=0 failed=2`, suffixes `-5d9105cb` / `-d4dae4f0`, `/tmp` 3 G of 30 G.
Times are local 2026-08-19. `load` is the 1/5/15 average at run start;
`MemFree`/`MemAvail` in MB; `daemons` counts live `pmacs --daemon`:
| start | run | class | red bins | load | freeMB | daemons | log sha256/16 |
|---|---|---|---|---|---|---|---|
| 12:21:20 | A#1 | red | 3 | 2.51, 2.85, 3.57 | 1549 | 72 | `1c0fe47d55d8f5e…` |
| 12:26:55 | B#1 | red | 2 | 7.86, 13.48, 8.97 | 9405 | 76 | `105794d515e6ec3…` |
| 12:32:12 | B#2 | red | 2 | 8.04, 18.28, 13.23 | 9761 | 80 | `7a662fb5ca15687…` |
| 12:35:39 | A#2 | red | 4 | 11.34, 21.23, 16.20 | 8933 | 84 | `50aacb9d15244c9…` |
| 12:39:35 | A#3 | red | 3 | 13.40, 26.07, 20.45 | 10628 | 88 | `9156bbbc852e2d3…` |
| 12:43:26 | B#3 | red | 2 | 8.66, 22.18, 20.82 | 8778 | 92 | `f0d768a76ed9cb0…` |
| 12:47:20 | B#4 | red | 2 | 17.96, 33.10, 27.07 | 10403 | 96 | `5a043a3d5568598…` |
| 12:50:49 | A#4 | red | 3 | 10.99, 27.07, 26.52 | 10702 | 100 | `1b6d88c08764d9a…` |
| 12:54:47 | A#5 | red | 3 | 9.75, 28.50, 28.70 | 8494 | 104 | `ae21a3f53fc1a1a…` |
| 12:58:38 | B#5 | red | 2 | 11.43, 26.69, 28.97 | 8562 | 108 | `2c5baa0c7e49e37…` |
| start | run | class | red bins | load | MemFree | MemAvail | daemons | log sha256/16 |
|---|---|---|---|---|---|---|---|---|
| 12:21:20 | A#1 | red | 3 | 2.51 2.85 3.57 | 1549 | 42069 | 72 | `e1c0fe47d55d8f5e` |
| 12:26:55 | B#1 | red | 2 | 7.86 13.48 8.97 | 9405 | 42725 | 76 | `3105794d515e6ec3` |
| 12:32:12 | B#2 | red | 2 | 8.04 18.28 13.23 | 9761 | 43370 | 80 | `07a662fb5ca15687` |
| 12:35:39 | A#2 | red | 4 | 11.34 21.23 16.20 | 8933 | 43281 | 84 | `450aacb9d15244c9` |
| 12:39:35 | A#3 | red | 3 | 13.40 26.07 20.45 | 10628 | 42989 | 88 | `19156bbbc852e2d3` |
| 12:43:26 | B#3 | red | 2 | 8.66 22.18 20.82 | 8778 | 43588 | 92 | `6f0d768a76ed9cb0` |
| 12:47:20 | B#4 | red | 2 | 17.96 33.10 27.07 | 10403 | 43617 | 96 | `75a043a3d5568598` |
| 12:50:49 | A#4 | red | 3 | 10.99 27.07 26.52 | 10702 | 43335 | 100 | `c1b6d88c08764d9a` |
| 12:54:47 | A#5 | red | 3 | 9.75 28.50 28.70 | 8494 | 43053 | 104 | `2ae21a3f53fc1a1a` |
| 12:58:38 | B#5 | red | 2 | 11.43 26.69 28.97 | 8562 | 43122 | 108 | `82c5baa0c7e49e37` |
**Two defects in the previous transcription of this table, recorded
rather than silently fixed.** Every digest had lost its leading hex
character — A#1 read `1c0fe47d55d8f5e…` where the value is
`e1c0fe47d55d8f5e` — because the extraction started one byte late in
`logsha=<value>`. And `/tmp` and `MemAvailable` were captured by the
harness but dropped from the table. A transcription that silently
corrupts its own digests is worse than a pointer to the raw file, since
it looks verifiable and is not.
**`uptime` was NOT captured, and is `UNKNOWN` for all ten runs.** §7's
condition list names `uptime`; the harness recorded only the load
averages from it and discarded the elapsed time. The classifications
stand — none of them depends on it — but the condition list was **not
fully satisfied**, and D1/D2's harness must capture it. Recorded rather
than quietly treated as met.
Note the leaked-daemon count climbing 72 → 108, four per run. Recorded,
not implicated: it rises monotonically while every run classifies the