<!-- last-reviewed: do not apply expiry — knowledge entries are dated records (governance = supersession, not expiry; see knowledge-management.md §5) -->
The reconciler fan-in blind spot: a declared sink reconciles GREEN with zero producers
- Date: 2026-06-01 · By: Operations (Process Engineer)
- Topic: reconciler-fan-in-blind-spot
- Status: active
Append-only, dated, one topic per entry. Captured first (inbox); a “Next time” bullet is promoted into SOP-078 + the Operations charter risk register, and a CI complement is proposed (see Promotion).
What we learned
The Handoff Register reconciler (scripts/handoff-reconcile.mjs) treats a fan-in
sink as always-satisfied, so a sink can read GREEN with zero producers — a real
dropped-handoff failure the gate is supposed to catch.
-
What a fan-in sink is. A consumer declares an input with a placeholder producer for a trigger — e.g. the Archivist’s
approved document ← from <authoring agent/unit> · "artifact approved". The reconciler records this as a sink keyedowner|trigger(scripts/handoff-reconcile.mjs:249-252). The sink “absorbs” every producer that emits that trigger to that consumer, so a shared trigger into the sink is not flagged as OVERLAP (spec §3.1.1 R1). -
The blind spot, exactly. When the reconciler matches an output to a sink it checks only
sinks.has(\${consumer.id}|${e.trigger}`)(scripts/handoff-reconcile.mjs:320) — a set-membership test. When it walks **inputs**, a placeholder-producer input is skipped as "a declared sink, not dangling" (scripts/handoff-reconcile.mjs:351). **Neither path asserts the sink has ≥1 producer.** So a sink whose producers all vanish — renamed, deleted, or never authored — stays GREEN. The exact failing case: an Interface Contract declaresX ← from <…> · “T”(a sink) but **no** block anywhere emits→ X · “T”. The reconciler reports the sink as clean and the headline metric readsGREEN — 0 unmatched edges`, even though nobody is feeding the sink. -
Why a point-to-point edge does not have this hole. A named-consumer input (
← from Archivist · "manifest verified", the SRE seam) is matched against a real producer output (scripts/handoff-reconcile.mjs:371-379); if the producer is absent and authored, it readsGAP — dangling dependency. The hole is specific to the placeholder (<…>) sink form, which is the very form that makes fan-in convenient. -
The dead end to avoid. The tempting “fix” is to rebuild the reconciler to require every sink to have a producer. That is the wrong move right now: it risks regressing the Wave-1 partial-register semantics (R1–R5) that let a partial register reconcile clean for a wave’s edges (a not-yet-authored producer is correctly pending, not a gap). A sink with zero producers because its producers are in a later wave is legitimate; a sink with zero producers after all its waves have landed is the defect. The reconciler alone cannot tell those apart mid-rollout, so the right instrument is a separate, Phase-2 CI complement — not a change to the gate’s per-wave logic.
Why it matters
The whole program’s “done” leans on one number — 0 unmatched edges (master plan §10) —
as proof of seamless handoffs. If a sink can be GREEN while orphaned, the headline metric
over-reports integrity: it proves “no mismatched edges” but not “every declared sink is
actually fed.” Q&R flagged exactly this. GREEN is necessary, not sufficient; treating it
as sufficient is how a real dropped handoff ships behind a green gate.
Next time
- Read GREEN as necessary, not sufficient — at Phase-2 close, separately confirm every declared fan-in sink has ≥1 matched producer in the fully-authored register.
- Do not rebuild the reconciler to enforce this per-wave; it would break the legitimate pending-producer case (R3). Add a complement instead.
- Proposed CI complement (Phase 2): a check that, over the full register, asserts each
declared sink (
owner|triggerwith a placeholder producer) has ≥1 matched producer edge; emitWARNwhile waves are partial andFAILonce all of a sink’s producer waves have landed. Wire it via SOP-079 (do not edit.github/this wave — propose it).
Promotion
- Promoted to:
docs/sop/SOP-078-handoff-reconciliation.md(Guardrails — “GREEN is necessary, not sufficient; the fan-in blind spot”) anddocs/units/operations/charter.md(Risks, OR-1). The CI complement is proposed, not yet built — tracked as a Phase-0 recommendation (R1) and a cross-cutting flag to Q&R. - Supersedes / superseded by: none. (Builds on the reconciler semantics in
interface-contract-spec.md§3.1.1; this entry adds the zero-producer hazard those rules do not close.)