Repository navigation
fix(source-control): bind a review re-run after a credential or credit failure - #10142
Conversation
…t failure A review lane's second attempt bound only after a usage or publish rate limit, so a re-run after a rejected Claude credential (failure-class=auth) or a spent key (credit-stop) stayed rerun-not-allowed and held the pull request. Attempt 1 left no verdict in those cases too, so the re-run cannot trade one review for another. rerun_binds adds them for binding only; the merge gate's automatic re-run still keys on rate_limited, so it cannot spend the one attempt before the secret or credit is fixed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Held for the owner: this widens which re-run review attempts count as merge evidence (auth and credit-stop failures join rate limits), so it waits for the owner's explicit decision (Q-REBIND in the poteto session) before merging. |
|
Decision recorded. The owner answered Q-REBIND in the poteto session (2026-10-26, "go with whatever the facts/data/metrics + /discovery:research says and ensure we're aligned with SOLID, DRY/SSOT principles"): option A. A review lane's second attempt binds after the first failed on a rejected credential ( |
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
|
claude-security-review reviewed Incremental security review of the changes since 53195ce (changelog fragment,
critical-findings: 0 |
|
claude-review reviewed Incremental review of the changes since 53195ce: no findings. I read the incremental diff and checked it against the head file,
No manifest files changed and there is no closing issue. The PR body says "No related issue", so no acceptance criteria apply. No trusted-path files were touched and nothing needs a hold. |
A rerun now binds after attempt 1 failed only when a failure-level annotation opens with `<lane>: failure-class=auth: `, matched like the publish rate-limit line, so `class=auth-x`, a quoted class in detail text, another lane's line, or publish.cjs's warning-level `<lane> key: class=auth` cannot bind. credit-stop is dropped: publish.cjs reports a spent key as rate-limit, which already binds. rate_limited and rerun_binds share one failure-annotation scan. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
No related issue: review re-runs after the 2026-10-25 credential outages stayed rerun-not-allowed
Summary
During today's two Claude credential outages (20:41-20:47Z and 22:44-23:09Z), review runs that failed with
failure-class=authwere re-run once the secret was fixed. The review-evidence binder accepted a second attempt only when the first failed on a rate limit, so every such attempt 2 was refused asrerun-not-allowed. One PR was escalated to needs-human (evidence-unbound ... rerun-not-allowed), and another holds only attempt-2 reviews that never bind.Fix
babysit_review_evidence.pyaddsAUTH_FAILURE_REandrerun_binds(lane, job). Attempt 2 binds when attempt 1 failed on a rate limit, or when a failure-level annotation opens with the lane's own publish-review line<lane>: failure-class=auth:(ci-workflowspublish.cjsfail). The match is anchored and lane-checked the way the publish rate-limit line is, soclass=auth-x, a class quoted in detail text, another lane's line, or the warning-level<lane> key: class=authcannot bind._bound_recordnow usesrerun_binds.publish.cjsjudge()reports a keycredit-stopasfailure-class=rate-limit, which already binds, andcredit-stopis not in itsCLASSES.rate_limitedandrerun_bindsshare one failure-annotation scan.rate_limited, so the gate never reruns an auth failure itself: a rerun before the secret is fixed would spend the one allowed attempt.reference/safety.mdstates the new binding rule; a changelog fragment records the fix.Verification
test_second_attempt_after_a_credential_failurefailed before the fix and passes after it. The three subtests oftest_an_auth_lookalike_does_not_bind(auth-x, a quoted class, another lane) failed against the first, unanchored version and pass now.test_a_warning_level_auth_does_not_bind(a warning-level auth line plus a realfailure-class=timeoutfailure staysrerun-not-allowed) fails with theannotation_level == "failure"guard removed and passes with it.test_a_credential_failure_is_not_a_rate_limit(auth is not a rate limit, so the gate does not rerun it) passes before and after.run-ruff.shcheck passes.Related
🤖 Generated with Claude Code