# LIFECYCLE-TRUTH W5 — GATE VERDICT: **PASS** (doyle, 2026-07-07)

**Wave head `a97efd5`** (branch `lifecycle-truth`; code head `f4cec33`, gate-hold fix `a97efd5`). Delivery integrity — all three REQs built + gated after one hold-and-fix cycle.

| REQ | stages |
|-----|--------|
| REQ-SPOOL-TAKE-AUDIT | impl+unit |
| REQ-IDLE-PARKED-DELIVERY | impl+unit+int |
| REQ-INJECT-MULTILINE-INTEGRITY | impl+unit+int |

## Ruling-check on the two premise refinements — BOTH ACCEPTED
1. **Echo-verify → declared capability (`SPT_INJECT_VERIFY_ECHO`), default OFF** (was framed MUST-unconditional). Accepted: universal echo-verify is infeasible — a raw-mode TUI does not echo a benign control probe, ConPTY does not surface a programmatic inject's cooked echo, and incidental output false-reads head-loss (it concretely regressed `wan_arrival_...`). The load-bearing fix is **Layer-1 settle-gate, which ships UNCONDITIONAL** and is a **real DSR readiness probe** (`ESC[6n`, waits for the ring high-water to advance — verified positive-signal, not a blind timer; bounded 400ms). Echo-verify is a principled belt for echo-observable harnesses, gated exactly like bracketed-paste. (Follow-up: wire the capability for CC via the manifest in W6/adapter — CC's TUI re-renders typed text — not a W5 blocker.)
2. **Bracketed-paste deferred; chunked-under-settle ships** (was SHOULD). Accepted: the translation binary owns the `{key}`/`{text}` choreography (a paste wrap belongs there, not a core transform) and F-019 already found bracketed-paste moot for CC submit. Chunked-write-under-settle is the ruling's named fallback and the loop-N int proves it byte-complete.

## Gate legs — both green (@a97efd5)
- **Windows (isolated worktree):** clippy 0, xtask OK (after scoped sweep), traceable 0, nextest **1706/1706**; **c1_miss hammer 0/15**.
- **Linux (kitsubito):** nextest **1694/1694** (incl. forkpty-HARD `HEADSTART`/`TAILEND` byte-receipt); inject suite 19/19; **c1_miss 0/8**.

## Hold-and-fix cycle (recorded)
Initial Win gate at `28df069` surfaced `inject_control_wedge::c1_miss` flaking **~17% ISOLATED** (2/12) — not flake-ledgerable (fails without load), on the W5-A-touched seam. **HOLD** issued (`docs/W5-GATE-HOLD.md`). Root: a **test-observation race**, not a delivery bug — the settle-gate's legitimate +400ms/inject (the mock PTY never answers the DSR probe) shifted event-2's binary-log-write past the pre-existing test's **fixed `sleep(300ms)` + one-shot read** (`events_logged` read 1 not 2); `delivered2=true` in every failing run confirmed delivery was correct. **Fix `a97efd5` (test-only, no prod change):** the wedge harness shrinks `SPT_INJECT_SETTLE_MS=80` suite-wide (presence is the invariant), and `c1_miss` reads `events_logged` via a **bounded poll** (as `delivered2` already does). Prod code byte-identical to the fully-gated `28df069`. Re-gate confirms solid on both platforms.

## Diff review (faithful)
- **INJECT-MULTILINE-INTEGRITY**: 3-layer per ruling A (as amended) — Layer-1 settle-gate (unconditional DSR probe), Layer-2 echo-verify→re-drive→loud-spool (capability default-off), Layer-3 chunked-under-settle. `run_inject_worker` refactor preserves all C-1 choreography (miss-tolerance, floor order, poison recovery). RED-first units + the loop-N byte-complete int + the forced-echo-miss→re-drive→loud-spool int.
- **IDLE-PARKED-DELIVERY**: shared `drain_idle_spool`; send-time inject for already-idle + pulse-tick sweep belt (ruling B = both). Real-broker int (parked row drains, stamped `idle-inject`).
- **SPOOL-TAKE-AUDIT**: additive nullable taker columns stamped in the delivered=1 UPDATE; `spt spool-audit --json`; four legs wired. No schema break.

## Verdict
**W5 GATED PASS.** LIFECYCLE-TRUTH **W1–W5 all gated** (all code waves complete). **The interim file-transport / sub-400B protocol can now be RETIRED** once the daemon carrying this fix is live (post-swap). Remaining: **W6 (docs wave)** then release counter 49 via deployah + the W1 field-accept swap window (operator-coordinated).
