huskies: merge 1086 story Pipeline+Status split — Step C: migrate auto-assign, subscribers, and lifecycle transitions to read Pipeline + Status
This commit is contained in:
@@ -1,29 +1,39 @@
|
||||
//! Backlog promotion: scan `1_backlog/` and promote stories whose `depends_on` are all met.
|
||||
//! Backlog promotion: scan items in `Pipeline::Backlog` and promote stories whose `depends_on` are all met.
|
||||
|
||||
use crate::pipeline_state::Stage;
|
||||
use crate::pipeline_state::Pipeline;
|
||||
use crate::slog;
|
||||
use crate::slog_warn;
|
||||
|
||||
use super::super::AgentPool;
|
||||
use super::scan::scan_stage_items;
|
||||
use super::story_checks::{check_archived_dependencies, has_unmet_dependencies};
|
||||
|
||||
impl AgentPool {
|
||||
/// Scan `1_backlog/` and promote any story whose `depends_on` are all met.
|
||||
/// Scan items in `Pipeline::Backlog` and promote any story whose `depends_on` are all met.
|
||||
///
|
||||
/// A story is only promoted if it explicitly lists `depends_on` AND every
|
||||
/// listed dependency has reached `5_done` or `6_archived`. Stories with no
|
||||
/// `depends_on` are left in the backlog for human scheduling.
|
||||
/// listed dependency has reached `Pipeline::Done` or `Pipeline::Archived`.
|
||||
/// Stories with no `depends_on` are left in the backlog for human scheduling.
|
||||
///
|
||||
/// **Archived dep semantics:** a dep in `6_archived` counts as satisfied (since
|
||||
/// stories auto-sweep from `5_done` to `6_archived` after 4 hours, and the
|
||||
/// **Archived dep semantics:** a dep in `Pipeline::Archived` counts as satisfied
|
||||
/// (since stories auto-sweep from `Done` to `Archived` after 4 hours, and the
|
||||
/// dependent story would normally already be promoted by then). However, if a
|
||||
/// dep was already in `6_archived` when the dependent story was created (e.g. it
|
||||
/// dep was already archived when the dependent story was created (e.g. it
|
||||
/// was abandoned/superseded before the dependent existed), a prominent warning is
|
||||
/// logged so the user can see the promotion was triggered by an archived dep, not
|
||||
/// a clean completion.
|
||||
pub(super) fn promote_ready_backlog_stories(&self) {
|
||||
let items = scan_stage_items(&Stage::Backlog);
|
||||
// Story 1086: scan by Pipeline column, not Stage variant. Pipeline::Backlog
|
||||
// covers Stage::Upcoming and Stage::Backlog uniformly.
|
||||
let items: Vec<String> = {
|
||||
use std::collections::BTreeSet;
|
||||
let mut ids = BTreeSet::new();
|
||||
for item in crate::pipeline_state::read_all_typed() {
|
||||
if item.stage.pipeline() == Pipeline::Backlog {
|
||||
ids.insert(item.story_id.0.clone());
|
||||
}
|
||||
}
|
||||
ids.into_iter().collect()
|
||||
};
|
||||
for story_id in &items {
|
||||
// Only promote stories that explicitly declare dependencies
|
||||
// (story 929: read from the CRDT register, not YAML).
|
||||
|
||||
Reference in New Issue
Block a user