huskies: merge 945

This commit is contained in:
dave
2026-05-13 06:09:34 +00:00
parent 3a8894ea8f
commit 9ce5a8df0c
53 changed files with 497 additions and 654 deletions
+53 -7
View File
@@ -59,6 +59,15 @@ pub enum PipelineEvent {
Close,
/// Manual demotion back to backlog from an active stage.
Demote,
/// Story 945: freeze a story at its current stage.
Freeze,
/// Story 945: unfreeze a frozen story, returning to `resume_to`.
Unfreeze,
/// Story 945: clear a `ReviewHold`, returning to `resume_to`.
ReviewHoldCleared,
/// Story 945: mergemaster has been auto-spawned and gave up; transitions
/// `Stage::MergeFailure` → `Stage::MergeFailureFinal`.
MergemasterAttempted,
}
// ── Per-node execution events ───────────────────────────────────────────────
@@ -98,6 +107,10 @@ pub fn event_label(e: &PipelineEvent) -> &'static str {
PipelineEvent::Triage => "Triage",
PipelineEvent::Close => "Close",
PipelineEvent::Demote => "Demote",
PipelineEvent::Freeze => "Freeze",
PipelineEvent::Unfreeze => "Unfreeze",
PipelineEvent::ReviewHoldCleared => "ReviewHoldCleared",
PipelineEvent::MergemasterAttempted => "MergemasterAttempted",
}
}
@@ -172,13 +185,16 @@ pub fn transition(state: Stage, event: PipelineEvent) -> Result<Stage, Transitio
| (Qa, Block { reason })
| (Merge { .. }, Block { reason }) => Ok(Blocked { reason }),
(Backlog, ReviewHold { reason })
| (Coding, ReviewHold { reason })
| (Qa, ReviewHold { reason })
| (Merge { .. }, ReviewHold { reason }) => Ok(Archived {
archived_at: now,
reason: ArchiveReason::ReviewHeld { reason },
}),
// Story 945: ReviewHold no longer auto-archives. It transitions the
// story to `Stage::ReviewHold { resume_to, reason }`, preserving the
// current stage as the resume target so a reviewer can clear the
// hold and continue.
(s @ (Backlog | Coding | Qa | Merge { .. }), PipelineEvent::ReviewHold { reason }) => {
Ok(Stage::ReviewHold {
resume_to: Box::new(s),
reason,
})
}
// ── MergeFailed: Merge → MergeFailure (recoverable intermediate) ──
(Merge { .. }, MergeFailed { reason }) => Ok(MergeFailure { reason }),
@@ -239,6 +255,36 @@ pub fn transition(state: Stage, event: PipelineEvent) -> Result<Stage, Transitio
merge_commit: GitSha("closed".to_string()),
}),
// ── Freeze: any non-terminal stage → Frozen { resume_to } ──────
(
s @ (Upcoming
| Backlog
| Coding
| Qa
| Merge { .. }
| Blocked { .. }
| MergeFailure { .. }
| MergeFailureFinal { .. }
| Stage::ReviewHold { .. }),
Freeze,
) => Ok(Frozen {
resume_to: Box::new(s),
}),
// ── Unfreeze: Frozen → resume_to ───────────────────────────────
(Frozen { resume_to }, Unfreeze) => Ok(*resume_to),
// ── ReviewHoldCleared: ReviewHold → resume_to ──────────────────
(Stage::ReviewHold { resume_to, .. }, ReviewHoldCleared) => Ok(*resume_to),
// ── MergemasterAttempted: MergeFailure → MergeFailureFinal ─────
(MergeFailure { reason }, MergemasterAttempted) => Ok(MergeFailureFinal { reason }),
(MergeFailureFinal { reason }, MergemasterAttempted) => Ok(MergeFailureFinal { reason }),
// ── Unblock: from Frozen/ReviewHold → resume_to ────────────────
(Frozen { resume_to }, Unblock) => Ok(*resume_to),
(Stage::ReviewHold { resume_to, .. }, Unblock) => Ok(*resume_to),
// ── Unblock: Blocked → Coding ─────────────────────────────────
(Blocked { .. }, Unblock) => Ok(Coding),