Context
Narrow landed-pieces close-target for PR #15060, split from #15057 per @neo-gpt's cycle-1 review RA-1: the PR must not claim to feed the #14503 type-gate disposition when it records guard-filter telemetry, not type-gate rejections. This leaf scopes the truthfully-delivered record-seam; #15057 stays open for AC3.
What this leaf covers (delivered in PR #15060)
The live per-synthesis-run record-seam for the routing contradiction guard: which computed content/narrative candidates the guard filtered, under which arming reasons (only the CURRENT_FOCUS_ROUTING_CONFLICT_REASONS that actually armed the guard — incident/prio-zero — attributed via the shared getRoutingConflictReasons authority; incidental co-reasons kept separately as candidateReasons). No exclusion-label dimension: every guard-blocked node already passed the actionability type-gate, so its exclusion set is empty by construction — that evidence belongs to the type-gate producer (AC3), not this guard-filter one.
- AC1 — a live JSONL record-seam exists (writes per synthesis run from the orchestrator daemon,
routeAttributionLedgerStore; never a git-tracked measurements/*.md).
- AC2 — guard-filtered candidates recorded with correct arming-reason attribution;
summarize/query fold byArmingReason / blockedNodeCounts; fail-open emit at the synthesis boundary (a write failure never alters synthesis output), hermetically test-isolated under UNIT_TEST_MODE (no prod .neo-ai-data write).
Out of Scope (stays on #15057 as AC3)
- The #14503 42.2% type-gate disposition: this record-seam captures the routing-contradiction guard's filtering, NOT the actionability type-gate's rejections (a different filter point). AC3 needs the actual type-gate rejections recorded at that filter (a separate producer) plus an accumulated window before the keep/narrow/rank-with-discount disposition can be decided. #15057 remains the open contract for it.
Related
Context
Narrow landed-pieces close-target for PR #15060, split from #15057 per @neo-gpt's cycle-1 review RA-1: the PR must not claim to feed the #14503 type-gate disposition when it records guard-filter telemetry, not type-gate rejections. This leaf scopes the truthfully-delivered record-seam; #15057 stays open for AC3.
What this leaf covers (delivered in PR #15060)
The live per-synthesis-run record-seam for the routing contradiction guard: which computed content/narrative candidates the guard filtered, under which arming reasons (only the
CURRENT_FOCUS_ROUTING_CONFLICT_REASONSthat actually armed the guard — incident/prio-zero — attributed via the sharedgetRoutingConflictReasonsauthority; incidental co-reasons kept separately ascandidateReasons). No exclusion-label dimension: every guard-blocked node already passed the actionability type-gate, so its exclusion set is empty by construction — that evidence belongs to the type-gate producer (AC3), not this guard-filter one.routeAttributionLedgerStore; never a git-trackedmeasurements/*.md).summarize/queryfoldbyArmingReason/blockedNodeCounts; fail-open emit at the synthesis boundary (a write failure never alters synthesis output), hermetically test-isolated underUNIT_TEST_MODE(no prod.neo-ai-datawrite).Out of Scope (stays on #15057 as AC3)
Related