You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
A Fix Pass records a failure for every ready pull request whose head has no agent review #2020
A scheduled Fix Pass started with merge takes a ready-for-review pull request whose head has no agent review. It holds the Self-merge and ends as a failed Fix run. The next Pass takes another such pull request, and so on. Nine failures between 2026-11-10 20:00 and 2026-11-11 03:51 (thirdshift 0.27.2): eight on one private repository's pull requests on one host, and one on this repository (#2010). Each ended:
PR <url> stays ready for review: adopted head <sha> has no recorded agent review; run thirdshift review <url> before retrying Self-merge
Where
src/fix.rs:~170. Since 44317cc ("Hold adopted-head Self-merge for review", Spec #1804 / #1805), reviewed is false when the adopted head has no agent review. target.hold_self_merge(...) then holds the merge, and the run is reported as Failed. Each of these lands in Needs you.
Expected
The hold is right, but a Pass shouldn't record a failure each time. Possible approaches:
a Fix Pass skips pull requests whose head has no agent review, giving the reason;
or it leaves them to the Review Pass;
or a held run ends ready for review rather than failed.
The Day shift then sees a pull request that needs review, not a list of failed runs.
Confirmed on selected Base commit de91156. A scratch reproducer ran two successive fix merge no-base-fix no-email Passes against real fixture Git repositories and fake services. Each selected a different unreviewed PR, successfully repaired CI, left the PR open and ready, then exited 1 and recorded outcome=failed. Reservations and in-progress labels were released.
Diagnosis and evidence
src/fix.rs:62–90 selects candidates using needs_fix, which checks conflict/current-head CI eligibility without checking review evidence (src/github/review.rs:75–108).
After worktree acquisition, src/fix.rs:175–184 checks the actual adopted head and sets a Self-merge hold when evidence is absent.
src/pull_request.rs:550 raises MergeHold. Delivery preserves the ready PR, but src/run_ending.rs:551–568 classifies this hold as failed. src/logs/reading/inbox.rs:234 consequently identifies a failed Command for Needs you.
tests/standards_1795.rs:91 explicitly expects exit 1 for this hold, so the failure behavior is intentional under the current contract.
Evidence includes exact-head authored_head as well as reviewed_head or pushed_head from the authenticated account's trailing marker (src/github/review.rs:196–205,248–272). A fix must retain all currently accepted evidence and the acquired-head check.
Recommended next step
Prefer skipping heads without this evidence during merge-goal Fix Pass selection, logging the review requirement and continuing to the next candidate. Resolve the effective goal from flags and User config. Keep no-merge repair eligibility and targeted Fix behavior unchanged. Preserve the acquired-head guard against branch movement; missing or stale evidence must never permit Self-merge. This keeps ADR 0004's merge rule intact.
The Day shift must select whether repair should instead proceed and finish successfully Ready for review despite the requested merge. That changes the outcome contract and requires different implementation and tests.
After the decision, cover candidate ordering past an unreviewed PR, all-skipped success without failure notification, authored/reviewed evidence, merge defaults and explicit no-merge, reservation cleanup, and acquired-head races. Update the Fix-run glossary/manual and hand-written site descriptions with the chosen behavior.
Validation
cargo test --test standards_1795 --test fix_pass --test fix_run: 24 passed, 3 fixture entry points ignored. Standalone scratch reproducer: 1 passed, 1 fixture entry point ignored; evidence at target/triage-evidence/repro.rs and target/triage-evidence/repro.log. scripts/affected-tests main: no changed files, no affected tests. Source files and Git history remain unchanged.
The repository reproduces the reported failures: two successive merge-goal Fix Passes repaired two unreviewed PRs but recorded failed Commands. The exact-head review gate correctly prevented Self-merge.
Should a merge-goal Fix Pass skip PRs lacking recorded authorship or review evidence and continue searching (recommended), or repair them and finish successfully Ready for review? Skipping defers repair until evidence exists; successful handoff requires changing the requested-merge outcome contract.
If choosing successful handoff, should it apply only to Pass-dispatched Fix runs or also targeted Fix runs? Recommend limiting this issue to Passes and retaining existing outcomes for other policy, security and protected-path holds.
Activity
JacobStephens2 commentedon Nov 11, 2026
Investigation summary
Confirmed on selected Base commit de91156. A scratch reproducer ran two successive
fix merge no-base-fix no-emailPasses against real fixture Git repositories and fake services. Each selected a different unreviewed PR, successfully repaired CI, left the PR open and ready, then exited 1 and recordedoutcome=failed. Reservations and in-progress labels were released.Diagnosis and evidence
src/fix.rs:62–90selects candidates usingneeds_fix, which checks conflict/current-head CI eligibility without checking review evidence (src/github/review.rs:75–108).src/fix.rs:175–184checks the actual adopted head and sets a Self-merge hold when evidence is absent.src/pull_request.rs:550raises MergeHold. Delivery preserves the ready PR, butsrc/run_ending.rs:551–568classifies this hold as failed.src/logs/reading/inbox.rs:234consequently identifies a failed Command for Needs you.tests/standards_1795.rs:91explicitly expects exit 1 for this hold, so the failure behavior is intentional under the current contract.src/github/review.rs:196–205,248–272). A fix must retain all currently accepted evidence and the acquired-head check.Recommended next step
Prefer skipping heads without this evidence during merge-goal Fix Pass selection, logging the review requirement and continuing to the next candidate. Resolve the effective goal from flags and User config. Keep no-merge repair eligibility and targeted Fix behavior unchanged. Preserve the acquired-head guard against branch movement; missing or stale evidence must never permit Self-merge. This keeps ADR 0004's merge rule intact.
The Day shift must select whether repair should instead proceed and finish successfully Ready for review despite the requested merge. That changes the outcome contract and requires different implementation and tests.
After the decision, cover candidate ordering past an unreviewed PR, all-skipped success without failure notification, authored/reviewed evidence, merge defaults and explicit no-merge, reservation cleanup, and acquired-head races. Update the Fix-run glossary/manual and hand-written site descriptions with the chosen behavior.
Validation
cargo test --test standards_1795 --test fix_pass --test fix_run: 24 passed, 3 fixture entry points ignored. Standalone scratch reproducer: 1 passed, 1 fixture entry point ignored; evidence attarget/triage-evidence/repro.rsandtarget/triage-evidence/repro.log.scripts/affected-tests main: no changed files, no affected tests. Source files and Git history remain unchanged.Questionnaire
For the Day shift deciding issue #2020:
The repository reproduces the reported failures: two successive merge-goal Fix Passes repaired two unreviewed PRs but recorded failed Commands. The exact-head review gate correctly prevented Self-merge.