Repository navigation
fix(ci): reopen a monitor's closed issue for its key instead of filing a recurrence - #8786
Conversation
…g a recurrence The monitoring lane, the lane sweep's filer and the upstream drift filer now reopen the closed issue they already hold for a key when the signal comes back, so each recurring signal lives on one issue. A close as not planned or duplicate mutes the key; reopens do not count against the new-issue cap, and no age window applies. - maintenance-monitor-signals: planIssues gains a reopen list; writePlan comments with the new evidence, then PATCHes state open, state_reason reopened and the body with the refreshed marker. The summary counts reopens. The "Recurrence of" line is gone. - maintenance-audit-lane-runs: planFiling reopens instead of filing with regressionOf; writeAll comments with the checked claims, then PATCHes the state. The fingerprint marker cannot change, so the body is kept. - upstream-drift-issues.sh: one paginated REST list of the bot's issues in every state replaces both title searches; a closed issue is reopened and its body replaced. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DZUxjJX2Sbu4ASZUPcwC3M
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DZUxjJX2Sbu4ASZUPcwC3M
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DZUxjJX2Sbu4ASZUPcwC3M
upstream-drift is not in fragment mode, so the fragment check rejects it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DZUxjJX2Sbu4ASZUPcwC3M
…ndary Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DZUxjJX2Sbu4ASZUPcwC3M
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 Security review (incremental, 832dc79..799f767): no security findings. The four changed files are
I did not consult the instruction exception register, because nothing in this diff removes or softens an instruction. |
|
claude-review reviewed No findings. I reviewed the incremental diff since 832dc79 (the four files listed) and read The change moves the reopen PATCH to the end of the sequence in both In
One minor behavior I noted but did not report: while the failure persists, each retry posts another evidence or reopen comment before it fails again. The earlier ordering already had this property for a failed PATCH, so I did not count it as a finding. No closing issue is declared: the PR uses |
… reopened issue upstream-drift-issues.sh now ignores a github-actions[bot] issue whose body carries the monitoring lane's first-line marker or the lane sweep's last-line marker, in both the title lookup and the close-unreported sweep. A reopen in the monitoring lane and the lane sweep re-adds the filing labels that exist and removes agent-ready, taking a 404 as already gone, 1 s apart like the other writes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DZUxjJX2Sbu4ASZUPcwC3M
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DZUxjJX2Sbu4ASZUPcwC3M
…abel call retries Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DZUxjJX2Sbu4ASZUPcwC3M
Refs: #8701
Summary
Bot monitors reopen the existing issue for their key when a signal comes back, instead of filing a new "Recurrence of" or "Regression of" issue. Each recurring signal then lives on one issue, and the open-issue count stops growing with repeats. Duplicates seen on 2026-10-20: #8641 → #8701 and #8643 → #8702 (main-red), #8557 → #8644 (merge-queue). This is the owner-approved backlog lever (b), which GitHub Support assigned to Automation Lanes.
Fix
maintenance-monitor-signals:planIssues(issues.mjs) gains areopenlist. A closed match is reopened unless it was closed asnot_plannedorduplicate(both mute the key;duplicateis new) or it is closed-unchanged (same fingerprint, observed no later than the close). Reopens don't count againstMAX_NEW_ISSUES, and there is no age window.writePlan(monitor.mjs) posts the evidence comment, then one PATCH withstate: open,state_reason: reopenedand the refreshed marker, the same two calls as an update. The run summary lists reopened issues.maintenance-audit-lane-runs: the same rule inplanFiling(findings.mjs) andfile-findings.mjs. The 14-day regression window is removed. The reopen PATCH leaves the body as is, because this lane's marker is the fingerprint and can't change on a match.scripts/upstream-drift-issues.sh: looks up its issue by exact title over open and closed issues through the REST issues list (creator=github-actions[bot],state=all), not the search API, and reopens a closed one. One paginated read now serves both the lookup and the close-unreported sweep. A failed read now stops the run with exit 1, where it used to skip only the affected repo.docs/conventions/pr-pipeline/README.mdanddocs/conventions/upstream-drift/README.mddescribe the reopen; there is a pr-pipeline fragment.post-merge-demotion-alert.yml. Its per-(signal, SHA) records are what the demotion gate reads, and a repeat of the same key already reopens there.Basis: Update an issue:
state_reason"Can be one of:completed,not_planned,duplicate,reopened,null". List repository issues:state"Can be one of:open,closed,all", andcreator. Search allows "up to 30 requests per minute" and can returnincomplete_results, which is why the drift lookup leaves it.Verification
node --testover every*.test.mjsin both script directories: 110 pass, 0 fail (run main-side, outside the worker).bash scripts/upstream-drift-issues.test.sh: PASS=114 FAIL=0.closed_atskips;not_plannedandduplicatemute; no match files; reopens don't consume the new-issue cap; the executor comments, then PATCHes withstate_reason: reopened.git grepforrecurrenceOf,regressionOf, "Recurrence of" and "Regression of" returns nothing.Related
🤖 Generated with Claude Code
https://claude.ai/code/session_01DZUxjJX2Sbu4ASZUPcwC3M