文档:记录退役收尾删除AGC LLM steer 判定链

- ADR 与里程碑的复查收尾改为「steer 命令删除后整条 LLM 判定链一并退役」,去掉“单独评估”的过渡口径
- Runtime V1.1 的 V1.53 与主实施计划的 2026-08-10 节新增 2026-09-23 复查收尾说明,标明判定链已删除、现役只保留 runtime.steer 唤醒
- decision-log 的 2026-08-10 条目补更新说明,并从已知失败基线用例里移除已删除的 runtime_interrupt_for_true_steer_decision_only_interrupts_older_provider_cursor
- pitfalls 的「Supervisor steer 不能只有内部排队事件」标注判定链实现已删除
- 里程碑验证段补充本轮 cargo check / typecheck / 编码与文档索引 / 幂等检索的实测结果
This commit is contained in:
2026-09-23 12:35:08 +08:00
parent 10f2f05437
commit 857acd4190
6 changed files with 10 additions and 5 deletions
@@ -14,7 +14,7 @@ AGC`apps/ai-game-creator-shell`)的项目对话曾把用户能力挂在「
- 斜杠命令语义整体退役,按「从未存在」处理:不保留入口、不做兼容提示、不写 tombstone,实现、专属测试、构建期门禁条目与文档承诺一并删除,历史由 Git 保存。
- 删除项:Direct 聊天的 `/history` 精确匹配分支与 `reloadHistory``chatPromptPolish``/` 前缀绕过;`chatCommandMetadata``projectSummaryConstants.chatCommandHelp``memoryCommands.parseRememberInput` 等命令清单与参数解析;只服务退役 Supervisor 摘要面板、零外部调用的 `project-summary/*Summaries.ts``agentTrace.ts`;草稿回填死链(前端 `agentPresentation.ts` 的草稿推导与 Rust `suggested_canvas_tool_call`);无人调用的 Tauri 命令 `get_game_creation_agent_capabilities``get_limited_local_commands`;钉住上述字符串的门禁条目与专属测试。
- 终端 swarm chat 入口连带其命令层整体退役:`--swarm-chat``src-tauri/src/swarm_cli.rs` 与整个 `swarm_cli/` 目录(`/help``/agents``/status``/history``/compact``/resume``/goal``/quit` 的解析、帮助输出、turn 派发、观察器、报告与专属测试)一并删除;`SwarmChatFlow``SwarmTurnObservation``SwarmTurnOutcome::Quit``SwarmConfirmationResolution::Quit``SWARM_TURN_*_ERROR`、只服务终端命令的 `agent.compact` / `agent.resume` / `agent.run_status` 校验(`swarm_cli/input.rs` 内那份)与 `print_runtime_response_stream_status` 也随之消失;同名权限 id 在现役 Tauri 命令与 Runtime 生命周期上的门禁保持不动。只服务终端交互内核的 `agent/interaction.rs` 整层(`AgentInteractionAction`、tool registry、`game_creator_agent_uses_interaction_kernel``decide_game_creator_agent_interaction_turn_for_session_at``AgentInteractionProviderStreamSink`)同样删除,该文件只保留自然语言 steer 决策路径 `decide_game_creator_agent_runtime_steer_at`
- 终端 swarm chat 入口连带其命令层整体退役:`--swarm-chat``src-tauri/src/swarm_cli.rs` 与整个 `swarm_cli/` 目录(`/help``/agents``/status``/history``/compact``/resume``/goal``/quit` 的解析、帮助输出、turn 派发、观察器、报告与专属测试)一并删除;`SwarmChatFlow``SwarmTurnObservation``SwarmTurnOutcome::Quit``SwarmConfirmationResolution::Quit``SWARM_TURN_*_ERROR`、只服务终端命令的 `agent.compact` / `agent.resume` / `agent.run_status` 校验(`swarm_cli/input.rs` 内那份)与 `print_runtime_response_stream_status` 也随之消失;同名权限 id 在现役 Tauri 命令与 Runtime 生命周期上的门禁保持不动。只服务终端交互内核的 `agent/interaction.rs` 整层(`AgentInteractionAction`、tool registry、`game_creator_agent_uses_interaction_kernel``decide_game_creator_agent_interaction_turn_for_session_at``AgentInteractionProviderStreamSink`)同样删除;其上仅存的自然语言 steer 决策路径 `decide_game_creator_agent_runtime_steer_at` 在收尾复查后一并删除(见「影响」的复查收尾)
- 保留项(它们不是斜杠命令):命令 id 注册表 `GAME_CREATION_APP_COMMANDS``GameCreationAppPermission`(Rust 运行期项目权限策略的词汇表;App 前端只用 `GameCreationAppCommandDescriptor` 类型表达权限判定与审计日志粒度,数组本体由 Rust 策略路径与跨语言一致性门禁消费)、`needsInitializedChatProject` 与项目权限策略链路、Rust 侧路径与路由的 `/` 前缀校验、`--agent-*` CLI 控制命令(Goal、steer、cancel、retry、context compact、resume、状态查询)与 Tauri IPC 注册。
- 应用内项目对话的输入只剩自然语言回合(外加 `@` 素材引用与附件);需要动作时由 Runtime 工具、确认卡和既有 CLI 控制命令承接,不由聊天文本解析控制词。
- 需要显式控制时改用现有 `--agent-*` CLI 命令:手动压缩是 `--agent-context-compact`,恢复扫描是 `--agent-resume`Goal 生命周期是 `--agent-goal-*`
@@ -30,5 +30,5 @@ AGC`apps/ai-game-creator-shell`)的项目对话曾把用户能力挂在「
- 术语收敛:AGC 里的「命令」此后指项目内部命令 id 与权限位,「斜杠命令」作为已退役说法不再出现在权威文档与代码注释中。
- 应用内项目对话的可见行为不变:正式对话面本来就不渲染命令列表,`/history` 之外没有可执行路径;删除后唯一的用户可见差异是输入以 `/` 开头时按普通文本处理。终端侧不再有 swarm chat 入口,也没有任何斜杠命令面。
- 删除范围包含构建期门禁条目,因此不得为退役概念新增守卫测试或断言残留字符串的 check 条目;防止概念回归依靠架构边界(没有解析层可写)而不是字符串钉桩。
- 复查收尾(同一决定的后续提交):配置向导里指向已删 npm 脚本的 `test:chat` 调用与失去含义的 `--configure-only` 开关、App 内 `请先用 /project …` 用户文案、`interaction.json` 中只服务已删交互内核的 7 个 prompt 键、harness 里因调用方被删而零引用的死导出,以及过期注释一并清理;无前端调用方的 Tauri 命令 `start_game_creator_agent_runtime_task` 随本次清理删除(`main.rs` 注册与 `check-config.mjs` 条目同步移除);`steer_game_creator_agent_runtime_task` 同时是 `decide_game_creator_agent_runtime_steer_at` 的唯一非测试入口,单独评估
- 复查收尾(同一决定的后续提交):配置向导里指向已删 npm 脚本的 `test:chat` 调用与失去含义的 `--configure-only` 开关、App 内 `请先用 /project …` 用户文案、`interaction.json` 中只服务已删交互内核的 7 个 prompt 键、harness 里因调用方被删而零引用的死导出,以及过期注释一并清理;无前端调用方的 Tauri 命令 `start_game_creator_agent_runtime_task` 随本次清理删除(`main.rs` 注册与 `check-config.mjs` 条目同步移除);`steer_game_creator_agent_runtime_task` 同时是 `decide_game_creator_agent_runtime_steer_at` 的唯一非测试入口,删掉该命令后整条 LLM steer 判定链(`agent/interaction.rs``runtime.interrupt_for_steer_decision``agent.runtime.steer_decision` 持久记录、`steer_decision_*` prompt 键与只测该链的专属用例)一并退役
- `.agent/logs/command.log`、项目权限确认卡与 `commandRuns` 属于项目命令审计,继续保留,不受本次退役影响。
@@ -28,7 +28,7 @@
- 无人调用的 Tauri 命令 `get_game_creation_agent_capabilities``get_limited_local_commands`
- 钉住上述字符串的构建期门禁条目与专属测试。
- 终端 swarm chat 入口与整个命令层:`cli.rs``SwarmChat` 变体、`--swarm-chat` 解析与派发、`src/swarm_cli.rs``src/swarm_cli/` 整个目录(输入解析与帮助输出、`/agents``/status` 打印器、`/goal` 引擎、`/compact``/resume``/quit` 退出分支、观察器、报告、turn 派发与等待)、`SwarmChatFlow``SwarmTurnObservation``SwarmTurnOutcome::Quit``SwarmConfirmationResolution::Quit``SWARM_TURN_*_ERROR`,以及 `swarm_cli/input.rs` 中那份只为终端命令存在的 `agent.compact` / `agent.resume` / `agent.run_status` 权限校验(同名权限 id 在现役 Tauri 命令与 Runtime 生命周期上的门禁保持不动)。
- 只服务终端交互内核的 `agent/interaction.rs` 整层:`AgentInteractionAction`、tool registry、`game_creator_agent_uses_interaction_kernel``decide_game_creator_agent_interaction_turn_for_session_at``AgentInteractionProviderStreamSink`只保留自然语言 steer 决策 LLM 路径 `decide_game_creator_agent_runtime_steer_at`
- 只服务终端交互内核的 `agent/interaction.rs` 整层:`AgentInteractionAction`、tool registry、`game_creator_agent_uses_interaction_kernel``decide_game_creator_agent_interaction_turn_for_session_at``AgentInteractionProviderStreamSink`其上的自然语言 steer 决策 LLM 路径 `decide_game_creator_agent_runtime_steer_at` 在收尾复查后一并删除,见「收尾清理」
- 只能由命令触达的打印器:`print_runtime_response_stream_status` 及其专属测试。
- 依赖终端入口的脚本与套件:`scripts/agent-swarm-test-chat.mjs``scripts/agent-runtime-deterministic-playable-e2e.mjs``scripts/deterministic-lane-defense-provider.mjs`,套件 `user-input``supervisor-autonomous-playable-lane-defense``supervisor-swarm-autonomous-chat``supervisor-swarm-static-isolated-autonomous-chat``supervisor-swarm-collaboration-policy-mixed-recovery`,以及 harness 里的交互式 CLI 管道(`startInteractiveCli``writeInteractiveCliLine``waitForInteractiveCli*``closeInteractiveCli``activeInteractiveCliSessions``answerRemainingInteractiveQuestions` 等)与只服务这些套件的混合套件分支、状态字段、sentinel 与 npm 脚本。 同时清掉只被这些套件调用的 harness 残件:`collaboration-assertions.mjs` 的混合/静态隔离断言族(`supervisorSwarmMixed*``observeSupervisorSwarmStaticIsolatedProviderOverlap`)、`repair-recovery.mjs` 的静态隔离观测调用点、evidence 模板与校验里的 `mixed*` / `staticIsolated*` / `initialBatchRecovery*` 占位字段,以及 `self-test.mjs` 中对应的合成用例与汇总字段。
@@ -57,6 +57,7 @@
- `cargo check --tests`0 error;删改文件无新增 `dead_code` 告警(按「父提交 vs 本次」引用数逐条比对告警标识符确认)。
- `npm run check:encoding``npm run check:doc-index``git diff --check`:通过。
- 真实 E2E harness 自检 `node scripts/agent-runtime-real-e2e.mjs --self-test``status: PASS`harness 相对与具名 import 全部可解析。
- 收尾清理(2026-09-23LLM steer 判定链):`cargo check --tests` 0 error,告警与改动前基线一致(无新增 `dead_code`);`npm --workspace apps/ai-game-creator-shell run typecheck``npm run check:encoding``npm run check:doc-index``git diff --check` 通过;幂等复核 `steer_decision` / `interrupt_for_steer_decision` / `decide_game_creator_agent_runtime_steer_at``apps/``packages/` 源码中零命中。
## 文档收口
@@ -76,7 +77,7 @@
- 用户文案:App 内 `请先用 /project 设置本地项目。` 改为 `请先打开本地项目。`
- 注释与 prompt`chatPromptPolish` 头部注释的 `/` 命令表述、`harness/process.mjs``scripts/check-config.mjs` 中指向已退役入口的说明,以及 `interaction.json` 中只服务已删交互内核的 7 个键(`execute_description``resume_description``project_location_description``protocol``system``user``user_with_context`)。
- harness 死导出:`runtime-state.mjs` 的 4 个 schema 常量、`assertions/runtime.mjs``harness/project.mjs``collaboration-policy.mjs``persistence.mjs` 中因调用方被删而零引用的函数,连同因此失去用途的 import。
- 无前端调用方的 Tauri 命令`start_game_creator_agent_runtime_task` 删除(`main.rs` 注册与 `check-config.mjs` 条目同步移除)`steer_game_creator_agent_runtime_task` 同时是 `decide_game_creator_agent_runtime_steer_at` 的唯一非测试入口,单独处置
- 无前端调用方的 Tauri 命令 `start_game_creator_agent_runtime_task` `steer_game_creator_agent_runtime_task` 全部删除(`main.rs` 注册与 `check-config.mjs` 条目同步移除)。删掉 steer 命令后其唯一非测试入口的整条 LLM steer 判定链一并退役:`agent/interaction.rs``runtime_steer_decision` 工具、判定请求构建、响应解析、`decide_game_creator_agent_runtime_steer_at`)、`runtime.interrupt_for_steer_decision` RPC 与派发分支、持久 decision 记录(`agent.runtime.steer_decision`)、`AgentRuntimeProviderInterrupt::applied_steer_cursor``AgentRuntimeSteerResult``assistantReply / interruptDecision / decisionReason` 字段、`steer_decision_*` prompt 键,以及只测该链条的 provider / runner / runtime_state 用例
## 未做与边界
@@ -361,7 +361,7 @@ Godot 编辑器操控复用既有 AGC 插件宿主、EditorAdapter、Runner 和
- 决策(事件与退出):manifest 失效与 Runtime update relay 的接收端从单槽改为按 `event_sink_token` 去重的注册表并广播,发送失败只淘汰该接收端;GUI 退出先释放本窗口参与锁,仍有其它窗口时保留 Runner(`agent.runner.gui_exit.retained_for_other_windows`),最后一个窗口才请求关闭。Runner 启动失败时先按最新 endpoint 复用一次,避免两个窗口同时冷启动时的实例锁竞争被误报成启动失败。
- 边界:本机 GUI ↔ Runner 协议方法与参数不变,不引入多 Runner、不做跨 AppData 会话共享;项目级 `.agent/project.lock` 不变,多窗口仍不能并行写同一项目;平台登录态 generation 单调与 claim 失配失败关闭语义保持不变;混用新旧版本二进制访问同一 AppData 不属于支持场景。
- 验证:定向 Rust `runner::tests::gui_owner_*` 11 条与新增的参与锁多窗口 / 存活判定 / claim 采纳与轮换 / 同 claim 第二个窗口不清空登录态用例全部通过;真实 debug 二进制 Windows smoke 证明同一 AppData 两个 GUI 都完成 `startup.setup.complete`、只存在一个 `--agent-runner` 进程、关闭一个窗口后另一个窗口与 Runner 继续存活、最后一个窗口退出后 Runner 退出并删除 endpoint`npm run check:encoding``npm run check:doc-index``git diff --check` 通过。
- 未验证 / 已知环境问题:真实安装包双开需要重新构建发布后才能验证;`durable_provider_handoff_prevents_shutdown_even_when_corrupt``durable_provider_retry_prevents_shutdown_and_reopens_writes``runtime_interrupt_for_true_steer_decision_only_interrupts_older_provider_cursor`条用例在本机改动前的基线上即失败(Windows 安全对象 owner 校验与 Provider 请求重复),与本决策无关。
- 未验证 / 已知环境问题:真实安装包双开需要重新构建发布后才能验证;`durable_provider_handoff_prevents_shutdown_even_when_corrupt``durable_provider_retry_prevents_shutdown_and_reopens_writes`条用例在本机改动前的基线上即失败(Windows 安全对象 owner 校验与 Provider 请求重复),与本决策无关。
- 关联文档:`docs/technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md`2026-09-16 节)、`docs/project-memory/plans/【里程碑】AGC同AppData多窗口共享Runner-2026-09-16.md`
## 2026-09-16 DirectProject 三维请求解除 Phaser 固定约束,由 Codex 自选技术栈
@@ -8221,6 +8221,7 @@ CI 上 `background_agent_runtime_recovers_stale_running_before_pending_task` 在
- 时序:steer durable 入队后不先通知 Runner。`false` 或判定失败才调用只唤醒的 `runtime.steer``true` 直接调用 `runtime.interrupt_for_steer_decision`。后者必须读取已持久化判定,并只中断 `appliedSteerCursor < steer.sequence` 的旧 Provider;新规划 Provider、工具和外部副作用不可被误杀。
- 失败:判定调用、协议解析或持久化失败时公开回复“继续当前任务”,在下一安全边界应用 steer,绝不退化为默认中断。External Runner 与本地进程内执行保持同一语义。
- 关联:`docs/technical/【技术方案】AI游戏创作Agent Runtime V1.1-2026-07-12.md` V1.53,以及 `docs/project-memory/shared-memory/pitfalls.md` 的“Supervisor steer 不能只有内部排队事件”。
- 2026-09-23 更新(已被「退役AGC项目对话斜杠命令与终端swarm chat入口」取代):`runtime.interrupt_for_steer_decision``steer_decision` LLM 判定链与 `steer_game_creator_agent_runtime_task` 命令已整体删除;steer 仍 durable 入队,但只保留 `runtime.steer` 唤醒路径,不再存在条件中断旧 Provider 的分支。
## 2026-08-10 普通图片废弃 assetKind 的迁移与写入门禁
@@ -801,6 +801,7 @@ Cocos Creator 根目录由 `package.json.creator.version` 与普通 `assets/`
- 并发边界:steer 入队、Runner `runtime.steer` 通知都不得直接触发 Provider interrupt。Codex app-server 的判定使用独立节点,不能等待主节点 turn 锁;判定为 true 后也只能中断 `appliedSteerCursor < steer.sequence` 的旧 Provider 请求,已经消费该 steer 后启动的新请求不可被误杀。已经开始的工具和外部动作不强杀,完成 observation 后再消费 steer。
- 验证:真实 mock LLM 回归必须覆盖状态询问回复且 `interruptCurrentProvider=false`;持久重放只保留一条语义回复;steer 入队后旧 Provider 继续运行,判定为 true 后才中断;新规划 Provider 的 cursor 已包含该 steer 时即使旧判定为 true 也不能中断。前端同秒多条消息保持“用户补充 → 判断提示/语义回复”的关联顺序。
- 关联:`apps/ai-game-creator-shell/src-tauri/src/agent/interaction.rs``apps/ai-game-creator-shell/src-tauri/src/agent/runtime_protocol/steering.rs``apps/ai-game-creator-shell/src-tauri/src/runner/dispatch.rs``apps/ai-game-creator-shell/src/features/agent-runtime/model.ts`
- 2026-09-23 更新:`agent/interaction.rs``steer-decision` LLM 判定链已整体删除,本条中「判定 LLM / `interruptCurrentProvider` / 只中断旧 cursor」的实现细节仅作历史记录;现役语义是 steer durable 入队后由 `runtime.steer` 唤醒,并在下一安全边界应用。
## Jenkins 异步备份不能用 nohup 脱离作业
@@ -1639,6 +1639,7 @@ V1.53 把根 Project Supervisor 的 same-run steer 从“收到消息立即中
- 条件中断必须先读取已持久化 decision,并只允许中断注册时 `appliedSteerCursor < steer.sequence` 的旧 planning/final-reply Provider。若旧请求已自然结束,或新 Provider 已消费该 steer 后启动,则返回 `providerInterrupted=false`,不得误杀新规划。工具、外部副作用、确认、process session、Git、receipt 和 finalization 始终不强杀,在下一安全边界消费 steer。
- LLM 判定、解析或持久化失败时写入关联的非终态 fallback 回复,保持当前任务运行,并在下一安全边界应用已排队 steer;失败不能退回“默认中断”。判定与回复按 `agentId / runId / steerId` 幂等,冲突终态失败关闭。
- 验收必须覆盖判定 LLM 的 `true / false` 协议、公开回复幂等、入队本身不中断、`runtime.steer` 有活动 Provider 时仍不中断、缺失 decision 拒绝条件中断、`false` decision 不中断、`true` decision 只中断旧 cursor,以及判定失败后同一 run 继续。
- 2026-09-23 复查收尾:本节描述的 LLM 判定链已随「退役AGC项目对话斜杠命令与终端swarm chat入口」整体删除——`runtime_steer_decision` 工具与 `decide_game_creator_agent_runtime_steer_at``runtime.interrupt_for_steer_decision` RPC、`agent.runtime.steer_decision` 持久记录、`steer_decision_*` prompt 键、`steer_game_creator_agent_runtime_task` 命令与只测该链的用例均不存在。same-run steer 仍 durable 入队并由 `runtime.steer``--agent-steer`)唤醒、在下一安全边界应用;本节仅作历史记录。
## V1.54 通用多 Agent DAG 编排 crate
@@ -623,6 +623,7 @@ Supervisor 认领该回执后,由父 run 自己为每个原 delivery 逐一创
- steer 入队后不得先通知 Runner。判定为无需中断或判定失败时,`runtime.steer` 只校验 durable ledger、唤醒同一 Run 并固定保持 `providerInterrupted=false`;判定为需要改向时,只有 `runtime.interrupt_for_steer_decision` 可以读取持久 decision 后条件中断旧 Provider。已经消费该 steer 的新 Provider、工具和外部动作不得被中断。
- 状态询问、解释和不冲突补充默认继续当前 Provider;明确停止、改向或会让在途方案过期时才允许请求中断。判定失败时继续任务,并在下一安全边界消费消息,不得把失败等同于需要中断。
- UI 通过持久 conversation 展示关联回复,刷新后仍可见;返回的 `assistantReply / interruptDecision / decisionReason` 只用于本次命令结果与诊断,不形成第二个会话或第二个 Run。
- 2026-09-23 复查收尾:`runtime.interrupt_for_steer_decision``steer_decision` LLM 判定链与 `assistantReply / interruptDecision / decisionReason` 返回字段已整体删除(见 [`【ADR】退役AGC项目对话斜杠命令与终端swarm chat入口-2026-09-22.md`](../adr/【ADR】退役AGC项目对话斜杠命令与终端swarm chat入口-2026-09-22.md));same-run steer 现在只走 durable ledger 加 `runtime.steer` 唤醒,本节仅作历史记录。
V1.11 的受保护仓库控制目录同时包含 `.git / .agent / .agents / .codex`;其中 `.agent` 对项目命令隐藏,其余控制目录只读。