wip(929): stage 4 — migrate agents/pool/* + lifecycle.rs read sides off yaml_legacy
Read-side migrations: - agents/pool/auto_assign/backlog.rs: depends_on check now reads from WorkItem.depends_on() instead of parse_front_matter. - agents/pool/auto_assign/story_checks.rs: read_story_front_matter_agent drops its YAML fallback — post-891 the CRDT entry is reliable, and removing the fallback makes the contract honest. The now-unused read_story_contents helper goes too. - agents/pool/start/validation.rs: same shape — YAML fallback removed, CRDT register is the only source for agent pinning. - agents/pool/start/spawn.rs: epic-context injection wraps the parse_front_matter call in `yaml_residue(...)` since `meta.epic` has no CRDT analog (sub-story 933). - agents/lifecycle.rs: item_type_from_id (numeric-only ID path) wraps its parse_front_matter in `yaml_residue(...)` for the same reason (933). The write-side `fields_to_clear_transform` calls in lifecycle.rs are left for stage 8, when FS-shadow writes are deleted wholesale. Test fix: - start_agent_returns_error_when_front_matter_agent_busy now seeds the CRDT entry (write_item with agent="coder-opus") instead of relying on parse_front_matter reading the YAML on disk. Filed earlier: - 932 (review_hold register) — note: this turns out to be a real class-1 bug: write_review_hold_to_store still writes YAML but has_review_hold reads Stage::Frozen, so the write goes into a void. 932 is the correct fix. All 2861 tests pass; fmt + clippy clean. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -2,11 +2,6 @@
|
||||
|
||||
use std::path::Path;
|
||||
|
||||
/// Read story contents from the DB content store (CRDT-backed).
|
||||
fn read_story_contents(_project_root: &Path, story_id: &str) -> Option<String> {
|
||||
crate::db::read_content(story_id)
|
||||
}
|
||||
|
||||
/// Read the optional `agent:` pin for a story.
|
||||
///
|
||||
/// After story 871 the agent assignment lives in the CRDT typed register
|
||||
@@ -14,19 +9,16 @@ fn read_story_contents(_project_root: &Path, story_id: &str) -> Option<String> {
|
||||
/// first; falling back to legacy YAML parsing keeps behaviour intact for any
|
||||
/// stories whose CRDT entry doesn't yet have the field set.
|
||||
pub(super) fn read_story_front_matter_agent(
|
||||
project_root: &Path,
|
||||
_project_root: &Path,
|
||||
_stage_dir: &str,
|
||||
story_id: &str,
|
||||
) -> Option<String> {
|
||||
if let Some(view) = crate::crdt_state::read_item(story_id)
|
||||
&& let Some(agent) = view.agent()
|
||||
&& !agent.is_empty()
|
||||
{
|
||||
return Some(agent.to_string());
|
||||
}
|
||||
use crate::db::yaml_legacy::parse_front_matter;
|
||||
let contents = read_story_contents(project_root, story_id)?;
|
||||
parse_front_matter(&contents).ok()?.agent
|
||||
// Story 929: agent name comes from the CRDT register. The previous
|
||||
// YAML fallback is gone — post-891 every story has its CRDT entry,
|
||||
// and any story without one is treated as having no pinned agent.
|
||||
crate::crdt_state::read_item(story_id)
|
||||
.and_then(|w| w.agent().map(str::to_string))
|
||||
.filter(|s| !s.is_empty())
|
||||
}
|
||||
|
||||
/// Return `true` if the story is in the `Frozen` pipeline stage.
|
||||
|
||||
Reference in New Issue
Block a user