Repository navigation
One Run notification per Spec run - #170
Merged
Merged
Conversation
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ossary Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
# Conflicts: # src/spec_run.rs
2026-09-30T03:13:03Z, 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:13
Parallel Tickets from main now carry each Ticket's outcome, Interrupted included, out of the Spec run for its notification. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…t started" Its line read "blocked by " with no blockers. Also name the notification in the Run notification glossary entry, and say any error, not only an interrupt, keeps the Ticket lines off stderr. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
JacobStephens2
marked this pull request as ready for review
September 30, 2026 12:21
This was referenced Sep 30, 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
A Spec run now sends one Run notification for the whole Spec, with a line on each Ticket, as in the stderr summary. The checks (address,
RESEND_API_KEY) already ran once inmainbefore any Ticket, and Ticket Runs already skipped notifications. The missing piece was the per-Ticket lines. They now travel out of the Spec run onReached/FailedRun, and they work with Tickets running in parallel (merged in frommain):Example body of a Failed spec run:
README,
helpand the Run notification glossary entry inCONTEXT.mdnow say that a Spec run sends one notification for the whole Spec.Evidence
tests/spec_run.rsfor ready, failed and interrupted Spec runs. The subject and outcome were already right, but the body had no Ticket lines, so all three failed, e.g.expected "#21 landed with https://github.com/acme/widgets/pull/1\n" in: Pull request: …/pull/3 … Took: 29s.After: all 51
spec_runtests pass, including:…#20 Widgets, all of them: ready for review, with#21 landed with …/pull/1and#22 landed with …/pull/2: failed, with each Ticket's outcome: interrupted, with#21 interruptedand#22 blocked by #21--no-emailwithemail.alwayssends noneRESEND_API_KEYstops the run before any Ticket startswarning:lineparallel 1and two independent Tickets, an interrupt during Numbered Issue branches after a merged or closed PR #21 gave#22 blocked by(no blockers) in the email.After:
a_ready_ticket_an_interrupt_kept_from_starting_is_not_started_in_the_notificationchecks for#22 not started, and it passes.main(parallel Tickets), the full suite passes, andcargo clippy --all-targetsandcargo fmt --checkare clean.Merge Danger
Door: two-way
Blast Radius: notifications
This changes the email body for Spec runs, and how an interrupt flows inside the Spec run's Ticket loop. Stderr, stdout and exit codes stay the same.
Unaddressed findings
Standards
ticket_linesonReachedandFailedRunwidens a Run's interface for a field only a Spec run uses (Shotgun Surgery / Refused Bequest). Skipped:mainonly gets the lines throughrun::run's result, and a separate return type would ripple through every caller with no change in behaviour.ticket_lines: Vec::new()in four constructors, and the struct-update pair inspec_run::run(Duplicated Code). Skipped: this follows from the choice above, and each one is a one-line default.land_ticketsreturns a(Vec<String>, Result<()>)tuple. Skipped: the lines are needed on success and on failure alike. A struct for two fields used in one place adds nothing.Strings. Skipped: they are only ever displayed, and sharing the text with the stderr summary is the point.landed/landingholdResult<()>. Skipped: they read as "whether the Tickets landed", which is what they hold.summarize. Skipped: the cascade was already there. This branch only adds arms to it, and reshaping it is a separate refactor.run_emailing/the_one_notificationare not used by the olderticket_runs_send_no_run_notification. Skipped: that test asserts no request at all, so it doesn't fitthe_one_notification, and it's out of scope here.Spec
not started. Skipped: the Spec run's cause names the error, and this path is an internal failure, not a Ticket outcome.Closes #148
🤖 Generated with Claude Code