diff --git a/hive-c0re/src/actions.rs b/hive-c0re/src/actions.rs index ca41dfe9..dfdb298c 100644 --- a/hive-c0re/src/actions.rs +++ b/hive-c0re/src/actions.rs @@ -64,15 +64,30 @@ pub async fn approve(coord: Arc, id: i64) -> Result<()> { // dashboard can show *which* inputs are about to bump. let inputs: Vec = serde_json::from_str(&approval.commit_ref).unwrap_or_default(); - coord.rebuild_queue.enqueue_full( + let parent_id = coord.rebuild_queue.enqueue_full( crate::rebuild_queue::QueueKind::MetaUpdate, approval.agent.clone(), crate::rebuild_queue::QueueSource::Approval, format!("approval #{id} meta input update"), None, - inputs, + inputs.clone(), Some(id), ); + // Pre-enqueue cascade rebuilds in topological order so + // agents depending on updated inputs are rebuilt after the + // lock bump, matching the dashboard post_meta_update path. + let cascade_agents = + crate::rebuild_queue::meta_update_cascade_agents(&inputs).await; + let cascade_reason = format!("approval #{id} meta input cascade"); + for name in cascade_agents { + coord.rebuild_queue.enqueue( + crate::rebuild_queue::QueueKind::Rebuild, + name, + crate::rebuild_queue::QueueSource::MetaUpdate, + cascade_reason.clone(), + Some(parent_id), + ); + } coord.emit_rebuild_queue_snapshot(); Ok(()) }