Repository navigation
The rest of the Ready issue rule, and saying why an issue was passed over - #296
Merged
Merged
Conversation
…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>
… 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>
…side one home for a label whatever its case 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
The rest of the Ready issue rule, and one line on stderr for each
ready-for-agentissue a Pickup run passed over.Shaped means the latest of
ready-for-agentbeing applied, a sub-issue added or removed, and a "blocked by" link added or removed, read from the issue's timeline.Seam under test: the
thirdshiftbinary run as a scenario against the fakeghand the fakeclaude. No new seam.Whether an issue is a Spec now comes from the same query, so the separate Tickets query before the dispatch is gone.
Closes #283
Evidence
Before:
an_issue_that_also_has_a_label_that_makes_an_unready_ticket_is_not_taken, asked for the line, failed:After:
cargo test --test pickup_run: 41 passed, 0 failed. The new cases:Full
cargo test: every suite passes.cargo fmt --checkandcargo clippy --all-targets -- -D warningsare clean.The candidate query was run read-only against this repository on real GitHub (Pickup runs: thirdshift takes ready-for-agent issues on its own #212, The rest of the Ready issue rule, and saying why an issue was passed over #283). It returned the parent, the blockers with their states, the
LabeledEvents and the last sub-issue or "blocked by" event, in the shape the code reads. A label given when an issue is created does produce aLabeledEvent.Unaddressed findings
Standards
tickets()andcandidate(). Skipped: the two read different things (every blocker and the open ones, against the open ones only), and each is four lines.pickup.rsandgithub::Candidate, bound asread;atis an index inSearchand a timestamp closure ingithub::candidate. Skipped: I renamedstandtostanding_of, but found no better name for the type than the one that says whose facts they are.candidatesandstandingsare parallel vectors tied by index, andfirst_readyreturns(ListedIssue, bool). Skipped: both are private toSearch, and a wrapper type would add more than it removes.Search::lineboth words a line and works out another candidate's standing. Skipped: the look-ahead exists only to decide whether a Ticket gets a line, so it sits with the line.github::candidate(issue, label)takes a label only one caller gives. Skipped: it keepsready-for-agentout ofgithub.rs, asopen_issues_labelled(repo, label)does.Spec
in-progress, each of its Tickets still labelledready-for-agentprints#N is a Ticket of #S, which is not readyon every pass. Skipped: it is what The rest of the Ready issue rule, and saying why an issue was passed over #283 asks for ("Aready-for-agentTicket whose Spec is not a Ready issue gets a line naming the Spec"). Whether to quiet it is a question for the Spec, Pickup runs: thirdshift takes ready-for-agent issues on its own #212.ready-for-agentbeing applied is read from the last 100 label events only. An issue whose label is older than its last 100 label events, or that has no such event, counts as settled. Skipped: that is the safe direction for an old label, and it keeps the search to one query per issue.Merge Danger
Door: two-way
A revert restores the earlier search. Nothing is written to GitHub by the search itself.
Blast Radius: pickup
Only
thirdshift pickupchanges: it takes fewer issues than before (sub-issues,base-fixissues, blocked issues and issues shaped in the last ten minutes are now passed over), makes one more GraphQL query perready-for-agentissue it looks at, and prints more lines on stderr. A released Claim putsready-for-agentback, which is a new label event, so that issue waits ten minutes before a pass takes it again.branch::startedand the label helpers changed shape, with the full suite passing.🤖 Generated with Claude Code