Repository navigation
Let a Review run Self-merge when asked by its command or [review] merge (#2219) - #2232
Merged
Merged
Conversation
2026-11-14T14:36:12Z, host stephens. Uncommitted work at the time of failure is included in this commit.
Keep [review] merge out of recommend-only reviews, record a Continuation only for merge requests, log Self-merge under its own Step, and correct the hand-written site pages and code navigation.
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 Review run can now Self-merge, but only when asked. Either the command says
merge(or--merge), or the User config sets[review] merge = true.no-merge/--no-mergeturns it off for one command. The command word wins over[review] merge, which defaults to off.merge.alwaysstill never applies to Review runs. A recommend-only review ignores[review] merge, and--recommend-only mergeis an argument error (exit 2).self-mergestraight afterdelivery.docs/guide.md(Review runs, User config reference, usage), theGLOSSARY.mdReview run entry,site/index.html,site/how-it-works/,site/architecture/anddocs/code-navigation.md.site/docs/index.htmlwas regenerated. No prompt sources changed.Evidence
Execution evidence
The previous run was killed (SIGKILL) during implementation, so this one picked up its branch. Main was merged in first.
Before:
cargo test --bin thirdshift setup::testsThe complete-config fixture had no
[review] merge.After:
test result: ok. 52 passed; 0 failedBefore:
cargo test --test review_head_lag.review_times_out_on_a_head_that_never_reflects_its_pushpanicked attests/review_head_lag.rs:60. Delivery reported "head moved" instead of the timeout, because the head-move check had been moved ahead of the readiness check for every run.After: that reorder applies only to merge requests.
test result: ok. 4 passed; 0 failedBefore:
cargo test --test review_merge, with the review fixes reverted:After:
test result: ok. 11 passed; 0 failed; 2 ignoredFinal validation:
scripts/affected-tests mainselected the full suite and passed on this head:npm run docs:check --prefix siteandcargo test prompts_pagealso pass.Visual evidence
None captured. The three hand-written site pages changed one or two sentences of paragraph text each, with no markup, CSS or layout changes, so screenshots would show only the new wording.
Merge Danger
Door: two-way
The default is off, so nothing merges until a machine opts in with
mergeor[review] merge = true. Reverting this PR takes the feature away.Blast Radius: opt-in
Machines that opt in will merge PRs made outside thirdshift, but only the head a Review run reviewed and watched go green, under ADR 0004's gates. Review runs without
mergebehave as before, including withmerge.always = true.Unaddressed findings
Standards
review_base_is_open_prvsreview_base_fixes(src/github/review.rs). Declined: it's a judgement call. The two readers return different shapes: a boolean, and fix commits on a matching PR. Sharing one would mean an extra abstraction for an eight-line filter.--recommend-only/mergeensure!(src/args.rsandsrc/processes/review.rs). Declined. The parse-time check is the argument error with exit 2. The runtime check keeps the invariant where the effective goal is resolved, for any future caller of the shared Review process. Since this PR's fix, the config no longer feeds it (Goal::from_flag(flags.goal, config.review.merge && mode == Mode::Address)).SkillWorktree::take_for_delivery(src/worktree/skill.rs). Declined: it's a judgement call. It is the only place a Skill checkout turns into a DeliveryWorktree. The comment above it explains why it must not reacquire origin.let pass = reservation.is_some()as a proxy for an author Pass (src/processes/review.rs). Declined. Inrun(),Target::PullRequestgives(pr, None)and onlyTarget::Authorreturns a reservation, so the value is exact for the Built-in Review run. Exit codes are covered bymerge_holds_leave_ready_with_pass_specific_exit.Spec
src/processes/review/delivery.rs,unchanged_head) and leaves the PR ready with exit 0. That case is covered bymerge_holds_leave_ready_with_pass_specific_exit. The behaviour the finding describes is pinned bycargo test --test review_merge review_merge_reviews_foreign_commits_that_arrive_at_the_merge_request, which passes.Security review outcome
No unaddressed introduced findings.
Review coverage
site/docs/index.htmlis generated and was intentionally not read by either reviewer. It was checked withnpm run docs:check --prefix site, which exits 0.docs/code-navigation.mdwas changed by the review fixes after the Spec review, so the Spec reviewer did not read it. It is a one-row pointer update.Closes #2219
Built with claude 2.1.314 · opus · default effort