修复子 Agent 澄清回执中转
Project CI / Repository checks (pull_request) Successful in 1m3s
Project CI / Frontend tests (pull_request) Successful in 3m17s
Project CI / Backend tests (pull_request) Successful in 3m56s
Project CI / Native shell tests (pull_request) Failing after 11m22s

补齐 completed child 最终澄清回执的真实解析路径

将用户回答与原 delivery 持久绑定并校验 continuation 指纹

扩展 agent.delegate 原生 schema 并由 Runtime 派生稳定 continuation 身份

按原 delivery 逐一提问并支持自主构建重启恢复

补充端到端状态机测试和权威文档
This commit is contained in:
2026-08-12 17:51:02 +08:00
parent 5e16837f3d
commit 4be14df443
19 changed files with 1053 additions and 26 deletions
@@ -7125,6 +7125,12 @@
- 传输边界:dev 公网入口不接受 Tauri WebView 的跨域 OPTIONS 预检,因此 release 使用 `tauri-plugin-http` 原生 transport。插件的 npm 依赖只归属 AGC 子包及其 lockfile,根 H5 package 与根 lockfile 不得引入任何 Tauri guest 依赖。插件 capability 与前端 URL 解析双重限制为 `https://dev.genarrative.world/api/*`,不为 WebView CSP 增加远程 `connect-src`,也不开放任意 HTTP(S) 目标。
- 会话边界:插件默认 Cookie Store 持久化 refresh Cookie;访问 Token 继续保存在现有客户端存储并通过 Authorization header 发送,不把 Token、Cookie 或登录正文写入日志、配置文件或仓库。
## 2026-08-12 子 Agent 澄清回执由 Supervisor 中转(Issue #163
- 决策:`project-supervisor` 继续是唯一正式用户对话 Agent。child 不开放 `user.input_request`;缺少关键用户事实时,child 终态返回 `AGC_NEEDS_USER_INPUT_V1` 结构化问题,形成 `needs-user-input` delivery。
- 中转:Supervisor 认领回执后,在自己的父 run 按原 delivery 逐一创建 durable 用户输入 pending action;重启、重复回执和重复唤醒只复用身份与问题完全一致的 action。回答沿用现有 same-run 回灌,并把 requestId 与 answersSha256 原子绑定回原 delivery;随后最多创建一次绑定原 `delegationId` 的 continuation child。
- 约束:原 delivery 持久保存 `questionsSha256 / clarificationRequestId / clarificationAnswersSha256``agent.delegate` continuation 提交原 delegation、问题 SHA 与答案 SHARuntime 自动派生稳定 identity,即使旧 pending 已清理也必须失败关闭校验。多个 child 的问题不能展平为同一请求,问题 envelope、数量、长度、归属和指纹校验失败关闭。不得把 child pending action直接暴露给用户,也不得把澄清回执误判成普通 repair。
## 2026-08-10 AGC monorepo 构建强制复用单一 React runtime
- 根因:AGC 子目录存在独立 `node_modules` 时,AGC 源码会解析子目录 React,而仓库共享组件解析根目录 React;登录页不依赖共享 Hooks,进入首页后才触发 `Cannot read properties of null (reading 'useCallback')` 并白屏。
@@ -4734,6 +4734,13 @@
- 队列与事务:独立恢复面板必须展示后端权威队列的所有 operation,读取失败不能伪装为空。`remote-failed` 不再重放,只能显式标为 `archived` 并保留账本;`reconciliation-required` 不能归档。派生 asset 使用 `prepared -> media-installed -> manifest-written -> revision-written -> committed` journal,只对可证明状态前向恢复;尚未证明目标写入时严格核对 before/after,已证明目标 asset/media 与 target revision 后允许 manifest/revision 被后续合法提交继续推进,并补齐同一 ledger。committed 后只有 staging 与正式媒体摘要一致、manifest 按 ID 或路径唯一精确匹配 journal asset 时才尽力清理;删除 I/O 失败保持 durable committed,身份或媒体漂移保留 staging 并进入对账。version journal 同样冻结 project revision before/after 身份;manifest 已有子版本但 journal 缺失,或旧 journal 面对已推进 revision 无法补证时都失败关闭。
- 验证:覆盖跨进程唯一 refine 草稿发现和多候选失败关闭、文本 Provider 成功到 staging 崩溃后零重复调用、任务视频/版本旧账本恢复、所有目录条目上限、Key 轮换与旧 Key 无法验证时的显式确认、Accepted 后 401/403 再换 Key 只 GET 原 operation、远端明确失败只归档且零新网络/扣费、三条乱序恢复队列、项目切换迟到结果、asset transaction 各崩溃阶段、revision 后项目继续合法修改仍补齐 ledger、committed 后 staging 清理成功/删除 I/O 失败/媒体或 manifest 漂移保留、源摘要漂移拒绝、committed 视频二次派生,以及 manifest 子版本缺 journal、旧 version journal 无法证明 revision 推进与 version journal exactly-once。
## 子 Agent 澄清不能直接穿透用户输入权限(2026-08-12)
- 现象:child 需要产品取舍时若直接调用 `user.input_request` 会被 owner gate 拒绝;若把它误走 `needs-repair`Supervisor 会错误返工而永远不向用户提问。
- 正确路径:child 返回短小的 `AGC_NEEDS_USER_INPUT_V1` envelopeRuntime 生成 `needs-user-input` delivery,父 Supervisor 认领后创建自己的 durable `user.input_request`。回答仍绑定原父 run,续建 child 由稳定 delegation identity 幂等控制。
- 验证:重复 wake / Runner 重启不得创建第二个用户输入 action;问题数量、字段长度、问题 SHA 和答案 SHA 不匹配时必须 fail-closed。child 直接请求用户输入仍应保持拒绝。
- 恢复加固:正常 completed child 的最终回复也必须进入 envelope 解析;回答后 pending 会被下一轮动作替换,因此 continuation 不能读取 current pending 作为证据,必须读取原 delivery 上的 durable request/answer 绑定。多个 child 各用一条用户请求逐一收束,禁止把不同 delivery 的问题和答案指纹拍平混用。
## 无限画布延迟草稿与零位移不能制造新状态(2026-08-11)
- 现象:r5 的 `loadDraft` 比 r6 更晚回包时会把草稿回退;pointerdown 后没有任何移动,pointerup 仍增加一条空 undo 并触发 CAS 保存;Tauri 自行维护 Shift toggle 后,Shift 单击唯一选中图层会意外清空选择。同一 `canvas.failed` 视图还可能把草稿保存或提交故障显示成生成重试。
@@ -1,5 +1,13 @@
# AI 游戏创作智能体 App 实施计划
## 2026-08-12 Issue #163:子 Agent 澄清回执中转
正式用户对话 Agent 仍固定为 `project-supervisor`;委派专业 Agent 和隔离 child 不得直接调用 `user.input_request`。当 child 缺少会实质改变结果的用户事实时,child 以短小的 `AGC_NEEDS_USER_INPUT_V1` + 结构化 JSON 终态回执交付问题,Runtime 将其作为 `needs-user-input` delivery,而不是 `needs-repair`
Supervisor 认领该回执后,由父 run 自己为每个原 delivery 逐一创建 durable `user.input_request` pending action,并将原 `delegationId`、问题数量和 `questionsSha256` 放入父任务上下文;不同 child 的问题不得展平到同一请求。Runner 重启、重复 delivery 或重复 wake 只复用当前 delivery 的同一 pending action,不把 child 的 pending action 暴露给用户。用户回答仍走现有 Supervisor same-run continuation;回答 observation 绑定 `requestId``responseId`、问题 / 答案指纹,并把 `requestId / answersSha256` 原子写回原 delivery。答案收齐后,Supervisor 最多创建一次绑定原 `delegationId` 的 continuation child`agent.delegate` 必须提交 `continuationOfDelegationId / questionsSha256 / answersSha256`Runtime 自动派生稳定 continuation identity,不依赖已清理的 pending action,也不得按单个答案重复创建 child。
问题 envelope、问题数量、字段长度和 SHA 校验均 fail-closed;问题正文只在受保护的 Runtime sidecar / 父 run 上下文中流转,不写入公共审计。若合并后的问题超过用户输入上限,Runtime 停止自动提问并进入 reconciliation,等待人工核对。
## 目标
在 Genarrative 内建设独立桌面 App:普通用户通过项目开发工作台中的陶泥儿对话、资源画布、运行状态和确认操作,让平台生成保存在本地的可运行 Web 游戏原型,并通过本地 HTTP server 预览;主窗口提供运行时配置入口,用于保存发布版 AppData / Tauri 配置目录里的 LLM 配置及受控开发者 External Editor 配置。普通客户素材画布使用平台登录态调用内部编辑器 API,不展示或要求填写画板 Base URL / API Key。任务明细、原始文件、命令日志和专业 Agent 调试控制仍放到开发构建的独立开发窗口。v1 的生成闭环仍以 Web 小游戏为主,同时允许用户打开已有 Godot 项目:所选含 `project.godot` 的目录直接成为项目根,Agent 使用标准运行档在该目录内继续修改,只新增并保留 `.agent/` 作为运行元数据,不创建 `game/``assets/``memory/``exports/` 平行目录;本期不扩展 Unity、Godot 内嵌预览、云同步或插件市场。