Repository navigation
feat(pr-pipeline): add an hourly sweep that re-dispatches intake triage - #8180
Conversation
The lane sweep workflow gains an hourly triage-sweep job. Each pass lists open issues with no intake-triage comment and no triage or status label, by a listed human or the lanes App, over an hour old and not born triaged, and dispatches intake-triage.yml for at most 5 with the job's own token. One bot comment per issue records the runs; after 2 that left the issue untriaged, the sweep files one needs-triage issue naming the runs and labels the original needs-triage. No App token is spent. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… section Says what the triage-sweep job selects, what it does, and which token it holds. Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
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 No security findings in the incremental change since c50206d (
The instruction-surface lens did not apply: the diff removes no standing instruction, and the register was not needed. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: c50206df1b
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
|
claude-review reviewed No findings. I read the incremental diff (c50206d..a0f3200) and the full
|
…l before filing in the triage sweep The intake dispatch now sends return_run_details: true; under API version 2022-11-28 the endpoint otherwise answers 204 with no run id, so no attempt was ever recorded. Issues intake already commented on no longer count toward the 20-issue check limit, so they cannot starve the issues behind them. Filing labels the original needs-triage before it creates the handoff issue, so a failed state write cannot file a second one on the next pass. Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
No related issue: owner-approved self-healing triage sweep
Summary
Adds an hourly
triage-sweepjob tomaintenance-audit-lane-runs.yml. It finds open issues that intake triage never reached and dispatchesintake-triage.ymlfor them, using only the job'sGITHUB_TOKEN. It spends no lanes App token.Fix
17 * * * *) runs onlytriage-sweep. The daily cron and manual runs run all four jobs. The hourly run has its own workflow concurrency group, so it never waits behind the daily audit. The job also has its own concurrency group, so two passes never overlap.triage-sweep.mjs). An issue qualifies when all of these hold:<!-- claude-lane intake-triage -->comment fromgithub-actions[bot];needs-triage,needs-human,needs-spec,agent-ready,status: *,priority: *orwork-class: *;needs-triageissue that names the issue and both runs. It then marks the state comment and labels the originalneeds-triage, and dispatches it no more.github-actions[bot]-authored issues are left out, because lane-sweep findings can quote log lines a fork controls.needs-triageand not dispatched.agent-ready. This is recorded in the script header.Tokens: the sweep uses
GITHUB_TOKENonly (actions: write,contents: read,issues: write). The dispatched intake run uses its ownGITHUB_TOKENplusCLAUDE_CODE_OAUTH_TOKEN, and its actorgithub-actions[bot](41898282) is in intake's bot list (.github/workflows/intake-triage.yml, "Compose the bot id list").API cost per pass, against the 1,000 requests an hour per repository that
GITHUB_TOKENgets:CALL_BUDGET. That covers up to 15 list pages; up to 20 candidates at 3 comment pages plus 1 run read each; 5 dispatches at 2 calls each; and 5 filings at 4 calls each.Stranding: this changes no lane runner. The broker checks a run's caller and reusable files against main only for lanes in
docs/conventions/pr-pipeline.yaml(azure-iacsrc/lanes-token-broker/src/binding.mjs,checkBinding). Those lanes are work-resolve-issue, pr-refine, pr-unblock, pr-merge and work-unblock.Verification
node --testin.github/scripts/maintenance-audit-lane-runs/: 36 pass, 0 fail. The tests were written first, and the new tests failed before the code existed.actionlint: clean.zizmor1.30.0 (offline): no findings.scripts/check-affected.sh --tests: 5 passed, 4 skipped.Basis: dispatch returns
workflow_run_idwith a 200 status (https://docs.github.com/en/rest/actions/workflows#create-a-workflow-dispatch-event).GITHUB_TOKENgets 1,000 requests an hour per repository (https://docs.github.com/en/rest/using-the-rest-api/rate-limits-for-the-rest-api). Aworkflow_dispatchsent withGITHUB_TOKENstill creates a run (https://docs.github.com/en/actions/concepts/security/github_token). The intake marker and the routing that drops the floor label come from ci-workflowsintake-triage.ymlat ff8cd36 (the comment-marker and floor steps).Related
workflow_dispatchwithissue-number)🤖 Generated with Claude Code