补齐单 Agent 持久只读并行批次

实现严格只读动作的持久并行执行与线性化恢复
补齐崩溃窗口、控制漂移和串行屏障回归
新增真实 Provider parallel-read suite 并记录 PASS 证据
同步 Runtime 技术方案、实施计划与项目决策
This commit is contained in:
AIGameCreator App
2026-07-16 12:38:34 +08:00
parent 6ff4556201
commit e1cb5b699e
6 changed files with 3412 additions and 25 deletions
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -16,6 +16,16 @@
---
## 2026-07-16 AI 游戏创作 Agent Runtime 只并行持久只读批次
- 背景:V1.26 已允许 Provider 一轮返回最多三个原生工具 action,但同一 Agent 仍逐个执行;直接把 action future `join` 会因同步文件 I/O、单 pending sidecar 和项目一致性锁而形成假并行,并破坏 steer、崩溃恢复与 exactly-once。
- 决策:同一 Agent 只把连续 2-3 个自动批准的严格只读工具组成 durable parallel-read batch。首版白名单为 `memory.read``conversation.read``asset.list``project.search``project.diff``git.inspect``file.list``file.read``task.list`;所有写入、命令/进程、确认、Provider/MCP、生成、Git commit、委派和回执认领工具继续串行。批次在项目一致性锁内完成 preflight、executing、线程并行读取和 observed 落盘,控制请求只在批次边界前或后线性化;终态观察仍按 Provider 顺序投影。
- 恢复与安全:批次成员使用稳定 actionId/指纹。Runner 在 `executing` 中退出只允许同身份重放严格只读物理读取,`observed` 只补齐幂等投影;不能新建 Provider lifecycle、action 或 receipt。公共审计只记录身份、工具名、计时与重叠结论,不记录参数、观察正文、绝对路径或凭据。任何分类、策略、Goal、steer、repository context 或持久身份不确定都失败关闭或退回既有串行路径。
- 影响范围:AI 游戏创作客户端 Rust Agent Runtime、Runner 恢复、定向测试、真实 Provider E2E 和 Runtime 技术文档。
- 验证方式:`parallel_read_batch_` 的 8 项确定性用例覆盖真实重叠、稳定顺序、串行屏障、控制竞态、取消/Goal/repository drift、`executing` 重放和 `observed`/部分投影恢复去重;正式 `openai_chat / gpt-5.5` 独立 suite 必须证明模型自主发出至少两个同轮读取、时间区间真实重叠、同 run 唯一回复、原生协议、零重放/重复/泄漏和隔离清理。
- 真实结论:2026-07-16 隔离 `parallel-read` suite PASS。真实模型同轮提交 2 个独立 `project.search`,单一持久批次重叠 `10,969,247ns` 且按 Provider 顺序投影;4/4 个成功工具计划与 2/2 个 repair 全为 `native_runtime_tools`6 个 tool-plan 与 1 个 final-reply lifecycle 唯一闭合。最终 assistant/completed 各 1,重复 action/receipt/Provider lifecycle、遗留 finalization/批次 sidecar、私有正文、API Key、诱饵、项目/配置路径和报告泄漏均为 0,隔离 Runner/AppData/项目完整清理。V1.27 当前门禁为 PASS。
- 关联文档:`docs/technical/【技术方案】AI游戏创作Agent Runtime V1.1-2026-07-12.md`
## 2026-07-16 AI 游戏创作 Goal 真实验收强制原生工具协议
- 背景:V1.18 的 `goal-runtime` 已证明 edit/pause/Runner 强杀/resume/finalization,但该 PASS 早于 V1.26 原生工具目录;旧验收只接受协议兼容集合,无法证明长任务没有静默退回 wrapper/text JSON。阶段等待在 Runtime 已因外部 transport 失败时还可能继续等 30 分钟。
@@ -1004,6 +1004,19 @@ V1.26 把 OpenAI-compatible planning 从单个 `submit_agent_tool_plan` 包装
2026-07-16 正式 `openai_chat / gpt-5.5``project-skill` suite **PASS**。首轮真实执行在匹配 Skill 读取后暴露旧 parser 拒绝 plan-only,保留现场复验进一步证明模型会先单独调用 `update_agent_plan`;Runtime 空动作分支原本已能持久化计划并安全进入下一轮,因此移除矛盾的 parser 拒绝并补三轮确定性闭环。最终加强门禁复跑记录 31 条 task、57 条 event、94 条 Agent DB、6 个成功工具动作和 2 个确认动作;9/9 个成功工具计划与 6/6 个格式修复全部使用 `native_runtime_tools`,旧 wrapper 与 text JSON fallback 均为 0。Agent 在首个项目修改前读取匹配 Skill 1 次、无关 Skill 0 次,只修改 1 个目标文件,Agent `project.verify` 与宿主复验均通过;15 个 tool-plan 加 1 个 final-reply Provider lifecycle 全部唯一闭合,最终 assistant/completed 各 1,重复 message/receipt、遗留 finalization、Skill 正文、API Key、诱饵、项目/正式配置路径和报告泄漏均为 0,隔离 Runner、AppData 与一次性项目完整清理。确定性 Tauri 全量为 822 passed / 4 ignoredV1.26 真实行为门禁至此完成。
## V1.27 同 Agent 持久只读并行批次
V1.27 在 V1.26 一次最多三个原生 action 的基础上,让同一 Agent 可以真实重叠执行彼此独立的本地只读工具。并行不是通用 action 调度器,也不改变不同 Agent 已有的 lane 并行;Runtime 只把连续 2-3 个、当前策略为自动批准且列入严格白名单的读取动作组成一个持久批次,其余动作继续按 Provider 顺序串行。
- 首版并行白名单固定为 `memory.read``conversation.read``asset.list``project.search``project.diff``git.inspect``file.list``file.read``task.list``project.index` 会刷新持久启动上下文,不属于纯读取;`command.output_read``agent.action_history``agent.run_status` 可能产生审计、屏障或回执认领,也不进入批次。写入、确认、命令/进程、Git commit、验证、预览、图片/生成 Provider、MCP、消息、委派、动态 child 和其它外部副作用全部保持串行。
- 只合并 Provider 顺序中连续的安全读取;任一非安全动作形成顺序屏障。例如 `read A / read B / write C / read D` 只并行前两个读取。策略要求确认或拒绝、工具目录变化、Goal/steer/repository context 身份漂移时不建立批次,不能把确认消费、策略错误或旧动作暗中转成自动读取。
- 私有事实源新增按 `project / agent / task / session / run / loop` 绑定的 durable parallel-read batch,最多保存三个稳定 action identity、输入指纹、Provider 顺序、执行状态、终态 observation 和无正文计时元数据。状态只允许 `executing -> observed`Runner 在 `executing` 中退出时,因为成员工具已由严格分类证明无副作用,可以在同一 action identity 下重新读取,不能创建新 action、receipt 或 Provider request。`observed` 恢复只补齐缺失投影,不重新执行物理读取。
- 批次执行在一个项目一致性锁内完成预检、`executing` 落盘、真实工作线程并行读取和 `observed` 原子落盘。steer、Goal edit/pause 和 Runtime 写动作必须在该锁之后才被接受,因此整个批次是一个明确线性化边界:控制请求先获得锁则旧批次零执行,批次先获得锁则其全部读取先完成,再接受控制请求。取消仍遵循“已进入工具的动作返回后停止”,不强杀线程。
- 物理完成顺序不能影响语义。Runtime 始终按 Provider action index 依次写 task/event/receipt/Agent DB、更新结构化计划和 context bundle;每个 actionId 的 terminal observation 与 receipt 必须唯一。公共并行审计只保存 batch/action identity、工具名、数量、时间区间和是否存在真实重叠,不保存 input、observation 正文、项目绝对路径或凭据。
- 确定性验收必须覆盖白名单/拒绝清单、连续分组与串行屏障、两个及三个读取的真实线程重叠、完成顺序反转但观察顺序稳定、策略变化、steer 先后双向竞态、取消、Goal/repository drift、`executing` 重放、`observed` 只补投影、Runner 强杀、重复 receipt/event/Agent DB 为 0 以及公共零正文。真实 Provider 必须在未提供工具名和顺序配方的任务中自主同轮发出至少两个独立读取,审计时间区间证明重叠,随后同一 Agent/Session/run 完成唯一回复,并证明原生工具协议、稳定 action 顺序、零副作用重放、零重复、零泄漏和隔离现场清理。
2026-07-16 正式 `openai_chat / gpt-5.5` 的隔离 `parallel-read` suite **PASS**。一次性项目构造 421 个只读语料文件,真实模型在同一个原生 planning 轮次提交 2 个独立 `project.search`,Runtime 只形成 1 个持久并行批次;两个物理搜索重叠 `10,969,247ns`,公共投影与 receipt 均保持 Provider action 顺序。最终记录 13 条 task、23 条 event 和 48 条 Agent DB4/4 个成功工具计划与 2/2 个格式修复都使用 `native_runtime_tools`wrapper/text JSON fallback 为 06 个 tool-plan 和 1 个 final-reply Provider lifecycle 全部唯一闭合。最终 assistant/completed 各 1,重复 action lifecycle、receipt、Provider lifecycle、遗留 finalization/批次 sidecar,以及仓库私有正文、API Key、诱饵、项目/正式配置绝对路径和报告泄漏均为 0;隔离 Runner、AppData 与 disposable 项目完整清理。V1.27 真实行为门禁至此完成。
## 验收命令
- `cargo test --manifest-path apps/ai-game-creator-shell/src-tauri/Cargo.toml structured_plan_ -- --nocapture`
@@ -1011,6 +1024,7 @@ V1.26 把 OpenAI-compatible planning 从单个 `submit_agent_tool_plan` 包装
- `cargo test --manifest-path apps/ai-game-creator-shell/src-tauri/Cargo.toml goal_context_bundle_v4_migrates_v3_and_v2_then_rejects_plan_mismatch -- --nocapture`
- `cargo test --manifest-path apps/ai-game-creator-shell/src-tauri/Cargo.toml response_stream_ -- --nocapture`
- `cargo test --manifest-path apps/ai-game-creator-shell/src-tauri/Cargo.toml mcp_ -- --nocapture`
- `cargo test --manifest-path apps/ai-game-creator-shell/src-tauri/Cargo.toml parallel_read_batch_ -- --nocapture`
- `cargo test --manifest-path apps/ai-game-creator-shell/src-tauri/Cargo.toml swarm_cli::tests -- --nocapture`
- `cargo test --manifest-path apps/ai-game-creator-shell/src-tauri/Cargo.toml typed_goal_pause_and_cancel_require_durable_intent_and_keep_exact_run -- --nocapture`
- `npm run ai-game-creator-shell:typecheck`
@@ -1028,6 +1042,7 @@ V1.26 把 OpenAI-compatible planning 从单个 `submit_agent_tool_plan` 包装
- `npm run ai-game-creator-shell:agent-runtime:real-e2e -- --config-dir <AppData> --suite user-input-runtime`
- `npm run ai-game-creator-shell:agent-runtime:real-e2e -- --config-dir <AppData> --suite scoped-agents`
- `npm run ai-game-creator-shell:agent-runtime:real-e2e -- --config-dir <AppData> --suite project-skill`
- `npm run ai-game-creator-shell:agent-runtime:real-e2e -- --config-dir <AppData> --suite parallel-read`
- `npm run ai-game-creator-shell:agent-runtime:real-e2e -- --config-dir <AppData> --suite full`
- `npm run check:encoding`
- `git diff --check`
@@ -577,4 +577,6 @@ game-project/
- 2026-07-16 起,同一 Runtime 文档的“V1.26 Provider 原生工具目录”作为 OpenAI-compatible planning 协议事实源。Chat / Responses 不再只广告 `submit_agent_tool_plan` 包装函数,而是直接提供 `update_agent_plan``respond_to_user`、全部内置 Runtime action 和动态 MCP function;每个函数使用独立 schema,Runtime 继续负责身份、权限、确认、沙箱、revision、验证、恢复与副作用防重放。Anthropic 与历史 fixture 保留 text JSON / wrapper 解析兼容,但新请求和 repair 不能静默降级。plan-only 是合法持久 checkpoint,未完成计划仍阻止最终化。
- 2026-07-16 V1.26 已完成真实验收:正式 `openai_chat / gpt-5.5``project-skill` suite 中 9/9 个成功工具计划与 6/6 个格式修复全部使用 `native_runtime_tools`wrapper/text fallback 均为 0。Agent 自主读取匹配 Skill、只改唯一目标文件并完成 Agent/宿主双重验证;15 个 tool-plan 和 1 个 final-reply lifecycle 唯一闭合,最终 assistant/completed 各 1,重复、Skill 正文、API Key、诱饵、项目/配置路径和报告泄漏均为 0,隔离 Runner/AppData/项目完整清理。
- 2026-07-16 V1.26 后重新加强并复验 `goal-runtime`:Goal suite 现在把成功计划、repair、call metadata、wrapper/text fallback 和协议审计零 payload 纳入硬门禁。正式 `openai_chat / gpt-5.5` 最终复跑的成功计划 21/21、repair 17/17 全为 `native_runtime_tools`;Goal edit、旧动作失效、真实失败修复、pause、Runner 强杀、显式同 run resume、verification、finalization 和唯一回复全部 PASS,重复、重放、正文、密钥、诱饵与路径泄漏均为 0。Goal 阶段等待同时增加 terminal fail-fastProvider transport failure 不再占满 30 分钟验收超时。
- 2026-07-16 起,V1.27 只允许同一 Agent 把连续 2-3 个自动批准的严格只读 action 组成持久并行批次。首版白名单为 `memory.read / conversation.read / asset.list / project.search / project.diff / git.inspect / file.list / file.read / task.list`;写入、确认、命令/进程、验证、生成、MCP、Git commit、委派和回执认领仍按 Provider 顺序串行。批次用项目一致性锁形成 steer/Goal/取消的线性化边界,物理读取由独立工作线程重叠执行,observation/task/event/receipt/context 仍按 Provider action index 稳定投影;`executing` Runner 恢复只重放严格只读观察,`observed` 只补投影。
- V1.27 的 8 项确定性回归已证明:2 个读取真实非空重叠;第二个物理读取先结束时仍按 Provider 顺序投影;3 个动作 `executing` 恢复保持原 actionId`observed` sidecar、部分公共投影、部分 context 和删除 sidecar 前故障都从持久前缀继续且零重复;确认策略阻止自动批次;取消、Goal/repository drift 阻止旧读取重放;steer 先获得锁时旧批次零执行,批次先获得锁时 steer 等到全部读取 observed 后才接受。正式 `openai_chat / gpt-5.5` 的隔离 `parallel-read` suite 同样 PASS:真实模型同轮提交 2 个独立 `project.search`,物理重叠 `10,969,247ns`,4/4 个成功工具计划与 2/2 个 repair 全为 `native_runtime_tools`6 个 tool-plan 与 1 个 final-reply lifecycle 唯一闭合,最终 assistant/completed 各 1;重复、正文/API Key/诱饵/项目与配置路径泄漏均为 0Runner/AppData/项目完整清理。V1.27 当前真实行为门禁为 PASS。
- 开发模式可通过本地项目文件面板执行 `file.list/read/write/delete`,普通用户界面不暴露文件面板。