diff --git a/apps/admin-web/src/pages/AdminAgcTemplatesPage.test.tsx b/apps/admin-web/src/pages/AdminAgcTemplatesPage.test.tsx index 667e44af5..11c3f5493 100644 --- a/apps/admin-web/src/pages/AdminAgcTemplatesPage.test.tsx +++ b/apps/admin-web/src/pages/AdminAgcTemplatesPage.test.tsx @@ -339,7 +339,10 @@ test.each([409, 503])( await confirmWrite(); const message = await screen.findByRole('alert'); const feedback = message.parentElement!; - expect(document.activeElement).toBe(feedback); + // 聚焦发生在 React passive effect 里(AdminAgcTemplatesPage 的 feedback 聚焦 useEffect), + // 而 findByRole 在 alert 节点一挂上就返回,可能早于该 effect 执行;这里等聚焦落地, + // 避免在 CI 负载下抢跑。断言口径不变:焦点最终必须落在提示区而不是弹窗面板。 + await waitFor(() => expect(document.activeElement).toBe(feedback)); expect(feedback.tabIndex).toBe(-1); expect(focus).toHaveBeenCalledWith({ preventScroll: true }); expect(viewport.scrollTop).toBe(20); diff --git a/apps/ai-game-creator-shell/src-tauri/src/tests/project_tools.rs b/apps/ai-game-creator-shell/src-tauri/src/tests/project_tools.rs index 7636655ef..b8fe675e5 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/tests/project_tools.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/tests/project_tools.rs @@ -1011,7 +1011,9 @@ async fn background_agent_runtime_file_delete_confirmation_replans_after_stale_p let replanning_request = receiver .recv_timeout(Duration::from_secs(10)) .expect("same-run replanning request after stale delete approval"); - assert!(replanning_request.contains("design-stale-delete-confirm-run")); + // 提示词不再携带 run/session 标识(team-conventions:提示词不写宿主实现细节); + // 同一 run 由下面的 completed.run_id 判定,这里守住“内部标识不进请求”的边界。 + assert!(!replanning_request.contains("design-stale-delete-confirm-run")); assert!(replanning_request.contains("projectRevisionDrift=true")); assert!(replanning_request.contains("旧动作未执行")); diff --git a/apps/ai-game-creator-shell/src-tauri/src/tests/provider.rs b/apps/ai-game-creator-shell/src-tauri/src/tests/provider.rs index 2834c0a52..8094d65e8 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/tests/provider.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/tests/provider.rs @@ -5492,7 +5492,10 @@ async fn background_agent_runtime_repairs_malformed_tool_plan_in_same_run() { let initial_request = receiver .recv_timeout(Duration::from_secs(2)) .expect("initial tool plan request"); - assert!(initial_request.contains(run_id)); + // run/session 标识不再进入提示词(team-conventions:AGC 外置智能体提示词只写模型要遵守的 + // 指令与契约,不写宿主实现细节),同一 run 由下面的 runtime 状态与 DB 记录判定; + // 这里改成守住反方向边界——内部标识不得再泄露进请求。 + assert!(!initial_request.contains(run_id)); assert!(!initial_request.contains("上一条输出不符合工具计划协议")); assert!(mock_http_request_json(&initial_request)["tools"] .as_array() @@ -5500,7 +5503,7 @@ async fn background_agent_runtime_repairs_malformed_tool_plan_in_same_run() { let repair_request = receiver .recv_timeout(Duration::from_secs(2)) .expect("tool plan repair request"); - assert!(repair_request.contains(run_id)); + assert!(!repair_request.contains(run_id)); assert!(repair_request.contains("\"role\":\"assistant\"")); assert!(repair_request.contains("格式损坏")); assert!(repair_request.contains("上一条输出不符合工具计划协议")); diff --git a/apps/ai-game-creator-shell/src-tauri/src/tests/response_stream.rs b/apps/ai-game-creator-shell/src-tauri/src/tests/response_stream.rs index ccb92dcac..0e8681ab6 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/tests/response_stream.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/tests/response_stream.rs @@ -1957,7 +1957,9 @@ fn finalization_resume_discards_unpersisted_reply_after_revision_drift() { let request = receiver .recv_timeout(Duration::from_secs(2)) .expect("stale prepared finalization must replan"); - assert!(request.contains(run_id)); + // 提示词不再携带 run/session 标识(team-conventions:提示词不写宿主实现细节), + // 同一 run 由下面的 runtime.run_id 判定;这里守住“内部标识不进请求”的边界。 + assert!(!request.contains(run_id)); let runtime = wait_for_agent_runtime_idle(&root, "design-director"); assert_eq!(runtime.phase, "completed"); assert_eq!(runtime.run_id, run_id); @@ -2651,11 +2653,11 @@ async fn background_finalization_replans_same_run_after_cross_agent_revision_dri let initial_plan_request = request_receiver .recv_timeout(Duration::from_secs(2)) .expect("initial convergence plan request"); - assert!(initial_plan_request.contains(run_id)); + assert!(!initial_plan_request.contains(run_id)); let stale_final_reply_request = request_receiver .recv_timeout(Duration::from_secs(2)) .expect("blocked stale final reply request"); - assert!(stale_final_reply_request.contains(run_id)); + assert!(!stale_final_reply_request.contains(run_id)); assert!( !game_creator_agent_runtime_task_lock_is_available(&root, "design-director") .expect("inspect lock while final reply is blocked"), @@ -2677,8 +2679,10 @@ async fn background_finalization_replans_same_run_after_cross_agent_revision_dri let replanned_request = request_receiver .recv_timeout(Duration::from_secs(30)) .expect("same run replanning request"); - assert!(replanned_request.contains(run_id)); - assert!(replanned_request.contains(&session_id)); + // 提示词不再携带 run/session 标识(team-conventions:提示词不写宿主实现细节); + // 同一 run 由本用例末尾的 runtime.run_id / runtime.session_id 判定。 + assert!(!replanned_request.contains(run_id)); + assert!(!replanned_request.contains(&session_id)); assert!(replanned_request.contains("runtime.verification")); assert!(replanned_request.contains("currentRevision=2")); assert!( @@ -2689,13 +2693,13 @@ async fn background_finalization_replans_same_run_after_cross_agent_revision_dri let verified_request = request_receiver .recv_timeout(Duration::from_secs(10)) .expect("request after current revision verification"); - assert!(verified_request.contains(run_id)); + assert!(!verified_request.contains(run_id)); assert!(verified_request.contains("project.verify")); assert!(verified_request.contains("AGENT_RUNTIME_CURRENT_REVISION_OK")); let current_final_reply_request = request_receiver .recv_timeout(Duration::from_secs(30)) .expect("current final reply request"); - assert!(current_final_reply_request.contains(run_id)); + assert!(!current_final_reply_request.contains(run_id)); let runtime = wait_for_agent_runtime_idle(&root, "design-director"); wait_for_provider_handoff_terminal_cleanup(&root, "design-director", run_id); @@ -2830,8 +2834,10 @@ async fn read_only_background_finalization_replans_when_reply_revision_becomes_s let replanned_request = request_receiver .recv_timeout(Duration::from_secs(30)) .expect("read-only same-run replanning request"); - assert!(replanned_request.contains(run_id)); - assert!(replanned_request.contains(&session_id)); + // 提示词不再携带 run/session 标识(team-conventions:提示词不写宿主实现细节); + // 同一 run 由下面的 runtime.run_id / runtime.session_id 判定。 + assert!(!replanned_request.contains(run_id)); + assert!(!replanned_request.contains(&session_id)); assert!(replanned_request.contains("responseRevision=0")); assert!(replanned_request.contains("currentRevision=1")); let runtime = wait_for_agent_runtime_idle(&root, "design-director"); @@ -3024,7 +3030,9 @@ async fn stale_finalization_context_survives_restart_before_same_run_replanning( let replanned_request = request_receiver .recv_timeout(Duration::from_secs(2)) .expect("restart replanning request"); - assert!(replanned_request.contains(run_id)); + // 提示词不再携带 run/session 标识(team-conventions:提示词不写宿主实现细节); + // 同一 run 由本用例末尾的 runtime.run_id / runtime.session_id 判定。 + assert!(!replanned_request.contains(run_id)); assert!(replanned_request.contains("currentRevision=2")); let verified_request = request_receiver .recv_timeout(Duration::from_secs(10)) @@ -3033,7 +3041,7 @@ async fn stale_finalization_context_survives_restart_before_same_run_replanning( let final_reply_request = request_receiver .recv_timeout(Duration::from_secs(2)) .expect("restart final reply request"); - assert!(final_reply_request.contains(run_id)); + assert!(!final_reply_request.contains(run_id)); let runtime = read_game_creator_agent_runtime_at(&root, "design-director") .expect("read completed restart runtime")