重构 game-chat 为单主 Agent 按需美术编排
Project CI / Repository checks (push) Successful in 1m19s
Project CI / Frontend tests (push) Successful in 2m48s
Project CI / Backend tests (push) Successful in 3m44s
Project CI / Native shell tests (push) Successful in 13m12s

由 Supervisor 持久化用户意图并只启动 code-prototype 主 Agent
按真实素材缺口动态委派受限美术 child 并绑定回执
补齐旧 Run 迁移、fixed-graph 与 isolated 后代失效及嵌套硬截止恢复
收紧美术 child 为 assets 路径写入并阻断 memory、manifest 等旁路
更新运行时 Prompt、回归测试与协作文档
This commit is contained in:
2026-08-08 04:10:16 +08:00
parent 82a486e72b
commit 44de26d204
35 changed files with 3302 additions and 1388 deletions
@@ -1,5 +1,13 @@
# 决策记录
## 2026-08-07 game-chat 使用单主路径按需补齐美术
- 背景:原 game-chat 把 Supervisor 的意图判断之后又硬接为 `design-director / code-director / art-* / code-prototype / preview-*` 固定图。`code-director` 代替程序主 Agent 判断素材缺口,会让“把现有美术资源应用到游戏中”被错误翻译成先生成美术,且美术回执无法天然回到同一个代码 Run 完成接入。
- 决策:Supervisor 只通过 `agent.route_manifest` 持久化用户 intent,统一使用 `audit-existing-first`;整体视觉重做也只是一项 intent,不审计、不固定委派、不生成,也不授权整套美术强制重生成。持久路由后只启动同一根 Run 的 `code-prototype`;它必须先 `asset.list` 审计权威资源和 Canvas 登记,完整覆盖则直接接入且零生成。只有真实缺失 `art-spec` 或核心 spritesheet 时,主 Agent 才能一次委派相应 `art-director / art-asset-plan`child 只写 `assets/**`,不得写 `game/**`,回执由同一主 Run 认领。主 Agent 随后完成接入、`game.static_smoke` 和 desktop/mobile `preview.validate`。升级时,确定性 `code-prototype` Run 只兼容已知的旧版/当前 canonical task 文本;任意其它正文仍按身份冲突拒绝。升级前已经运行的固定 Graph 美术 child 立即失效,所有项目 mutation 和确定性生图计划失败关闭,不能绕过新主 Agent 继续生成。
- 影响范围:仅 `project-supervisor-game-chat` 的单主 route、动态美术 delivery、完成门、恢复和进度投影;普通 GUI / CLI 的 16 节点 manifest DAG 保持原样。
- 验证方式:覆盖路由后只启动 `code-prototype`、既有素材零美术委派、精确缺口才允许单个对应 child、child 的 `game/**`、memory 和 manifest 写入拒绝而 `assets/**` 写入允许、回执恢复同一主 Run,以及主 Agent 的接入、静态 smoke 与双视口试玩;追加真实 scheduler 对旧 canonical task 的同 Run 恢复、旧固定美术 child 及其历史 isolated 后代对 Canvas/memory/manifest/project scope 零 mutation、伪只读 `agent.run_status` 阻断、嵌套美术 child 硬截止对账回执;另跑完整 DAG 非回归。
- 关联文档:`docs/technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md`
## 2026-08-03 资源管理阶段七以完整 CI 与可重复界面合同收口
- 背景:飞书资源管理需求的阶段零至阶段六已经分别完成资源卡禁拖、固定资源投影、中央聚焦、安全文档 / 媒体预览、依赖深度与正式版本只读模型;最后需要统一复核需求边界并用当前主分支完整门禁排除集成回归。
@@ -69,12 +77,12 @@
## 2026-08-06 game-chat 固定规则只提供上下文,Supervisor 决定条件 Graph
> 状态:本条已由上方 `2026-08-07 game-chat 使用单主路径按需补齐美术` 决策完全替代,仅保留问题背景;不得把本条的旧节点、旧路由或旧美术替换规则作为当前 game-chat 指令。
- 背景:用户要求把已有美术接入当前俄罗斯方块时,Runtime 在 Supervisor 首次 Provider turn 之前按关键词重置 Graph、选择是否复用美术并自动调度 child;Supervisor 没有固定快车道计划时又直接 `fixed-task-graph-stalled`。结果是模型没有理解和决策机会,`art-asset-plan` 在已有资产与 baseline 门互相冲突时重复空规划直至耗尽预算。
- 决策:关键词、否定/重做信号、占位状态和当前资产探测统一降级为 `advisoryOnly=true` 上下文。game-chat 根 Run 在持久 `GameChatWorkflowDecision` 前禁止启动任何 manifest child,并允许 Supervisor 正常请求 ProviderSupervisor 通过 auto-safe `agent.route_manifest` 选择 `audit-existing-first``regenerate-art`。审计路线首波只启动 `design-director + code-director`;已登记但无效的旧派生视觉不得在这两项审计启动前截断 scheduler。code-director 必须先成功 `asset.list`,并在 Provider 请求中读取 Supervisor 已持久化且经校验的 `authoritative=true` 决策,再提交绑定当前 root/completion contract/revision 的覆盖合同与 `use-existing-art / generate-missing-art / regenerate-art` 路由。Runtime 只校验身份、正式资产、Canvas、私有合同、切片、manifest、缺口和 fingerprint,并执行条件分支,不从关键词替 Supervisor 作决定
- 资产边界:首版缺口槽位固定为 `art-spec` 与原子 `core-spritesheet`。art spec 缺失若使图集的引用/Canvas 合同同时失效,则两个槽位都是真实缺口;仅图集缺失时复用 art spec,只运行 `art-asset-plan`。完整覆盖零生成;显式重做只授权当前 root 下两个正式 owner 原位替换。已登记但校验失败的固定资产按真实缺口交回其 canonical owner,并只在持久路由绑定当前 root 时授权原位替换。art manifest baseline 豁免只读取持久路由,不重新运行关键词分类
- 连续性边界:正式 failed continuation 继续继承原完成合同;普通美术措辞不再按关键词跨历史根 Run 借用具体试玩类型,避免新项目误继承旧 `tetris-v1`。code-prototype 仍须先读取并最小 patch 非占位入口、可见使用四类切片,再经过静态检查和试玩门禁
- 恢复与权限:`agent.route_manifest` 在共享 Rust/TypeScript 命令目录中为 `auto`,否则 autonomous profile 会因不能等待人工确认而拒绝唯一决策动作;仅根 Supervisor 和其 code-director 审计 child 可执行,隔离 Agent 与其它角色拒绝。执行中断只允许按 durable pending identity 幂等恢复,同 Run 已持久决策/路由禁止改写。
- 验证方式:覆盖决策前零 child、用户原句只产生 hint、旧无效派生视觉不阻断首波、首波只有设计/程序审计、code-director 收到真实持久策略、完整复用、仅缺图集、无效已登记资产由 owner 原位替换、重做两个 owner、baseline 豁免只认持久 route、code-director 的 asset.list/coverage/route 完成门、自动权限,以及旧 root/错误 binding/fingerprint/缺口/重复 route 失败关闭。
- 当前替代:关键词、否定/重做信号、占位状态和当前资产探测只形成 `advisoryOnly=true` 上下文。game-chat 根 Run 在持久 Supervisor intent 前禁止启动任何 child;持久动作只记录用户 intent,统一走 `audit-existing-first`,不审计、不生成、不固定委派,也不授权整套美术强制重生成。随后只启动 `code-prototype`,由它成功 `asset.list` 后判断完整复用或精确缺口;完整覆盖零生成/零委派,缺口才允许一个受限美术 child,回执回到同一主 Run。普通 GUI / CLI 的 16 节点 DAG 不受影响
- 连续性与恢复边界:正式 failed continuation 继续继承原完成合同;普通美术措辞不再按关键词跨历史根 Run 借用具体试玩类型,避免新项目误继承旧 `tetris-v1``code-prototype` 负责读取并最小 patch 非占位入口、可见使用四类切片、静态检查和试玩;美术 child 只能写 `assets/**`,不得写 `game/**``agent.route_manifest` 的自动权限、pending identity 幂等恢复以及 root / binding / fingerprint / 缺口校验均按上方现行决策执行
- 验证方式:覆盖决策前零 child、用户原句只产生 hint、持久 intent 后只启动主 Agent、主 Agent `asset.list` 前零美术委派、完整复用零生成、精确缺口单 child、回执恢复同一主 Run、child 写入范围与当前 revision 的接入/静态 smoke/双视口试玩完成门,以及旧 root/错误 binding/fingerprint/缺口/重复 route 失败关闭
- 关联文档:`docs/technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md``docs/project-memory/shared-memory/development-workflow.md``docs/project-memory/shared-memory/pitfalls.md`
---
@@ -6568,6 +6576,12 @@
- 根 Supervisor 的 manifest completion gaps 只对 status 已为 Completed 的 seed task执行正式产物与 Canvas 深验;pending/running/failed 本身已经构成完成阻塞,禁止提前扫描后续波次。自动唤醒 200 次瞬态重试预算耗尽后必须写入 `needs-reconciliation`,不能静默返回并留下假运行状态。
- parent wake 的 terminal reconciliation task 是 durable commit markerstate / queue / event / Agent DB audit 是可幂等重建投影;非瞬态 task journal 读取错误直接失败关闭。restart 只在 raw state 具有完整 Agent/task/Session/run/source/profile/binding/task 身份时修复其当前 run;state 缺失、损坏、空对象或关键身份为空时只取 journal 最后 logical run,完整有效的新 Run 阻止历史 marker 覆盖。event/audit 必须完整 payload 唯一匹配,同键冲突或重复失败关闭;旧 task 终态、Runtime 非 waiting 或新 Run 接管时,durable deferred signal 追加 resolved/superseded 后才返回 obsolete。
## 2026-08-07 game-chat Supervisor 意图与单主美术顺序门
- `game-chat-workflow-decision` 升级为 v2。Supervisor 必须把自己理解的用户目标写入非空 `intentSummary``strategy=audit-existing-first` 只提供固定安全执行上下文,不代表用户意图,也不授权生成图片。Runtime 只校验身份、字段和执行边界,不用关键词替 Supervisor 做语义决定。持久决策后只调度 `code-prototype`,普通 GUI / CLI 的 16 节点 DAG 保持不变。
- `code-prototype` 成为 game-chat 唯一主 Agent:先 `asset.list`,资源完整时直接接入且零美术委派,只有真实缺口才临时委派对应的 `art-director``art-asset-plan`child 只写 `assets/**`。两个槽位同时缺失时,`art-director` 的 delivery 必须先被同一主 Run 认领并达到 `EvidenceReady`,之后才允许委派依赖规范图的 `art-asset-plan`;同一槽位不同 actionId 仍不得重复消耗委派名额。生成型回执未认领、证据未就绪或身份不匹配时完成门失败关闭。
- 升级恢复兼容 v1 决策,但不沿用旧责任链:读取时严格复核 v1 fingerprint,从根完成合同的有效任务恢复 `intentSummary`,并保留旧 fingerprint 只用于核对已有 route 身份。旧 `code-director` coverage/route 对当前单主完成门表现为 migration pending;当前 `code-prototype` 必须重新 `asset.list`,再原位写入自己的 coverage/route。这样同一根 Run 可以继续,又不会把旧 Director 审计冒充成主 Agent 本人的完成证据。
## 2026-08-04 静态视觉状态流与可见证据收口
- Canvas、2D context 与图片变量统一按 semantic symbol 记录声明和整体赋值事件;重新指向离屏 Canvas、无效 context 或新图片时立即失效旧视觉身份,只有绘制点可证明的当前状态才作证。
File diff suppressed because one or more lines are too long
+19 -4
View File
@@ -51,18 +51,26 @@
- 现象:用户只说“现在没有用到任何美术资源”,Graph 就在 Supervisor 输出任何计划前自动打开美术节点;或者用户想复用现有素材,Runtime 直接按关键词预完成节点。Supervisor 无固定计划时随即 `fixed-task-graph-stalled`,看起来像模型不理解意图,实际上模型根本没有获得决策机会。
- 原因:同一套关键词函数同时承担 prompt hint、Graph reset、baseline 豁免和历史试玩类型继承,启发式信号越过 Supervisor 成为了控制面真相;main loop 又在 Provider 请求前优先调度 ready task。
- 处理:启发式结果只序列化成 `advisoryOnly=true` 的 Supervisor context。Scheduler 以持久 `GameChatWorkflowDecision` 为首轮前置门;Supervisor 先选审计或整体重做,code-director 再用成功 `asset.list` 和 Runtime 复核的覆盖合同选择复用或精确补缺。Runtime 可以拒绝过期、伪造、遗漏或重复 route,但不得替 Supervisor 补写决定。
- 验证:直接使用用户原句,断言 hint 命中但 manifest 全部保持 pending、决策前零 child、Provider request 包含路由工具;决策后首波只有 design/codecode-director 未完成 asset.list/route 时不能完成;再分别覆盖完整复用、真实缺口和显式重做。
- 处理:启发式结果只序列化成 `advisoryOnly=true` 的 Supervisor context。Scheduler 以持久 `GameChatWorkflowDecision` 为首轮前置门;Supervisor 只持久化用户 intent,随后由唯一 `code-prototype` 用成功 `asset.list` 和 Runtime 复核的覆盖合同选择复用或精确补缺。Runtime 可以拒绝过期、伪造、遗漏或重复 route/delivery,但不得替 Supervisor 补写决定或固定生成美术
- 验证:直接使用用户原句,断言 hint 命中但 manifest 全部保持 pending、决策前零 child、Provider request 包含路由工具;决策后只启动 code-prototype,它未完成 asset.list 时不得委派美术;再分别覆盖完整复用、真实缺口和显式重做。
- 关联:`apps/ai-game-creator-shell/src-tauri/src/agent/runtime_driver/game_chat_fast_path.rs``runtime_driver/main_loop.rs``runtime_driver/task_start.rs``runtime_protocol/autonomous_completion.rs`
## 既有正式产物不能同时被快车道视为已完成、被本轮 baseline 门视为未变化
- 现象:增量任务已有完整美术图集,`art-asset-plan` 每轮都返回零 action 和“已验证交付”,但 completion gate 每轮都报告 `assets/manifest.art.json(unchanged-from-run-baseline)`;最终 child `loop-budget-exhausted`,随后 Graph 和父 Run 失败。日志中没有本轮 Provider request、tool plan 或 action receipt。
- 原因:Graph reset 无差别重新打开稳定的美术 owner 节点;快车道按“当前产物有效”判断完成,owner 完成合同则按“本轮必须修改 baseline 产物”判断完成,两套语义互相冲突。增加 loop 预算、伪造版本号或机械改写 manifest 都不能消除冲突,还会引入 verification loop、字段丢失或错误复用旧主题。
- 处理:关键词和资产探测只作为 Supervisor 的 advisory context,不能直接修改 Graph。根 Run 先持久化 `audit-existing-first / regenerate-art` 决策;前者只启动 `design-director + code-director`,由 code-director 在成功 `asset.list` 后提交权威覆盖合同和精确缺口。Runtime 验证合同后才把已有 owner 投影为 completed,或只打开缺口 owner;根完成门只对持久路由明确复用的 art manifest 忽略 baseline 相同,所有结构、Canvas、私有回执、切片可见使用验收继续失败关闭
- 验证:先断言 Supervisor 决策前零 child、固定关键词不会预完成节点,再覆盖完整复用、仅缺图集和明确重做。还要直接经过父完成门,证明合法持久路由不再出现 art baseline gap,并证明删除切片后覆盖合同拒绝复用;旧 root、错误 fingerprint、虚构或遗漏缺口重复改写路由都应失败关闭。
- 处理:关键词和资产探测只作为 Supervisor 的 advisory context,不能直接修改 Graph。根 Run 先 `audit-existing-first` 持久化用户 intent;即使用户提出整体视觉重做,这也不授权强制重生成。决策后只启动 `code-prototype`,由它在成功 `asset.list` 后提交或建立权威覆盖/缺口 delivery。Runtime 验证合同后才允许已有资产复用,或只打开精确缺口 owner;根完成门继续要求主 Agent 认领回执并完成接入、Canvas、私有回执、切片可见使用和试玩验收。
- 验证:先断言 Supervisor 决策前零 child、固定关键词不会预完成节点,再覆盖完整复用、仅缺图集和明确重做。还要直接经过父完成门,证明合法持久 route/delivery 不再出现 art baseline gap,并证明删除切片后覆盖合同拒绝复用;旧 root、错误 fingerprint、虚构或遗漏缺口重复委派以及 child 写入 `game/**` 都应失败关闭。
- 关联:`apps/ai-game-creator-shell/src-tauri/src/agent/runtime_driver/game_chat_fast_path.rs``apps/ai-game-creator-shell/src-tauri/src/agent/runtime_protocol/autonomous_completion.rs`
## 单主 Graph 升级不能只迁移 sidecar,必须同时处理活跃旧 Run
- 现象:v1 decision/route 能迁移,但升级前正在运行的 `code-prototype` 因 prompt 文本变化被 scheduler 判为身份冲突;同时旧 fixed-graph 的 `art-director / art-asset-plan` 仍持有 scheduler binding,可以脱离新主 Agent 继续生图。
- 原因:迁移测试只手工构造了非确定性主 Run,未经过真实 ready scheduler;资源 route 的迁移也没有自动让已启动的旧责任链失效。硬截止处理若仍只接受根的直接 child,还会把新的嵌套美术 child 留在 running,而丢失 reconciliation 投影。
- 处理:确定性主 Run 只白名单兼容已知 canonical task 文本版本,所有其它身份字段继续精确校验;旧 fixed-graph 美术 child 及沿 isolated instance 父链可证的历史后代在计划和所有非只读工具入口失败关闭,只允许当前 `code-prototype``asset.list` 后重新委派。新美术 child 同样使用显式只读白名单,写工具只允许可证明落在 `assets/**` 的文件/patchset 与 `canvas.asset_generate`,不能借 `memory.write``task.create/update` 修改 memory 和 manifest;会认领 delivery 并写 observed 状态的 `agent.run_status` 也不是只读。绝对硬截止显式验证根、主 Agent、delegated art child 的完整 task/binding/delegation 链。
- 验证:用真实 scheduler 恢复确定性 v1 主 Run;把旧 scheduler 美术 child 置为 running,断言 `canvas.asset_generate``memory.write``task.create``task.update``agent.run_status` 均被拒绝;再持久化其历史 `game/**` writeScope isolated 后代,断言恢复执行写操作仍失败且项目未变。对当前合法美术 child 同样验证 memory/manifest 零写入,再让它带在途外部生成命中硬截止,断言状态进入 `needs-reconciliation` 且 pending/batch/外部生成账本原样保留。
- 关联:`apps/ai-game-creator-shell/src-tauri/src/agent/runtime_driver/task_start.rs``runtime_driver/game_chat_fast_path.rs``runtime_driver/main_loop.rs``runtime_tools/file_ops.rs`
## 执行锁移交给未确认启动的异步 future 会制造永久 queued
- 现象:父 Supervisor 与 Runner 一直显示运行中、heartbeat 正常,专业 Agent 已有 `background_task.queued``autonomous_ready_task.scheduled`,对应执行锁也被 Runner 持有,但该 child 永远没有 running journal、`turn.started` 或后续 Runtime event;其它同批 Agent 可能已经完成。
@@ -4188,6 +4196,13 @@
- 验证:覆盖失败根任务“水晶俄罗斯方块”后输入“继续”、连续 successor、跨 Session、跨 source、正常完成后新输入、带具体新需求、既有非占位入口先 patch 后 smoke、初始化占位的俄罗斯方块真实语义、未知玩法失败关闭、纯继续目标缺失、规范图不在运行 DOM/Canvas、真实动作前后 `sequence` 与 RAF 空转。浏览器验收必须同时比较 baseline 玩法关键文本/控件/状态和当前 revision,不能只看 Canvas 非空与三个固定按钮。
- 关联:`apps/ai-game-creator-shell/src-tauri/src/agent/runtime_protocol/autonomous_completion.rs``apps/ai-game-creator-shell/src-tauri/src/agent/runtime_driver/game_chat_fast_path.rs``apps/ai-game-creator-shell/src-tauri/src/agent/runtime_actions/provider_request_builders.rs`
## game-chat 的固定图不能替代主 Agent 对已有美术的理解(2026-08-07)
- 现象:用户要求把已有美术资源接入游戏时,固定 `code-director -> art-director / art-asset-plan -> code-prototype` 图会在缺少主 Agent 审计的情况下启动美术生成,或把“整体重做”错误实现为无条件生图;美术完成后又换了 Run,代码接入、静态检查和试玩无法形成连续责任链。
- 原因:固定节点把“是否需要美术”的语义判断编码为 Runtime 前置流程,`code-director` 成为另一个主控,而不是让真正接入游戏的 `code-prototype` 基于权威资产事实决策;如果再把固定审计策略塞进用户意图字段,Supervisor 的理解也会被 Runtime 规则覆盖。两个素材槽都缺失时若先消耗不可重试的 `art-asset-plan` 委派,其 child 又必然因缺规范图失败,整个 Run 会进入无法补救的死路。
- 处理:Supervisor 用 `intentSummary` 持久化自己对用户意图的理解,固定 `audit-existing-first` 只作安全执行策略,随后只启动 `code-prototype`。主 Agent 先 `asset.list`,完整覆盖就直接使用;仅在事实证明缺少规范图或核心图集时,才建立一个写入范围受限为 `assets/**` 的美术 durable delivery。两槽都缺失时必须先完成并认领 `art-director``EvidenceReady` delivery,再委派 `art-asset-plan`;回执返回同一主 Run 后再接入素材、原玩法语义检查、静态检查和双视口试玩。读取旧 v1 决策时必须复核其旧 fingerprint,并从完成合同绑定的有效任务迁移 intent;旧 `code-director` coverage/route 只能触发当前主 Agent 重新审计和原位替换,不能直接成为新完成证据。整体视觉重做意图同样必须经过这次审计,不能成为绕过资产复用或强制重生成的固定规则。完整 GUI / CLI DAG 不使用该例外。
- 验证:正反向测试同时证明 `intentSummary` 非空且不被固定策略代替、v1 决策与旧 route 同根恢复、完整资产零委派、真实缺口精确委派、两槽缺失时规范图优先、单个活跃 child、`game/**` 写拒绝、`assets/**` 写允许、回执恢复同一主 Run 和最终主 Agent 自验收;不能只凭 Prompt 出现关键词或 manifest 状态投影判通过。
## Tauri beforeDevCommand 失败不等于已启动客户端会自动退出(2026-08-03)
- 现象:旧 worktree 的 AGC Vite 长期占用 `127.0.0.1:3080`marker 仍指向旧 API;新 worktree 启动 game-chat 后,配套后端在新端口 ready,随后 `beforeDevCommand` 因代理 target 不匹配返回非零,终端已经回到提示符,但原生客户端和它启动的 Runner 仍存活。客户端 WebView 实际加载旧 Vite,因此当前 master 的界面优化看起来全部缺失。