补齐单Agent受控本地Git提交

新增 project.git_commit 强制确认命令并同步前后端共享契约
绑定 git.inspect 安全快照、当前 revision 与 passed verification gate
使用临时 index、原子 update-ref、双 reflog 和跨平台 index 安装创建精确提交
限制动态隔离 child 提交并保护 Git objects、refs、reflog 与控制文件
补齐安全审计、fallback receipt、needs-reconciliation 和执行中恢复不重放
新增故障矩阵测试并同步 Runtime 技术方案、实施计划与项目决策记录
This commit is contained in:
AIGameCreator App
2026-07-14 14:39:56 +08:00
parent 4ef3dbd677
commit 86bbd046ec
11 changed files with 3425 additions and 59 deletions
@@ -607,6 +607,19 @@ Runner-kill E2E 不再以 latest task 或单个 process record 推断整体恢
`command.poll` 私有正文虽然必须进入 owning Agent context 供后续交互,但模型 prompt 不是持久化隔离边界。后台 finalization 在创建 assistant journal 前检查当前 run 的成功 poll observation;只要存在非空输出,就把模型最终回复整体收束为固定安全完成摘要,再计算 response fingerprint 并写 conversation/event/Agent DB。该边界不按长度猜测 token,因此 challenge、ready/echo/stopped 行和短 PIN 的局部回显都不能扩大到公共持久面;没有私有 poll 正文的普通回复保持原样。
## V1.12 受控本地 Git 提交
V1.12 首个切片补齐“修改、验证、审阅、提交”的单 Agent 本地闭环,只新增 `project.git_commit`。它不是通用 Git 写权限:不开放 `push / fetch / pull`、分支创建或切换、merge / rebase、reset、stash、tag、submodule、worktree,也不能通过 `command.exec` 绕过 `.git` 只读沙箱。
- `git.inspect` 新增稳定的 `commitSnapshotFingerprint`。该指纹绑定当前 HEAD、附着分支、规范化后的安全 staged / unstaged / untracked 状态以及所有安全变更路径的工作树对象摘要;`.agent`、凭据和其它被隔离路径不进入跨动作指纹,避免 observation、context 和 pending action 的正常控制面落盘制造虚假源码漂移,但单次快照读取期间仍用完整原始 porcelain 前后复核并拒绝并发漂移。输出不泄露敏感路径或文件正文;安全工作树在读取期间漂移、路径数量或对象摘要超过上限时,不签发可提交快照。
- `project.git_commit` 输入固定为 `message / paths / expectedHead / expectedSnapshotFingerprint`。提交信息必须是有界 UTF-8 文本;`paths` 最多 12 个、去重后仍须与输入一致,只接受 `git.inspect` 已识别的安全 unstaged / untracked / deleted 普通路径。工具执行时真实 index 必须为空,已有 staged 内容一律拒绝,不能代替用户决定或夹带其它文件。
- 工具只支持标准仓库根和附着的本地 `refs/heads/*`,首版拒绝 detached HEAD、unborn branch、Git worktree 的外置 gitdir、submodule 和符号链接 / 硬链接控制路径。当前 HEAD、分支、提交快照、项目 revision、当前 run verification gate 任一与待确认动作创建时不一致,均在写 Git 前失败关闭。
- 当前 run 必须已在当前非零项目 revision 上取得 `passed` 验证凭证;只修改但未验证、验证后再次修改、只审阅了用户预存脏改动或 revision 0 的工作树都不能提交。`project.git_commit` 本身不推进源码 revision,也不签发验证凭证;成功后 Runtime 必须重新规划,并可用 `git.inspect` 核对新 HEAD 和剩余未提交变更。
- Git 写入使用独立受控实现,不调用 shell、不复用 `command.exec`。Runtime 隔离 system/global config、hooks、pager、fsmonitor、凭据和网络,只读取仓库本地 `user.name / user.email`;缺失时明确失败。提交先在临时 index 中构造精确 tree,再以真实 `.git/index.lock` 阻止并发 index 写,使用 `commit-tree + update-ref HEAD <new> <expected old>` 原子保护附着分支前移,并以固定安全消息同时维护 HEAD / branch reflog;完整提交正文不进入 reflog。最后安装与新 HEAD 对齐的 index,Unix 使用同目录原子 rename,Windows 使用 replace-existing + write-through 移动;提交路径之外的工作树改动保持未暂存。
- `project.git_commit` 是强制 `confirm` 工具:项目策略和 legacy 空策略都不能把它降为 `auto`,但仍可显式 `deny`。确认摘要展示提交标题、路径数量、有限路径列表、expected HEAD 和快照指纹前缀,不保存完整提交正文。durable action 在 Git 写入前进入 `executing`;Runner 崩溃、ref 已前移后 index / 审计 / 终态无法确认,或无法安全清理 index lock 时统一进入 `needs-reconciliation`,恢复绝不重放 commit。只有能证明 ref 未更新且 index 未改变的前置校验失败才允许普通失败后重试。
- 动态隔离 `child-*` Agent 无条件禁止调用 `project.git_commit`,即使 paths 全部位于自己的 `writeScopes`;子实例只交付受控产物和验证证据,最终 Git 提交统一由拥有完整项目上下文的父 Agent 发起,避免 child 把其它 Agent 或用户预存脏改动纳入提交。
- 成功 observation 和 terminal receipt 只保存 parent / commit SHA、分支、路径数量、有限安全路径、提交信息 SHA-256 和剩余变更计数;不得保存 Git 配置值、绝对 gitdir、完整 diff、提交正文或敏感路径。已知 commit 成功但专用 Agent DB 审计失败时,`needs-reconciliation` observation 和 fallback terminal receipt 仍保留同一组安全字段,确保人工核对能找到 commit SHA。`update-ref` 失败后只有 ref 已被明确推进到非 expected、非候选 commit 时按 expected-old 竞争普通失败;ref 仍为 expected、等于候选或无法读取时都视为不确定并进入 reconciliation。确定性测试必须覆盖精确多文件提交、未选路径保留、已有 staged 拒绝、HEAD / snapshot 漂移、未验证拒绝、detached / worktree 拒绝、hook 不执行、HEAD / branch reflog、update-ref 竞争与不确定失败、child 作用域拒绝、审计 fallback receipt 和执行中恢复不重放。
## 验收命令
- `npm run ai-game-creator-shell:typecheck`
@@ -38,6 +38,8 @@ V1.11 的受保护仓库控制目录同时包含 `.git / .agent / .agents / .cod
2026-07-14 V1.11.1 最终真实验收:发布 AppData 的真实 `gpt-5.5` `process-session` 形成 41 条 task、75 条 event、63 条 Agent DB 和 8 条 receipt,唯一 start、3 poll、唯一 stdin / terminate、3 次 cursor 推进及唯一 terminal / completed / assistant全部通过;Runner kill套件形成 13 条 task、19 条 event、19 条 Agent DB,真实 SIGKILL后项目 cwd进程清零、新 boot保持同 run / session并只形成 1 条 reconciliation。两套的 reconnect、重放、重复 action / message / receipt、公共进程正文、密钥和诱饵泄漏均为 0,disposable项目均自动清理;V1.11.1 持久进程链路据此完成验收。
2026-07-14 起,同一文档的“V1.12 受控本地 Git 提交”补齐单 Agent 的修改、验证、审阅、本地提交闭环。新增且只新增 `project.git_commit`,输入绑定 `message / paths / expectedHead / expectedSnapshotFingerprint`,最多提交 12 个显式安全路径;它是不可降为 `auto` 的强制确认工具,legacy 空策略也继续要求确认,项目策略仍可显式拒绝。动态隔离 child 无条件禁用该工具,最终提交由父 Agent 统一发起。当前 run 必须在当前非零 project revision 上已有 passed verification gate。`git.inspect` 签发的 `commitSnapshotFingerprint` 绑定 HEAD、附着分支、规范化安全状态和全部安全变更文件内容;`.agent` 等控制面正常落盘不制造跨动作漂移,安全源码、HEAD、分支、revision 或 gate 任一变化仍失败关闭。提交只支持标准仓库根和本地附着分支,要求真实 index 没有 staged 内容,并用临时 index、真实 `index.lock`、`commit-tree` 和带 expected old HEAD 的 `update-ref HEAD` 精确前移 ref,同步 HEAD / branch reflog后跨平台原子安装 index;未选改动保持未暂存。它不开放 remote、分支切换、merge / rebase、reset、stash、tag、submodule 或 worktree 写操作,也不能通过 `command.exec` 绕过 `.git` 只读沙箱。成功 observation、Agent DB 审计和 terminal receipt 只保留 parent / commit SHA、分支、安全路径、message SHA-256 和剩余变更计数;ref 前移后的不确定错误或审计失败进入 `needs-reconciliation`,已知 commit 的审计失败仍在 fallback receipt 保存 commit SHA,恢复不得重放提交。本轮只形成确定性本地验证结论,尚未新增真实 Provider V1.12 PASS 声明。
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)`,不得记为通过。
2026-07-13 V1.3 真实验收:同一真实 Provider 套件已改为先读取 SHA-256,再用唯一一次 `project.patchset` 同时更新和创建文件,并使用自动 checkpointId 读取 2 项内容 hunks;prepared / completed 审计各 1 条、patchset revision 增量为 1,Runner 强杀恢复、命令和项目验证、双视口浏览器验证、隔离 Agent join、重复副作用与密钥扫描继续全部通过。