Repository navigation
Re-run an Abandoned job instead of starting a CI-fix Repair - #930
Merged
Merged
Conversation
A GitHub Actions job GitHub ended as failed with no failed step and a step not completed is an Abandoned job. When every one of the branch's own failures on a head is one, the Repair loop re-runs them once per head for the Delivery, with no Repair, and watches CI again behind the Check re-run's guard. Mixed failures, a refused or unseen re-run, or a second abandonment take the CI-fix Repair as before. ADR 0020 records why this is not the re-run before every Repair that ADR 0010 rejected. Closes #908 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…adable job is not abandoned Steps are read only while every own failure may yet be an Abandoned job, stopping at the first that is not, and a failed read is told and taken as not abandoned, so red CI still gets its CI-fix Repair rather than failing the Run. Names now use the glossary's Abandoned job, the re-run request says whether every workflow run was requested, and the two per-head allowances are documented. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Merged
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
A GitHub Actions job that GitHub ended as
failurewhile none of its steps failed, and at least one step had not completed (a lost runner), is now an Abandoned job. If every one of the branch's own failures on a head is an Abandoned job, the Repair loop re-runs them with no Repair, once per head for the Delivery. It then watches CI again behind the Check re-run's old-attempt guard.site/docs/index.htmlare updated.Seams under test:
ci::is_abandoned: the classifier.ciwatch and re-run through the in-memoryOutside: step reads, marking, request and new-attempt watch, refusal.repair_loop::take_to_goalthrough the scriptedOutside.gh(tests/ci.rs), whose fake now answersrepos/<repo>/actions/jobs/<id>.Evidence
Before: an abandoned job's red CI went straight to
CI red; starting Repair 1 of 5.After:
an_abandoned_job_is_re_run_with_no_repair_and_green_is_success(tests/ci.rs): only the implement session runs,gh run rerun 900 --failedis requested, stderr readssmoke / wsl lost its runner on <sha>; re-running itthenCI passed, and the Run exits 0.Acceptance criteria, in-process:
a_failed_job_with_no_failed_step_and_a_step_not_completed_is_abandonedan_abandoned_job_alone_is_re_run_with_no_repair_and_green_reaches_the_goalan_abandoned_job_abandoned_again_or_not_re_run_gets_the_ci_fix_repair_then_its_check_re_runabandoned_jobs_beside_ordinary_own_failures_get_the_ci_fix_repair_as_any_red_cia_head_whose_abandoned_jobs_were_re_run_gets_no_second_re_run_after_a_refused_mergeReview finding P1 had no test, so I wrote two, and both failed on 672f9b7:
a_watch_reads_steps_only_while_every_own_failure_may_yet_be_an_abandoned_job:left: [1, 2, 3].a_job_whose_steps_cannot_be_read_is_not_abandoned_and_ci_stays_red:Err … HTTP 403.Both pass now.
cargo test: 2187 passed, 0 failed.cargo clippy --all-targets -- -D warningsandcargo fmt --checkare clean.cd site && npm run docs:checkis clean.Merge Danger
Door: two-way
Blast Radius: CI watch
failurenow makes up to one jobs-API read per job.Review coverage
Both axes reviewed
main...672f9b7and read every changed file.site/docs/index.htmlis excluded as generated output: its source isdocs/guide.md, andnpm run docs:checkis clean. The follow-up commit only touched files both reviewers had read.Unaddressed findings
Standards
ActionsJobontoFailedChecks. Declined: that means editing everyFailedChecksliteral, about 30 across src/ci.rs, src/prompt.rs, src/prompts_page.rs, src/base_fix.rs and src/delivery/repair_loop.rs. The field has one production constructor (ActionsJob::of, src/github.rs), and its doc says it is false until the CI watch tells it.CheckRerunsandconsumed. Declined: these are existing names. The struct doc now names both allowances, and each field is documented. The rest of S3 was fixed.rerun_abandonedat each layer. Declined: ADR 0020 keeps the two re-runs separate, with different triggers and refusal handling. On refusal, a Check re-run watches the whole head (ADR 0010), while an Abandoned-job re-run givesNone; seeif !rerun_checks.all_requested { return Ok(None); }inrerun_abandoned_through, src/ci.rs. The shared part,request_rerunsandwatch_new_attempts, is already extracted.Spec
all_requestedcheck above does exactly that. ADR 0010's refusal path re-reads every check on the head, so a later Check re-run still settles correctly.Closes #908
🤖 Generated with Claude Code
Built with claude · claude-opus-5-5 · medium
Security review outcome
No unaddressed introduced findings.