# LIFECYCLE-TRUTH W5 — GATE HOLD (doyle, 2026-07-07)

**Verdict: HOLD — one fix needed before bless.** Everything else green. Wave head `28df069`.

## Gate state
- Ruling-check: **both premise refinements ACCEPTED** (echo-verify capability default-off; bracketed-paste deferred — see the send). Layer-1 settle-gate verified as a REAL DSR probe, not a timer.
- **Linux (kitsubito @28df069): GREEN** — clippy 0, nextest **1694/1694** (incl. the forkpty-HARD `HEADSTART`/`TAILEND` byte-receipt asserts).
- **Windows (isolated worktree @28df069):** clippy 0, xtask OK, traceable 0, nextest **1705/1706 — ONE red.**

## The blocker — `inject_control_wedge::c1_miss_once_preserves_binary_and_next_inject_delivers`

**Flaky ~17% on Windows, ISOLATED (single test, no parallel load): 2/12 fail, 4/5 fail, etc.** This is NOT a load-class flake (not isolated-green like the W2 ledger entries) — it is an inherent timing race, so it cannot be flake-ledgered. It is on the seam W5-A changed.

**Root (diagnosed):** `c1_miss` is a **pre-existing** test (not W5-added). W5-A's **settle-gate adds a 400ms `INJECT_SETTLE_TIMEOUT` per inject** on this test's mock PTY (the fixture never answers the DSR probe, so the bounded wait always elapses — visible in the log every run). The test observes with **FIXED sleeps** tuned pre-settle-gate (`inject_control_wedge.rs`):
- L1867 `sleep(800ms)` after event 1 (to let the 400ms commit-deadline elapse),
- L1876 `sleep(300ms)` then L1879 a **one-shot** `count_stdin_log_lines(... "type":"event")`.

The added +400ms/inject shifts event 2's binary-log-write **past the fixed 300ms window** → `events_logged` reads `1` instead of `2` (assert `L1910`).

**Not a correctness bug — a test-observation race:** in the failing runs `delivered2=true` and `inits_logged=1` (binary alive, delivered, not respawned) — ONLY the `events_logged==2` read is early. `delivered2` polls up to 5s; `events_logged` is read once after a fixed sleep. The delivery is correct; the observation window is now too tight.

## Fix direction (todlando — test-hardening, small)
1. Replace the fixed `sleep(300ms)` + one-shot `count_stdin_log_lines` with a **bounded POLL** — wait up to N s for `events_logged` to reach 2 (mirror how `delivered2` already polls). Same robustness pass on the L1867 event-1 window (account for the settle-gate latency).
2. **Confirm (not assume) it is the observation race:** with the poll in place, `events_logged` must reliably reach 2. If it ever stalls at 1 under a generous poll, that is a REAL delivery race (not observation) — escalate. Evidence says observation (delivered2 always true), but prove it.
3. Optional (cleaner): have the mock xlate fixture **answer the DSR probe** so the settle-gate returns fast in tests (no 400ms/inject), removing the perturbation at the source and speeding the whole inject suite. Your call vs the poll — either fixes it; the DSR-answer is the more principled (tests shouldn't eat the settle timeout).

Re-signal after the fix; I re-run the Win leg + `c1_miss` across N to confirm solid (Linux unaffected — test-timing only). Then bless. **Interim file-transport protocol stays binding until W5 gates.**
