Repository navigation
A Pickup run owns its lifecycle to its dispatch, tested in-process behind the Pass seam - #416
Merged
Merged
Conversation
…hind the Pass seam (#414) The Pass seam grows calls to record a skip and a start, check the Harness and dispatch an issue, and its production adapter is renamed Launch and GitHub. Everything in a Pickup run after its lock runs in run_through, generic over the seam, and the entry point no longer builds Asks or calls run_to_end for one. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…le call list Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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 Pickup run now owns its whole lifecycle, from its gates to the Spec run or Run it dispatches. Everything after the lock runs in
pickup::run_through, which is generic over the Pass seam.Changes to the Pass seam (
src/pass.rs):OnGitHubis renamedLaunchAndGitHub. It holds the Launch directory, the repository, the Harness choice (&mut), the command's flags and the User config.skipped,check_harness,startedanddispatch.dispatchtakesDispatch::ArchitectPlan { plan, base }orDispatch::ReadyIssue { issue, is_spec, base }. It builds the Asks with the checked Harness, then callsrun_to_endwith the dispatch's Base branch.InMemoryrecords each new call in its one ordered call list. Its Harness check can be scripted to fail, and its dispatch returns a scripted Ending.The Architect run builds the renamed adapter and its gates and conclusion use it unchanged. Its Harness check and start now go through the seam. Its dispatch still lives in
mainuntil #415.Evidence
Before: the rules of a Pickup run's lifecycle (the line naming the issue taken, no Harness check for a skipped Pass) could only be tested end-to-end, through a whole
thirdshift pickuprun against the fake binaries.After: new in-process tests in
pickup::tests, throughrun_throughwithInMemory:… ReadySearch, Step("taking Ready issue #9 …"), HarnessCheck, Started(Some(9)), Dispatch { 9, is_spec: false, base: "main" };is_spec: trueon the Pickup run's Base branch;HarnessCheck, so there is no start and no dispatch;The end-to-end tests
a_progress_line_names_the_issue_taken_before_it_is_dispatchedanda_skipped_pass_makes_no_check_of_its_harness_or_modelare removed. The ones covering the lock, the preflight checks, the notification, flags reaching the dispatched run and its ending are kept.cargo testpassed, andcargo clippy --all-targetsis clean. One spec_run end-to-end test,two_tickets_meeting_the_same_inherited_failure_share_one_base_fix, failed once under load. It passed three times on its own and on the final full run, and it doesn't touch the Pickup run.Merge Danger
Door: two-way
The change is meant to be a pure refactor, so it should change nothing on stdout, stderr, the Activity log, the Command log or the Run notification. A Pickup run that fails before it takes an issue still ends through the command's plain failure.
started.tookandbuilt_withnow run after the dispatch rather than before it, but both only fill in the notification, which is read atfinish.Blast Radius:
thirdshift pickupA wiring mistake would show up in Pickup runs started from cron. The Architect run only switches to the renamed adapter.
Unaddressed findings
Standards
LaunchAndGitHubnames only two of its concerns. Skipped: the Spec decides this exact name, matching the Run's own start adapter.Dispatch::ArchitectPlanis under#[expect(dead_code)], and the in-memory dispatch leaves itunimplemented!. Skipped: the acceptance criteria require both variants now, and An Architect run owns its lifecycle to its dispatch, tested in-process behind the Pass seam #415 wires the Architect run's dispatch through the seam.architect::runpasses flags and config that its path doesn't read yet. Skipped: the Spec has the one adapter hold them, and An Architect run owns its lifecycle to its dispatch, tested in-process behind the Pass seam #415 uses them for the plan's dispatch.logs::skippedrather thanoutside.skipped. Skipped: that is the Architect run's lifecycle, which is An Architect run owns its lifecycle to its dispatch, tested in-process behind the Pass seam #415.running.0replaces the removedSkipped::repo(). Skipped:architect::runreads it the same way, so a helper for one field isn't worth it.Dispatchand are unpacked into a tuple. Skipped: the enum is that bundle, and the tuple is local to one match.run_through, andOutcome::Took. Skipped:<name>_throughis the codebase's convention, and the Spec asks for it.Spec
&mutHarness, and An Architect run owns its lifecycle to its dispatch, tested in-process behind the Pass seam #415 builds on it.Call::Skippedrecords only the reason, not which Pass was skipped. Skipped: the Spec asks only for "the skip with its reason".Closes #414
🤖 Generated with Claude Code