From 3b10f9d916de9b6811ce600853acb28ff90010f6 Mon Sep 17 00:00:00 2001 From: Levi Neuwirth Date: Mon, 10 Aug 2026 10:26:07 +0200 Subject: [PATCH] docs: both U4 and U5 controls are asymmetric, and said so only one way Three corrections. The first two are the same error in two rows. I wrote each control as if it DECIDES, when each is informative in only one direction. U4: extending the deadline establishes "emitted late" IF the clear arrives. If it does not arrive, that establishes only "not observed by the longer deadline" --- not "never emitted" --- because transport loss produces the same absence. No deadline, however long, separates non-emission from transport loss. That needs producer-side emission evidence, did pmacs write the clear, cross-checked against the collected stream. The row now states both branches and names what the negative branch cannot conclude. U5: one isolated run cannot decide whether the gate suite is implicated. A matching isolated RED proves the gate suite is not necessary for the failure. An isolated GREEN proves nothing beyond that run, because the failure is intermittent and absence under one run is not evidence of dependence. I had written it as though either outcome settled the question. This is worth naming as a class rather than two typos: a control whose positive branch is conclusive and whose negative branch is not, written up as though both were, is how an inconclusive result gets recorded as an exclusion. Two rows in this file had it. Third, minor: "three docs" was accurate at the occurrence tip and is not now --- #229 has since added this registry file. Replaced with "documentation" so the claim does not rot again with the next commit. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_016bqGA6s9tTUFzYpbeW3tai --- docs/ci-red-signatures.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/ci-red-signatures.md b/docs/ci-red-signatures.md index f938216..0e4e6a9 100644 --- a/docs/ci-red-signatures.md +++ b/docs/ci-red-signatures.md @@ -578,10 +578,10 @@ Surfaced on PR #229's CI. | **required fragments** | `FG-INV: the post-resize resync must blank the host` · `no CSI 2 J appeared in the` · `bytes emitted after the first painted frame` | | **NOT fragments** | the byte count and the `:LINE` suffix are **occurrence-specific** and must not be matched on — the count is the collected suffix length, which varies per run, and the line moves with the file | | **status** | **one occurrence; INTERMITTENT — passed on rerun** | -| **why the diff is excluded** | #229 changes only `scripts/gate`, `tests/gate_script_acceptance.rs` and three docs — **no `src/`, and the workflow never invokes `scripts/gate`**. Decisively, `full_grid_resync_acceptance` runs **before** the changed gate suite, so even a cross-suite leaked-state path is not available. The `luajit` leg passing on the same commit is **corroboration only** — a deterministic defect *can* be Lua-flavour-specific, so that observation must not be used as a structural exclusion | +| **why the diff is excluded** | #229 changes only `scripts/gate`, `tests/gate_script_acceptance.rs` and documentation — **no `src/`, and the workflow never invokes `scripts/gate`**. Decisively, `full_grid_resync_acceptance` runs **before** the changed gate suite, so even a cross-suite leaked-state path is not available. The `luajit` leg passing on the same commit is **corroboration only** — a deterministic defect *can* be Lua-flavour-specific, so that observation must not be used as a structural exclusion | | **what IS established** | **no blank was OBSERVED after the mark** within the test's fixed 20-second deadline. The collected suffix was the **entire** post-mark output (`suffix.len()`, 25 362 bytes on this occurrence — not a capped window; only the *displayed* head is truncated to 400 bytes), and that head shows ordinary repaint traffic (`ZQXMARKERQZ` rows with SGR + CUP), so the host was painting | | **what is NOT** | any mechanism. Whether the blank was never emitted, emitted after the deadline, or lost in transport is **open** — and "it never emitted the blank" is a claim this evidence does not support. **The failing run's ~20 s duration is the fixed `Duration::from_secs(20)` timeout**, so the spread against a fast passing run is mechanically determined and is **not** independent timing evidence | -| **discriminating control for the next occurrence** | the suffix is already complete, so "capture more bytes" is not the gap — **arrival time is**. Instrument the wait to record whether `CLEAR_ALL` arrives at all when the deadline is extended, and at what offset, which separates "never emitted" from "emitted late" | +| **discriminating control — ASYMMETRIC, and only one direction concludes** | the suffix is already complete, so "capture more bytes" is not the gap — arrival time is. Extending the deadline and recording whether `CLEAR_ALL` arrives, and at what offset: **if it arrives, "emitted late" is established.** **If it does not, that establishes only "not observed by the longer deadline"** — *not* "never emitted", because transport loss produces the same absence. Separating non-emission from transport loss needs **producer-side emission evidence** (did pmacs write the clear?) cross-checked against the collected stream; no deadline, however long, can do it alone | ### U5 — `ctrl_c_during_reconnect_sleep_yields_clean_exit`, macOS `lua54`, one occurrence @@ -599,5 +599,5 @@ incident, not U4 occurring twice**. | **what IS established** | Ctrl-C reached the process **as `SIGINT`** rather than as the raw-mode key event the test drives. That is all the exit status shows | | **what is NOT** | whether injection preceded raw mode, raw mode was lost, or something else. Three mechanisms remain open and this fragment separates none of them | | **exclusion strength — WEAKER than U4's, deliberately** | the changed `gate_script_acceptance` ran **earlier in the same job**, and it creates worktrees and directories. No leaked child or persistent signal-state mutation was observed, but "the diff touches no `src/`" is **not** the argument here that it is for U4, because cross-suite leaked state is a path reachability reasoning does not close | -| **control 1 — CROSS-SUITE ATTRIBUTION ONLY** | run `m5_8_acceptance` alone on macOS `lua54`, without the gate suite ahead of it. This decides whether the gate suite is implicated. **It does NOT discriminate among the three mechanisms** and must not be read as doing so | +| **control 1 — CROSS-SUITE ATTRIBUTION, and asymmetric** | run `m5_8_acceptance` alone on macOS `lua54`, without the gate suite ahead of it. **A matching isolated RED proves the gate suite is not necessary** for the failure. **An isolated GREEN proves nothing beyond that run** — the failure is intermittent, so absence under one run is not evidence of dependence. It also does **not** discriminate among the three mechanisms in either direction | | **control 2 — mechanism** | observe **readiness and raw-mode state at the moment of injection**. Another isolated pass, however many times repeated, cannot separate "injected before raw mode" from "raw mode lost" from a third cause |