From 6b4e161b5d6181749d8c4de75bb61388d342fd1e Mon Sep 17 00:00:00 2001 From: kdletters <61648117+kdletters@users.noreply.github.com> Date: Tue, 6 Oct 2026 13:58:42 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=9D=E7=95=99=E8=BF=9B=E7=A8=8B=E6=8E=A7?= =?UTF-8?q?=E5=88=B6=E9=80=9A=E9=81=93=E5=A4=B1=E8=B4=A5=E6=AD=A3=E6=96=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 状态落盘失败和关闭流程记录终止或 shutdown 发送失败 补充进程会话排障记录 --- .../src-tauri/src/process_session/io.rs | 16 +++++++++++++--- .../src-tauri/src/process_session/recovery.rs | 7 ++++++- docs/project-memory/shared-memory/pitfalls.md | 2 ++ 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/apps/ai-game-creator-shell/src-tauri/src/process_session/io.rs b/apps/ai-game-creator-shell/src-tauri/src/process_session/io.rs index 04a74476d..b320c808d 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/process_session/io.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/process_session/io.rs @@ -261,9 +261,14 @@ where output.stdin_open = false; let reconciliation = process_session_record_from_live(&live, &output); let _ = write_process_session_record(root, &reconciliation); - let _ = live.control.send(ProcessControl::Terminate); + let terminate_error = live + .control + .send(ProcessControl::Terminate) + .err() + .map(|error| format!(";终止进程控制通道失败:{error}")) + .unwrap_or_default(); return Err(format!( - "command.stdin 已写入但状态无法落盘,需要人工核对:{error}" + "command.stdin 已写入但状态无法落盘,需要人工核对:{error}{terminate_error}" )); } Ok(ProcessSessionStdinResult { @@ -355,7 +360,12 @@ pub(crate) fn mark_process_session_start_audit_failure_at( if let Ok(mut output) = live.output.lock() { output.launch_failure_kind = Some("start-audit-failed".to_string()); } - let _ = live.control.send(ProcessControl::Terminate); + if let Err(terminate_error) = live.control.send(ProcessControl::Terminate) { + app_log!( + "process_session.terminate_after_start_audit_failed processId={} detail={terminate_error}", + process_id + ); + } } let mut record = read_process_session_record(root, process_id)? .ok_or_else(|| "command.start audit 失败后 process record 缺失".to_string())?; diff --git a/apps/ai-game-creator-shell/src-tauri/src/process_session/recovery.rs b/apps/ai-game-creator-shell/src-tauri/src/process_session/recovery.rs index da3de5e8e..d255444eb 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/process_session/recovery.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/process_session/recovery.rs @@ -162,7 +162,12 @@ pub(crate) fn shutdown_all_process_sessions() { .map(|registry| registry.sessions.values().cloned().collect::>()) .unwrap_or_default(); for live in sessions { - let _ = live.control.send(ProcessControl::Shutdown); + if let Err(error) = live.control.send(ProcessControl::Shutdown) { + app_log!( + "process_session.shutdown.send_failed processId={} detail={error}", + live.process_id + ); + } } } diff --git a/docs/project-memory/shared-memory/pitfalls.md b/docs/project-memory/shared-memory/pitfalls.md index fb7d47f6c..268afafcd 100644 --- a/docs/project-memory/shared-memory/pitfalls.md +++ b/docs/project-memory/shared-memory/pitfalls.md @@ -24,6 +24,8 @@ Direct 的 Tauri 进度、活动回合和 manifest 事件不能忽略 `app.emit` 同一边界适用于发布进度、插件状态、认证状态、工作区偏好、错误报告通知和策划 Agent 事件;所有 GUI 事件出口都要保留 emit 错误正文,不能只让业务操作继续返回成功。 +进程会话在状态落盘失败后发送终止控制、关闭时发送 shutdown 的失败也要记录;否则会出现“状态已标记需核对,但目标进程仍活着”而诊断只显示落盘失败的半条事实。 + ## 2026-10-03 AGC 随包 plugins 的 feature 档位必须与消费方一致,且门禁会因 build.rs 未重跑而假通过 - **现象**:Windows 本机 `npm run check:generated-bindings`(`npm run lint` 链内,`scripts/check-repository-ci.sh` 的 Repository checks 也走它)在 `build.rs:167:29` panic:`插件随包资源校验失败:随包插件存在未声明文件:.../src-tauri/resources/plugins/agc-godot-editor/native/gdextension/bin/win-x64/agc_godot_editor.dll(目标 x86_64-pc-windows-msvc 与当前 feature 组合不允许;请先执行随包资源准备步骤)`;树上换成 `agc-unity-editor/dotnet/publish/win-x64/Agc.Unity.Attach.exe` 时报同一类错。反向还有更隐蔽的形态:门禁 2 秒就 exit 0 说「通过」,但 tree 上其实带着编辑器产物。