diff --git a/docs/api-reference/arc-api.yaml b/docs/api-reference/arc-api.yaml index ce9c3457b..b8df51512 100644 --- a/docs/api-reference/arc-api.yaml +++ b/docs/api-reference/arc-api.yaml @@ -4098,6 +4098,9 @@ components: enabled: type: boolean description: Whether to create a pull request after a successful run. + draft: + type: boolean + description: Whether to create the pull request as a draft. WebConfiguration: description: Web UI configuration. @@ -4267,4 +4270,4 @@ components: login: type: string description: User's login identifier (e.g. GitHub username). - example: octocat + example: octocat \ No newline at end of file diff --git a/docs/execution/run-configuration.mdx b/docs/execution/run-configuration.mdx index 6aeee0896..da2ae5147 100644 --- a/docs/execution/run-configuration.mdx +++ b/docs/execution/run-configuration.mdx @@ -81,6 +81,7 @@ include = ["test-results/**", "playwright-report/**"] [pull_request] enabled = true +draft = false [[hooks]] event = "stage_start" @@ -278,11 +279,13 @@ Automatically open a GitHub pull request when the workflow run completes success ```toml title="run.toml" [pull_request] enabled = true +draft = true ``` | Field | Description | |---|---| | `enabled` | When `true`, Arc creates a PR from the agent's working branch after a successful run. Default: `false`. | +| `draft` | When `true`, the PR is created as a draft pull request. Default: `false`. | ### `[[hooks]]` diff --git a/lib/crates/arc-api/src/server.rs b/lib/crates/arc-api/src/server.rs index f4f272553..62ef45ad9 100644 --- a/lib/crates/arc-api/src/server.rs +++ b/lib/crates/arc-api/src/server.rs @@ -608,6 +608,7 @@ async fn execute_run(state: Arc, run_id: String) { git_author: state.git_author.clone(), base_branch: None, pull_request_enabled: false, + pull_request_draft: true, asset_globs: Vec::new(), }; diff --git a/lib/crates/arc-api/tests/openapi_conformance.rs b/lib/crates/arc-api/tests/openapi_conformance.rs index f0531fee0..9da69364b 100644 --- a/lib/crates/arc-api/tests/openapi_conformance.rs +++ b/lib/crates/arc-api/tests/openapi_conformance.rs @@ -310,7 +310,10 @@ fn fully_populated_server_config() -> ServerConfig { checkpoint: CheckpointConfig { exclude_globs: vec![], }, - pull_request: Some(PullRequestConfig { enabled: true }), + pull_request: Some(PullRequestConfig { + enabled: true, + draft: false, + }), assets: Some(AssetsConfig { include: vec!["test-results/**".into()], }), diff --git a/lib/crates/arc-github/src/lib.rs b/lib/crates/arc-github/src/lib.rs index b13cd81e9..174166807 100644 --- a/lib/crates/arc-github/src/lib.rs +++ b/lib/crates/arc-github/src/lib.rs @@ -221,6 +221,7 @@ pub async fn create_installation_access_token_for_pr( /// /// Signs a JWT, obtains a PR-scoped installation token, and POSTs to the /// GitHub pulls API. Returns `(html_url, pr_number)` on success. +#[allow(clippy::too_many_arguments)] pub async fn create_pull_request( creds: &GitHubAppCredentials, owner: &str, @@ -229,6 +230,7 @@ pub async fn create_pull_request( head: &str, title: &str, body: &str, + draft: bool, ) -> Result<(String, u64), String> { let jwt = sign_app_jwt(&creds.app_id, &creds.private_key_pem)?; let client = reqwest::Client::new(); @@ -237,13 +239,14 @@ pub async fn create_pull_request( create_installation_access_token_for_pr(&client, &jwt, owner, repo, GITHUB_API_BASE_URL) .await?; - tracing::debug!(title = %title, head = %head, base = %base, "Creating pull request"); + tracing::debug!(title = %title, head = %head, base = %base, draft, "Creating pull request"); let pr_body = serde_json::json!({ "title": title, "head": head, "base": base, "body": body, + "draft": draft, }); let url = format!("{GITHUB_API_BASE_URL}/repos/{owner}/{repo}/pulls"); diff --git a/lib/crates/arc-workflows/src/cli/pr.rs b/lib/crates/arc-workflows/src/cli/pr.rs index 04d711855..e5d761061 100644 --- a/lib/crates/arc-workflows/src/cli/pr.rs +++ b/lib/crates/arc-workflows/src/cli/pr.rs @@ -97,6 +97,7 @@ async fn pr_create_from( &manifest.goal, &diff, &model, + true, ) .await .map_err(|e| anyhow::anyhow!("{e}"))?; diff --git a/lib/crates/arc-workflows/src/cli/run.rs b/lib/crates/arc-workflows/src/cli/run.rs index 859951443..52bfe26ad 100644 --- a/lib/crates/arc-workflows/src/cli/run.rs +++ b/lib/crates/arc-workflows/src/cli/run.rs @@ -896,6 +896,7 @@ pub async fn run_command( .as_ref() .map(|c| c.checkpoint.exclude_globs.clone()) .unwrap_or_default(); + let pr_cfg = run_cfg.as_ref().and_then(|c| c.pull_request.as_ref()); let config = RunConfig { logs_root: logs_dir.clone(), cancel_token: None, @@ -921,10 +922,8 @@ pub async fn run_command( github_app: github_app.clone(), git_author, base_branch: detected_base_branch.or(remote_base_branch), - pull_request_enabled: run_cfg - .as_ref() - .and_then(|c| c.pull_request.as_ref()) - .is_some_and(|p| p.enabled), + pull_request_enabled: pr_cfg.is_some_and(|p| p.enabled), + pull_request_draft: pr_cfg.map_or(true, |p| p.draft), asset_globs: run_cfg .as_ref() .and_then(|c| c.assets.as_ref()) @@ -1077,10 +1076,16 @@ pub async fn run_command( graph.goal(), &diff, &model, + config.pull_request_draft, ) .await { Ok(Some(record)) => { + emitter.emit(&crate::event::WorkflowRunEvent::PullRequestCreated { + pr_url: record.html_url.clone(), + pr_number: record.number, + draft: config.pull_request_draft, + }); eprintln!( "{} {}", styles.bold.apply_to("Pull request:"), @@ -1092,7 +1097,9 @@ pub async fn run_command( } Ok(None) => {} // empty diff, logged at DEBUG Err(e) => { - tracing::warn!(error = %e, "Pull request creation failed"); + emitter.emit(&crate::event::WorkflowRunEvent::PullRequestFailed { + error: e.to_string(), + }); eprintln!( "{} PR creation failed: {e}", styles.yellow.apply_to("Warning:") @@ -1500,6 +1507,7 @@ async fn run_from_branch( git_author, base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; diff --git a/lib/crates/arc-workflows/src/cli/run_config.rs b/lib/crates/arc-workflows/src/cli/run_config.rs index 3924ddd35..572ae1dc9 100644 --- a/lib/crates/arc-workflows/src/cli/run_config.rs +++ b/lib/crates/arc-workflows/src/cli/run_config.rs @@ -16,10 +16,16 @@ pub struct CheckpointConfig { pub exclude_globs: Vec, } +fn default_true() -> bool { + true +} + #[derive(Clone, Debug, Default, Deserialize, PartialEq, Serialize)] pub struct PullRequestConfig { #[serde(default)] pub enabled: bool, + #[serde(default = "default_true")] + pub draft: bool, } #[derive(Clone, Debug, Default, Deserialize, PartialEq, Serialize)] @@ -1852,7 +1858,10 @@ enabled = true ) .unwrap(); let defaults = RunDefaults { - pull_request: Some(PullRequestConfig { enabled: false }), + pull_request: Some(PullRequestConfig { + enabled: false, + draft: false, + }), ..RunDefaults::default() }; cfg.apply_defaults(&defaults); @@ -1870,7 +1879,10 @@ graph = "w.dot" ) .unwrap(); let defaults = RunDefaults { - pull_request: Some(PullRequestConfig { enabled: true }), + pull_request: Some(PullRequestConfig { + enabled: true, + draft: false, + }), ..RunDefaults::default() }; cfg.apply_defaults(&defaults); @@ -1959,4 +1971,37 @@ include = ["playwright-report/**"] let assets = cfg.assets.unwrap(); assert_eq!(assets.include, vec!["playwright-report/**"]); } + + #[test] + fn parse_toml_with_pull_request_draft() { + let toml = r#" +version = 1 +goal = "test" +graph = "w.dot" + +[pull_request] +enabled = true +draft = true +"#; + let config = parse_run_config(toml).unwrap(); + let pr = config.pull_request.unwrap(); + assert!(pr.enabled); + assert!(pr.draft); + } + + #[test] + fn parse_toml_pull_request_draft_defaults_true() { + let toml = r#" +version = 1 +goal = "test" +graph = "w.dot" + +[pull_request] +enabled = true +"#; + let config = parse_run_config(toml).unwrap(); + let pr = config.pull_request.unwrap(); + assert!(pr.enabled); + assert!(pr.draft); + } } diff --git a/lib/crates/arc-workflows/src/engine.rs b/lib/crates/arc-workflows/src/engine.rs index 6479fd219..89175b52e 100644 --- a/lib/crates/arc-workflows/src/engine.rs +++ b/lib/crates/arc-workflows/src/engine.rs @@ -840,6 +840,8 @@ pub struct RunConfig { pub base_branch: Option, /// Whether to auto-create a PR on successful completion. pub pull_request_enabled: bool, + /// Whether to create the PR as a draft. + pub pull_request_draft: bool, /// Glob patterns for asset collection. Empty = no asset collection. pub asset_globs: Vec, } @@ -2859,6 +2861,7 @@ mod tests { git_author: crate::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; let outcome = engine.run(&g, &config).await.unwrap(); @@ -2886,6 +2889,7 @@ mod tests { git_author: crate::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; engine.run(&g, &config).await.unwrap(); @@ -2921,6 +2925,7 @@ mod tests { git_author: crate::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; engine.run(&g, &config).await.unwrap(); @@ -2952,6 +2957,7 @@ mod tests { git_author: crate::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; let result = engine.run(&g, &config).await; @@ -2979,6 +2985,7 @@ mod tests { git_author: crate::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; engine.run(&g, &config).await.unwrap(); @@ -3019,6 +3026,7 @@ mod tests { git_author: crate::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; let outcome = engine.run(&g, &config).await.unwrap(); @@ -3083,6 +3091,7 @@ mod tests { git_author: crate::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; engine.run(&g, &config).await.unwrap(); @@ -3174,6 +3183,7 @@ mod tests { git_author: crate::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; engine.run(&g, &config).await.unwrap(); @@ -3208,6 +3218,7 @@ mod tests { git_author: crate::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; engine.run(&g, &config).await.unwrap(); @@ -3237,6 +3248,7 @@ mod tests { git_author: crate::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; engine.run(&g, &config).await.unwrap(); @@ -3266,6 +3278,7 @@ mod tests { git_author: crate::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; engine.run(&g, &config).await.unwrap(); @@ -3299,6 +3312,7 @@ mod tests { git_author: crate::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; engine.run(&g, &config).await.unwrap(); @@ -3460,6 +3474,7 @@ mod tests { git_author: crate::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; engine.run(&g, &config).await.unwrap(); @@ -3504,6 +3519,7 @@ mod tests { git_author: crate::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; engine.run(&g, &config).await.unwrap(); @@ -3566,6 +3582,7 @@ mod tests { git_author: crate::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; let outcome = engine.run(&g, &config).await.unwrap(); @@ -3631,6 +3648,7 @@ mod tests { git_author: crate::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; let result = engine.run(&g, &config).await; @@ -3700,6 +3718,7 @@ mod tests { git_author: crate::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; let result = engine.run(&g, &config).await; @@ -3758,6 +3777,7 @@ mod tests { git_author: crate::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; let outcome = engine.run(&g, &config).await.unwrap(); @@ -3817,6 +3837,7 @@ mod tests { git_author: crate::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; let outcome = engine.run(&g, &config).await.unwrap(); @@ -3851,6 +3872,7 @@ mod tests { git_author: crate::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; let outcome = engine.run(&g, &config).await.unwrap(); @@ -3881,6 +3903,7 @@ mod tests { git_author: crate::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; let result = engine.run(&g, &config).await; @@ -3910,6 +3933,7 @@ mod tests { git_author: crate::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; let outcome = engine.run(&g, &config).await.unwrap(); @@ -3952,6 +3976,7 @@ mod tests { git_author: crate::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; @@ -4031,6 +4056,7 @@ mod tests { git_author: crate::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; let result = engine.run(&g, &config).await; @@ -4063,6 +4089,7 @@ mod tests { git_author: crate::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; let result = engine.run(&g, &config).await; @@ -4097,6 +4124,7 @@ mod tests { git_author: crate::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; let result = engine.run(&g, &config).await; @@ -4136,6 +4164,7 @@ mod tests { git_author: crate::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; let result = engine.run(&g, &config).await; @@ -4173,6 +4202,7 @@ mod tests { git_author: crate::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; let result = engine.run(&g, &config).await; @@ -4207,6 +4237,7 @@ mod tests { git_author: crate::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; let result = engine.run(&g, &config).await; @@ -4302,6 +4333,7 @@ mod tests { git_author: crate::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; @@ -4512,6 +4544,7 @@ mod tests { git_author: crate::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; let result = engine.run(&g, &config).await; @@ -4549,6 +4582,7 @@ mod tests { git_author: crate::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; let result = engine.run(&g, &config).await; @@ -4593,6 +4627,7 @@ mod tests { git_author: crate::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; let result = engine.run(&g, &config).await; @@ -4677,6 +4712,7 @@ mod tests { git_author: crate::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; let result = engine.run(&g, &config).await; @@ -4772,6 +4808,7 @@ mod tests { git_author: crate::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; let result = engine.run(&g, &config).await; @@ -4844,6 +4881,7 @@ mod tests { git_author: crate::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; let outcome = engine.run(&g, &config).await.unwrap(); @@ -4903,6 +4941,7 @@ mod tests { git_author: crate::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; let outcome = engine.run(&g, &config).await.unwrap(); @@ -4963,6 +5002,7 @@ mod tests { git_author: crate::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; let _outcome = engine.run(&g, &config).await.unwrap(); @@ -5050,6 +5090,7 @@ mod tests { git_author: crate::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; engine.run(&g, &config).await.unwrap(); diff --git a/lib/crates/arc-workflows/src/event.rs b/lib/crates/arc-workflows/src/event.rs index d9dd7f4af..c353f0d4e 100644 --- a/lib/crates/arc-workflows/src/event.rs +++ b/lib/crates/arc-workflows/src/event.rs @@ -219,6 +219,14 @@ pub enum WorkflowRunEvent { error: String, duration_ms: u64, }, + PullRequestCreated { + pr_url: String, + pr_number: u64, + draft: bool, + }, + PullRequestFailed { + error: String, + }, } impl WorkflowRunEvent { @@ -529,6 +537,17 @@ impl WorkflowRunEvent { } => { error!(cli_name, provider, error, duration_ms, "CLI ensure failed"); } + Self::PullRequestCreated { + pr_url, + pr_number, + draft, + .. + } => { + info!(pr_url = %pr_url, pr_number, draft, "Pull request created"); + } + Self::PullRequestFailed { error, .. } => { + error!(error = %error, "Pull request creation failed"); + } } } } @@ -1783,4 +1802,42 @@ mod tests { assert_eq!(json, json2); } } + + #[test] + fn pull_request_created_event_serialization() { + let event = WorkflowRunEvent::PullRequestCreated { + pr_url: "https://github.com/owner/repo/pull/42".to_string(), + pr_number: 42, + draft: true, + }; + let json = serde_json::to_string(&event).unwrap(); + assert!(json.contains("PullRequestCreated")); + assert!(json.contains("\"pr_number\":42")); + assert!(json.contains("\"draft\":true")); + + let deserialized: WorkflowRunEvent = serde_json::from_str(&json).unwrap(); + assert!(matches!( + deserialized, + WorkflowRunEvent::PullRequestCreated { + pr_number: 42, + draft: true, + .. + } + )); + } + + #[test] + fn pull_request_failed_event_serialization() { + let event = WorkflowRunEvent::PullRequestFailed { + error: "auth failed".to_string(), + }; + let json = serde_json::to_string(&event).unwrap(); + assert!(json.contains("PullRequestFailed")); + assert!(json.contains("\"error\":\"auth failed\"")); + + let deserialized: WorkflowRunEvent = serde_json::from_str(&json).unwrap(); + assert!( + matches!(deserialized, WorkflowRunEvent::PullRequestFailed { error } if error == "auth failed") + ); + } } diff --git a/lib/crates/arc-workflows/src/handler/manager_loop.rs b/lib/crates/arc-workflows/src/handler/manager_loop.rs index 4bfd550d0..c1917bf52 100644 --- a/lib/crates/arc-workflows/src/handler/manager_loop.rs +++ b/lib/crates/arc-workflows/src/handler/manager_loop.rs @@ -153,6 +153,7 @@ impl Handler for SubWorkflowHandler { .unwrap_or_default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: true, asset_globs: Vec::new(), }; diff --git a/lib/crates/arc-workflows/src/pull_request.rs b/lib/crates/arc-workflows/src/pull_request.rs index 00deab162..ebc7912bf 100644 --- a/lib/crates/arc-workflows/src/pull_request.rs +++ b/lib/crates/arc-workflows/src/pull_request.rs @@ -82,6 +82,7 @@ pub async fn generate_pr_body(diff: &str, goal: &str, model: &str) -> Result Result, String> { if diff.is_empty() { debug!("Empty diff, skipping pull request creation"); @@ -112,6 +114,7 @@ pub async fn maybe_open_pull_request( head_branch, &title, &body, + draft, ) .await?; @@ -229,6 +232,7 @@ mod tests { "Fix bug", "", "claude-sonnet-4-20250514", + false, ) .await; assert!(result.is_ok()); diff --git a/lib/crates/arc-workflows/tests/daytona_integration.rs b/lib/crates/arc-workflows/tests/daytona_integration.rs index 9595167b0..496ba6925 100644 --- a/lib/crates/arc-workflows/tests/daytona_integration.rs +++ b/lib/crates/arc-workflows/tests/daytona_integration.rs @@ -400,6 +400,7 @@ async fn daytona_pipeline_artifact_offload_and_sync() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; @@ -597,6 +598,7 @@ async fn daytona_git_checkpoint_remote_emits_events() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; @@ -786,6 +788,7 @@ async fn daytona_parallel_git_branching_e2e() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; @@ -1163,6 +1166,7 @@ async fn daytona_git_checkpoint_with_shadow_branch() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; @@ -1306,6 +1310,7 @@ async fn daytona_asset_collection() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; @@ -1561,6 +1566,7 @@ async fn daytona_git_push_run_branch_to_origin() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; diff --git a/lib/crates/arc-workflows/tests/integration.rs b/lib/crates/arc-workflows/tests/integration.rs index dd5eec2cb..02c0f3e64 100644 --- a/lib/crates/arc-workflows/tests/integration.rs +++ b/lib/crates/arc-workflows/tests/integration.rs @@ -204,6 +204,7 @@ async fn end_to_end_linear_pipeline() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; @@ -347,6 +348,7 @@ async fn end_to_end_branching_pipeline() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; @@ -472,6 +474,7 @@ async fn end_to_end_human_gate_pipeline() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; @@ -587,6 +590,7 @@ async fn goal_gate_routes_to_retry_target_on_failure() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; @@ -712,6 +716,7 @@ async fn goal_gate_routes_to_retry_target_when_present() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; @@ -1024,6 +1029,7 @@ async fn retry_on_failure_then_succeed() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; @@ -1103,6 +1109,7 @@ async fn pipeline_with_many_nodes() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; @@ -1432,6 +1439,7 @@ async fn smoke_test_with_mock_codergen_backend() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; @@ -1537,6 +1545,7 @@ async fn end_to_end_parallel_fan_out_fan_in() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; @@ -1654,6 +1663,7 @@ async fn resume_from_checkpoint_completes_pipeline() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; @@ -1757,6 +1767,7 @@ async fn resume_from_checkpoint_preserves_goal_gate_outcomes() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; @@ -1804,6 +1815,7 @@ async fn graph_goal_in_context() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; engine.run(&graph, &config).await.expect("run"); @@ -1843,6 +1855,7 @@ async fn event_streaming_lifecycle() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; engine.run(&graph, &config).await.expect("run"); @@ -1926,6 +1939,7 @@ async fn context_flow_between_stages() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; engine.run(&graph, &config).await.expect("run"); @@ -1982,6 +1996,7 @@ async fn tool_handler_e2e() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; let outcome = engine.run(&graph, &config).await.expect("run"); @@ -2055,6 +2070,7 @@ async fn auto_approve_interviewer_e2e() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; let outcome = engine.run(&graph, &config).await.expect("run"); @@ -2095,6 +2111,7 @@ async fn codergen_without_backend_simulated() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; engine.run(&graph, &config).await.expect("run"); @@ -2203,6 +2220,7 @@ async fn branching_loop_back_on_failure() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; let outcome = engine.run(&graph, &config).await.expect("run"); @@ -2291,6 +2309,7 @@ async fn human_gate_loops_back() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; let outcome = engine.run(&graph, &config).await.expect("run"); @@ -2352,6 +2371,7 @@ async fn scenario_ship_a_feature() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; let outcome = engine.run(&graph, &config).await.expect("run"); @@ -2441,6 +2461,7 @@ async fn scenario_parallel_expert_review() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; let outcome = engine.run(&graph, &config).await.expect("run"); @@ -2524,6 +2545,7 @@ async fn scenario_node_retries_on_retry_status() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; let outcome = engine.run(&graph, &config).await.expect("run"); @@ -2589,6 +2611,7 @@ async fn scenario_loop_restart_resets_context() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; let outcome = engine.run(&graph, &config).await.expect("run"); @@ -2660,6 +2683,7 @@ async fn scenario_bug_triage_router() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; let outcome = engine.run(&graph, &config).await.expect("run"); @@ -2722,6 +2746,7 @@ async fn scenario_crash_recovery() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; let outcome = engine @@ -2834,6 +2859,7 @@ async fn manager_loop_stop_condition_satisfied_e2e() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; let outcome = engine.run(&graph, &config).await.expect("run"); @@ -2914,6 +2940,7 @@ async fn manager_loop_max_cycles_exceeded_e2e() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; let outcome = engine.run(&graph, &config).await.expect("run"); @@ -3053,6 +3080,7 @@ async fn conditional_branching_success_fail_paths() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; let outcome = engine.run(&graph, &config).await.expect("run"); @@ -3109,6 +3137,7 @@ async fn edge_selection_condition_match_wins_over_weight() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; engine.run(&graph, &config).await.expect("run"); @@ -3159,6 +3188,7 @@ async fn edge_selection_weight_breaks_ties() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; engine.run(&graph, &config).await.expect("run"); @@ -3201,6 +3231,7 @@ async fn edge_selection_lexical_tiebreak() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; engine.run(&graph, &config).await.expect("run"); @@ -3262,6 +3293,7 @@ async fn context_updates_visible_across_nodes() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; engine.run(&graph, &config).await.expect("run"); @@ -3309,6 +3341,7 @@ async fn stylesheet_applies_model_override() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; let outcome = engine.run(&graph, &config).await.expect("run"); @@ -3368,6 +3401,7 @@ async fn custom_handler_registration_and_execution() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; engine.run(&graph, &config).await.expect("run"); @@ -3442,6 +3476,7 @@ async fn integration_smoke_plan_implement_review_done() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; let outcome = engine.run(&graph, &config).await.expect("run"); @@ -3549,6 +3584,7 @@ async fn manager_loop_runs_child_engine_e2e() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; @@ -3687,6 +3723,7 @@ async fn manager_loop_context_flows_e2e() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; @@ -3764,6 +3801,7 @@ async fn manager_loop_child_dotfile_e2e() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; @@ -3881,6 +3919,7 @@ async fn graph_merge_e2e_through_engine() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; @@ -4035,6 +4074,7 @@ async fn fidelity_default_is_compact() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; engine.run(&graph, &config).await.expect("run"); @@ -4095,6 +4135,7 @@ async fn fidelity_graph_default_applied() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; engine.run(&graph, &config).await.expect("run"); @@ -4151,6 +4192,7 @@ async fn fidelity_node_overrides_graph_default() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; engine.run(&graph, &config).await.expect("run"); @@ -4213,6 +4255,7 @@ async fn fidelity_edge_overrides_node_and_graph() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; engine.run(&graph, &config).await.expect("run"); @@ -4265,6 +4308,7 @@ async fn fidelity_full_produces_empty_preamble() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; engine.run(&graph, &config).await.expect("run"); @@ -4327,6 +4371,7 @@ async fn fidelity_truncate_preamble_minimal() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; engine.run(&graph, &config).await.expect("run"); @@ -4402,6 +4447,7 @@ async fn fidelity_summary_low_mode() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; engine.run(&graph, &config).await.expect("run"); @@ -4472,6 +4518,7 @@ async fn fidelity_summary_medium_mode() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; engine.run(&graph, &config).await.expect("run"); @@ -4542,6 +4589,7 @@ async fn fidelity_summary_high_mode() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; engine.run(&graph, &config).await.expect("run"); @@ -4605,6 +4653,7 @@ async fn fidelity_full_sets_thread_id_in_context() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; engine.run(&graph, &config).await.expect("run"); @@ -4679,6 +4728,7 @@ async fn fidelity_full_nodes_share_thread_id() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; engine.run(&graph, &config).await.expect("run"); @@ -4763,6 +4813,7 @@ async fn fidelity_resume_degrades_full_to_summary_high() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; engine @@ -4863,6 +4914,7 @@ async fn fidelity_resume_degrade_only_affects_first_hop() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; engine @@ -4950,6 +5002,7 @@ async fn fidelity_resume_no_degrade_when_not_full() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; engine @@ -4995,6 +5048,7 @@ async fn fidelity_stored_in_checkpoint_context() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; engine.run(&graph, &config).await.expect("run"); @@ -5084,6 +5138,7 @@ async fn fidelity_precedence_multi_node_pipeline() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; engine.run(&graph, &config).await.expect("run"); @@ -5155,6 +5210,7 @@ async fn fidelity_compact_preamble_includes_completed_stages_and_context() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; engine.run(&graph, &config).await.expect("run"); @@ -5234,6 +5290,7 @@ async fn fidelity_summary_low_excludes_context_values_in_pipeline() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; engine_low @@ -5305,6 +5362,7 @@ async fn fidelity_summary_low_excludes_context_values_in_pipeline() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; engine_med @@ -5379,6 +5437,7 @@ async fn fidelity_thread_id_fallback_to_previous_node_in_pipeline() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; engine.run(&graph, &config).await.expect("run"); @@ -5436,6 +5495,7 @@ async fn fidelity_thread_id_from_node_class_in_pipeline() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; engine.run(&graph, &config).await.expect("run"); @@ -5496,6 +5556,7 @@ async fn fidelity_edge_thread_id_override_in_pipeline() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; engine.run(&graph, &config).await.expect("run"); @@ -5557,6 +5618,7 @@ async fn fidelity_full_without_explicit_thread_id_uses_previous_node() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; engine.run(&graph, &config).await.expect("run"); @@ -5628,6 +5690,7 @@ async fn fidelity_from_parsed_dot_pipeline() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; engine.run(&graph, &config).await.expect("run"); @@ -5679,6 +5742,7 @@ async fn fidelity_checkpoint_roundtrip_preserves_fidelity() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; engine.run(&graph, &config).await.expect("run"); @@ -5752,6 +5816,7 @@ async fn fidelity_node_thread_id_overrides_edge_thread_id_in_pipeline() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; engine.run(&graph, &config).await.expect("run"); @@ -5842,6 +5907,7 @@ async fn fidelity_resume_preserves_context_values_across_checkpoint() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; engine @@ -6056,6 +6122,7 @@ mod real_llm { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; @@ -6174,6 +6241,7 @@ mod real_llm { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; @@ -6317,6 +6385,7 @@ mod real_llm { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; @@ -6428,6 +6497,7 @@ mod real_llm { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; @@ -6528,6 +6598,7 @@ async fn human_gate_freeform_only_routes_text() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; @@ -6663,6 +6734,7 @@ async fn human_gate_freeform_with_fixed_choice_match() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; @@ -6782,6 +6854,7 @@ async fn human_gate_freeform_fallback_on_unmatched_text() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; @@ -6915,6 +6988,7 @@ async fn human_gate_freeform_sets_allow_freeform_on_question() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; @@ -7028,6 +7102,7 @@ async fn human_gate_without_freeform_sets_allow_freeform_false() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; @@ -7292,6 +7367,7 @@ fn make_run_config(dir: &std::path::Path) -> RunConfig { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), } } @@ -8432,6 +8508,7 @@ async fn arc_e2e_with_real_llm() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; @@ -8564,6 +8641,7 @@ async fn run_fidelity_prompt_pipeline(fidelity: &str) -> String { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; @@ -8767,6 +8845,7 @@ async fn large_context_values_are_offloaded_to_artifact_store() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; @@ -8991,6 +9070,7 @@ async fn artifact_pointers_rewritten_for_remote_sandbox() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; @@ -9125,6 +9205,7 @@ async fn node_dir_uses_visit_count_on_revisit() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; @@ -10089,6 +10170,7 @@ async fn full_pipeline_with_cli_backend_node() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; @@ -10222,6 +10304,7 @@ async fn stylesheet_backend_property_routes_to_cli() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; @@ -10508,6 +10591,7 @@ async fn git_checkpoint_host_emits_events_and_diff_patch() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; @@ -10701,6 +10785,7 @@ async fn git_checkpoint_host_writes_shadow_branch() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; @@ -10899,6 +10984,7 @@ async fn parallel_git_branching_host_e2e() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; @@ -11165,6 +11251,7 @@ async fn git_checkpoint_host_skips_empty_diff_patch() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; @@ -11551,6 +11638,7 @@ async fn e2e_circuit_breaker_deterministic_self_loop() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; @@ -11602,6 +11690,7 @@ async fn e2e_circuit_breaker_custom_limit() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; @@ -11646,6 +11735,7 @@ async fn e2e_circuit_breaker_ignores_transient_failures() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; @@ -11697,6 +11787,7 @@ async fn e2e_circuit_breaker_different_reasons_separate_counters() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; @@ -11741,6 +11832,7 @@ async fn e2e_circuit_breaker_loop_restart() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; @@ -11807,6 +11899,7 @@ async fn e2e_failure_signature_persisted_in_context() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; @@ -11875,6 +11968,7 @@ async fn e2e_failure_signature_hint_overrides_reason_in_context() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; @@ -11935,6 +12029,7 @@ async fn e2e_signature_maps_persist_in_checkpoint() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; @@ -12066,6 +12161,7 @@ async fn e2e_circuit_breaker_emits_events_before_abort() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; @@ -12137,6 +12233,7 @@ async fn e2e_circuit_breaker_does_not_fire_below_limit() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; @@ -12237,6 +12334,7 @@ async fn e2e_circuit_breaker_multi_stage_impl_verify_cycle() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; @@ -12337,6 +12435,7 @@ async fn e2e_loop_restart_blocked_for_deterministic_failure() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; @@ -12381,6 +12480,7 @@ async fn e2e_loop_restart_blocked_for_structural_failure() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; @@ -12425,6 +12525,7 @@ async fn e2e_loop_restart_blocked_for_budget_exhausted_failure() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; @@ -12469,6 +12570,7 @@ async fn e2e_loop_restart_blocked_for_canceled_failure() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; @@ -12510,6 +12612,7 @@ async fn e2e_loop_restart_blocked_for_compilation_loop_failure() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; @@ -12555,6 +12658,7 @@ async fn e2e_loop_restart_allowed_for_transient_infra() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; @@ -12663,6 +12767,7 @@ async fn e2e_stall_watchdog_triggers_from_dot_parsed_pipeline() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; @@ -12723,6 +12828,7 @@ async fn e2e_stall_watchdog_kept_alive_by_handler_events() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; @@ -12773,6 +12879,7 @@ async fn e2e_stall_watchdog_disabled_with_zero_timeout() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; @@ -12842,6 +12949,7 @@ async fn e2e_stall_watchdog_with_explicit_timeout_override() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; @@ -12976,6 +13084,7 @@ async fn asset_collection_local_sandbox_success() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: vec!["test-results/**".to_string()], }; @@ -13088,6 +13197,7 @@ async fn asset_collection_local_sandbox_on_failure() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: vec!["test-results/**".to_string()], }; @@ -13183,6 +13293,7 @@ async fn asset_collection_docker_sandbox() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; @@ -13256,6 +13367,7 @@ async fn wait_timer_e2e() { git_author: arc_workflows::git::GitAuthor::default(), base_branch: None, pull_request_enabled: false, + pull_request_draft: false, asset_globs: Vec::new(), }; let outcome = engine.run(&graph, &config).await.expect("run");