huskies: merge 919

This commit is contained in:
dave
2026-05-13 06:27:10 +00:00
parent 9ce5a8df0c
commit 09a8edc0a1
7 changed files with 146 additions and 48 deletions
+39 -8
View File
@@ -197,13 +197,34 @@ pub fn transition(state: Stage, event: PipelineEvent) -> Result<Stage, Transitio
}
// ── MergeFailed: Merge → MergeFailure (recoverable intermediate) ──
(Merge { .. }, MergeFailed { reason }) => Ok(MergeFailure { reason }),
(
Merge {
feature_branch,
commits_ahead,
},
MergeFailed { reason },
) => Ok(MergeFailure {
reason,
feature_branch,
commits_ahead,
}),
// ── MergeFailure self-loop: repeated failure is a no-op ─────────────
// When the mergemaster retries and fails again while the story is already
// in MergeFailure, treat it as a silent self-transition so callers can
// detect the no-op via `fired.before == MergeFailure` and skip re-notifying.
(MergeFailure { .. }, MergeFailed { reason }) => Ok(MergeFailure { reason }),
(
MergeFailure {
feature_branch,
commits_ahead,
..
},
MergeFailed { reason },
) => Ok(MergeFailure {
reason,
feature_branch,
commits_ahead,
}),
(Merge { .. }, MergeFailedFinal { reason }) => Ok(Archived {
archived_at: now,
@@ -278,7 +299,7 @@ pub fn transition(state: Stage, event: PipelineEvent) -> Result<Stage, Transitio
(Stage::ReviewHold { resume_to, .. }, ReviewHoldCleared) => Ok(*resume_to),
// ── MergemasterAttempted: MergeFailure → MergeFailureFinal ─────
(MergeFailure { reason }, MergemasterAttempted) => Ok(MergeFailureFinal { reason }),
(MergeFailure { reason, .. }, MergemasterAttempted) => Ok(MergeFailureFinal { reason }),
(MergeFailureFinal { reason }, MergemasterAttempted) => Ok(MergeFailureFinal { reason }),
// ── Unblock: from Frozen/ReviewHold → resume_to ────────────────
@@ -288,11 +309,21 @@ pub fn transition(state: Stage, event: PipelineEvent) -> Result<Stage, Transitio
// ── Unblock: Blocked → Coding ─────────────────────────────────
(Blocked { .. }, Unblock) => Ok(Coding),
// ── Unblock MergeFailure → Coding (retry) ────────────────────────
// `unblock_story` on a failed merge re-enters the coding stage so a
// coder agent can rework the branch, rather than routing back through
// the backlog (which would require an extra DepsMet promotion step).
(MergeFailure { .. }, Unblock) => Ok(Coding),
// ── Unblock MergeFailure → Merge (re-attempt) ────────────────────
// `unblock_story` on a failed merge re-queues it for merge, restoring
// the exact `Merge { feature_branch, commits_ahead }` that was in place
// before the failure so the mergemaster can retry immediately.
(
MergeFailure {
feature_branch,
commits_ahead,
..
},
Unblock,
) => Ok(Merge {
feature_branch,
commits_ahead,
}),
// ── Demote MergeFailure → Backlog (manual parking) ───────────────
// Lets operators park a failed-merge story in the backlog without an