You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Parent: #8757; feeds everything in #8082. recordConfiguredGateBlockerSignals (src/rules/advisory.ts:1125-1172) and isConfiguredGateBlocker (:1019-1092) only record a RuleFiredEvent when the finding's own gate mode resolved to "block" — but every gate defaults to advisory or off (linkedIssue :1023, aiReview :1034, manifestPolicy :1057, linkedIssueSatisfaction :1075, contentLaneDeliverable :1080, backtestRegression :1083, lockfileIntegrity :1087, cla :1090). Result: the majority of real traffic (advisory findings a human actually saw) records NOTHING, so every backtest corpus, reliability curve, and knob-loosening decision is built from the biased block-mode-only minority. The pattern to generalize already exists: recordGateScoreSignals records quality_gate_score whenever mode !== "off" (:1216), not only "block".
Requirements
Record a RuleFiredEvent for every configured-blocker-class finding whenever its gate mode !== "off", with metadata.gateMode = the resolved mode ("block" | "advisory") so downstream consumers can segment.
Downstream consumers that assume corpus == block-mode-only (backtest corpus builder, precision computations, knob evaluators) must either segment by gateMode or be explicitly audited as mode-agnostic; document the decision per consumer in the PR.
Additive only: no rewriting/migrating existing recorded events.
Deliverables
The recording change with mode tagging.
The per-consumer segmentation audit (in-PR write-up) + any needed consumer filters.
Tests: advisory-mode finding records with gateMode tag; off-mode records nothing; block-mode unchanged.
Test Coverage Requirements
99%+ patch coverage, branch-counted.
Boundaries
No gate-behavior change — this is observation only. Volume note: audit_events write rate rises; keep the existing best-effort .catch(() => undefined) write posture.
Context
Parent: #8757; feeds everything in #8082. recordConfiguredGateBlockerSignals (src/rules/advisory.ts:1125-1172) and isConfiguredGateBlocker (:1019-1092) only record a RuleFiredEvent when the finding's own gate mode resolved to "block" — but every gate defaults to advisory or off (linkedIssue :1023, aiReview :1034, manifestPolicy :1057, linkedIssueSatisfaction :1075, contentLaneDeliverable :1080, backtestRegression :1083, lockfileIntegrity :1087, cla :1090). Result: the majority of real traffic (advisory findings a human actually saw) records NOTHING, so every backtest corpus, reliability curve, and knob-loosening decision is built from the biased block-mode-only minority. The pattern to generalize already exists: recordGateScoreSignals records quality_gate_score whenever mode !== "off" (:1216), not only "block".
Requirements
Deliverables
Test Coverage Requirements
99%+ patch coverage, branch-counted.
Boundaries
No gate-behavior change — this is observation only. Volume note: audit_events write rate rises; keep the existing best-effort .catch(() => undefined) write posture.