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
orb(breaker): #9086's review_nag breaker coverage is inert — both nag close sites skip the breaker entirely, and each close is scored as a merge misprediction #9132
#9086 added review_nag to CONTENT_INSPECTION_CLOSE_KINDS so the precision breaker would cover it.
That fix is inert: neither review-nag close site ever reaches downgradeCloseToHold, and neither
records a gate decision — which additionally poisons the repo's merge-precision statistics.
reviewNagMatch is set at exactly two sites — src/queue/processors.ts:13864 and :14058. Both plan
their close and call executeAgentMaintenanceActions directly. Neither calls applyPrecisionBreakers
(the only site is processors.ts:3322, plus agent-approval-queue.ts:353), and neither calls recordNativeGateDecision.
So #9115's addition at src/settings/agent-actions.ts:625-628 is never consulted on the only path that
produces a review_nag close.
The second-order damage
Because no gate_decision row is written, queryRuleGateCells's gd JOIN po
(src/review/rule-gate-eval.ts:120) pairs the review-nag pr_outcome: "closed" against whatever the
PR's last quality verdict was. A green PR whose author pinged too often scores as pred=merge, truth=closed → mergeFalse (rule-gate-eval.ts:146).
Every review-nag close therefore counts as a merge misprediction, dragging repo merge precision
toward the holdonly floor and eventually suppressing legitimate auto-merges repo-wide. This is #8825's
exact bug, whose policy_close:${closeKind} fix landed only at processors.ts:3396.
Trigger
A contributor exceeds reviewNagMaxPings on a PR that last gated merge.
Each such close silently degrades the repo's merge precision, so an unrelated correctness metric
punishes the whole repo for one contributor's ping frequency.
Dedup
#9086 is CLOSED and its fix is provably inert on this path (the breaker never runs). #8825 fixed
the reason-code recording at the main disposition site only. Reporting as an incomplete fix rather than a
new defect, because the fix as merged cannot have the effect its issue claims.
Requirements
Route both review-nag close sites through the same sequence the main disposition path uses: applyPrecisionBreakers → maybeApplyCloseAuditHoldout → recordNativeGateDecision(reasonCode: "policy_close:review_nag") → buildDecisionRecord/persistDecisionRecord. Extract processors.ts:3322-3410 into a shared helper rather than duplicating it.
Audit the other executeAgentMaintenanceActions call sites for the same omission — there are seven
total and only processors.ts:3585 is preceded by the full sequence.
Add an invariant test: every executed close produces a gate decision row with a reason code naming
its close kind.
Test Coverage Requirements
99%+ patch coverage, branch-counted. Regression test proving a review-nag close is breaker-eligible and
records policy_close:review_nag.
Problem
#9086 added
review_nagtoCONTENT_INSPECTION_CLOSE_KINDSso the precision breaker would cover it.That fix is inert: neither review-nag close site ever reaches
downgradeCloseToHold, and neitherrecords a gate decision — which additionally poisons the repo's merge-precision statistics.
reviewNagMatchis set at exactly two sites —src/queue/processors.ts:13864and:14058. Both plantheir close and call
executeAgentMaintenanceActionsdirectly. Neither callsapplyPrecisionBreakers(the only site is
processors.ts:3322, plusagent-approval-queue.ts:353), and neither callsrecordNativeGateDecision.So #9115's addition at
src/settings/agent-actions.ts:625-628is never consulted on the only path thatproduces a
review_nagclose.The second-order damage
Because no
gate_decisionrow is written,queryRuleGateCells'sgd JOIN po(
src/review/rule-gate-eval.ts:120) pairs the review-nagpr_outcome: "closed"against whatever thePR's last quality verdict was. A green PR whose author pinged too often scores as
pred=merge, truth=closed→mergeFalse(rule-gate-eval.ts:146).Every review-nag close therefore counts as a merge misprediction, dragging repo merge precision
toward the
holdonlyfloor and eventually suppressing legitimate auto-merges repo-wide. This is #8825'sexact bug, whose
policy_close:${closeKind}fix landed only atprocessors.ts:3396.Trigger
A contributor exceeds
reviewNagMaxPingson a PR that last gatedmerge.Impact
they are — the exact control orb(gate): the six anti-abuse close paths are all exempt from the precision breaker AND from live recheck #9086 was filed to restore.
punishes the whole repo for one contributor's ping frequency.
Dedup
#9086 is CLOSED and its fix is provably inert on this path (the breaker never runs). #8825 fixed
the reason-code recording at the main disposition site only. Reporting as an incomplete fix rather than a
new defect, because the fix as merged cannot have the effect its issue claims.
Requirements
applyPrecisionBreakers→maybeApplyCloseAuditHoldout→recordNativeGateDecision(reasonCode: "policy_close:review_nag")→buildDecisionRecord/persistDecisionRecord. Extractprocessors.ts:3322-3410into a shared helper rather than duplicating it.executeAgentMaintenanceActionscall sites for the same omission — there are seventotal and only
processors.ts:3585is preceded by the full sequence.closeproduces a gate decision row with a reason code namingits close kind.
Test Coverage Requirements
99%+ patch coverage, branch-counted. Regression test proving a review-nag close is breaker-eligible and
records
policy_close:review_nag.Links & Resources
src/queue/processors.ts~3322-3410, ~3585, ~13854-13905, ~14048-14090;src/settings/agent-actions.ts~625-628;src/review/rule-gate-eval.ts~120, ~146maintainer-only — breaker coverage and calibration integrity.