From bf978105357156d90852169ba4637681716f39fc Mon Sep 17 00:00:00 2001 From: Linghong Date: Mon, 27 Jul 2026 10:05:11 +0000 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E8=87=AA=E4=B8=BB=E6=9E=84?= =?UTF-8?q?=E5=BB=BA=E6=94=B6=E6=9D=9F=E7=94=A8=E4=BE=8B=E7=9A=84=E6=AE=8B?= =?UTF-8?q?=E7=95=99=E6=96=AD=E8=A8=80=E7=AB=9E=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit finalization 先把 response stream 标为 committed,之后才调用 remove_..._finalization_recovery_sidecars 清理 sidecar,两步之间有真实时间窗。 用例等 committed 的循环一旦命中前半步就退出,紧随其后的四条残留断言却零等待, 在 CI 负载下偶发读到尚未清理的 finalization journal。表现为只改文档的提交也会 挂、上一个提交却能过。 给 journal 断言补上与前面一致的轮询。它是该清理链最后删除的一项,等它消失即可 覆盖后面几条 handoff 残留断言,无需逐条加循环。 只改测试:先对外可见 committed、再清理内部 sidecar 的顺序本身是对的,崩溃恢复 要靠 journal 判断状态。 --- .../agent/runtime_driver/main_loop_tests.rs | 23 ++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/apps/ai-game-creator-shell/src-tauri/src/agent/runtime_driver/main_loop_tests.rs b/apps/ai-game-creator-shell/src-tauri/src/agent/runtime_driver/main_loop_tests.rs index aaaf9ef4f..092785609 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/agent/runtime_driver/main_loop_tests.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/agent/runtime_driver/main_loop_tests.rs @@ -584,13 +584,30 @@ async fn autonomous_supervisor_converged_final_reply_deserialize_commits_fallbac } assert_eq!(stream.status, "committed"); assert_eq!(stream.accumulated_text, fallback); - assert!(read_game_creator_agent_runtime_finalization_journal( + // finalization 先把 response stream 标为 committed,之后才调 + // remove_..._finalization_recovery_sidecars 清理 sidecar,两步之间有真实时间窗。 + // 上面等 committed 的循环一旦命中前半步就会退出,因此这里必须同样轮询,否则在 + // CI 负载下会偶发读到尚未清理的残留。journal 是该清理链最后删除的一项,等它消失 + // 即可覆盖后面几条 handoff 残留断言。 + let mut finalization_residue = read_game_creator_agent_runtime_finalization_journal( &root, GAME_CREATOR_PROJECT_SUPERVISOR_AGENT_ID, RUN_ID, ) - .expect("read finalization residue") - .is_none()); + .expect("read finalization residue"); + for _ in 0..250 { + if finalization_residue.is_none() { + break; + } + std::thread::sleep(Duration::from_millis(20)); + finalization_residue = read_game_creator_agent_runtime_finalization_journal( + &root, + GAME_CREATOR_PROJECT_SUPERVISOR_AGENT_ID, + RUN_ID, + ) + .expect("poll finalization residue"); + } + assert!(finalization_residue.is_none()); assert!(provider_retry::read_for_run_at( &root, GAME_CREATOR_PROJECT_SUPERVISOR_AGENT_ID,