---
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-02T14:08:06.625Z
---

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]].
