fix(flows): default require_approval to false in the builder (B3) (#4651)

This commit is contained in:
Cyrus Gray
2026-07-07 22:38:32 +05:30
committed by GitHub
parent 7daa877eea
commit 25ce5b7239
4 changed files with 54 additions and 6 deletions
+2 -2
View File
@@ -114,7 +114,7 @@ impl Tool for ReviseWorkflowTool {
},
"require_approval": {
"type": "boolean",
"description": "Force a human-approval gate on every outbound action once saved. Defaults to true for agent-proposed flows."
"description": "Force a human-approval gate on every outbound action once saved. Defaults to false; set true only when the user explicitly asks for an approval step."
}
},
"required": ["name", "graph"]
@@ -146,7 +146,7 @@ impl Tool for ReviseWorkflowTool {
let require_approval = args
.get("require_approval")
.and_then(Value::as_bool)
.unwrap_or(true);
.unwrap_or(false);
tracing::debug!(
target: "flows",
@@ -57,6 +57,40 @@ async fn revise_workflow_validates_and_returns_revision_proposal() {
assert_eq!(parsed["graph"]["nodes"].as_array().unwrap().len(), 2);
}
#[tokio::test]
async fn revise_workflow_omitted_require_approval_defaults_false() {
let tmp = TempDir::new().unwrap();
let tool = ReviseWorkflowTool::new(test_config(&tmp));
let result = tool
.execute(json!({ "name": "Revised flow", "graph": valid_graph() }))
.await
.unwrap();
assert!(!result.is_error, "{}", result.output());
let parsed: Value = serde_json::from_str(&result.output()).unwrap();
assert_eq!(parsed["require_approval"], false);
}
#[tokio::test]
async fn revise_workflow_explicit_require_approval_true_is_respected() {
let tmp = TempDir::new().unwrap();
let tool = ReviseWorkflowTool::new(test_config(&tmp));
let result = tool
.execute(json!({
"name": "Revised flow",
"graph": valid_graph(),
"require_approval": true
}))
.await
.unwrap();
assert!(!result.is_error, "{}", result.output());
let parsed: Value = serde_json::from_str(&result.output()).unwrap();
assert_eq!(parsed["require_approval"], true);
}
#[tokio::test]
async fn revise_workflow_rejects_invalid_graph() {
let tmp = TempDir::new().unwrap();
+2 -2
View File
@@ -120,7 +120,7 @@ impl Tool for ProposeWorkflowTool {
},
"require_approval": {
"type": "boolean",
"description": "Force a human-approval gate on every outbound tool/HTTP action this flow takes once saved. Defaults to true for agent-proposed flows."
"description": "Force a human-approval gate on every outbound tool/HTTP action this flow takes once saved. Defaults to false; set true only when the user explicitly asks for an approval step."
}
},
"required": ["name", "graph"]
@@ -152,7 +152,7 @@ impl Tool for ProposeWorkflowTool {
let require_approval = args
.get("require_approval")
.and_then(Value::as_bool)
.unwrap_or(true);
.unwrap_or(false);
tracing::debug!(
target: "flows",
+16 -2
View File
@@ -112,7 +112,7 @@ async fn missing_graph_is_an_error() {
}
#[tokio::test]
async fn omitted_require_approval_defaults_true_in_result() {
async fn omitted_require_approval_defaults_false_in_result() {
let tmp = TempDir::new().unwrap();
let tool = ProposeWorkflowTool::new(test_config(&tmp));
@@ -122,7 +122,7 @@ async fn omitted_require_approval_defaults_true_in_result() {
.unwrap();
let parsed: Value = serde_json::from_str(&result.output()).unwrap();
assert_eq!(parsed["require_approval"], true);
assert_eq!(parsed["require_approval"], false);
}
#[tokio::test]
@@ -139,6 +139,20 @@ async fn explicit_require_approval_false_is_respected() {
assert_eq!(parsed["require_approval"], false);
}
#[tokio::test]
async fn explicit_require_approval_true_is_respected() {
let tmp = TempDir::new().unwrap();
let tool = ProposeWorkflowTool::new(test_config(&tmp));
let result = tool
.execute(json!({ "name": "demo", "graph": valid_graph(), "require_approval": true }))
.await
.unwrap();
let parsed: Value = serde_json::from_str(&result.output()).unwrap();
assert_eq!(parsed["require_approval"], true);
}
#[tokio::test]
async fn summary_step_count_and_kinds_are_correct() {
let tmp = TempDir::new().unwrap();