huskies: merge 973

This commit is contained in:
dave
2026-05-13 14:02:16 +00:00
parent e9a7468d8a
commit 4b18c01835
4 changed files with 117 additions and 0 deletions
+11
View File
@@ -338,6 +338,8 @@ fn map_stage_move_to_event(
// Story 919: MergeFailure + Unblock goes to Merge (re-attempt); manual
// demotion to backlog uses Demote to park it without a retry.
(Stage::MergeFailure { .. }, "backlog") => Ok(PipelineEvent::Demote),
// Story 973: abort an in-flight merge, sending the story back to Coding.
(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),
// Story 972: send MergeFailure story back to Qa for a QA agent to re-review.
@@ -408,6 +410,15 @@ pub fn move_story_to_stage(story_id: &str, target_stage: &str) -> Result<(String
crate::crdt_state::set_retry_count(story_id, 1);
}
// Story 973: when aborting an in-flight merge, mark the CRDT merge job as
// "cancelled" so the background task skips state-machine transitions and
// watcher notifications once the git operation finishes.
if matches!(event, PipelineEvent::MergeAborted)
&& let Some(job) = crate::crdt_state::read_merge_job(story_id)
{
crate::crdt_state::write_merge_job(story_id, "cancelled", job.started_at, None, None);
}
Ok((from_name.to_string(), target_stage.to_string()))
}
@@ -111,6 +111,18 @@ impl AgentPool {
tokio::spawn(async move {
let report = pool.run_merge_pipeline(&root, &sid).await;
// Story 973: if the story was aborted (Merge → Coding) while the git
// operation was running, skip state-machine transitions and watcher
// notifications — they would reference the wrong stage.
if let Some(job) = crate::crdt_state::read_merge_job(&sid)
&& job.status == "cancelled"
{
crate::crdt_state::delete_merge_job(&sid);
pool.auto_assign_available_work(&root).await;
return;
}
let success = matches!(&report, Ok(r) if r.success);
let finished_at = unix_now();