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:
Timmy
2026-05-12 19:03:51 +01:00
parent 03a99b3cf1
commit f775f4cfb9
6 changed files with 42 additions and 39 deletions
+6 -1
View File
@@ -230,8 +230,13 @@ pub(super) async fn run_agent_spawn(
// Read the story's front matter to find the epic ID, then load the epic's
// content and prepend it to the system prompt so the agent treats it as
// authoritative context.
//
// Epic linkage has no CRDT register yet (story 933) — wrap the parse in
// `yaml_residue` so the gap is grep-findable.
if let Some(story_content) = crate::db::read_content(&sid)
&& let Ok(meta) = crate::db::yaml_legacy::parse_front_matter(&story_content)
&& let Ok(meta) = crate::db::yaml_legacy::yaml_residue(
crate::db::yaml_legacy::parse_front_matter(&story_content),
)
&& let Some(ref epic_id) = meta.epic
&& let Some(epic_content) = crate::db::read_content(epic_id)
{