Repository navigation
One Run notification per Architect run - #245
Merged
Merged
Conversation
architect takes email [address] and no-email, with the User config's email.always as the default. Asked to, an Architect run sends one Run notification however it ends: how the Architecture review ended, naming the plan or idea issue, and how the dispatched Spec run or Run ended, which sends none of its own. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…o ask for a notification, two more outcomes tested Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This was referenced Oct 1, 2026
Merged
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
An Architect run asked for a Run notification, by
email [address]or byemail.alwayswithoutno-email, now sends exactly one, however it ends. The Spec run or Run it dispatches still sends none.architecttakesemail [address]andno-email, with or without--plan-only. The word afteremailis the address only if it has an@, so a focus is not taken for it.Seams tested: the
thirdshiftbinary throughtests/support::Scenariowith the fakeclaudeandghand the Resend stand-in (tests/architect_run.rs,tests/command_surface.rs); the argument parser,args::parse; the notification's subject and body text, innotification's unit tests.Evidence
thirdshift architect --plan-only --email me@example.comexits2withunexpected argument after architect: --email, andplan_only_sends_one_notification_naming_the_planfails on it.After:
cargo testpasses, all suites.tests/architect_run.rshas 44 tests, 13 of them new, one notification each for:--plan-only, idea filed, already filed, review failed, review interrupted, a plan that fails its checks, a dispatched Run that succeeds or fails, and a dispatched Spec run that succeeds or fails, with its Ticket lines. Alsono-emailoveremail.always, no notification unasked, no address stopping before any work, and a failed send leaving the exit code and stdout alone.cargo clippy --all-targets -- -D warningsandcargo fmt --checkare clean.Unaddressed findings
Standards
(reviewed, dispatched)is matched in bothmain::architectandArchitectNotification::send; one "how the Architect run ended" type would hold it once. Skipped: the two matches serve different readers, the exit code and the email, asrun_outcomeand the Run's notification do for a Run. One type would mean moving the dispatch out ofmaininto thearchitectmodule, which reworks Architect run dispatches its plan as a Spec run or a Run #232 rather than this Ticket.emailandno-emailarms inparse_architectcopy those inparse. Skipped: they follow themergeandno-mergearms beside them, which are copied the same way. The shared part is already inask_onceandis_address.KEY,ACCEPTED,EMAIL_ALWAYSandthe_one_notificationcopytests/run_notification.rsandtests/spec_run.rs. Skipped: those two files already each keep their own copies. Moving them totests/support/resend.rswould touch test files this Ticket doesn't otherwise change. The inline copy of the environment inside this file was removed.architect::launch()returns an unnamed tuple, and a notified Architect run readsorigintwice. Skipped: the tuple has one private caller besidesrepo(), and the second read is onegit config.Spec
interruptedis a review outcome the issue doesn't list. Kept: it is how a Run's notification already tells an interrupt from a failure.review failed. Skipped: the cause line says what failed, and a Run's notification likewise saysfailedfor its preflight failures.review failedwhere the body saysReview: failed. Kept: the subject has to tell a failed review from a failed dispatched run, whose outcome isfailed. The body has theReview:andDispatched:labels for that.@right afteremailis taken for the address. Skipped: it is the rule a Run uses for the word afteremail, and the README says so. Putting the focus beforeemailavoids it.Merge Danger
Door: two-way
Reverting restores
architectrejecting the email flags and sending nothing.Blast Radius: Architect runs
With
email.always = true, an Architect run now sends an email where it sent none, and stops before any work if no address or Resend API key is found, as a Run does. Runs and Spec runs started on an Issue URL are unchanged, apart from a refactor of how their notification is built that their tests still pass.Closes #233
🤖 Generated with Claude Code