GATE — CONDUIT W3 (releases#234), head `0d8363d7`: **PASS, one doc sentence to turn before head assembly.**

Isolated worktree `.worktrees/gate-pr173`, main pool claimed by the lane tree. Verdicts read from each leg's own `.exit` file content:

| Leg | Verdict |
| --- | --- |
| `traceable-reqs check` | exit 0 (both new REQs at full required coverage) |
| `nextest -p spt-store -E 'test(/iolog/)'` | exit 0, 6/6 |
| `nextest -p spt` ioevents units | exit 0, 7/7 |
| `nextest -p spt -E 'binary(io_events_poll_e2e)'` | exit 0, **1/1 in 2.361s** — real-daemon run, not a skip |
| `cargo clippy -p spt -p spt-store -p spt-daemon --all-targets` | exit 0 |
| `cargo run -p xtask -- check` | exit 0, `xtask check: OK` |

Two environment notes, named: (1) first leg pass died `no space on device` mid-`spt` link — main pool had bloated to a measured **142.9 GB** (deps 111.1 + incremental 30.4); dropping the incremental cache reclaimed 30 GB (19.7 → 49.7 free) and the reruns went green with `CARGO_INCREMENTAL=0`. Zero code signal, diff never implicated. (2) My first unit-leg filter (`test(/io_event/)`) silently excluded the e2e — its test fn name carries no matching token; caught by reading the PASS list, re-run by `binary()`. Filter craft, not a defect of the lane.

## The three decisions beyond the proposal — all three RULED IN
1. **Auth on the verb: APPROVED.** The gate follows the content and the content is verbatim payloads — `api poll`'s class exactly. now-signal staying ungated over derived summaries is the right boundary, and the REQ title records the distinction so it survives us.
2. **One `--session-id` flag: APPROVED.** One identity, one flag; the named `IO_EVENTS_NO_CURSOR` refusal instead of an empty answer is the correct polarity. Your own e2e reddening on the gate and surfacing the collapse is the process working.
3. **Cursor clears ignored rows: APPROVED.** The capped/uncapped asymmetry in `Scan::cursor` is correct and correctly documented — last row HANDED OVER when capped, last row EXAMINED when not. This is the forward-compat path the ignore-posture needs to not become a slow leak.

Source verification beyond the legs: `gated(...)` genuinely wraps the verb (api/mod.rs dispatch); cursor file keyed session+owner (the shared-cursor swallow named and avoided); seed asserted beside non-empty-second AND `--after 0` history recovery in the e2e (the non-vacuity the REQ demands); TOOL_USE stays unemitted with the deployah/operator routing recorded in the Avoid line; retention premise stated at `IO_LOG_MAX_ROWS` for releases#238 to re-derive, exactly per the scope ruling.

## MUST-FIX before head assembly (doc-only, in-lane)
The refusal sentence is INVERTED on both surfaces that carry it: "**Neither one is refused by name** (`IO_EVENTS_NO_CURSOR`, exit 2)…" — as written it says no refusal happens; the contract is "a poll carrying **neither** is refused by name." Sites: `docs-site/src/harness-contract/api.md` (the new §io-events) and `CONTEXT.md` (the poll-verb paragraph). This is the sentence perri builds the refusal handling from, on a page that is otherwise the reference for it. Turn the sentence, re-run `xtask check`, push to this branch — no re-gate needed beyond that leg.

Verdict: wave gate PASS conditional on that one sentence. Rides the CONDUIT golden head with W1+W2 (ADR-0050) — not merged here.

Co-authored by: doyle