story-kit: merge 247_story_human_qa_gate_with_rejection_flow

This commit is contained in:
Dave
2026-03-18 15:45:45 +00:00
parent 1faacd7812
commit 9352443555
11 changed files with 557 additions and 26 deletions

View File

@@ -24,6 +24,12 @@ pub struct UpcomingStory {
pub merge_failure: Option<String>,
/// Active agent working on this item, if any.
pub agent: Option<AgentAssignment>,
/// True when the item is held in QA for human review.
#[serde(skip_serializing_if = "Option::is_none")]
pub review_hold: Option<bool>,
/// Whether the item requires manual QA (defaults to true when absent).
#[serde(skip_serializing_if = "Option::is_none")]
pub manual_qa: Option<bool>,
}
pub struct StoryValidationResult {
@@ -117,12 +123,12 @@ fn load_stage_items(
.to_string();
let contents = fs::read_to_string(&path)
.map_err(|e| format!("Failed to read story file {}: {e}", path.display()))?;
let (name, error, merge_failure) = match parse_front_matter(&contents) {
Ok(meta) => (meta.name, None, meta.merge_failure),
Err(e) => (None, Some(e.to_string()), None),
let (name, error, merge_failure, review_hold, manual_qa) = match parse_front_matter(&contents) {
Ok(meta) => (meta.name, None, meta.merge_failure, meta.review_hold, meta.manual_qa),
Err(e) => (None, Some(e.to_string()), None, None, None),
};
let agent = agent_map.get(&story_id).cloned();
stories.push(UpcomingStory { story_id, name, error, merge_failure, agent });
stories.push(UpcomingStory { story_id, name, error, merge_failure, agent, review_hold, manual_qa });
}
stories.sort_by(|a, b| a.story_id.cmp(&b.story_id));