修复自主构建收束用例的残留断言竞态
Project CI / Frontend tests (pull_request) Failing after 26s
Project CI / Repository checks (pull_request) Failing after 51s
Project CI / Backend tests (pull_request) Successful in 4m36s
Project CI / Native shell tests (pull_request) Successful in 10m26s

finalization 先把 response stream 标为 committed,之后才调用
remove_..._finalization_recovery_sidecars 清理 sidecar,两步之间有真实时间窗。
用例等 committed 的循环一旦命中前半步就退出,紧随其后的四条残留断言却零等待,
在 CI 负载下偶发读到尚未清理的 finalization journal。表现为只改文档的提交也会
挂、上一个提交却能过。

给 journal 断言补上与前面一致的轮询。它是该清理链最后删除的一项,等它消失即可
覆盖后面几条 handoff 残留断言,无需逐条加循环。

只改测试:先对外可见 committed、再清理内部 sidecar 的顺序本身是对的,崩溃恢复
要靠 journal 判断状态。
This commit is contained in:
2026-07-27 10:05:11 +00:00
parent 39ffad4d01
commit bf97810535
@@ -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,