Skip to content

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

Description

@JSONbored

Problem

#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=closedmergeFalse (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.

Impact

  1. The per-rule and project close breakers can never engage for review-nag closes, no matter how wrong
    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.
  2. 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:
    applyPrecisionBreakersmaybeApplyCloseAuditHoldoutrecordNativeGateDecision(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.

Links & Resources

maintainer-only — breaker coverage and calibration integrity.

Metadata

Metadata

Assignees

Labels

maintainer-onlyOwner-only work — yields no Gittensor points.

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions