---
name: gate-population-covers-consumers
description: "A wave gate's test population must cover the CONSUMERS of every changed predicate, not just the changed crates — a filtered leg that excludes the blast radius is green, true, and uninformative."
metadata: 
  node_type: memory
  type: project
  originSessionId: 520cc386-a467-49d9-b1f9-c90853dfed9b
  modified: 2026-08-23T11:05:38.538Z
---

BAROMETER W2 changed `shell_pid_provably_dead` (spt-store) to the pair test, and its gate ran `spt-daemon --lib` filtered + `spt-store --lib` — excluding every spt-crate consumer of the predicate (relink's already-online refusal, drive's drop-if-offline, activity fan-out's online filter — the KNOWN-HAZARDS 2.6 class-(a) DERIVE consumer list). All three consumers' tests were red at the wave's own gate-green sha d57bcd3; nobody saw until golden ran the full suite on the assembled head (2026-08-02, v0.52.0 first golden red).

**Why:** a leg filter scoped to the changed crates answers "does the changed code pass its own tests," never "does everything that CALLS it still hold." When docs enumerate a predicate's consumers (KH 2.6 did, by name), that list IS the minimum gate population — the discriminator question by construction.

**How to apply:** when a wave changes a shared predicate/contract, (1) grep the workspace for its callers before choosing gate legs; (2) any documented consumer list (KNOWN-HAZARDS class rows, "callers that must not derive" site lists) becomes legs; (3) a green from a population that excludes the blast radius is declared as such in the gate record, never summarized as "all legs green." Related: [[discriminator-question]], [[liveness-aware-derivation-fixture-ripple]], [[cross-wave-claims-need-the-assembled-head]].

**RECURRED ON THE GATER 2026-08-23 (#212 golden red), retention-behavior face:** #208 changed
WHICH SPOOL ROWS SURVIVE A SESSION OPEN (undelivered briefing rows swept). I measured its
blast radius over the NEIGHBOR LANE'S cells (#177's, amended one) and declared "exactly one
cell" — but the population for a retention change is every test whose ASSERTIONS DEPEND ON A
ROW SURVIVING that boundary, and `er_briefing_presented_e2e`'s clause-4 arm (a Phase-B-depth
acceptance cell, never run at the wave gate) pinned a swept row's identity across it. Deployah
caught that the never-executed list's nearest entry reasoned "delivered rows unaffected" —
true, and silent about the undelivered cousins. The census question is not "which tests did
the adjacent lane fix" but "which tests CONSUME the contract this lane changed" — grep for
readers of the swept/retained artifact, not for the neighbor's amendments.
