---
name: shared-seam-change-run-all-seam-tests
description: "Gating lesson: a behavior change to a SHARED runtime seam can break SIBLING tests that exercise it — targeted preflight on only the new tests misses them. Grep + run ALL tests touching the seam before declaring green."
metadata: 
  node_type: memory
  type: feedback
  originSessionId: 8350d43e-fe2d-4e24-9999-eecbcc6d3a50
  modified: 2026-07-22T05:25:54.258Z
---

When a change alters a SHARED runtime seam, the new/changed tests passing is NOT enough — a SIBLING test exercising the same seam with a different fixture can silently break, and a targeted preflight (only the new tests + the obviously-related E2Es) won't catch it. CI runs the FULL suite and will.

**Why:** v0.8.2 F-010 added a Psyche residency check inside the daemon's continuous reconcile (`confirm_residency_or_unhost`). The new E2Es (bootrace/nonresident) were green, but a SIBLING — `spt-daemon/tests/daemon_lifecycle_real_brain.rs` — ran the SAME continuous `run_brain` reconcile with a NOOP **fast-exit** psyche (`cmd /C rem`/`true`), which post-change is now a *Failed* host → pulse driver torn down → its commune-ingest assert timed out. Targeted preflight ran the livehost E2Es but not that spt-daemon sibling → CI caught it (1 failed/1112, Windows; Linux won the race). Cost: a full gate round-trip + re-gate.

**How to apply:** before declaring a seam-touching change green —
1. `grep` for ALL tests that exercise the seam, not just the ones you wrote. For a daemon-reconcile/psyche change: `run_brain(` · `spawn_live_host` · real `daemon run` · `psyche_init` fixtures. For a template/spawn change: the spawn callers. For a wire/schema change: every encoder/decoder test.
2. Run that whole set locally (or the full crate suite if bounded) — not only the new tests.
3. Watch for fixtures that were innocuous before but now hit the new code path (e.g. a fast-exit/NOOP fixture under a new residency/liveness rule).

**RECURRED 2026-07-22 (deployah, v0.40.0 OBS rider preflight).** The rider wrapped `resolve_subscribe` → `resolve_subscribe_inner` in broker.rs (always-on `eprintln!` breadcrumb on every subscribe decision, incl. the TAKE path). My preflight seam set was **hand-listed from memory** — broker / controller_lease / redispatch(+stall) / resize_* / rc_attach_truth — all green, 35/35. The gate then went red on `spt-daemon/tests/brain_decouple.rs` `suspended_brain_controller_is_stall_evicted_take_completes_viewer_ticks`, a sibling that drives the same subscribe/take seam. Not in my list because I recalled suite names instead of deriving them.

⭐ **Mechanism (do this instead of remembering a list):** derive the seam set from the CHANGED SYMBOL, not from recall — `grep -rl '<changed_fn>' crates/*/tests/ crates/*/src/` plus the callers of the functions it wraps, and run every test binary that hits. For a `resolve_subscribe` change that grep yields brain_decouple immediately. A hand-listed seam set silently goes stale as siblings are added; a grep-derived one cannot. Same failure shape as the original entry, second payment.

Test-analog of [[ci-clippy-preflight-workspace]] (a `-p <crate>` clippy misses sibling-crate lints; a targeted test run misses sibling-seam tests). Same fix posture: pre-flight the BROAD surface the change actually touches. See [[v082-templating-residency]] for the concrete case.
