完善Agent命令回查与收束能力
让 durable command.exec observation 直接返回 sourceActionId,命令分页不再依赖动作历史 持久化 all-join 认领摘要与 reviewer 里程碑,保护最新动作历史观察 放宽无业务依赖的验证顺序并加强真实 Provider E2E 顺序门禁 补齐确定性测试、Runtime 文档和共享决策记录
This commit is contained in:
@@ -4257,3 +4257,14 @@
|
||||
- 修正:Runtime prompt 显式列出合法静态模板 taskId,并冻结 `expectedArtifacts` 为完成时必须存在的项目内相对文件/glob、只读任务填写现有被检查文件、`writeScopes` 使用互斥非私有目录 glob。相同父 Agent/run 下相同 spawn request 的新 actionId 在创建实例前拒绝,避免长等待或上下文压缩后重复启动整组 reviewer。
|
||||
- 修正:completed child 若因 artifact/evidence 结果契约无法构造 completed result,降级落盘为结构化 failed child result 并继续推进 all-join,不能只记 `result_failed` 后永久悬挂父 run。真实 E2E 的副作用判重只统计实际发生的动作;失败与修复后使用相同 argv 的 `command.exec` 由一失败一成功专门契约验收,预检失败不算副作用。可重复只读动作不限定总次数,省略默认参数和显式默认值等价,无依赖的视觉与动作历史只要求都早于最终回复。
|
||||
- 验证:Tauri 全量 523 项中 520 通过、3 项真实浏览器 opt-in 用例按设计忽略;共享 TS 与 Rust 契约各 7 项、shell typecheck 和 Windows GNU `cargo check` 通过。无固定配方的真实 `gpt-5.5` `llm-runtime` PASS:122 条 task、210 条 event、213 条 Agent DB、13 条工具协议、15 次代表性成功工具执行、6 套确认、8 个实际副作用 action 和 32 条 receipt;两次 `command.output_read` 覆盖 248 行并命中短 observation 之外的根错误,唯一 patchset、Runner 强杀恢复、revision 3、3 个隔离实例 / 2 个模板、唯一 continuation delivery、项目验证和双视口视觉检查通过。副作用重放、重复 action/message/receipt、命令正文边界泄漏、图片载荷、密钥和诱饵泄漏均为 0。
|
||||
|
||||
## 2026-07-14 AI 游戏创作 Agent Runtime V1.9 命令观察直接引用
|
||||
|
||||
- 决策:每个 durable `command.exec` terminal observation 在短 detail 前部直接返回 `sourceActionId=<当前 actionId>`,覆盖成功、非零退出、超时和 `observed-approved` 恢复;身份只能来自已校验的 pending action,不能由模型提供或从 outputRef 猜测。
|
||||
- 决策:Runtime prompt 要求模型直接把该 ID 传给 `command.output_read`,不得为了读取刚完成命令先调用 `agent.action_history`。动作历史继续负责跨窗口和历史 run 的独立回查。
|
||||
- 决策:不新增 observation 字段,不升级 pending/context schema。`sourceActionId` 只随既有私有 observation detail 持久化;command event 继续省略 detail,Agent DB observation 和 receipt 继续使用顶层 actionId,命令正文隔离边界不变。
|
||||
- 验收门禁:确定性测试必须同时检查下一轮 prompt 和 context bundle 的精确 ID;真实 Provider 第一次成功 `command.output_read` 必须早于唯一动作历史查询,并继续证明正文零泄漏、动作零重放和恢复身份稳定。
|
||||
- 修正:真实 Provider 可在最后一次源码修改后按任意顺序完成项目验证和浏览器验证;验收器只要求 preview 位于 patchset 之后、视觉检查位于 preview 之后,不再把无依赖的“先预览、后 project.verify”误判为失败。
|
||||
- 修正:`agent.run_status` 的 ready all-join 结果作为安全 milestone 跨窗口保留;认领后的后续状态查询显式返回 `claimedIsolatedJoins` 和“不要为同一组重复查询”。这避免 `scope=all` 的 900 字符静态 Agent 状态截断、上下文压缩后丢失 reviewer 结果并持续轮询。
|
||||
- 修正:context compaction 把最新成功 `agent.action_history` 作为受保护观察保留,避免后续只读噪声把唯一动作回查证据挤出最终 bundle;terminal receipt 仍是长期事实源。
|
||||
- 验证:Tauri 定向用例覆盖精确 `sourceActionId`、ready/claimed all-join、跨两窗口 milestone 和动作历史保护。真实 `gpt-5.5` `llm-runtime` 最终 PASS:146 条 task、248 条 event、255 条 Agent DB、16 条工具协议、15 次代表性成功工具执行、7 套确认、8 个实际副作用 action、43 条 receipt;2 次 `command.output_read` 均早于唯一动作历史查询,Runner 强杀恢复身份稳定,唯一 patchset、失败/成功命令、项目/浏览器/视觉验证和 3 个隔离 reviewer 均完成。副作用重放、重复 action/message/receipt、正文/图片/密钥/诱饵泄漏均为 0。
|
||||
|
||||
@@ -432,6 +432,25 @@ Runner 强制终止后恢复原 run / session 且身份稳定,project revision
|
||||
|
||||
最终形成 122 条 task、210 条 event、213 条 Agent DB、13 条合法工具协议、15 次代表性成功工具执行、6 套确认生命周期、8 个实际副作用 action、32 条 terminal receipt(主 run 23 条),project revision 为 3。命令 sidecar 和私有 context 各命中根错误,task/event/Agent DB/receipt/report 中根错误正文泄漏均为 0;副作用重放、重复 action/message/receipt、半完成文件、图片载荷、已加载密钥和项目诱饵泄漏均为 0。Runner 强杀后恢复原 run/session 且身份稳定,3 个隔离实例来自 2 个模板并形成唯一 continuation delivery,最终 completed 投影、assistant audit 和 assistant 消息均仅 1 条;保留现场核对后已按 disposable sentinel 清理。
|
||||
|
||||
## V1.9 命令观察直接引用
|
||||
|
||||
V1.8 已能按 `actionId` 分页读取完整命令输出,但模型可见的 `command.exec` observation 只返回 `outputRef / outputSha256 / totalLines` 等元数据,真实 `actionId` 只存在于 pending action、task/event、Agent DB 和 terminal receipt。模型因此必须先猜 ID 或额外调用 `agent.action_history`,才能使用 `command.output_read`,与工具结果应直接携带后续调用身份的目标不符。
|
||||
|
||||
- 每个 durable `command.exec` 的 terminal observation 必须在短 detail 前部直接返回 `sourceActionId=<当前 actionId>`;成功、非零退出、超时和从 `observed-approved` 恢复后的同一 observation 使用相同身份。该字段来自已经过 pending identity 校验的真实 action,不允许模型提供或从 `outputRef` 反推。
|
||||
- `sourceActionId` 属于安全结构化元数据,不包含命令正文、argv、凭据或路径。command event 继续省略 detail,Agent DB terminal observation 和 receipt 继续使用已有顶层 `actionId`,不在 `safeDetail` 重复保存;命令 transcript 的 task/event/Agent DB/receipt 零正文边界不变。
|
||||
- 不修改 `AgentRuntimeToolObservation`、pending action 或 context bundle schema。身份随既有 detail 一起进入私有 context bundle,旧 bundle 保持可读;恢复已有 terminal observation 时只重新交付相同 detail,不重跑命令。
|
||||
- Runtime prompt 明确要求直接把 `sourceActionId` 传给 `command.output_read`,不得为了取得刚完成命令的 ID 先查询 `agent.action_history`。动作历史仍用于跨窗口或历史 run 的独立回查,不再是读取当前命令输出的前置步骤。
|
||||
- 确定性测试必须证明下一轮 planning prompt 和 context bundle 都包含精确 `sourceActionId`。真实 Provider E2E 必须证明第一次成功 `command.output_read` 发生在唯一 `agent.action_history` 之前,并继续满足输出正文零泄漏、动作零重放和恢复身份稳定。
|
||||
- 真实 E2E 的项目验证与浏览器验证是最后一次源码修改后的两项独立证据,不强制彼此先后;浏览器验证仍必须发生在 patchset 之后,`image.inspect` 必须消费其生成的双视口截图。不得用无业务依赖的固定工具顺序把模型已完成的等价闭环误判为失败。
|
||||
- `agent.run_status` 首次返回的 `readyIsolatedJoins` 代表 all-join 已由当前父 run 的精确 action 认领,其结果摘要必须进入跨 context window 的安全里程碑;后续查询返回 `claimedIsolatedJoins` 和稳定认领摘要,明确同一组无需再查。`scope=all` 的静态 Agent 列表被短 observation 截断时,也不能因此丢失动态 reviewer 的认领结果或诱发无限状态轮询。
|
||||
- context compaction 额外保护最新成功的 `agent.action_history` 原始 observation,不能让后续状态轮询或普通只读观察把动作回查证据挤出最终 bundle;该保护只保留已有安全结构化结果,不扩大动作历史输出上限,也不替代 terminal receipt。
|
||||
|
||||
### 2026-07-14 V1.9 真实验收结果
|
||||
|
||||
发布 AppData 中配置的真实 `gpt-5.5` 已通过无固定配方的 `llm-runtime`。全新 disposable run 在失败 `command.exec` 后没有查询动作历史,直接使用 observation 的 `sourceActionId` 连续执行 2 次 `command.output_read`,随后完成唯一 patchset、失败/成功命令各 1 次、项目验证、双视口浏览器验证、两图视觉检查、3 个隔离实例和最终 patchset 历史回查。唯一 `agent.action_history` 晚于命令分页,返回 1 条结果且递归结果为 0。
|
||||
|
||||
真实验收先后暴露并修正了两个既有收束缺口:项目验证与浏览器验证被错误要求固定先后;`scope=all` 的短状态截断和 context compaction 会丢失已认领 reviewer 结果并诱发重复轮询。最终 PASS 形成 146 条 task、248 条 event、255 条 Agent DB、16 条工具协议、15 次代表性成功工具执行、7 套确认生命周期、8 个实际副作用 action 和 43 条 terminal receipt(主 run 28 条),project revision 为 3。Runner 强杀后恢复原 run/session 且身份稳定;副作用重放、重复 action/message/receipt、命令正文跨边界泄漏、图片载荷、密钥和诱饵泄漏均为 0,最终 completed、assistant audit 和 assistant 消息各 1 条。
|
||||
|
||||
## 验收命令
|
||||
|
||||
- `npm run ai-game-creator-shell:typecheck`
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
|
||||
同一文档的“V1.3 多文件变更集与内容审查”作为复杂代码修改的新事实源。`project.patchset` 在一个确认动作和一把项目锁内预检最多 12 个 create / update / delete,自动 checkpoint、只推进一次 revision,并以 SHA-256 乐观并发条件和回滚语义避免半完成修改;`project.diff(includeContent=true)` 返回有界统一 diff hunks。它不开放任意 `git apply` 文本,也不替代修改后的可执行验证。
|
||||
|
||||
同一文档的 V1.4-V1.8 继续作为当前事实源:V1.4 用只读 `git.inspect` 提供有界工作树状态和安全 hunks;V1.5 用跨 context window 的 milestones 保留已完成副作用与验证证据;V1.6 用 terminal receipt 和 `agent.action_history` 提供可恢复动作回查,并对未认领 all-join 的最终回复与动作历史设置双重完成门禁;V1.7 用 `image.inspect` 把 desktop / mobile 截图作为受控多模态输入交给当前 Agent 自己的 Provider,并严格禁止图片载荷持久化;V1.8 用 `command.output_read` 按 actionId 分页读取同一 Agent 当前或历史 run 的安全命令 transcript,正文只进入私有 context observation,不进入 task/event/Agent DB/receipt。历史能力清单与这些版本冲突时,以 Runtime V1.1 技术方案和当前代码为准。
|
||||
同一文档的 V1.4-V1.9 继续作为当前事实源:V1.4 用只读 `git.inspect` 提供有界工作树状态和安全 hunks;V1.5 用跨 context window 的 milestones 保留已完成副作用与验证证据;V1.6 用 terminal receipt 和 `agent.action_history` 提供可恢复动作回查,并对未认领 all-join 的最终回复与动作历史设置双重完成门禁;V1.7 用 `image.inspect` 把 desktop / mobile 截图作为受控多模态输入交给当前 Agent 自己的 Provider,并严格禁止图片载荷持久化;V1.8 用 `command.output_read` 按 actionId 分页读取同一 Agent 当前或历史 run 的安全命令 transcript,正文只进入私有 context observation,不进入 task/event/Agent DB/receipt;V1.9 让 durable `command.exec` observation 直接返回安全的 `sourceActionId`,当前命令分页不再依赖先查动作历史。历史能力清单与这些版本冲突时,以 Runtime V1.1 技术方案和当前代码为准。
|
||||
|
||||
2026-07-12 真实验收:发布 AppData 中的真实 `gpt-5.5` 已通过最终安全收紧后的 `llm-runtime` 套件,覆盖 Runner 强杀恢复且 run/session 身份稳定、仓库上下文、checkpoint/精确修改、失败命令诊断与修复复验、6 套确认生命周期、项目验证、桌面与移动非空画布证据、3 个隔离实例并行和唯一 all-join;95 条 task、161 条 event、137 条 Agent DB、13 条合法工具协议、副作用判重、终态投影、assistant audit、消息、回执和密钥泄露均以结构化落盘事实验收。`full` 套件仍要求 External Editor API 配置,缺失时必须返回 `BLOCKED(editorApi)`,不得记为通过。
|
||||
|
||||
@@ -34,6 +34,10 @@
|
||||
|
||||
2026-07-13 V1.8 实现口径:`command.exec` 的清洗后有界输出在命令日志和 manifest 投影前写入 `.agent/runtime/command-outputs/<identitySha256>.json`,并由 terminal receipt 只记录 outputRef、SHA-256、行数、截断和终态元数据。`command.output_read` 默认 `auto`,输入只接受源 actionId 和分页参数;Runtime 从 terminal receipt 反查唯一源 run,交叉复核 task ledger、command audit 和 sidecar 身份。读取不推进 revision 或 verification gate,模板级 per-Agent policy 对动态 `child-*` 实例继续生效;同页恢复只续 planning,不重跑源命令。
|
||||
|
||||
2026-07-14 V1.9 实现口径:durable `command.exec` 的成功、非零退出和超时 observation 在短 detail 前部直接携带经 pending identity 校验的 `sourceActionId`,并随既有 context bundle 恢复;prompt 要求模型直接用它调用 `command.output_read`,不得为了读取刚完成命令而先查 `agent.action_history`。不升级 observation、pending 或 context schema,不改变 task/event/Agent DB/receipt 的命令正文隔离边界。
|
||||
|
||||
2026-07-14 V1.9 最终真实验收:发布 AppData 的真实 `gpt-5.5` `llm-runtime` PASS。模型在失败命令后直接执行 2 次 `command.output_read`,唯一动作历史查询发生在分页和 patchset 之后;146 条 task、248 条 event、255 条 Agent DB、16 条工具协议、15 次代表性成功工具执行、7 套确认、8 个实际副作用 action 和 43 条 receipt 中,重放、重复 action/message/receipt、命令正文跨边界泄漏、图片载荷、密钥和诱饵泄漏均为 0。真实运行同时修正了独立项目/浏览器证据的过度顺序约束、all-join 认领结果跨窗口丢失和动作历史被只读噪声挤出最终 context 的问题。
|
||||
|
||||
2026-07-13 V1.8 最终真实验收:无固定配方的真实 `gpt-5.5` `llm-runtime` 已 PASS。模型自行取得失败命令 actionId,用 2 页覆盖 248 行输出并定位短 observation 之外的根错误,再以唯一 patchset 完成 2 项变更;122 条 task、210 条 event、213 条 Agent DB、13 条工具协议、15 次代表性成功工具执行、6 套确认和 32 条 receipt 中,副作用重放、重复 action/message/receipt、命令正文跨边界泄漏、图片载荷、密钥和诱饵泄漏均为 0。Runner 强杀恢复、revision 3、3 个隔离实例 / 2 个模板、唯一 continuation delivery、项目验证和双视口视觉证据全部通过。真实运行同时收紧了合法模板与 artifact/write scope 提示、失败 child result 的 all-join 终态降级、同父 run 相同 spawn request 去重,以及结果导向验收的等价默认输入和独立证据顺序。
|
||||
|
||||
以下能力清单保留 Runtime V1 的演进记录;其中“App 进程内 tokio task”“跨进程同项目写入不作为支持目标”和“恢复到当前 App 进程”的旧描述均已由 V1.1 替代。当前边界是 App / CLI 只落账并唤醒同一发布二进制的独立 Runner,append-only JSONL 使用进程内锁加 OS 文件锁,恢复继续由 Runner 接管同一 run / session。
|
||||
|
||||
Reference in New Issue
Block a user