手动提交:修复CI失败
Project CI / Repository checks (pull_request) Successful in 3m7s
Project CI / Frontend tests (pull_request) Successful in 3m30s
Project CI / Backend tests (pull_request) Successful in 4m9s
Project CI / Native shell tests (pull_request) Successful in 15m49s

This commit is contained in:
2026-08-20 13:40:30 +00:00
parent c1dba09049
commit 938b7ce654
3 changed files with 90 additions and 57 deletions
@@ -1346,16 +1346,25 @@ mod tests {
}
}
#[test]
fn autonomous_art_director_advertises_canvas_without_smoke_or_preview_tools() {
let _config_guard = crate::tests::write_test_local_config(
r#"{"editorApi":{"apiKey":"art-director-provider-key"}}"#.to_string(),
);
let request = build_autonomous_ready_child_request(
"art-director",
AGENT_RUNTIME_SUPERVISOR_GUI_SOURCE,
"art-director-canvas-only",
);
#[tokio::test]
async fn autonomous_art_director_advertises_canvas_without_smoke_or_preview_tools() {
// debug 构建下 editor_api_mode() 恒为 PlatformAccount,配置里的
// editorApi.apiKey 会被 editor_api_key_is_configured 完全忽略;只有凭据
// override 或平台会话才算「已配置」,Canvas 才会进工具目录。
let request = crate::assets::with_external_editor_api_credentials(
crate::assets::external_editor_api_credentials_for_test(
"https://editor.test".to_string(),
"art-director-provider-key".to_string(),
),
async {
build_autonomous_ready_child_request(
"art-director",
AGENT_RUNTIME_SUPERVISOR_GUI_SOURCE,
"art-director-canvas-only",
)
},
)
.await;
assert!(request_advertises_native_tool(
&request,
"canvas.asset_generate"
@@ -1427,8 +1436,8 @@ mod tests {
assert!(!publish_prompts.contains("固定 owner 收束协议"));
}
#[test]
fn art_director_request_exposes_canvas_only_for_the_keyed_owner_route() {
#[tokio::test]
async fn art_director_request_exposes_canvas_only_for_the_keyed_owner_route() {
{
let _config_guard = crate::tests::write_test_local_config("{}".to_string());
let request = build_autonomous_ready_child_request(
@@ -1452,30 +1461,42 @@ mod tests {
);
assert!(prompts.contains("不调用 canvas.asset_generate"));
}
{
let _config_guard = crate::tests::write_test_local_config(
r#"{"editorApi":{"apiKey":"provider-art-director-key"}}"#.to_string(),
// debug 构建下 editor_api_mode() 恒为 PlatformAccount,配置里的
// editorApi.apiKey 会被 editor_api_key_is_configured 完全忽略;只有凭据
// override 或平台会话才算「已配置」。
let request = crate::assets::with_external_editor_api_credentials(
crate::assets::external_editor_api_credentials_for_test(
"https://editor.test".to_string(),
"provider-art-director-key".to_string(),
),
async {
build_autonomous_ready_child_request(
"art-director",
AGENT_RUNTIME_SUPERVISOR_CLI_SOURCE,
"art-director-keyed",
)
},
)
.await;
assert!(request_advertises_native_tool(
&request,
"canvas.asset_generate"
));
let prompts = request
.messages
.iter()
.map(|message| message.content.as_str())
.collect::<Vec<_>>()
.join(
"
",
);
let request = build_autonomous_ready_child_request(
"art-director",
AGENT_RUNTIME_SUPERVISOR_CLI_SOURCE,
"art-director-keyed",
);
assert!(request_advertises_native_tool(
&request,
"canvas.asset_generate"
));
let prompts = request
.messages
.iter()
.map(|message| message.content.as_str())
.collect::<Vec<_>>()
.join("\n");
assert!(prompts.contains("条件 Canvas owner 任务"));
assert!(prompts.contains("assets/art-spec.png"));
assert!(prompts.contains("成功只表示候选已生成并登记,不等于视觉门已经通过"));
assert!(!prompts.contains("成功会为本人当前 revision 形成验证凭证"));
}
assert!(prompts.contains("非只读视觉规范生成任务"));
assert!(prompts
.contains(crate::agent::AGENT_RUNTIME_AUTONOMOUS_ART_DIRECTOR_CANVAS_ONLY_TASK_MARKER));
assert!(prompts.contains("assets/art-spec.png"));
assert!(prompts.contains("会同时提交当前 run 的 mutation 与验证凭证"));
assert!(!prompts.contains("无生图凭据只读协调任务"));
}
#[test]
@@ -3355,14 +3355,16 @@ fn prepare_autonomous_playtest_evidence_for_actor_at_revision(
)
.expect("bind deterministic game-chat collaboration policy");
// 回执现在冻结执行者身份,证据路径按 executor 的 agent/run 校验;夹具必须落在
// 实际执行试玩的 actor 名下,而不是合同根。
let evidence_root = root
.join(".agent/runtime/browser-validations")
.join(agent_runtime_confirmation_path_component(
&contract_state.agent_id,
&actor_state.agent_id,
"agent",
))
.join(agent_runtime_confirmation_path_component(
&contract_state.run_id,
&actor_state.run_id,
"run",
))
.join(revision.to_string());
@@ -1750,8 +1750,8 @@ mod tests {
assert!(!publish_prompt.contains("验证本人固定 owner 产物"));
}
#[test]
fn art_director_ready_task_is_read_only_without_key_and_canvas_owner_with_key() {
#[tokio::test]
async fn art_director_ready_task_is_read_only_without_key_and_canvas_owner_with_key() {
let task = seed_task("art-director");
{
let _config_guard = crate::tests::write_test_local_config("{}".to_string());
@@ -1767,23 +1767,33 @@ mod tests {
&prompt
));
}
{
let _config_guard = crate::tests::write_test_local_config(
r#"{"editorApi":{"apiKey":"art-director-ready-task-key"}}"#.to_string(),
);
let prompt = render_autonomous_manifest_ready_task_background_prompt(&task);
assert!(prompt.contains("条件 Canvas owner 任务"));
assert!(prompt.contains("生成并登记 assets/art-spec.png"));
assert!(prompt.contains("成功只表示候选已生成并登记,不等于视觉门已经通过"));
assert!(prompt.contains("由 Runtime 在收束时核对当前 revision"));
assert!(!prompt.contains("成功会为本人当前 revision 形成验证凭证"));
assert!(autonomous_manifest_ready_task_requires_visual_asset(
"art-director"
));
assert!(!agent_runtime_task_requires_read_only_delivery(
"art-director",
&prompt
));
}
// debug 构建下 editor_api_mode() 恒为 PlatformAccount,配置里的
// editorApi.apiKey 会被 editor_api_key_is_configured 完全忽略,只有凭据
// override 或平台会话才算「已配置」。用支持的 override 钩子模拟。
crate::assets::with_external_editor_api_credentials(
crate::assets::external_editor_api_credentials_for_test(
"https://editor.test".to_string(),
"art-director-ready-task-key".to_string(),
),
async {
let prompt = render_autonomous_manifest_ready_task_background_prompt(&task);
assert!(prompt.contains("非只读视觉规范生成任务"));
assert!(prompt.contains(
crate::agent::AGENT_RUNTIME_AUTONOMOUS_ART_DIRECTOR_CANVAS_ONLY_TASK_MARKER
));
assert!(prompt.contains("生成并登记 assets/art-spec.png"));
assert!(prompt.contains("会同时提交当前 run 的 mutation 与验证凭证"));
assert!(prompt.contains("Runtime 会在子 Run 终态后幂等投影 manifest"));
assert!(!prompt.contains("无生图凭据只读协调任务"));
assert!(autonomous_manifest_ready_task_requires_visual_asset(
"art-director"
));
assert!(!agent_runtime_task_requires_read_only_delivery(
"art-director",
&prompt
));
},
)
.await;
}
}