From 354acfd70b6ba0addf6aa166e25fb3048bf73909 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=B7=E5=AE=87?= Date: Wed, 30 Sep 2026 10:41:10 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=87=E6=A1=A3=EF=BC=9ADirectProject=20?= =?UTF-8?q?=E5=AE=88=E5=8D=AB=E6=B8=85=E7=90=86=E8=90=BD=E5=9C=B0=EF=BC=8C?= =?UTF-8?q?ADR=20=E4=B8=8E=E5=AE=9E=E6=96=BD=E8=AE=A1=E5=88=92=E6=A0=87?= =?UTF-8?q?=E8=AE=B0=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - ADR 状态改为 2026-09-30 落地完成,§9 守卫退役条目改成已落地口径 - 实施计划状态改为第 0–5 步全部完成,进度表第 5 步写成落地说明;第 4 步的 TurnAlreadyRunning 交还给第 5 步 - 09-23 接单化计划加后续注记:接单/拒单词表与 TurnAlreadyRunning 已退役,正文不再回改 - decision-log 的 09-30 条目补落地与验证结果,09-24 条目加落地指向 --- ...ct命令入队化与待发消息队列归宿主-2026-09-24.md | 5 +++-- .../shared-memory/decision-log.md | 17 +++++++++++------ ...roject命令入队化与待发消息队列归宿主-2026-09-24.md | 8 ++++---- ...ž施计划】DirectProject命令接单化-2026-09-23.md | 3 +++ 4 files changed, 21 insertions(+), 12 deletions(-) diff --git a/docs/adr/【ADR】DirectProject命令入队化与待发消息队列归宿主-2026-09-24.md b/docs/adr/【ADR】DirectProject命令入队化与待发消息队列归宿主-2026-09-24.md index 90d8b2735..569887ae5 100644 --- a/docs/adr/【ADR】DirectProject命令入队化与待发消息队列归宿主-2026-09-24.md +++ b/docs/adr/【ADR】DirectProject命令入队化与待发消息队列归宿主-2026-09-24.md @@ -1,6 +1,6 @@ # 【ADR】DirectProject命令入队化与待发消息队列归宿主 -状态:已接受(2026-09-24 设计定稿;**尚未落地**,实施顺序与验收见 +状态:已接受(2026-09-24 设计定稿;**2026-09-30 落地完成**,实施顺序与验收见 [`【实施计划】DirectProject命令入队化与待发消息队列归宿主-2026-09-24`](../technical/【实施计划】DirectProject命令入队化与待发消息队列归宿主-2026-09-24.md)) ## 背景 @@ -87,7 +87,8 @@ Thread Manager 在一个回合收口**之后**原子地做:取队首 → 登 - `DirectTaonierActiveInvocationGuard` 的**身份**与 Thread Manager 的 `active_turn.turn_id` 是同一件事的两份记录 (GUI 路径下同源字符串),而 09-23 ADR 立的是"同一件事只许有一处真相"。CLI 退役后它的硬阻塞消失:五个读者 (`direct_execution` / `direct_tool_bridge` / `direct_validation` / `direct_project_context` / 付费美术重生成) - 改读 Thread Manager 的活动回合身份,守卫连同它的测试一起删,不再有第二份进程内记录。 + 已改读 Thread Manager 的活动回合身份(`direct_active_turn_id_at`),守卫连同它的测试一起删掉,不再有第二份 + 进程内记录。 - 删守卫的前置判据**已核实(2026-09-30)**,不需要新增"取消路径补无条件终态":`d833ca9d3` 的兜底路径本来就 同时做三件事——释放占用、往事件流补一条 `turn.completed{aborted}`(否则前端会永远停在运行中)、调 `complete_direct_thread_turn` 解除占用。删掉的只有 `DirectTaonierActiveInvocationGuard` 那张进程内表; diff --git a/docs/project-memory/shared-memory/decision-log.md b/docs/project-memory/shared-memory/decision-log.md index 66dc906c3..118f06d08 100644 --- a/docs/project-memory/shared-memory/decision-log.md +++ b/docs/project-memory/shared-memory/decision-log.md @@ -9609,6 +9609,8 @@ CI 上 `background_agent_runtime_recovers_stale_running_before_pending_task` 在 `DirectTaonierActiveInvocationGuard` 的身份与 Thread Manager 的 `active_turn.turn_id` 是同一件事的两份记录, CLI 退役后让那五个读者改读 Thread Manager,再在第二步删掉守卫与它的 60 秒卡死兜底 (删前必须保住"回合卡死可被取消解开"这条由 `d833ca9d3` 事故换来的保证)。 + **(落地,2026-09-30)**:见下方 09-30 条,守卫已删、`TurnAlreadyRunning` 已删,60 秒闸门改挂 + Thread Manager 的占用登记年龄。 - 代价:入队即写盘(引用 UI 设计文档的条目会生成 `ui/generated-.js`,取消不撤);检查是时间点事实、 放行不重跑(manifest / 权限 / 目录变化后照旧放行,偏差落到回合失败);队列随进程消失,不做跨进程持久化; 失去"真实二进制驱动执行层生产验证"这条手工路径。 @@ -9629,9 +9631,12 @@ CI 上 `background_agent_runtime_recovers_stale_running_before_pending_task` 在 `NeverReachedExecutor` 时校验年龄(`DIRECT_STALE_TURN_RELEASE_MIN_AGE_MS`),返回身份;释放本身仍由 既有的 `complete_direct_thread_turn` + `kick_direct_queue_dispatch` 完成(天然幂等)。 - 决策:连接死亡的失败事实由 app-server 连接层自己落地(`ab970b9fd`),与守卫无关,删除守卫不动那条链路。 -- 影响范围:`agent/direct_runtime/mod.rs`(删守卫表 / 只读探测,改为 `direct_active_turn_id_at`)、 - `agent/direct_thread_manager.rs`(`DirectTurnIdentity` + `read_direct_turn_identity`)、 - `agent/codex_app_server/mod.rs`(兜底目标改 `DirectStaleTurnReleaseReason`)、五个身份读者与相关测试、 - 删 `DirectTurnError::TurnAlreadyRunning` 与前端对应分支 / 生成绑定。 -- 验证:`cargo test --bin genarrative-ai-game-creator-shell -- agent::direct`;`npx vitest run tests/appSurface.test.ts`; - `npm --workspace apps/ai-game-creator-shell run typecheck`;`npm run check:encoding`;`git diff --check`。 +- 落地(`direct_runtime/mod.rs` 删守卫表与只读探测,改 `direct_active_turn_id_at`;`direct_thread_manager.rs` + 补 `DirectTurnIdentity` + `read_direct_turn_identity`;`codex_app_server/mod.rs` 兜底目标改 + `DirectStaleTurnReleaseReason` 并接 `direct_stale_turn_for_release`;五个身份读者与相关测试改写; + `direct_turn_dispatch.rs` 不再另取调用身份;删 `DirectTurnError::TurnAlreadyRunning` 与前端分支 / 生成绑定)。 +- 验证:`cargo test --bin genarrative-ai-game-creator-shell -- agent::direct`(370 passed);新增 + `stale_cancel_releases_the_occupancy_and_dispatches_the_next_pending_turn` 与两条 `direct_stale_turn_for_release` + 单测;`npx vitest run tests/appSurface.test.ts`(214 passed / 9 skipped)、`directThreadChat` / + `directTurnPresentation` / `project-conversation` 定向用例、`npm --workspace apps/ai-game-creator-shell run typecheck`、 + `npm run check:encoding`、`git diff --check`。 diff --git a/docs/technical/【实施计划】DirectProject命令入队化与待发消息队列归宿主-2026-09-24.md b/docs/technical/【实施计划】DirectProject命令入队化与待发消息队列归宿主-2026-09-24.md index 8a7dc67f6..ff038a336 100644 --- a/docs/technical/【实施计划】DirectProject命令入队化与待发消息队列归宿主-2026-09-24.md +++ b/docs/technical/【实施计划】DirectProject命令入队化与待发消息队列归宿主-2026-09-24.md @@ -2,7 +2,7 @@ 更新时间:`2026-09-24` -状态:**实施中**(第 0–4 步已落地;第 5 步进行中) +状态:**已落地**(第 0–5 步全部完成,2026-09-30) 设计口径见 [`【ADR】DirectProject命令入队化与待发消息队列归宿主-2026-09-24`](../adr/【ADR】DirectProject命令入队化与待发消息队列归宿主-2026-09-24.md)。 本文件只排实施顺序、不变式与验收,不重复设计理由。 @@ -16,7 +16,7 @@ | 第 2 步 队列归 Thread Manager | 已落地 | `StoredEvent.pending` 产物字段 + `enqueue_pending_turn` / `remove_pending_turn` / `claim_pending_turn`;放行在 `agent/direct_turn_dispatch.rs`(`kick_direct_queue_dispatch` + `DirectTurnReservation`) | | 第 3 步 前端收口 | 已落地 | 见下面「第 3 步的落地细则」 | | 第 4 步 CLI 与夹具退役 | 已落地 | 删 `CliCommand::DirectCodexChat`(变体 / `project_path_mut` / 解析 / 派发)、`run_direct_game_creator_turn_at` 一对包装函数与夹具脚本;顺带删掉只剩测试在用的 `direct_turn_error_boundary_text`(判据只剩 `direct_turn_enqueue_failure` 一处),三条边界测试改打 `direct_turn_enqueue_failure(...).message`。**`TurnAlreadyRunning` 挪到第 5 步**(它最后一个生产点在调用身份守卫里) | -| 第 5 步 守卫清理 | 进行中 | 前置判据已核实;改读 Thread Manager 活动回合身份、删调用身份守卫与其测试,并删 `TurnAlreadyRunning` | +| 第 5 步 守卫清理 | 已落地 | 五个身份读者改读 `direct_active_turn_id_at`;删 `DirectTaonierActiveInvocationGuard` / `DirectActiveTurnView` / 只读探测与 `release_stale_direct_taonier_active_invocation`(改 `direct_stale_turn_for_release` 只做前置校验);删 `DirectTurnError::TurnAlreadyRunning` 与前端分支 / 生成绑定;补前置判据用例 | ## 第 0 步:词表切换(与代码同批,不单独提交) @@ -145,8 +145,8 @@ kick 幂等(并发两次只认领一次);队首在放行后被移除、rem - `agent/direct_runtime/mod.rs`:删 `run_direct_game_creator_turn_at` 与 `run_direct_game_creator_turn_at_with_creation_type` (各自只有彼此与 CLI 一个调用方)。 - 删 `apps/ai-game-creator-shell/scripts/direct-execution-production-fixture.mjs`(CLI 的唯一消费者)。 -- 删 `DirectTurnError::TurnAlreadyRunning`(两个生产点都没了)与前端"同一轮消息仍在处理中"文案、专属分支、 - `tests/appSurface/project-conversation.suite.ts` 的对应断言。 +- `DirectTurnError::TurnAlreadyRunning` 与前端"同一轮消息仍在处理中"文案、专属分支、`project-conversation.suite.ts` + 的对应断言**挪到第 5 步**(它最后一个生产点在调用身份守卫里)。 - 文档同步:09-22 里程碑把 `--direct-codex-chat` 从"范围外(保留)"改成退役项;两份 Direct 技术方案的 CLI 承诺删掉; 09-23 ADR 与 `decision-log.md` 里"CLI 保持 await"的口径改掉。 diff --git a/docs/technical/【实施计划】DirectProject命令接单化-2026-09-23.md b/docs/technical/【实施计划】DirectProject命令接单化-2026-09-23.md index 4724c1822..989095efb 100644 --- a/docs/technical/【实施计划】DirectProject命令接单化-2026-09-23.md +++ b/docs/technical/【实施计划】DirectProject命令接单化-2026-09-23.md @@ -4,6 +4,9 @@ 状态:**四步全部落地**。 +后续:09-24 起命令边界改叫「入队 / 入队失败 / 放行」,本文里的「接单 / 拒单」与 `TurnAlreadyRunning` +都已退役(见 09-24 ADR 与 09-30 决策记录);正文保留当时口径,不再回改。 + 设计口径见 [`【ADR】DirectProject命令接单化-2026-09-23`](../adr/【ADR】DirectProject命令接单化-2026-09-23.md)。 本文件只排实施顺序、不变式与验收,不重复设计理由。