Repository navigation
fix(ci-status): leave no red yielded sibling after a full run succeeds - #728
Conversation
A yielding contract-only run could stay red with nothing left to re-run it in two ways: - It read the full run's success while that run's aggregate step was still running, after its last sibling scan, and failed superseded. It now re-lists and re-reads every 5s for up to 30s until that step finishes, then carries the success once the step reads back success. A running step still never proves the status, so nothing passes sooner. - It counted a contract-only sibling's re-run attempt, whose new jobs were not listed yet, as a full run. A re-run keeps its event, so such an attempt is now classified by its first attempt's jobs. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TRhsMPSTMFo99ik7gkdgQt
The full run's re-run scan now names the failed runs it found and, for each one it passes over, why, so a scan that re-runs nothing shows what it saw. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TRhsMPSTMFo99ik7gkdgQt
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TRhsMPSTMFo99ik7gkdgQt
|
PR body contract — issue linkage This PR body does not yet satisfy the issue-linkage contract:
Edit the body and this comment updates itself on the next run. |
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TRhsMPSTMFo99ik7gkdgQt
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. |
|
I'll analyze this and get back to you. |
1 similar comment
|
I'll analyze this and get back to you. |
|
Claude finished @kyle-sexton's task in 4m 7s —— View job Security review in progress
|
|
Claude finished @kyle-sexton's task in 6m 36s —— View job Claude's review of PR #728
No blocking or high-confidence findings. Per What I verified by tracing the implementation against the fixtures in
Nothing here rises to a reportable finding under the high-signal bar (no incorrect logic, no untested gap with a concrete failure scenario, no security/observability/atomicity issue per |
|
claude-security-review has reviewed this pull request through 0ee421e; a later push is reviewed from there. |
|
claude-review has reviewed this pull request through 0ee421e; a later push is reviewed from there. |

Related
Closes #726
Fix
With
yield-to-full-run, a contract-only run could stay red after the full run succeeded, with nothing left to re-run it. This PR closes the two paths that caused that.ci-lanes=successwhile that run's aggregate step is still running fails superseded. If the full run has already done its last sibling scan, nothing re-runs it. Now, when the newest status is asuccesswritten by the current attempt of the only full run in flight, and that step is still running, the yielding run re-lists and re-reads every 5 s for up to 30 s. It passes once the step reads backsuccess. A running step still cannot prove it wrote the status (another workflow could have posted it), so nothing passes sooner. A pending marker, failure, error or missing status still fails at once, and a failed status read or jq parse fails closed.GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/1/jobs). If that read fails, the run still counts as a full run.Why 30 s. The wait is a fixed constant, not an input. It stays below the default
rerun-wait-seconds(90 s) on purpose. If the full run is waiting on this run before it re-runs siblings, both would otherwise wait on each other. Because this run gives up first, it fails, and the full run then re-runs it. It also fits well inside the 3-minutetimeout-minutesthe README recommends for theci-statusjob, so the fail-closed error is reported before the job times out. The time taken after the full run writes the status is normally a few API calls.Callers without
yield-to-full-runbehave as before. The harness gains cases for both paths, the 30 s limit, a pending marker, and status read and parse failures.🤖 Generated with Claude Code
https://claude.ai/code/session_01TRhsMPSTMFo99ik7gkdgQt