huskies: merge 945

This commit is contained in:
dave
2026-05-13 06:05:01 +00:00
parent 3a8894ea8f
commit 9ce5a8df0c
53 changed files with 497 additions and 654 deletions
+14 -14
View File
@@ -127,20 +127,20 @@ pub(crate) fn tool_show_epic(args: &Value, _ctx: &AppContext) -> Result<String,
continue;
};
if member_view.epic() == Some(epic_id) {
// Frozen is now an orthogonal CRDT flag (story 934, stage 4).
let stage_name = if member_view.frozen() {
"frozen"
} else {
match &item.stage {
Stage::Upcoming | Stage::Backlog => "backlog",
Stage::Coding => "current",
Stage::Qa => "qa",
Stage::Merge { .. } => "merge",
Stage::Done { .. } => "done",
Stage::Archived { .. } => "archived",
Stage::MergeFailure { .. } => "merge_failure",
Stage::Blocked { .. } => "blocked",
}
// Story 945: Frozen / ReviewHold / MergeFailureFinal are first-class
// Stage variants — no more orthogonal boolean flags.
let stage_name = match &item.stage {
Stage::Upcoming | Stage::Backlog => "backlog",
Stage::Coding => "current",
Stage::Qa => "qa",
Stage::Merge { .. } => "merge",
Stage::Done { .. } => "done",
Stage::Archived { .. } => "archived",
Stage::MergeFailure { .. } => "merge_failure",
Stage::MergeFailureFinal { .. } => "merge_failure_final",
Stage::Blocked { .. } => "blocked",
Stage::Frozen { .. } => "frozen",
Stage::ReviewHold { .. } => "review_hold",
};
if matches!(item.stage, Stage::Done { .. }) {
done += 1;
@@ -91,12 +91,30 @@ pub(crate) fn tool_update_story(args: &Value, ctx: &AppContext) -> Result<String
}
}
"review_hold" => {
if let Some(b) = value.as_bool() {
crate::crdt_state::set_review_hold(story_id, b);
} else if value.as_str() == Some("true") {
crate::crdt_state::set_review_hold(story_id, true);
} else if value.as_str() == Some("false") {
crate::crdt_state::set_review_hold(story_id, false);
let want_hold = match value {
Value::Bool(b) => Some(*b),
Value::String(s) if s == "true" => Some(true),
Value::String(s) if s == "false" => Some(false),
_ => None,
};
match want_hold {
Some(true) => {
crate::pipeline_state::apply_transition_str(
story_id,
crate::pipeline_state::PipelineEvent::ReviewHold {
reason: "Set via update_story".to_string(),
},
None,
)?;
}
Some(false) => {
crate::pipeline_state::apply_transition_str(
story_id,
crate::pipeline_state::PipelineEvent::ReviewHoldCleared,
None,
)?;
}
None => {}
}
}
"frozen" => {
@@ -126,8 +144,12 @@ pub(crate) fn tool_update_story(args: &Value, ctx: &AppContext) -> Result<String
}
}
"mergemaster_attempted" => {
if let Some(b) = value.as_bool() {
crate::crdt_state::set_mergemaster_attempted(story_id, b);
if let Some(true) = value.as_bool() {
crate::pipeline_state::apply_transition_str(
story_id,
crate::pipeline_state::PipelineEvent::MergemasterAttempted,
None,
)?;
}
}
other => {