补齐单Agent运行中追加指令

新增同一 Run 持久化追加指令、Provider 中断与安全重规划链路
补齐开发窗口、项目 Agent 面板和 CLI 的 steer 入口与状态交互
升级 Runner 协议并支持旧 Runner 空闲退出后平滑替换
增加真实 Provider steer 验收脚本并修复 finalization 与 Git 提交回归
同步 Runtime 技术方案、实施计划和共享决策记录
This commit is contained in:
AIGameCreator App
2026-07-14 17:08:04 +08:00
parent 1b971ac792
commit 56f02cc46b
16 changed files with 4369 additions and 306 deletions
@@ -4533,3 +4533,12 @@
- 验收门禁:Runner-kill 套件必须分别从全量 task、event、Agent DB、runtime state 和 process record 证明专用 reconciliation 各精确一次,并证明新 boot reconnect 为 0。activity / output 和可选证据目录只有 `ENOENT` 可视为空;权限、I/O 和 JSON 损坏必须让验收失败,runtime state 是必需证据并纳入公共正文泄漏扫描。
- 决策:模型即使在 prompt 明确禁止后仍可能把 `command.poll` 私有正文或短值复述到最终回复;只要本 run 存在非空私有 poll 输出,finalization 在 assistant journal 写入前就把模型回复整体收束为固定安全摘要。原始 PTY 正文仍只留在 owning Agent 私有 context,不能依赖模型自律或按长度猜 token 维持公共边界;没有私有 poll 正文的普通回复保持原样。
- 验收:真实 `gpt-5.5` `process-session``process-session-runner-kill` 均已 PASS。普通套件证明唯一 start、连续 cursor、精确 challenge/echo、graceful terminal 和零公共正文泄漏;强杀套件从 task / event / Agent DB / process record 各证明 1 条专用 reconciliationruntime state 身份一致,项目进程清零、新 boot 保持同 run / sessionreconnect / replay / final 均为 0。真实主机临时范围 32768-60999 被约 2.8 万连接占满时,Runner 使用范围外 loopback 端口完成两套验收。终审回归另通过 44 项 process-session 定向测试、Tauri 全量 587 passed / 4 ignored、Windows GNU check、客户端 typecheck、4961 文件编码检查、rustfmt、Prettier 和 diff check。
## 2026-07-14 AI 游戏创作 Agent Runtime V1.13 当前 Run 追加指令
- 决策:运行中输入默认形成 same-run steer,保持 `taskId / sessionId / runId` 不变;只有开发者显式选择“排队新任务”才创建新 run。动态隔离 child 首版拒绝 steer,终态、cancelling、finalizing 和 needs-reconciliation 同样拒绝。
- 决策:私有事实源为 `.agent/runtime/steers/<agentId>/<runId>.jsonl`,按 `prepared / conversation-persisted / queued / applied / closed` 只追加推进。正文只出现在 prepared 与确定性 messageId 的 user conversation;公共 task/event/Agent DB/Runner RPC 只保存身份、sequence、SHA-256、长度和状态。同 steerId 同 SHA 幂等,不同正文冲突;单条 4 KiB、单 run 16 条且总计 16 KiB。
- 决策:context bundle 和 Runtime state 保存 applied cursor 与安全 refspending action 指纹绑定 planned cursor。Provider 前、Provider 后、terminal observation 后和 finalization 前消费或复核;context 先持久化、applied 后追加,恢复以 context cursor 修复缺失 applied audit。自动动作进入 executing 时与 steer acceptance 使用同一项目写锁;确认中、approved 或 executing 动作保持原 fingerprintterminal receipt 后才消费。
- 决策:Runner typed `runtime.steer` 只携带 `root / agent / runId / steerId`,并先核对 durable ledger。中断 registry 只包围 planning 和 final reply HTTP future;不得 abort worker 或中断任何工具和副作用。prepared finalization journal、completed 终态与 steer acceptance 共用项目锁形成双向门禁,completed 前在同锁内关闭 ledger。新增方法把 Runner 协议提升为 v2;旧协议 Runner 只允许在 `shutdown_if_idle` 确认空闲并释放 endpoint 后升级,仍有任务时禁止强杀替换。
- 接口:Tauri 使用 `steer_game_creator_agent_runtime_task`CLI 使用 `--agent-steer <project> <agentId> <sessionId> <runId> <steerId> --stdin`。开发窗口与项目内 Agent 面板使用同一默认 steer / 显式排队交互,并把 cancelling 显示为“正在取消”。
- 验收:确定性 Rust 已覆盖幂等、冲突、并发 sequence、限制、错误状态、conversation、context/applied 崩溃修复、Provider in-flight 中断、旧写入计划零执行、自动动作 cursor 门禁、确认延后和 finalization 竞态;Runner/CLI 与两个 App 入口定向测试通过。仓库外真实 Provider same-run 专项已 PASS:一次 Provider 中断、原 run 唯一、五阶段 ledger、2 条 user/1 条 assistant、追加正文和已加载密钥零公共泄漏,并实际完成 Runner v1 到 v2 的空闲升级。V1.13 Runner kill 仍需独立复验,不把本次专项结果外推到强杀恢复。
@@ -624,6 +624,24 @@ V1.12 首个切片补齐“修改、验证、审阅、提交”的单 Agent 本
Git 专项证据证明:真实 Provider 只创建 1 个提交并精确包含 2 个目标路径;原始 commit object 的消息 SHA-256、提交 parent、HEAD、tree、空 staged index、提交后所选路径状态、封闭字段专用审计、terminal receipt、HEAD reflog 与 branch reflog 全部一致,预存 disposable sentinel 继续保持未跟踪且未被夹带。Runner 在主流程早期真实强杀后恢复原 run / session 且身份稳定;副作用重放、重复 action / message / receipt、提交正文或 Git identity 公共持久化、Provider Key、敏感诱饵和报告泄漏均为 0disposable 项目按 sentinel 自动清理。V1.12 不再仅有确定性本地结论;remote、分支管理和其它 Git 写操作仍保持未开放。
## V1.13 当前 Run 追加指令与 Provider 中断
V1.13 补齐 Codex CLI 风格的运行中 steering:用户可在 Agent 仍处于非终态时向同一 `taskId / sessionId / runId` 追加要求,Runtime 在安全边界丢弃过期计划或最终回复并重新规划,不再把每次补充都排成新任务。显式“排队新任务”仍保留,但不是运行中输入的默认行为。
- 私有事实源固定为 `.agent/runtime/steers/<agentId>/<runId>.jsonl`,状态按 `prepared -> conversation-persisted -> queued -> applied -> closed` 只追加推进。首条 `prepared` 保存正文,公共 task/event/Agent DB、Runner RPC 和终态结果只保存 `steerId / sequence / messageId / instructionSha256 / contentChars / status / providerInterrupted`,不得保存正文。
- 身份固定绑定 `projectId / agentId / taskId / sessionId / runId / source / steerId`。调用方生成并在重试时复用 `steerId`;同 ID 同 SHA 幂等返回原结果,同 ID 不同 SHA 拒绝为 `steer-id-conflict``sequence` 在项目写锁内从 ledger 单调递增,不能使用时间戳。conversation 使用由完整身份派生的确定性 `messageId`,恢复时必须核对 role、正文 SHA 和 Agent 身份后补齐缺失阶段。
- 首版只接受静态父 Agent 的 steer;动态 `child-*` 拒绝。单条正文最多 4 KiB,每 run 最多 16 条、总计最多 16 KiB,拒绝空白、NUL 和非法控制字符。`completed / failed / cancelled / cancelling / needs-reconciliation`、finalization 已 prepared 或 steer ledger 已 closed 时拒绝,错误 session/run/source 也拒绝。
- `AgentRuntimeState`、context bundle 和 pending action 分别保存 `appliedSteerCursor`、有界 `appliedSteerRefs``plannedSteerCursor`。Provider prompt 通过 refs 从 conversation 回读并复核正文,单独渲染有序“运行中用户追加指令”;后序指令可修正前序业务目标,但不能覆盖系统规则、工具策略、确认和沙箱边界。
- 消费顺序固定为:先把 queued steer refs 与 cursor 持久化进 context bundle,再追加 applied 审计;若崩溃发生在两步之间,以 context cursor 为准补 audit,不能重复注入。Provider 请求前消费全部 queuedProvider 返回后、每个 terminal observation 后和最终回复返回后都复核 cursor。发现新 steer 时,旧工具计划剩余 action 或旧最终回复全部作废,在同一 run 重新规划。
- `pending-confirmation / approved / executing` 动作不被 steer 暗中拒绝或强杀。显式批准继续执行原 fingerprintterminal receipt 落盘后再消费 steer。自动动作从准备进入 `executing` 时必须与 steer acceptance 使用同一项目写锁复核 `plannedSteerCursor`,避免“检查后、执行前”插入指令。`waiting-for-isolated-join` 可以接收但不能越过 join barrier。
- finalization 在项目写锁内先检查 response steer cursor,再写入并推进 finalization journalprepared journal 一旦存在,steer acceptance 即拒绝。assistant 与 completed 投影全部成功后、释放同一把锁之前追加 `closed`,避免恢复时因项目 revision 漂移而丢弃 prepared journal 后留下不可重开的 ledger。steer 先获得锁则旧回复 stalefinalization 先获得锁则后续 steer 被 journal 或终态拒绝,不能出现 completed assistant 与已接受 steer 并存。
- Runner 新增 typed `runtime.steer`,请求只携带 `root / agent / runId / steerId`。Runner 只对 planning 和 final reply 两个纯 Provider await 注册可中断句柄;收到 steer 时 `tokio::select!` 丢弃 HTTP future并返回 `providerInterrupted=true`,不得 abort worker task,也不得中断工具、副作用、确认、process session、Git commit、receipt 或 finalization。中断只表示客户端停止等待,不能承诺上游停止推理或计费。该方法把 Runner 协议提升为 v2;客户端发现旧协议进程时只请求其 `shutdown_if_idle`,确认 endpoint 与实例锁释放后再启动新版,旧 Runner 仍有任务时明确阻止升级而不是强杀。
- Tauri 新增 `steer_game_creator_agent_runtime_task`CLI 新增 `--agent-steer <project> <agentId> <sessionId> <runId> <steerId> --stdin`,正文只能从 stdin 读取。开发窗口和项目内 Agent 面板都默认对匹配的非终态 run 调用 steer,并提供显式“排队新任务”入口;`cancelling` 只能显示“正在取消”。
确定性验收必须覆盖 steerId 幂等与正文冲突、并发 sequence、容量限制、错误身份和终态拒绝、conversation 恰好一次、四个 ledger/context 崩溃窗口、Provider in-flight 旧计划零 action、多 action 在 action 1 后停止、确认/approved/executing 延后消费、finalization 双向竞态、Runner requestId 防重、CLI stdin 和两个前端入口。真实 Provider E2E 还必须证明 task 队列未新增、run/session 不变、最终 assistant 唯一、副作用零重放、Runner 强杀恢复身份稳定,以及正文和已加载密钥在公共持久面泄漏为 0。
2026-07-14 `agent-runtime:steer-real-e2e` 使用仓库外真实 Provider 配置通过 same-run 专项:一次 steer 命中 planning Provider await 并返回 `providerInterrupted=true`task 仅包含原 runledger 精确形成 `prepared / conversation-persisted / queued / applied / closed`conversation 为 2 条 user 和 1 条 assistant,追加正文与已加载密钥在公共持久面命中均为 0。专项同时实际完成旧 Runner v1 空闲退出与 v2 替换。该套件不包含 Runner 强杀恢复,因此 V1.13 的 kill 场景仍保留为独立复验项,不借用本次 PASS 扩大结论。
## 验收命令
- `npm run ai-game-creator-shell:typecheck`
@@ -42,6 +42,8 @@ V1.11 的受保护仓库控制目录同时包含 `.git / .agent / .agents / .cod
2026-07-14 V1.12 真实 `gpt-5.5` 验收已通过。现有 `llm-runtime` disposable 套件要求模型在完整修改、验证和审阅链路末尾自行创建唯一受控提交,并从原始 commit object、真实 Git parent / HEAD / tree、空 staged index、提交后所选路径状态、封闭字段专用审计、terminal receipt 和 HEAD / branch 双 reflog 验真。最终收紧版形成 151 条 task、258 条 event、266 条 Agent DB、17 次代表性成功工具执行、7 套确认生命周期、9 个实际副作用 action 和 44 条 receipt;唯一提交精确包含 2 个目标路径,预存 sentinel 未被夹带,project revision 保持 3。Runner 强杀恢复后 run / session 身份稳定,副作用重放、重复 action / message / receipt、密钥和诱饵泄漏均为 0,disposable 项目已自动清理。
2026-07-14 起,同一文档的“V1.13 当前 Run 追加指令与 Provider 中断”作为运行中补充要求的新事实源。开发窗口和项目内 Agent 面板在匹配静态 Agent、Session 和非终态 run 时默认调用 `steer_game_creator_agent_runtime_task`,显式“排队新任务”才继续创建新 run。正文只进入私有 steer ledger 与幂等 user conversation;公共 Runtime、event、Agent DB、Runner RPC 和结果只保留 steerId、sequence、messageId、SHA-256、长度、状态和中断标记。Runner 只中断 planning / final reply 的 Provider await,工具、副作用、确认、process session、Git commit、receipt 和 finalization 都不强杀;Provider 返回、每个 terminal observation 和 finalization 前复核 cursor,发现新指令即丢弃旧计划剩余动作或旧回复并在同一 run 重新规划。`--agent-steer ... --stdin` 提供无 UI 开发验收入口。确定性链路已证明同 ID 幂等、并发 sequence、容量与状态拒绝、context/applied 崩溃修复、Provider in-flight 旧 `file.write` 计划零执行、确认动作保持原 fingerprint、finalization 双向门禁和两个前端入口;仓库外真实 Provider 的 same-run 专项也已证明一次 Provider 中断、原 run 唯一、五阶段 ledger、2 条 user/1 条 assistant 及正文和密钥零公共泄漏。V1.13 Runner 强杀恢复仍是独立复验项,不包含在该专项 PASS 中。
2026-07-12 真实验收:发布 AppData 中的真实 `gpt-5.5` 已通过最终安全收紧后的 `llm-runtime` 套件,覆盖 Runner 强杀恢复且 run/session 身份稳定、仓库上下文、checkpoint/精确修改、失败命令诊断与修复复验、6 套确认生命周期、项目验证、桌面与移动非空画布证据、3 个隔离实例并行和唯一 all-join95 条 task、161 条 event、137 条 Agent DB、13 条合法工具协议、副作用判重、终态投影、assistant audit、消息、回执和密钥泄露均以结构化落盘事实验收。`full` 套件仍要求 External Editor API 配置,缺失时必须返回 `BLOCKED(editorApi)`,不得记为通过。
2026-07-13 V1.3 真实验收:同一真实 Provider 套件已改为先读取 SHA-256,再用唯一一次 `project.patchset` 同时更新和创建文件,并使用自动 checkpointId 读取 2 项内容 hunksprepared / completed 审计各 1 条、patchset revision 增量为 1Runner 强杀恢复、命令和项目验证、双视口浏览器验证、隔离 Agent join、重复副作用与密钥扫描继续全部通过。