Collapse pipeline_id and run_id into single run_id

Make RunConfig.run_id required (String instead of Option<String>) so the
caller always provides the ID. This eliminates the duplicate UUID that
was generated: one in the HTTP server / CLI and a second inside the
engine fallback.

Also fixes a bug in preamble.rs where context key "run_id" was read but
the engine stores it as "internal.run_id", so the run ID always showed
as "unknown" in preambles.

Renames PipelineStarted.id to PipelineStarted.run_id for consistency.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Bryan Helmkamp 2026-02-28 14:15:25 -05:00
parent 300a12a4eb
commit 53ae30dfd4
8 changed files with 159 additions and 160 deletions

View file

@ -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 {

View file

@ -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,

View file

@ -470,8 +470,8 @@ pub struct RunConfig {
pub logs_root: PathBuf,
pub cancel_token: Option<Arc<AtomicBool>>,
pub dry_run: bool,
/// Pre-assigned run ID. Generated if `None`.
pub run_id: Option<String>,
/// Unique identifier for this pipeline run.
pub run_id: String,
/// Git worktree path for checkpoint commits.
pub work_dir: Option<PathBuf>,
/// SHA of the commit the worktree branched from.
@ -706,12 +706,12 @@ impl PipelineEngine {
mut node_visits: HashMap<String, usize>,
) -> Result<Outcome> {
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,

View file

@ -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<String>,
#[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,

View file

@ -23,7 +23,7 @@ pub fn build_preamble(
node_outcomes: &HashMap<String, Outcome>,
) -> 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<String> = Vec::new();
let node_outcomes: HashMap<String, Outcome> = 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<String, Outcome> = 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"));

View file

@ -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());
}
}

View file

@ -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,

View file

@ -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,