Repository navigation
fix(ci): re-dispatch a pr-unblock activity the broker refused as workflow-modified - #13123
Conversation
…flow-modified An address-feedback round in flight when a lane workflow file changes on main gets its push or reply token refused as workflow-modified, a re-run keeps the old file, and the head's check runs then hold it. pr-merge's refire-refused answered with an empty commit on its schedule, which restarts both review lanes before any new round, and #13048 was dispatched by hand before that pass came. The half-hourly tick's feedback sweep now sends such a round again first: a fresh attempt-1 dispatch on main's files at the same head, with the head's newest review run as the upstream, as every sweep dispatch. It acts once per refused run (only the newest run of the activity for the PR counts), only when the refused run posted a check on the current head within FAILED_RUN_WINDOW_HOURS, and under SWEEP_HEAD_CAP rounds at that head. Check runs started before the refused run ended stop counting. The refusal is read by refire-refused's tokenRefusal, now exported, and refire-refused leaves address-feedback's workflow-modified runs to the sweep. The dispatched-run record names the refused run in refire_of_run_id. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…-workflow-modified # Conflicts: # .github/scripts/pr-unblock/feedback-dispatch.mjs # .github/workflows/pr-feedback-dispatch.yml
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: PR #13123I found no security issues. I read all 7 changed files in full in the diff. These trusted-path files got the extra scrutiny: What I checked
Spend: a refused address-feedback round is now re-dispatched, which spends model usage on extra lane runs. It is capped at critical-findings: 0 |
|
claude-review reviewed Code review: PR #13123, re-dispatch an address-feedback round the broker refused as workflow-modifiedResult: no blocking or advisory findings. I read every hunk of all 7 changed files, and I read the surrounding code in What I checked
Not verified by me: the author's test counts (226/226 and 201/201), the hand run of the record-step bash, and the claim that the broker reads the dispatched-run record by name only. I had no shell, so these are the author's claims. The PR's own Risk section names these remaining gaps:
Spend (prepaid, not a hold):
Other checks
|
No related issue: hub ledger L250; an address-feedback round the broker refused as workflow-modified, because pr-unblock.yml changed on main mid-run, waited for a hand re-dispatch (#13048 after #13074).
Summary
A pr-unblock run in flight when a change to
.github/workflows/pr-unblock.ymlmerges is refused by the token broker withlane-token-denied: ... workflow-modified: .github/workflows/pr-unblock.yml differs from refs/heads/main. For resolve-conflicts,refire-refused.mjsalready recovers it: on #13027 it posted its marker at 04:54Z and pushed an empty commit, and the next dispatcher tick sent the new head. For address-feedback (and its apply-feedback-patch and publish-feedback jobs) nothing recovered it. On #13048, refused run 41772051393 (04:56Z) sat until someone re-dispatched round 41776369074 by hand. An empty commit is the wrong cure there, since it restarts both review lanes before any new round.Fix
feedback-dispatch.mjs: a newsweepRefusedpass, first in the tick sweep's decide-then-send loop. It re-dispatches an address-feedback round only when that round's newest run on the PR meets all of these:FAILED_RUN_WINDOW_HOURS(2 h);postingRunIdto a check on the PR's current head;refire-refused's now-exportedtokenRefusalclassifies as workflow-modified on a lane file.The re-dispatch, or any later run, ends it, so each refused run is sent exactly once. A head that already has
SWEEP_HEAD_CAP(3) rounds is skipped.refire-refused.mjs:dispatcherRefires: ["address-feedback"]leaves those runs to the sweep, so each activity has one retry path. resolve-conflicts keeps the empty-commit path.Trust: the re-dispatch is the tick's own attempt-1 dispatcher run, with its
pr-feedback-dispatched-<upstream>-<run>record, the route every sweep send takes (check-trusted-trigger.mjs:805-881). No broker, trust-list or permission change.Telemetry: each dispatched-run record gains
refire_of_run_id, fed by newrefire-of[-N]step outputs in all five record steps (pr-feedback-dispatch.yml). The log gets arefire: #N: run X was refused as workflow-modifiedline.signals.mjsandpr-merge.yml: comments updated to the split.Risk
refire-of-2).Verification
feedback-dispatch.test.mjs226/226. refire-refused, the pr-merge workflow tests and workflow-gates together pass 201/201.The tests cover:
The main tests fail on origin/main's source.
The record step's bash, run by hand with REFIRE_OF both empty and set, emits valid JSON.
scripts/check-affected.sh --base origin/main --no-fetch: exit 0.Related
🤖 Generated with Claude Code