---
name: a2-completion-lane
description: "REMOTE-TRUTH A-2 was ALREADY on main (e7c49e2, 2026-07-05) when doyle dispatched it 2026-07-30 — sweep main before building; completion lane = PR #130; carries the psyche_host_error substring trap + the mutate-to-prove-a-green-rig discipline."
metadata: 
  node_type: memory
  type: project
  originSessionId: c12113c5-f393-4fef-a857-44a396b8c13e
  modified: 2026-07-31T05:03:41.377Z
---

**A-2 (wake-resume leg) was already built and merged when it was dispatched to me as new work.** doyle dispatched it 2026-07-30 citing D-2 + W3 as the unblockers; recon found the whole leg on main since `e7c49e2` (2026-07-05) — `decide_resume`, `resume_woken_endpoint`, the `host_error` field, the custody guard (since hardened to an identity pair under `REQ-RESUME-CUSTODY-IDENTITY`), and `REQ-WAKE-RESUME-LEG` already activated at `impl/unit/int` with all three tracing OK. I stop-and-surfaced instead of rebuilding; doyle owned the miss ("I dispatched off the triage doc without sweeping main") and re-ruled the lane to *completion*: (a) the deferred endpoint-list render, (b) the deferred online-bind rig. Shipped as PR #130 (`build/wake-resume-leg`, `110baca` + `2a92853` off `00f3f92`).

**Why:** a triage doc records what was true when written. Deferrals inside a shipped commit body ("the real online-bind is the deferred rig leg") are the only record that a REQ can be fully tag-covered and still not prove its own promise — `traceable-reqs check` exit 0 means evidence EXISTS, never that it passes or that it proves the interesting case.

**How to apply:**
- Before building any dispatched item, sweep main for its own landing (`git log -S '<fn name>'`, `traceable-reqs trace <REQ>`). Present tags ≠ run-green: run the claimed-green tests before trusting them, and say which you did.
- **Green on first run proves nothing.** For a rig asserting existing behavior there is no red-first, so MUTATE the thing under test (I made `decide_resume` return `Skip` unconditionally), confirm it fails at the intended assertion with all preconditions still true, then revert and verify the file is byte-identical to HEAD. Ship the mutation result in the commit body. See [[instrument-soundness-guards]].
- **Substring traps in JSON omission asserts:** `psyche_host_error` has no `skip_serializing_if`, so it always serializes AND its key contains `host_error` — an unquoted `contains("host_error")` omission check passes on the sibling and proves nothing. Match the QUOTED key. Same family as [[single-source-discriminant-marker]].
- **Local perch facts don't go on the gossip DTO.** `host_error` renders on `SelfPinJson` + `LocalPerchJson` only; `EndpointRowJson` is the WAN projection, so carrying it there means a wire change or a perpetually-None field. The ruled precedent is `LocalPerchJson`'s `activity` key: local truth on local rows, remote rows OMIT rather than guess, wire carriage waits for a consumer that asks.
- **Extend, don't multiply:** `REQ-PUBLIC-ERROR-SURFACES` declares itself "the home for future sightings" — new F-1 surface sightings extend it rather than minting a sibling that would collide with declared territory. Check a candidate REQ's own charter text before minting, even when a dispatch names a mint.
- New heavy e2e = classed HEAVY in the SAME commit across all three `<HEAVY>` strings (`.github/workflows/golden.yml` ×2 + `.config/nextest.toml`); census the sites by grepping an existing heavy binary name rather than trusting the count in the comment.

**GATE PASSED 2026-07-30** — doyle's independent battery (isolated worktree + scratch target) ran 38/38 by name with no notes, including the rig's online-bind proof and the quoted-key DTO trap catch. PR #130 rides the next thin-lane batch golden alongside hertz's three lanes (teardown-oracle, authenticated-test-reapers + stacked port, unit-lane-isolation). Keep `.worktrees/a2-wake-resume` until that batch merges, then reap it.

**Disk discipline learned the hard way (same day):** a single full-workspace debug build in a scratch `CARGO_TARGET_DIR` was **52.5 GB**, and the box fell to 16.5 GB free while CI was running on it. Delete your scratch target as soon as a lane's battery is done — it is fully rebuildable at ~15 min. Do NOT touch the shared `spt-core/target` (~119 GB; live agents hold `target/debug/spt.exe` locked) or another session's scratch that was written recently — recent mtime means a possibly-live build, and only clearly-stale scratch is reclaimable.

See [[ff-wave-built]], [[sweep-dispatch-site-counts]], [[premature-closure-guards]].
