diff --git a/crates/arc-attractor/src/cli/mod.rs b/crates/arc-attractor/src/cli/mod.rs index 8b2825f11..d0d813dbf 100644 --- a/crates/arc-attractor/src/cli/mod.rs +++ b/crates/arc-attractor/src/cli/mod.rs @@ -206,8 +206,8 @@ pub fn format_duration_human(ms: u64) -> String { #[must_use] pub fn format_event_summary(event: &PipelineEvent, styles: &Styles) -> String { let body = match event { - PipelineEvent::PipelineStarted { name, id, .. } => { - format!("[PIPELINE_STARTED] name={name} id={id}") + PipelineEvent::PipelineStarted { name, run_id, .. } => { + format!("[PIPELINE_STARTED] name={name} id={run_id}") } PipelineEvent::PipelineCompleted { duration_ms, @@ -492,9 +492,9 @@ pub fn format_event_detail(event: &PipelineEvent, styles: &Styles) -> String { let r = styles.reset; match event { - PipelineEvent::PipelineStarted { name, id, .. } => { + PipelineEvent::PipelineStarted { name, run_id, .. } => { format!( - "{d}── PIPELINE_STARTED ─────────────────────────{r}\n {d}name:{r} {name}\n {d}id:{r} {id}\n" + "{d}── PIPELINE_STARTED ─────────────────────────{r}\n {d}name:{r} {name}\n {d}id:{r} {run_id}\n" ) } PipelineEvent::PipelineCompleted { diff --git a/crates/arc-attractor/src/cli/run.rs b/crates/arc-attractor/src/cli/run.rs index a183f5ceb..a0883de63 100644 --- a/crates/arc-attractor/src/cli/run.rs +++ b/crates/arc-attractor/src/cli/run.rs @@ -180,8 +180,8 @@ pub async fn run_command(args: RunArgs, styles: &'static Styles) -> anyhow::Resu let run_id = Arc::new(Mutex::new(String::new())); let run_id_clone = Arc::clone(&run_id); emitter.on_event(move |event| { - if let crate::event::PipelineEvent::PipelineStarted { id, .. } = event { - *run_id_clone.lock().unwrap() = id.clone(); + if let crate::event::PipelineEvent::PipelineStarted { run_id, .. } = event { + *run_id_clone.lock().unwrap() = run_id.clone(); } let envelope = serde_json::json!({ "timestamp": Utc::now().to_rfc3339_opts(chrono::SecondsFormat::Millis, true), @@ -480,11 +480,12 @@ pub async fn run_command(args: RunArgs, styles: &'static Styles) -> anyhow::Resu let engine = PipelineEngine::with_interviewer(registry, Arc::clone(&emitter), interviewer, Arc::clone(&execution_env)); // 7. Execute + let run_id = worktree_run_id.unwrap_or_else(|| uuid::Uuid::new_v4().to_string()); let config = RunConfig { logs_root: logs_dir.clone(), cancel_token: None, dry_run: dry_run_mode, - run_id: worktree_run_id, + run_id, work_dir: worktree_work_dir, base_sha: worktree_base_sha, run_branch: worktree_branch, diff --git a/crates/arc-attractor/src/engine.rs b/crates/arc-attractor/src/engine.rs index 1bb218838..9163eb051 100644 --- a/crates/arc-attractor/src/engine.rs +++ b/crates/arc-attractor/src/engine.rs @@ -470,8 +470,8 @@ pub struct RunConfig { pub logs_root: PathBuf, pub cancel_token: Option>, pub dry_run: bool, - /// Pre-assigned run ID. Generated if `None`. - pub run_id: Option, + /// Unique identifier for this pipeline run. + pub run_id: String, /// Git worktree path for checkpoint commits. pub work_dir: Option, /// SHA of the commit the worktree branched from. @@ -706,12 +706,12 @@ impl PipelineEngine { mut node_visits: HashMap, ) -> Result { let run_start = Instant::now(); - let run_id = config.run_id.clone().unwrap_or_else(|| uuid::Uuid::new_v4().to_string()); + let run_id = config.run_id.clone(); let artifact_store = ArtifactStore::new(Some(config.logs_root.clone())); self.services.emitter.emit(&PipelineEvent::PipelineStarted { name: graph.name.clone(), - id: run_id.clone(), + run_id: run_id.clone(), base_sha: config.base_sha.clone(), run_branch: config.run_branch.clone(), worktree_dir: config.work_dir.as_ref().map(|p| p.display().to_string()), @@ -1815,7 +1815,7 @@ mod tests { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -1833,7 +1833,7 @@ mod tests { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -1860,7 +1860,7 @@ mod tests { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -1882,7 +1882,7 @@ mod tests { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -1900,7 +1900,7 @@ mod tests { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -1931,7 +1931,7 @@ mod tests { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -1988,7 +1988,7 @@ mod tests { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -2063,7 +2063,7 @@ mod tests { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -2090,7 +2090,7 @@ mod tests { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -2114,7 +2114,7 @@ mod tests { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -2262,7 +2262,7 @@ mod tests { let dir = tempfile::tempdir().unwrap(); let g = simple_graph(); let engine = PipelineEngine::new(make_registry(), Arc::new(EventEmitter::new()), local_env()); - let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, run_id: None, work_dir: None, base_sha: None, run_branch: None }; + let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None }; engine.run(&g, &config).await.unwrap(); let manifest_path = dir.path().join("manifest.json"); @@ -2284,7 +2284,7 @@ mod tests { g.edges.push(Edge::new("start", "exit")); let engine = PipelineEngine::new(make_registry(), Arc::new(EventEmitter::new()), local_env()); - let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, run_id: None, work_dir: None, base_sha: None, run_branch: None }; + let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None }; engine.run(&g, &config).await.unwrap(); let manifest_path = dir.path().join("manifest.json"); @@ -2320,7 +2320,7 @@ mod tests { let mut registry = make_registry(); registry.register("always_fail", Box::new(AlwaysFailHandler)); let engine = PipelineEngine::new(registry, Arc::new(EventEmitter::new()), local_env()); - let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, run_id: None, work_dir: None, base_sha: None, run_branch: None }; + let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None }; let outcome = engine.run(&g, &config).await.unwrap(); assert_eq!(outcome.status, StageStatus::Success); @@ -2356,7 +2356,7 @@ mod tests { let mut registry = make_registry(); registry.register("always_fail", Box::new(AlwaysFailHandler)); let engine = PipelineEngine::new(registry, Arc::new(EventEmitter::new()), local_env()); - let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, run_id: None, work_dir: None, base_sha: None, run_branch: None }; + let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None }; let result = engine.run(&g, &config).await; assert!(result.is_ok()); @@ -2395,7 +2395,7 @@ mod tests { let mut registry = make_registry(); registry.register("slow", Box::new(SlowHandler { sleep_ms: 500 })); let engine = PipelineEngine::new(registry, Arc::new(EventEmitter::new()), local_env()); - let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, run_id: None, work_dir: None, base_sha: None, run_branch: None }; + let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None }; let result = engine.run(&g, &config).await; assert!(result.is_ok()); @@ -2429,7 +2429,7 @@ mod tests { let mut registry = make_registry(); registry.register("slow", Box::new(SlowHandler { sleep_ms: 10 })); let engine = PipelineEngine::new(registry, Arc::new(EventEmitter::new()), local_env()); - let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, run_id: None, work_dir: None, base_sha: None, run_branch: None }; + let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None }; let outcome = engine.run(&g, &config).await.unwrap(); assert_eq!(outcome.status, StageStatus::Success); } @@ -2460,7 +2460,7 @@ mod tests { let mut registry = make_registry(); registry.register("slow", Box::new(SlowHandler { sleep_ms: 500 })); let engine = PipelineEngine::new(registry, Arc::new(EventEmitter::new()), local_env()); - let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, run_id: None, work_dir: None, base_sha: None, run_branch: None }; + let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None }; let outcome = engine.run(&g, &config).await.unwrap(); assert_eq!(outcome.status, StageStatus::Success); @@ -2514,7 +2514,7 @@ mod tests { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -2545,7 +2545,7 @@ mod tests { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -2574,7 +2574,7 @@ mod tests { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -2595,7 +2595,7 @@ mod tests { logs_root: dir.path().to_path_buf(), cancel_token: Some(cancel_token), dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -2615,7 +2615,7 @@ mod tests { logs_root: dir.path().to_path_buf(), cancel_token: Some(cancel_token), dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -2647,7 +2647,7 @@ mod tests { logs_root: dir.path().to_path_buf(), cancel_token: Some(cancel_token), dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -2723,7 +2723,7 @@ mod tests { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -2746,7 +2746,7 @@ mod tests { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: true, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -2773,7 +2773,7 @@ mod tests { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: true, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -2861,7 +2861,7 @@ mod tests { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, diff --git a/crates/arc-attractor/src/event.rs b/crates/arc-attractor/src/event.rs index 188a94033..03a23b9bb 100644 --- a/crates/arc-attractor/src/event.rs +++ b/crates/arc-attractor/src/event.rs @@ -8,7 +8,7 @@ use crate::outcome::StageUsage; pub enum PipelineEvent { PipelineStarted { name: String, - id: String, + run_id: String, #[serde(default, skip_serializing_if = "Option::is_none")] base_sha: Option, #[serde(default, skip_serializing_if = "Option::is_none")] @@ -240,7 +240,7 @@ mod tests { }); emitter.emit(&PipelineEvent::PipelineStarted { name: "test".to_string(), - id: "1".to_string(), + run_id: "1".to_string(), base_sha: None, run_branch: None, worktree_dir: None, diff --git a/crates/arc-attractor/src/preamble.rs b/crates/arc-attractor/src/preamble.rs index dc0a1f8a5..2f4416904 100644 --- a/crates/arc-attractor/src/preamble.rs +++ b/crates/arc-attractor/src/preamble.rs @@ -23,7 +23,7 @@ pub fn build_preamble( node_outcomes: &HashMap, ) -> String { let goal = graph.goal(); - let run_id = context.get_string("run_id", "unknown"); + let run_id = context.get_string("internal.run_id", "unknown"); match fidelity { "truncate" => { @@ -74,7 +74,6 @@ fn is_context_key_excluded(key: &str) -> bool { || key.starts_with("graph.") || key.starts_with("thread.") || key.starts_with("response.") - || key == "run_id" || key == "outcome" || key == "last_stage" || key == "last_response" @@ -545,7 +544,7 @@ mod tests { AttrValue::String("Fix the login bug".to_string()), ); let context = Context::new(); - context.set("run_id", serde_json::json!("abc-123")); + context.set("internal.run_id", serde_json::json!("abc-123")); let completed_nodes: Vec = Vec::new(); let node_outcomes: HashMap = HashMap::new(); @@ -603,7 +602,7 @@ mod tests { AttrValue::String("Deploy app".to_string()), ); let context = Context::new(); - context.set("run_id", serde_json::json!("run-456")); + context.set("internal.run_id", serde_json::json!("run-456")); let completed_nodes = vec!["plan".to_string(), "code".to_string()]; let mut node_outcomes: HashMap = HashMap::new(); node_outcomes.insert("plan".to_string(), Outcome::success()); @@ -1602,7 +1601,6 @@ mod tests { assert!(is_context_key_excluded("graph.goal")); assert!(is_context_key_excluded("thread.main.current_node")); assert!(is_context_key_excluded("response.plan")); - assert!(is_context_key_excluded("run_id")); assert!(is_context_key_excluded("outcome")); assert!(is_context_key_excluded("last_stage")); assert!(is_context_key_excluded("last_response")); diff --git a/crates/arc-attractor/src/server.rs b/crates/arc-attractor/src/server.rs index 35b792ebb..4ce052568 100644 --- a/crates/arc-attractor/src/server.rs +++ b/crates/arc-attractor/src/server.rs @@ -170,7 +170,7 @@ async fn start_pipeline( } }; - let pipeline_id = uuid::Uuid::new_v4().to_string(); + let run_id = uuid::Uuid::new_v4().to_string(); let interviewer = Arc::new(WebInterviewer::new()); let (event_tx, _) = broadcast::channel(256); let (cancel_tx, cancel_rx) = tokio::sync::oneshot::channel::<()>(); @@ -198,7 +198,7 @@ async fn start_pipeline( { let mut pipelines = state.pipelines.lock().expect("pipelines lock poisoned"); pipelines.insert( - pipeline_id.clone(), + run_id.clone(), ManagedPipeline { dot_source: req.dot_source, status: PipelineStatus::Running, @@ -215,17 +215,17 @@ async fn start_pipeline( // Spawn pipeline execution let state_clone = Arc::clone(&state); - let id_clone = pipeline_id.clone(); + let run_id_clone = run_id.clone(); tokio::spawn(async move { let logs_root = std::env::temp_dir().join(format!("arc-{}", uuid::Uuid::new_v4())); std::fs::create_dir_all(&logs_root).expect("failed to create logs directory"); - let config = RunConfig { logs_root, cancel_token: Some(cancel_token), dry_run: state_clone.dry_run, run_id: None, work_dir: None, base_sha: None, run_branch: None }; + let config = RunConfig { logs_root, cancel_token: Some(cancel_token), dry_run: state_clone.dry_run, run_id: run_id_clone.clone(), work_dir: None, base_sha: None, run_branch: None }; let result = tokio::select! { result = engine.run(&graph, &config) => result, _ = cancel_rx => { let mut pipelines = state_clone.pipelines.lock().expect("pipelines lock poisoned"); - if let Some(pipeline) = pipelines.get_mut(&id_clone) { + if let Some(pipeline) = pipelines.get_mut(&run_id_clone) { pipeline.status = PipelineStatus::Cancelled; pipeline.event_tx = None; } @@ -237,7 +237,7 @@ async fn start_pipeline( let checkpoint = Checkpoint::load(&config.logs_root.join("checkpoint.json")).ok(); let mut pipelines = state_clone.pipelines.lock().expect("pipelines lock poisoned"); - if let Some(pipeline) = pipelines.get_mut(&id_clone) { + if let Some(pipeline) = pipelines.get_mut(&run_id_clone) { match result { Ok(_) => { pipeline.status = PipelineStatus::Completed; @@ -257,7 +257,7 @@ async fn start_pipeline( ( StatusCode::CREATED, - Json(StartPipelineResponse { id: pipeline_id }), + Json(StartPipelineResponse { id: run_id }), ) .into_response() } @@ -582,7 +582,7 @@ mod tests { let response = app.clone().oneshot(req).await.unwrap(); let body = body_json(response.into_body()).await; - let pipeline_id = body["id"].as_str().unwrap().to_string(); + let run_id = body["id"].as_str().unwrap().to_string(); // Give pipeline a moment to start tokio::time::sleep(std::time::Duration::from_millis(10)).await; @@ -590,7 +590,7 @@ mod tests { // Check status let req = Request::builder() .method("GET") - .uri(format!("/pipelines/{pipeline_id}")) + .uri(format!("/pipelines/{run_id}")) .body(Body::empty()) .unwrap(); @@ -598,7 +598,7 @@ mod tests { assert_eq!(response.status(), StatusCode::OK); let body = body_json(response.into_body()).await; - assert_eq!(body["id"].as_str().unwrap(), pipeline_id); + assert_eq!(body["id"].as_str().unwrap(), run_id); // Status should be either "running" or "completed" let status = body["status"].as_str().unwrap(); assert!( @@ -638,12 +638,12 @@ mod tests { let response = app.clone().oneshot(req).await.unwrap(); let body = body_json(response.into_body()).await; - let pipeline_id = body["id"].as_str().unwrap().to_string(); + let run_id = body["id"].as_str().unwrap().to_string(); // Get questions (should be empty for a pipeline without wait.human nodes) let req = Request::builder() .method("GET") - .uri(format!("/pipelines/{pipeline_id}/questions")) + .uri(format!("/pipelines/{run_id}/questions")) .body(Body::empty()) .unwrap(); @@ -702,12 +702,12 @@ mod tests { let response = app.clone().oneshot(req).await.unwrap(); let body = body_json(response.into_body()).await; - let pipeline_id = body["id"].as_str().unwrap().to_string(); + let run_id = body["id"].as_str().unwrap().to_string(); // Get checkpoint immediately (before pipeline completes, may be null) let req = Request::builder() .method("GET") - .uri(format!("/pipelines/{pipeline_id}/checkpoint")) + .uri(format!("/pipelines/{run_id}/checkpoint")) .body(Body::empty()) .unwrap(); @@ -732,12 +732,12 @@ mod tests { let response = app.clone().oneshot(req).await.unwrap(); let body = body_json(response.into_body()).await; - let pipeline_id = body["id"].as_str().unwrap().to_string(); + let run_id = body["id"].as_str().unwrap().to_string(); // Get context let req = Request::builder() .method("GET") - .uri(format!("/pipelines/{pipeline_id}/context")) + .uri(format!("/pipelines/{run_id}/context")) .body(Body::empty()) .unwrap(); @@ -765,12 +765,12 @@ mod tests { let response = app.clone().oneshot(req).await.unwrap(); let body = body_json(response.into_body()).await; - let pipeline_id = body["id"].as_str().unwrap().to_string(); + let run_id = body["id"].as_str().unwrap().to_string(); // Cancel it let req = Request::builder() .method("POST") - .uri(format!("/pipelines/{pipeline_id}/cancel")) + .uri(format!("/pipelines/{run_id}/cancel")) .body(Body::empty()) .unwrap(); @@ -814,12 +814,12 @@ mod tests { let response = app.clone().oneshot(req).await.unwrap(); let body = body_json(response.into_body()).await; - let pipeline_id = body["id"].as_str().unwrap().to_string(); + let run_id = body["id"].as_str().unwrap().to_string(); // Request the SSE stream let req = Request::builder() .method("GET") - .uri(format!("/pipelines/{pipeline_id}/events")) + .uri(format!("/pipelines/{run_id}/events")) .body(Body::empty()) .unwrap(); @@ -856,7 +856,7 @@ mod tests { let response = app.clone().oneshot(req).await.unwrap(); let body = body_json(response.into_body()).await; - let pipeline_id = body["id"].as_str().unwrap().to_string(); + let run_id = body["id"].as_str().unwrap().to_string(); // Poll until pipeline completes let mut status = String::new(); @@ -864,7 +864,7 @@ mod tests { tokio::time::sleep(std::time::Duration::from_millis(10)).await; let req = Request::builder() .method("GET") - .uri(format!("/pipelines/{pipeline_id}")) + .uri(format!("/pipelines/{run_id}")) .body(Body::empty()) .unwrap(); let response = app.clone().oneshot(req).await.unwrap(); @@ -895,12 +895,12 @@ mod tests { let response = app.clone().oneshot(req).await.unwrap(); let body = body_json(response.into_body()).await; - let pipeline_id = body["id"].as_str().unwrap().to_string(); + let run_id = body["id"].as_str().unwrap().to_string(); // Request graph SVG let req = Request::builder() .method("GET") - .uri(format!("/pipelines/{pipeline_id}/graph")) + .uri(format!("/pipelines/{run_id}/graph")) .body(Body::empty()) .unwrap(); @@ -975,7 +975,7 @@ mod tests { let response = app.clone().oneshot(req).await.unwrap(); let body = body_json(response.into_body()).await; - let pipeline_id = body["id"].as_str().unwrap().to_string(); + let run_id = body["id"].as_str().unwrap().to_string(); // List should now contain one pipeline let req = Request::builder() @@ -989,7 +989,7 @@ mod tests { let body = body_json(response.into_body()).await; let items = body.as_array().unwrap(); assert_eq!(items.len(), 1); - assert_eq!(items[0]["id"].as_str().unwrap(), pipeline_id); + assert_eq!(items[0]["id"].as_str().unwrap(), run_id); assert!(items[0]["status"].as_str().is_some()); } } diff --git a/crates/arc-attractor/tests/daytona_integration.rs b/crates/arc-attractor/tests/daytona_integration.rs index 3150d76b9..694691466 100644 --- a/crates/arc-attractor/tests/daytona_integration.rs +++ b/crates/arc-attractor/tests/daytona_integration.rs @@ -270,7 +270,7 @@ async fn daytona_pipeline_artifact_offload_and_sync() { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, diff --git a/crates/arc-attractor/tests/integration.rs b/crates/arc-attractor/tests/integration.rs index f2207d6cf..0178ea5d6 100644 --- a/crates/arc-attractor/tests/integration.rs +++ b/crates/arc-attractor/tests/integration.rs @@ -186,7 +186,7 @@ async fn end_to_end_linear_pipeline() { let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -308,7 +308,7 @@ async fn end_to_end_branching_pipeline() { let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -417,7 +417,7 @@ async fn end_to_end_human_gate_pipeline() { let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -520,7 +520,7 @@ async fn goal_gate_routes_to_retry_target_on_failure() { let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -632,7 +632,7 @@ async fn goal_gate_routes_to_retry_target_when_present() { let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -944,7 +944,7 @@ async fn retry_on_failure_then_succeed() { let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -1010,7 +1010,7 @@ async fn pipeline_with_many_nodes() { let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -1328,7 +1328,7 @@ async fn smoke_test_with_mock_codergen_backend() { let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -1426,7 +1426,7 @@ async fn end_to_end_parallel_fan_out_fan_in() { let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -1533,7 +1533,7 @@ async fn resume_from_checkpoint_completes_pipeline() { let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -1625,7 +1625,7 @@ async fn resume_from_checkpoint_preserves_goal_gate_outcomes() { let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -1659,7 +1659,7 @@ async fn graph_goal_in_context() { let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -1689,7 +1689,7 @@ async fn event_streaming_lifecycle() { let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -1759,7 +1759,7 @@ async fn context_flow_between_stages() { let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -1802,7 +1802,7 @@ async fn tool_handler_e2e() { let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -1863,7 +1863,7 @@ async fn auto_approve_interviewer_e2e() { let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -1890,7 +1890,7 @@ async fn codergen_without_backend_simulated() { let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -1991,7 +1991,7 @@ async fn branching_loop_back_on_failure() { let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -2075,7 +2075,7 @@ async fn human_gate_loops_back() { let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -2127,7 +2127,7 @@ async fn scenario_ship_a_feature() { let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -2207,7 +2207,7 @@ async fn scenario_parallel_expert_review() { let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -2281,7 +2281,7 @@ async fn scenario_node_retries_on_retry_status() { let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -2339,7 +2339,7 @@ async fn scenario_loop_restart_resets_context() { let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -2401,7 +2401,7 @@ async fn scenario_bug_triage_router() { let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -2451,7 +2451,7 @@ async fn scenario_crash_recovery() { let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -2533,7 +2533,7 @@ async fn manager_loop_stop_condition_satisfied_e2e() { let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -2583,7 +2583,7 @@ async fn manager_loop_max_cycles_exceeded_e2e() { let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -2713,7 +2713,7 @@ async fn conditional_branching_success_fail_paths() { let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -2761,7 +2761,7 @@ async fn edge_selection_condition_match_wins_over_weight() { let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -2804,7 +2804,7 @@ async fn edge_selection_weight_breaks_ties() { let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -2839,7 +2839,7 @@ async fn edge_selection_lexical_tiebreak() { let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -2891,7 +2891,7 @@ async fn context_updates_visible_across_nodes() { let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -2925,7 +2925,7 @@ async fn stylesheet_applies_model_override() { let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -2975,7 +2975,7 @@ async fn custom_handler_registration_and_execution() { let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -3036,7 +3036,7 @@ async fn integration_smoke_plan_implement_review_done() { let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -3525,7 +3525,7 @@ async fn sub_pipeline_e2e_through_engine() { let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -3671,7 +3671,7 @@ async fn manager_loop_with_child_observer_e2e() { let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -3794,7 +3794,7 @@ async fn graph_merge_e2e_through_engine() { let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -3938,7 +3938,7 @@ async fn fidelity_default_is_compact() { let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -3981,7 +3981,7 @@ async fn fidelity_graph_default_applied() { let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -4023,7 +4023,7 @@ async fn fidelity_node_overrides_graph_default() { let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -4071,7 +4071,7 @@ async fn fidelity_edge_overrides_node_and_graph() { let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -4109,7 +4109,7 @@ async fn fidelity_full_produces_empty_preamble() { let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -4154,7 +4154,7 @@ async fn fidelity_truncate_preamble_minimal() { let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -4215,7 +4215,7 @@ async fn fidelity_summary_low_mode() { let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -4271,7 +4271,7 @@ async fn fidelity_summary_medium_mode() { let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -4327,7 +4327,7 @@ async fn fidelity_summary_high_mode() { let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -4376,7 +4376,7 @@ async fn fidelity_full_sets_thread_id_in_context() { let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -4436,7 +4436,7 @@ async fn fidelity_full_nodes_share_thread_id() { let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -4503,7 +4503,7 @@ async fn fidelity_resume_degrades_full_to_summary_high() { let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -4586,7 +4586,7 @@ async fn fidelity_resume_degrade_only_affects_first_hop() { let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -4656,7 +4656,7 @@ async fn fidelity_resume_no_degrade_when_not_full() { let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -4692,7 +4692,7 @@ async fn fidelity_stored_in_checkpoint_context() { let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -4767,7 +4767,7 @@ async fn fidelity_precedence_multi_node_pipeline() { let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -4824,7 +4824,7 @@ async fn fidelity_compact_preamble_includes_completed_stages_and_context() { let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -4873,7 +4873,7 @@ async fn fidelity_summary_low_excludes_context_values_in_pipeline() { registry_low.register("exit", Box::new(ExitHandler)); registry_low.register("fidelity_capture", Box::new(FidelityCapturingHandler { captures: captures_low.clone() })); let engine_low = PipelineEngine::new(registry_low, Arc::new(EventEmitter::new()), local_env()); - let config_low = RunConfig { logs_root: dir_low.path().to_path_buf(), cancel_token: None, dry_run: false, run_id: None, work_dir: None, base_sha: None, run_branch: None }; + let config_low = RunConfig { logs_root: dir_low.path().to_path_buf(), cancel_token: None, dry_run: false, run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None }; engine_low.run(&graph_low, &config_low).await.expect("run low"); { @@ -4907,7 +4907,7 @@ async fn fidelity_summary_low_excludes_context_values_in_pipeline() { registry_med.register("exit", Box::new(ExitHandler)); registry_med.register("fidelity_capture", Box::new(FidelityCapturingHandler { captures: captures_med.clone() })); let engine_med = PipelineEngine::new(registry_med, Arc::new(EventEmitter::new()), local_env()); - let config_med = RunConfig { logs_root: dir_med.path().to_path_buf(), cancel_token: None, dry_run: false, run_id: None, work_dir: None, base_sha: None, run_branch: None }; + let config_med = RunConfig { logs_root: dir_med.path().to_path_buf(), cancel_token: None, dry_run: false, run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None }; engine_med.run(&graph_med, &config_med).await.expect("run med"); let preambles_med = captures_med.preambles.lock().unwrap(); @@ -4960,7 +4960,7 @@ async fn fidelity_thread_id_fallback_to_previous_node_in_pipeline() { let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -5003,7 +5003,7 @@ async fn fidelity_thread_id_from_node_class_in_pipeline() { let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -5049,7 +5049,7 @@ async fn fidelity_edge_thread_id_override_in_pipeline() { let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -5096,7 +5096,7 @@ async fn fidelity_full_without_explicit_thread_id_uses_previous_node() { let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -5150,7 +5150,7 @@ async fn fidelity_from_parsed_dot_pipeline() { let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -5192,7 +5192,7 @@ async fn fidelity_checkpoint_roundtrip_preserves_fidelity() { let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -5251,7 +5251,7 @@ async fn fidelity_node_thread_id_overrides_edge_thread_id_in_pipeline() { let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -5324,7 +5324,7 @@ async fn fidelity_resume_preserves_context_values_across_checkpoint() { let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -5513,7 +5513,7 @@ mod real_llm { let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -5621,7 +5621,7 @@ mod real_llm { let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -5759,7 +5759,7 @@ mod real_llm { let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -5863,7 +5863,7 @@ mod real_llm { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -5947,7 +5947,7 @@ async fn human_gate_freeform_only_routes_text() { let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -6066,7 +6066,7 @@ async fn human_gate_freeform_with_fixed_choice_match() { let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -6170,7 +6170,7 @@ async fn human_gate_freeform_fallback_on_unmatched_text() { let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -6287,7 +6287,7 @@ async fn human_gate_freeform_sets_allow_freeform_on_question() { let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -6380,7 +6380,7 @@ async fn human_gate_without_freeform_sets_allow_freeform_false() { let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -6622,7 +6622,7 @@ async fn tool_hooks_pre_success_allows_pipeline_to_proceed() { let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -6661,7 +6661,7 @@ async fn tool_hooks_pre_failure_skips_tool_call() { let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -6703,7 +6703,7 @@ async fn tool_hooks_post_success_does_not_affect_outcome() { let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -6737,7 +6737,7 @@ async fn tool_hooks_post_failure_does_not_block_pipeline() { let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -6773,7 +6773,7 @@ async fn tool_hooks_graph_level_applies_to_all_nodes() { let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -6812,7 +6812,7 @@ async fn tool_hooks_node_level_overrides_graph_level() { let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -6861,7 +6861,7 @@ async fn tool_hooks_pre_receives_node_id_env_var() { let config = RunConfig { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -6957,7 +6957,7 @@ async fn attractor_e2e_with_real_llm() { let config = RunConfig { logs_root: logs_dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -7064,7 +7064,7 @@ async fn run_fidelity_prompt_pipeline(fidelity: &str) -> String { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -7207,7 +7207,7 @@ async fn large_context_values_are_offloaded_to_artifact_store() { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -7382,7 +7382,7 @@ async fn artifact_pointers_rewritten_for_remote_execution_env() { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -7496,7 +7496,7 @@ async fn node_dir_uses_visit_count_on_revisit() { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -8062,7 +8062,7 @@ async fn full_pipeline_with_cli_backend_node() { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None, @@ -8150,7 +8150,7 @@ async fn stylesheet_backend_property_routes_to_cli() { logs_root: dir.path().to_path_buf(), cancel_token: None, dry_run: false, - run_id: None, + run_id: "test-run".into(), work_dir: None, base_sha: None, run_branch: None,