feat: MergeFailureFinal → Coding via operator FixupRequested

MergeFailureFinal was unreachable from move_story: the only transitions
out were Freeze (→ Frozen) and a self-loop on MergemasterAttempted, so
once mergemaster exhausted its 3-retry budget the only way to get a
story coding again was to delete + recreate it.

The respawn budget is a mergemaster bookkeeping detail, not a hard
ceiling. A human operator inspecting a Final story can reasonably
decide the gate failure is fixable, so this adds the same
FixupRequested → Coding edge that already exists for plain
MergeFailure.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Timmy
2026-05-13 20:21:48 +01:00
parent b6898886d7
commit 75dc1fc15a
2 changed files with 12 additions and 0 deletions
+3
View File
@@ -411,6 +411,9 @@ fn map_stage_move_to_event(
(Stage::Merge { .. }, "current") => Ok(PipelineEvent::MergeAborted),
// Story 971: send MergeFailure story back to Coding so a coder can fix it.
(Stage::MergeFailure { .. }, "current") => Ok(PipelineEvent::FixupRequested),
// Operator override on the exhausted-respawn terminal state: still
// a coder fixup, but reached via the budget-exhausted path.
(Stage::MergeFailureFinal { .. }, "current") => Ok(PipelineEvent::FixupRequested),
// Story 972: send MergeFailure story back to Qa for a QA agent to re-review.
(Stage::MergeFailure { .. }, "qa") => Ok(PipelineEvent::ReQueuedForQa),
// Story 974: reopen a Done story for a post-merge hotfix.