From 2346602b3010a744c0a373373b9d703dfc6d5282 Mon Sep 17 00:00:00 2001 From: Dave Date: Thu, 19 Mar 2026 00:53:00 +0000 Subject: [PATCH] fix: default manual_qa to false so stories advance automatically MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bug 283 was implemented with manual_qa defaulting to true, causing all stories to hold in QA for human review. Changed to default false as originally specified — stories advance automatically unless explicitly opted in with manual_qa: true. Co-Authored-By: Claude Opus 4.6 (1M context) --- server/src/agents/pool.rs | 2 +- server/src/io/story_metadata.rs | 18 +++++++++++++----- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/server/src/agents/pool.rs b/server/src/agents/pool.rs index db7ce43..b13c8cc 100644 --- a/server/src/agents/pool.rs +++ b/server/src/agents/pool.rs @@ -895,7 +895,7 @@ impl AgentPool { if item_type == "spike" { true // Spikes always need human review. } else { - // Stories/bugs: check the manual_qa front matter field (defaults to true). + // Stories/bugs: check the manual_qa front matter field (defaults to false). let qa_dir = project_root.join(".story_kit/work/3_qa"); let story_path = qa_dir.join(format!("{story_id}.md")); crate::io::story_metadata::requires_manual_qa(&story_path) diff --git a/server/src/io/story_metadata.rs b/server/src/io/story_metadata.rs index 51e7f9c..23129ae 100644 --- a/server/src/io/story_metadata.rs +++ b/server/src/io/story_metadata.rs @@ -210,15 +210,15 @@ pub fn write_rejection_notes(path: &Path, notes: &str) -> Result<(), String> { Ok(()) } -/// Check whether a story requires manual QA (defaults to true). +/// Check whether a story requires manual QA (defaults to false). pub fn requires_manual_qa(path: &Path) -> bool { let contents = match fs::read_to_string(path) { Ok(c) => c, - Err(_) => return true, + Err(_) => return false, }; match parse_front_matter(&contents) { - Ok(meta) => meta.manual_qa.unwrap_or(true), - Err(_) => true, + Ok(meta) => meta.manual_qa.unwrap_or(false), + Err(_) => false, } } @@ -412,10 +412,18 @@ workflow: tdd } #[test] - fn requires_manual_qa_defaults_true() { + fn requires_manual_qa_defaults_false() { let tmp = tempfile::tempdir().unwrap(); let path = tmp.path().join("story.md"); std::fs::write(&path, "---\nname: Test\n---\n# Story\n").unwrap(); + assert!(!requires_manual_qa(&path)); + } + + #[test] + fn requires_manual_qa_true_when_set() { + let tmp = tempfile::tempdir().unwrap(); + let path = tmp.path().join("story.md"); + std::fs::write(&path, "---\nname: Test\nmanual_qa: true\n---\n# Story\n").unwrap(); assert!(requires_manual_qa(&path)); }