diff --git a/apps/ai-game-creator-shell/src-tauri/src/agent/thread_manager/dispatch.rs b/apps/ai-game-creator-shell/src-tauri/src/agent/thread_manager/dispatch.rs index 9e8a43357..be5bc35cb 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/agent/thread_manager/dispatch.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/agent/thread_manager/dispatch.rs @@ -94,6 +94,16 @@ impl Drop for TurnReservation { // application.log 全空)。测试态不写,避免用例污染本机 AppData。 #[cfg(not(test))] if finalized_by_guard { + // 项目侧也留一份脱敏诊断:用户在项目目录里就能看到这一轮的收场, + // 不必只依赖 AppData 的应用日志。 + let failure = DirectTurnError::TurnFailed { + stage: DirectCodexFailureStage::CodeGeneration, + detail: format!( + "DirectProject 宿主任务提前结束(panic、future 被丢弃或被取消),本轮未写下终态;threadId={} turnToken={}", + self.thread_id, self.token + ), + }; + let _ = record_direct_codex_failure(Path::new(&self.thread_id), &failure, None); let _ = crate::append_application_log( "error".to_string(), "direct-turn".to_string(),