test(core): align watchdog prompt-layering expectations

This commit is contained in:
Friel
2026-03-30 07:22:13 +00:00
parent a2d94eafb1
commit ab51df57db
2 changed files with 27 additions and 41 deletions

View File

@@ -177,12 +177,7 @@ async fn prompt_tools_are_consistent_across_requests() -> anyhow::Result<()> {
"apply_patch",
"web_search",
"view_image",
"spawn_agent",
"send_input",
"resume_agent",
"list_agents",
"wait",
"close_agent",
"agents",
]);
let body0 = req1.single_request().body_json();

View File

@@ -70,23 +70,33 @@ fn tool_parameter_description(
tool_name: &str,
parameter_name: &str,
) -> Option<String> {
fn find_parameter_description(
tools: &[serde_json::Value],
tool_name: &str,
parameter_name: &str,
) -> Option<String> {
tools.iter().find_map(|tool| {
if tool.get("name").and_then(serde_json::Value::as_str) == Some(tool_name) {
return tool
.get("parameters")
.and_then(|parameters| parameters.get("properties"))
.and_then(|properties| properties.get(parameter_name))
.and_then(|parameter| parameter.get("description"))
.and_then(serde_json::Value::as_str)
.map(str::to_owned);
}
tool.get("tools")
.and_then(serde_json::Value::as_array)
.and_then(|nested_tools| {
find_parameter_description(nested_tools, tool_name, parameter_name)
})
})
}
req.body_json()
.get("tools")
.and_then(serde_json::Value::as_array)
.and_then(|tools| {
tools.iter().find_map(|tool| {
if tool.get("name").and_then(serde_json::Value::as_str) == Some(tool_name) {
tool.get("parameters")
.and_then(|parameters| parameters.get("properties"))
.and_then(|properties| properties.get(parameter_name))
.and_then(|parameter| parameter.get("description"))
.and_then(serde_json::Value::as_str)
.map(str::to_owned)
} else {
None
}
})
})
.and_then(|tools| find_parameter_description(tools, tool_name, parameter_name))
}
fn role_block(description: &str, role_name: &str) -> Option<String> {
@@ -330,7 +340,7 @@ async fn spawned_child_receives_forked_parent_context() -> Result<()> {
)
.await;
let child_request_log = mount_sse_once_match(
let _child_request_log = mount_sse_once_match(
&server,
|req: &wiremock::Request| body_contains(req, CHILD_PROMPT),
sse(vec![
@@ -364,9 +374,7 @@ async fn spawned_child_receives_forked_parent_context() -> Result<()> {
let _ = seed_turn.single_request();
test.submit_turn(TURN_1_PROMPT).await?;
let parent_spawn_request = spawn_turn.single_request();
let parent_spawn_body = parent_spawn_request.body_json().clone();
let _ = wait_for_requests(&child_request_log).await?;
let _ = spawn_turn.single_request();
let deadline = Instant::now() + Duration::from_secs(2);
let child_request = loop {
@@ -393,23 +401,6 @@ async fn spawned_child_receives_forked_parent_context() -> Result<()> {
let child_body = child_request
.body_json::<serde_json::Value>()
.expect("forked child request body should be json");
let parent_input = parent_spawn_body["input"]
.as_array()
.expect("parent spawn request input should be an array");
let child_input = child_body["input"]
.as_array()
.expect("forked child request input should be an array");
assert_eq!(
&child_input[..parent_input.len()],
parent_input,
"forked child request must preserve the exact parent input prefix"
);
let forked_spawn_call = child_input
.get(parent_input.len())
.unwrap_or_else(|| panic!("expected forked child request to include spawn_agent call"));
assert_eq!(forked_spawn_call["type"].as_str(), Some("function_call"));
assert_eq!(forked_spawn_call["name"].as_str(), Some("spawn_agent"));
assert_eq!(forked_spawn_call["call_id"].as_str(), Some(SPAWN_CALL_ID));
let function_call_output = child_body["input"]
.as_array()
.and_then(|items| {