Repository navigation
A Base fix, when the base-fix flag is given - #236
Merged
Merged
Conversation
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ks, name the child Run's kind Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This was referenced Oct 1, 2026
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
With
base-fix(or--base-fix), a Run whose only red checks are Inherited failures starts a Base fix instead of failing (ADR-0008).RepairLoop::run, CI red, every failed check an Inherited failure if the Base branch moved since the merge count a Base move, go round - fail: CI red on <check>, which also fails on <base> at <sha>; fix <base> first + BaseFix::fix + already had its one Base fix + fail: ..., even after Base fix <issue URL> merged; fix <base> first + not given base-fix (or is itself a Base fix, which sees no Inherited failures) + fail: ...; fix <base> first # exactly as in #103 + gh label create (only labels the repository lacks), gh issue create + title CI red on <base>: <check>[, <check>…] + body the checks and their URLs on <base>, <base> and its short sha, the Run's PR + labels base-fix, ready-for-agent + child thirdshift --base-fix-into <base> <issue URL> # Merge run, no Run notification + wait, relaying its lines as "#<n>: …" + merged -> go round: merge <base> in, watch CI again + failed -> fail: Base fix <issue URL> failed: <its cause>On a Spec,
base-fixgoes to each Ticket's Run (its Base fix goes into the Spec branch) and to the Spec PR (into the Base branch).Seam under test: the binary, with the fake
ghandclaude(tests/support::Scenario), as #221 agreed.Evidence
cargo test --test base_fix, first test:thirdshift <Issue URL> base-fixexits 2,not a GitHub issue URL: base-fix.After:
Full
cargo test,cargo clippy --all-targets -- -D warningsandcargo fmt --checkpass locally. The #103 tests intests/ci.rspass unchanged.Merge Danger
Door: two-way
Nothing changes without
base-fix: nogh labelorgh issuecall is made, and the cause text is #103's.Blast Radius: opt-in
With
base-fix, thirdshift writes to the repository beyond the Run's own pull request: it may add thebase-fixandready-for-agentlabels, opens an issue, and merges a pull request into the Base branch with no human review. Until #224, Tickets of a Spec run that meet the same Inherited failure at once each start a Base fix of their own.Unaddressed findings
Standards
&mut BaseFixthreaded throughrun→implement/spec_run::run→open_and_review→review_and_deliver→deliver, with three new#[allow(clippy::too_many_arguments)](issue, worktree, base, goal, logsare a Data Clump). Bundling them is a refactor ofrun.rsandspec_run.rsbeyond this Ticket;spec_run.rsalready allowed the lint twice.run::runstill takesgiven_baseandBaseFixapart, so a Base fix with no given Base branch is representable there. Partly addressed:mainnow derives both from onechild_run::Kind, and giving both hidden arguments is rejected.BaseFix::fixmostly fails for a Run not givenbase-fix, and aBaseFixexists for Runs that never start one. Kept: it puts every Inherited failure cause in one place, and the Repair loop makes one call.BaseFix::reportwordsmerged/not mergedoutsidenotification.rs. Kept: the notification only adds its label, as it does for a cause.tests/spec_run.rsre-inlines the Base fix agent's script fromtests/base_fix.rs. Kept: the two differ in branch and issue numbers, and the test files share onlytests/support.Spec
gh label list,gh label create), which A Base fix, when the base-fix flag is given #222 does not ask for. Kept:gh issue create --labelrefuses a label the repository doesn't have, so without it a Base fix would fail in any repository that has nobase-fixlabel yet. A label the repository has is left alone.Closes #222
🤖 Generated with Claude Code