Repository navigation
fix(lanes): re-check an issue's blockers once its run holds a slot - #12933
Conversation
admit checks blockers before the slot wait (median 12 min, p90 53), so a blocked_by edge added meanwhile was never seen and the model ran. The read runner's broker-check now re-runs check-blockers.mjs in a RECHECK mode after the lease, on the first call only, and an open or unreadable blocker stops the run at "Stop on an open blocker": no model turn, no outcome marker, the lease released by the report job. work-unblock's sweep routes that stop as admit's blocker gate. Co-Authored-By: Claude Opus 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_01MWmASNtP63MZxdDeoxYztD
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-review reviewed Code review: no findingsI read every hunk of all 8 changed files in What I checked
Note, not a finding (unchanged from the last round). Sometimes the in-slot check falls through to the full check and stops for a reason other than an open blocker: an outsider author, untrusted provenance, or an open sub-issue. The sweep still routes that stop as Spend. Each first call of an issue run makes one extra Other checks
|
|
claude-security-review reviewed Security review: PR #12933, re-checking an issue's blockers in the slotNo security issues found. I read every hunk of all 8 changed files. Since the last review at What I checked
Tests (
Trust controlsNone of them is widened:
Embedded textNone found in the PR context. Spend (not a finding)
critical-findings: 0 |
read-lane-broker-check.test.sh evaluates the run job's issue-prior if with a fixed context; the new needs.broker-check.outputs.blocked term was unresolved, so every lease-ownership case printed nothing. The context now carries it (and the go step's BLOCKED), and a new case pins that a run the re-check stopped releases its own lease and reports nothing, even with a lane branch an earlier run left. Co-Authored-By: Claude Opus 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_01MWmASNtP63MZxdDeoxYztD
No related issue: hub drain analysis 11-03 (18 of 33 non-delivered runs lacked a prerequisite on main)
Summary
work-resolve-issue.ymlchecks an issue's blockers only inadmit, before the run waits for its slot (SLOTS: 3,queue: max; median wait 12 min, p90 53 min). Ablocked_byedge added during that wait was never seen, so the model ran anyway and ended in retry, wait or stop. Example: #12669 was labeled agent-ready at 04:09Z and got its blocked_by at 06:18Z, after 3 dispatches.Fix
pr-run-activity-read.yml'sbroker-checkjob, stepRe-check the issue's blockers in the slot(id: recheck-blockers).work-resolve-issue-slot-Ngroup, so this step runs after the slot is acquired and before therun(model) job.resolve-issuewould then have queued for it again.inputs.issue-number != '' && inputs.fallback == '' && steps.lease.outputs.lease == 'held'.fallback: handoff/fallback: fallback, so they skip it.check-blockers.mjs, with a newRECHECK=truemode.blocked_bylist once. An empty list lets the run on; an open blocker stops it, with the same notice and outputs admit's check gives.Stop on an open blockerruns and broker-check setsblocked=true. The run job'sgostep then setsrun=false, andissue-prioris skipped, so no reuse branch is named.reportjob ends the lease, becauseissue-run-startedis false.label-unblocked.mjsdidNoWorknow counts that stop step in any resolve-issue call asblocked, the same route as admit'sWait for open blockers. The issue waits while a blocker is open, then is re-fired with no needs-human and no per-version bound.issues: writefor the lease. The model job still holds onlycontents: readandpull-requests: read.API_BUDGET_TOKENand are counted by itsif: always()log-api-budget step.Verification
node --test .github/scripts/work-resolve-issue/check-blockers.test.mjs: 27/27 pass. New cases cover RECHECK mode: no blocker (exactly one GET), an open blocker (one GET, same outputs and notice as admit), closed blockers only (full check), and a failed read (stops the run).node --test .github/scripts/work-unblock/label-unblocked.test.mjs: 301/301 pass. New cases:Stop on an open blockerafter the lease step.node --test .github/actions/resolve-config/callers.test.mjs: 237/237 pass (merged with main). The new test pins:runand env against admit's step;run;always();if(first call only, issue mode only, lease held);blockedoutput,goreturningrun=false,issue-priorskipped, and the report job releasing the lease.scripts/check-affected.sh --base origin/main --no-fetch: 10 passed, 5 skipped.Related
GET .../dependencies/blocked_by, one page) when the issue has no blockers or an open one. When only closed blockers are listed, the full admission check runs instead.admit.mjsblockerDone) counts a blocker closed for any reason by a listed human as done (owner decision Q95). The tracker contract'sblocked_by_countinstead keeps a duplicate or not-planned blocker blocking. That conflict is left for an owner decision; the re-check reuses whichever rule is in force.🤖 Generated with Claude Code
https://claude.ai/code/session_01MWmASNtP63MZxdDeoxYztD