Repository navigation
The draft Spec PR and its Tickets checklist - #169
Merged
Merged
Conversation
…ts checklist The checklist sits between fixed markers in the Spec PR's body, one line per Ticket, and is rewritten as each Ticket starts and ends. After the Spec review rewrites the body, thirdshift puts it back before marking the PR ready. A Failed spec run leaves the Spec PR a draft and prints its URL. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…iled update only warns Also defines the Tickets checklist in CONTEXT.md, passes the Spec PR to the Spec review instead of looking it up again, and names pr_view's argument for what it takes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Both sides taught the fake gh's pr_view to look a PR up by number; kept main's version, which also documents its --jq support. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30T03:08:06Z, host tracewake. Uncommitted work at the time of failure is included in this commit.
JacobStephens2
marked this pull request as draft
September 30, 2026 03:08
Parallel Tickets (#143) and the Spec PR's Repair loop and Self-merge landed on main. The Tickets checklist now follows the parallel loop: it is written once per batch of Tickets started and whenever one ends, and the Spec PR opens after the first Ticket lands. Tests that need #21 to land before #22 starts run with parallel 1, and the Spec PR is found by its head rather than by its index. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…st line A Ticket whose Run could not be followed to its end is shown failed rather than running, and a Ticket that lands just before GitHub stops answering the graph read still opens the draft Spec PR, so the Failed spec run prints its URL. Also fix the run doc (an open Spec PR is turned back into a draft) and list every checklist state in CONTEXT.md. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
One Run notification per Spec run (#148) landed on main. Its Ticket lines and the Tickets checklist now come from the same standing(), with main's "not started" in place of "to do", and the Spec PR is opened and kept up to date inside run_ready_tickets. The notification tests expect the Spec PR at pull/2, now that it opens once the first Ticket lands. 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
The Spec PR now exists from the first landed Ticket onward, as a draft carrying a Tickets checklist.
The checklist, in the body between
<!-- thirdshift:tickets -->markers:standing()gives each Ticket's line. The stderr summary and the Run notification's Ticket lines (One Run notification per Spec run #148) use it too, so the wording is the same everywhere.gh pr editbreaks ongh2.45 (the Projects classic sunset), sogithub::set_pr_bodysets the body through the REST API. The fakeghnow handles thatPATCH, andpr viewby number.origin/mainis merged in, including parallel Tickets, the Spec PR's Repair loop and Self-merge, and one Run notification per Spec run. Tests that need Numbered Issue branches after a merged or closed PR #21 to land before CI watching, CI-fix Repair and the Repair cap #22 starts run withparallel 1. Tests now find the Spec PR by its head branch, because it is no longer the last PR opened.Evidence
After:
cargo fmt --check,cargo clippy --all-targets -D warningsandcargo testall pass. New or reworked tests intests/spec_run.rs:the_spec_pr_opens_as_a_draft_once_the_first_ticket_lands_with_the_checklist: Numbered Issue branches after a merged or closed PR #21's session sees no Spec PR. CI watching, CI-fix Repair and the Repair cap #22's sees a draft withCloses #20, where#21 landed with …/pull/1is ticked and#22 runningis not.the_spec_review_writes_the_spec_pr_body_and_the_checklist_is_put_back_after_it: the body is rewritten without markers, the checklist is appended, and the PR is ready.a_spec_review_that_keeps_the_markers_has_the_checklist_replaced_between_them: the text outside the markers stays byte for byte.a_ticket_that_fails_once_the_spec_pr_is_open_is_shown_failed_in_its_checklist, plus each unready, blocked, cycle and outside-blocker test: exit 1, a draft Spec PR, its URL on stdout, and the exact checklist.a_ticket_that_lands_just_before_github_stops_answering_still_gets_the_draft_spec_pr: failed before this fix (no Spec PR), passes after it.a_failed_spec_review_that_rewrote_the_body_has_the_checklist_put_back_in_the_drafta_checklist_update_github_refuses_is_only_a_warningchecklistandwith_checklist: replacing, appending when the markers are gone, appending when only one marker is left.Merge Danger
Door: two-way
Revert the commits to undo it. The only lasting effect is on Spec PRs opened while this is deployed: their bodies keep a marked checklist section.
Blast Radius: Spec runs
Only a Spec run changes. The ordinary single-issue Run's code paths are untouched:
pr_viewonly had its argument renamed, andpr_body/set_pr_bodyare new. Each batch of Tickets started and each Ticket that ends costs one moreghread and onePATCH.Unaddressed findings
Standards
land_ticketsreturns the checklist, fills an out-param&mut Option<PullRequest>, and owns the Spec PR's lifecycle (Divergent Change; "return results, don't produce side effects"). Kept. The Spec PR must stay visible to the caller on the failure path, so it can go inFailedRun.pr_url. ASpecPrtype is worth doing on its own once Rerunning a Spec #149 reshapes reruns.#[allow(clippy::too_many_arguments)]onreview_and_deliver:spec,spec_prandchecklistform a Data Clump. Kept, for the same reason: that sameSpecPrtype would absorb them.write_checklistbelongs besidepr_body/set_pr_body. Kept. The markers are a Spec run concept, andgithub.rsstays a thinghlayer.String, andpr_viewtakes a head branch or a number as a&str(Primitive Obsession). Kept. The checklist is produced by one pure function and consumed by one.pr_viewis private, andgh pr viewitself takes either form.draft_spec_prhas the same shape asfailed_run::open_pr_url. Kept. They differ inkeep_readyand in what they return, and sharing them would couple the Failed run path to Spec runs.write_checklist_or_warn(spec, pr, &checklist(…))appears twice in the loop. Kept. One is after Tickets start and one after a Ticket ends, and a helper would hide which moment is which.draft_spec_prsounds like it creates a draft. Kept. Its doc says it finds the open Spec PR and turns it back into a draft, and the name matchesconvert_to_draft.Spec
gh pr createsucceeds but the lookup right after it fails, the run fails without a URL, and a later landing would try to create the PR again. Kept. The first error is still reported and the run fails. It needs GitHub to fail between two back-to-back calls.donewithout their PR. Finding each Ticket's PR belongs with rerunning a Spec (Rerunning a Spec #149).draft_spec_prturns an already-open ready Spec PR back to a draft (beyond The draft Spec PR and its Tickets checklist #147). Kept. It is what makes "A Failed spec run leaves the Spec PR a draft" hold when a Spec PR already exists.Closes #147
🤖 Generated with Claude Code