Repository navigation
Pickup runs: thirdshift takes ready-for-agent issues on its own - #292
Merged
Merged
Conversation
…lished /to-spec asks whether Tickets will follow and labels the Spec needs-triage or ready-for-agent; /to-tickets swaps the Spec's needs-triage for ready-for-agent as its last step. The triage label doc says what ready-for-agent means on a Spec and that in-progress is thirdshift's label for a Claim. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…hing, Claim defined in CONTEXT.md only Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…f ready-for-agent Once its preflight checks pass and before its worktree is created, a Run or a Spec run that is not a child Run swaps the issue's ready-for-agent for in-progress in one request, keeping its other labels and creating the label if the repository lacks it. A Ticket's Run in a Spec run and a Base fix make none, and an issue already Claimed is left as it is. A Claim that can't be made stops the Run before any work. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… Claim on StartedBy, the selection test off the Claim's calls, more Claim cases Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Day shift skills: ready-for-agent on a Spec means its Tickets are published
The Claim: a Run or Spec run marks its issue in-progress
… and runs it Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ue closed A Run or a Spec run that fails with nothing on origin to take over, no Issue branch or Spec branch and no pull request, puts its issue's labels back as they were before the Claim. A Merge run takes in-progress off once the issue is closed. Either failing is a warning naming the command to run by hand. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ow a run with no Issue URL starts as its own type, Unready labels whatever their case, the glossary's Base branch Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
thirdshift pickup: take the lowest-numbered Ready issue and run it
… labels path, clearer names in the Claim, more release cases, the Self-merge's glossary entry Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
src/claim.rs: the Claim a run makes and releases, from this branch, beside is_on, which the Pickup run asks whether an issue carries a Claim. The two branches each lifted the same label test out of label_in_progress; it stays one function under this branch's name, has_label, and is_on is what asks about in-progress. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Releasing a Claim, and removing it when thirdshift closes the issue
…un passed over A ready-for-agent issue is also not a Ready issue when it has a parent issue, is labelled base-fix, has an open blocker, or is not settled: ten minutes since ready-for-agent was applied and since a sub-issue or a "blocked by" link was last added or removed, read from its timeline. Each issue passed over gets one line on stderr with the first reason that applies, before the line that says what the pass did. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…made before any other work A Pickup run asked for a Run notification now checks for an address and a Resend API key before its preflight checks, the lock and any call to GitHub, so a broken setup stops every pass with exit 1, one that would have been skipped included. A pass that took an issue sends the notification the Spec run or Run it dispatched would have sent by hand, titled from the listing the issue was found in, and a skipped pass sends none. Closes #285 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…imit open Claims, and takes in-progress off closed issues Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… whatever its case; the settle time in the line from its constant; the reason order tested through to not settled Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…label, one error for a whole number from 1 up, the Claim limit over 3 and a Sweep that can't list Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…side one home for a label whatever its case Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… Spec check before an issue is said to be taken, the notification's checks ahead of the clone's Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Conflicts: both sides added github::remove_label and the fake gh's label DELETE. The Claim keeps issue-284's has and spelling helpers, with the release and removal from issue-212; the README keeps When the Claim ends and points to the Sweep for an issue closed some other way. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The rest of the Ready issue rule, and saying why an issue was passed over
…un notification beside the whole Ready issue rule The help states the whole Ready issue rule and the lines on issues passed over, and leaves --email and --no-email out of the flags that apply to the dispatched run: they ask for the Pickup run's own Run notification. Whether the issue is a Spec comes from the candidate query, so the Tickets query this branch had moved ahead of the taking line is gone: nothing can fail between the search and the issue being said to be taken. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…m limit before a search that says why it passed an issue over The Claim's is_on and its ready-for-agent test use github::has_label, the one home for a label whatever its case; the Sweep keeps its own spelling helper, since it needs the label as the closed issue spells it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
One Run notification for a Pickup run that took an issue
…m limit beside a Pickup run's one Run notification The notification's checks stay first, then the pass is run with pickup.limit. A pass skipped for the Claim limit sends no notification: the case #298 left for this branch is tested here. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The Claim limit, and taking in-progress off closed issues
… to it in thirdshift help Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… which skips have passed-over lines, the Base branch for a retry by hand, the skills by name Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
README: running a Pickup run on a schedule
… in-progress taken off as the issue spells it everywhere, the Sweep by name in the help, no Claim in the glossary's Ready issue Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
JacobStephens2
marked this pull request as ready for review
October 1, 2026 21:08
…hrough the Run ending module Conflicts: - README.md: main's step 6 with the Check re-run, this branch's step 7 with the Claim removed after a Self-merge. - src/main.rs: both sides' imports, less those main's Run ending module took over; the help keeps both the Check re-run and the Claim paragraphs; the Pickup run shows its ending with run_ending::show, as a Run and an Architect run do on main. - src/progress.rs: this branch's warn beside main's stamped, ChildLine and relay. - src/run.rs: both sides' imports. 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.
Closes #212
Summary
thirdshift pickupstarts a Pickup run: one pass, with no Issue URL, that takes the lowest-numbered Ready issue and dispatches it asthirdshift <Issue URL>would. The operating system's scheduler starts each pass (ADR 0009).A skipped pass exits
0, with stdout empty, one line of reason on stderr and no Run notification.The Claim is made by every Run and Spec run but a Ticket's Run and a Base fix, however it was started:
Where the work lives:
What the Spec review changed
issue-<n>-branch-2used to release its Claim thoughissue-<n>had left a pull request. The Spec releases only with "no Issue branch onoriginand no pull request for the issue", which is now the same question the Ready issue rule asks.in-progressis taken off as the issue spells it in the release and after a Self-merge too, as the Sweep already did. The case rule for a label has one home, ingithub.rs.thirdshift helpnames the Sweep and drops "cleaned up", which the glossary lists under Avoid.Seam tested: the
thirdshiftbinary run against the fakeghand the fakeclaude.Evidence
a_failed_retry_keeps_its_claim_when_an_earlier_issue_branch_left_a_pull_requestfailed: the issue's labels were["ready-for-agent"], not["in-progress"].After: it passes.
cargo test: every test binary passes, 0 failed, among them the 68 tests oftests/pickup_run.rs.cargo fmt --checkandcargo clippy --all-targetsare clean.Merge Danger
Door: two-way
Reverting the merge takes
pickupaway again. What it leaves on GitHub is thein-progresslabel on issues and in the repository, which is removed by hand.Blast Radius: labels
in-progressin place ofready-for-agent. Anything else that readsready-for-agenton a running or reviewed issue no longer finds it.an Architect run or a Pickup run is already running on <owner>/<repo>: a script that matches the old line breaks.Unaddressed findings
Spec
1and sends its notification, and the Claim limit never engages. Two lasting cases: a local Issue branch a Failed run kept after its push failed, and an openready-for-agentSpec whose Tickets are all closed with no Spec branch. Skipped because the fix changes the Ready issue rule the Spec fixed ("no Issue branch for it onorigin"), which is the Day shift's decision. Worth an issue of its own.ready-for-agentTicket whose Spec is a Ready issue gets no passed-over line, where the Spec says each issue that isn't a Ready issue gets one. Skipped: it was a deliberate choice in the Ticket's review, since "its Spec is not ready" would be false, and the README says so.Standards
progress::warn. Skipped:warnprints two lines and names a command to run by hand, and the Sweep's onewarning: ...: <error>line is what the README documents and the next pass retries.createdAtis parsed in two places ingithub.rs, andtickets()inlines label names. Skipped: the two sites report different sources in their errors, andtickets()reads GraphQL nodes, not the listlabel_namesreads.tests/pickup_run.rscopies seven helpers and four constants fromtests/architect_run.rs. Skipped: helpers per test file are the practice here (KEY,ACCEPTEDandthe_one_notificationwere in several files before this branch). Moving them totests/supportis a refactor of its own.pickup::runandarchitecteach match onlaunch::startwith the sameAlreadyRunningarm. Skipped: three lines, mapping to two different outcome types.dispatchedtakesparallelbesidedispatch.parallel, andemailbeside the args it came from. Skipped: a Pickup run overridesparallelfor an issue that is not a Spec, so the two differ on purpose.Launchhas a fieldgit, whilelaunchelsewhere names a&Git. Skipped: a rename across modules this Spec did not write, with no behaviour in it.READY_FOR_AGENTlives inspec_runand is imported by four modules. Skipped: it sits with the other triage labels there, the one home the Spec names for the Unready Ticket labels.Tickets
🤖 Generated with Claude Code