huskies: merge 1010

This commit is contained in:
dave
2026-05-14 08:07:43 +00:00
parent 4520e0e6f9
commit 13ab97a615
27 changed files with 572 additions and 95 deletions
+27 -1
View File
@@ -211,6 +211,30 @@ pub fn set_qa_mode(story_id: &str, mode: Option<QaMode>) -> bool {
true
}
/// Set the `plan_state` CRDT register for a pipeline item (story 1010).
///
/// Encodes the PLAN.md lifecycle as a wire string (`"missing"`, `"drafted"`,
/// `"confirmed"`). Called by the filesystem watcher when PLAN.md is created,
/// modified, or removed inside a coding worktree.
///
/// Returns `true` if the item was found and the op was applied, `false` otherwise.
pub fn set_plan_state(story_id: &str, state: crate::pipeline_state::PlanState) -> bool {
let Some(state_mutex) = get_crdt() else {
return false;
};
let Ok(mut crdt_state) = state_mutex.lock() else {
return false;
};
let Some(&idx) = crdt_state.index.get(story_id) else {
return false;
};
let value = state.as_str().to_string();
apply_and_persist(&mut crdt_state, |s| {
s.crdt.doc.items[idx].plan_state.set(value)
});
true
}
/// Write a pipeline item state through CRDT operations.
///
/// If the item exists, updates its registers. If not, inserts a new item
@@ -232,7 +256,7 @@ pub fn write_item(
) {
let stage_str = stage_dir_name(stage);
let claim: Option<&AgentClaim> = match stage {
Stage::Coding { claim } => claim.as_ref(),
Stage::Coding { claim, .. } => claim.as_ref(),
Stage::Merge { claim, .. } => claim.as_ref(),
_ => None,
};
@@ -350,6 +374,7 @@ pub fn write_item(
"item_type": "",
"epic": "",
"resume_to": "",
"plan_state": "",
})
.into();
@@ -378,6 +403,7 @@ pub fn write_item(
item.item_type.advance_seq(floor);
item.epic.advance_seq(floor);
item.resume_to.advance_seq(floor);
item.plan_state.advance_seq(floor);
}
// Broadcast a CrdtEvent for the new item.
+9 -3
View File
@@ -333,7 +333,7 @@ mod stage_migration_tests {
use super::super::item::write_item;
use super::*;
use crate::crdt_state::read_item;
use crate::pipeline_state::{BranchName, Stage};
use crate::pipeline_state::{BranchName, PlanState, Stage};
use std::num::NonZeroU32;
/// Seed a pipeline item with a raw, possibly-legacy stage register value,
@@ -370,7 +370,10 @@ mod stage_migration_tests {
(
"9503_legacy_coding",
"2_current",
Stage::Coding { claim: None },
Stage::Coding {
claim: None,
plan: PlanState::Missing,
},
),
(
"9504_legacy_blocked",
@@ -452,7 +455,10 @@ mod stage_migration_tests {
// Seed two items: one already in clean form, one in legacy form.
write_item(
"9520_already_clean",
&Stage::Coding { claim: None },
&Stage::Coding {
claim: None,
plan: PlanState::Missing,
},
Some("Already Clean"),
None,
None,
+2 -2
View File
@@ -10,8 +10,8 @@ mod migrations;
mod tests;
pub use item::{
bump_retry_count, set_agent, set_depends_on, set_epic, set_item_type, set_name, set_qa_mode,
set_resume_to, set_resume_to_raw, set_retry_count, write_item,
bump_retry_count, set_agent, set_depends_on, set_epic, set_item_type, set_name, set_plan_state,
set_qa_mode, set_resume_to, set_resume_to_raw, set_retry_count, write_item,
};
#[cfg(test)]