Files
Genarrative/docs/technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md
T
k88936 3ed63349a3
Project CI / Repository checks (pull_request) Successful in 3m15s
Project CI / Frontend tests (pull_request) Successful in 3m46s
Project CI / Backend tests (pull_request) Successful in 4m15s
Project CI / Native shell tests (pull_request) Successful in 15m50s
限制 UI 编辑器 LLM 树与参考图资源
LLM 工具参数限制为 1 MiB,识别与合并按每棵树 512 节点、32 层拒绝超限。

参考图只限制单张 5 MiB,并将有限读取与 base64 编码移入 blocking worker。

补充定向测试和权威文档,移除已完成 TODO。
2026-08-20 12:16:51 +08:00

527 KiB
Raw Blame History

AI 游戏创作智能体 App 实施计划

2026-08-19 UI Editor 节点右键菜单

2026-08-20 UI Editor 最终预览互斥子节点

最终预览中,选中一个 Exclusive 父节点时,它的子节点切换条必须在该父节点自身的预览坐标空间内、紧贴节点上方悬浮;不得固定在预览容器左上角,也不得另行按屏幕坐标换算。点击 tab 必须显式选中对应子节点,不能按通用“切换可见性”语义把当前分支隐藏。切换条始终按内容宽度展开并允许溢出节点边界,不设最大宽度或内部滚动区域。从 Exclusive 切回 Stack 时必须清除全部直接子节点因互斥选择产生的隐藏状态并立即显示所有子节点,后代节点自身的独立隐藏状态保持不变。切换条仅改变现有子节点可见性状态,不能触发参考图重读、视口重新适配或预览树的异步重建。

BestFit 文本测量的 effect 只依赖字号模式的标量值、文本测量键和实际容器,不能依赖整个 FontSizing 对象引用。UI State 对任意节点(包括切换 children_display_mode)的不可变更新会 clone 整棵树;等值 clone 不得重新创建 ResizeObserver 或同步重复二分测量,以避免最终预览已显示时出现明显的“重新加载”。

2026-08-19 UI Editor 节点几何唯一 seam

features/ui-editor/nodeTransformGeometry.ts 是 UI Editor 节点几何的唯一 seam:它统一解析页面 rect 和节点 context、按 anchor / offset 反算 transform、同树 reparent 意图、父节点变换时的直接子节点页面位置保持,以及预览 resize 的等比约束。页面 Inspector、预览 pointer interaction 与状态迁移分别作为该 Module 的 adapter;它们不得再递归计算节点尺寸、各自反算 offset 或复制子节点保持逻辑。跨界面移动仍只保留原局部 transform,不进入 page rect 换算。

此 seam 的纯测试覆盖嵌套 context、offset 反算、同树重挂载、子节点页面位置保持与 Inspector anchor preset 保位;几何修复应在此 Module 局部验证后由三个 adapter 复用。

左侧 UI Tree 与预览画布复用同一个节点右键菜单组件和条目模型,顺序固定为“新增子节点 → 新增同级节点 → 删除节点及子节点”。页面根仅显示“新增子节点”;虚拟超级根不提供菜单。预览仅在“编辑叠加”模式中响应已渲染节点的鼠标右键,右键会选中该节点并阻止嵌套节点事件冒泡;“最终预览”以及画布空白处保留原有行为,空白处不接管浏览器原生菜单。

菜单由页面级 portal 呈现,使用屏幕坐标且在视口边缘内收,避免受预览画布缩放和容器裁切影响。点击菜单外、按 Escape、窗口失焦、滚动或调整窗口大小均关闭菜单。全局 controller.editor.isLocked 时,节点仍可选中和查看菜单,但所有结构修改项禁用;状态层的 mutation 校验继续作为最终防线。点击可用项先关闭菜单再执行现有 controller 动作,不改变既有新增或删除后的选择策略。

2026-08-19 UI Editor 预览等比角点缩放

UI Editor 预览中按住 Shift 拖动四个角点时,以本次进入等比缩放时相对原尺寸变化更大的轴作为主轴(完全相等时取水平轴),并在本次指针拖动内锁定。主轴按手柄方向和位移符号决定放大或缩小;另一轴只由初始宽高比推导,对角保持固定。不得再从两个轴各自推导的候选尺寸中取较大值,否则一轴放大、另一轴缩小时会覆盖较小轴的输入,导致控制点看似朝鼠标反方向跳动。锁定后,受比例驱动的从轴可以不跟随鼠标在该轴的位移,这是等比约束的明确结果。

2026-08-18 UI Editor Inspector 统一锁定态

UI Editor Inspector 的全局只读状态唯一来源是 controller.editor.isLockedInspectorSidebar 在根层提供共享只读 Context,并在顶部只显示一次状态徽章:锁定时使用现有 slate 风格与“只读”锁图标,解锁时显示“可编辑”;整个 Inspector 内容区同步使用锁定表面。节点根的 Transform 局部只读继续仅约束该 Transform 区域,不能被解释为整个 Inspector 已锁定。

全局锁定时所有会修改 State 的 Inspector 控件必须禁用或设为只读,包括文本 / 数值输入、选择器、复选框、组件增删改排和 Sprite 九宫格预设、数值、指针导轨编辑。查看、复制以及不产生 State 修改的展开 / 折叠保持可用。所有 mutation 回调还须在入口检查只读状态,不能只依赖禁用样式,避免键盘或程序化事件绕过锁定。Transform 内不再重复显示全局“只读 / 可编辑”徽章。

2026-08-18 UI Editor 从属页面、手势与保存失败边界

UIDesignImage.metadata.slave_to 是有向无环关系。编辑器状态层拒绝自指、会形成环的赋值以及已损坏或缺失的引用链;Inspector 只将当前图片及其下游后代从可选主页面中隐藏,不能替代状态层校验。UI State 写入前 Rust 持久化校验再次拒绝任意环,保证手工编辑或旧文件同样不能落盘。

预览节点拖拽与缩放共用单一内部手势状态机,每次只能有一个指针操作。状态机保存手势所属界面图、节点、指针和捕获目标;界面图或树切换、指针取消和组件卸载都会释放捕获并清空状态。所有输入和输出几何值必须为有限数,缩放比例还必须大于零;检查失败直接取消操作,不向 State 写入变换。

资源保存的冲突和异常均在编辑器页面持久显示,并可主动关闭;普通异常只显示固定安全摘要,不能显示底层错误正文。保存并返回只在保存成功后关闭返回确认并离开页面;失败后保留确认上下文,以便用户修复、重新加载或重试。

2026-08-18 UI Editor 结构识别、合并与增量导入边界

UI Editor 当前把“识别界面结构”定义为结构草稿阶段,而不是完整视觉还原阶段。识别 DTO 只负责输出节点层级、几何、名称、描述和置信度;节点组件暂为空,由后续“绑定视觉素材”阶段补齐 Image / Text 组件。applyRecognitionResult 可以整体替换当前 ui_trees,但该替换只代表结构结果,不能宣称已经保留截图中的视觉内容;组件状态使用 NoProblem,前置检查仍会根据空组件和素材绑定情况阻止跳过绑定阶段。

结构识别、界面语义建议和多图合并只接受不超过 1 MiB 的 LLM 工具调用 arguments,并在递归业务类型反序列化前先解析为通用 JSON、迭代检查结构预算。结构识别按每棵返回树独立限制为最多 512 个 LLM 节点和 32 层,不汇总多棵树的节点数,也不计 Rust 自动补建的页面根;界面语义建议最多 4 个节点和 4 层;合并计划最多 512 个计划节点和 32 层,Simple.childrenMerged.merged_from 使用同一计数和深度口径。任何超限结果均整次拒绝,不截断、不返回部分结果,也不把工具 arguments 正文写入日志。

多图合并使用 LLM 返回的语义投影树。SimpleMerged 只列出希望进入结果树的原始节点;未被计划引用的源节点表示本次合并判定为冗余或不属于目标公共结构,允许被丢弃,不要求 used_original_ids 覆盖全部输入节点。重复 ID 和未知 ID 仍然是错误;省略不是隐式复制或随机删除,而是合并计划的正式语义。

merge_ui 的 Tauri 命令参数继续保持 State,不新增前端字符串 payload 或 IPC 参数上限。命令进入 Rust 后、构建 LLM 请求前,按每棵源树独立限制 512 个节点和 32 层,不跨树求和;序列化投影超过 2 MiB 时同样拒绝。本边界不宣称覆盖 Tauri 自身的入参反序列化阶段。

UI Editor 的图片、字体和远程素材导入采用增量提交合同:输入先完成各入口已有的预检,随后按顺序逐项写入和登记;前面已成功的项目在后续写入或登记失败时保持有效,调用方必须重新读取 manifest 取得已提交集合。该入口不提供整批事务回滚,也不承诺失败后“零文件、零 manifest 变化”;后续如需原子批量导入,必须新增明确的 transaction / reconciliation 合同,不能把当前入口静默改成另一种语义。

作为 LLM 参考图使用的 UI 设计图单张文件上限为 5 MiB,不设置多图合计大小上限。前端设计图 AssetImporter 对本地和远端入口使用相同单文件限制;结构识别与界面语义建议在 Rust 中先检查文件元数据、再有限读取,并把读取与 base64 编码放在 blocking worker,避免阻塞 Tokio async worker。本阶段不新增图片像素数限制或命令超时。

2026-08-18 UI Editor 左侧节点树跨界面移动

左侧 UI 节点树使用 UI-only 的虚拟超级节点统一承载现有 ui_trees 的页面根节点,仅改变树视图,不写入 State 或持久化契约。页面根节点和超级节点不可拖动;普通节点可在不同页面根节点之间拖动,整个子树随节点移动并保留原 transform。这里的“保留”只表示复制节点原本的局部布局参数,不承诺跨界面后的页面像素位置稳定:不同界面图拥有独立的画布尺寸、像素密度和父节点坐标空间,跨树坐标换算没有可靠的默认语义,因此本次不做换算,也不把跨树移动后的视觉位置描述为“保持不变”。

同一界面图内的重新挂载沿用原有页面几何语义:先计算节点和目标父节点在页面坐标中的矩形,再换算出目标父节点下的新局部 transform,以保持节点在页面中的位置稳定。跨界面移动与同界面重新挂载是两条不同的行为;前者只保留原局部 transform,后者才做页面矩形换算。两种移动都不会自动切换当前 active image;后续如需跨界面坐标换算,另行设计。

2026-08-17 UI Editor 项目字体导入与预览

UI Editor 的 State.font_assets 正式承载项目字体面资源;FontAsset 包含项目资产 ID、受控项目相对路径、内容 SHA-256,以及由 Rust 解析的 family、face、weight、italic、格式和源文件名。TextComponent.font 直接绑定一个具体字体面,font_style 继续表达组件要求的 Normal / Bold / Italic / BoldItalic 浏览器字形;预览将其稳定映射为 CSS fontWeightfontStyle。UI Editor 整体 State 仍只属于当前桌面会话,不新增持久化合同。

字体资源发现与 Sprite 保持同一项目资产语义:两种 importer 在 FileManager Home 下都从唯一的 本地项目 根进入,再按各自 typeFilter 展示已登记资源;不扫描或接纳未登记文件,字体不展示云端素材库。从电脑导入使用 Tauri 系统文件选择器,Rust 整批读取普通文件,拒绝符号链接、集合字体、超过 8 MiB 的单文件、超过 64 个字体面或 32 MiB 项目总量,完成真实签名、字体表、名称与 weight/style 解析后复制到 assets/fonts/ 并登记 manifest。内容相同的字体复用已登记资源;Sprite 与 Font 的 State 批量加入都采用幂等合并:相同 ID 且完整资源相等时跳过,同 ID 数据冲突时整批失败。删除只移除会话 State 资源并清空相应 Image.target_graphicText.font 引用,不删除项目文件或 manifest 条目。

候选格式为 TTF、OTF、WOFF 和 WOFF2,但 Rust 安全解析是导入硬门;当前解析依赖不能完整解析的压缩 Web Font 必须拒绝,不能把浏览器可能加载当作验证成功。已登记字体字节只能经字体专用 Tauri 命令读取;命令重新核对 manifest 的 asset ID / 相对路径、普通文件、大小、字体结构与摘要。Importer 预览也只读取同一受 manifest 约束的字体字节,再临时加载 FontFace 显示黑色的中英文、数字和标点多字号样张;切换选择或关闭时立即卸载。前端以 FontAssetId 派生私有 CSS family,创建 Blob URL 和 FontFace,加载成功后加入当前 document.fonts,资源变更或卸载时删除 FontFace 并回收 Blob URL。同名 family 不共享浏览器注册名。预览仅在绑定字体已加载时使用其私有 family;加载中、失败或悬空引用均回退系统字体。BestFit 使用同样式的不可见浏览器文本节点和容器实际尺寸,在整数 [min,max] 中二分取得最大可完整容纳字号;没有字号能完整容纳时使用 min,容器、文本、字体族、字形、行高或溢出规则变化后重新测量。WebView 加载失败或字体缺少当前文本字形时不阻塞后续阶段,Inspector 显示非阻断提示并回退系统字体;悬空字体 ID 继续由 prerequisite 阻止。

2026-08-18 UI Editor 图片 / 字体通用 AssetImporter 契约

图片和字体共用同一个 AssetImporter,组件不再接收 mode / kind,也不暴露候选项或结果项的 React 渲染回调。调用方只传入 image/font 两份 settings:标题、图标、本地 / 远端来源分支、来源专属 typeFilter、系统文件选择器规则、数量 / 大小 requirements 和导入 policy。typeFilter 只决定候选是否展示;requirements 在提交前限制数量、单文件大小和总大小;文件管理器、预览、加载态、错误态和导入队列由 importer 内部统一处理。

本地和远端候选项保持来源专属字段,不用可选字段猜测来源。项目树已有登记资源直接交付统一的 ImportedAsset;从电脑或云端导入时,importer 调用唯一 Tauri import_ui_editor_assets 命令。命令请求是按 source 分支的联合结构,分别使用 localSourcePaths / localPolicy / localRequirementsremoteAssets / remotePolicy / remoteRequirements。Rust 对目标目录、实际文件签名、媒体类型、扩展名、数量和大小做最终白名单校验;字体只允许本地源,图片允许本地与远端源。旧的三个 UI Editor 导入 command 不再注册为 Tauri command。

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 绑定 requestIdresponseId、问题 / 答案指纹,并把 requestId / answersSha256 原子写回原 delivery。答案收齐后,Supervisor 最多创建一次绑定原 delegationId 的 continuation childagent.delegate 必须提交 continuationOfDelegationId / questionsSha256 / answersSha256Runtime 自动派生稳定 continuation identity,不依赖已清理的 pending action,也不得按单个答案重复创建 child。

问题 envelope、问题数量、字段长度和 SHA 校验均 fail-closed;问题正文只在受保护的 Runtime sidecar / 父 run 上下文中流转,不写入公共审计。若合并后的问题超过用户输入上限,Runtime 停止自动提问并进入 reconciliation,等待人工核对。

2026-08-14 真实 Provider 无人值守验收修复计划

2026-08-14 使用 gpt-5.6-luna 的独立真实 Provider 轮次已经证明 Provider 链路可达:7 个唯一请求全部完成,confirmation、user-input、steer 和公开泄漏均为零;但该轮结果为 FAIL,不得作为无人值守验收通过证据。code-prototype 在 revision 2 的 game.static_smoke 得到可修复合同失败后,于同一 Run 成功 file.patch 到 revision 3;下一轮却在重跑 smoke 前被本地计划门禁终止,因此没有进入 desktop/mobile preview.validate。Supervisor 的 fixed-graph stalled 只是该 child 失败的下游结果。

根因位于 legacy 计划向首份结构化计划的迁移边界。首轮 smoke 失败发生时 planRevision=0Runtime 把 legacy 脚手架中的活动步骤标为 failed;旧 apply_agent_runtime_plan_update 又把这个 legacy 终态合并进首份结构化计划,导致修复 mutation 成功后仍被“结构化计划含 failed 步骤”失败关闭。该 failed 不属于 Provider 提交的结构化计划,也不应成为后续结构化计划的历史终态。

本轮按以下最小边界修复,禁止通过增加 loop 预算、删除完成门或把失败步骤普遍视为成功来绕过:

  1. planRevision=0 表示尚未建立结构化计划。第一次有效 planUpdate 必须完整替换 legacy plan / planSteps / activePlanStepIndex,不得保留 legacy 的 completed / failed 脚手架步骤。
  2. 只有函数入口处已经存在结构化计划时,后续更新才保留 completed / failed 终态。结构化 failed 仍不可被 Provider 改写,普通工具失败和完成门失败继续 fail-closed;本修复不新增 receipt 特判恢复通道,也不放宽 static smoke、revision、desktop/mobile 试玩或最终交付门。
  3. 修复序列回归必须覆盖 revision 2 smoke failed -> 首份结构化修复计划 -> 同 Run file.patch 到 revision 3 -> 自动重跑当前 revision smoke -> desktop/mobile preview;同时单独证明已建立结构化计划后的 failed 步骤仍不可变。
  4. Windows real-E2E 把直属 CLI 终态与 stdio 完整关闭拆成两阶段:完整换行的 turn report 是输出边界;直属 CLI exit/error 后不再向其 PID 发信号;finally 先按 sentinel、endpoint、boot、进程指纹和稳定 Windows process HANDLE 停止 suite 自有 Runner,再有界等待继承管道关闭。临时 AppData 和 sentinel 必须归当前用户私有 ACL,稳定 HANDLE 自测必须同时证明 close 不杀目标、signal 终止原目标。
  5. 验收按“Rust 定向与分组回归 -> real-E2E self-test -> 串行 Rust 全量 -> 前端类型检查 -> 编码和差异门禁 -> 新的独立 gpt-5.6-sol / max 真实 Provider 空项目轮次”执行。真实轮次必须在同一父/子 Run 中取得当前 revision 的 static smoke、desktop/mobile 试玩和唯一 completed 终态;失败轮不得与后续轮拼接。
  6. professional DAG 的图片产物任务必须保持任务文案与计划门禁一致:External Editor 已配置时,art-director 是只允许 canvas.asset_generate 受控素材事务的非只读视觉任务,不得被通用“只读协调”文案拒绝;assets/art-spec.png 的固定 icon-spec / 1:1 合同、其它文件写入禁令、mutation revision 和验证凭证均不放宽。
  7. 真实 E2E 报告必须绑定 effective model、API kind 和 endpoint 指纹,并递归核验唯一 Supervisor 根链、全部后代终态、最终入口 SHA-256 与 static smoke 凭证、交互 CLI 与隔离 AppData 的路径泄漏,以及清理后本轮 Runner/helper/Node/browser/command 后代残留为零;任一项无法证明即 FAIL。
  8. reasoningEffort=max 必须作为独立强度贯通配置校验、platform-llm Responses 请求、Provider 适配、Codex 映射、请求指纹和前端配置类型,不得静默降级为 highx-high。本轮真实验收固定使用 agentMode=provider;由于 canonical Agent 会先应用角色默认推理强度,隔离配置必须为 project-supervisorcode-prototypeart-directorart-asset-plan 分别显式覆盖 max,并由报告中的 effective binding 证明四者一致。

目标

在 Genarrative 内建设独立桌面 App:普通用户通过项目开发工作台中的陶泥儿对话、资源画布、运行状态和确认操作,让平台生成保存在本地的可运行 Web 游戏原型,并通过本地 HTTP server 预览;主窗口提供运行时配置入口,用于保存发布版 AppData / Tauri 配置目录里的 LLM 配置及受控开发者 External Editor 配置。普通客户素材画布使用平台登录态调用内部编辑器 API,不展示或要求填写画板 Base URL / API Key。任务明细、原始文件、命令日志和专业 Agent 调试控制只通过显式开发调试入口查看,不随普通客户端启动额外打开窗口。v1 的生成闭环仍以 Web 小游戏为主,同时允许用户打开已有 Godot 项目:用户选择的目录始终作为工作区根,.agent/、Session、Runtime、文件工具和外围资料都留在该根;客户端检查根目录及一层直接子目录中的普通文件 project.godot,将唯一命中的实际目录以工作区相对 godotProjectRoot 记录到 manifest。Agent 使用标准运行档继续修改,不创建 game/assets/memory/exports/ 平行目录;本期不扩展 Unity、Godot 内嵌预览、云同步或插件市场。

技术选择

  • 桌面壳:新建 apps/ai-game-creator-shell,与现有 apps/desktop-shell 分离,避免把游戏创作本地能力塞进主站宿主壳;启动时先检查平台登录态,未登录只展示登录页,登录后进入单窗口客户端首页;正式用户窗口常驻左侧栏和顶部栏,并在首页、项目组、指南 / 反馈和项目开发页之间切换。发布和 debug 启动都只登记并打开 client 用户窗口;index.html?agent-chat 仅保留为显式前端调试路由,不是 Tauri 自动启动入口。
  • 平台后端:继续使用 server-rs + Axum + SpacetimeDB;本地开发启动独立客户端时,agc / Tauri dev 会先启动或复用配套 SpacetimeDB 与 api-server,再启动固定端口 Vite,并通过 /api 代理访问实际后端端口。
  • 本地能力:使用 Tauri Rust command;正式用户 App 在项目运行工作台内承载 127.0.0.1 本地 HTTP preview,不再调用系统外部浏览器。运行容器只接受当前授权项目由 PreviewRegistry 返回的 loopback URLrelease / dev CSP 都只为 http://127.0.0.1:* 开放 frame-src,并使用受限 iframe sandbox 隔离游戏脚本;远程 URL、file:// 和任意手填地址均不得进入该容器。
  • Agent Runtime:扩展 server-rs/crates/platform-agent,不引入 LangChain、AutoGen、Microsoft Agent Framework 或 OpenAI Agents SDK sidecar 作为核心。
  • 设计参考:借鉴 OpenAI Agents SDK 的 Agent、Tools、Handoffs、Guardrails、Tracing 抽象,但运行时由 Genarrative 自己掌控。
  • Run 控制参考:借鉴 Harbour 的控制平面思想,只吸收 run lifecycle、activity/output stream、context bundle、kill/retry/resume 等本地运行治理能力;不引入 Harbour 的多租户后台、调度 UI、通用 shell workflow 或远程 runner 作为 v1 依赖。
  • 本地工程参考:借鉴 Godcoder 的本地产物 checkpoint / diff / restore、上下文安全过滤、轻量项目索引、项目级写锁和项目级权限策略;不引入通用 IDE 插件、云工作区或任意代码代理。
  • 代码组织:桌面客户端入口保持为薄组合层。前端把认证、Tauri 桥接、Runtime 配置、Agent Runtime 展示和项目摘要分别放入 src/appsrc/servicessrc/features;Rust 项目能力和测试按功能域使用目录模块;界面测试与真实 Runtime E2E 使用薄 suite registry / entry 保留原执行顺序。后续拆分必须保持公开导出、命令契约、测试名称和行为不变,不能用 include!、整文件文本拼接或只移动到另一个超大文件代替真实模块边界。
  • 源码门禁:check:native-shells 等源码扫描必须跟随真实模块归属;入口组合层只验证受控组件的挂载关系,具体实现由所属模块单独验证。模块拆分后不得为了满足旧字符串扫描把实现搬回 App.tsx,也不得用跨文件文本拼接代替组件归属检查。

开发态 Project Supervisor 纯聊天独立窗口

  • 入口边界:当前仅 Tauri dev 提供独立窗口,路由为 index.html?supervisor-chat&projectPath=...,其中 projectPath 传入 URL 编码后的项目绝对路径。该窗口仅通过显式开发调试动作打开,不增加正式用户入口,也不随 npm run agc 自动弹出;重复打开同一项目只恢复并聚焦原窗口,切换项目时在同一窗口导航。
  • Runtime 边界:窗口固定对话 Agent 为 project-supervisor,新 Run 使用 standard profile,复用现有 active Session、External Runner、Agent Runtime、AppData 配置和持久 conversation;不新建平行会话库、Runner 或配置存储,也不把该测试入口隐式切成自动修改项目的自主构建模式。
  • 界面边界:只显示持久消息区、输入框、必要的等待 / 错误状态、工具确认 / 用户追问卡片和设置入口;不显示 Agent picker、Session 面板、Goal 面板、完整 Runtime 面板或专业 Agent 协作栏。会话历史仍绑定 project-supervisor 的 active Session 持久化,不因隐藏 Session 控制面而变为临时聊天;supervisor-chat 窗口必须具备只读 Tauri event listen / unlisten capability,以实时接收 Runtime 更新。
  • 产品边界:正式用户 client 窗口、登录后首页和项目开发流程保持不变,不暴露该开发验证面。

2026-07-29 “游戏运行 + 聊天”独立构建入口

  • 入口例外:debug 构建接受 CLI --game-chat,并可选接受 --project-path <absolute-path> 与内部验收用 --initial-message <首条消息>;宿主内部统一映射为 index.html?game-chat&projectPath=...。独立 game-chat release flavor 使用 npm run agc:build:game-chat-release 构建,并由 Rust game-chat-release feature 在无参数启动时固定同一初始页面;前端也在编译期固定为 game-chat 页面,不能导航回普通客户端首页、项目组或开发窗口。该 URL 必须在 Tauri 创建 client WebView 前写入初始 WindowConfig,禁止在 .setup() 阶段读取尚未完成首航的 client.url() 后二次导航。页面首屏读取初始消息后必须立即从当前 URL 删除 initialMessage,并以页面级闩锁绑定启动项目;React StrictMode、Runtime 终态、HMR、整页重载或项目切换都不得再次提交同一启动消息。普通 dev / release 的入口、参数与页面集合保持不变,普通 release 不因该 flavor 注册 game-chat 参数或窗口。未传入项目路径时由页面选择目录:已有 AI 游戏项目直接打开,空目录按目录名初始化,非空且未初始化目录继续复用现有二次确认。
  • 独立发布身份:game-chat release 使用独立 Tauri 配置,productName 固定为 Genarrative Game Chatidentifier 固定为 world.genarrative.ai-game-creator.game-chat,当前专用 release 版本为 0.1.1,因此安装身份和 AppData 均与普通 Genarrative AI Game Creator / world.genarrative.ai-game-creator 隔离。该 flavor 只生成自己的 NSIS release 包,不覆盖普通客户端构建配置或已有 AppData。
  • 本地页面边界:独立 standalone game-chat release 在前端入口直接渲染本地 GameChatReleaseApp,不经过平台 AuthenticatedClient,启动和使用本地项目工作台不依赖 api-server 或平台登录态。该 flavor 只有在用户显式启用隔离 AppData 中的高级 External v1 配置后,才使用自备 Developer API Key 调用 /api/external/v1/*;未配置时云端画板同步与生成能力明确不可用,不得回退、自动签发或内置 tnr_sk_...。普通 release、npm run agc 和 debug game-chat 继续经过既有认证包装,并统一使用网站 Access Token 与内部编辑器路由。
  • Windows AppData 安全迁移:首次创建客户端 AppData 时必须以进程 TokenUser SID 显式设置 owner,并写入当前用户私有 DACL,不能把可能为 Administrators 的 TokenOwner 当作用户身份。发现历史目录 owner 不属于当前 TokenUser 时,不在原目录上放宽权限,而是拒绝 reparse point / junction / symlink 后,将旧目录原子重命名到同级唯一 .owner-mismatch-backup-* 备份,再新建并验证当前用户 owner 与私有 DACL;迁移或备份失败必须失败关闭,不覆盖旧配置。
  • Windows 私有文件初始化:父目录已归当前 TokenUser 后,新建 .agent/.manifest.json.lockagent-runner.lock、endpoint 临时文件、project-owner 诊断临时文件与 real-E2E 私有文件的 owner 仍可能采用 token 默认 owner Administrators。manifest 固定锁和 Runner 固定 stale lock 只有在 Windows 不共享独占句柄已取得、且句柄确认普通文件、非 reparse point、链接数为一时才允许初始化或修复为当前 TokenUser,随后必须再次复核句柄并按既有 owner/DACL 门禁验证;其它临时文件只允许在本进程 create_new 成功且仍持有同一独占句柄时初始化 TokenUser owner / DACL,再写入、原子安装并严格复核,初始化失败必须清理刚创建的文件。既有 durable endpoint / diagnostic 读取不得自动接管;活锁不得截断,只有 sharing / lock violation 32/33 表示占用,access denied 等其它错误立即返回。父进程观察到 Runner 子进程退出后立即返回错误,不等待完整 30 秒 deadline。
  • 启动诊断:独立 release 的 startup.logagent-runner.log 只记录有界、脱敏的阶段与 stdout / stderr 摘要,凭据、AppData 路径和其它绝对路径不得原样落盘;单文件达到 256 KiB 后只轮转保留一份 .previous.logstartup.log 优先写独立 AppData,目录不可写时回退到系统 TEMP 下的 Genarrative-Game-Chat-DiagnosticsTauri context、窗口 URL、AppData、Runner 或 .setup() / .build() 初始化失败时,Windows 必须显示可见错误对话框并给出诊断日志位置,不能只在无控制台 release 中静默退出。
  • 对话与事件:窗口固定使用 project-supervisor + autonomous-game-build,继续复用 active Session、External Runner、持久 conversation、流式回复、same-run steer、工具确认与用户追问。以 / 开头的输入必须继续走现有内置命令解析,例如 /preview 只能生成 preview.start 确认卡,不得作为自主构建任务投递给 Supervisor。game-chat 的自主链路中,Supervisor 持久化意图后只有 code-prototype 是主 Agent;它可能临时委派一个受限美术 child,后者只写 assets/**,回执返回同一主 Run 后由主 Agent 接入与验收。界面聚合当前 Supervisor 父 run、单主 Agent 及其直接美术 child 的最新原始事件,按时间倒序稳定去重并标注 Agent;默认显示 4 条,可展开至最新 20 条。原始 summary / detail 仍只作 Runtime 状态投影,不直接写入 conversation。需要进入聊天的事件必须由 Rust 同步生成唯一 eventId 与安全 publicText;前端只按这两个字段形成独立 assistant 消息,无 eventId、空 publicText、legacy 事件和内部 tool / Provider / Runner 协议一律忽略。
  • 公开消息硬门:模型仍负责 Supervisor / 专业 Agent 回复的业务语义,Runtime 不根据 tool 或 Provider 事件自行补写业务结论;但用户直接投递的 Project Supervisor 根后台任务必须先落为不可执行的 preparing / public-status-pending,再以 runtime-public-status-* 稳定 message ID 把“任务已接收,正在启动处理”写入项目 conversation,成功后才转为 pending / queued;恢复预检只读,只能在验证到同 run accepted 消息后把该任务临时分类为可恢复,真实 resume 持有 Agent 锁后才可持久提升为 pending / queued;写入失败则落为 failed / public-status-write-failed,不得继续执行。这些 Runtime 公开状态只供 UI 展示,prompt 构建器必须按稳定前缀排除。根 Supervisor 通过正式失败 / 预算耗尽收束或 game-chat 绝对硬期限进入 reconciliation 时,必须在 task、event、state 等其它终态投影之前先幂等写入一条脱敏、用户可理解的失败消息;专业 Agent 命中该全局硬期限时,也必须通过权威 Run Profile 和根 task 将同一根终态写入项目 conversation,同时保留 child 私有 Session 状态;状态文件本身写坏也不能导致零公开结果。当前 Runtime 自称根 agent/run 时,其 session 和两个 parent 字段必须与权威根 task 一致;任一身份冲突必须失败关闭,不得以另一 session 派生第二条项目终态。前端把该前缀识别为 Runtime-owned,同秒时排在触发它的 Supervisor 用户消息之后,不二次持久化;仅根 Supervisor 的 turn.started / turn.failed / turn.budget_exhausted 只保留在 Runtime 详情和进度投影中,不能再生成第二条聊天消息,专业 Agent 的公开启动事件仍可见。该硬门不改变 final-reply 的唯一性;非 Supervisor 专业 Agent 的失败消息继续留在对应 Agent Session,不把私有诊断写进项目 conversation。
  • 启动恢复和续跑边界:本条取代上一条中“只有 accepted 才可恢复”的窄口径。若进程在 Supervisor 用户消息已持久、accepted 未持久之间崩溃,只读 preflight 可以把该 preparing 识别为可恢复,但不改写 task/conversation;真实 resume 持有 Agent 锁后必须先幂等补写 accepted,再提升为 pending / queued。用户消息或 accepted conversation 已落盘而辅助审计失败时,以 conversation 为公开真相继续入队,不留下“已接收但永不执行”的任务;根终态首次公开写入的瞬时失败必须在终态投影后用相同 message ID 重试。receipt / isolated-join 等带 parent 的 Supervisor continuation 不再另写 Session 终态,只保留单一后端公开事件;runtime-task-*runtime-public-status-* 共享同 run 的不透明关联摘要,秒级时间戳下多个连续任务必须按实际 run 对应的 user -> accepted -> terminal 顺序交错展示。
  • Supervisor 进度播报:聊天消息流内保留且只保留一条当前 run 的 Runtime-owned 播报卡,由客户端从 manifest 任务图、Supervisor 结构化计划、loopIteration、当前动作、直接委派专业 Agent 及其持久事件确定性整理;显示当前轮次、任务 / 计划进度、活跃 Agent、最近试玩与静态检查、返工决定、代码修改和截图检查证据。同一 run 原位更新,切换 run 时替换,不调用额外模型、不追加持久 conversation,也不改变最终 assistant 回复的唯一性;任意详情必须有界且不展示绝对路径、Provider 元数据或内部指纹。运行详情弹窗在项目或 run 身份切换的同次提交中同步关闭,不能由延迟 effect 关闭用户在新 run 状态可见后刚打开的弹窗。
  • ready-task 启动活性:background_task.queuedautonomous_ready_task.scheduled、Runner heartbeat 或执行锁已移交都不等于 child 已启动。实际持有执行权的 Runner 必须在释放项目写锁后同步写入 child 的 running task、turn.started 与 started journal,再把已启动 state 和 per-Agent 执行锁交给已确认开始轮询的独立 execution worker;同步启动或 worker 接管失败时,要在仍持有执行锁期间依次把 child 和 manifest Graph 节点明确落为 failed,再释放锁并让 parent 收到调度错误。autonomous_ready_task.scheduled 只作诊断审计,其写入失败不能阻断 durable child 启动;external client 只 wake Runner,不在客户端抢占执行。Supervisor 进度卡通过 durable startedAt(旧 Run 从完整 task journal 恢复,最新 task-record fallback 保持 0)显示真实持续时间,并以父 Run 与当前关联专业 Agent 的最大事件时间计算运行态活跃度:运行超过 5 分钟无新事件时显示“运行中 · 疑似停滞”和静默时长;等待用户、等待确认、Provider retry、视觉资产、进程会话、pausing 与 paused 不误报。父 Run terminal 后,持续时间冻结在父 Run 自身最后活动,不随 child 晚到收口事件增长。消息时间统一校验为 JavaScript 可表示的 Date;越界值显示“时间未知”且不写无效 datetime。实时回复只显示 response stream 自己的 updatedAt,缺失时同样显示“时间未知”,不能借用其它 Runtime 活动时间或随前端时钟漂移。该提示只提供可观测性,不改变 Runtime/manifest 正式状态。
  • ready-task manifest 漂移:父 Supervisor 必须分别判断“能否调度新节点”和“是否存在必须等待的工作”。派生视觉需要父规划修复时不再调度新 child,但当前最新且活跃的根 Run 下,只要存在确定性 runId、scheduler source、正确父绑定且 durable journal 为 queued/running 的 ready child,父 Run 就保持 waiting-for-manifest-tasks,不能因旧 hydration 快照把 manifest running 覆盖成 pending 而提前 fixed-graph-stalled。game-chat child 可在相同严格身份下容忍 pending 漂移;正式产物、Canvas、revision、game.static_smokepreview.validate 门禁不放宽。GUI/CLI、旧父 Run、终态、确认/用户输入/reconciliation、伪造绑定或非确定性 runId 全部失败关闭;更新根 Run 后旧 child 不得继续维持新 DAG 或投影完成。
  • Supervisor 持久决策与单主条件美术:game-chat 的关键词、用户是否报告“美术未接入”、占位状态和当前资产探测只形成 advisoryOnly=true 的补充上下文,不得直接重置 Graph、预完成美术节点、选择复用/生成分支或继承历史试玩类型。当前根 Run 没有持久化 Supervisor 决策时,scheduler 不启动任何 childSupervisor Provider 只通过 auto-safe 的 agent.route_manifest 提交 game-chat-workflow-decision.v2intentSummary 是 Supervisor 自行理解并持久化的用户意图,strategy=audit-existing-first 只是固定安全执行策略,两者不得混用。此动作不能审计、生成、委派或替代后续判断,也不能把整体视觉重做解释成整套美术的强制重生成;成功后 Runtime 只启动唯一 code-prototype 主 Agent。升级恢复时严格校验 v1 sidecar 的旧 fingerprint,并从完成合同绑定的有效任务恢复 intentSummary;旧 code-director coverage/route 只作为迁移输入,不作为当前完成证据,必须由同一根 Run 的 code-prototype 重新 asset.list 后原位替换为单主合同。确定性 code-prototype Run 仅兼容已知 canonical task 文本版本,其余 task/binding/root 身份继续失败关闭;升级前已运行的 fixed-graph 美术 child 不再具备任何 mutation 或生图权限。主 Agent 必须以当前正式资产、Canvas 登记、私有图集合同、四张语义切片和 art manifest 判断真实缺口;完整覆盖时直接接入,不得生成或扣费。只有可证实缺失 art-spec 或核心 spritesheet 时,主 Agent 才可对相应 art-directorart-asset-plan 建立一条 durable 委派;每次最多一个活跃美术 child,child 仅可写 assets/**,不得修改 game/** 或接入/验收游戏。若两个槽位都缺失,必须先完成 art-director,由同一主 Run 认领其 EvidenceReady delivery 后,才能委派依赖规范图的 art-asset-plan;失败或未就绪 delivery 不得消耗不可重试的图集委派槽位。主 Agent 认领必要回执后继续同一 Run 完成素材接入、原玩法语义校验、game.static_smoke 与桌面/移动 preview.validate。绝对硬截止对嵌套美术 child 继续核验 root -> code-prototype -> agent-delegate 完整身份并保留未知外部生成的 reconciliation 证据。Runtime 只负责校验根/父子身份、当前 revision、路径、Canvas 登记、缺口/路由 fingerprint、写入范围及完成证据;纯“继续”仍走既有正式 continuation 合同,普通美术措辞不得借用更老项目的具体试玩场景。不得以增加 loop 预算、伪造 revision、机械改写 manifest 或重放历史图片 action 代替 Supervisor 决策和程序侧审计。
  • ready-task 对账取消续跑:未知工具结果仍停在 needs-reconciliation 且禁止自动重放;人工核对后显式取消原 child,保留 cancel tombstone,旧 child 和旧父 Run 按真实终态收口。若随后创建同 Session、同 Supervisor source、同有效任务语义的 continuation,新完成合同只对同时具有历史 failed / needs-reconciliation、最终 cancelled 和 durable tombstone 的 ready-task,把当前 manifest 对应 failed 节点恢复为 pending,并由 scheduler 创建全新 child Run。manifest 的读取、failed 筛选、每任务一次的 child journal 索引、证据重验和写回必须位于同一项目写锁域;较新的无 child 根 Run 只有在 durable journal 精确表明为旧 failed Graph 在进入调度前即失败时才能跨过,scheduler 自身失败必须阻断借用更老 tombstone。普通失败、无 tombstone、不同 source/Session/任务语义或证据冲突均保持失败关闭;不得复活旧 pending action、补造 observation 或把取消任务标成 completed。
  • 完成门静态分析预算:Canvas 视觉门必须先做只会提前拒绝的词法预检。经典或模块脚本同时不含大小写精确的 importexport 字节序列时,不运行模块依赖语义分析;纯 export ... from / export * from 仍须进入正式模块图分析。当前脚本不含目标文件名或任一已绑定 DOM 图片元素 ID 时,先低成本解码 \\xNN\\uNNNN\\u{...}、简单转义和续行;解码后仍无候选才不运行完整 Canvas alias / 函数可达性分析,解码不确定则保守进入 Oxc。存在任一候选时仍执行原 parser、semantic binding、解码后的 computed 属性/StringLiteral 路径、可达 drawImage、可见 Canvas、路径大小写和动态 namespace 写入门禁;HTML 中存在某个绑定元素不得使所有无关 JavaScript 单元进入重分析,禁止把词法命中当作通过条件。
  • Provider 故障展示:Provider retry 的“是否可重试”继续使用 upstream-5xx 等稳定类别判断,但 durable retry record 保留安全的精确 upstream-<HTTP status> 身份。等待态必须从真实 record 显示 HTTP 状态、nextAttempt/maxRetries 与当前持久退避剩余秒数,例如“Provider 上游返回 HTTP 503,准备自动重试 1/3;预计 8 秒后重试”;不得以动画或前端自增计时伪造 attempt。重试耗尽的 Runtime 私有错误只保存 kind/httpStatus/fingerprint/chars/retryAttempt/maxRetries/retryState,前端和持久 conversation 仅在字段顺序、范围、状态一致且无尾随正文时派生“上游服务返回 HTTP 503;自动重试已耗尽(3/3)”。codex_app_server 收到 failed turn 时必须读取协议 turn.error.codexErrorInfo,按上下文超限、会话预算、用量、鉴权、请求、策略、sandbox、会话恢复和连接 / HTTP 状态生成封闭稳定分类;不得丢弃该字段后统一写“turn 执行失败”,也不得把 message / additionalDetails 原文公开。自主构建已有本地确定性完成文案时,也只允许 empty-response / deserialize 这类回复形状错误使用 fallback;鉴权、额度、上下文、策略、sandbox、配置、网络和上游错误必须保持失败,禁止用完成文案掩盖。正式面、阶段记录、Runtime 活动详情和持久 conversation 从稳定分类派生同一份可行动中文摘要;失败事件活动详情只消费后端 publicText,缺失时退回固定安全 summary,禁止公开私有 detail。旧 Supervisor 与专业 Agent 失败 conversation 必须在展示时经过相同安全映射。needs-reconciliation 是停止自动推进、轮询和活跃计数并等待人工处置的终态,明确显示为待核对,不能显示为普通运行中或已完成;未知分类仍使用固定安全兜底。Provider 响应正文、URL/query、凭据、本地绝对路径、fingerprint、字符数和 [redacted ...] 占位符均不得进入用户可见消息。
  • 跨轮阶段记录:game-chat 父 run 进入真实 completed / failed / cancelled 终态后,客户端等待唯一 code-prototype 主 Run 及其所有必要美术委派都已形成真实终态,再把本轮、主 Agent 进度、是否复用/补齐素材、最新试玩 / 静态检查、最近返工决定和已登记成果图片路径整理成一条 【Supervisor 阶段记录】 项目 assistant 消息。父 run 先终态而 child 或 manifest 仍在 hydration 时不得以陈旧快照提前归档,要暂存终态 Runtime 并在状态刷新后重试。页面初始 hydration 若直接读到缺少阶段记录的真实终态 run,也必须补写,但 idle 不是可归档终态。每个“项目 + 父 run”最多追加一次,进入现有 conversation.write 权限与项目 conversation 持久化链路,下一轮及重载后继续保留。阶段记录不是 Supervisor Runtime 正式回复,不写入 Agent Session、不增加 final assistant 数量,也不逐条复制原始事件或内部正文。
  • 图片成果:当前 manifest 新增或恢复已登记的 PNG / JPEG / WebP 资源时,聊天消息流同步显示 Runtime-owned “Supervisor 成果图片”卡,最多展示最新 4 张并随 manifest 原位更新。图片必须通过现有 read_local_project_image_preview 读取,只允许当前授权项目中 assets/ 下的已登记资源,继续执行 file.read auto 权限、真实格式、大小、尺寸、普通文件、祖先目录和项目根边界校验;前端只接受返回路径、媒体类型和 data: 前缀与请求完全一致的结果。缩略图点击后使用独立模态查看器,支持按钮与滚轮缩放、指针拖拽、双击 / 按钮复位、Esc / 按钮 / 遮罩关闭,移动端占满视口;不得在聊天卡下方追加展开区。图片卡不写入 conversation,不解析 assistant 文本中的任意 Markdown / 绝对路径,也不开放 .agent 验收截图读取。
  • Run 接管:External Runner 模式下首次提交可能返回“旧 canonical state + 新 acceptedRunId”;页面必须以 acceptedRunId 作为本轮权威身份,在 state 尚未切换时显示“已投递,正在同步 Agent Runner”,并允许该 run 的 Tauri event 或轮询结果接管。不得把旧 idle state 当作本轮结果、过滤新 run 事件,自动预览授权也必须绑定 acceptedRunId
  • 运行容器:当前项目没有由 Tauri 客户端 PreviewRegistry 返回的有效 running 预览时,页面只渲染聊天,不显示游戏区域或占位文案,顶部运行状态必须明确显示“预览未启动”,不得再使用含义不明的“未启动”;预览运行后自动显示 iframe,桌面端按“游戏 2 / 聊天 1”分栏,移动端改为上下布局。预览停止、失败或切换项目后立即移除 iframe。运行容器继续只接受当前授权项目的 http://127.0.0.1:*,复用现有 CSP、iframe sandbox、autoplay、fullscreen 和 gamepad 约束;远程 URL、file://、手填地址或陈旧 manifest 状态均不得显示。
  • 预览进程归属:External Runner 与 Tauri 客户端位于不同进程,双方 PreviewRegistry、server 子进程句柄和 running 状态严格进程内隔离;Runner 为 preview.validate 持有或回收的预览进程不能作为用户可见预览,也不能据此伪造 Tauri registry 的 running 状态。game-chat 用户可见 preview 必须由 Tauri 客户端启动、持有和停止,iframe 只使用同一 Tauri registry 返回的 loopback URL。
  • 自动启动门禁:客户端只接受当前 accepted Supervisor 父 run 下真实 preview-playtest scheduler child 的结构化 preview.validate 事件,同 revision 采用最新事件且同时间失败优先;成功证据的 revision 必须精确等于当前项目原子 sidecar revision。客户端向 Tauri preview.start 传入 expectedRevision,后端在取得项目写锁后再次比对再启动,以闭合检查 / 启动 TOCTOU。same-run steer 的一次性授权使用带 revision / validation cursor 和唯一 generation ID 的 v2 记录,旧事件和旧异步 attempt 不得消费后续授权。旧 attempt 返回后的补偿清理按完整 preview identity 原子停止 registry server,不能让项目 stop policy 或写锁竞争造成后台 server 泄漏;若同项目新 server 已接管,则不能把其持久状态覆盖为 stopped。
  • 固定试玩契约:generic-v1 初始状态必须为 readylevel > 0;点击 start 后 sequence 必须推进、phase 必须进入 playing,并先持续观察 2 秒、取得至少 8 个实际样本,期间保持 playing,以确认玩家获得正常操作机会。随后必须点击唯一可见、启用且真实可交互的 data-playtest-id="primary-action" 控件;该控件必须映射游戏的真实主要玩法操作,并以 sequence 相对点击前严格推进证明操作已被接受。玩家获得这次正常操作机会之前进入 won | lost 属于过早结束并失败;操作被接受后的单次 lost 是合法游戏结局,但不能成为所有受控尝试的唯一结果;若主要操作后仍为 playing,则继续观察 3 秒并取得至少 12 个实际样本,won 可提前证明非失败推进。点击 restart 后 sequence 必须再次推进并恢复到 ready | playing,随后持续观察 3 秒且取得至少 12 个实际样本。若首轮结果为 lost,重开稳定后必须再执行一次必要的 start、2 秒 / 8 样本操作机会和真实 primary-action;第二次必须进入或保持 playing(再观察 3 秒 / 12 样本且不得转为 lost)或进入 won,两次都固定 lost 代表无法正常推进的恶性 bug,必须失败。各观察窗口内 sequence 不得回退,restart 窗口只能保持 ready | playing;样本数门槛不能替代时长门槛,窗口末端必须强制再读取一次有效状态,不能只在前段快速取得足够样本后提前通过。控件 selector、观察时长、最少样本数、终态边界、非失败推进、末端覆盖、sequence 单调 / 严格推进规则及完整 required assertions 都进入 scenario fingerprint。读取旧 fingerprint 回执和检查 plan liveness 时,把合同升级造成的 fingerprint 不匹配视为 stale missing,允许同一 run 重新执行 preview.validate 自愈;身份、路径、digest 或内容完整性篡改仍失败关闭。最终完成门每次按当前合同重算 fingerprint,并严格拒绝旧 fingerprint、旧 assertion 集或仅保存历史 passed=true 的证据。
  • 试玩证据展示:game-chat 的进度卡、可玩 revision 和自动预览只接受结构化 preview.validate detail 同时满足 passed=trueplaytestPassed=true;工具 summary 中的 ok 不能作为兜底。image.inspectstatus=ok 只代表工具执行成功,不代表视觉验收通过;结构化 passed=null 或缺少布尔结论时,UI 必须以中性“截图分析完成”展示,只有显式 passed=true 才能显示“截图检查通过”。
  • 一次性自动预览授权:用户在该入口成功提交本轮自主生成需求,即视为对“当前项目 + 当前 Supervisor 父 run”的一次 preview.start 授权。授权以仅含项目路径与 accepted parent runId 的客户端本地记录持久化,App / WebView 重启后仍可恢复,但项目或 run 身份不匹配时不得使用。只有当前 accepted parent run 成功完成 preview.validate 且给出有效 revision 后,客户端才可消费授权,由 Tauri 首次启动并自动展示该 revision 的用户可见预览;一次授权最多成功启动一个 Tauri preview server,并必须继续走现有权限、项目写锁、审计和客户端 PreviewRegistry 链路。项目或 Agent 策略的显式 deny 始终优先,不得被此授权绕过。启动成功、显式 deny、非瞬时失败、父 run 在首版验证前终止或切换项目后授权失效;preview.start 恰逢项目写锁竞争属于瞬时失败,不消费授权,释放写锁后由同一轮询链路重试。
  • 增量预览刷新:Tauri 客户端记录当前 iframe 已展示的 validated revision;同一当前 run 后续成功 preview.validate 的 revision 严格高于已展示 revision 时,只在原 Tauri preview server 和原 loopback origin 上刷新 iframe,不得再次调用 preview.start、新增 server 或切换到 Runner registry。相同或更低 revision 不触发刷新。preview HTTP server 对 HTML、脚本、样式、资源和错误响应统一发送 Cache-Control: no-storeiframe 刷新必须读取新 revision,不能继续命中 WebView 缓存中的旧版本。自动预览轮询回归的等待上限必须严格大于生产 1000ms 轮询间隔,不得使用同为 1000ms 的默认上限制造 CI 边界竞争。
  • 退出与 Runner:独立 game-chat release 正常退出 Tauri 事件循环时调用仅供该 flavor 使用的认证 runner.shutdown_for_client_exit。Runner 先进入 draining、拒绝新的 Runtime 写请求,再无条件请求结束本 boot;已有 durable task / handoff / retry / reconciliation 状态不得伪装为 completed 或被删除,下次启动按既有 reconciliation 合同恢复。Windows game-chat 客户端以 CREATE_SUSPENDED 创建 Runner,在其执行用户代码前立即加入由客户端持有的 JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE Job,严格复核唯一主线程后再恢复运行;分配或恢复失败必须 kill + wait 并令客户端启动失败。Runner 的 command、MCP、Git、PTY 及其它未 breakaway 后代随客户端异常退出或 Job handle 关闭一起终止;Runner 正常退出前仍先执行既有进程会话收束。普通 dev / release 与 CLI 继续使用 runner.shutdown_if_idle,不改变共享 Runner 的原生命周期。
  • Windows 后台进程可见性:所有不需要交互控制台的 command.exec / project.verify、STDIO MCP、Repository Context Git、git.inspect / project.git_commit 和清理用 taskkill 必须使用 CREATE_NO_WINDOW;需要独立终止边界的命令可同时使用 CREATE_NEW_PROCESS_GROUP,不得使用会增加孤儿风险的 DETACHED_PROCESS。game-chat release 禁止再打开 launcher、workspace 或其它平行 Tauri 页面。
  • 真实浏览器回归:显式运行 cargo test --manifest-path apps/ai-game-creator-shell/src-tauri/Cargo.toml real_chrome_generic_playtest_ --features game-chat-release -- --ignored --nocapture --test-threads=1,同时用真实 Chrome / Chromium / Edge 证明尚未接受真实 primary-action 就瞬时进入 lost、以及两次受控尝试都固定 lost 的页面必须判失败;首轮合法 lost、restart 恢复后第二轮进入 playing | won 的页面可以判通过。
  • 系统边界:该页面是既有 AI 游戏创作工作台的独立构建例外,不新增平台玩法入口、后端 API、会话库、Runner 或预览服务,也不把入口并回普通正式客户端。原 supervisor-chat 继续固定使用 standard profile 并保持纯聊天行为,不继承本例外的自主构建、事件聚合或自动预览授权。
  • 验证要求:每次修改该 flavor 至少执行壳配置门禁、AppSurface game-chat 定向测试、前端类型检查、AppData / 诊断日志 / release flavor 相关 Rust 定向测试、npm run check:encodinggit diff --check;正式打包必须执行 npm run agc:build:game-chat-release,安装或启动产物后确认首屏只能进入本地 game-chat、断开或停止 api-server 仍可进入工作台、普通/debug 认证未变化、AppData 使用独立 identifier,并分别 smoke“新目录 owner / DACL 正确”“历史 foreign owner 原目录被同级备份且配置不覆盖”“foreign-owner stale agent-runner.lock 在独占句柄下立即修复并启动”“活锁不被截断或接管”“reparse point / hardlink 失败关闭”“AppData 不可写时日志回退 TEMP”“.setup() 初始化失败显示日志位置对话框”“503 等待态显示真实 HTTP 状态、重试次数和退避秒数”“503 耗尽后状态卡与 conversation 只显示安全摘要”“后台命令执行期间不出现控制台窗口”“启动活跃任务后关闭主窗口,Runner、MCP、command、ConPTY 及孙进程均消失”“再次启动后 durable 状态进入正确 reconciliation”。日志检查必须同时验证 256 KiB 轮转、仅一份 previous、凭据和绝对路径零泄漏。

2026-07-31 game-chat 输出、单轮预览与平台美术资源

  • 对话输出:game-chat 的 Supervisor ready response stream 继续以稳定身份显示;本轮唯一主 code-prototype 与实际按缺口启动的美术 child,其 requestKind=final-replystatus=ready|committed 的非空安全回复分别以 Agent、Session、run、request slot 和 response revision 形成 durable message ID,并带 Agent 标签逐条追加到项目聊天。现有素材完整时不伪造美术 Agent 回复。每条 Rust eventId + publicText 公开输出同样形成独立 durable 消息。所有这些消息通过 append_local_conversation_message 的顶层 messageId 幂等写入,事件、轮询、React StrictMode 和 hydration 重放不重复;tool-plan、半成品 stream、原始事件 detail、命令正文、绝对路径、Provider / Runner 元数据、哈希和凭据不得进入聊天。普通 supervisor-chat 保持原有 transient response 行为。
  • 对话输出中的 eventId + publicText 只指需要独立进入聊天的进度事件;turn.started 和根 Run 终态失败事件由上一条 runtime-public-status-* 硬门覆盖,不得同时转成事件消息。专业 Agent child 的失败消息继续留在其 Agent Session,根项目聊天只接收 Supervisor 终态失败、明确公开进度和安全 final-reply,避免一项失败被 Runtime event 与 conversation 各播报一次。
  • 单轮收束:game-chat 只在 code-prototype 完成当前 revision 的接入、静态 smoke 与 desktop/mobile 试玩后进入完成门,不调度 publish-strategy / publish-package 或旧固定验证节点;agent.schedule_ready 必须按当前 Supervisor Run 的持久 source/profile 选择同一 source-aware scheduler,不能绕过该边界。task.list 对同一 root source 必须从任务行、readyTaskIds 和统计中排除发布节点以及不属于单主 route 的固定 DAG 节点,agent.delegate 也必须按 root binding 拒绝直接恢复这些节点。完成门满足且美术 delivery、Provider batch、进程会话等非验证屏障全部清零后,Runtime 必须用确定性回复直接收束结构化计划并结束父 Run,不再请求下一次 Provider 工具计划。普通 GUI / CLI 仍执行完整发布 DAG。
  • 轮次展示:loopIteration 只是同一父 Run 内的 Provider / 工具规划循环,用于委派、回执、返工和验收,不是用户发起的游戏生成轮次。game-chat 的进度卡、当前工作和“最新状态”事件统一显示“本轮”,整个页面不向用户显示“第 N 轮”;完整 GUI / CLI pre-publish 任务图仍可显示 x/14,game-chat 只显示单主及必要美术 child,不显示固定七项分母。父 Run 终态后移除运行中进度卡,只保留终态阶段记录与预览。
  • 平台美术资源:game-chat 不再执行固定视觉 DAG。现有正式资源覆盖完整时,单主 code-prototype 直接复用;只有它的 asset.list 审计证实真实缺口时,才临时委派相应美术 owner。art-director 通过平台 images/generations(kind=spec) 生成并登记 assets/art-spec.pngart-asset-plan 再以该规范图的稳定 resourceId 调用 icon-spritesheets/generations 生成真实透明 assets/art-spritesheet.png,并把响应中的 iconImageSrcs 下载为本地独立切片,写入 assets/art-spritesheet-slices/manifest.json;两者只可写 assets/**code-prototype 必须认领复用或补齐后的结果,并在活动 Canvas 中分别绘制玩家、方块/目标、障碍/场景与反馈四类切片;规范图只作 reference,纯代码核心画面、猜测图集等分网格、整图 <img> / CSS 背景、完整图集直绘或只出现路径均不得完成。
  • 验证:前端运行时模型定向测试、Rust completion/source/asset 合同测试、cargo fmt --checknpm run check:encodinggit diff --check 必须全部执行;Windows 文件锁竞态只可作为既有测试失败单独记录,不得将其改写为本次改动的通过证据。

2026-08-07 game-chat 单主素材审计、按需美术委派与自验收

  • 单主任务边界:game-chat 的根 Run 在 Supervisor 持久路由前零 child;决策后只启动 code-prototype。它先 asset.list 审计,再视真实缺口临时委派一个受限美术 child;现有资源完整时零美术委派,用户明确整体重做也不能绕过审计或把生成变成固定规则。美术 child 只写 assets/**,回执由主 Agent 认领并恢复同一 Run;主 Agent 随后接入素材、执行静态检查和 desktop/mobile 试玩。game-chat 不投影或调度 design-directorcode-directorpreview-readinesspreview-playtest 等固定节点,也不显示内部 Provider / child loop 轮次。完整 GUI / CLI 的 16 节点 DAG 不受影响。
  • 时间预算:从 game-chat 父 Run 接受用户请求开始,素材完整首版使用 4200 秒软预算;父 Run 与其全部 child Run、等待和回收阶段共享从 root bound_at 计算的 4500 秒绝对硬上限。该值来自现有两次串行生成各自最长 35 分钟的客户端等待合同,并为代码兜底、静态检查和双视口试玩保留 5 分钟。整个 Runtime pass 受同一 timeout_at 约束;硬上限内未通过完成门必须失败关闭,不得为了守时跳过图集、换普通生图或回退纯代码核心画面。即使完成证据恰好在上限后到齐,单轮确定性收束也必须再次检查累计预算并拒绝写入 single_round_converged
  • Provider 次数:Supervisor 先用一个 Provider turn 理解目标并持久化条件路由;随后唯一 code-prototype 主 Agent 先 asset.list,只有审计的精确缺口才建立相应的受限美术委派。完整复用不得调用图片生成接口;图集复用或主 Agent 认领生成回执后,仍由该主 Agent 接入、执行 game.static_smoke 和 desktop/mobile preview.validate。软预算耗尽时只允许使用已登记图集和当前 resourceId 切片清单的确定性本地兜底,不得由 Runtime 或关键词强制生成图片。
  • 可玩兜底:软预算或首版 Provider 无法及时完成时,只能为已显式实现真实语义的玩法生成完整、自包含、无远程运行依赖的中文 HTML 模板;未知玩法失败关闭,不能只替换标题后套用固定收集游戏。俄罗斯方块模板必须包含 10×20 棋盘、下落、移动、旋转、锁定、消行和触顶失败;收集模板只匹配明确收集类目标。模板必须从 ready 开始,包含真实 Canvas 绘制、requestAnimationFrame、键盘 / 触控主要操作、唯一可见且启用的 start / primary-action / restart 控件,状态 JSON 只随真实输入、状态迁移或模拟状态变化推进,并能在 primary-action 后保持 playing、在 restart 后稳定回到 ready | playing;不得在开始前固定进入 lost,不得通过固定失败冒充试玩通过,也不得由纯渲染帧空转 sequence。兜底只允许写入缺失或精确初始化占位的 game/index.html;存在非占位入口时,当前 code-prototype 必须读取并实际 patch,取得本人 mutationRevision 后再静态检查和试玩,不得反复用只读 smoke 冒充续作。
  • 平台图片:art-spec.png 只用于约束色板、材质、形状与后续派生,不是运行时背景、角色、目标或图集。art-asset-plan 必须以其稳定资源 ID 走专用 icon-spritesheet 路由,透明像素、generation route/kind、同画布归属和 reference resource ID 继续由 Runtime 验证。完整透明图集在编辑器合同中即使产生 sliceWarning 仍可登记,但 game-chat 不能据此猜测 atlas 坐标;图集 resourceId 缺失或空白时必须在任何本地写入前失败,四个切片均须保留与整图完全一致的 sourceResourceId,切片数量也必须在正式图集登记前严格等于四,多或少都失败关闭。四类唯一性按尺寸与解码后的规范 RGBA 像素摘要判断,不能用不同 PNG 压缩或 ancillary chunk 冒充不同素材。主图、四张 canonical 切片和切片清单必须共同提交,并把主图/切片摘要及 Canvas 身份冻结到 .agent/runtime/art-spritesheet-contract.json 私有回执;后续主图安装、回执或登记失败时恢复旧合同,避免出现旧图集绑定新切片。进程在固定主图落盘后崩溃时,保留的 generation 账本只允许按远端预期摘要幂等补齐同一组合同,路径内容冲突继续失败关闭。全部切片下载累计最多 32 MiB。完成门重新读取本地素材时仍执行相同文件大小、解码内存、内容摘要、规范像素摘要、可见 alpha 与四类唯一性校验,并要求公开切片清单、当前 Canvas 登记与私有回执完全一致,后续代码 Agent 不能通过同时改写素材和公开清单重定义合同。postprocess-failed-source-preserved、无真实 alpha、缺文件或缺登记同样失败关闭。game-chat 首版由 code-prototype 在同一主 Run 完成静态 smoke 和试玩后单轮收束,不进入发布节点。
  • 关联验收:快车道必须分别验证 Supervisor 决策前零 child、持久路由后只启动 code-prototype、主 Agent 成功 asset.list 后才可判断缺口、完整覆盖零图片生成/零委派、精确缺口只委派对应 owner、整体重做仍先审计且不产生无关委派、美术 child 对 game/** 写入拒绝而 assets/** 允许、回执恢复同一主 Run、主 Agent 自行完成接入/静态 smoke/desktop-mobile 试玩、4200 / 4500 秒累计预算、规范图到 icon-spritesheet 的真实引用、iconImageSrcs 本地持久化与资源 ID 绑定、失败续跑目标继承、非占位入口禁止整文件覆盖、纯代码核心画面、猜测单个 atlas 裁切与整图展示失败、四类独立切片可见使用通过与 action-driven sequence。完整 GUI / CLI 的固定 16 节点 DAG 另行保持原有回归。

2026-08-03 game-chat 开发态同源与持久输出修复

  • 开发态启动必须在 Tauri CLI 之前解析并预检 AGC Vite 最终地址。Linux 使用系统级用户端口段的 start + 5 槽位并只在本段内漂移,Windows / macOS 以 3080 为兼容首选;启动器通过 GENARRATIVE_AGC_VITE_PORT 绑定 beforeDevCommand 和配套后端预留,通过 Tauri CLI --config 绑定 build.devUrl,并通过 Vite CLI --port 绑定 strictPort 监听。任何竞态中已存在的 AGC Vite、非 HTTP 监听器或其它服务都必须在原生窗口创建前失败关闭。启动器不擅自终止无法证明归属的旧服务,也不得把当前 Rust 壳 / Runner 与其它 worktree 的旧 Vite 前端混用。Tauri CLI 任意退出后,外层启动器必须有界收束已启动的客户端进程树,避免 beforeDevCommand 失败后留下假在线窗口。
  • game-chat root binding 的 source 必须精确为 project-supervisor-game-chat。只有该持久 source 才能进入 Supervisor 决策前零 child 的单主 laneSupervisor 持久 intent 后先运行 code-prototype,由它按权威审计结果选择复用或暂时委派受限美术,再在同一主 Run 完成接入、静态 smoke、desktop/mobile 试玩、单轮确定性收束和自动预览。若绑定为 project-supervisor-gui,必须视为启动链路错误,不能用完整 16 节点 DAG 的运行状态伪装 game-chat 进度。
  • source-aware lane 的主 Run 或其经授权美术 child 可能在 UI hydration 写回时短暂恢复为 Pending。该例外必须从当前 root source、持久工作流决策、单主 route 与 child delegation 解析本轮已开放工作,不得从旧七节点图硬编码重启 Director、验证或试玩节点;未授权 child、第二个活跃美术 child,或缺少成功 asset.list 审计的美术委派仍严格失败关闭。
  • 专业 Agent 的非流式 final reply 继续由既有 finalization journal 重建并提交 responseStreamstreaming / ready 投影仍必须匹配当前项目 revision;已经 finalization 提交的 committed 回复以 Agent / Session / run / request slot / response revision 稳定身份为准,不得因后续阶段推进项目 revision 而从 game-chat 查询中消失。

Runtime 边界

2026-08-10 Codex CLI Agent 执行模式

  • 模式合同:客户端 AppData 配置新增全局 agentMode,只接受 codex_cli / provider。缺省和新安装默认使用 codex_cli,原有 HTTP LLM Provider 路径完整保留并可显式切回 provider;切换只影响下一次节点请求,不新增 Runner、任务图、会话库、配置库或业务事实源。
  • 调度边界:正式 DAG、manifest、Agent task/session/run 身份、队列、锁、委派、all-join、完成门、Provider lifecycle、持久 retry/handoff 与 needs-reconciliation 继续由现有 AGC Runtime 掌控。每个被调度节点在 codex_cli 模式下直接启动一次非交互 codex exec 充当该节点的推理 AgentCodex 返回当前 Runtime 广告函数的结构化调用,Runtime 仍是唯一 ToolHost,不允许 CLI 自己写项目、执行命令、调用 MCP 或形成第二套 revision / verification 真相。
  • CLI 安全边界:CLI 固定使用 argv 启动,禁止 shell 拼接;工作目录使用本次请求专用的空临时目录,不把游戏项目绝对路径写入 prompt、stdout、stderr 或持久记录。调用固定使用 ephemeral、忽略用户配置和 exec rules、read-only sandbox、never approval,并关闭 Codex shell tool;只继承 CLI 运行和认证所需的最小环境,显式移除宿主 CODEX_API_KEY。用户级 Codex 登录态继续由本机 Codex 自己读取,API Key、auth 文件、Cookie、Token、CODEX_HOME 私有内容不得复制到项目配置、Runtime sidecar、Agent DB、conversation 或日志;stdout / stderr 无换行时也受硬上限约束,stderr 诊断只记录固定分类、字节数和 SHA-256。
  • 协议边界:Runtime 把既有 LlmRunRequest 的消息和当前函数目录编码为有界 prompt,并从同一函数 JSON Schema 生成 Codex structured-output schema。CLI 输出转换为现有 LlmRunResponse / LlmToolCall 后,继续经过 native tool / MCP 参数校验、动作上限、权限、pending、receipt、验证与格式修复链;最终回复仍走现有脱敏和唯一提交路径,不新增平行响应协议。
  • 取消与恢复:Codex 子进程绑定当前 Provider request lifecycle,取消、暂停、Runner draining 或 GUI owner 丢失时终止并回收当前进程;started 后没有可信终态仍沿现有 Provider reconciliation 处理。agentMode、CLI 可执行身份和影响输出的 Codex 参数进入 providerConfigFingerprint,模式切换不得消费另一模式遗留的 retry/handoff。
  • 可用性与兼容:check_game_creator_llm_configcodex_cli 模式检查 Codex 可执行文件和版本,不再要求 HTTP API Key;在 provider 模式保持原有 API Key、base URL、model 和逐 Agent override 校验。设置面板始终保留旧 Provider 配置,模式切回后不得丢失既有密钥或逐 Agent设置。配置向导若写入 HTTP Provider 凭据,必须显式把模式切到 provider
  • 验收:覆盖缺省模式、显式 Provider 回退、配置 round-trip、CLI 缺失/非零退出/损坏 JSONL/超限输出、structured tool calls、普通最终回复、进程取消、模式指纹漂移和旧 Provider 回归;同时执行 AGC 定向 Rust 测试、前端配置测试与 typecheck、配置门禁、编码检查和 git diff --check

2026-08-10 Codex app-server 长期 Agent 执行模式

  • 模式升级:agentMode 扩为 codex_app_server / codex_cli / provider,新默认为 codex_app_serverV1.51 的一次性 codex exec 保留为显式兼容模式,HTTP Provider 保留为非 Responses 配置及故障回退模式。
  • 进程与节点:External Runner 按“有效 Agent LLM 凭据/Responses 路由 + projectId/agentId/sessionId/runId”隔离长期 codex app-server --stdio,即每个权威节点 run 直接持有自己的 Codex CLI 子进程与 ephemeral thread,每次完整权威请求映射 turn。同一节点 turn 串行,节点之间进程级隔离;单节点连接失败不得使其它节点同时失去终态。Codex thread 不写 durable recovery;节点完成、重启、retry、handoff 和 finalization 仍只认 AGC 账本。
  • LLM 配置:apiKind 始终只接受 openai_responses;非空 Key 转换为 app-server model providerbase URL 生效,Key 仅走专用环境变量;空 Key 只桥接用户 Codex auth.json,不继承环境 CODEX_API_KEY。设置面板在 app-server 模式继续显示并保存 model、effort、stream、全局/逐 Agent Key 与路由配置;openai_chat / anthropic 明确提示切 provider,不得悄悄忽略。stream=true 接入 app-server 文本 deltawebSearchEnabled=true 因唯一 ToolHost 边界明确拒绝。
  • 安全与取消:临时 cwd、隔离 CODEX_HOME 与 OS HOME、read-only、network off、never approval,并在启动前关闭 web/multi-agent/shell/browser/plugin/image 等原生能力;取消从 turn-start pending 阶段就跟踪且只 interrupt 当前 turn。已发送 turn 后连接断开或终态丢失进入 reconciliation,只关闭当前节点进程且不重放同一 request slot;明确 failed/interrupted 不按 transport 重试。
  • 资源与退出:app-server pool 按实际凭据快照/base URL/API kind/CLI 版本和节点 run 身份隔离并做有界 LRU;空 AppData Key 必须读取同一份有界 auth.json 字节来生成池指纹并桥接隔离登录态,继承的 CODEX_API_KEY 始终移除,node thread 也只淘汰 inactive LRU。Runner 正常、强制和 watchdog 退出都显式关池,Linux child 绑定 parent-death signal,防止强杀 Runner 后遗留带凭据孤儿进程。stdout NDJSON 与 stderr 无换行记录均有硬上限;stderr 原文不写入诊断,只记录固定分类、总字节数、SHA-256 和可取得的退出状态。
  • 旧配置迁移:既有 AppData 若没有 agentMode,只有全局和逐 Agent 路由均为 openai_responses 时迁移到 codex_app_server;存在 openai_chat / anthropic 时显式保留 provider,避免打开项目自动恢复时把所有节点批量写成 invalid-config。用户确认端点支持 Responses 后,可在设置中显式切换并保留原 model/base URL/API Key。
  • 验收:fake JSON-RPC fixture、三态 UI/config、配置指纹、unknown-terminal 零重放、旧两种模式回归和显式 ignored 真实 smoke 全部通过后,才可视为模式切换完成。

2026-08-10 Supervisor 边做边聊与条件中断

  • 根 Project Supervisor 的运行中消息继续进入当前 taskId / sessionId / runId,先持久显示“正在判断、当前任务继续”,再由独立 LLM 生成非终态语义回复并给出 interruptCurrentProvider。过程回复不能调用终态 respond_to_user,不能把制作 Run、Goal 或 task 提前完成。
  • steer 入队后不得先通知 Runner。判定为无需中断或判定失败时,runtime.steer 只校验 durable ledger、唤醒同一 Run 并固定保持 providerInterrupted=false;判定为需要改向时,只有 runtime.interrupt_for_steer_decision 可以读取持久 decision 后条件中断旧 Provider。已经消费该 steer 的新 Provider、工具和外部动作不得被中断。
  • 状态询问、解释和不冲突补充默认继续当前 Provider;明确停止、改向或会让在途方案过期时才允许请求中断。判定失败时继续任务,并在下一安全边界消费消息,不得把失败等同于需要中断。
  • UI 通过持久 conversation 展示关联回复,刷新后仍可见;返回的 assistantReply / interruptDecision / decisionReason 只用于本次命令结果与诊断,不形成第二个会话或第二个 Run。

V1.11 的受保护仓库控制目录同时包含 .git / .agent / .agents / .codex / .hermes;其中 .agent 对项目命令隐藏,其余控制目录只读。

2026-08-04 起,Runtime 的公共工具规划指令、Supervisor 协作编排 playbook、条件 overlay 和编译期静态 Agent 节点目录统一由版本化 Prompt Bundle 驱动,位于 apps/ai-game-creator-shell/src-tauri/prompts/runtime/manifest.json 是 section 路径、组合顺序、平台 / Editor 变体、role overlay、Provider 协作 fragment,以及 Supervisor 与六组专业 Agent 静态目录的单一来源;role overlay 只允许 rootSourceKind 强类型语义 selector,构建期拒绝未知 kind,运行期把权威 source 常量映射为生成 kind。build.rs 同时监听 Bundle 每一级目录、manifest 和已登记 section,保证任意嵌套目录新增孤立 Markdown 都会触发增量构建,并以失败关闭方式校验 schema、引用、路径 / symlink、孤立 Markdown、selector、节点身份、旧 alias 和生成标识符,再生成 'static + Copy Rust 定义并编译进发布二进制。公共 runtime system header 保持身份中立;生成的 Supervisor planning composition 必须复用 supervisorChat.identity。每个 section 只能属于 runtime composition、Supervisor composition、chat 字段、platform variant、visual variant、role overlay 或 Provider fragment 中一个语义所有者;唯一例外是同一 identity section 由 Supervisor planning 与 supervisorChat.identity 显式复用,从而同时阻断 Supervisor 指令外泄和动态 variant 与静态 composition 的重复注入。专业节点 taskId / group / role 还必须在构建期与 shared-contracts::new_game_creation_app_seed_tasks() 强一致,防止身份合同、静态目录和正式 seed DAG 漂移。Bundle 承载公共指令、隔离 Agent 合同、平台差异、角色选择、并行委派、all-join、视觉返工、claim gateSupervisor 共享核心身份、interaction / final-reply 专属合同及其组合,以及首批协作、delivery 收敛、manifest wait、试玩后续委派等 repair 自然语言合同;background planning 在 system composition 复用核心身份,所有 user context 都不再重复注入 Supervisor 身份合同正文。agent_runtime_native_executable_tools() 仍是原生可执行工具的权威源列表,同时供 Prompt 工具目录与 native capability registry 使用,MCP 工具只从当前请求的动态 catalog 暴露。最终 Provider 请求必须通过生成的 section、composition、overlay 与 provider fragment API 构建,禁止恢复直接 include_str!("prompts/runtime/...")、在 Provider 或 prompt.rs 源码中复制协作 graph 文案,或依赖自然语言精确 .replace() 注入工具合同、平台规则或角色规则。Bundle 不是完整可执行 graph:正式 DAG 依赖边、权限、沙箱、委派容量、持久 all-join 状态机、完成门和身份校验仍由 Rust、shared-contracts 与经校验的 .agent/collaboration-policy.json 强制执行,不允许通过 Skill、外部配置或任意运行时 Prompt 覆盖绕过。

Prompt 静态门禁必须断言上述 Bundle section 当前定义的权威语义与组合关系;身份文案调整后应同步更新旧断言,不得继续依赖已经退出 Bundle 的历史连续措辞,也不得在测试或 Provider builder 中复制一份平行 Prompt。

2026-07-12 起,通用开发能力的 Runtime V1.1 增量以 【技术方案】AI游戏创作Agent Runtime V1.1-2026-07-12.md 为编码级事实源。它补充仓库启动上下文、同一发布二进制独立 Runner、受限本地预览浏览器验证、动态隔离子 Agent 和真实 Provider 全链路验收;本文件中“进程内 tokio task”“首轮不预加载项目内容”和“不创建动态执行实例”的旧口径由 V1.1 明确替代,未涉及能力继续沿用本文件。

同一文档的“V1.2 对标 Codex CLI 增量”继续作为受控命令与推理档位的事实源。对一次性 command.exec 而言,只接受 Runtime 白名单内的固定 program 和逐项 args argv,默认 confirm,可执行文件解析为项目外绝对路径且子进程只使用安全 PATH;不解析 shell 字符串,不提供管道、重定向、PTY 或后台进程。这里对 PTY 和后台进程的排除仅适用于 command.exec,不能用来否定 V1.10 的独立持久进程工具,也不能把 command.exec 自身改成长驻入口。command.exec 的 action、stdout / stderr、退出码、超时与源码指纹结果统一进入现有 action / observation、project revision、verification gate 和 needs-reconciliation 链路;只有明确验证型命令且退出码、源码指纹、命令日志、manifest 与 Agent DB 审计全通过才签发 passed gateGit / rg / cargo metadata / 普通 npm run 只作诊断。首版只请求终止受控进程组,安全等级与 project.verify 相同,不宣称已具备完整 OS sandbox 或 detached-process 隔离。

同一文档的“V1.3 多文件变更集与内容审查”作为复杂代码修改的新事实源。project.patchset 在一个确认动作和一把项目锁内预检最多 12 个 create / update / delete,自动 checkpoint、只推进一次 revision,并以 SHA-256 乐观并发条件和回滚语义避免半完成修改;project.diff(includeContent=true) 返回有界统一 diff hunks。它不开放任意 git apply 文本,也不替代修改后的可执行验证。

同一文档的 V1.4-V1.9 继续作为当前事实源:V1.4 用只读 git.inspect 提供有界工作树状态和安全 hunksV1.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/receiptV1.9 让 durable command.exec observation 直接返回安全的 sourceActionId,当前命令分页不再依赖先查动作历史。历史能力清单与这些版本冲突时,以 Runtime V1.1 技术方案和当前代码为准。

2026-07-14 起,同一文档的“V1.10 Runner-owned 持久进程会话”作为持续交互进程的编码级事实源。新增且只新增 command.start / command.poll / command.stdin / command.terminatestart 复用固定 program、逐项 argv、项目 cwd、安全环境和精确确认,在独立 Runner 内直接创建受控前台 PTY;processId 绑定项目、Agent、task、session、run、start action、命令指纹和 Runner boot 身份,不等于 OS PID。App / WebView / 发起 CLI 退出不终止会话;Runner 重启对已尝试 launch 的非终态会话只进入 needs-reconciliation,不得重放 start / stdin / terminate,也不得按 PID 重连。运行输出正文只进入 owning Agent 私有 transcript / observation / contextstdin 公共审计只留字节数和 SHA-256;跨 Agent、run、项目访问失败关闭。活会话或未解决 reconciliation 同时阻止最终回复、completed 和 runner.shutdown_if_idleterminate 携带最后一次 poll cursor 且零消费输出,Unix 按 graceful wait -> residual group force kill -> reap / drain 两阶段完成,Windows 首版使用 Job force terminate + wait / reap。Linux 使用 owner-PID watchdog 回收同一前台进程组,Windows 使用 kill-on-close Job Object;这仍不是任意 shell、主动 detached 进程管理或 OS sandbox。

2026-07-14 V1.10 真实 gpt-5.5 验收:process-session 在无工具配方任务中完成 start / 3 次连续 cursor poll / stdin / terminate41 条 task、75 条 event、63 条 Agent DB、8 条 receipt、4 套确认生命周期和唯一 completed / assistantfixture launch 为 1,终态 PID / 端口、重放、重复与公共正文 / 密钥 / 诱饵泄漏均为 0。独立 Runner 强杀套件形成 21 条 task、34 条 event、36 条 Agent DB,新 boot 保持原 run / session,只产生 1 条 reconciliationlaunch 仍为 1、PID reconnect / final / assistant / 重放 / 泄漏均为 0;两个 disposable 项目均已清理。

2026-07-14 起,同一文档的“V1.11 OS 强制工作区沙箱与通用项目命令”替代 V1.2 / V1.10 在 Linux 上的固定 program / 严格 argv 白名单边界。command.exec / command.start 继续接受结构化 program + args + cwd、沿用 confirm policy、durable action、revision、verification、输出和进程会话协议;project.verify 也必须复用同一 launcher,不能保留平行的宿主 npm spawn。Linux 只在受信任系统 bubblewrap 创建的 workspace-write sandbox 内启动真实命令:项目根可写,.git / .agents / .codex / .hermes 只读,.agent 不可见且不可写,项目外普通用户文件不挂载,网络 namespace 默认隔离,所有后代继承相同边界。program 只接受无路径分隔符的裸可执行名并从受信任 PATH 解析,argv 只保留数量、长度和控制字符硬限制;允许 bash -lc、Git、构建器、测试器和项目脚本在沙箱内自行工作。外部工具链环境根必须 canonicalize 后校验为窄工具链目录,禁止把整个 HOME 或其符号链接目标挂入沙箱。bubblewrap 缺失、不可执行或 setup 失败必须在项目命令执行前失败关闭,不允许退回宿主全权限。process record v2 与命令审计持久化真实 launch metadata,失败不能按平台静态冒充已建立沙箱。共享 os-workspace-sandbox capability 只标记 LinuxWindows 首版继续使用原固定白名单、隔离环境和 Job Object,不能宣称已达到同等 OS sandbox。deb / rpm 声明 bubblewrap 依赖,AppImage 依赖宿主预装且缺失时功能失败关闭;approval 与 sandbox 仍是两层独立门禁。

2026-07-14 V1.11.1 第一切片:command.exec / project.verify 已共用受信任 trampoline launcher。bwrap 的 child-pid 只推进 child-created--block-fd 放行后仍须收到 SANDBOX_READYRuntime 完成 revision / verification durable callback 后才发送 COMMIT_EXEC,收到 EXEC_ESTABLISHED 后才计算业务 timeout。当前不把这套 stdin 私有控制通道用于 PTY;command.start 与 process record v3 仍是下一切片,相关链路完成前 V1.11.1 保持进行中。

2026-07-14 V1.11.1 第二切片:command.start 已通过 PTY 外 abstract Unix socket bridge 接入同一 ready/commit/exec 状态机,process record 升级 v3;真实 target 的 PTY stdin 由 trampoline 复制已验证的 fd 1 slave,不向 target 泄漏 fd 0控制通道。pending launch和 live registry共同参与 capacity/shutdown/idle/final门禁,旧 v1/v2 active record迁入 reconciliationtarget exec failure和fast exit保留同一 processId。child 等待父侧显式 commit/abort,不以短 timeout猜测持久化失败;target 在 pre-exec 内原子进入 PTY 前台进程组,graceful terminate只给 target group发信号,direct leader先退出后仍给同组后代保留清理宽限。v3 状态组合和时间顺序失败关闭,旧 boot launching及同 action replay降级为 launch-unknownWindows 同 action replay不重复执行 durable mutation且使用单一 launch时间点。Linux Runner 的 port 0 因临时端口池耗尽失败时,只从系统临时范围外选择非特权 loopback端口。新 boot resume 先全局拒绝未知 Agent record,再在 Agent lane 锁内核对 process record 与 task 的 Agent/run/task/session 身份,并逐项补齐 task、state/queue、event 和 Agent DB reconciliationtask/event/Agent DB 截断尾行可修复,event/audit绑定原 start action 并对同键身份冲突失败关闭。任一步后再次崩溃都可继续修复,完整重复 resume 不重复投影。不同 owning run 或身份冲突时不恢复 LLM、按 PID 重连或重放 start。后台 finalization 只要看到当前 run 的非空私有 poll 正文,就在 assistant journal 前把模型回复整体收束为固定安全摘要。Runner-kill 验收分别从全量 task、event、Agent DB、runtime state 和 process record 取证,并只把可选证据文件/目录的 ENOENT 当作空面。

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.lockcommit-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,恢复不得重放提交。

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-14 起,同一文档的“V1.14 Agent 会话分叉”补齐 codex fork 风格的开发会话分支。开发 Agent 窗口可从 active、archived 或 legacy Session 复制截至当前的持久 conversation,创建带来源记录的新 active Session;源会话不变,后续消息与 run 按新 Session 隔离。分叉不复制 Runtime / pending action / process session,不推进项目 revision,并在当前 Agent 或委派 child 未终态时拒绝执行;Session 变更与 Runtime 入队共用 per-Agent lane gate,损坏任务日志失败关闭,catalog 提交前的分叉文件不会被列表暴露。

2026-07-14 起,同一文档的“V1.15 Agent Swarm 纯聊天验证入口”补充无 GUI 开发验收面。npm run agc:chat -- --config-dir <项目外AppData> [--init] <project> 默认把每轮输入投递给真实 project-supervisor background Runtimeagc:swarm 仍可显式追加 <parentAgentId> 调试其他父 Agent。两者都复用 External Runner、active Session、conversation、静态委派、动态隔离 child、私有记忆、项目黑板、确认策略和 all-join,不调用一次性 --agent-chat,不新建本地 HTTP 服务或平行数据库。终端持续显示全 Agent 状态、事件和父子 / 委派关系,提供 /agents/status/history/help/quit 以及 approve / reject;父 run 活跃时普通输入走 same-run steerstdin channel 保证运行中仍可退出。入口启动和收束前执行恢复扫描,只有全 Runtime 非活跃、队列为空、恢复扫描无新增工作并通过稳定观察窗口后才输出绑定父 Session 的最后回复。首版没有 Runner Provider token delta,只承诺状态 / 事件实时输出和最终回复。V1.15 的历史父 Agent 汇总失败结论保留;V1.16 已通过 project-supervisor 双专业 Agent 并行、唯一最终回复和同 Session 第二轮真实 Provider 验收。

2026-07-14 起,Runtime V1.1 文档的“V1.16 Project Supervisor 总控 Agent”作为正式用户主聊天的新事实源。规范 ID 为 project-supervisor,使用独立 active Agent Session 和现有 External Runner;空闲输入创建新 run,匹配 Session 的活跃输入继续走 same-run steer。它可以澄清、使用白名单工具、维护黑板、在同一父 run 内最多并行等待 3 个静态专业 Agent 并汇总结果。旧 agentLlm.chat 只作 agentLlm.project-supervisor 的配置兼容回退。静态 agent.delegate 必须通过 durable delivery 和同一父 run 的等待 / 唤醒 / 认领屏障收束,不能再靠新 delegate-receipt-* run 产生第二次用户回复;普通用户面只展示紧凑状态、安全确认和唯一最终回复。

2026-07-14 修复后,V1.16 的纯聊天真实 Provider 验收已通过:两个专业 Agent 同秒进入 running 并真实重叠 20 秒;父 run 在下一次 planning 前 durable 挂起,只写 1 条等待记录;两份回执 ready 后自动唤醒同一 run,以一个 Observed claim 原子认领并只写 1 条用户可见 assistant。随后同一 Supervisor Session 的第二轮请求直接引用上轮结论完成回复且没有新增委派。正式实现因此不再沿用 V1.15 的“模型反复全量 agent.run_status”等待策略:agent.run_status 对专业 Agent 的项目 revision 漂移保持中立,Session 入队释放 lane 后才通知 Runner,定向 wake 只有在精确目标已推进或无需推进时才缓存成功。

当前委派协议已把 delivery 与 Prepared -> Committed -> Observed claim journal 作为事实源,认领前按 delegationId 排序并取得全部 delivery 锁,.agent/agent.db 只作 best-effort 诊断投影。恢复中的 executing 动作只允许 Supervisor agent.delegate / agent.run_status 经项目锁、pending 全身份和 policy 重验后补交;parent-wake 使用 singleflight、有界错误分类和稳定 Runner requestId。子终态只有在 parent/child/delivery 完整身份一致后才能 ready 或 suppression;错配不得改写 delivery。最终回复继续由原父 run 的 finalization journal 幂等写入。

2026-07-17 起,Runtime V1.30 已把真实 agc:chat / --swarm-chat 与自主专业编排纳入同一门禁。用户只描述业务交付,不提供 Agent ID、数量、并行、工具、repair 或 Runner 配方;project-supervisor 必须在单个 native planning 批次自主选择至少两个不同专业 Agent 并形成真实 Provider 重叠,语义判定不满足时在同一父 Session/run 发起唯一 repair,最终以单条 [turn.report] game-creator-swarm-turn-report.v1 和唯一 Supervisor assistant 收束。正式 openai_chat / gpt-5.5 最终诊断轮已完成 51/51 Provider lifecycle、双专业并行、2+1 delivery、2 个 Observed claim、pidfd Runner 强杀/boot 恢复、唯一正式回复和零重复/残留/泄漏,当前门禁状态为 PASSstatic delivery + isolated all-join 的真实组合和 Tauri/WebView 宿主级 E2E 仍是独立后续项。

2026-07-22 补充:自主构建的最终 preview.validate 在当前 revision 失败后,修复责任必须继续服从 Project Supervisor 的只编排边界。父 run 尚无协作事实时可沿用总控直接修复兼容路径;一旦 durable 协作事实已建立且 orchestratorOnlyAfterDelegation=true,活性门不得再强迫 Supervisor 调用 file.write / file.patch / project.patchset。没有 ready 回执且委派容量未满时,可向 code-prototype 创建 repairOfDelegationId=null / runId=null 的新后续修复任务,并把最新浏览器诊断和 game/index.html 验收产物写入合同;已有 ready 未认领回执或 active delivery 已达 3 个时,原生工具目录必须只保留 agent.run_status,先原子认领既有交付,不得创建第四次委派。专业 Agent 推进到更高 revision 后,固定顺序为“认领 ready delivery -> 取得当前 revision 的静态通过凭证 -> 父 Supervisor 重跑固定试玩”。每个固定 data-playtest-id 在对应动作发生时必须恰好匹配一个可见、启用且真实可点击的 HTMLElement;缺失、重复、隐藏或 disabled 都失败关闭。失败 revision、专业修改、总控复验与最终试玩之间不得用伪造 mutation 衔接。

2026-07-22 外部自主构建 E2E 的最新失败轮已推进到 revision 5,最终浏览器试玩 37/37、Supervisor 持久计划 8/8;但 image.inspect 视觉请求与最终回复先后命中同一 deserialize fingerprint。终局 114 个 Provider request identity 中 113 completed / 1 final-reply failed,没有产生 Supervisor assistant,整轮因此仍为 FAIL,不得写成外部 Provider 全链路 PASS。

该问题的收束修复严格限制为 autonomous-game-build + project-supervisor + completion gates 已通过 后的 final-reply。优先使用非空 plan.response;为空时才生成确定性回复,明确当前 revision 已完成生成并通过静态、桌面和移动试玩。普通 Agent、尚未收敛、任一完成门禁未通过或存在 reconciliation 时继续失败关闭。Provider lifecycle 中真实的 final-reply 失败证据必须保留,兜底只保证已完成项目能向用户收束,不把失败请求改写为 completed。修复后必须重新运行一轮独立真实外部 E2E;该轮完成前不能宣称外部 Provider 全链路 PASS。

2026-07-22 修复后的最新独立真实外部轮次确认新 fallback 已命中:父 Supervisor 终局为 idle / completedturn.reportsettled,只产生 144 字符的 Supervisor assistantpending、retry、handoff、finalization、reconciliation、重复、API Key 和路径泄漏均为 0。因此“完成后不回复”已在该轮解决。

该轮整体仍为 FAIL,不能称为 PASS105 个 Provider identity 中 103 completed / 2 failed;两个原始专业 Agent 失败均由 repair 恢复,最终验收却命中 supervisor-swarm-private-body-public-event-leak。脱敏定位共 6 处:两个专业 Agent 的失败正文分别为 149 / 123 字符、对应 SHA-256 前缀 494ce8 / 3089ad,进入 4event.detail2agent.runtime.background_task.failed.error;这些内容均属于 delivery result,不是 userTask、委派任务或对话正文,与 final-reply fallback 无直接关系。

修复必须保留私有 state.error 和私有 delivery 的诊断正文,公共 event / agentDb 只写 errorSha256 / errorChars / 稳定 failureKind;禁止采用正文黑名单,也禁止把真实失败改写为成功。修复后必须另起独立真实外部 E2E,当前外部 Provider 全链路仍未 PASS。

2026-07-22 最终独立真实外部轮次已完整 PASSstatus=PASSevidence=completeprivacy scan=complete。本轮共有 84 个 Provider identitystarted / terminal / completed 均为 84failed / retry / open / duplicate 均为 01 个原专业任务以 budget-exhausted 终止,唯一 repair 已 completedrecovered,最终 child 为 2 completed + 1 historical failed,所有任务均处于终态。

父 Supervisor 最终为 idle / completedturn.reportsettled,只产生 1297 字符的 Supervisor assistantcompleted audit=1finalization 完成 4 个 stages。项目 revision 从 0 -> 4game/index.html7639 bytes 且内容已变化,game.static_smoke passedlane-defense-v1 的 desktop / mobile 浏览器验证均通过,固定试玩为 37/37

终局 pending / confirmation / user-input / provider batch / retry / handoff / tool-plan handoff / finalization 残留 / reconciliation / duplicate 全为 0Provider payload / private body / API Key / project path / config path / log / browser report leak 全为 0;人工 approve / answer / steer 全为 0。Runner 与 AppData 已清理,项目因 --keep-project 暂留后由主线程清理。此前 114 identity 与 105 identity 两个 FAIL 继续保留为独立历史失败,证据未与本轮拼接;最终 PASS 是这个单个新轮次的完整证据,当前外部 Provider 全链路状态现已 PASS

2026-07-22 V1.47 收紧自主构建首批职责与专业交付:project-supervisor 的 initial wave 必须同时且各一次委派 code-prototypequality-review。程序委派必须是非只读实现任务,expectedArtifacts 包含 game/index.html;质量委派必须显式只读、不得修改项目且 expectedArtifacts=[]。合同在 Provider 计划解析、batch prepare 和 durable batch 恢复三处重验;新批次使用 game-creator-provider-action-batch.v3,只有 v3 按新职责失败关闭,升级前已持久化的 v2 collaboration batch 与 v1 contractless batch 继续按原 fingerprint 和合同恢复。只读专业 Agent 的 Provider 计划只允许纯读取与状态观察动作,任何文件、revision、命令、任务、记忆、黑板、资产或委派副作用都在执行前拒绝,并把格式修复目录收窄为仅 respond_to_user。非只读专业 Agent 只有在本人 run 产生 project mutation 且当前 mutation revision 已验证通过后才能回复;ready 未认领或 claim 尚未 observed 时,父 Supervisor 必须先只调用 agent.run_status 收束回执,再决定 repair。只读判定只接受明确的只读审查/验收或不得修改指令,非只读 / 不要只读 / not read-only 等否定式标签不得因子串命中而误判。

2026-08-03 覆盖说明:上段 code-prototype + quality-review 首批身份已退出当前合同,现行首批为 design-director + art-director + code-director;策划与程序 Director 只读且 expectedArtifacts=[],美术 Director 非只读并要求 assets/art-spec.png。V1.47 的 batch v3 恢复、只读工具限制、mutation / verification 与 claim 收束边界继续保留。

V1.47 在只读工具边界和 batch v3/v2/v1 恢复终审修复后的最新独立真实外部轮次已完整 PASS:用户只输入一次任务后 stdin 立即 EOF,人工 approve / answer / steer 均为 0;一个原始专业任务失败后由唯一 repair 自行恢复,父 Supervisor 为 idle / completedturn.report=settled 且只有 144 字符 assistant。项目 revision 0 -> 6game/index.html8080 bytes 且已变化,两次静态检查通过,desktop / mobile 的 lane-defense-v1 真实 Chrome 试玩为 37/3788 个 Provider identity 全部 terminal,其中 75 completed / 13 failed12 条 durable retry audit 与专业 repair 均自行恢复;open lifecycle、pending、confirmation、user-input、provider batch/retry/handoff/tool-plan handoff、finalization、reconciliation、duplicate 与各类泄漏终局均为 0Runner、disposable 项目和隔离 AppData 已自动清理。该轮证明失败 attempt 可保留真实证据而循环仍能零人工干预收束,不能把它改写成 Provider 零失败。

2026-07-23 起,开发验收提供两个根级短入口。npm run agc:test 直接委托现有确定性可玩塔防 E2E,不复制 Runtime harnessnpm run agc:test:chat 自动发现 Tauri identifier world.genarrative.ai-game-creator 对应 AppData,把 game-creator.config.json 和存在时的 game-creator.config.local.json 私有复制到单次 sentinel 隔离 AppData,绝不复制正式 Runner endpoint、lock、备份或其它文件,再创建带私有 sentinel 的一次性项目。LLM 状态检查和 --swarm-chat --init --autonomous-game-build 都只使用隔离 AppData,因此当前 debug 二进制指纹变化不会探测、退役或阻塞正在工作的正式客户端 Runner。用户只输入需求并发送 EOF;正常收束且存在 game/index.html 后,通过仅开发 CLI --preview-serve 复用正式 localhost preview server,自动打开固定形态的 loopback 试玩地址。预览按 Ctrl+C 结束后,脚本通过内部 --runner-shutdown-if-idle 只关闭已空闲的隔离 Runner,确认 endpoint 消失后再验证 sentinel 并清理隔离 AppData 和项目;隔离 Runner 仍有任务、退出失败、Swarm 未收束或预览启动失败时保留对应现场,不能强杀或误删。--keep-project 可主动保留项目但不额外保留已空闲的隔离配置;显式 --project-dir 永不删除,非空未初始化目录拒绝,--config-dir 只表示绝对配置来源目录,--project-dir 也只接受绝对路径。该人工入口用于快速体验,不能替代真实外部 Provider E2E 的完整生命周期、隐私和残留门禁。

2026-07-25 补充并取代上一段的统一持续预览口径:npm run agc:test:chat 默认投递固定植物塔防需求,作为单轮非交互真实测试,不依赖 stdin,也不把 EOF 当作“没有任务”。父 run 收束后必须校验本轮必需 seed task、当前配置对应的正式产物、最新 revision 静态检查和 Runtime 浏览器验收;全部通过后立即关闭空闲隔离 Runner,并按 sentinel 与保留参数清理测试 AppData / 项目,不再进入等待 Ctrl+C 的长期 preview。npm run agc:test:chat:manual 才是不带 --task 的手工聊天入口,继续读取多轮 stdin,并在成功收束后保留持续预览供人工试玩,直到用户显式退出。自动化、CI 或无 TTY 调用必须使用默认自动入口,不能依赖交互提示或持续预览生命周期。

2026-07-24 起,--swarm-chat 的普通自然语言不再由 CLI 关键词表预分类为 Chat / Execute / Resume。Project Supervisor 与六个部门 Director 进入同一个轻量 interaction loop:模型可以直接回复,或从统一 capability registry 中选择 project_location / runtime_execute / runtime_resumeruntime_execute 不接收模型改写后的任务正文,宿主始终把原始用户消息提交给持久 Runtime。显式 /status /goal /resume 继续属于确定性控制面。匹配 Session 已有 busy Runtime 或 active Goal 时,新消息不启动旁路 Provider,也不直接改写同一 canonical Session,而是进入原 run 的 durable steer;所有 Runtime mutation 继续要求项目外 --config-dir、External Runner、Agent task lock、Session lane、权限、确认、revision、verification 和 finalization 门禁。该 interaction registry 是 Pi 风格小内核与可组合工具边界的第一步,不代表现有 Runtime 工具已经完成单一 registry 迁移,也不允许把安全不变量下放到 Prompt、Skill 或模型判断。

2026-07-15 起,Runtime V1.1 文档的“V1.17 单 Agent 持久计划”作为后台工具规划进度的新事实源。submit_agent_tool_plan 新增 nullable planUpdate={explanation,steps[{step,status}]};步骤只接受 pending / in_progress / completed,最多 8 步且至多一个 in_progress。结构化计划一旦建立,legacy plan 只作旧协议 fallback;终态步骤必须保留,planRevision 只在真实变化时单调递增,工具 action 下标不得自动完成结构化步骤,存在未完成步骤时不得写最终回复或 completed。

V1.17 计划快照随 game-creator-runtime-context-bundle.v3 持久化,v2 在通过原身份、revision 和 verification gate 校验后从当前 Runtime state 补齐计划字段继续恢复;计划元数据本身不推进项目 revision、不改变 verification gate,也不触发项目权限确认。开发 UI 和 CLI 有界展示 revision、说明与完整 8 步;正式用户的 Supervisor 只展示完成数、当前步骤、等待对象、下一步和协作数量的紧凑摘要。恢复、same-run steer 和真实 Provider 的完整验收矩阵以 Runtime V1.17 章节为准;2026-07-16 已在当前 v5 context 上完成正式 openai_chat / gpt-5.5 的同 run steer + Runner 强杀恢复专项,门禁状态为 PASS。

2026-07-18 起,正式项目工作台的总控与策划 / 美术 / 程序 Agent 状态统一投影当前 Supervisor 父 run 的真实 Runtime;专业 Agent 只有在 parentRunId 精确匹配该父 run 时才可进入当前项目状态列表。普通项目页在 Tauri event 之外必须保留只读轮询,兜底独立 Runner 无法可靠投递 App event 的情况;短暂读取失败时保留最后一份可信快照,不得清空或倒退界面状态。正式面只展示真实运行阶段、计划完成数 / 总数、最近更新时间、失败、待确认与待回答等紧凑状态;专业 Agent 的确认或拒绝必须同时绑定真实 agentId + runId + actionIdmanifest.tasks 只能在没有匹配 Runtime 时作为回退,不得覆盖真实 Runtime;正式面不展示内部 currentActionobservation、工具计划正文、Provider 错误原文、fingerprint 或字符计数。transport / timeout / 鉴权 / 限流、Codex 稳定错误分类,以及验证、预期产物、权限策略、预算、恢复对账和持久化等常见 Runtime 失败必须映射为可理解、可行动的安全文案;底部子 Agent 状态卡在失败时直接展示同一安全摘要,不能只写“失败”或“子 Agent 任务失败”。不得根据 manifest 或动画伪造生产中、进度百分比或完成状态。当前父 run 或专业状态集合变化时 Runtime 状态区回到顶部,总控摘要在内部滚动期间保持可见。

2026-07-19 起,当前父 run 下的专业 Agent 进入 failed 后,正式工作台必须提供“在当前项目重试”恢复入口,不得要求用户新建项目。重试必须精确核对原 agentId + runId + parentRunId,复用原 task、active Session 和父 run 归属,同时生成新的专业 Agent runId;新 run 继承已持久化的上下文和父子绑定,不覆写旧失败 run 的审计事实,也不得把 UI 重试解释为底层 transport 根因已修复。agent.resume 默认 confirm 不变:自动 retry command 继续执行 auto gate;正式失败卡按钮自身是本次明确确认,使用 deny-only 的 confirmed retry command。按钮必须原卡即时显示“正在提交重试”、受理或安全错误;若 Supervisor 已为同一 delegation 准备合同 repair,则该按钮优先确认既有 repair,避免重复派发。

completed 专业 Agent 的用户可见成果不能仅依赖项目文件。当委派合同为 expectedArtifacts=[] 或未产生显式文件时,工作台必须读取该 Agent 持久对话的最后一条 assistant,作为明确标注的“专业 Agent 文本回执”提供查看,并投影到“资源管理 → 文档”。该投影是持久回执的可见视图,必须保留来源 Agent 与 run 身份,不冒充 manifest asset、项目目录中的实际文件或可下载交付物;内部 Agent ID 不进入用户资源名。美术只交付计划且 manifest 没有图片时必须显示“仅完成计划,尚未生成或登记图片”,不能把文本回执称为美术图片产物。策划 design-foundation 与美术 art-asset-plan 从 2026-07-20 起属于图片产物型 canonical task:前者必须生成并登记 assets/ui-prototype.png 横屏界面原型图,后者必须生成并登记 assets/art-spritesheet.png 首版核心美术素材;只有文本计划或空 expectedArtifacts 不构成完成。策划图还必须由 design-foundationimage.inspect 对当前图片 SHA 形成 ui-prototype.v2 结构化视觉验收:信息 HUD、主要可玩区域、当前玩法的关键实体、主要操作、失败/重开流程、移动端布局意图、实现清晰度与原创主题八项全部通过且问题列表为空。验收不得预设塔防或任何固定玩法;ui-prototype.v1 仅供历史动作回执安全读取,不能作为新建或恢复 run 的 completion authority。Runtime finalization 只接受同 run、当前 SHA 的 v2 证据。视觉调用失败、响应不可解析、检查未通过或图片被替换后 SHA 不一致都继续阻塞。未通过的已登记图片在工作台只称“候选界面图(待视觉验收)”,不得冒充正式 UI 原型。图片生成未配置、待确认或失败时保持阻塞/失败,不得投影为 completed。资源卡当前只允许点击聚焦,不提供拖动重排;详情使用中央主视窗内唯一聚焦状态,长正文在聚焦主体内独立滚动并用 Markdown 安全渲染。PDF 方案外的顶部项目标题条移除,右侧对话和底部 Agent dock 常驻且 dock 下方不得保留空白;底部专业 Agent 为只读状态卡。

V1.17 同时把 finalization journal 升级为 v2 并绑定最终完整计划快照:assistant 已落盘而 Runtime state 丢失时,从 v2 journal 恢复原结构化计划后补齐终态;assistant 尚未落盘且 state 丢失时失败关闭。外层 failed / budget-exhausted 只保留最后可信计划,不把未完成步骤机械改成失败。thinking summary、legacy plan event 和 tool-plan repair 公共审计只保留哈希、字符数或计数,必要的模型输出与错误上下文仅留在有界私有 repair 请求中。

2026-07-15 V1.17 收口时,确定性回归已通过,但真实 gpt-5.5 llm-runtime 连续三轮都在首个 planning POST 返回前遇到相同 TLS record-layer failure,未形成结构化计划或工具动作,因此继续保持“真实 Provider 未 PASS”。首轮严格泄漏扫描另发现开发 CLI 的 runtimeJson 直接带出 sessionPath / eventPath / taskPath;CLI 输出现已移除这三个绝对存储路径,第三轮 transcript/report 路径泄漏计数归零。当时的结论是 Provider 恢复后必须完整重跑 Runner kill + same-run steer 套件,不能以短 /models 鉴权成功或确定性测试代替。

2026-07-16 V1.17 正式复验已收口:专用 steer-runner-kill suite 不再依赖预览、图片、隔离 reviewer、外部素材或 Git 提交,只要求真实失败、一次两文件原子修复、完整正文差异审阅、修复后原始验收和唯一最终回复。正式 openai_chat / gpt-5.5 运行在计划 revision 4、3 个步骤已完成时接受一次 same-run steerProvider lifecycle 形成唯一 interrupted,随后 Linux pidfd 强杀 Runner 并更换 boot;恢复保持原 Agent、Session 和 runcursor 为 1,最终计划 revision 7 的 6 步全部完成。全程 24 组 Provider request identity 均有唯一终态,原子 patchset 只执行 1 次并修改 2 个目标文件,旧动作执行、副作用重放、重复 action/message/receipt、遗留 finalization journal,以及任务正文、steer 正文、根因、API Key、诱饵、项目路径和正式配置路径公共泄漏均为 0;唯一 assistant/completed、宿主复验和 sentinel 清理全部通过。

2026-07-15 起,同一 Runtime 文档的“V1.18 单 Agent 持久 Goal mode”作为开发侧长任务目标的新事实源。Goal 规范 sidecar 使用 .agent/runtime/goals/current/<agentHash>/<sessionHash>.json.agent/runtime/goals/history/<agentHash>/<goalHash>.json,绑定一个 Agent Session 和同一 runV1.18 引入的 context bundle v4 已随 V1.21 升级为当前 v5pending action 为 v5 并绑定 Goal ID、revision 与快照指纹。Goal edit 让旧自动/待确认动作变成 blocked observation 后 same-run 重规划;暂停重启在 finalization/pending 前保持休眠,显式恢复只续接原 run。resume 在 sidecar 已 active 但 Runtime/Runner 尚未完成时可重试补齐;当前 run 的 Goal sidecar 损坏或身份冲突时,即使 legacy Runtime 没有 goalId 也必须失败关闭。

V1.18 开发窗口把模式扩展为 执行 / 聊天 / 目标,Goal 创建和编辑使用独立弹层,正式用户窗口不暴露该开发控制面。assistant 写入后必须先可靠投影 Runtime completed,再提交 Goal completed 并补齐 Goal 终态 projection。2026-07-16 正式 openai_chat / gpt-5.5 的隔离 goal-runtime 已完成 edit、真实失败回灌、pause、Runner pidfd 强杀、重启静默、显式同 run resume、唯一 assistant 和零重放/零公共泄漏全链路,V1.18 真实 Provider 门禁已 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 套件仍要求当前运行模式具备画板服务授权:普通模式为有效陶泥儿登录态,standalone/高级模式为有效 External v1 Developer Key;缺失时必须返回 BLOCKED(editorApi),不得记为通过。

2026-07-13 V1.3 真实验收:同一真实 Provider 套件已改为先读取 SHA-256,再用唯一一次 project.patchset 同时更新和创建文件,并使用自动 checkpointId 读取 2 项内容 hunksprepared / completed 审计各 1 条、patchset revision 增量为 1Runner 强杀恢复、命令和项目验证、双视口浏览器验证、隔离 Agent join、重复副作用与密钥扫描继续全部通过。

2026-07-13 V1.6 最终真实验收:llm-runtime 形成 94 条 task、158 条 event、164 条 Agent DB、11 条合法工具协议、13 次成功工具执行和 24 条 terminal receipt;主 run receipt 为 18。agent.action_history 实际调用 1 次、返回 1 条、递归结果 0,且只在父 run 认领唯一 all-join 后执行;Runner 强杀恢复、revision 3、3 个隔离实例 / 2 个模板、双视口浏览器证据、重复项、身份冲突、半完成文件、密钥和诱饵泄漏均通过结构化检查。本次竞态走活跃父 run 直接认领路径,join continuation 数量为 0parent-wake 等待路径由确定性 Rust 测试覆盖。这些数字是单次观测结果,不是脚本固定阈值;full 套件仍需当前模式的画板服务授权,缺失时保持 BLOCKED(editorApi)

2026-07-13 V1.7 最终真实验收:llm-runtime 形成 95 条 task、161 条 event、166 条 Agent DB、12 条合法工具协议、14 次成功工具执行和 24 条 terminal receipt。真实 Provider 在 preview.validate 后实际调用 image.inspect 1 次并读取 desktop / mobile 两张 PNG;专用 audit 与 receipt 各 1 条、responseId 存在,视觉 observation 在最终回复前落盘。agent.action_history 与视觉检查彼此独立,不要求固定先后顺序。Runner 强杀恢复保持原 run / sessionrevision 3,3 个隔离实例、项目验证和浏览器验证通过;图片载荷、重复 action / message / receipt、密钥和诱饵泄漏均为 0。full 套件仍需当前模式的画板服务授权,缺失时保持 BLOCKED(editorApi)

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 只落账并唤醒同一发布二进制的独立 Runnerappend-only JSONL 使用进程内锁加 OS 文件锁,恢复继续由 Runner 接管同一 run / session。

客户端泥点余额统一由 apps/ai-game-creator-shell/src/stores/useWalletStore.ts Zustand store 持有,唯一余额真相是 mudPointBalanceProfileDashboardSummary.walletBalance 不作为余额来源;所有可能改变余额的动作统一调用 onWalletBalanceMayHaveChanged() 从 recharge-center 完整刷新,不在客户端本地增减余额。账单请求、充值产品内容、下单 / 支付确认和弹窗状态留在使用它们的组件,侧栏账户菜单直接订阅该 store,不通过布局 props 传递余额。

Agent Runtime 负责:

  • 当前执行边界:App / CLI 只负责 durable 入队、查询和唤醒;同一发布二进制的独立 Runner 取得项目 owner 与 per-Agent OS 锁后执行 loop。Agent DB、conversation、events、tasks、activity 和 output 的 append-only JSONL 同时使用进程内互斥与 OS 文件锁,恢复由 Runner 接管原 run / session,不再重接到当前 App 进程。

  • 2026-07-12 安全边界补充,2026-07-13 调整:project.verify 的 script 最多 160 个字符,固定使用系统 script shell,并在解析和执行前拒绝项目级 .npmrc 改写 npm 语义。Runtime context bundle 绑定 projectId / agentId / taskId / sessionId / runId / source / task,结尾换行计入 128 KiB 上限;恢复时同时校验 nextLoopIndex、context window、当前窗口已完成轮数、观察指纹、计划、observation 数量,以及 contextStalled 只能位于非零上下文窗口边界。bundle 通过项目内无符号链接路径原子写入,并从同一文件句柄最多读取 128 KiB;项目路径和常见 sk- / GitHub / npm / AWS / JWT 凭据统一脱敏。工具 observation 进入 context checkpoint 后才删除 observed-* 动作账本,避免重启时旧 ledger 抢占有效 bundle。

  • 总任务拆分和任务图状态流转。

  • 6 个专业组调度:策划组、美术组、程序组、数值组、音乐组、运营组。

  • 工具注册、权限 gate、工具调用预算和执行日志。

  • 短期记忆、长期记忆、项目黑板、角色私有记忆、本地 manifest 和产物索引。

  • 本地项目文件、运行命令、HTTP 预览和验收自检。

专业组不是 6 个单 Agent。每组内部按任务动态使用 Director、Gameplay、Code、Asset、Preview、Playtest、Polish、Publish 等角色模板。

Agent 能力清单

  • 用户能力:项目开发工作台、陶泥儿聊天、上传文件、manifest 资源视图、客户端内运行表现层和专业 Agent 紧凑状态;正式用户窗口仍不展示原始任务 / 文件 / 日志、开发预览调试面板、能力清单或开发专用单 Agent 聊天入口。
  • 开发调试能力:index.html?agent-chat 可作为显式前端调试路由;开发者可选择 Agent、授权本地项目路径,并通过 read_local_conversation / append_local_conversation_message 读写 .agent/conversations/agents/<agentId>.jsonl,通过 agentLlm.<agentId> 调用该 Agent 的独立 LLM 路由做真实对话,用于单独调试某个 Agent 的长期对话上下文。这里的 <agentId> 以 manifest taskId 为规范值,旧 group-role 别名只作为兼容输入映射到 taskId。
  • 命令能力:内置命令调用、权限 gate、执行日志;v1 只允许白名单受限命令,不执行任意 shell。
  • 编排能力:任务拆分、任务图依赖、专业组调度、多智能体协作;Runtime V1 会为单 Agent 对话和生成 loop 中的角色 brief 写入独立 runtime state / event,先解决“每个 Agent 正在做什么、跑到哪一步、最近一次 task/run 是什么”的可观测性。
  • 历史边界说明:下一条“后台任务能力”保留 V1.1 前的进程内演进记录,其中 App 内 tokio task、进程内 drain、旧工具箱和“不是独立 OS 进程”的描述均已失效;当前执行边界以上文独立 Runner 说明为准。
  • 后台任务能力:开发窗口单 Agent 聊天和项目内 Agent 对话弹窗可把当前输入投递为单 Agent 后台任务,Tauri 命令 start_game_creator_agent_runtime_task 会立即写入该 Agent 的 .agent/runtime/agents/<agentId>.json.agent/runtime/events/<agentId>.jsonl.agent/runtime/tasks/<agentId>.jsonl.agent/conversations/agents/<agentId>.jsonl,随后在 App 进程内启动 tokio task 执行最小 Agent loop:每轮让该 Agent 输出 thinkingSummary / plan / actions / response,Runtime 按白名单和项目权限策略执行工具动作,写入 thinking_summary / plan / action / observation / response / error 事件,再把 observation 放入下一轮 prompt 让 Agent 修正计划、继续行动或用空 actions + response 收束;单 Agent Runtime 每 6 轮形成一个上下文压缩窗口,而不是把 6 轮作为整个 run 的固定上限。窗口产生新的独立 observation 时压缩上下文并在同一 run 继续;最近 6 轮没有独立进展或相邻窗口重复时以 failed / budget-exhaustedloop-budget-exhausted 终止,不再生成总结伪装完成。工具箱包含只读工具 memory.readconversation.readasset.listproject.indexproject.difffile.listfile.readtask.listagent.run_status,以及受策略保护的写/运行工具 memory.writeproject.checkpointproject.restorefile.writetask.createtask.updatecommand.run_limitedblackboard.writeagent.messageagent.delegatememory.write 可追加或覆盖本 Agent 私有记忆、项目长期/短期记忆或黑板,project.checkpoint 可在写入或批量修改前创建本地 checkpoint,project.restore 可在确认后把项目恢复到指定 checkpoint,file.write 只能写项目内相对路径并记录审计,task.create 只能追加经过校验的新 manifest 任务,task.update 只能更新已有 manifest 任务状态,command.run_limited 只接受 game.static_smoke 并复用本地静态自检安全边界,blackboard.write 追加 memory/blackboard.mdagent.message 给目标 .agent/conversations/agents/<agentId>.jsonl 写入 tool 留言,agent.delegate 把任务投递到目标 Agent 的独立后台队列,策略拒绝时不执行工具并返回 blocked observation;策略要求确认时不执行工具,而是持久化精确待确认动作并暂停该 Agent 队列,待开发者确认或拒绝后在同一 run 续跑。read_game_creator_agent_runtime 会按 runId 去重返回最近任务和最近事件,read_game_creator_agent_runtimes 批量读取所有规范 taskId 的 runtime;开发窗口和项目内 Agent 对话弹窗的 Runtime 状态面板展示最近事件、最近任务、当前目标、当前任务、当前动作、等待对象、下一步和运行阶段,主窗口 Agent 状态列表展示当前目标、任务、动作、等待对象和运行阶段摘要。不同 Agent 使用各自 runtime 锁,可以并行运行;同一 Agent 已有运行任务时,新任务会先写成 pending / queued,由当前后台 drain 在完成后串行继续执行。该能力仍属于 Runtime V1 的进程内任务,不是独立 OS 进程或跨重启离线常驻 worker。
  • 2026-07-10 补充:Agent Runtime state 新增 toolPolicy,按当前项目 .agent/policy.json 派生工具级 allowedTools / autoTools / confirmTools / deniedTools 快照;后台 planning prompt 会带入该快照,让 Agent 在规划时知道哪些工具会自动执行、需要确认或被拒绝。blackboard.write 继承 memory.write 策略,agent.message 继承 conversation.write 策略,agent.delegate 使用独立 agent.delegate 策略;实际执行仍以 Runtime 的白名单和项目权限 gate 为准。
  • 2026-07-10 补充:.agent/policy.json 新增 agentPolicies,可按规范 Agent id 分别配置 deniedCommands / confirmCommands。有效策略为“项目级策略 + Agent 级策略”的保守叠加:项目级拒绝 / 确认仍对所有 Agent 生效,Agent 级策略只能进一步限制该 Agent,不能放宽项目级策略,拒绝优先于确认。主聊天新增 /agent-policy-deny Agent 命令/agent-policy-allow Agent 命令/agent-policy-confirm Agent 命令/agent-policy-auto Agent 命令,写入前仍走 project.policy_write 确认卡。
  • 2026-07-10 补充:后台 Agent 工具命中 confirmCommands 时不再继续整理最终回复,而是把本轮 Runtime 停在 status/phase = waiting-for-confirmationwaitingOn 指向“开发者确认 Agent 工具动作”,recentToolCalls、事件流、任务记录和 taskQueue.waitingForConfirmation 都保留该待确认事实;同一 Agent 的 drain 会暂停,不继续消费后续 pending 任务。命中拒绝策略仍作为 blocked observation 交回 Agent 继续修正计划。
  • 2026-07-10 补充:后台 Agent 任务支持按 Agent / runId 取消和重试。取消先写 .agent/runtime/cancel/<agentId>/<runId>.json;pending 任务被取消后不会再被同一 Agent drain 消费,running 任务在 worker 仍持锁时只对外投影为 status/phase = cancelling,必须等当前 LLM / 工具调用返回后的检查点真正停止后,才由持锁 worker 把任务 JSONL、事件流和 agent.db 记录到 cancelled,期间不允许重试,也不保存最终 assistant 回复。重试只能基于已有非 running / pending / waiting-for-confirmation / cancelling 任务创建新的 run,继续复用同一 Agent 队列锁和 agent.resume 自动权限。
  • 2026-07-10 补充:后台 Agent 任务的 runId 在同一 Agent 内必须唯一,因为任务快照按 runId 去重表示同一 run 的最新状态。start_game_creator_agent_runtime_taskagent.delegate 和 retry 入队前会读取该 Agent 全量 task JSONL 历史;如果调用方传入的 runId 已存在,Runtime 自动追加 -dup-<timestamp>-<attempt> 后缀生成实际 runId,并在任务队列、delegate observation 和 agent.db 审计中使用该实际值,避免两个独立任务互相折叠。
  • 2026-07-10 补充:后台 Agent 任务的 memory.write scope=agent 只允许写当前 Agent 自己的私有记忆。若 action 指定其他 agentId / targetAgentIdRuntime 返回 blocked observation,不写目标 Agent 私有记忆,也不写 agent.runtime.memory.write 审计;跨 Agent 共享稳定结论必须使用 blackboard.write,给单个 Agent 留上下文必须使用 agent.message
  • 历史边界说明:下一条“只做进程内 JSONL 串行化、跨进程不支持”已由 V1.1 的进程内互斥 + OS 文件锁替代,仅保留为演进记录。
  • 2026-07-10 补充:本地 append-only JSONL 追加写入按目标文件路径做进程内串行化。.agent/agent.db、项目 / Agent 对话、Runtime events、Runtime tasks、Agent activity 和 output 都通过共享 helper 写入完整 JSON 行,防止多个后台 Agent 并行运行时 record 内容与换行交错;该约束服务于当前单客户端进程内并行,不把跨进程同项目写入作为 v1 支持目标。
  • 2026-07-10 补充,2026-07-12 冻结,2026-07-15 由 V1.18 更新:后台 Agent 待确认工具动作使用 durable AgentRuntimePendingToolAction,当前 schema 为 game-creator-pending-action.v5。完整记录包含精确工具 action、当前 task/run、loop 轮次、action 序号、计划、已有 observations、续跑上下文、创建时的全局 project revision、per-run verification gate、Provider planning 实际使用的 repository startup fingerprint、steer cursor,以及 goalId / goalRevision / goalSnapshotFingerprint;通过临时文件替换原子写入 .agent/runtime/pending-actions/<agentId>/<runId>.json,写入前拒绝密钥、Token、Cookie、App 配置痕迹和项目绝对路径。公共 runtime state 的 pendingToolAction 只暴露 actionId / actionFingerprint / tool / inputSummary / reason / requestedAt 安全摘要。
  • actionFingerprint 绑定工具名、完整输入 JSON 与实际执行 task contextactionId 再绑定 run、loop、action 序号和 occurrence nonce。开发窗口和项目内 Agent 面板的确认/拒绝提交当前 runId + actionId,Runtime 与私有动作、公共摘要交叉校验后才迁移账本。批准或自动执行前必须重读并匹配创建时的 project revision、verification gate、planning repository fingerprint、steer cursor 与 Goal 快照;Goal edit 使旧自动/待确认动作统一落为 blocked observation 并在同一 run 重规划,不能执行旧副作用或创建 retry run。其它可证明漂移同样拒绝旧动作并 same-run 重规划,结果未知才进入 needs-reconciliation
  • 账本状态使用 pending-confirmation / approved / executing / observed-approved / observed-rejected:重启可恢复 waiting、未执行的 approved action 或已落盘 observation;若进程中断在 executingRuntime 进入 failed / needs-reconciliation,禁止自动重放外部副作用。旧 v1-v4 pending action 或缺失 revision、gate、repository、steer、Goal 绑定的记录恢复时必须失败关闭,不得按当前状态猜回、重放副作用或写 completed。等待期间同 Agent 新任务保持 pending,确认、拒绝或取消后再串行排空;.agent/runtime/ 仍是通用文件工具不可读写的私有控制面。
  • 2026-07-10 补充:per-agent 锁最终采用 OS 级文件锁,取代上一条末尾的 token/PID/超时抢占方案。Unix 使用非阻塞独占 flock,Windows 使用禁止共享的文件句柄;.agent/runtime/locks/<agentId>.lock 只保存诊断元数据并可长期存在,真正所有权随文件句柄和进程生命周期释放。任何确认、拒绝、恢复、取消和队列 drain 都必须使用同一系统锁;确认、拒绝和取消只能在拿锁后重新读取当前 runtime、task 与待确认动作再迁移状态,恢复也必须先拿锁再读取 durable pending action 或 recoverable task,不能用拿锁前的旧快照覆盖并发结果。waiting 状态只允许短暂等待原 worker 正常释放,不得按状态删除并重建锁文件;running 取消在拿不到锁时只保留取消 tombstone,由原 worker 在 LLM / 工具成功或失败返回后的检查点收束。
  • 2026-07-10 补充:白名单自动工具也必须使用 durable AgentRuntimePendingToolAction,并以 executionMode = auto 区别待开发者确认的动作。Runtime 在副作用前依次落盘 approvedexecuting,返回后落盘 observed-approved 和 observation;该账本继续覆盖下一轮 LLM planning,直到下一条精确动作接管或 completed / failed / cancelled 终态可靠落盘,不能在 observation 刚落盘时提前删除。恢复 approved + auto 时执行同一 action 一次,恢复 observed-approved + auto 时只把 observation 交回 Agent,恢复 executing + auto 时停止在 failed / needs-reconciliation;该核对阶段是硬屏障,即使磁盘仍是 approved 也禁止继续。恢复时策略由 auto 收紧为 confirm,则保留原 actionId / fingerprint 并转换成 pending-confirmation + confirmation。自动动作在 .agent/agent.dbagent.runtime.tool_action.executingagent.runtime.tool_action.observedagent.runtime.tool_action.needs_reconciliation 审计。
  • 2026-07-10 补充:needs-reconciliation 按 Agent 队列级屏障处理。该 Agent 的新聊天后台任务、delegate 和 ready-task 调度仍可入队,但只能保持 pending;恢复、正常 drain 和取消其他排队 run 后触发的 drain 都不得越过当前核对 run。新 run 只能在取得 per-agent OS 锁后重新读取 waiting / cancelling / reconciliation 状态并通过准入检查,不能在锁外检查后直接启动;锁内通过检查后统一从 task JSONL 选择最早 pending run,保证并发投递时仍按 FIFO 启动。屏障判定同时读取当前 Runtime state 与 task JSONL 最新记录,因此 pending ledger 缺失时也不放行、不允许 retry;开发者核对外部副作用后必须显式取消该 run,后续队列才继续。
  • 2026-07-10 补充:后台任务工具箱已加入 task.create。Agent 可在 loop 中把拆解出的后续工作追加为 manifest 任务;Runtime 复用 task.create 策略和项目写锁,写入前校验 taskId 唯一、依赖指向已有任务、任务分组合法、标题 / 角色非空以及列表长度,并写入 agent.runtime.task.create 审计记录。策略要求确认或拒绝时不会修改 manifest。
  • 2026-07-10 补充:Agent Runtime state 新增 recentToolCalls,每次后台工具执行后记录最近 20 条结构化工具动作,包含 tool、status、actionFingerprint、inputSummary、reason、summary、detail 和 updatedAt;开发窗口、项目内 Agent 对话弹窗和主窗口 Agent 状态列表可直接展示“最近动作”和安全目标摘要,不再只能从 observation 字符串里猜测 action / observation 对应关系。inputSummary 只保留相对路径、checkpoint id、目标 Agent、内容字符数等确认所需信息,不保存原始 API Key、待写正文、消息正文、素材 prompt 或任意未过滤输入。
  • 2026-07-10 补充:Agent Runtime state 新增 currentGoalwaitingOn,把本轮目标与当前等待对象从 currentTask / currentAction / nextStep 中显式拆出来;后台任务启动、工具 observation、完成和失败都会刷新该状态,开发窗口、项目内 Agent 对话弹窗、主窗口 Agent 状态列表、agent.run_status observation 和下一轮 planning prompt 都展示同一份目标 / 等待信息,避免开发者只能从动作文本里猜 Agent 卡在 LLM、工具、同伴还是人工输入。
  • 2026-07-10 补充,2026-07-12 更新,2026-07-15 由 V1.21 澄清:Agent Runtime state 新增 loopIteration / maxLoopIterations / toolActionBudget,结构化记录后台 Agent loop 当前轮次、当前 6 轮进度 checkpoint 的结束轮次和每轮工具动作预算;开发窗口 Runtime 面板、主窗口 Agent 状态列表、agent.run_status observation 和下一轮 planning prompt 都展示该进度,帮助判断 Agent 是刚开始规划、正在 replan,还是接近当前 checkpoint 边界。maxLoopIterations 会随 checkpoint 推进显示 6、12 等结束轮次,只做运行观测和停滞检测,不构成单个 run 的固定轮数上限,也不触发上下文摘要或改变工具权限。
  • 2026-07-10 首版、2026-07-15 由 V1.17 更新:Agent Runtime state 使用 planRevision / planExplanation / planSteps / activePlanStepIndex 保存同一 run 的持久结构化计划。planUpdate 最多提交 8 个 pending / in_progress / completed 步骤且至多一个 in_progress;已完成和历史快照中已有的失败终态步骤保留,revision 只在真实变化时单调递增。外层 run 进入 failed / budget-exhausted 时原样保留最后可信 revision、说明、步骤状态与 active index,不把 pending / in_progress 机械改成 failed。旧 plan 派生 active / pending 并按工具 action 下标自动推进的逻辑只保留给尚未建立结构化计划的 legacy fallbackplanRevision > 0 后工具动作、observation 和 response 不得自动改写步骤状态,未完成步骤阻止 final。开发 UI、项目内开发面板、agent.run_status 与 CLI 有界展示完整计划,普通用户 Supervisor 只显示紧凑摘要。
  • 2026-07-10 补充:recentEvents 接入前端归一态和 Runtime 状态面板,事件事实源仍是 .agent/runtime/events/<agentId>.jsonl;面板按时间展示最近 thinking_summary / plan / action / observation / response / error 事件,现在能同时看到 Agent 的计划、最近观察、最近事件、最近工具动作和任务队列。
  • 2026-07-10 补充:后台 Runtime 每次追加 .agent/runtime/events/<agentId>.jsonl 后会通过 Tauri game-creator-agent-runtime-update 事件广播当前 AgentRuntimeResult,开发单 Agent 聊天页、项目内 Agent 对话弹窗和主窗口 Agent 状态卡用同一套前端归一化逻辑合并状态;该事件只做实时 UI 通知,.agent/runtime/agentseventstasks 仍是重开项目后的事实源。
  • 2026-07-10 补充:后台 Agent loop 的统一语义事件类型为 thinking_summary / plan / action / observation / response / error。普通失败和 loop 预算耗尽都会追加 error 事件,并继续保留 turn.failed / turn.budget_exhausted 生命周期事件兼容既有读取方;开发窗口、项目内 Agent 对话弹窗和主窗口状态卡通过现有最近事件列表直接展示统一错误事件及其安全详情。状态面板默认保持最新 4 条的紧凑视图,当前后端返回的最近事件超过 4 条时可展开查看全部返回记录,确保同一 run 的六类语义事件不会因 UI 硬截断而无法检查。
  • 2026-07-11 补充:开发单 Agent 聊天页继续使用整页纵向滚动,不把 Runtime 锁进固定视口;聊天消息区使用固定响应式高度并在内部滚动,避免历史消息持续撑高聊天面板。可选的 Runtime 恢复确认区始终占据独立布局行,不能与 Runtime 详情或聊天消息重叠。Runtime 状态面板支持折叠详情,折叠时只卸载目标、计划、事件、动作和任务等详情 DOM,仍保留状态标题与取消、重试、确认、拒绝、刷新操作;等待 LLM 时在消息区持续显示连接 / 等待首包 / 接收中的动态状态和“请求仍在进行中”提示。流式聊天的连续 delta 通过 requestAnimationFrame 合并为每帧最多一次消息更新,delta 不重复提交未变化的 Runtime stateOpenAI Chat SSE 的空数组或 null choices 心跳 / 元数据事件会跳过,usage-only 尾包会回填最终 token usagefinish-only 事件会把结束原因送入状态流,上游 error 保留真实消息,[DONE] 立即结束读取;正文与 finish reason 已接收后即使尾包异常也保存完整正文,不再改判整轮失败。持久事件订阅失败时显示非致命 Runtime 错误;聊天事件监听不可用时必须调用真正的非流式入口,不得因 Agent 配置仍为 stream=true 在 Rust 内部再发 SSE 请求;流式请求在首个文本片段前遇到允许的协议兼容错误时只降级一次普通回复。
  • 2026-07-12 调整:开发单 Agent 对话框新增 执行 / 聊天 分段模式,默认 执行。默认发送直接调用 start_game_creator_agent_runtime_task,复用工具规划、权限确认、取消、队列和 Runtime 实时状态;聊天 作为显式模式继续走不执行工具的流式回复。消息区在 Runtime 启动、排队、等待 LLM、执行工具、等待确认和同步终态回复期间持续显示当前状态,不再要求开发者从页头文案猜测请求是否仍在运行;原独立“后台运行”按钮移除。Runtime 必须先取得项目写锁并重读项目 revision 与当前 run 的 verification gate;只有 run 从未要求验证,或成功验证绑定的 revision 与锁内当前 revision 完全一致,才允许在同一把锁内先把最终 assistant 回复可靠写入当前 Agent Session,再写 completed 终态并广播事件。完成预检、finalization、恢复和取消收束遇到同项目另一个 Agent 的短暂写锁时,最多等待约 1 秒后重试;锁持续占用才返回 blocker,不能把毫秒级竞争误判为验证缺失并重新请求 LLM。每次可形成最终回复的 planning 请求或独立 final reply 请求开始前都记录 responseRevision;回复完成后锁内当前 revision 与它不同即返回可恢复 Stale,该规则同样覆盖 requiresVerification=false 的只读 run。旧回复不得进入会话或 completedRuntime 记录 completion blocker、response.stale 事件与审计,并保持原 Agent、Task、Session、Run、loop 计数和 per-Agent 锁回到 planning,重新读取或验证当前项目状态后再生成回复。revision / gate 读取失败或 stale continuation 持久化失败仍进入 failed;一旦 finalization journal 已进入 prepared,后续对话或终态落盘失败改为保持可恢复 finalizing,不得把当前 run 误记为 failed。前端只对当前项目、Agent、Session 和 runId 匹配的终态事件自动重读对话,直到看到新 assistant 消息或重试结束,切换 Session 后旧 run 不得污染当前聊天记录。
  • 2026-07-12 补充并冻结,2026-07-15 由 V1.18 升级:后台最终回复通过 .agent/runtime/finalizations/<agentId>/<runId>.jsongame-creator-runtime-finalization.v3 journal 跨越多文件落盘,状态严格按 prepared -> assistant-persisted -> runtime-completed 推进。journal 绑定项目、Agent、Task、Session、Run、source、父委派身份、任务正文、回复指纹、responseRevision、verification gate、稳定 messageId、最终结构化计划完整快照及 planSnapshotFingerprint,并新增 goalId / goalRevision / goalSnapshotFingerprint;计划和 Goal 快照指纹都进入 finalizationId。v2 只兼容无 Goal 的结构化计划 journalv1 只兼容不含计划快照的 legacy 读取。
  • finalization 单独使用 512 KiB 上限并保留跨平台 .previous 恢复副本。Runner 重启必须先处理 cancel / Goal control;只有 Goal 可继续时,才在 pending action、普通 task 和 delegate receipt 之前恢复 finalization,不重新请求 LLM、不重放工具或 receipt。assistant 已落盘而 Runtime state 缺失或损坏时,可从唯一 task record 和 v3 journal 恢复同一 run 的计划与 Goal 绑定;assistant 尚未落盘而 state 不可读时保留 journal 并进入 needs-reconciliation,不能猜进度写回复。
  • assistant JSONL 仍是用户可见提交点。其落盘后先可靠写 Runtime completed task/state,再把 Goal sidecar 写为 completed,并补写携带 Goal 终态的 task/state projection;全部成功后 journal 才推进 runtime-completed 并删除。prepared 且 assistant 未落盘时若取消、revision、verification gate、结构化计划或 Goal revision 使回复过期,删除旧 journal 并保持取消终态或回到同 run planningassistant 已存在时只幂等补齐终态,不接受迟到取消,也不重新请求 Provider。journal 损坏、版本或身份/回复/计划/Goal 指纹冲突必须 fail closed,并把 live run 投影为 finalizingneeds-reconciliation
  • 2026-07-12 补充并冻结:本地 conversation JSONL 的 messageId 是可选向后兼容字段,旧记录无需迁移仍可读取。finalization 使用稳定 messageId 幂等追加 assistant;同一 Agent / Session 下相同 ID 且 role/content 一致时不得重复写 JSONL,若消息已存在但 .agent/agent.db 缺少对应 conversation.message audit,重试必须在 audit 追加锁内补写一次,已有 audit 不重复;同一 Agent / Session 作用域下相同 ID 对应不同 role 或 content 时继续按冲突失败关闭。completed task JSONL、Runtime state、turn.completed / response 事件、agent.runtime.completed / background_task.completed audit、pending/confirmation 清理和 delegate result 发布均按既有身份幂等补齐,重启不得制造第二份终态投影。
  • 2026-07-11 补充:后台单 Agent 新增 Codex 风格的代码导航与局部编辑闭环。project.search 接受 query / path / maxResults / caseSensitive,在项目边界内做字面量搜索并返回 path:line,最多扫描 500 个、单个不超过 512 KiB 的文本文件,跳过 .agent.gitnode_modulesdistbuildtarget.nextcoverage.env*;该工具映射到 file.read 权限。file.read 接受 startLine / maxLines,返回带行号的指定片段、总行数和下一页提示,单次最多 240 行、8,000 字符。file.patch 接受 path / oldText / newText / expectedReplacements,只在实际匹配数与预期一致时持锁写入,目标文件和修改后文件最大 2 MiB,成功后写 agent.runtime.file.patch 审计;该工具映射到 file.write 权限。Agent planning prompt 明确要求批量修改前创建 checkpoint,并可在修改后再次 file.read 验证;本轮不开放任意 shell 命令。
  • 2026-07-12 补充:后台单 Agent 文件生命周期加入 file.delete。输入只接受项目内相对 path,工具使用独立且默认需确认的 file.delete 权限,不继承 file.write;Runtime 复用通用文件工具的绝对路径、父目录、反斜杠、有效或悬空符号链接和目录防护,并额外禁止删除整个 .agent/** 控制面。pending action v3 绑定本轮 planning 请求发出前的全局 project revisionfile.delete 取得项目写锁后会在实际副作用前再次校验该 revision 和 verification gate,再保守推进新 revision 与 gate 并删除文件。项目/session memory、blackboard 和 canvas asset 的 Runtime 写入同样推进全局 revision,防止它们改写待删除目标却不触发漂移。删除成功后写入不含文件正文的 agent.runtime.file.delete 审计;目标已不存在时返回幂等 observation,但仍保留已经推进的验证门禁。等待期间发生进程内 Agent 修改时,旧动作进入 needs-reconciliation,不能删除漂移后的路径;进程中断在 executing 时同样不得自动重放删除。v1 威胁模型只承诺客户端自身遵守项目锁的并发写入;外部进程在路径校验后把父目录替换为符号链接的 TOCTOU 攻击不在本轮承诺内,如需防御必须升级为目录句柄与 no-follow unlinkat 级别的平台实现。该工具只进入开发单 Agent Runtime,普通用户聊天和正式用户窗口不增加文件删除入口。
  • 2026-07-12 加固:删除动作在取得项目写锁后重新判定当前权限策略,锁竞争期间新增 deny 必须阻断,新增 confirm 必须让未获人工确认的自动动作退回待确认。Agent 私有记忆和客户端开发面板可修改项目内容的命令同样在项目锁内保守推进全局 revision;这样文件、记忆、资产、草案、导出或 checkpoint 恢复改写待删除目标后,旧 pending action 会在实际删除前因 revision 漂移失败关闭。.agent/manifest.json 的临时文件替换兼容 Windows:不能直接覆盖时先保留 .manifest.json.previous,主文件缺失可从恢复副本读取,安装新文件失败则恢复旧 manifest。
  • 2026-07-11 补充,2026-07-12 更新:代码修改后的真实验证由开发专用 project.verify 承接。输入固定为 script / expectedCommand / timeoutSecondsscript 允许项目根 package.json 中的固定脚本 check / typecheck / test / lint / build,以及以 check: / test: / lint: / typecheck: / build: / verify: / validate: 开头、后缀由安全非空段组成的命名脚本。脚本必须真实存在于项目根普通文件 package.jsonscripts 中,expectedCommand 必须与执行时重新读取的脚本正文完全一致,timeoutSeconds 为 1-300;当前执行器只支持 npm,非 npm packageManager 或 pnpm / yarn / bun 锁文件明确失败,不接受自由命令、参数或工作目录。pre* / post* 生命周期脚本名不在允许范围,执行器再通过 npm --ignore-scripts 禁止所选脚本关联的 pre/post lifecycle。工具映射到独立且默认需确认的 project.verify 权限,确认动作指纹绑定完整输入,不再因为放行验证而同时放行 command.run_limited 静态 smoke。执行器由 npm 运行已确认脚本,使用空 stdin、隔离 HOME/TMP/cache、清理后的环境、独立进程组和有界脱敏输出;Unix 下无论根进程正常结束还是超时都会清理同组残留后代。项目写锁记录 PID 和唯一 nonce,活进程继续持锁,Unix 死进程锁或跨平台超过安全时限的无效锁可回收,且控制路径拒绝符号链接。进入进程执行后的终态写命令日志和 manifest command runAgent 触发时另写 agent.runtime.project.verify;输入预检拒绝只写 Runtime observation / error 事件。失败输出作为 observation 回到下一轮 planning。项目级 revision 独立持久化到 .agent/runtime/project-revision.json;每个 run 的 gate 与验证结果持久化到 .agent/runtime/verification/<agentId>/<runId>.jsonfile.write / file.patch / file.delete / project.restore 在项目写锁内、实际修改前先保守推进 revision,并把 requiresVerification 单向置为 true,操作失败或崩溃也不回退;成功的 project.verifycommand.run_limited / game.static_smoke 只为执行时的当前 revision 写入凭证。空 actions 前如果门禁仍要求验证、验证失败或凭证 revision 已过期,Runtime 注入 runtime.verification: blocked 并继续 replan;多窗口重复无进展而以 loop-budget-exhausted 终止时,仍未形成当前 revision 的通过结果则保持失败。该能力会执行用户项目脚本,环境隔离不是 OS 沙箱;普通用户 /smokegame.static_smoke 保持原边界,不暴露该开发工具。
  • 2026-07-11 补充:开发验证可用 npm run ai-game-creator-shell:agent-task -- [--init] <projectPath> <agentId> <task> 无 UI 启动单 Agent 后台任务。CLI 只负责可选初始化、调用现有 Runtime、按 runId 轮询终态并打印 status / phase / replyText / pendingActionId,不复制 planning 或工具执行逻辑;默认 10 分钟轮询上限。waiting-for-confirmation 会以非零状态退出并要求转到开发窗口确认,CLI 不提供跳过项目权限的自动确认参数。该入口用于真实 provider 的可重复端到端验收,不进入普通用户界面。
  • 2026-07-11 补充,2026-07-13 调整:后台工具规划与最终回复的 LLM 请求新增可恢复错误重试:LlmError::EmptyResponse 原样自动重试最多 3 次;Timeout / Connectivity / Transport 及上游 408 / 429 / 5xx 最多额外重试 5 次并按 500ms / 1000ms / 1500ms / 2000ms / 2500ms 退避。配置、请求、流能力、反序列化错误及其他 4xx 不重试。重试发生在工具计划被解析和执行前,或最终回复尚未落盘时,因此不会重复执行已经落盘的工具副作用;重试耗尽后仍写入原有 error / turn.failed 事件并把失败消息追加到当前 Agent 会话。
  • 2026-07-11 调整,2026-07-12 更新,2026-07-15 由 V1.21 澄清:后台单 Agent planning loop 每 6 轮形成一个进度 checkpoint,每轮最多 3 个工具动作;6 轮是停滞检测窗口,不是单个 run 的固定上限,也不是上下文压缩触发器。loopIteration 在同一 run 内连续递增,maxLoopIterations 指向当前 checkpoint 的结束轮次;待确认或重启恢复后按 context bundle 的 nextLoopIndex 在同一 run 继续。checkpoint 产生新的独立观察时继续下一窗口,最近 6 轮没有独立进展或相邻窗口指纹重复时才写入 failed / budget-exhaustedloop-budget-exhausted,不生成总结伪装完成;真正的旧历史摘要只由 V1.21 token 阈值或显式 /compact 触发。这只调整后台单 Agent Runtime;游戏草案 Generator/Evaluator 仍保持独立的 3 轮修复预算。旧摘要中“后台最多 3 轮”“整个 run 最多 6 轮”或“每 6 轮自动压缩”的描述不再有效。
  • 2026-07-12 补充并冻结,2026-07-13 调整容量,2026-07-15 由 V1.18 增加 Goal 快照,随后由 V1.21 升级压缩状态:后台 Agent 每个 run 的可恢复 planning 上下文通过临时文件替换原子写入 .agent/runtime/context-bundles/<agentId>/<runId>.json;当前 schema 为 game-creator-runtime-context-bundle.v5。除 Agent/Task/Session/Run、任务正文、project revision、verification gate、窗口、fallback response、压缩 observation、contextStalled 与完整结构化计划快照外,v4 新增 goalId / goalRevision / goalStatus / goalSnapshotFingerprintv5 再绑定 compaction revision、source/summary fingerprint 和已压缩消息/observation 计数;任一当前 Goal 身份、状态、revision、指纹或压缩快照不一致都失败关闭。
  • v4 在压缩状态校验通过后迁移为当前格式;v3 在原身份、任务、project revision、verification gate 和结构化计划校验通过后,从当前 Runtime/Goal sidecar 补齐 Goal 快照并继续;v2 先按 V1.17 规则补齐结构化计划,再补 Goal;后续 checkpoint 统一写 v5。v1、缺失既有 gate 关联或无法证明 Goal 快照的记录不自动迁移。Provider pause 中断/返回边界先持久化 continuation;该恢复快照把 goalStatus 设为恢复后的 active,避免 resume 后用 paused 上下文自相矛盾。
  • stale continuation 必须清空旧 actions 与 fallback response,保留 blocker、loop 位置、窗口进度和结构化计划;contextStalled 一旦成立,同 run 重规划和重启不得清除。动态 revision 数字、时间戳与验证命令输出不构成独立进展;重复 stale 最迟在相邻窗口指纹重复时以 loop-budget-exhausted 终止。单文件最多 128 KiB、最多 12 条 observation;写入前统一限长并过滤敏感内容和项目绝对路径。revision 与验证资格仍以锁内独立文件为准,bundle 只是 Runtime 私有恢复上下文,不等同于根级 .agent/context.bundle.json,不得由通用文件工具暴露。
  • 2026-07-11 调整:后台任务的可执行正文上限统一为 4,000 字符。入队 JSONL、启动后的 currentTask/currentGoal、planning prompt、待确认动作 task context、确认续跑和重启恢复都保留同一份正文;对话仍保存用户原始消息。状态事件、列表卡片和 agent.db 摘要可继续使用较短安全预览,但不能再反向作为后续 LLM 执行输入。这样长任务末尾的验收标记和输出格式要求不会在队列边界被 180 字符截断。
  • 2026-07-11 调整,2026-07-12 由 Runtime V1.2 更新,2026-08-06 仅澄清 token 口径:后台 planning 使用 4,000 生成 token 预算,最终回复使用 2,400;预算包含可见输出与 Provider 可能使用的隐藏 reasoning token,不等于可见正文长度。既有配置与持久协议键 maxOutputTokens 保持冻结,Provider adapter 再按协议映射为 Chat endpoint capability 选定的 max_completion_tokens 或 legacy max_tokens、Responses max_output_tokens、Anthropic max_tokens;AGC 通用自定义网关当前保持 legacy 默认。本条原有“最多 3 次 EmptyResponse 重试”已由本文后续 2026-07-15 的 V1.18 收口条目取代。推理档位不再硬编码为 lowplanning、普通单 Agent 聊天和最终回复统一使用解析后的 llm.reasoningEffortagentLlm.<agentId>.reasoningEffort 有值时覆盖全局、缺省时继承全局;取值只允许 default / low / medium / high,发布默认 highdefault 表示不向 Provider 发送推理档位。
  • 2026-07-11 补充,2026-07-15 由 V1.17 更新:后台单 Agent 的工具 planning 响应必须提供可反序列化为 thinkingSummary / planUpdate / plan / actions / response schema 的 JSON object。Runtime 从模型输出中解析首个完整对象,因此对象后的尾随说明可以忽略;只有普通文本、没有完整对象,或对象无法反序列化时都不构成有效工具计划。对于这两类无效输出,Runtime 最多追加 2 次自动格式修复请求;同一次 planning 的私有 repair 请求可携带限长且经过统一敏感信息过滤的上一条模型输出或 function call 预览与协议错误,以便 Provider 真正修正格式。.agent/agent.dbagent.runtime.tool_plan.repair 公共审计只写 attempt/maxAttempts、protocol,以及错误、输出/调用体预览、callId 和 functionName 的 SHA-256、字符数或计数,不保存原始模型正文、错误或 function arguments。修复预算耗尽后进入既有工具规划失败路径,不得把普通文本折算为空 actions + response,也不得因此进入 completed;最终回复阶段仍按其独立的普通文本契约处理。旧文本协议可省略 planUpdate,但只能继续走 legacy plan fallback。
  • 2026-07-12 补充,2026-07-15 由 V1.17 更新,2026-07-27 由「Anthropic 与流式统一使用 Provider 原生工具」更新,2026-08-03 收紧 strict 边界:OpenAI Chat / Responses 的后台工具 planning 优先注册唯一的 submit_agent_tool_plan function tool,并使用字符串形式 tool_choice=required 和 strict schemaRuntime 只接受恰好一次同名 function call,并把 arguments 复用现有 AgentRuntimeToolPlan 校验与两次格式修复循环。strict arguments 中 planUpdate 必须出现但可为 null,使用结构化更新时 legacy plan 必须为空。错误函数名、多次调用和非法 arguments 都不得执行工具。Anthropic 自 2026-07-27 起与另外两种协议一致发送原生工具目录:请求体顶层携带 toolsschema 字段名为 input_schema)。strict 能力不从 apiKind 推断:AGC 只对无凭据 / 自定义端口 / 路径的官方 HTTPS endpoint 和 Claude 4.5+ 版本化 model id 显式开启,旧模型、未知别名和兼容网关默认关闭。开启后使用官方支持关键词白名单生成 Anthropic 专用传输 schema,已知不支持约束只从传输副本剔除,调用方原 schema 保持不变;未知关键词、不可解析 / 递归 $ref 和 strict 工具 / optional / union 请求级复杂度超限时该工具保持 non-strict,不能因完整 AGC 工具集超限让整次请求被上游拒绝。工具数组最后一项携带 cache_control: {"type":"ephemeral"} 作为 prompt cache breakpoint;非流式和流式 usage 都将 input_tokens + cache_creation_input_tokens + cache_read_input_tokens 合并为 prompt tokens。tool_choice 使用对象形态(Auto → {"type":"auto"}Required → {"type":"any"},裸字符串会被上游拒绝),响应解析 tool_use block 并把 input 序列化为 arguments。planning 不再因协议强制非流式,最终普通回复继续按 Agent 配置决定是否流式。platform-llm 仍在本地拒绝无 function tools 的 tool choice,但不再拒绝 Anthropic function tools;协议类型继续写入 agent.runtime.tool_plan.protocol 审计,Anthropic 正常路径的取值为 native_runtime_tools 而不是 text_json
  • 2026-08-10 OpenAI-compatible Schema 兼容收口:原生 function transport 不发送兼容代理已拒绝的 uniqueItems,数组去重继续由 Runtime 语义层完成;strict Schema 门禁必须与 oneOf / anyOf / allOf / not 一并拒绝 uniqueItems,避免合法 JSON Schema 关键字因超出 Provider 支持子集而把整次 planning 请求变成 invalid_function_parameters
  • 2026-07-11 调整,2026-07-15 由 V1.17 更新:工具计划五个顶层字段均为必填并拒绝未知顶层字段;thinkingSummary、结构化计划的 explanation / stepaction.tool 必须非空。planUpdate 只接受 null 或最多 8 个唯一步骤,状态限于 pending / in_progress / completed 且至多一个 in_progress。这样 {}、前置无关 JSON 或结构不完整对象会触发格式修复,不会成为假完成信号。空 actions 只有在 verification、process/join/delivery 和结构化计划完成门禁都通过后才表示 planning 收束;response 非空时直接采用,response 为空时进入独立最终回复生成。agent.runtime.project.verify 记录补充 runId / actionId / actionFingerprint,用于在多 Agent 并行验证时把命令终态与具体 Runtime 动作关联。
  • 2026-07-15 V1.17 公共审计收紧:thinking_summary event 只保存固定摘要、正文 SHA-256 与字符数,legacy plan event 只保存步骤数;结构化计划审计只保存 explanation 的哈希与字符数,以及 step 标题哈希、状态和数量。模型 thinking、legacy plan 标题、repair 错误和调用体只允许出现在对应私有 Runtime 上下文或有界 repair 请求中,不得复制到公共 event、task 或 Agent DB 正文字段。
  • 2026-07-10 补充:Agent Runtime state / result 新增 taskQueue,从 .agent/runtime/tasks/<agentId>.jsonl 中每个 runId 的最新记录汇总 total / pending / running / completed / failed / latestRunId;开发窗口 Runtime 面板、主窗口 Agent 状态列表、agent.run_status observation 和下一轮 planning prompt 都读取该摘要,用于判断同一 Agent 是否仍有排队任务。该字段是运行观测摘要,不新增调度器、SQLite 或独立 worker。
  • 2026-07-10 补充:Runtime 新增 agent.schedule_ready 调度入口。开发构建可在权限确认后扫描 manifest ready task,把依赖已完成且仍为 pending 的任务标成 running,并按 taskId 投递到对应 Agent 的既有后台队列;source 固定为 agent-ready-task-scheduler,审计记录写 agent.runtime.ready_task.scheduled。该入口只把 manifest ready task 接入现有 per-agent 队列、锁、JSONL、LLM loop、工具策略和事件流,不新增独立 worker,也不会在默认确认策略下静默启动。
  • 2026-07-10 补充,2026-07-18 更新:主窗口 Agent 状态栏的“调度 Ready”只在开发模式显示。点击后复用项目策略确认弹窗,确认通过才调用 schedule_game_creator_agent_ready_tasks,并把返回的 Runtime 合并回 Agent 状态卡;正式用户项目开发页的底部专业 Agent 状态只读,不提供专业 Agent / child 的单 Agent 对话入口,也不直接暴露 ready-task 调度按钮。专业 Agent picker、完整 Runtime 计划和工具台继续只属于开发入口。
  • 2026-07-10 补充:agent.schedule_ready 同时接入后台 Agent loop 白名单工具。Agent 可在 task.updatetask.create 后自行请求调度新 ready task;执行仍走 agent.schedule_ready 项目权限策略,确认策略命中时当前 run 停在 waiting-for-confirmation,不会继续消费队列或启动下游 Agent。确认通过后复用同一 scheduler,把 ready task 投递到对应 Agent 的既有后台队列。
  • 2026-07-10 补充:后台任务工具箱已加入 project.checkpoint。Agent 可在写入文件、更新任务或批量修改前自行创建本地 checkpointRuntime 复用 project.checkpoint 权限策略和项目写锁,observation 只返回 checkpoint id、文件数和总字节数,不返回本机绝对路径。策略要求确认或拒绝时不会创建 checkpoint。
  • 2026-07-10 补充:后台任务工具箱已加入 project.restore。Agent 可在 diff 或自检发现本轮修改走偏后请求恢复到指定 checkpointRuntime 复用 project.restore 权限策略和项目写锁,observation 只返回 checkpoint id、恢复文件数和删除文件数,不返回本机绝对路径。默认确认策略下不会静默回滚用户项目。
  • 2026-07-10 补充:单 Agent 聊天和后台 planning prompt 会读取同一个 Agent 的 Runtime 连续上下文,把本 Agent 最近 status / phase / runId / 当前任务 / 下一步、最近回复、计划、观察、最近 3 条工具动作、最近事件、最近 3 条任务记录和工具策略摘要带入下一轮推理;上下文按规范 taskId 隔离,不读取其他 Agent 的 runtime 文件,并在进入 prompt 前过滤密钥和本机绝对路径。新后台 run 启动时会继承本 Agent 上次 recentToolCallslastResponse,让多轮任务不丢失结构化行动证据。
  • 2026-07-10 补充:后台任务工具箱已加入 preview.start。Agent 可在 loop 中自行请求启动当前项目的本地 HTTP 预览;Runtime 会复用 preview.start 策略、项目写锁、共享 PreviewRegistry、manifest 预览状态、.agent/logs/preview.log 和 run trace 追加逻辑,并把 agent.runtime.preview.start 写入 .agent/agent.db。该 observation 只向 LLM 返回 localhost URL 与端口,不返回用户项目绝对路径。
  • 后台任务工具箱提供 canvas.asset_generate。Agent 在 loop 中给出素材 prompt、outputPath、比例、尺寸、kind 与展示名;普通已认证客户端通过固定官方 origin 的 /api/editor/*/api/assets/*/api/runtime/external-generation/jobs/* 调用平台,独立 standalone game-chat/显式高级模式才通过 /api/external/v1/* 与自备 Developer Key 调用。生成前按本地项目名称创建或复用同名画布项目和同名素材库目录,请求必须携带 projectId + assetFolderId + canvasCompletion,生成结果同时进入平台画布、素材库和本地项目。canonical 视觉 DAG 固定为:art-director 用图片生成 kind=spec 生成 assets/art-spec.pngdesign-foundation 精确引用该 resourceId,用图片生成 kind=ui-design 生成 assets/ui-prototype.pngart-asset-plan 使用同一 resourceId 和具体 iconDescriptions 调用图标 spritesheet 生成,产出真实透明的 assets/art-spritesheet.png。Runtime 在 POST 前把调用模式、相对 endpoint、精确请求体、SHA-256 与稳定 Idempotency-Key 原子写入 .agent/runtime/canvas-generation-requests/ 私有账本并回读一致;普通模式还冻结 official-platform-v1 + 官方 origin + ownerUserId,高级模式冻结 External service origin,两者均不保存 Token 或 Key。accepted 账本只恢复 GETprepared 表示首次提交结果未知,只允许使用原 endpoint、原始 JSON 字节与同一键恢复 POST,不得重建远端项目/目录、重组正文或分配新键。普通模式站内响应兼容 200 + queueState.operationId、inline 完成和 job 状态包装;高级 External v1 固定 202 + operationId。生成 POST 使用独立三十五分钟等待预算;game-chat 的两次串行生成纳入父 run 4200 秒软预算与 4500 秒总截止。轮询超时、临时鉴权或网关错误只保留原 operation 并在恢复时继续;结果损坏、状态损坏、透明派生失败或远端完成后的本地提交失败进入对账。postprocess-failed-source-preserved 不得登记为透明图集或自动重试;其它 general warning 保持 completed 并与 sliceWarning 分别展示。UI extraction 只处理已有带标注 UI 图,不属于这条 DAG;图集不得回退到普通生图。UI 原型 prompt、generationInputs.artSpecui-prototype.v2 验收必须从当前项目玩法合同提取 HUD、可玩区域、关键实体、操作、失败/重开与移动布局。旧正式图不合格时只返回 needs-repairSupervisor 认领后由原 owner 使用 replaceExisting=true 原位替换。凭据不进入项目文件;幂等键只进入受权限约束的私有生成账本,不进入 observation、manifest、agent.db 或日志。
  • 2026-08-03 durable 恢复补充,2026-08-04 扩展 preparedprepared / accepted / legacy-completed 恢复必须先从私有账本读取持久化的画布 ID、素材目录 ID、画布名、生成提示词、route、kind 与引用资源;prepared 只原样恢复同一逻辑 POSTaccepted 只查询既有 operation。不得在读取账本前重建请求、重新列举或创建远端项目/目录,也不得让本地输出路径漂移挡住恢复。显式“继续/恢复”复用原 action、pending、provider batch 与生成账本身份,不创建 successor 请求或新幂等键。恢复执行和后续 continuation 使用独立 Tokio task 栈边界,同时继续持有原 Agent lock。终态清理固定先删 generation / parallel 附属 sidecar,最后删 pending 身份锚点;历史孤儿只有所属任务已明确 completed/cancelled 时可自动清理,活动、未知或 needs-reconciliation orphan 必须保留并失败关闭。
  • 生成账本必须绑定调用模式与服务身份:普通模式为固定官方 origin + ownerUserId,高级 External v1 模式为显式 service originAccess Token 或 Developer Key 只负责当前请求授权,轮换不得改变已有 operation 的归属。退出或换号提升单调账号 generation,中止并脱离旧请求;旧 owner 账本在新 owner 下禁止 POST、GET、下载、安装和归档,只有重新登录同一 owner 后才能恢复。绝对 signed URL、query/fragment 和未知扩展字段不得进入项目账本,只有安全相对路径或 objectKey 可作为 durable 下载引用。accepted operation 明确 failed 时也保留账本,直到 pending observation 和 Provider batch 成员终态持久化后再按统一清理链删除。首次请求结果已经未知后,鉴权或其它非成功响应不能证明原请求未入队,必须保留原账本。生成账本根目录、扫描与删除使用受控路径解析逐级拒绝符号链接,非法控制路径失败关闭。
  • 2026-07-10 补充:后台任务工具箱已加入 task.list。Agent 可在 loop 中读取 manifest 任务图、每个 seed task 的状态 / 依赖 / 产物交接,以及按依赖计算的 readyTaskIdsRuntime 复用 task.list 项目权限策略,策略要求确认或拒绝时只返回策略 observation,不向 LLM 暴露任务图细节。
  • 2026-07-10 补充:后台任务工具箱已加入 task.update。Agent 可在 loop 中把 manifest 种子任务状态更新为 pending / running / waiting-for-confirmation / completed / failed,用于表达长期后台任务的当前进度;Runtime 复用 task.update 策略和项目写锁,实际只修改 .agent/manifest.json 中已有 taskId 的 status,并写入 agent.runtime.task.update 审计记录。策略要求确认或拒绝时不会修改 manifest,也不会创建新任务。
  • 2026-07-10 补充:后台任务工具箱已加入 file.list。Agent 可在 loop 中自行列出项目文件摘要或某个相对目录下的文件摘要,再决定是否继续读取具体文件;Runtime 复用 file.list 项目权限策略,observation 只包含项目相对路径、类型和大小,不读取文件内容、不返回项目绝对路径。
  • 2026-07-10 补充:后台任务工具箱已加入 project.diff。Agent 可在 loop 中基于已存在 checkpoint 查看当前项目新增、修改和删除摘要;Runtime 复用 project.diff 项目权限策略,策略要求确认或拒绝时不执行 diff,observation 只包含 checkpoint id、三类计数和项目相对路径,不返回本机绝对路径或文件正文。
  • 2026-07-10 补充:后台任务工具箱已加入 agent.run_status。Agent 可在 loop 中读取自己、目标 Agent 或一组 Agent 的 Runtime 状态摘要,判断同伴是否正在运行、最近任务和最近工具动作;Runtime 复用 agent.run_status 项目权限策略,策略要求确认或拒绝时不读取状态,observation 不返回 .agent/runtime/* 文件绝对路径。
  • 2026-07-10 补充:后台任务工具箱已加入 agent.delegate。Agent 可在 loop 中把明确任务投递到另一个 Agent 的独立后台队列,复用目标 Agent 原有锁和 pending drain 语义;同一目标 Agent 串行,不同目标 Agent 可并行。该工具受 agent.delegate 策略保护,策略要求确认或拒绝时不会写目标对话、不会启动目标后台任务,也不会写 agent.runtime.agent.delegate 审计记录。
  • 2026-07-10 补充:agent.delegate 已形成可恢复的父子任务闭环。delegationId 由 durable pending action 的 actionId 派生,子任务记录会保存 parentAgentId / parentRunId / delegationId,终态记录额外保存经过统一凭据清洗和安全截断的 terminalDetail;同一委派的提交和回执分别受 delegation 级 OS 文件锁保护,同一目标 Agent 的 runId 分配与 pending 追加还受任务账本 OS 锁保护。子任务进入 completed / failed / cancelled / budget-exhausted 任一终态时,Runtime 按 delegationId 幂等生成且至多生成一次 agent.delegate.result 回执,失败、排队或活跃取消、预算耗尽都必须回传,不能只覆盖成功。回执会向父 Agent 既有队列追加固定 runId、source=agent-delegate-receipt 的续跑任务,把完整的已清洗 terminalDetail 交回父 run,不再只保留 80 字符 UI 摘要;回执 prompt 明确禁止重复同一委派,排队期间不提前写入父会话,真正开始执行时才幂等落盘,用户消息或回执消息落盘失败时不会进入 LLM。回执任务保留父 run 关联,并在真正开始或恢复前再次检查父 run 状态,关联缺失或父 run 不存在时失败关闭;该续跑仍受父 Agent 原有 FIFO、per-Agent OS 锁、权限确认、取消、恢复和 needs-reconciliation 屏障约束,不直接重入父 run、不插队、不新增独立 worker;父 run 已取消或普通失败时只保留 suppressed receipt 审计,不自动复活,父 Session 归档与切换会被未结束委派阻止,极端归档竞态下回执回落到父 Agent 当前可写 Session。恢复先恢复 pending action / reconciliation 屏障,再扫描“子任务终态已落盘但回执未提交”的窗口并补齐缺失回执;needs-reconciliation 本身不回执,只有人工核对后最终取消才回传 cancelled
  • 历史记录(已由 V1.1 独立 Runner 替代):Runtime 最初通过 resume_game_creator_agent_runtime_tasks 把本地 JSONL 队列重接到当前 App 进程。当前恢复入口仍保留权限、任务顺序和 agent.runtime.background_task.recovered 审计语义,但实际由独立 Runner 接管原 run / session;已发出的上游 LLM 请求仍不能从网络中间点续传。2026-07-27 起,Runner 归 Tauri GUI 生命周期所有,同一 AppData 只允许一个 GUI owner。GUI 启动子进程会显式声明 --gui-owner-required 并在就绪后 attach ownerRunner 若在启动检查前已发现 owner 释放则直接失败,不得退化成 CLI-owned Runner。Runner 使用独立 watchdog 线程每 100ms 监控 owner OS 锁,不依赖服务端主循环继续推进;owner 丢失后先触发 1.5 秒共享 deadline 的 draining、Provider 中断和 process session 回收,若主循环或排空链路卡死则在 1.75 秒后由 Runner 自身进程安全硬退出并清理匹配 bootId 的 endpoint。GUI 客户端还必须把完整 runner.attach_gui_owner 参数作为绑定规范化 AppData 的进程内登记保存;ensure_external_agent_runner 无论复用既有 endpoint 还是启动新 Runner,都要在把 endpoint 交给 Runtime 写请求前按新 bootId 补登记。同一登记 generation 在同一 boot 上幂等,补登记失败不得记录成功 boot 且本次 ensure 失败关闭;未建立 GUI 登记的普通 CLI 不执行该重放。OS owner 锁与 watchdog 已成立只代表进程受 GUI 生命周期约束,不能替代事件 sink 等进程内附加能力的逐 boot 恢复。因此正常最终退出、panic、SIGKILL 和 setup 中途失败都不会再因 busy 或主循环卡死而残留后台进程。endpoint 缺失 / 读取失败必须结合 Runner 实例锁判断;GUI 客户端强制兜底在 Linux 使用 pidfd、Windows 使用稳定进程 handle。macOS 没有等价稳定句柄,客户端不得在 start identity 检查后按裸 PID 强杀,而由跨平台 Runner 自身 watchdog 提供硬退出兜底。旧 endpoint 缺 start identity 时,只有认证 ping 精确匹配 PID + bootId 才允许迁移 busy 旧 Runner。未完成任务保持 durable 状态并在下一次启动走 reconciliation / recovery,不能伪造 completed 或重放副作用。关闭单个 WebView / 子窗口和普通 CLI 退出不触发该行为,版本切换与人工命令仍可使用只关闭空闲实例的 runner.shutdown_if_idle
  • 2026-08-05 GUI owner attachment 确认补充:登记参数必须保存 GUI manifest 事件接收端的真实 event_sink_portevent_sink_token,不得借用 actionId 等无关字段作为测试替身。每次 attach RPC 只有同时返回 attached=trueeventSinkAttached=true 才能把当前 bootId 标记为已登记;eventSinkAttached 缺失、为 false 或普通 RPC 失败都保持当前 boot 待重试。sink token 只留在私有进程内登记和 RPC 参数中,不进入日志、错误文本或公共状态。
  • 2026-07-10 补充,2026-07-16 由 V1.28 澄清:后台 planning 与预算内 final reply 使用专用最小上下文,只预置 Agent 身份、sessionId、runId、执行模式和工具策略;Agent 私有记忆、项目记忆、黑板、对话、资产、项目索引与文件正文只能经对应工具通过权限 gate 后作为 observation 进入下一轮。只有开发窗口的专业 Agent 前台直调可使用对应角色上下文;正式用户前台现已统一进入 project-supervisor。长黑板、记忆和对话按尾部截断,确保最新结论与最新定向消息优先保留。
  • 2026-07-10 补充,2026-07-16 由 V1.28 澄清:同一 Agent 的开发前台直调、流式调试和后台任务统一使用 .agent/runtime/locks/<agentId>.lock OS 文件锁。开发前台不再在整个 LLM 请求期间占用项目级写锁;同 Agent 后台任务在开发前台运行时只入队,前台成功或失败后把当前 Agent 锁直接移交给 drain,不重新抢锁,也不允许 drain 启动异常把已经完成的调试结果改判为失败。正式用户 GUI 不通过该入口直聊专业 Agent;不同 Agent 继续并行,真实项目写工具只在副作用执行期间短暂申请项目写锁。
  • 2026-07-10 补充,2026-08-01 更新:默认 agent.resume=confirm 时,客户端自动恢复命令先做只读 recovery preflight。全新项目和已完全终态且没有 task / retry / handoff / finalization / pending action / reconciliation 等 durable recovery work 的项目直接返回空结果,不显示虚假的 agent.resume 确认条。确实存在可恢复工作时,自动命令只做 auto gate 并返回待确认错误;主工作区和独立开发 Agent 聊天窗口显示 agent.resume 确认条,确认对象绑定发起时的项目路径,切换项目会取消旧确认,异步返回后也不得把旧项目 Runtime 合并到新项目 UI。开发者确认后调用独立 confirm_resume_game_creator_agent_runtime_tasks,该命令仍执行 deny-only 权限检查后才接回 durable queue。临时调用失败不锁死项目路径,允许后续刷新重试;明确 deny 或取消都不恢复任务。
  • 2026-07-10 补充,2026-07-12 更新,2026-07-15 增加 V1.17 完成门禁并由 V1.21 澄清:后台 Agent 返回空 actions 后,只有不存在 project.verify 等既有 blocker,且当前结构化计划的全部必要步骤均为 completed,才视为 loop 已收束。工具 action 序号和成功 observation 不会自动推进结构化计划;未完成时 Runtime 返回 runtime.plan_update blocker,在同一 run 要求 Agent 按真实进度更新。每 6 轮只做进度 checkpoint 与停滞检测;有新的独立 observation 时继续同一 run,最近 6 轮没有独立进展或相邻 checkpoint 重复时终态才写为 status=failed / phase=budget-exhaustederror 使用 loop-budget-exhausted 机器可读前缀,不再调用 final reply 后写 completed 审计。上下文摘要只由 token 阈值或显式 /compact 触发。解析阶段保留过滤后的 action 总数,每轮超过 3 个 action 时写入 runtime.tool_budget observation 并只执行前三个,要求下一轮重新排序。Runtime 默认 allowedTools 直接由实际可执行工具白名单派生,避免 UI 观测与执行边界漂移。
  • 2026-07-15 V1.18 补充:开发单 Agent 对话框使用 执行 / 聊天 / 目标 三段模式,Goal 创建/编辑在独立弹层完成,并可查看状态、revision、完成标准以及暂停/恢复/清理;正式用户窗口不展示 Goal 管理控件。Provider 中断边界先持久化可恢复的当前 v5 contextRunner 重启先收束 Goal controlpaused 在 finalization/pending action 前直接保持休眠。resume 只从 paused 续接,先删除同一 run 旧 cancel tombstonefinalization v3 在 assistant 后先投影 Runtime completed,再写 Goal completed 并补 Goal 终态投影。
  • 任务图能力:每轮 Orchestrator agenda、ready / active task 选择、Evaluator 结构化返工路由、返工轮 carry-over。
  • 记忆能力:短期记忆 memory/session.md、长期记忆 memory/project.md、项目级黑板 memory/blackboard.md 和角色私有记忆 memory/agents/<group>/<role>.md;黑板用于共享重要跨 agent 记忆,角色私有记忆只给对应角色 brief 读取和追加。最近 project / agent conversation 会作为短期 prompt 上下文读取,不替代正式 memory 文件。
  • 对话能力:结构化对话记录统一落在 .agent/conversations/ 的 append-only JSONL;正式用户 GUI 只写 project-supervisor 的 active Agent Session.agent/conversations/project.jsonl 仅保留为 legacy 只读背景。agc:chat 与正式项目开发页均已按该路由落盘;开发窗口直调单个专业 Agent 时只写对应 .agent/conversations/agents/<agentId>/ Session;专业 Agent 与 child 的终态只形成内部回执/证据,不写正式用户 assistant,也不把原始对话混进项目黑板或角色私有记忆。
  • 本地能力:生成代码和资产落盘、本地 manifest、受限运行命令、本地 HTTP 预览。
  • 文件能力:file.list/read/write/delete 只允许访问项目目录内的相对路径,拒绝绝对路径、..、反斜杠和符号链接。
  • 产物治理能力:写入前生成本地 checkpoint,写入后记录相对路径 diff,用户确认后可 restore 到最近 checkpointrestore 会回滚到 checkpoint 状态,包括删除 checkpoint 后新增的受跟踪文件。
  • 安全能力:上下文进入 LLM 前先做密钥模式和本机配置痕迹过滤;项目写入走项目级写锁和项目级权限策略。
  • 创作能力:策划、美术、程序、数值、音乐、运营 6 组专业 agent,组内按任务使用 Director、Gameplay、Code、Asset、Preview、Playtest、Polish、Publish 等角色模板。

本地项目结构

game-project/
  game/
  assets/
  memory/
    session.md
    project.md
    blackboard.md
    agents/
      <group>/
        <role>.md
  exports/
  .agent/
    agent.db
    manifest.json
    policy.json
    project.lock
    project.index.json
    run.latest.json
    conversations/
      project.jsonl
      agents/
        <agentId>.jsonl
    runtime/
      project-revision.json
      verification/
        <agentId>/
          <runId>.json
      agents/
        <agentId>.json
      events/
        <agentId>.jsonl
      tasks/
        <agentId>.jsonl
      context-bundles/
        <agentId>/
          <runId>.json
      pending-actions/
        <agentId>/
          <runId>.json
      locks/
        <agentId>.lock
    activity.jsonl
    output.jsonl
    context.bundle.json
    checkpoints/
    runs/
    logs/

生成代码、图片、音频、关卡数据、配置和导出包必须落到用户授权的本地项目目录。正式预览只使用 127.0.0.1:<port> 本地 HTTP server,不使用 file://

画板对接

美术组和音乐组复用现有画板能力,不另建平行资产系统。

2026-08-05 起,客户端图片精修不再通过“打开另一份主站画布副本”实现,而按 【技术方案】客户端素材创作无限画布阶段一合同-2026-08-05.md 把现役网站图片画布抽取为共享 @genarrative/image-canvas-core@genarrative/image-canvas-react。网站和 Tauri 实际 import 同一份 core/React/UI 源码,分别注入 Web 与 Tauri Host Port;禁止把 src/components/image-editor/ 整目录复制到客户端。

  • 美术组通过画板链路生成角色、场景、UI、图标、动画和宣传素材。
  • 音乐组复用画板已有 audiosound-effectbackground-music 能力。
  • 默认后台生成,用户需要精修时打开画板继续编辑。
  • canvas.project_open 只打开本机 Genarrative 编辑器的 /editor/canvas?projectid=...,默认地址为 http://127.0.0.1:3000,开发者可在开发窗口改成本机端口;不允许打开远程站点或任意 URL。
  • 画板资源回流到本地项目 assets/,并在 manifest 中记录画板项目、资源 ID、assetObjectId、prompt、model、taskId 和 assetKind;当前最小落地提供 asset.register 登记项目内已有资产,并提供 canvas.export_import 读取现有画板素材导出 ZIP。
  • canvas.project_sync 在普通模式读取当前陶泥儿账号可访问的 /api/editor/projects/{projectId} 画板快照,通过 /api/assets/read-url 换签并把资源下载到本地项目 assets/canvas-sync/;官方 origin 固定,Access Token 只来自当前进程内存。独立 standalone game-chat/高级模式才使用其隔离 editorApi.baseUrl/apiKey 调用对应 External v1 路由。凭据均不写入项目文件、trace、manifest 或日志。
  • Agent loop 中美术组 Asset 和音乐组 SFX 会读取 .agent/manifest.json;图片生成先通过当前调用模式的项目与素材库接口准备同名画布会话,再带稳定 Idempotency-Key 调用生成端点。Runtime 在私有生成账本持久化精确请求、幂等键、owner 和返回的 operationId,并查询统一状态端点;completed 后取得稳定 objectKey/resourceId,再通过当前模式的 /api/assets/read-url 或 External v1 read-url 换签下载到受控本地 assets/ 路径。Token/Key 不写入项目文件;幂等键只作为私有可恢复身份保存。未登录、账号不匹配、查询 failed 或结果缺少稳定媒体引用时,图片产物型任务保持阻塞/失败,不能以文字计划完成。
  • canvas.asset_import 当前作为最小真实链路:导入项目目录内已有文件为 canvas 来源资产,并要求记录画板项目 ID 以及 resourceId 或 assetObjectId。
  • 项目工作台只在资源卡本体中渲染已登记图片与安全 SVG,并在卡内展示视频首个可解码画面;中央资源聚焦以路径、MIME、来源、Rust 权威依赖和版本信息为主,不重复挂载或放大图片、SVG、视频。媒体通过受控 Tauri 命令从项目 assets/ / game/ 读取,只允许 manifest 已登记资产或已完成任务产物,并复用 file.read auto 权限、图片魔数、文件大小、像素尺寸、普通文件、路径漂移和符号链接校验。Rust data URL 只承担一次 IPC 传输,前端立即按实际解码字节建立 Blob URL 并丢弃 base64 字符串;不向 WebView 暴露任意本机文件协议或绝对路径。
  • 2026-08-03 阶段四在上述图片链路外新增 read_local_project_text_previewread_local_project_media_preview。前者只接收当前 manifest 已登记文档或已完成任务中的 Markdown / 文本 / JSON / YAML / TOML,限制 2 MiB 与 UTF-8;Agent 文本回执继续直接消费合法对话投影,不反查本地路径。后者的美术分支接收 GIF、安全 SVG、AVIF、BMP、MP4、WebM、MOV,音频分支只接收 manifest 已登记的 MP3、WAV、OGG / Opus、M4A、AAC、FLAC,二进制媒体限制 32 MiB。两条命令统一执行 file.read auto 权限、规范化相对路径、项目边界、敏感路径、普通文件、父目录链接、硬链接、读取漂移和重开身份复核;媒体按文件签名而非只按扩展名或 MIME 建立 data URL,SVG 额外拒绝活动内容与外部引用。
  • canvas.export_import 复用 /editor/canvas 已有素材导出 ZIP 格式,读取根 metadata.json、复制 images/ / media/ / sequences/ 到本地项目 assets/canvas-imports/,再按导出层登记为 canvas 来源资产;导出包不保存真实 resourceId 时,使用 canvas-export:<file> 作为可追踪 assetObjectId,不伪造后端资源行。
  • 阶段一图片画布正式闭环只覆盖图片。网站 adapter 保留账户、钱包、服务端 editor project、云端素材库、OSS/asset object 与现有生成 APITauri adapter 使用本地项目、受控媒体、game-creator-asset-canvas-draft.v1 草稿、manifest、项目 mutation revision 和 External Editor API。2026-08-10 起视频和音频进入统一非破坏性派生壳,但高级抠图、图集、角色动画、视频时间线和音频波形级编辑仍后续分期。
  • Tauri 正式保存必须通过受控 staging 与 commit_local_project_asset,携带 expectedProjectId + expectedRevision + expectedDraftRevision + commitId + idempotencyKey。事务固定为 prepared journal、最终图片、manifest/revision 可恢复更新、回读验证、committed ledger/草稿、最后发布 game-creator-local-asset-committed;不能继续用先推进 revision 再分别登记资产的旧命令拼装正式闭环。
  • refine 默认保留源文件和源 manifest asset,新建 canvas-<commitId> 资产。源资产没有外部 source.resourceId 时在同一 manifest 事务中补齐 local-asset:<manifestAssetId>,新资产通过 referenceResourceIds 引用该规范身份;禁止把裸 manifest asset ID 冒充 External Editor resource ID。

GameAgent V1.0 项目开发工作台首版界面

2026-07-18 起,项目开发页按《陶泥儿GameAgent-V1.0 项目开发界面需求》先落一版可交互工作台。该切片替代“正式用户项目页只有聊天与只读 Agent 列表”的旧视觉口径,但不改变 Runtime、manifest、预览和计费事实源。

2026-07-20 起,产品状态机、P0/P1/P2 范围与后续数据合同以 【AI游戏创作】项目开发工作台PRD-2026-07-20.md 为准;本节只保留当前实现边界。

  • 页面骨架固定为左侧现有全局导航、中间主视窗、右侧陶泥儿对话和底部子 Agent 状态栏;不新建第二套客户端或平行项目页。
  • 中间主视窗提供 资源管理 / 运行 切换。code-prototype 任务完成前运行入口保持视觉不可用,但仍可点击查看“当前无可运行版本”,不能使用会阻断说明交互的原生 disabledaria-disabled;完成后才允许进入运行表现层。切回资源管理只修改前端展示态,不伪造后端预览暂停结果。
  • 资源管理从当前 GameCreationAppManifest(包含可选 versions)、合法 Agent 文本回执和已导入附件派生资源,固定按文档、项目版本、美术资源、音乐音效资源分区;未知任务产物不再兜底为版本,任务声明中的未登记音频也不冒充正式音频。按依赖 / 按类型 使用各自前端排列,dependency 模式额外绘制当前 manifest 与资源投影可证明的依赖关系。排列与图层都不写回 manifest,不能推断或伪造缺失依赖。
  • 资源卡支持点击聚焦、搜索和类型筛选。2026-07-28 起完成两套二维坐标与本地 CAS sidecar2026-07-31 起 dependency 模式增加不持久化的原生 SVG 关系图层。2026-08-03 mentor 决定暂缓资源卡拖动,当前卡片不挂载 Pointer Down / Move / Up / Cancel 拖动入口,只允许自动布局和点击聚焦。聚焦态替换中央主视窗内容,保留左侧导航、右侧对话和底部 Agent 状态栏,退出后恢复搜索、布局模式、滚动位置与选中资源;不提供工具栏、工具侧边栏或可拖动标题栏。2026-08-10 起聚焦态以资源元数据、Rust 权威深度、同类型上下游 / 任务流和版本信息为首屏;美术图片与视频只保留卡内本体,不在详情重复放大。安全文档正文与按意图读取的音频控制位于元数据之后;美术编辑、音频编辑 / 替换、版本替换或运行模块仍不在本阶段。

资源管理串行改造:本体卡、分区缩放与依赖聚类

  • 三项必须串行落地:阶段一先把资源卡改为媒体 / 文档 / 版本本体;阶段二再引入分区级可视高度与独立内容倍率;阶段三最后在 dependency 自动坐标派生中增加稳定聚类。三阶段都复用 ProjectDevelopmentViewprojectResourcesFromReadModels、现有详情状态机、安全 Tauri 读取命令、布局 sidecar 和 Rust 资源图,不新建页面、manifest 真相或平行资源模型。
  • 阶段一只保留一个 ResourceCard。卡外层用非交互容器承载绝对坐标、选中与关系高亮;其内的详情覆盖按钮和媒体播放按钮是同级 DOM,分别键盘聚焦。视觉层对读屏隐藏,详情按钮使用“打开资源详情:<类别> <名称>”的精确 aria-label;播放键使用“播放 / 暂停 <名称>”,不依赖视觉文件名。
  • 卡片类型与读取路由一个纯分类函数决定:PNG / JPEG / WEBP 调用 read_local_project_image_previewGIF / SVG / AVIF / BMP 和 MP4 / WebM / MOV 调用 read_local_project_media_preview;文件文档调用 read_local_project_text_preview;Agent 文本回执直接消费已有安全字符串;音频只在播放意图发生后调用 read_local_project_media_preview;版本和不可预览类型不发 IPC。文档卡摘要只以 React 纯文本渲染,不执行 Markdown HTML、图片或链接。
  • ProjectResourceCardPreviewController 在画布级持有唯一 IntersectionObserverroot 指向当前资源画布,只为交叉卡片入队。当前 Hook 的逻辑读取并发上限固定为 3,总排队硬上限固定为 96;终态内存预览 LRU 同时限制为最多 48 项和 64 MiB 总载荷,媒体以 Blob 实际字节、文档以 UTF-8 字节计入。排队中、在途与已缓存的相同身份都去重。调度优先级固定为 play > detail > visible,可见预取不得占满全部主动容量;队列已满时,播放 / 详情请求替换最低优先级的排队预取并优先执行。音频不接受可见预取,只接受用户播放意图。缓存替换、淘汰、资源失效、scope 切换和卸载统一撤销 Blob URL;活动媒体可在预算内免于普通 LRU 淘汰,但不能突破总字节硬上限。
  • 失败预览区分 transient 与 permanent:读取漂移、文件替换和通用暂时错误可由用户再次打开详情或点击播放显式重试;超尺寸、损坏、类型不支持和危险 SVG 等永久错误继续进入有界失败状态。滚动可见性不自动重试任一失败项,错误 UI 只在 transient 情况提示关闭后重试。
  • 预览身份键固定包含 projectPath / projectId / mode / resourceId / category / path / mediaType。每次 Controller 挂载以及每次 projectPath + projectId + mode 变化都生成新的不透明 scopeIdA → B → A 不复用第一轮 A;每个真正进入 IPC 的读取再生成唯一 requestId。Controller 的 epoch、逻辑活动计数、队列、缓存和 Promise 回调仍按当前 scope 隔离,旧 then / catch / finally 不能写入或扣减新 scope。
  • Tauri app state 注册唯一 ProjectResourcePreviewReadManager,三个既有读取 command 共同使用进程级 3 permit semaphore 和活动 request / scope registry;不同 Controller、项目、mode 或窗口都不能扩张物理读取上限。scope 切换与卸载先失效前端 epoch、暂停媒体、清理队列与 Blob,再异步调用窄职责 cancel_local_project_resource_preview_scope(scopeId);取消未知或已结束 scope 幂等成功,重复 request ID 失败关闭。等待 permit 的任务同时等待取消;已取得 permit 的任务在命令入口、安全策略与登记复核后、打开文件后、每个固定块之间、签名 / 结构校验前、漂移复核前和 base64 前检查共享取消状态。
  • 图片、文档和媒体读取改为受原 2 / 8 / 32 MiB 上限约束的固定小块读取,permit 只由对应原生任务在成功、失败或取消后释放。取消任务不编码 data URL、不返回字节给前端、不创建 Blob URL;成功、失败、取消和 join error 都通过清理守卫移除活动 request / scope registry。seen request tombstone 保留最近至多 8192 项;非活动 cancelled scope tombstone 的保留预算为 1024 项,仍有请求的已取消 scope 必须跳过淘汰并可临时超出预算,最后一个请求结束后立即重新收敛。因此终态断言只要求活动 registry 清零,不要求 tombstone 清零。明确取消只静默收口旧 scope;当前 scope 的真实 transient / permanent 错误分类不变。详情打开、mode / 项目切换、运行视图、搜索 / 筛选隐藏当前媒体、资源删除或当前媒体身份变化继续暂停旧元素并清除待播放 ID;卡片卸载时再执行防御性暂停。
  • 解码容错在 DOM 层二次收口:img 只在安全读取成功后挂载,error 后立即卸载并回退类型占位;videoloadeddata 前保持占位,只在首个可解码画面后显示,error 后卸载。图片与视频的卡内几何统一 object-fit: contain,透明媒体壳使用棋盘底。
  • 卡片宽高从 resourceCanvasLayoutModel.tsRESOURCE_CANVAS_CARD_WIDTH / HEIGHT 作为唯一权威值,React 把它们以 CSS 变量注入资源画布;卡片 CSS、slot 间距、分区 extent 与 ResourceDependencyOverlay 端点继续消费这两个常量,不允许在 CSS 中再写第二套尺寸。
  • 阶段二把“分区高度”和“分区内容倍率”作为两个独立表现态。高度、倍率和分区内部滚动的前端会话 Map 以 projectId + mode + section 隔离;外层资源画布滚动以 projectId + mode 隔离。它们都不使用 localStorage / sessionStorage,不写 manifest 或 game-creator-resource-layout.v1。高度模型继续定义默认值、步长、“标题操作 + 至少一排 180×128 卡片”下限和由 .game-resource-canvas.clientHeight 夹取的上限;倍率模型固定 0.5..2、按钮步长 0.1,触摸板 Ctrl/Cmd + wheel 使用有界指数映射,WebKit gesturestart/change/end 使用同一 clamp。普通 wheel 不缩放;Ctrl/Cmd + wheel 由画布上的原生委托监听以 { passive: false } 注册,先真实取消 WebView 默认缩放,再按最近的 section viewport 执行锚点缩放。捏合以 viewport 内手势中心换算逻辑内容坐标,并在下一帧补偿 scroll,避免缩放目标跳离指针。
  • 每个分区使用固定标题行与 minmax(0, 1fr) 内部 viewport;分区本体仍是 .game-resource-canvas-content 中的普通 grid item。逻辑 plane 继续承载未缩放的卡片坐标和 180×128 本体尺寸,外层 frame 按倍率设置真实滚动 extentplane 仅使用 transform-origin: 0 0 的视觉 scale。超出当前高度或缩放范围时由分区 viewport 内部滚动,外层 .game-resource-canvas 只负责分区之间滚动。高度、倍率和内部滚动均不调用布局 CAS,也不改变媒体 React key;详情、项目或 mode 切换前捕获对应 scope,返回时分别恢复外层与分区滚动及原卡片焦点,未保存过的 scope 从 0 开始。
  • 固定四区分别在自己的 .game-resource-plane 内挂载 ResourceDependencyOverlay。每个分区最多创建一个 ResizeObserver,并把本区 scroll / resize / observer 回调合并到本区单一在途 requestAnimationFrame;SVG 和卡片直接消费同一逻辑坐标与父 plane scale,不通过异步屏幕测量重绑端点。分区 viewport 原生裁剪本区 SVG;一端离屏时只保留对应方向、带同语义 marker 的边界继续线,两端离屏时隐藏。项目 / mode 切换、搜索隐藏、资源删除和卸载继续丢弃旧 viewport / path 并清理 observer 与监听。
  • 阶段三的聚类已落在 reconcileResourceCanvasLayout 的 dependency 自动坐标派生步骤。它先按资源分类过滤 reference edge,并把 task-flow 按固定分类切成仅在同类 source / target 同时存在时有效的聚合超边;每个 section 再用精确边与 flow 临时节点建无向邻接表,以迭代遍历生成弱连通组。task-flow 只以“流节点 -> 成员”的线性成员关联参与布局,绝不展开 source × target 资源组合,不绘制 SVG,也不把搜索后的 visible set 用作输入。dependencyDepth 仍唯一决定横向业务层级;相关簇按 minDependencyDepth + minStableResourceId 排序,孤立集合置于所有相关簇之后,簇间使用单一布局常量留白。每个相关簇内先按稳定资源 ID 建同层初始序,再做固定两轮左至右 / 右至左的中位数扫描:精确引用读取相邻层的上下游 rank,task-flow 读取另一端成员 rank 的中位数,平局按稳定资源 ID 收口。dependency 自动位置使用 48px 列间走线区和 40px 行间走线区;每个相关簇以最大层行数确定高度,资源较少的层增加确定性半差偏移而在簇内居中,菱形 / 分叉两侧因此保持均衡。type 模式仍使用原 16px 行列间距。跨分类 read model 关系不进入前端聚类、边界偏置或拓扑签名,但 Rust 深度与原始图真相不改。显示坐标必须遵守前后端共享的 0..=1_000_000 上限;超深依赖在最后合法列确定性饱和,保留原始 dependencyDepth,同列资源继续按稳定顺序纵向避让。若任一自动 x / y 无法在合法域内落槽,协调必须在 IPC 前失败关闭,不持续提交必然被 Rust 拒绝的坐标。算法保持 O(V + E) 图遍历,加固定轮数的层内稳定排序和现有有界占用索引;4096 资源不允许全量配对。旧的 manuallyPlaced=true 坐标先占位并原样保留,聚类只派生自动坐标;同类型拓扑身份签名只记录有界的资源 ID 端点 / 成员,以便深度未变但邻接变化时触发重派生。图边、cluster ID 和签名都不写 sidecar。
  • 中间主视窗提供 resource-overview / asset-canvas / resource-editor / run 四种状态。2026-08-10 起普通用户“新增资源”显示为禁用态且处理函数拒绝 create;所有现役资源从聚焦态“编辑资源”进入非破坏性派生。静态图片继续进入 refine 素材创作无限画布,SVG、视频、音频、文档/代码、Agent 回执和项目版本进入统一资源编辑壳并按能力分流;底层 create 合同仅保留兼容。编辑面板只替换中央区域,不覆盖右侧 Supervisor 或底部 Agent。code-prototype 任务完成前运行入口保持视觉不可用,但仍可点击查看“当前无可运行版本”,不能使用会阻断说明交互的原生 disabledaria-disabled;完成后才允许进入运行表现层。切回资源总览只修改前端展示态,不伪造后端预览暂停结果。
  • 资源管理从当前 GameCreationAppManifest(包含可选 versions)、合法 Agent 文本回执、已导入附件和已完成任务明确登记的产物派生资源,固定按文档、项目版本、美术资源、音乐音效资源分区;未知任务产物不再兜底为版本,未完成任务或未在 artifacts 中登记的任意本地音频也不冒充正式资源。按依赖 / 按类型 使用各自前端排列,dependency 模式额外绘制当前 manifest 与资源投影可证明的依赖关系。排列与图层都不写回 manifest,不能推断或伪造缺失依赖。
  • 资源卡支持点击聚焦、搜索和类型筛选。2026-07-28 起完成两套二维坐标与本地 CAS sidecar2026-07-31 起 dependency 模式增加不持久化的原生 SVG 关系图层。2026-08-03 mentor 决定暂缓资源总览卡片拖动,当前卡片不挂载 Pointer Down / Move / Up / Cancel 拖动入口,只允许自动布局和点击聚焦。聚焦态替换中央主视窗内容,保留左侧导航、右侧对话和底部 Agent 状态栏,退出后恢复搜索、布局模式、滚动位置与选中资源;不提供通用工具栏、工具侧边栏或可拖动标题栏。阶段四已补齐安全本地文档、扩展美术媒体与音频聚焦,正文独立滚动,视频 / 音频使用内置媒体控件,失败显示空态。该资源总览边界不限制后续素材创作无限画布内的图片图层移动/缩放、生成和正式回写。
  • 运行表现层首版直接嵌入当前项目的 loopback 游戏画面,并展示上一项 / 暂停继续 / 下一项切片控制、素材信息和数值微调面板。preview.start 启动本地 server 后把真实 URL 回写工作台,preview.open 只激活客户端内运行视图,不再调用系统浏览器;切片、参数调整和自然语言新增调节项首版仍只保留本地 UI 草稿,不修改代码或 manifest。
  • 右侧继续复用现有 Project Supervisor 会话、Runtime 澄清和确认链路;输入区展示 严格审批 / 风险审批 / 无需审批 独立面板。P0 只有严格审批可选;风险审批和无需审批保持视觉不可用但允许点击查看原因,不替代 Runtime 的逐动作权限、确认、sandbox 或 reconciliation 门禁。风险 Rank 算法记录在 docs/project-memory/todos/【待解决】AI游戏创作高风险审批Rank-2026-07-20.md,前端不得自行计算。
  • 底部状态栏默认展示策划、美术、程序 3 组,并允许在同一栏展开数值、音频、发布组;状态来自 manifest 与当前 Supervisor run 的 Runtime,悬停显示当前任务与进度。累计泥点必须等待后端计费归因投影;Agent.md 编辑和自定义 Skill 在来源审核、版本、权限、sandbox 与回滚合同完备前不向普通用户开放。
  • 当前 run 专业状态与项目历史成果分离:状态继续严格匹配当前 parentRunId;已有文本成果从专业 Agent 持久对话中合法的 agent-finalization-<32 lower hex> assistant 恢复,并以“历史成果”来源投影到资源管理文档区。新 run 失败、待确认、候选为空或持久对话瞬时读取失败不得清除已恢复的旧成功回执,普通失败 assistant 也不得被当作成果。
  • Tauri read_local_conversation 的公开消息 DTO 必须保留持久记录中的可选 messageId;该字段是区分合法 finalization 与普通 assistant 的必要身份,不能只留在 JSONL 私有记录中。旧记录没有 messageId 时继续返回 null,不得为兼容界面伪造 ID。
  • 当前独立 App 只交付横屏桌面工作台,Tauri client 默认窗口为 1280×800,最小窗口为 1280×720;用户不能继续缩小到破坏双栏结构的窄屏尺寸。桌面工作台占满壳内剩余视口,四周只保留必要安全边距;右侧消息、Runtime 状态和输入区保持在同一栏内,专业状态过长时只滚动 Runtime 区,不得把输入区、底部 Agent 状态栏或整页撑出视口。≤760px 的浏览器样式仅保留开发兼容,不作为当前客户端交付口径。
  • 项目总控失败摘要必须提供“在当前项目重试总控”的明确恢复动作并说明不会新建项目;旧父 run 下仍在运行的专业 Agent 继续展示真实状态。terminal 总控下不得单独重试专业 Agent,避免创建没有可交付父级的孤立委派;新总控 run 负责重新建立后续专业委派合同。
  • 外部 Runner 模式下,重试命令的 Session Runtime 快照可能仍指向旧 run,因此响应必须额外返回精确 acceptedRunId 作为入队受理事实,前端据此锁定恢复按钮并持续同步该 run,不能用 state.runId 是否立即切换判断失败。同一 agentId + sourceRunId 已存在非终态 retry successor 时必须幂等复用并返回其 acceptedRunId,不得再次入队或追加第二条 retry audit。
  • 该界面切片只允许受限的 loopback iframe,不得引入远程 URL、第二套资产模型、前端版本替换真相或前端计费结论。资源关系图只能读取当前 manifest 与资源投影做派生展示,不得成为前端正式资源关系真相。

资源画布布局持久化 V1

2026-07-28 起,资源画布布局持久化以工作台 PRD §5.2 和 §7.2 为唯一编码合同,实施边界如下:

2026-08-03 需求收口:资源卡手动拖动暂缓。历史 sidecar 坐标继续只读恢复,自动布局仍可为资源集合协调提交 CAS;sidecar schema、布局读取、FIFO、跨窗口系统锁和 Rust CAS 基础设施全部保留,但当前没有用户手动布局入口。

  • dependency 与 type 分别保存到 .agent/workbench/resource-layouts/dependency.jsontype.jsonschema 固定为 game-creator-resource-layout.v1。布局是本地工作台 UI sidecar,不进入 manifest、游戏项目 mutation revision、Runtime verification、Agent 产物、资产或云端事实。
  • x / y 使用 section 内容坐标,前后端合法域固定为 0..=1_000_000updatedAt 使用 Unix 毫秒。文件缺失只合成 revision 0 空布局且不产生只读副作用。每个 mode 按 projectId + mode + expectedRevision 做 CAS,成功 revision 加一,冲突返回最新完整布局且不写文件。revision 虽在 Rust 中使用 u64,但跨 JSON / Tauri / TypeScript 的合法域固定为 0..=Number.MAX_SAFE_INTEGER;共享 DTO 序列化与反序列化、Tauri 输入和前端 IPC 响应均执行同一边界校验。前端自动坐标在 IPC 前按坐标合同验证,dependency 深度过大时只饱和显示列而不修改 Rust 返回的原始深度;纵向避让也不得越过上限。
  • Tauri 命令固定为 read_local_project_resource_canvas_layoutupdate_local_project_resource_canvas_layout。写命令先只读确认有效 manifest,再通过持久 .layout.lock 入口获取句柄级跨窗口系统锁,并在锁内复核 projectId、重新读取当前 sidecar。Unix 使用 flock,Windows 使用不共享文件句柄;释放只通过句柄 Drop / 进程退出完成,不使用 mtime stale 回收,也不删除锁文件。其余写入继续复用安全路径、链接检查、容量上限、恢复副本与原子替换能力;不能只依赖 React 状态或进程内锁。
  • 前端从当前项目开发大组件中拆出纯布局模型与持久 Hook。默认布局、碰撞检查、资源增删协调和 section 边界由纯模型负责;读取、异步身份、CAS、错误回滚和冲突载入由 Hook 负责。Hook 以 projectPath + projectId + mode epoch 隔离异步结果,资源变化不取消首读或在途保存;自动协调写入经同一 FIFO 串行提交,每笔都使用最近一次成功 / 冲突响应的权威 revision。资源卡是普通可点击按钮,不绑定卡片级 Pointer 拖动处理器;指针移动不修改 CSS 坐标、不调用 SVG preview、不提交手动布局 CAS。
  • 新资源只在第一次进入某个 mode 时计算默认不重叠位置;全部现存坐标保持不变。搜索、筛选、窗口 resize 和 mode 切换不得重排或回写已有坐标,窄视图通过 section 画布范围与滚动访问,不裁切持久坐标。
  • type 默认布局固定按 subtype -> mediaType -> label -> id 排序。manifest 资产的 subtype 使用 asset.kind,任务产物、导入附件和 Agent 文本成果使用稳定的来源 fallback;subtype 必须进入资源协调签名,不能因 MIME 相同而退化成按名称混排。
  • 自动协调保存失败时保留当前会话布局;CAS 冲突载入对方最新布局,需要继续协调时最多追加两次重试,持续跨窗口竞争时停止自旋。用户提示只说明“布局已在其他窗口更新”,不要求重新拖动。损坏、未知 schema、身份冲突、超限与链接文件失败关闭,不能用空布局覆盖原文件。
  • 本布局持久化切片不包含资源关系线、资源替换、聚焦态持久化、分区高度、分区内容倍率、整个画布平移、搜索 / 筛选条件、当前 mode,也不修改 api-server 或 SpacetimeDB。资源关系线、当前会话内中央聚焦、分区独立高度与内容倍率已在后续独立前端切片接入,都不改变本段 sidecar 合同;其余 P1 能力继续独立实施。
  • 本资源总览布局 sidecar 不包含资源关系线、资源替换、聚焦态持久化、资源总览缩放 / 平移、搜索 / 筛选条件、当前 mode,也不修改 api-server 或 SpacetimeDB。资源关系线与当前会话内中央聚焦已在后续独立前端切片接入;素材创作 viewport 和图层使用独立草稿 schema,不能写入 game-creator-resource-layout.v1

历史实施顺序已完成 TypeScript / Rust DTO、Tauri sidecar/CAS、前端纯模型与持久 Hook。二维手动拖动接线现已暂缓;重新开放前必须先更新 PRD 与验收合同。任何后续步骤不得用 localStorage、manifest 字段或只在当前 React 会话有效的状态冒充项目持久化。

2026-07-30 前端并发与性能加固形成的 scope epoch、scope 内单写者 FIFO、手动意图折叠和冲突恢复实现继续保留为底层技术资产;当前用户入口只消费布局读取与资源自动协调。默认布局仍使用 section 分组与二维占用索引,dependency 使用按列单调游标,type 使用单调 slot 游标;4096 项双模式自动布局性能回归继续防止恢复到接近 O(N³) 的主线程阻塞实现。手动拖动帧预算、局部 preview 性能和重新拖动提示不再是当前验收条件。

2026-07-30 Rust 并发与零副作用加固状态:资源布局锁已由 create_new + mtime stale 删除 改为持久锁文件上的 Unix flock / Windows 独占句柄,活锁即使 mtime 很旧也不能被另一个写入者回收,释放后仍复用同一文件实例。更新命令携带只用于校验的 expectedProjectId,在任何目录创建前先读取 manifest 并拒绝旧项目窗口,锁内再次核对 projectId;不存在根、非项目根、损坏 manifest 和路径重建后的旧窗口均不产生 .agent/workbench。revision 在共享 serde、Tauri 命令和前端 IPC 三层限制到 Number.MAX_SAFE_INTEGER,达到上限时保持原文件并失败关闭,不能让 Rust u64 值在 JavaScript 中失真后击穿 CAS。

资源依赖关系图层 V1.1

2026-07-31 起,项目工作台使用“Tauri Rust 只读拓扑 + 前端原生 SVG 几何”的资源依赖图层;不修改 layout sidecar、既有布局模型、api-server 或 SpacetimeDB

  • read_local_project_resource_graph 读取当前 manifest、前端资源卡身份列表和最多 32 MiB 的安全 Agent DB 尾部,通过 Rust 构建稳定 read model;读取使用既有 Agent DB 普通文件 / 链接 / 追加锁边界,不新增数据库或 sidecar。返回资源 ID、引用边、聚合任务流、producer assignment、独立 dependencyDepths、循环集合、unresolved 外部 ID、局部连接索引和 producerMappingTruncated
  • 精确引用把 manifest 资产 source.referenceResourceIds 唯一匹配到另一资产的 source.resourceId,再转换为本次资源卡 ID;无匹配、多匹配、重复卡片或已删除资源只记录为 unresolved / 忽略,不生成边。引用边按 sourceResourceId + targetResourceId 稳定去重;前端 resourceDependencyGraphModel.ts 再做一次 DTO 端点防御过滤,避免异步切项目时出现幽灵线。
  • task flow 只读取存在于当前 manifest 的任务依赖。画布资产 producer 仅接受 agent.runtime.canvas.asset_generate 中经 manifest 校验的 assetId -> agentIdExternal Editor 返回并保存在 source.taskIdtask-1 等身份属于平台生成任务,禁止复用为 manifest task。多个有效 Agent 对同一资产形成冲突或证据缺失时,不生成该资产对应 task flow。任务产物 / Agent 回执继续使用资源投影中已有的 manifest task 身份。
  • 资源按可信 producer 分组,每个 sourceTaskId -> targetTaskId 只生成一个聚合 flow;前端布局以 O(S+T) 成员关系消费该超边,禁止资源笛卡尔积。task-flow 不进入 SVG 或画布无障碍关系说明。局部连接索引仍保存 resource 关联的 reference edge ID / task flow ID,不预先展开 S×T 邻接矩阵。
  • 资源引用图和完整任务依赖图在 Rust 分别使用迭代式强连通分量分析。任务环检测不能依赖可视 task flow 是否有两端资源,否则无产物任务参与的环会漏报;循环边只带 cyclic 标记,不触发递归展开。
  • ResourceDependencyOverlay.tsx 使用原生 SVG path/marker;每个固定资源分区在自己的 .game-resource-plane 内挂载一个绝对定位 SVG,并统一 pointer-events: none。SVG 与卡片直接使用同一逻辑 x / y、权威卡片尺寸、父 plane CSS scale 和 viewport scroll,不再用 getBoundingClientRect 把四区卡片屏幕坐标拼到全局图层。画布只用橙色实线与橙色实心箭头表示同类型 asset-reference;task-flow、跨分类关系均不进入渲染。dependency 专用 48px / 40px 行列间距为相邻卡片预留可辨认线身;相关簇窄层居中减少同组边长差。不同横向层级且卡片间隙不少于固定阈值时优先从左右端口横连,同列、同深度或横向空间不足时才从上下端口纵连。同一卡片同侧的精确边按对端坐标与稳定边 ID 排序,在卡片边界内有界分配端口。同行 / 同列使用直线,需转向时只使用正交线段和最大 10px 二次曲线小圆角;自环保留卡外贝塞尔闭环。目标锚点为 marker 预留固定间隙,marker 使用用户空间尺寸并允许自身 overflow。不引入 D3、React Flow 或其它图表依赖。
  • asset-reference 的 source / target 是同一资源时使用卡片右侧外绕贝塞尔闭环,两个锚点分开且 marker 保留在返回锚点;路径不穿过卡片。dependency section 在现有 extent 外额外增加 64px 右侧视觉 gutter,确保最右卡片的闭环和箭头可滚动显示;不改卡片坐标、resourceCanvasLayoutModel.ts 或 sidecar。
  • 图层只从 SVG 父 plane 找到所属 section viewport;每个分区最多一个 ResizeObserver,并把该区 scroll / window resize 合并到单个 RAF,仅维护 scroll / scale / client size 换算后的逻辑 viewport。分区 viewport 通过浏览器原生 overflow 同时裁剪本区卡片和 SVG,因此不需要全局四区 clipPath,也不会穿过标题栏或泄漏到相邻分区。搜索决定精确引用端点是否参与几何;在 viewport 中两端可见时绘制完整路径,一端可见时绘制对称的 incoming / outgoing 边界继续线,两端离屏时不渲染。type 模式不挂载图层且释放 graph state;项目身份作为 key,切换 mode、项目或工作台卸载都会销毁旧 SVG。
  • 基础 positions 保持稳定;卡片 Pointer Move 不进入 SVG preview,只有搜索、选择、项目切换、真实 positions 或 section origin 变化才重新协调图层。SVG 几何从不持久化。
  • Rust、前端 DTO/SVG 和工作台 AppSurface 回归覆盖生产 task-1 数据形状、真实 producer、证据缺失、精确引用、去重、无效 ID、完整任务环、4096 链式拓扑、聚合复杂度、搜索过滤、选择高亮、稳定 Observer、type 模式卸载与项目切换销毁。局部拖动更新与真实 Chromium 拖动性能目标暂缓。

2026-08-03 阶段五加固,2026-08-05 明确截断信任边界:Rust read model 把 producer assignment 与布局深度分离。完整任务图先经 SCC 压缩形成可信 producer 的任务深度下限,精确资源引用图再经迭代式 SCC 压缩和确定性最长层级传播形成所有可见资源的 dependencyDepths;因此同一任务的派生资源、缺少 producer 审计的 manifest 资源和引用环都能稳定满足“被引用资源在前、引用资源在后”,没有引用关系的资源保持深度 0producerMappingTruncated=true 只表示有界 Agent DB 尾部不足以证明 producer:前端必须失败关闭 producerAssignmentstaskFlows 及其 cyclicTaskIds,但继续严格校验并消费 Rust 从当前 manifest、精确引用和仍可信下限构建的 dependencyDepthsreferenceEdges、connection index 中的 reference 关系、cyclicResourceIds 和 unresolved reference 同样继续有效。前端不递归推导正式依赖层级。dependency 模式以 scope 化 idle / loading / ready / failed 状态阻断布局 Hook;图终态前不创建 fallback、不读取或写入 sidecar,图失败只以空图初始化一次。读取已有 dependency 布局时保留全部 manuallyPlaced=true 坐标,把 manuallyPlaced=false 作为可派生自动位置按最终深度重新协调;结果未变化时不写入。任务流仍按任务对聚合,只作为布局超边使用,不生成资源笛卡尔积或 SVG。

2026-08-03 阶段六:正式迭代版本直接扩展本地 .agent/manifest.json,不新增 checkpoint / layout sidecar / SpacetimeDB 平行业务真相。共享 Rust / TypeScript 合同新增可选 versions: GameIterationVersion[];旧项目缺失字段时只读为空,不回填。Rust 在 manifest 读写边界校验版本唯一性、父先于子、根/原因一致、父子修订与时间单调、slot 唯一和 JavaScript 安全整数,并在覆盖已有 manifest 前要求磁盘版本数组是新数组的逐项相等前缀,从存储边界保证历史记录不可修改、删除或重排。2026-08-13 起,自主首板在当前 revision 的 preview.validate 成功结果和持久试玩回执均落盘后,幂等追加唯一首条 initial 版本,并以稳定 asset:<manifest asset id> 槽位绑定当时全部已登记资源;失败试玩、静态 smoke、checkpoint 和普通预览状态不得触发版本创建,恢复重放和已有版本项目也不得重复追加。

工作台资源投影只从 manifest.versions 构建版本卡,按数组追加顺序生成稳定“版本 N”标题;不再接收前端独立 projectVersions 注入。resourceBindings.resourceId 只解释为 manifest asset ID,并映射到现有 asset:<id> 卡片。选中版本后在 dependency / type 两种布局中高亮当前仍存在的绑定资产;缺失历史资产只留在版本聚焦详情,不能合成幽灵卡或猜测 External Editor resource ID。版本聚焦复用中央只读容器,展示身份、修订、原因、父版本、直接子版本、创建时间与 slot 绑定。本阶段不提供版本创建、替换、切换、回滚、测试切片或运行态消费入口。

历史命令式 drag preview 句柄与局部连接索引可以保留,但项目工作台不再向资源卡传入该入口。拖动热路径、4096 张真实卡片拖动重渲染和 Chromium p95 门槛统一暂缓;当前回归只要求 Pointer Move 不改变卡片坐标、SVG path 或布局 revision。ResizeObserver 仍保持单图层单实例,任何实时 DOM 几何都不得通过 Tauri IPC 往返 Rust。

分阶段实施

  1. platform-agent 建立游戏创作专业组与种子任务图契约。
  2. 在共享契约中补本地项目 manifest、内置命令和权限枚举。
  3. 扩展 apps/ai-game-creator-shell 的本地能力:项目目录、文件写入、受限命令、本地 HTTP 预览。
  4. 用户侧项目开发页提供资源 / 运行工作台、当前项目的 loopback 游戏画面、陶泥儿对话、上传结果和 Agent 状态栏;开发专用单 Agent 对话、原始任务 / 文件面板、预览诊断面板和命令日志只在开发构建的独立开发窗口展示。
  5. 将美术组、音乐组接入现有画板与外部生成队列。
  6. 从现役网站画布抽取共享 image-canvas-core/react,先让网站改为消费共享源码,再由 Tauri adapter 接入;不得复制整个画布目录。
  7. 实现 Tauri 草稿/media/staging/commit/transaction/event 合同和跨窗口锁、CAS、幂等与崩溃恢复。
  8. 在项目工作台接入 create/refine 状态机、保存后的 manifest 即时投影、依赖图与两种布局协调,以及 project/session/selection/query 焦点守卫。
  9. 按权威专题验收矩阵同时完成 Web、Tauri、共享包、Rust 持久化和 AppSurface 证据后,才开放正式入口。

v1 验收

  • 用户能创建本地 Web 游戏项目。
  • 用户进入项目开发页后能看到资源管理主视窗、陶泥儿对话栏和底部策划 / 美术 / 程序 Agent 状态栏;1280×720 最小横屏窗口、1280×800 默认窗口和更大桌面窗口均不得出现页面级横向 / 纵向溢出,对话输入与底部 Agent 状态栏始终位于视口内。
  • 资源管理可在按依赖 / 按类型之间切换、搜索资源并点击打开当前资源详情;dependency 画布只展示可验证的橙色精确资源引用,聚合任务流只参与自动布局并可在详情中读取。搜索过滤精确引用端点。资源卡不可拖动,Pointer Move 不更新坐标、线段或手动布局;所有展示数据来自当前 manifest、当前资源投影或当前项目导入附件。
  • “新增资源”和“精修资源”进入共用中央区域中的素材创作无限画布;图片导入、画布平移/缩放、图层选择/移动/缩放、撤销重做、基础编辑、生成、导出和 Tauri 正式保存形成完整闭环。保存后不刷新、不重开即可进入 manifest、依赖图、布局和选中流程,迟到结果不能覆盖用户后来切换的项目、状态、选择或搜索意图。
  • 资源管理可在按依赖 / 按类型之间切换、搜索资源并点击打开当前资源详情;dependency 模式展示可验证的资源引用和聚合任务流,搜索过滤端点、选择高亮直接上下游。资源卡不可拖动,Pointer Move 不更新坐标、线段或手动布局;所有展示数据来自当前 manifest、当前资源投影或当前项目导入附件。
  • 首个 code-prototype 任务未完成时运行入口不可进入并给出可感知提示;完成后可进入运行表现层,真实预览直接加载到客户端内受限运行容器。
  • 审批档位通过独立弹出面板切换,默认严格审批;界面选择不得绕过 Runtime 现有确认门禁。
  • 聊天输入 /plan 可在普通聊天消息里查看下一轮分工计划,不读取任务文件、不启动 run、不修改项目,也不新增普通用户计划面板。
  • 聊天输入 /guide 可在普通聊天消息里查看普通用户操作导引,不读取文件、不启动 run、不启动预览、不写项目,也不新增普通用户导引面板。
  • 聊天输入 /progress 可在普通聊天消息里查看项目进度,不读取文件、不启动 run、不启动预览、不导出试玩包、不写项目,也不新增普通用户进度面板。
  • 用户侧目标态看到当前工作区项目名 / 路径、最近 run、预览状态、任务完成数 / ready 数、资产数量 / 来源分布、最近命令摘要、project-supervisor 聊天框、上传入口和专业 Agent 协作状态列表;聊天输入 /brief 可在普通聊天消息里生成当前项目简报并提供 /next 草稿,不新增普通用户面板;聊天输入 /risks 可在普通聊天消息里查看当前项目风险并提供首个风险处理草稿,不新增普通用户面板;聊天输入 /review 可在普通聊天消息里查看 Evaluator 评审、返工焦点和返工路线并提供读取评审记录或继续修复草稿,不新增普通用户面板;聊天输入 /context 可在普通聊天消息里查看生成上下文来源并提供读取首个上下文或查看黑板草稿,不新增上下文面板;聊天输入 /timeline 可在普通聊天消息里查看项目活动时间线并提供最近日志、trace 或历史草稿,不新增时间线面板;聊天输入 /playtest 可在普通聊天消息里查看最近 run 是否可试玩、当前预览状态和 Playtest 任务状态并提供启动或打开预览草稿,不新增普通用户试玩面板;聊天输入 /handoff 可在普通聊天消息里生成当前项目交接摘要并提供 /next 草稿,不新增普通用户面板;聊天输入 /runs 可在普通聊天消息里列出已加载 Run 历史读取命令,不新增普通用户面板;聊天输入 /run-files 可在普通聊天消息里列出 Agent 运行辅助文件读取命令,不新增普通用户面板;聊天输入 /internals 可在普通聊天消息里列出项目内部真相源读取命令,不新增内部文件面板;聊天输入 /art 可基于当前 manifest 盘点美术素材并提供生成或读取草稿,不新增美术面板;聊天输入 /audio 可基于当前 manifest 盘点音频素材并提供登记或读取草稿,不新增音频生成系统;聊天输入 /publish 可基于当前 manifest 和最近 run 生成发布准备清单并提供运行、trace、继续或导出草稿,不新增发布面板;聊天输入 /listing 可基于当前 manifest 和最近 run 汇总作品页标题、卖点、标签口径、封面素材和发布说明状态并提供读取发布说明或发布准备草稿,不新增作品页面板;聊天输入 /cover 可基于当前 manifest 和最近 run 准备封面与缩略图检查并提供运行、美术或作品页草稿,不新增封面面板;聊天输入 /screenshots 可基于当前 manifest 和最近 run 准备宣传截图清单并提供运行或作品页草稿,不新增截图面板;聊天输入 /trailer 可基于当前 manifest 和最近 run 准备试玩短视频脚本并提供运行或交付草稿,不新增录屏面板;聊天输入 /faq 可基于当前 manifest 和最近 run 准备试玩常见问答并提供运行或交付草稿,不新增 FAQ 面板;聊天输入 /post 可基于当前 manifest 和最近 run 准备社区发布文案并提供运行或上架草稿,不新增社区发布面板;聊天输入 /store 可基于当前 manifest 和最近 run 准备上架资料清单并提供运行或作品页草稿,不新增上架面板;聊天输入 /media-kit 可基于当前 manifest 和最近 run 准备媒体资料包清单并提供运行、截图或发布说明草稿,不新增媒体包面板;聊天输入 /release-notes 可基于当前 manifest 和最近 run 准备试玩更新说明并提供运行、资料包或发布说明草稿,不新增更新说明面板;聊天输入 /known-issues 可基于当前 manifest 和最近 run 准备已知问题清单并提供运行、评审或交付草稿,不新增已知问题面板;聊天输入 /export 确认后把当前可试玩原型导出为本地试玩 ZIP,聊天输入 /exports 可只读列出已导出的本地试玩包;project-supervisor 主聊天与专业 Agent 协作状态列表在 /llm-status 后只显示各 Agent 当前 LLM provider / 模型 / 流式 / API Key 读取状态,但不显示密钥本体;最近项目资产入口显示本地路径、kind、mediaType 和来源类型,并可一键填入 /read 草稿,开发环境通过独立窗口查看任务拆分、专业组细节、产物、文件面板、嵌入预览以及 .agent/logs/command.log / preview.log / agent.log
  • 聊天输入 /llm-routes 会触发同一只读 LLM 配置检查,在普通聊天消息里列出全局 LLM 和每个 agent resolved 后的 provider 路由、模型、API 类型、流式开关、API Key 是否已读取、单独路由数量和缺口数量;该命令不请求上游、不显示 API Key 本体、不写本地项目、不新增普通用户配置面板,缺口处理只提供 /config 草稿。
  • 聊天输入 /goal 可在普通聊天消息里查看创作目标来源,不读取 spec、上下文或 trace 文件,也不新增普通用户目标面板。
  • 聊天输入 /progress 可在普通聊天消息里查看项目阶段、任务完成度、最近 run、预览、素材和交付进度,不读取文件、不启动 run、不启动预览、不导出试玩包、不写项目,也不新增普通用户进度面板。
  • 聊天输入 /spec 可在普通聊天消息里查看创作规格包,不读取规格文件、不启动预览、不写项目,也不新增普通用户规格面板。
  • 聊天输入 /mvp 可在普通聊天消息里查看本轮最小可玩范围、当前状态、试玩包状态和暂不做事项,不读取文件、不启动预览、不导出试玩包,也不新增普通用户 MVP 面板。
  • 聊天输入 /pitch 可在普通聊天消息里查看试玩定位与卖点,不读取文件、不启动或打开预览、不直接继续 run,也不新增普通用户定位面板。
  • 聊天输入 /demo 可在普通聊天消息里准备 30 秒试玩讲解稿,不读取文件、不启动或打开预览、不导出试玩包、不发布作品,也不新增普通用户讲解面板。
  • 聊天输入 /rules 可在普通聊天消息里查看玩法操作与规则口径,不读取设计文件、不启动预览、不直接继续 run,也不新增普通用户规则面板。
  • 聊天输入 /tutorial 可在普通聊天消息里查看新手引导检查,不读取设计文件、不启动或打开预览、不直接继续 run,也不新增普通用户引导面板。
  • 聊天输入 /mobile 可在普通聊天消息里查看移动试玩检查,不读取代码文件、不启动或打开预览、不直接继续 run,也不新增普通用户移动适配面板。
  • 聊天输入 /compatibility 可在普通聊天消息里准备兼容性说明,不读取文件、不启动或打开预览、不导出试玩包、不上传云端、不发布作品、不写项目,也不新增普通用户兼容性面板。
  • 聊天输入 /accessibility 可在普通聊天消息里查看可读性与无障碍检查,不读取代码或 trace 文件、不启动或打开预览、不直接继续 run,也不新增普通用户无障碍面板。
  • 聊天输入 /localization 可在普通聊天消息里查看本地化与文案检查,不读取文件、不启动或打开预览、不导出试玩包、不上传云端、不发布作品、不写项目,也不新增普通用户本地化面板。
  • 聊天输入 /performance 可在普通聊天消息里查看性能与加载检查,不读取产物或日志文件、不启动或打开预览、不直接继续 run,也不新增普通用户性能面板。
  • 聊天输入 /polish 可在普通聊天消息里查看试玩前打磨清单,不读取文件、不启动预览、不导出试玩包、不写项目,也不新增普通用户打磨面板。
  • 聊天输入 /credits 可在普通聊天消息里查看素材署名与来源口径,不刷新资产、不读取素材清单、不导出试玩包,也不新增普通用户署名面板。
  • 聊天输入 /blockers 可在普通聊天消息里查看当前阻塞项,不读取文件、不启动预览、不导出试玩包、不写项目,也不新增普通用户阻塞面板。
  • 聊天输入 /ready 可在普通聊天消息里查看试玩就绪度,不读取文件、不启动预览、不导出试玩包、不写项目,也不新增普通用户就绪度面板。
  • 聊天输入 /evidence 可在普通聊天消息里查看当前验证证据台账,不读取文件、不启动或打开预览、不导出试玩包、不写项目,也不新增普通用户证据面板。
  • 聊天输入 /deps 可在普通聊天消息里查看任务依赖链,不读取任务文件、不启动 run、不修改项目,也不新增普通用户依赖面板。
  • 聊天输入 /revise 可在普通聊天消息里准备下一轮改版说明草稿,不读取文件、不继续 run、不启动预览、不导出试玩包、不写项目,也不新增普通用户改版面板。
  • 聊天输入 /privacy 可在普通聊天消息里查看隐私与导出边界,不读取文件、不导出试玩包、不启动预览、不写项目,也不新增普通用户隐私面板。
  • 聊天输入 /criteria 可在普通聊天消息里查看当前任务验收标准和预期产物,不读取任务文件或 trace 文件,也不新增普通用户验收面板。
  • 聊天输入 /groups 可在普通聊天消息里查看六个专业组进度和下一步任务,不读取任务文件或 trace 文件,也不新增普通用户专业组面板。
  • 聊天输入 /balance 可在普通聊天消息里查看数值与难度口径,不读取数值表、不启动预览、不直接继续 run,也不新增普通用户数值面板。
  • 聊天输入 /budget 可在普通聊天消息里查看最近 run 轮次和工具调用预算,不读取 trace 文件,也不新增普通用户预算面板。
  • 聊天输入 /qa 可在普通聊天消息里查看质量检查清单,不读取 trace 或日志文件、不启动或打开预览,也不新增普通用户 QA 面板。
  • 聊天输入 /changes 可在普通聊天消息里查看最近生成变更,不读取产物或日志文件、不执行 checkpoint diff,也不新增普通用户变更面板。
  • 聊天输入 /todo 可在普通聊天消息里查看下一轮小步清单,不读取任务文件、不启动 run、不修改项目,也不新增普通用户小步面板。
  • 聊天输入 /test-plan 可在普通聊天消息里准备手动测试计划,不读取文件、不启动或打开预览、不直接继续 run,也不新增普通用户测试面板。
  • 聊天输入 /audience 可在普通聊天消息里查看首批试玩对象,不读取文件、不启动或打开预览、不导出试玩包、不写项目,也不新增普通用户对象面板。
  • 聊天输入 /invite 可在普通聊天消息里准备试玩邀请文案,不读取文件、不启动或打开预览、不导出试玩包、不写项目,也不新增普通用户邀请面板。
  • 聊天输入 /bug-report 可在普通聊天消息里准备缺陷复现记录,不读取文件、不启动或打开预览、不导出试玩包、不写项目,也不新增普通用户缺陷面板。
  • 聊天输入 /survey 可在普通聊天消息里准备试玩问卷问题,不读取文件、不启动或打开预览、不导出试玩包、不写项目,也不新增普通用户问卷面板。
  • 聊天输入 /cover 可在普通聊天消息里准备封面与缩略图检查,不截屏、不裁剪、不读取文件、不启动或打开预览、不导出试玩包、不上传云端、不发布作品、不写项目,也不新增普通用户封面面板。
  • 聊天输入 /screenshots 可在普通聊天消息里准备宣传截图清单,不截屏、不读取文件、不启动或打开预览、不导出试玩包、不写项目,也不新增普通用户截图面板。
  • 聊天输入 /trailer 可在普通聊天消息里准备试玩短视频脚本,不录屏、不读取文件、不启动或打开预览、不导出试玩包、不上传云端、不写项目,也不新增普通用户录屏面板。
  • 聊天输入 /faq 可在普通聊天消息里准备试玩常见问答,不读取文件、不启动或打开预览、不导出试玩包、不上传云端、不写项目,也不新增普通用户 FAQ 面板。
  • 聊天输入 /post 可在普通聊天消息里准备社区发布文案,不上传云端、不发布作品、不读取文件、不启动或打开预览、不导出试玩包、不写项目,也不新增普通用户社区发布面板。
  • 聊天输入 /store 可在普通聊天消息里准备上架资料清单,不上传云端、不发布作品、不读取文件、不启动或打开预览、不导出试玩包、不写项目,也不新增普通用户上架面板。
  • 聊天输入 /media-kit 可在普通聊天消息里准备媒体资料包清单,不截屏、不录屏、不读取文件、不启动或打开预览、不导出试玩包、不上传云端、不发布作品、不写项目,也不新增普通用户媒体包面板。
  • 聊天输入 /release-notes 可在普通聊天消息里准备试玩更新说明,不读取文件、不启动或打开预览、不导出试玩包、不上传云端、不发布作品、不写项目,也不新增普通用户更新说明面板。
  • 聊天输入 /known-issues 可在普通聊天消息里准备已知问题清单,不读取文件、不启动或打开预览、不导出试玩包、不上传云端、不发布作品、不写项目,也不新增普通用户已知问题面板。
  • 聊天输入 /feedback 可在普通聊天消息里准备试玩反馈和修改说明,不读取文件、不启动预览、不直接继续 run,也不新增普通用户反馈面板。
  • 聊天输入 /retention 可在普通聊天消息里准备首轮复玩/留存观察清单,不读取文件、不启动或打开预览、不导出试玩包、不上传云端、不发布作品、不写项目,也不新增普通用户留存面板;首版不做真实埋点、留存报表、用户画像、A/B 实验、排行榜或账号留存。
  • 聊天输入 /share 可在普通聊天消息里准备试玩交付清单,不导出试玩包、不列出历史包、不上传云端,也不新增普通用户分享面板。
  • 聊天输入 /listing 可在普通聊天消息里准备作品页文案清单,不读取发布说明、不上传云端、不发布作品,也不新增普通用户作品页面板。
  • 聊天输入 /passes 可在普通聊天消息里列出最近 run trace 中 .agent/passes/ 轮次产物读取命令,不直接读取轮次文件,也不新增普通用户轮次面板。
  • 生成代码和资产进入用户本地项目目录。
  • 本地 HTTP 预览能启动,并在客户端项目运行工作台内展示可玩原型。
  • 美术/音乐资产能从画板链路回流到本地项目。
  • 短期记忆、长期记忆、项目黑板和角色私有记忆按授权本地项目路径读写;普通用户仍只通过聊天命令访问短期 / 长期 / 黑板记忆,角色私有记忆只在单 agent 对话和生成 loop 中按目标 agent 读取。
  • 结构化对话记录按授权本地项目路径追加 JSONL;正式聊天读取 Supervisor active Session 与只读 legacy 项目历史,开发单 Agent 对话读取对应 Agent Session。开发入口已支持本地 Session 新建、切换、归档和分叉,但不提供云端同步。
  • Agent 状态列表从 .agent/manifest.json 的任务 / 角色清单、.agent/run.latest.json / .agent/runs/<runId>.json 的 step、taskGraph、passPlans、lifecycleStatus,以及 read_game_creator_agent_runtimes 批量读取的 .agent/runtime/agents/<taskId>.json 和最近任务派生;v1 不新增独立状态数据库,也不承诺完整后台 runner。
  • App 启动先检查平台登录态;登录后进入同一个客户端首页,不再有面向用户的启动器 / 主窗口切换概念。首页按 做游戏 / 做素材 / 做方案 保存 game / art / doc 初始意图,输入状态按文字与附件 token 的顺序保存,附件以文件名 token 内嵌在输入框中而非堆叠在下方;提交时才将 token 转为 LLM 可读的 {1st attachment} 引用。普通 Enter 在输入法组合态结束后自动在系统“文档/Genarrative GameAgent”下原子分配唯一工作区、初始化本地项目、导入附件,并把首条需求直接投递给 active project-supervisor Session 的后台 Runtime,随后写入最近项目并切到项目开发页;Shift+Enter 保留换行。Windows 使用系统 Documents 路径,Linux 使用 XDG DocumentsmacOS 使用用户 Documents;前端不得显示或持久化 /tmp 作为默认项目路径,精确 /tmp/genarrative-ai-game-draft 只允许由测试显式注入为 fixture。普通与 game-chat release 都必须在 Vite 生成最新 frontendDist 后、Tauri 嵌入资源前扫描实际构建产物;命中该旧 Linux 默认路径或无法安全遍历产物时构建失败,禁止复用 gitignored 的旧 dist。原“开启创作”加号按钮保持手动选择目录:点击后弹出原生目录选择,目标目录存在且非空时必须二次确认,再调用 init_local_game_project 完成同一后续链路。项目页和首页通用“打开项目”没有手填默认路径;picker 未携带已有工作区时由操作系统决定初始位置。缺少 active Session 时先创建并激活;成功后清空首页草稿,取消或创建失败时在首页回显状态,首页响应式断点与应用外壳统一为 760px。两条流程都不调用 generate_local_game_draftgenerate_platform_art_asset、一次性 chat_with_game_creator_agent 或 legacy 项目对话 append。
  • 首页发送、项目组目录选择和本地文件选择必须使用 Tauri 非阻塞原生 picker,并把选择器绑定到当前 client 窗口;禁止在同步 command 中调用 blocking_pick_folder / blocking_pick_file 阻塞 WebView 事件循环。选择器打开期间保留首页草稿可编辑,取消后恢复“开启创作”按钮并回显“已取消”。
  • 当前尚未定义 GameAgent 独立的灵感数据源;首页保留“灵感推荐”区块并显示无数据状态,但不得展示或请求主站 /creation 的陶泥儿精选 /api/editor/showcase/resources。后续接入前必须先明确独立数据契约和交互验收。
  • debug 构建启动后在用户 client 窗口之外额外打开 developer 窗口;该窗口用于开发者单独选择 Agent、管理对应 active/archived Session 并读取历史,用户消息和真实 Agent 回复只持久化到 .agent/conversations/agents/<agentId>/ 下的规范 Session。普通用户窗口不得出现 Agent 聊天 导航、picker 或工具台入口。
  • 首页最近项目只展示最近 3 个有效项目;项目组页在同一窗口使用紧凑桌面项目表格管理最近项目。顶部工具栏只放本地搜索、“打开项目”“新建项目”,不常驻路径输入框、目录显示按钮或独立 Godot 入口。两个项目动作都先打开绑定当前 client 的非阻塞原生目录选择器:“打开项目”读取已有 GameAgent 项目,或自动识别根目录 / 一层直接子目录中的唯一 Godot 工程并导入;普通未初始化目录提示改用“新建项目”。“新建项目”在用户选择工作区根后沿用非空目录确认,不自动重建无效历史路径。项目表格只投影名称、路径、GameAgent / Godot 类型、目录 / manifest / Runtime 状态;可打开行点击进入项目,显示目录和移除最近记录收进行尾更多菜单。搜索仅过滤当前行,不修改 storage;空状态不追加第三个目录选择入口。正式验收只覆盖 1280×720 最小横屏和 1280×800 默认窗口,列表内部滚动且无页面级溢出。
  • 项目开发页保留左侧栏和顶部栏,顶部展示项目名、路径和最近 run 状态;中间只挂载 active project-supervisor Session 的正式对话面、Runtime 状态、确认/Needs input 和专业 Agent 协作只读状态,底部保留附件导入结果。真正的项目开发画布仍未落地;专业 Agent picker、完整计划和工具台继续留在开发入口。

v1 验收证据矩阵

  • 2026-08-03 资源管理阶段七收口:阶段零至阶段六已逐项对照飞书需求、当前 PRD、实现、测试与提交证据。AppSurface 已覆盖原生视频 controls + preload="metadata" 与资源读取策略失败安全空态,并确认失败时右侧 Project Supervisor 对话和底部 Agent Dock 不被中央主视窗替换;相关前端、Rust、原生壳、内容 / 编码和生产运维检查均已完成。本地 .env* 不进入提交。
  • npm run ai-game-creator-shell:check:覆盖壳 typecheck、聊天命令单测、用户 / 开发窗口 UI 边界 smoke、主窗口命令按钮复用 /help 命令列表、主窗口项目摘要从 manifest / trace 派生任务完成数、ready 数、资产来源分布和最近命令且未选项目时不显示、灵感草稿只填充输入框不提交、能力按钮复用 /capabilities、LLM状态按钮复用 /llm-status 且结果回填 Agent 状态列表、聊天侧 /agents 汇总和单 Agent 对话的 provider / 模型 / 流式 / API Key 读取状态、开发日志面板只读读取 .agent/logs/command.log / preview.log / agent.log、项目状态按钮复用 /status、权限按钮复用 /policy 且策略草稿按钮只填入 /policy-confirm project.index / /policy-confirm asset.register / /policy-confirm memory.write / /policy-confirm preview.start / /policy-confirm preview.open / /policy-confirm preview.stop / /policy-confirm agent.run_status / /policy-confirm conversation.read / /policy-confirm conversation.write、审计按钮复用 /audit、资产按钮复用 /assets 且资产结果可一键复用 /read、任务按钮复用 /tasks、聊天侧 /agents 汇总每个 Agent 的当前状态、聊天侧 /agent-conversations 列出 Agent 对话读取命令、聊天侧 /agent-memories 列出 Agent 私有记忆读取命令、Trace 按钮复用 /trace、文件按钮复用 /files 且文件结果可一键复用 /read、索引按钮复用 /index、记忆 / 短期记忆 / 黑板按钮复用 /memory long|short|blackboard、快照按钮复用 /checkpoint、快照列表按钮复用 /checkpoints 且 checkpoint 结果可一键复用 /diff / /restore、历史按钮复用 /history、受限命令白名单按钮复用 /commands 且无需项目初始化、静态自检快捷按钮复用 /smoke、预览状态快捷按钮复用 /preview-status、主窗口运行时配置面板读写 Tauri 配置目录中的 game-creator.config.json、支持全局与每个 agent 单独选择 LLM Provider 且不把 API Key 写入聊天、单 Agent 对话面板可手动追加私有记忆且走 memory.write 策略、主窗口提供音效登记、画板音频导入和常用生成产物读取草稿入口,聊天侧 /art 可盘点美术素材且不直接触发平台生成或画板同步,聊天侧 /context 可盘点生成上下文来源且不直接读取上下文文件,聊天侧 /timeline 可汇总项目活动时间线且不直接读取日志或 trace 文件,聊天侧 /artifacts 可列出常用生成产物读取命令,聊天侧 /run-artifacts 可列出最近 run 产物读取命令,聊天侧 /run-files 可列出 Agent 运行辅助文件读取命令,聊天侧 /logs 可列出固定日志读取命令且不直接读取日志,聊天侧 /brief 只基于当前已加载的 manifest / 最近 run trace / 预览状态 / 资产数量 / 最近命令生成项目简报,聊天侧 /goal 只基于当前 manifest.goal / 最近 run goal / taskGraph.goal 汇总创作目标来源,提供 /next/agent-resume 细化目标: 后续草稿且不直接触发 Tauri 读写、文件读取、预览启动或新增面板,聊天侧 /mvp 只基于当前 manifest / 最近 run trace / preview / 任务 / 资产 / 最近命令汇总本轮最小可玩范围,提供 /run 等后续草稿且不直接触发 Tauri 读写、文件读取、预览启动、导出或新增面板,聊天侧 /audience 只基于当前 manifest / 最近 run trace / preview 准备首批试玩对象和观察重点且不直接触发 Tauri 读写、预览启动、导出或继续 run,聊天侧 /feedback 只基于当前 manifest / 最近 run trace / preview 准备试玩反馈模板和修改说明草稿且不直接触发 Tauri 读写、预览启动或继续 run,聊天侧 /next 基于当前已加载的 manifest / 最近 run trace 输出下一步建议和 /goal / /mvp / /accessibility / /performance / /tasks / /criteria / /groups / /budget / /qa / /changes / /trace / /run / /open-preview / /test-plan / /audience / /feedback / /assets / /art / /context / /timeline / /artifacts / /run-artifacts / /run-files / /logs / /agent-resume 等安全命令草稿方向,提供一个首选草稿且不直接触发 Tauri 读写、预览启动或文件读取,聊天侧 /capabilities 展示标准 Agent 能力清单且不打开开发面板、聊天侧 /audit 从 manifest / 本地文件 / .agent/run.latest.json 分别汇总用户面、6 组任务配置、6 组协作证据、任务编排、loop、记忆、本地产物、HTTP 预览、画板回流和权限日志证据且不打开开发面板;未生成 .agent/run.latest.json 前,/audit 只能标记任务配置通过,不能把 6 组协作证据误判为通过;trace 已存在但状态为 failedneeds-revisionrunningmax-passes-exhausted 或缺少 Evaluator passed 步骤时,/audit 不能把 loop 误判为通过。聊天侧 /llm-status 只显示 base_url / model / API Key 已读取状态且不泄露密钥本体、聊天侧长期记忆查看 / 追加 / 覆盖 / 删除的授权本地项目路径、上传资产写入后的 manifest 刷新和 /assets 聊天可见性、/smoke 聊天侧确认后只通过授权本地项目路径执行白名单 game.static_smoke/run 聊天侧确认后通过授权本地项目路径执行 game.static_smoke、启动 127.0.0.1 本地预览并切换客户端运行视图、/preview 聊天侧确认后通过授权本地项目路径启动 127.0.0.1 本地预览并切换客户端运行视图、/status 聊天侧项目 / 任务 / 资产 / 预览 / 最近命令汇总、/files 聊天侧本地项目文件列表、/read 聊天侧文件读取的授权本地项目路径、/tasks 聊天侧任务拆分与下一步专业组展示的授权本地项目路径、聊天确认生成后实时展示 Planner / Orchestrator / 角色 brief / Generator / Evaluator / 写盘 / 自检进度,并自动读取 .agent/run.latest.json 在普通聊天消息里展示 Run、LLM 对话、loop 轮次、工具调用、active / carry-over 任务、返工焦点、编排轮次、最近步骤、画板同步建议命令和本地产物快照、/trace 聊天侧读取 .agent/run.latest.json 并展示 loop 轮次 / active 任务 / 返工路线 / dependency waves 的授权本地项目路径、platform-agent 编排测试、共享契约测试、Tauri 本地能力测试和无密钥本地 provider 端到端 smoke;用于证明独立 App、真实 LLM-compatible loop、本地落盘、自检和 HTTP 预览闭环,并覆盖 loop 跑满 3 轮失败时不会写入最终游戏产物。
  • V1.17 单 Agent 持久计划验收:Rust 定向用例覆盖 native function 显式 planUpdate、文本 JSON omission 兼容、输入上限、单调 revision、外层 failed / budget-exhausted 保留最后可信进度、终态保留、工具 action 下标零推进、未完成步骤阻止 final、损坏状态失败关闭、context bundle v3/v2 恢复、finalization v2 计划快照与 assistant 已落盘后的 state 丢失恢复,以及 thinking / legacy plan / repair 公共审计零正文;appSurface.test.ts 覆盖开发 UI 刷新后完整 8 步仍在,以及普通用户 Supervisor 只显示完成数、当前步骤、等待、下一步和协作数量。2026-07-16 正式 openai_chat / gpt-5.5steer-runner-kill suite 已证明 Runner boot 切换和 same-run steer 后 Agent/Session/run 不变、终态步骤不丢、revision 不回退、旧动作零执行、副作用零重放、唯一 assistant/completed 与零正文/密钥/路径公共泄漏,当前门禁状态为 PASS。
  • V1.18 单 Agent 持久 Goal mode 验收:Rust/Runner 定向用例覆盖 Goal CAS 生命周期、当前 Session/run 隔离、Provider 中断安全边界、paused 重启不自启、同 run resume、旧 cancel tombstone 清理、当前 v5 context、v5 pending action 的 Goal 快照门禁、旧 schema 失败关闭、Goal edit 后自动/确认动作转 blocked 并重规划、finalization v3 以及 assistant 后 Runtime/Goal completed 顺序;appSurface.test.ts 覆盖 执行 / 聊天 / 目标、独立 Goal 弹层、完整控制动作和正式用户界面隔离。2026-07-16 真实 openai_chat / gpt-5.5 已完成 revision 1 -> 2、旧动作 blocked 且零执行、真实失败后 patchset 修复、pause、Runner pidfd 强杀换 boot、重启零推进、显式同 run resume;最终代码快照复跑有 11 组 Provider lifecycle 闭合、计划 revision 11 八步完成、唯一 assistant、零副作用重放和零 Goal/密钥/路径公共泄漏,门禁状态为 PASS。
  • file.delete 的 Runtime 验收必须覆盖:删除普通文件与缺失文件的幂等结果、缺少路径、目录、绝对路径、父目录、反斜杠、有效与悬空符号链接和整个 .agent/** 控制面拒绝、独立 confirm / deny 策略、确认前无副作用、确认期间全局 revision 漂移失败关闭、durable action ledger 的 approved / executing / observed 恢复边界、agent.runtime.file.delete 审计,以及删除前 revision 推进、删除后必须通过当前 revision 的 project.verifygame.static_smoke 才能收束。另用完整后台 loop 和开发 CLI 真实任务证明 Agent 能自主选择删除并完成验证;普通用户窗口继续没有文件写入或删除入口。
  • /risks 聊天入口由 appSurface.test.ts 的主窗口 smoke 覆盖:只基于当前已加载的 manifest / trace / 预览 / 任务 / 资产 / 最近命令生成风险摘要,提供首个风险处理草稿,不触发 Tauri 读写、文件读取、预览启动或新增普通用户面板。
  • /goal 聊天入口由 appSurface.test.ts 主窗口 smoke 覆盖:只基于当前已加载 manifest.goal、最近 run goal 和 taskGraph.goal 汇总创作目标来源,提供 /agent-resume 细化目标:/next 草稿,不触发 Tauri 读写、不读取 spec / 上下文 / trace 文件、不新增普通用户目标面板。
  • /guide 聊天入口由 appSurface.test.ts 主窗口 smoke 覆盖:只基于当前已加载 manifest、最近 run trace、preview 和已加载命令状态判断普通用户当前阶段,给出最多 3 个推荐命令和首选草稿,不触发 Tauri 读写、不读取文件、不启动 run、不启动预览、不写项目、不新增普通用户导引面板。
  • /progress 聊天入口由 appSurface.test.ts 主窗口 smoke 覆盖:只基于当前已加载 manifest、最近 run trace、preview、任务、素材和已加载命令状态汇总项目阶段、任务完成度、最近 run、预览、素材和交付进度,提供 /run/review/share/test-plan/todo/trace/guide 草稿,不触发 Tauri 读写、不读取文件、不启动 run、不启动预览、不导出试玩包、不写项目、不新增普通用户进度面板。
  • /spec 聊天入口由 appSurface.test.ts 主窗口 smoke 覆盖:只基于当前已加载 manifest、最近 run trace、任务声明产物和 trace 输入 / 输出路径汇总 Planner 规格、玩法设计、数值表、美术清单、音频清单和发布说明状态,提供 /read .agent/spec.md/next 草稿,不触发 Tauri 读写、不读取规格文件、不启动预览、不写项目、不新增普通用户规格面板。
  • /mvp 聊天入口由 appSurface.test.ts 主窗口 smoke 覆盖:只基于当前已加载 manifest、最近 run trace、preview、任务、资产和最近命令汇总 MVP 内、当前状态、试玩包状态和暂不做事项,提供 /review/criteria/trace/run/export/exports/next 草稿,不触发 Tauri 读写、不读取文件、不启动或打开预览、不导出试玩包、不新增普通用户 MVP 面板。
  • /pitch 聊天入口由 appSurface.test.ts 主窗口 smoke 覆盖:只基于当前已加载 manifest、最近 run trace 和 preview 状态汇总试玩定位、一句话、核心乐趣、可演示状态、测试者讲解口径和暂不承诺事项,提供 /mvp/review/trace/open-preview/run 草稿,不触发 Tauri 读写、不读取文件、不启动或打开预览、不直接继续 run、不新增普通用户定位面板。
  • /demo 聊天入口由 appSurface.test.ts 主窗口 smoke 覆盖:只基于当前已加载 manifest、最近 run trace 和 preview 状态准备 30 秒试玩讲解稿、讲解顺序、口播稿、演示状态和收反馈口径,提供 /run/open-preview/trace/review/test-plan 草稿,不触发 Tauri 读写、不读取文件、不启动或打开预览、不导出试玩包、不发布作品、不新增普通用户讲解面板。
  • /rules 聊天入口由 appSurface.test.ts 主窗口 smoke 覆盖:只基于当前已加载 manifest、最近 run trace.taskGraph、trace artifacts 和 steps 汇总玩法目标、操作 / 胜负 / 重开口径、设计与入口产物状态、相关任务和最近程序 / 试玩步骤,提供 /read game/game_design.md/agent-resume 操作说明:.../next 草稿,不触发 Tauri 读写、不读取设计文件、不启动预览或继续 run、不新增普通用户规则面板。
  • /tutorial 聊天入口由 appSurface.test.ts 主窗口 smoke 覆盖:只基于当前已加载 manifest、最近 run trace、preview 和任务状态汇总首屏目标、首局 30 秒引导、原型证据、试玩任务、最近引导证据和补齐项,提供 /rules/review/agent-resume 新手引导:.../open-preview/run 草稿,不触发 Tauri 读写、不读取设计文件、不启动或打开预览、不直接继续 run、不新增普通用户引导面板。
  • /mobile 聊天入口由 appSurface.test.ts 主窗口 smoke 覆盖:只基于当前已加载 manifest、最近 run trace、preview 和任务状态汇总移动试玩目标、键盘 / 触屏输入口径、原型证据、移动检查项、关联任务和最近移动相关步骤,提供 /rules/review/agent-resume 移动试玩:.../open-preview/run 草稿,不触发 Tauri 读写、不读取代码文件、不启动或打开预览、不直接继续 run、不新增普通用户移动适配面板。
  • /compatibility 聊天入口由 appSurface.test.ts 主窗口 smoke 覆盖:只基于当前已加载 manifest、最近 run trace、preview 和静态自检状态准备推荐环境、输入兼容、不承诺范围、反馈口径和参考命令,提供 /run/mobile/review/trace/next 草稿,不触发 Tauri 读写、不读取文件、不启动或打开预览、不导出试玩包、不上传云端、不发布作品、不写项目、不新增普通用户兼容性面板。
  • /accessibility 聊天入口由 appSurface.test.ts 主窗口 smoke 覆盖:只基于当前已加载 manifest、最近 run trace、preview 和任务状态汇总文字可读、颜色对比、按钮 / 状态命名、键盘等价、可见焦点、非颜色唯一反馈和静音可玩检查项,提供 /rules/review/agent-resume 可读性与无障碍:.../open-preview/run 草稿,不触发 Tauri 读写、不读取代码或 trace 文件、不启动或打开预览、不直接继续 run、不新增普通用户无障碍面板。
  • /localization 聊天入口由 appSurface.test.ts 主窗口 smoke 覆盖:只基于当前已加载 manifest、最近 run trace、preview 和发布说明产物状态汇总默认语言、文案范围、关联任务、检查口径、暂不做事项和参考命令,提供 /read exports/README.md/agent-resume 本地化与文案:.../review/next 草稿,不触发 Tauri 读写、不读取文件、不启动或打开预览、不导出试玩包、不上传云端、不发布作品、不写项目、不新增普通用户本地化面板。
  • /performance 聊天入口由 appSurface.test.ts 主窗口 smoke 覆盖:只基于当前已加载 manifest、最近 run trace、preview、资产数量和 trace artifact 摘要汇总入口自包含、首屏不空白、素材体积、主循环稳定、无远程依赖和预览启动检查,提供 /run-artifacts/review/open-preview/run/next 草稿,不触发 Tauri 读写、不读取产物或日志文件、不启动或打开预览、不直接继续 run、不新增普通用户性能面板。
  • /polish 聊天入口由 appSurface.test.ts 主窗口 smoke 覆盖:只基于当前已加载 manifest、最近 run trace、preview、最近自检和资产数量汇总试玩前打磨范围、推荐检查顺序、关联任务和最近打磨相关步骤,提供 /agent-resume 打磨:.../review/feedback/next 草稿,不触发 Tauri 读写、不读取文件、不启动预览、不导出试玩包、不写项目、不新增普通用户打磨面板。
  • /credits 聊天入口由 appSurface.test.ts 主窗口 smoke 覆盖:只基于当前已加载 manifest.assets 汇总素材数量、上传 / 生成 / 画板来源分布、来源清单和交付前需要确认的授权 / 模型 / 画板资源口径,提供 /assets 草稿,不触发 Tauri 读写、不刷新资产、不读取素材清单、不导出试玩包、不新增普通用户署名面板。
  • /blockers 聊天入口由 appSurface.test.ts 主窗口 smoke 覆盖:只基于当前已加载 manifest、最近 run trace、preview、最近命令、ready / failed 任务、导出记录和资产概况汇总当前阻塞项,提供 /run/export/todo/review/trace/tasks/logs/art/next 草稿,不触发 Tauri 读写、不读取文件、不启动预览、不导出试玩包、不写项目、不新增普通用户阻塞面板。
  • /ready 聊天入口由 appSurface.test.ts 主窗口 smoke 覆盖:只基于当前已加载 manifest、最近 run trace、preview、最近自检、导出记录、ready / failed 任务和资产概况汇总试玩就绪度,提供 /run/export/todo/review/trace/tasks/art/share/next 草稿,不触发 Tauri 读写、不读取文件、不启动预览、不导出试玩包、不写项目、不新增普通用户就绪度面板。
  • /evidence 聊天入口由 appSurface.test.ts 主窗口 smoke 覆盖:只基于当前已加载 manifest、最近 run trace、preview、最近命令、静态自检、导出记录、素材和最近试玩步骤汇总验证证据台账与缺口,提供 /run/export/art/logs/review/next/ready 草稿,不触发 Tauri 读写、不读取文件、不启动或打开预览、不导出试玩包、不写项目、不新增普通用户证据面板。
  • /deps 聊天入口由 appSurface.test.ts 主窗口 smoke 覆盖:只基于当前已加载 manifest.tasks 和最近 run trace.taskGraph 汇总 active / carry / ready / 等待依赖、可执行任务与依赖等待,提供 /criteria/todo/tasks/next 草稿,不触发 Tauri 读写、不读取任务文件、不启动 run、不修改项目、不新增普通用户依赖面板。
  • /revise 聊天入口由 appSurface.test.ts 主窗口 smoke 覆盖:只基于当前已加载 manifest 和最近 run trace 汇总返工焦点、失败 / active / carry / ready 任务、最近评审 / 试玩步骤、预览和导出缺口,并填入 /agent-resume 改版说明:... 草稿,不触发 Tauri 读写、不读取文件、不继续 run、不启动预览、不导出试玩包、不写项目、不新增普通用户改版面板。
  • /privacy 聊天入口由 appSurface.test.ts 主窗口 smoke 覆盖:只基于当前已加载 manifest、授权项目路径、最近 run trace、preview、资产来源和导出记录汇总 API Key、预览、本地试玩包、内部文件、素材来源和 trace 的隐私 / 交付边界,提供 /credits/exports/config 草稿,不触发 Tauri 读写、不读取文件、不导出试玩包、不启动预览、不写项目、不新增普通用户隐私面板。
  • /criteria 聊天入口由 appSurface.test.ts 主窗口 smoke 覆盖:只基于当前已加载 manifest.tasks 和最近 run trace.taskGraph 汇总 active、carry、ready、失败或待处理任务的验收条件和产物,提供 /tasks 草稿,不触发 Tauri 读写、不读取任务文件或 trace 文件、不新增普通用户验收面板。
  • /groups 聊天入口由 appSurface.test.ts 主窗口 smoke 覆盖:只基于当前已加载 manifest.tasks 和最近 run trace.taskGraph / passPlans 汇总六个专业组的完成、active、carry、ready、失败数量和下一步任务,提供 /tasks 草稿,不触发 Tauri 读写、不读取任务文件或 trace 文件、不新增普通用户专业组面板。
  • /balance 聊天入口由 appSurface.test.ts 主窗口 smoke 覆盖:只基于当前已加载 manifest.tasks、最近 run trace.taskGraph、trace artifacts 和 steps 汇总数值组任务、验收口径、game/balance.json 状态和最近数值步骤,提供 /read game/balance.json/agent-resume 数值调整:... 草稿,不触发 Tauri 读写、不读取数值表、不启动预览或继续 run、不新增普通用户数值面板。
  • /budget 聊天入口由 appSurface.test.ts 主窗口 smoke 覆盖:只基于当前已加载最近 run trace 汇总轮次、工具调用、stopReason 和下一步建议,提供 /review/publish/trace/next 草稿,不触发 Tauri 读写、不读取 trace 文件或新增普通用户预算面板。
  • /qa 聊天入口由 appSurface.test.ts 主窗口 smoke 覆盖:只基于当前已加载 manifest、最近 run trace、最近命令和 preview 状态汇总 Evaluator、任务、静态自检、试玩和产物状态,提供 /review/tasks/trace/playtest/publish/next 草稿,不触发 Tauri 读写、不读取 trace 或日志文件、不启动或打开预览、不新增普通用户 QA 面板。
  • /changes 聊天入口由 appSurface.test.ts 主窗口 smoke 覆盖:只基于当前已加载 manifest、最近 run trace 的 artifacts / steps 和最近命令汇总可验产物、最近输出、当前资产和真实差异查看方向,提供 /read <首个可验产物>/run-artifacts 草稿,不触发 Tauri 读写、不读取产物或日志文件、不执行 checkpoint diff、不新增普通用户变更面板。
  • /todo 聊天入口由 appSurface.test.ts 主窗口 smoke 覆盖:只基于当前已加载 manifest 和最近 run trace 汇总失败、active、carry、ready 或待处理任务的下一轮小步,提供 /tasks/review/next 草稿,不触发 Tauri 读写、不读取任务文件、不启动 run、不修改项目、不新增普通用户小步面板。
  • /plan 聊天入口由 appSurface.test.ts 主窗口 smoke 覆盖:只基于当前已加载 manifest 和最近 run trace 汇总下一轮协作顺序、各专业组接手任务、空档组和首个继续执行草稿,提供 /agent-resume 下一轮计划:.../review/next 草稿,不触发 Tauri 读写、不读取任务文件、不启动 run、不修改项目、不新增普通用户计划面板。
  • /review 聊天入口由 appSurface.test.ts 主窗口 smoke 覆盖:只基于当前已加载 run trace 汇总 Evaluator 状态、返工焦点、返工路线和最近评审步骤,提供 /read .agent/findings.md/agent-resume 草稿,不直接读取评审文件、不触发 Tauri 读写或新增普通用户面板。
  • /context 聊天入口由 appSurface.test.ts 主窗口 smoke 覆盖:只基于当前已加载 manifest 和最近 run trace 列出项目对话、短期 / 长期记忆、黑板、Agent 对话、Agent 私有记忆、manifest、最近 trace 和最近 LLM 输入路径,提供 /read/memory blackboard 草稿,不触发 Tauri 读写、不读取上下文文件或新增普通用户面板。
  • /timeline 聊天入口由 appSurface.test.ts 主窗口 smoke 覆盖:只基于当前已加载 manifest.commandRuns 和最近 run trace 汇总最近命令、日志读取草稿和最近 Agent 步骤,提供 /read/trace/history 草稿,不触发 Tauri 读写、不读取日志或 trace 文件、不新增普通用户时间线面板。
  • /playtest 聊天入口由 appSurface.test.ts 主窗口 smoke 覆盖:只基于当前已加载 manifest、最近 run trace 和 preview 状态汇总是否可试玩、Playtest 任务状态和预览日志读取命令,提供 /run/open-preview/trace/review 草稿,不触发 Tauri 读写、预览启动 / 打开或新增普通用户试玩面板。
  • /test-plan 聊天入口由 appSurface.test.ts 主窗口 smoke 覆盖:只基于当前已加载 manifest、最近 run trace 和 preview 状态准备手动测试用例、关联任务和试玩证据,提供 /run/open-preview/trace/review/next 草稿,不触发 Tauri 读写、不读取文件、不启动或打开预览、不直接继续 run、不新增普通用户测试面板。
  • /audience 聊天入口由 appSurface.test.ts 主窗口 smoke 覆盖:只基于当前已加载 manifest、最近 run trace、preview 和试玩任务状态汇总首批试玩对象、邀请顺序和观察重点,提供 /run/feedback/review/trace/next 草稿,不触发 Tauri 读写、不读取文件、不启动或打开预览、不导出试玩包、不写项目、不新增普通用户对象面板。
  • /invite 聊天入口由 appSurface.test.ts 主窗口 smoke 覆盖:只基于当前已加载 manifest、最近 run trace 和 preview 状态准备测试者邀请对象、邀请文案、发送前检查和收反馈口径,提供 /run/feedback/review/trace/next 草稿,并在 /next/help 暴露入口;不触发 Tauri 读写、不读取文件、不启动或打开预览、不导出试玩包、不写项目、不新增普通用户邀请面板。
  • /bug-report 聊天入口由 appSurface.test.ts 主窗口 smoke 覆盖:只基于当前已加载 manifest、最近 run trace 和 preview 状态准备问题一句话、复现步骤、期望 / 实际、设备 / 输入方式、严重度和附件口径,提供 /run/agent-resume 缺陷修复:/review/trace/next 草稿,并在 /next/help 暴露入口;不触发 Tauri 读写、不读取文件、不启动或打开预览、不导出试玩包、不写项目、不新增普通用户缺陷面板。
  • /survey 聊天入口由 appSurface.test.ts 主窗口 smoke 覆盖:只基于当前已加载 manifest、最近 run trace 和 preview 状态准备首批测试者问卷、五个核心问题、记录格式和追踪方式,提供 /run/invite/review/trace/next 草稿,并在 /next/help 暴露入口;不触发 Tauri 读写、不读取文件、不启动或打开预览、不导出试玩包、不写项目、不新增普通用户问卷面板。
  • /retention 聊天入口由 appSurface.test.ts 主窗口 smoke 覆盖:只基于当前已加载 manifest、最近 run trace、preview、最近试玩证据、素材数量、发布说明和导出状态准备首轮复玩/留存观察清单,提供 /run/feedback/review/trace/next 草稿,并在 /next/help 暴露入口;不触发 Tauri 读写、不读取文件、不启动或打开预览、不导出试玩包、不上传云端、不发布作品、不写项目、不新增普通用户留存面板,也不做真实埋点、留存报表、用户画像、A/B 实验、排行榜或账号留存。
  • /cover 聊天入口由 appSurface.test.ts 主窗口 smoke 覆盖:只基于当前已加载 manifest、最近 run trace、preview 和资产状态准备封面与缩略图候选、用途尺寸、选择口径和补齐路径,提供 /run/art/listing/review/trace/next 草稿,并在 /next/help 暴露入口;不触发 Tauri 读写、不截屏、不裁剪、不读取文件、不启动或打开预览、不导出试玩包、不上传云端、不发布作品、不写项目、不新增普通用户封面面板。
  • /screenshots 聊天入口由 appSurface.test.ts 主窗口 smoke 覆盖:只基于当前已加载 manifest、最近 run trace、preview 和资产状态准备宣传截图目标、拍摄顺序、命名建议和作品页搭配,提供 /run/listing/review/trace/next 草稿,并在 /next/help 暴露入口;不触发 Tauri 读写、不截屏、不读取文件、不启动或打开预览、不导出试玩包、不写项目、不新增普通用户截图面板。
  • /trailer 聊天入口由 appSurface.test.ts 主窗口 smoke 覆盖:只基于当前已加载 manifest、最近 run trace、preview 和资产状态准备 15 秒试玩短视频结构、镜头清单、口播节奏和录制提示,提供 /run/share/review/trace/next 草稿,并在 /next/help 暴露入口;不触发 Tauri 读写、不录屏、不读取文件、不启动或打开预览、不导出试玩包、不上传云端、不写项目、不新增普通用户录屏面板。
  • /faq 聊天入口由 appSurface.test.ts 主窗口 smoke 覆盖:只基于当前已加载 manifest、最近 run trace 和 preview 状态准备试玩常见问答、回答口径、测试者提醒和交付搭配,提供 /run/share/review/trace/next 草稿,并在 /next/help 暴露入口;不触发 Tauri 读写、不读取文件、不启动或打开预览、不导出试玩包、不上传云端、不写项目、不新增普通用户 FAQ 面板。
  • /post 聊天入口由 appSurface.test.ts 主窗口 smoke 覆盖:只基于当前已加载 manifest、最近 run trace、preview 和素材状态准备社区发布短文案、长文案结构、标签和 CTA,提供 /run/store/review/trace/next 草稿,并在 /next/help 暴露入口;不触发 Tauri 读写、不上传云端、不发布作品、不读取文件、不启动或打开预览、不导出试玩包、不写项目、不新增普通用户社区发布面板。
  • /store 聊天入口由 appSurface.test.ts 主窗口 smoke 覆盖:只基于当前已加载 manifest、最近 run trace、preview、资产和发布说明状态准备上架资料、首发范围、上架前检查和参考命令,提供 /run/listing/review/trace/read exports/README.md/next 草稿,并在 /next/help 暴露入口;不触发 Tauri 读写、不上传云端、不发布作品、不读取文件、不启动或打开预览、不导出试玩包、不写项目、不新增普通用户上架面板。
  • /media-kit 聊天入口由 appSurface.test.ts 主窗口 smoke 覆盖:只基于当前已加载 manifest、最近 run trace、preview、资产和发布说明状态准备媒体资料包清单、素材缺口、组装顺序和参考命令,提供 /run/screenshots/review/trace/read exports/README.md/next 草稿,并在 /next/help 暴露入口;不触发 Tauri 读写、不截屏、不录屏、不读取文件、不启动或打开预览、不导出试玩包、不上传云端、不发布作品、不写项目、不新增普通用户媒体包面板。
  • /release-notes 聊天入口由 appSurface.test.ts 主窗口 smoke 覆盖:只基于当前已加载 manifest、最近 run trace、preview、资产和发布说明状态准备试玩更新说明、本轮变化、主要产物、玩家可见说明和已知限制,提供 /run/media-kit/review/trace/read exports/README.md/next 草稿,并在 /next/help 暴露入口;不触发 Tauri 读写、不读取文件、不启动或打开预览、不导出试玩包、不上传云端、不发布作品、不写项目、不新增普通用户更新说明面板。
  • /known-issues 聊天入口由 appSurface.test.ts 主窗口 smoke 覆盖:只基于当前已加载 manifest、最近 run trace、preview 和任务状态准备已知问题、试玩限制、反馈入口和发送前检查,提供 /run/share/review/trace/next 草稿,并在 /next/help 暴露入口;不触发 Tauri 读写、不读取文件、不启动或打开预览、不导出试玩包、不上传云端、不发布作品、不写项目、不新增普通用户已知问题面板。
  • /feedback 聊天入口由 appSurface.test.ts 主窗口 smoke 覆盖:只基于当前已加载 manifest、最近 run trace 和 preview 状态列出反馈方向、反馈模板和参考命令,提供 /run/agent-resume 试玩反馈:/review/next 草稿,不触发 Tauri 读写、不读取文件、不启动或打开预览、不直接继续 run、不新增普通用户反馈面板。
  • /share 聊天入口由 appSurface.test.ts 主窗口 smoke 覆盖:只基于当前已加载 manifest、授权项目路径、最近 run trace、preview 状态和 manifest.commandRuns 汇总原型通过状态、本地预览、本地试玩包、测试者说明和反馈收集方向,提供 /export/exports/trace/review/next 草稿,不触发 Tauri 读写、不导出试玩包、不列出历史包、不上传云端、不生成公开分享链接、不新增普通用户分享面板。
  • /listing 聊天入口由 appSurface.test.ts 主窗口 smoke 覆盖:只基于当前已加载 manifest、最近 run trace、发布组任务和资产清单汇总作品页标题、卖点、标签口径、封面素材、发布说明和最近运营步骤,提供 /read exports/README.md/review/art/publish/next 草稿,不触发 Tauri 读写、不读取发布说明、不上传云端、不发布作品、不新增普通用户作品页面板。
  • /handoff 聊天入口由 appSurface.test.ts 的主窗口 smoke 覆盖:只基于当前已加载的 manifest / trace / agent 状态 / run history 生成交接摘要,提供 /next 草稿,不触发 Tauri 读写、文件读取、预览启动或新增普通用户面板。
  • /runs 聊天入口由 appSurface.test.ts 的主窗口 smoke 覆盖:只基于当前已加载的 latest trace 和已载入历史 run 批次生成 /trace/read .agent/runs/... 草稿,不额外触发 Tauri 读取、不滚动加载更多历史、不新增普通用户面板。
  • /run-files 聊天入口由 appSurface.test.ts 的主窗口 smoke 覆盖:只列出 .agent/output.jsonl.agent/activity.jsonl.agent/context.bundle.json/read 草稿,不直接读取辅助文件、不触发 Tauri 读写或新增普通用户面板。
  • /passes 聊天入口由 appSurface.test.ts 主窗口 smoke 覆盖:只从当前已加载 run trace 的 artifacts 中筛选 .agent/passes/ 相对路径,列出 /read 草稿并提供首个草稿,不直接读取轮次文件、不触发 Tauri 读写或新增普通用户面板。
  • /internals 聊天入口由 appSurface.test.ts 主窗口 smoke 覆盖:只列出 .agent/manifest.json.agent/run.latest.json.agent/spec.md.agent/findings.md.agent/policy.json.agent/project.index.json.agent/agent.db.agent/conversations/project.jsonl/read 草稿,不直接读取内部文件、不触发 Tauri 读写或新增普通用户面板。
  • /export 聊天入口由 appSurface.test.ts 的主窗口 smoke 和 Tauri Rust 测试覆盖:确认后执行 project.export_package,导出 exports/playtest-package-*.zip,只打包 game/**assets/**exports/README.md,不包含 .agent/memory/、运行时配置、日志、trace 或密钥文件;导出前必须通过 game/index.html 可试玩静态验收,并写入 manifest commandRuns.agent/logs/command.log.agent/agent.db
  • /exports 聊天入口由 appSurface.test.ts 主窗口 smoke、项目权限确认测试和 Tauri Rust 测试覆盖:只读执行 project.export_list,列出 exports/playtest-package-*.zip,跳过符号链接和非试玩包文件,不删除旧包、不做系统分享、不新增普通用户面板。
  • /art 聊天入口由 appSurface.test.ts 主窗口 smoke 和美术资产定向测试覆盖:只基于当前已加载 manifest 盘点图片、视频和序列帧美术素材数量、来源、画板接入状态和路径,提供 /generate-art 首版核心美术素材/read assets/manifest.art.json 草稿,不触发 Tauri 文件读取、平台生成、画板同步、资产写入或新增普通用户面板。
  • /audio 聊天入口由 appSurface.test.ts 主窗口 smoke 和音频资产定向测试覆盖:只基于当前已加载 manifest 盘点音频素材数量、来源和路径,提供 /asset-register assets/audio/sfx.wav audio audio/wav/read assets/manifest.audio.json 草稿,不触发 Tauri 文件读取、资产写入、画板导入或新增普通用户面板。
  • /publish 聊天入口由 appSurface.test.ts 主窗口 smoke 覆盖:只基于当前已加载 manifest、最近 run trace、预览状态、资产来源和最近命令生成发布准备清单,提供 /run/trace/agent-resume /export 草稿,不触发 Tauri 读写、预览启动、文件读取或新增普通用户面板。
  • 主窗口策略快捷入口只填入 /policy-confirm project.index/policy-confirm asset.register/policy-confirm memory.write/policy-confirm preview.start/policy-confirm preview.open/policy-confirm preview.stop/policy-confirm agent.run_status/policy-confirm conversation.read/policy-confirm conversation.write 草稿;Agent 状态栏的“继续说明”只填入 /agent-resume 草稿,不直接触发 run 生命周期写入。
  • 主窗口最近 checkpoint 列表展示 checkpoint id、文件数、大小和创建时间,同时提供直接对比、填入 /diff、确认回滚和填入 /restore;回滚继续走 project.restore 确认卡,不直接写项目文件。
  • npm run check:native-shells:覆盖 AI 游戏创作壳的 release/dev 边界、正式用户 App 只嵌入当前 loopback 游戏预览、用户侧预览命令不调用系统浏览器和 Tauri release --no-bundle 构建 smoke;该 smoke 必须实际经过最新 frontendDist 门禁。门禁 helper 的定向测试同时覆盖干净嵌套产物、嵌套 JS 命中旧 /tmp 默认值、产物外测试 fixture 不受影响和链接绕过失败关闭。上述证据用于证明正式发布只登记一个用户窗口,登录后同一 WebView 渲染首页、项目组和项目开发页,Tauri 不自动额外打开 developer 窗口,开发面板只在 Vite dev 的 ?dev / #dev 分支渲染,旧窗口切换 command 仅保留兼容、不进入用户主流程。
  • npm run check:encodinggit diff --check:覆盖中文文档、中文命令文案和补丁空白;用于避免乱码、尾随空白和无关格式漂移。
  • npm run ai-game-creator-shell:llm-status:只检查 LLM 客户端配置是否就绪,不请求上游、不显示 API Key;用于本机联调前确认配置。发布版启动时会在 Tauri 应用配置目录生成默认 game-creator.config.json,仓库内 apps/ai-game-creator-shell/game-creator.config.json 只作为默认模板。
  • npm run agc:config:提供终端交互式 LLM 配置向导,支持 OpenAI、DeepSeek、Anthropic、火山 Ark 和自定义 Provider,依次采集 Base URL、模型与隐藏输入的 LLM API Key,并写入与 GUI“配置”面板相同的系统 AppData game-creator.config.json。向导不采集普通画板 URL/Key;更新 LLM 主配置时必须保留其它现役配置,POSIX 下保持 AppData 目录 0700、配置文件 0600,通过同目录临时文件原子替换,保存后复用真实 llm-status 检查。禁止提供或接受 --api-key,避免密钥进入 shell history、进程参数、日志或测试报告。
  • npm run ai-game-creator-shell:agent-run -- --no-wait /绝对项目路径 "游戏创作需求":使用真实 OpenAI-compatible 配置跑一次本地生成、落盘、自检和预览;用于人工验收真实 provider 路径。真实 provider 配置放在 Tauri 应用配置目录的 game-creator.config.json 中,至少设置 llm.apiKey,需要覆盖默认服务时设置 llm.baseUrlllm.model;默认 API kind 为 openai_responses,旧 Chat Completions 兼容网关设置 llm.apiKindopenai_chatAnthropic Messages 网关设置 llm.apiKindanthropicURL 会在 base URL 后拼 /v1/messages,例如 Minimax Anthropic base URL 可配置为 https://api.minimaxi.com/anthropicllm.stream 默认开启,若某个兼容网关不支持流式响应,可在全局或对应 agentLlm 中显式设为 false

当前最小落地

  • apps/ai-game-creator-shell 是独立 Tauri App,不复用 apps/desktop-shell

  • 独立客户端启动时先进入平台登录检查;未登录页默认展示手机号验证码登录,并保留密码登录切换。验证码登录调用平台后端 /api/auth/phone/send-code/api/auth/phone/login,密码登录继续调用 /api/auth/entryTauri dev 下 /api 走本轮动态 AGC Vite 代理,普通发布版静态窗口下通过 Tauri 原生 HTTP transport 固定访问开发服务器 https://dev.genarrative.world/api/*,避开 WebView CORS 预检并持久化刷新 Cookie。原生 HTTP capability 只允许该 HTTPS origin 的 /api/*,客户端解析层也拒绝其它 release origingame-chat release 继续不依赖平台登录和 api-server。网络层失败时展示登录服务不可达提示,不裸露 WebView 的 Load failed

  • npm run agc 的本地 SpacetimeDB owner identity 以独立 spacetimeDataDir 为作用域,不绑定可能漂移的监听端口;旧端口作用域记录仅在同一 data dir 下身份唯一时自动迁移,出现多个不同旧身份时失败关闭。.app/dev-stack.json 必须记录规范化 spacetimeDataDir,独立壳只复用数据库名和该目录同时匹配且健康的后端,旧 schema 状态或共享目录状态缺少此字段时不得复用。POSIX 子进程在 spawn 返回时立即登记 error / exit 生命周期、保存 detached leader 的 PGID 并把句柄交给外层;即使 direct leader 已先退出,也必须继续向负 PGID 发信号清理同组后代。后端 ready 前的 SIGINT、SIGTERM、超时或 ENOENT 都必须走同一进程组清理链路,不能遗留 npm、Cargo 或 SpacetimeDB。非 Linux Runtime 执行 project.verify 时,npm run 参数校验必须允许受控的 --silent--ignore-scripts 位于脚本名前,并继续拒绝缺少真实脚本名的调用。

  • Tauri Rust 入口保持薄壳:src-tauri/src/main.rs 只保留共享类型 / 常量、模块声明、CLI preflight、tauri::Builder、运行时配置初始化和 invoke_handler 清单;命令行入口放在 cli.rsTauri command 包装放在 commands.rs,运行时配置与 LLM 配置检查放在 config.rsAgent loop 与生成编排放在 agent.rs,上传 / 画板 / 平台美术生成接入放在 assets.rs,本地项目文件、记忆、对话、权限、checkpoint、manifest 和通用路径工具放在 project.rs,本地 HTTP 预览与 preview 命令放在 preview.rs,旧窗口兼容命令放在 windows.rsRust 单测放在 tests.rs。后续继续拆分时保持 Tauri command 名、JSON 字段、.agent/* 路径和错误语义不变。

  • 本地项目初始化会创建 game/assets/memory/memory/agents/exports/.agent/logs/,写入 .agent/manifest.json,生成 append-only JSONL 本地项目索引 .agent/agent.db,并生成默认 game/index.html

  • “打开项目”自动识别 Godot:先检查用户所选工作区根的普通文件 project.godot;根未命中时只检查一层直接子目录。根命中优先,子目录只有唯一命中才通过;多个子工程时必须在任何 .agent 写入前明确报错,要求用户改选具体工程,不能猜测。候选目录与 project.godot 都拒绝符号链接和 Windows reparse point,二层及更深目录不递归。首次导入只在用户所选工作区根初始化 .agent/manifest.json.agent/agent.db.agent/logs/.agent/runtime/manifest 以 . 或单段直接子目录名记录可移植的 godotProjectRootAgent DB 的 project.import 同步记录该相对根。后续项目上下文、文件工具、Session、Runner 和 Agent Runtime 始终使用工作区根;只有未来 Godot 专属启动、构建、测试或导出动作才以经过校验的 Godot 根作为相对 cwd。已有 .agent/manifest.json 缺少或记录错误的 godotProjectRoot 时,仅在 Godot 打开边界按唯一文件布局校准;歧义时不改写 manifest。

  • v1 conversation 记录使用 append-only JSONL,每行带 schemaVersionrolecontentagentIdupdatedAt,作为聊天历史和单 agent 对话历史的事实源;目录在首次写入时创建。

  • 开发窗口和项目内 Agent 对话弹窗的“后台运行”只启动或排队单 Agent 后台任务,不阻塞等待回复;用户可刷新同一 Agent 对话或 runtime 状态查看进度和结果,也可对当前 run 执行取消 / 重试,待确认 run 还可执行“确认继续”或“拒绝并继续”。后台任务会向 .agent/runtime/tasks/<agentId>.jsonl 追加任务视角记录,任务状态使用 pending / running / waiting-for-confirmation / cancelled / completed / failed,读取时按 runId 去重返回最近任务;runId 在同一 Agent 内是单个 run 的身份,后台入队会自动把重复 runId 改写为唯一实际 runId,防止不同任务互相覆盖;runtime state 自身仍可在完成后显示 idle / completed,二者语义分开。同一 Agent 的 pending 任务由持有 .agent/runtime/locks/<agentId>.lock 的后台 drain 串行执行,避免同一 Agent 并发抢上下文;不同 Agent 仍可并行;若某个工具动作命中确认策略,该 Agent 会停在 waiting-for-confirmation 并暂停继续消费队列,等待后续确认或策略调整;Runtime 会把完整 AgentRuntimePendingToolAction 经过敏感内容和项目绝对路径校验后原子写入 .agent/runtime/pending-actions/<agentId>/<runId>.json,公共 pendingToolAction 只公开安全摘要;确认或拒绝必须匹配 runId + actionId 并通过工具名与完整输入 JSON 的 SHA-256 校验。确认在同一 run 直接执行原 action 并把 observation 接回后续 loop;拒绝不执行工具,而是写入 blocked observation 后在同一 run 继续规划。待确认状态可跨 App 重启读取并回收上一进程锁;等待期间同 Agent 新任务保持 pending,确认/拒绝续跑结束后由同一 drain 串行排空;若用户取消 pending 任务,drain 不再消费该 run,若取消 running 任务,则在当前 LLM 或工具调用返回后的检查点停止,不继续执行工具或保存最终 assistant 回复。客户端重开项目时会对当前项目路径自动尝试一次 Runtime 恢复;恢复命令必须通过 agent.resume 自动权限,默认确认策略下不会静默启动;同一 Agent 同时存在上一进程遗留 runningpending 时,先重接 running,再由 drain 继续 pending。开发构建和后台 Agent 工具箱都可通过 agent.schedule_ready 权限确认入口把 manifest ready task 投递进同一后台队列,命令会先把 ready task 标成 running,再用 taskId 作为 Agent id 入队,source 为 agent-ready-task-scheduler;该入口不新增独立 worker。后台任务的核心 loop 每 6 轮形成一个上下文压缩窗口:每轮把已有 observation 带回 LLM 让 Agent 重新规划;只有合法工具计划返回空 actions,且不存在未通过或项目修改后未重跑的 project.verify 时才收束,response 为空时进入独立最终回复生成。窗口边界会压缩 observation;有新的独立观察时在同一 run 继续下一窗口,最近窗口重复无进展时才以 budget-exhausted / loop-budget-exhausted 失败。后台任务完成后会把 assistant 回复追加到对应 .agent/conversations/agents/<agentId>.jsonl,并向 .agent/agent.db 写入 agent.runtime.background_task.queued / agent.runtime.background_task / agent.runtime.background_task.recovered / agent.runtime.ready_task.scheduled / agent.runtime.tool_observation / agent.runtime.tool_confirmation_required / agent.runtime.tool_confirmation.approved / agent.runtime.tool_confirmation.rejected / agent.runtime.memory.write / agent.runtime.project.verify / agent.runtime.file.write / agent.runtime.file.patch / agent.runtime.file.delete / agent.runtime.tool_plan.repair / agent.runtime.task.create / agent.runtime.task.update / agent.runtime.command.run_limited / agent.runtime.blackboard.write / agent.runtime.agent.message / agent.runtime.agent.delegate / agent.runtime.background_task.cancelled / agent.runtime.background_task.retry / agent.runtime.background_task.completed / agent.runtime.background_task.failed 审计记录。当前工具箱开放只读工具 memory.readconversation.readasset.listproject.indexproject.searchproject.difffile.listfile.readtask.listagent.run_status,以及受策略保护的写/运行工具 memory.writeproject.checkpointproject.restoreproject.verifyfile.writefile.patchfile.deletetask.createtask.updatecommand.run_limitedpreview.startcanvas.asset_generateblackboard.writeagent.messageagent.delegateagent.schedule_readymemory.write scope=agent 只允许写当前 Agent 自己的私有记忆,跨 Agent 共享必须改用 blackboard.writeagent.messageproject.checkpoint 只创建本地 checkpoint,不返回本机绝对路径;project.restore 只按 checkpoint id 恢复当前项目,不返回本机绝对路径,默认确认策略下不会静默回滚;file.delete 只删除项目内普通文件,默认确认且不能访问 .agent/**task.create 只追加新 manifest 任务,task.update 只更新已有任务状态;agent.schedule_ready 只调度 manifest ready task,不创建平行 runtime;若项目策略拒绝,对应工具不会执行,Runtime 会把策略结果作为 observation 回给 Agent 修正计划;若项目策略要求确认,Runtime 会持久化精确待确认动作并保留 waiting 状态,不执行该工具;只有确认入口通过 runId + actionId + SHA-256 校验后才直接执行原 action,拒绝入口则生成 blocked observation。toolPolicy 保存当前工具级权限快照,供 planning prompt 和状态面板展示;recentToolCalls 保存最近 20 条结构化工具动作及安全 inputSummary,供状态面板展示最近动作和确认目标;append-only JSONL 写入按目标文件路径在当前进程内串行追加完整行,覆盖 .agent/agent.db、对话、Runtime events/tasks、activity 和 output,减少多个 Agent 同时完成时的行交错风险。

  • 2026-07-15 V1.21 修正:上一条中“每 6 轮形成上下文压缩窗口并压缩 observation”的描述已经失效;6 轮边界现在只形成进度 checkpoint 并执行停滞检测,真正的持久摘要只在 token 估算超过自动阈值或开发者显式执行 /compact 时发生。

  • 2026-07-15 V1.17 收束补充:上一条“空 actions 且 verification 通过即可收束”只适用于没有结构化计划的 legacy run。planRevision > 0 后,Runtime 还必须确认全部计划步骤均为 completed;未完成时在同一 run 返回 runtime.plan_update blocker,不写 assistant 或 completed。计划更新只写 Runtime 控制面,不经过工具权限策略,也不推进 project revision 或 verification gate。

  • 2026-07-10 补充:当前工具箱还开放 preview.start,审计记录类型为 agent.runtime.preview.start;该工具不会打开任意 URL,只启动当前授权项目的 127.0.0.1 本地预览,并和 Tauri 用户命令共用同一个 PreviewRegistry

  • 2026-07-10 补充:当前工具箱还开放 canvas.asset_generate,审计记录类型为 agent.runtime.canvas.asset_generate;该工具只通过配置好的 External Editor API 生成并回流素材,不暴露任意上传 / 任意网络请求能力。

  • 2026-07-10 补充:当前工具箱还开放 task.list;该工具只读取 manifest 任务图、状态、依赖、产物和 readyTaskIds,并受 task.list 项目权限策略保护。

  • 2026-07-10 补充:当前工具箱还开放 task.create,审计记录类型为 agent.runtime.task.create;该工具只追加新 manifest 任务,要求 taskId 唯一、依赖指向已有任务、分组合规且列表长度受限,并受 task.create 项目权限策略保护。

  • 2026-07-10 补充:当前工具箱还开放 task.update,审计记录类型为 agent.runtime.task.update;该工具只允许更新 manifest 中已有任务的状态,并受 task.update 项目权限策略保护。

  • 2026-07-10 补充:当前工具箱还开放 file.list;该工具只读列出项目文件摘要,可按相对路径过滤,并受 file.list 项目权限策略保护。

  • 2026-07-10 补充:当前工具箱还开放 project.diff;该工具只读返回 checkpoint 对比后的新增、修改、删除计数和相对路径摘要,并受 project.diff 项目权限策略保护。

  • 2026-07-10 补充:当前工具箱还开放 project.restore;该工具按 checkpoint id 恢复当前项目并删除 checkpoint 外新增文件,受 project.restore 项目权限策略和项目写锁保护,默认确认策略下不会静默执行。

  • 2026-07-10 补充:当前工具箱还开放 agent.run_status;该工具只读返回自己、目标 Agent 或一组 Agent 的 Runtime 状态摘要,并受 agent.run_status 项目权限策略保护。

  • 2026-07-10 补充:当前工具箱还开放 agent.delegate,审计记录类型为 agent.runtime.agent.delegate;该工具只把任务投递到目标 Agent 既有后台队列,不创建平行 runtime,不绕过目标 Agent 的锁和队列,也受 agent.delegate 项目权限策略保护。

  • 2026-07-10 补充:当前 Runtime 命令和后台工具箱都开放 agent.schedule_ready,审计记录类型为 agent.runtime.ready_task.scheduled;该命令把 manifest ready task 批量投递到对应 Agent 的既有后台队列,默认需要确认,确认前不会启动下游 Agent。

  • 普通用户可在聊天框输入 /project /绝对路径 生成待确认的 project.create 命令,用于授权并初始化本地项目目录;相对路径不会生成待确认命令;开发窗口仍可直接编辑项目路径。

  • 单窗口首页和项目组页不保留常驻路径输入;项目组只展示最近项目只读检查后的工作区绝对路径。打开 / 新建使用原生目录选择器,行尾菜单可显示已确认存在的项目目录,非法或相对路径不会调用系统文件管理器。

  • 普通用户侧的生成、上传、运行、自检、预览状态 / 启动 / 打开 / 停止、记忆写入和画板资产导入都必须先完成 /project 初始化;未初始化时只提示设置本地项目,不落到默认临时目录。

  • 终端可用 npm run ai-game-creator-shell:llm-status 检查 LLM 客户端配置是否就绪;桌面 App 主窗口“配置”面板可读写 Tauri 应用配置目录中的 game-creator.config.json/llm-status / 生成入口读取同一份配置,CLI 开发入口无 AppHandle 时才回退读取仓库旁边的配置模板和 gitignored 本机覆盖文件;不请求上游、不显示 API Key,缺配置时以非零状态退出或在聊天里提示未就绪。

  • 终端可用 npm run ai-game-creator-shell:check 跑 v1 开发验收:壳 typecheck、platform-llm 网关测试、共享契约测试、Tauri Rust 测试和无密钥本地 provider 端到端 smoke;已退役的 platform-agent 不再进入 workspace 或该门禁。

  • 终端可用 npm run ai-game-creator-shell:agent-run -- /绝对项目路径 "游戏创作需求" 跑一次真实 LLM 生成、落盘、game.static_smoke 和本地 HTTP 预览;发布 App 读取 Tauri 应用配置目录中的 game-creator.config.json,开发 CLI 无 AppHandle 时才读取仓库旁边的配置模板和 gitignored 本机覆盖文件,不把 API Key 写入仓库或项目文件。自动验证可加 --no-wait,例如 npm run ai-game-creator-shell:agent-run -- --no-wait /tmp/genarrative-ai-game-test "像素风反弹弹幕厨房",生成预览 trace 后立即停止本地预览,避免终端卡在回车等待。默认 API kind 为 openai_responses,且 llm.stream 默认开启;旧 Chat Completions 兼容网关设置 llm.apiKindopenai_chatAnthropic Messages 网关设置 llm.apiKindanthropic。不支持流式响应的兼容网关可显式设为 false

  • 终端可用 npm run ai-game-creator-shell:agent-run:smoke 跑一次无密钥本地端到端 smoke:脚本启动本机 OpenAI-compatible SSE 流式测试 provider,预置一个本地上传图片和一个本地上传音频,复用真实 --agent-run、Planner / Orchestrator / 角色 agent / Generator / Evaluator loop、本地落盘、game.static_smoke 和本地 HTTP 预览,并断言每次 provider 请求都使用 stream: true、Planner 与 Generator 分别命中自己的 agentLlm provider 配置、provider prompt 收到图片与音频资产上下文以及最近对话上下文、生成 HTML 引用这些资产、预览服务能用 GET 读取 /assets/...、用 HEAD 返回真实资源长度和对应 MIME、headless Chrome 打开预览后至少执行一帧游戏 JS,且通过确定性亮色探针采样证明 canvas 不是空白画布、.agent/run.latest.json 的 step group 覆盖 design / balance / art / audio / code / publishing 六组、第二轮会重跑 Evaluator 命中任务及其下游影响任务,未受影响角色 carry-over;随后脚本自动给 CLI 发送回车停止预览。该脚本只用于开发验证,不进入产品生成路径。

  • npm run ai-game-creator-shell:dev 必须经受控启动器解析 AGC Vite 端口;Linux 默认使用用户端口段的 start + 5,非 Linux 保留 3080 兼容首选。启动器用动态 Tauri build.devUrlGENARRATIVE_AGC_VITE_PORT 和 Vite CLI --port 保证 WebView、beforeDevCommand、配套后端预留和 Vite strictPort 对齐;不得复用无法证明 worktree 归属的现有 Vite,最终端口被竞态占用时直接失败。

  • AI 游戏创作 App 的本地后端使用 gitignored 的 server-rs/.spacetimedb/ai-game-creator/data,不复用主站旧 standalone 数据目录。启动器从本地 /v1/identity 获取并持久化 API identity,再通过数据目录内 0600 的独立 dev-cli/cli.toml 发布模块;不得读取或覆盖开发者全局 SpacetimeDB 登录,也不得回退到每次变化的 --anonymous 身份。发布失败时 API 和 Vite 不得继续启动旧 schema,避免 external_generation_job 等缺表订阅进入持续重试。

  • start-dev-stack.mjs 在 POSIX 下以独立进程组托管后端和 Vite,关闭 Tauri 或任一子进程失败时必须收束整组;macOS 不注册仅支持 Windows/Linux 的 api-server 进程指标 observable callback,避免每轮指标采集重复输出平台不支持告警。

  • Unix 下 Agent DB、External Runner owner 和 tool-plan handoff 的相对句柄复核必须同时比较设备号、inode 和文件类型;libc::statst_dev / st_ino 先按 Rust MetadataExt 的 Unix 口径规范为 u64 再比较,保持 Linux 和 macOS 的同一安全语义,不得为了通过 macOS 编译而删除路径替换检测。

  • AI 游戏创作 App 的 Vite root 保持在 apps/ai-game-creator-shell,但开发服务器必须通过 server.fs.allow: [repoRoot] 允许加载 packages/shared/src 共享契约;配置自检同时守住该规则,避免 typecheck 通过后真实 Tauri WebView 因共享源码 403 变成白屏。Tauri 事件 capability 只向 clientdevelopermainlauncher 窗口开放 core:event:allow-listencore:event:allow-unlistenRuntime 事件仍由 Rust 发出,前端不获得 emit 权限。

  • .agent/manifest.json 会保存 6 个专业组下 16 个组内角色任务状态,当前覆盖 DirectorGameplayDifficultyAssetPolishSFXCodeReviewPreviewPlaytestPublish;程序组内显式包含 quality-review 质量评审 gate,由 Evaluator trace 标记完成;开发窗口的专业组面板读取 manifest,而不是前端硬编码。

  • 主窗口的 agent 状态列表以 manifest 角色任务为底表,再合并最近 run trace 中 taskGraph.tasks 的任务状态、同 taskId / group / role 的最新 step 状态、输入输出路径、错误摘要、lifecycleStatus 和 activeTaskIds / carriedTaskIds / readyTaskIds 编排标记;如果 trace 缺失或过期,只展示 manifest 的静态任务状态和“暂无最近运行证据”。

  • 共享契约和 platform-agent 会按任务依赖与 completed 状态计算当前可执行任务,作为 v1 的最小编排选择器;每轮 Orchestrator 的 activeTaskIds、carriedTaskIds、repairRoutes 和 dependencyWaves 由 platform-agent 纯编排内核产出,apps/ai-game-creator-shell 只负责写入 .agent/passes/pass-N/ 和执行本地工具;Evaluator 会在 .agent/findings.md 写出 ## Repair Routes JSON,下一轮编排优先采用该结构化 taskIds,解析不到时才退回关键词路由;返工路由会按任务图自动扩展下游影响任务,例如美术资产变化会继续触发程序预览和运营包装重算。

  • game.generate_draft 使用 OpenAI-compatible LLM 配置生成结构化 JSON 草案,发布 App 的配置项来自 Tauri 应用配置目录中的 game-creator.config.jsonllm.apiKeyllm.baseUrlllm.modelllm.apiKindllm.streamllm.requestTimeoutMsllm.maxRetriesllm.retryBackoffMs;默认 API kind 为 openai_responsesllm.stream 默认开启,可设 llm.apiKind=openai_chat 切回旧 Chat Completions 兼容网关,或 llm.apiKind=anthropic 走 Anthropic Messages;显式 llm.stream=false 时 Planner 和 Generator 使用非流式请求;缺少配置或模型返回非法 JSON 时直接失败,不静默回退固定模板。

  • 普通主窗口“配置”面板和聊天 /config 命令只维护 LLM、Agent LLM 与 MCP 等运行时配置,不展示画板 Base URL 或 Developer API Key;正式平台美术缺少登录态时引导重新登录,不引导填写 editorApi。主聊天 Agent、Planner、Orchestrator、Generator、Evaluator 和 16 个角色 agent 可在 agentLlm 中单独覆盖 LLM 路由,空项继承全局配置。仅独立 standalone game-chat release/显式高级自定义模式的隔离设置可维护 External v1 URL/Key,且不得被普通 release 自动读取。

  • 聊天输入 /llm-status 会触发只读 llm.config_check,确认全局 LLM 以及各 agent resolved 后的 base_url、model、API 类型和 API Key 是否已从客户端配置读取;状态消息不会显示或保存 API Key;当前生成链路只要求 Planner / Generator 就绪。/llm-routes 复用同一检查结果,但输出按 agent 展开的路由清单和缺口摘要,用于确认哪些 agent 解析后走全局路由、哪些 agent 走单独 provider。

  • game.generate_draft 的 LLM JSON 必须包含 handoffs 数组,覆盖 designbalanceartaudiocodepublishing 6 个专业组;每组必须给出 role、summary、outputs 和 next,缺组或交接内容不完整会判定为模型输出无效并进入返工。

  • game.generate_draft 的真实生成路径使用最小 Planner / Orchestrator / 组内角色 agent / Generator / Evaluator loopPlanner 写 .agent/spec.md;每轮 Orchestrator 先写 .agent/passes/pass-N/agenda.md.agent/passes/pass-N/task-graph.json,首轮全量调度 16 个角色任务,返工轮按 .agent/findings.md 生成结构化 repairRoutes,重跑命中问题的角色任务及其下游依赖任务,其余角色 brief 从上一轮 carry-overtask-graph.json 记录 activeTaskIds、carriedTaskIds、repairFocus、repairRoutes 和按依赖排序的 dependencyWaves;角色 brief 执行层按 dependencyWaves 调度,wave 之间串行、同一 wave 内多个角色 Agent 以 async task 并行运行;每个角色 brief 必须读取自己的私有记忆 memory/agents/<group>/<role>.md、本 Agent 对话和项目黑板 memory/blackboard.md,写入 .agent/passes/pass-N/groups/<group>/*.md,再按原组顺序汇总为 .agent/passes/pass-N/groups/*.md;Generator 必须读取用户需求、记忆、.agent/spec.md、本轮 agenda.mdtask-graph.json.agent/findings.md 和 6 组汇总 brief 后返回结构化 JSON;每轮会把 Generator 草案拆成 6 组交接快照,写入 .agent/passes/pass-N/Evaluator 做质量评审并写 .agent/findings.md,通过后才进入 game.static_smoke 静态自检和预览试玩。

  • loop 最多执行 3 轮;Evaluator 发现 HTML 非自包含、缺少 canvas、缺少 requestAnimationFrame、缺少输入监听或用户输入未转义时,把问题写入 .agent/findings.md 并让下一轮 Generator 修复。3 轮仍失败则 game.generate_draft 失败,不写最终游戏产物。

  • loop 每次运行会写 .agent/run.latest.json.agent/runs/<runId>.json,记录 Planner / Orchestrator agenda / 16 个组内角色 brief 或 carry-over / 6 个 GroupCoordinator 汇总 / Generator / 6 个专业组交接 / Evaluator 质量评审 / ArtifactWriter / Playtest step、每步 toolCalls、输入文件、输出文件、状态、轮次、maxPasses、toolCallCount、maxToolCalls、stopReason、nextStep 和错误摘要;Planner、角色 agent 和 Generator 的 inputPaths 必须包含对应记忆文件、.agent/conversations/project.jsonl.agent/conversations/agents/.agent/manifest.json 和 agenda 等上下文来源,其中角色 agent 必须包含自己的 memory/agents/<group>/<role>.mdmemory/blackboard.mdconversation 输入只取最近少量 project / agent 对话摘要,不读取全量历史;每个 step 必须带 phase、taskId、group 和 role.agent/run.latest.json.taskGraph 必须记录 goal、readyTaskIds、activeTaskIds、carriedTaskIds、repairFocus、repairRoutes 和当前任务状态;.agent/run.latest.json.passPlans 必须按轮记录 mode、summary、activeTaskIds、carriedTaskIds、dependencyWaves、repairFocus 和 repairRoutes,作为 /trace 与开发窗口判断编排 loop 是否真实发生的直接证据;run.latest.json 是当前指针,.agent/runs/ 保留历史 run trace;开发窗口读取 latest 展示编排过程,并复用 file.list/read 按文件修改时间先载入最近 20 个历史 run,滚动时再按批次读取剩余历史,普通用户窗口不展示。

  • .agent/run.latest.jsonartifacts 使用结构化记录,包含相对路径、字节数和 fnv1a64: checksum;除最终本地产物外,也会收集 .agent/passes/pass-N/ 快照,便于确认返工前后的产物差异。

  • 通过 Evaluator 和 game.static_smoke 后,Agent loop 会把本次 runId、状态、轮次、下一步、active / carry-over 任务和最终本地产物摘要追加到 memory/session.mdmemory/project.md,把重要跨 agent 决策 / 依赖 / 风险摘要追加到 memory/blackboard.md,并把各角色本轮成功产出的角色摘要追加到 memory/agents/<group>/<role>.md;下一次 Planner、组内角色和 Generator 会通过记忆输入自然读取上一轮稳定原型状态,而不只依赖开发窗口 trace。

  • 单 agent 对话入口读取对应 agent conversation;用户提交后先追加用户消息,再调用 chat_with_game_creator_role_agent / chat_with_game_creator_role_agent_stream 让对应 agentLlm.<agentId> 结合项目上下文、Agent 私有记忆和本 Agent 历史对话生成回复,随后把回复写入对应 .agent/conversations/agents/<agentId>.jsonl。这里的 <agentId> 以任务 taskId 为规范值,Tauri 只兼容旧 group-role 别名并映射到 taskId。每轮对话会同步写 .agent/runtime/agents/<agentId>.json.agent/runtime/events/<agentId>.jsonl,字段包含 agentIdtaskIdsessionIdrunIdsourcestatusphasecurrentTaskcurrentGoalcurrentActionwaitingOnnextSteploopIterationmaxLoopIterationstoolActionBudgetplanplanStepsactivePlanStepIndexobservationsrecentToolCallstoolPolicyallowedToolslastResponseerror;流式事件会把最新 runtimeState 回传给界面。Runtime state 写入使用临时文件替换,event JSONL 读取会跳过坏行;currentTaskcurrentGoal、event detail、lastResponseagent.db 摘要复用敏感上下文过滤,不保存明显 API Key / Bearer / Cookie 片段。单 agent 面板可把当前输入手动追加到对应 memory/agents/<group>/<role>.md,写入前复用 memory.write 项目策略和本地项目锁;最近对话可作为本次生成 prompt 上下文读取,但只有经过显式总结、用户显式手动沉淀或生成 loop 成功沉淀的稳定结论,才追加到 memory/blackboard.mdmemory/agents/<group>/<role>.md

  • 2026-07-10 补充:每个 Agent 支持多个持久化 Session。旧 agent-session-<agentId> 永久映射原 .agent/conversations/agents/<agentId>.jsonl,不迁移、不复制、不删除;新 Session 写入 .agent/conversations/agents/<agentId>/sessions/<sessionId>.jsonl,目录索引和 active Session 写入 .agent/runtime/sessions/<agentId>.json。开发单 Agent 聊天页提供创建、切换、归档和已归档只读查看;归档只更新元数据,不截断对话。直接聊天、流式回调和后台任务在启动时捕获 agentId + sessionIdRuntime task / event 继续使用每 Agent append-only JSONL,但列表、任务队列、连续上下文和最近对话按 Session 过滤;Runtime 内的 conversation.read 和 self agent.run_status 通过 runId 继续使用该 Session,恢复或处理待确认动作前校验 task、runtime state 和 pending action 的 Session 一致性。同一 Agent 仍共享一把 OS 锁并严格串行,不允许借 Session 绕过 pending、确认或 needs-reconciliation 屏障;不同 Agent 仍可并行。

  • 2026-07-12 补充:开发单 Agent 聊天页的 Runtime 容器即使为空也必须保留网格行位,消息区和输入区固定落在第 5、6 行;消息区自身使用 clamp(260px, 40vh, 380px) 明确高度,长历史只增加消息区 scrollHeight,不得改变主面板高度。消息区仅在滚动位置接近底部时自动跟随最新回复,用户主动向上查看历史后,状态变化和流式片段不得强行拉回底部;切换会话、重新读取历史或主动发送新任务时恢复跟随。保存用户消息、连接 LLM、等待首个片段和流式接收期间,消息区持续显示等待状态并标记 aria-busy=true。OpenAI-compatible 流式响应中的空数组或 null choices usage / metadata 包必须正常消费;首个片段前只有 StreamUnavailable / EmptyResponse / Deserialize 协议兼容错误可由 Rust 层回退一次非流式请求,鉴权、额度、上游状态、超时和连接错误不得由前端再次请求。

  • 生成 loop 中的角色 brief 也写同一套 Agent Runtime state / eventactive 角色用 source=generate-draft 和当前 runId 标记正在读取上下文、调用角色专属 LLM 或本地编排、生成 brief、完成或失败;carry-over 角色同样写入开始 / 完成事件,但不会伪装成重新调用 LLM。主窗口 Agent 状态列表、开发单 Agent 聊天页和项目内单 Agent 对话弹窗只读展示当前 Agent 的 runtime 状态、最近 task/run、阶段、当前目标、动作、等待对象、下一步、计划、观测和最近工具动作;这只是 V1 可观测性,不代表已经有独立后台常驻进程或可中断任意上游 LLM 请求。

  • .agent/agent.db 当前作为最小本地项目索引文件使用 JSONL:初始化写入 project.init,每次 game.generate_draft 追加目标、标题、本地产物路径、checkpoint 和 diff 摘要,上传 / 登记 / 画板导入资产时追加 asset.registerasset.updatev1 不引入 SQLite 依赖。

  • 2026-07-13 加固:Agent DB 单条 JSONL 上限 1 MiBreceipt 幂等全量扫描在文件超过 256 MiB 或记录超过 100 万条时失败关闭,该阈值不是通用 append 自动轮转上限。普通 append 禁止写 receipt,幂等动作入口只接受字段完整的终态 receipt。普通审计约在 192 MiB 或 999,936 条停止,并给字节 / 记录门槛预留 64 条最大 1 MiB terminal 记录,只有 terminal receipt、带 actionId 的终态 observation / observed 和 reconciliation 可以使用;command-failed / verification-failed 也属于终态。普通和终态写入都在 DB 句柄锁内真实计数并检查字节容量,receipt 判重流式校验全部同 key,不复用锁外快照;普通读取保留最近 32 MiB、最多 16,384 个完整 JSON object。Unix 使用 openat + O_NOFOLLOW + flock + nlink=1Windows 使用相对 NtCreateFile 并拒绝 reparse point / hardlinkappend 和尾部修复执行 flush + sync_dataUnix 新建 .agentagent.db 后分别同步父目录,写入前后复核路径身份。

  • 2026-07-13 一致性加固:共享项目事实读取等待项目锁后必须重读 durable pending sidecar,并与调用方完整 pending 对象逐字段一致;动作历史读取还要重新验证 receipt 的终态 status、actionId、fingerprint、executionMode、tool、task / session ledger 绑定,并按当前工具白名单重新解析 safeDetail。运行时路径清洗覆盖 Unix、Windows 盘符、正反斜杠 UNC、file:/...file:///... 和百分号编码绝对路径,同时保留相对文本与 HTTP(S) URL。

  • 2026-07-13 收束门禁:父 run 只要存在尚未终态或尚未由当前父 run 认领的 joinMode=all 隔离组,就不能生成最终回复,也不能调用 agent.action_history;模型必须先通过 agent.run_status 取得并认领唯一 join。waitingGroups > 0 时父 run 持久进入 waiting-for-isolated-join 并释放 lane,重复 resume 不请求 LLM;最后一个 child 就绪后以 deliveryTarget=parent-wake 唤醒同一 run,不创建 continuation。动作历史优先使用 receipt、兼容折叠旧 terminal observation,结构化 detail 上限 7,200 字符。最终真实 gpt-5.5 E2E 形成 94 条 task、158 条 event、164 条 Agent DB、24 条 terminal receipt、3 个隔离实例和唯一 join 认领,动作历史只在 join 认领后执行;Runner 强杀恢复、项目验证、桌面 / 移动浏览器证据、重复项和密钥泄漏门禁全部通过。

  • 2026-07-13 最终提交门禁:最终回复取得项目锁后、创建 finalization journal 前再次读取持久 all-join 交付并确认当前父 run 已认领;未认领按 Stale 回到同 run planning,不写 journal、assistant 或 completed。

  • 2026-07-13 action 投影恢复:task / event 使用 runId + actionId + phase 区分等待确认与终态 observationAgent DB 终态 observation 幂等扫描忽略同 action 的非终态前置记录,只对终态做全字段冲突检查;recentToolCalls 对同 action 原位更新,确保界面不会长期停留在 waiting 状态。

  • game.generate_draft、资产登记 / 导入、记忆写入、预览状态写入、checkpoint / restore、agent 生命周期控制、画板资源回流 / 生成和 policy 写入会先按 .agent/policy.json 判断本次命令是否被项目策略拒绝,再拿项目级 .agent/project.lock 串行化;锁只保护同一本地项目,v1 不做后台锁管理。confirmCommands 可把索引、状态读取、资产登记、checkpoint、预览、agent 生命周期、画板资源回流 / 生成、memory 读写删除和 conversation 读写等命令转成项目策略确认,命中时用户确认后才执行;用户可用 /policy-confirm 命令 加入确认列表,用 /policy-auto 命令 移除确认项。

  • ArtifactWriter 写入最终产物前把当前项目文件保存到 .agent/checkpoints/<checkpointId>/,写入后把新增、修改、删除计数记录到 .agent/agent.db;聊天命令 /checkpoint/checkpoints/diff checkpoint-id/restore checkpoint-id 允许用户手动保存、列出最近 checkpoint、对比和确认回滚到 checkpoint,回滚时会删除 checkpoint 后新增的受跟踪项目文件。.agent/runtime/ 属于运行观测状态,不进入项目索引、checkpoint diff 或 restore 删除范围。

  • Planner、组内角色和 Generator 读取上下文前会先做安全过滤:拒绝 .env*game-creator.config*、Authorization / Cookie / API Key / Token / Bearer 等密钥样式内容,并清理 sk-* / tnr_sk_* tokenmemory、资产摘要和 conversation JSONL 中被过滤的内容不进入 LLM prompt。

  • .agent/run.latest.json 的 schema 固定为共享契约 GAME_CREATION_AGENT_RUN_SCHEMA_VERSION = game-creator-agent-run.v1;TS 与 Rust 都从共享契约读取 run trace 类型,避免开发窗口和 Tauri 写入结构漂移。

  • .agent/run.latest.json 增加可选 lifecycleStatus,把一次生成 run 映射到本地最小生命周期:scheduled / running / waiting / pending / done / failed / killed。聊天命令 /agent-status 读取最近 run/agent-kill 标记为 killed/agent-retry/agent-resume [说明] 标记为 pending,并写入 .agent/activity.jsonl.agent/output.jsonl.agent/context.bundle.json;状态 / 控制结果消息可一键填入 /read .agent/output.jsonl 草稿继续查看 run 输出,Agent 状态栏也可填入 output / activity / context bundle 的 /read 草稿。v1 只做本地状态控制,不承诺真正中断已在上游执行中的 LLM 请求;后续引入独立 runner 后再把 pending 接入 claim。

  • 主窗口 Agent 状态栏的“继续”保留确认卡,“继续说明”只把 /agent-resume 放入聊天输入框,方便用户补充说明后再走同一确认流。

  • v1 的 agent 状态列表和单 agent 对话都复用上述本地文件事实源:状态从 manifest / run trace 派生,单 agent 消息写对应 Session conversation JSONLSession 支持创建、切换和只改元数据的归档,不引入对话 fork,也不把 pending 包装成已经具备后台 claim / resume runner。

  • game.generate_draft 写入最终产物后会复用白名单受限命令 game.static_smoke 做一次生成后自检,至少检查 game/index.html 包含 canvas、canvas 渲染上下文、绘制调用、主循环、非空输入监听、明确目标、失败或胜利状态和重开路径,且不使用远程资源、evalnew FunctionlocalStoragefetchWebSocketServiceWorker,也不得包含固定星核传送门模板词、纯按钮计分模板或 TODO / 待实现 / 这里省略 等未完成实现;画板资源占位引用允许出现在 asset id 或说明中,并把该工具调用写入 .agent/run.latest.json.agent/logs/command.log;自检失败则本次命令失败,不继续启动预览。

  • ArtifactWriter step 使用 file.write.local_artifacts 工具调用记录最终写入的 memory/memory/agents/game/assets/exports/.agent/manifest.json 路径;写入完成后 nextStep 指向 game.static_smoke

  • preview.start / preview.stop 会追加 .agent/logs/preview.log,并在 .agent/run.latest.json 已存在时追加 Preview step 和 preview.* toolCall,记录本地 HTTP 预览 URL 与停止事件;单全局本地预览被新项目替换时,会 best-effort 把旧项目 manifest、preview log 和 trace 记录为 stopped,避免旧项目残留 running;本地 HTTP server 的 / 映射到 game/index.html,只允许读取 canonical 后仍位于项目真实 game/ 或真实 assets/ 下的文件,拒绝 memory/.agent/exports/..、一级 game / assets 符号链接目录和内部符号链接越界,并为常见图片、音频、视频和 Web 资源返回对应 MIME;静态 HEAD 返回真实 Content-Length 但不返回 body,确保浏览器和媒体资源探测可用;上传和画板回流资产可被生成游戏引用但不会暴露记忆或 trace;没有 run trace 的手动预览启动不阻断。

  • 当前单窗口项目开发页的普通聊天文本只进入 project-supervisor 的 active Session;匹配 Session 已有非终态 run 时转为 same-run steer,不切换父 Session/run。它读取当前 Supervisor Session、只读兼容的 legacy 项目对话、短期 / 长期记忆、项目黑板、本地资产和有界仓库上下文,可以正常澄清、使用 Runtime 白名单工具、按项目权限请求确认,并把专业工作委派给现有 Agent;同一父 run 同时活跃的静态专业委派不超过 3 个。新的 user 消息和最终 assistant 只由 Runtime 写入 Supervisor Session,流式草稿只作可丢失展示缓存;React 不再把同一轮写回 legacy 项目对话。静态 delivery/claim 与 isolated all-join 都必须由同一父 run 收齐、认领并完成 observation 持久化后才允许形成唯一最终回复;专业 Agent 的内部对话、工具计划和动态 child 不直接展示给普通用户。显式 /generate <创作想法>/draft <创作想法> 继续保留为确定性旧生成 loop 的待确认快捷命令;它不替代 Supervisor 的自主 Runtime。用户确认旧生成命令后,正式用户聊天仍展示 Planner、Orchestrator、6 组角色 brief、Generator、Evaluator、ArtifactWriter 和 game.static_smoke 的真实进度,并按原契约写入本地产物与记忆。

  • game.generate_draftgame/index.html 必须是可试玩原型,至少包含输入、主循环、目标、失败或胜利状态和重开路径;不能只输出按钮计分或纯展示页。

  • game.generate_draft 会校验 LLM 输出:balance、美术清单和音乐清单必须是 JSON objectgameHtml 必须是自包含 HTML、包含 canvasrequestAnimationFrame,不得加载远程脚本或资源,不得使用 eval / new Function / localStorage / fetch / WebSocket / ServiceWorker,不得把包含 < / > 的用户输入原样写入 HTML。

  • 同一项目内多次 game.generate_draft 不覆盖记忆文件,而是继续追加短期对话记录、长期创作目标记录、项目黑板摘要和角色私有摘要,保留用户迭代历史。

  • game.generate_draft 会把本轮协作写入 .agent/logs/agent.log 和 manifest commandRuns,并将已完成的组内角色任务标记为完成,preview-readiness 在生成后等待本地 game.static_smoke,预览试玩任务等待用户确认。

  • game.generate_draft 会把组内角色 brief、专业组汇总 brief、专业组 / 角色 / 产物交接摘要写入 .agent/passes/pass-N/groups/game/game_design.mdexports/README.md.agent/logs/agent.log,用于追踪 6 组 agent 的最小协作结果。

  • 文件选择会生成待确认的 asset.upload 内置命令;用户确认后才把文件写入 assets/uploads/ 并登记到 manifest。

  • game.generate_draft 会从 .agent/manifest.json 派生本地资产摘要,把已上传、已登记和画板回流资产的 id、类型、媒体类型、本地路径、来源和画板追踪 ID 注入 Planner / 组内角色 / Generator 共用的上下文;资产摘要排在长期记忆前,避免长期记忆过长时被 prompt 截断;不新增平行资产记忆文件。

  • 聊天输入 /help 会在聊天里列出当前可用内置命令,普通用户不需要打开任何开发面板来发现命令;/capabilities 会直接列出聊天 / 上传 / 内置命令、任务拆分、编排、Planner / Generator / Evaluator loop、工具预算、多智能体协作、组内角色协作、短期 / 长期记忆、本地产物、本地 HTTP 预览、画板同步、权限 gate 和 trace 日志等标准 Agent 能力;/audit 会只读聚合 manifest、文件列表和最近 run trace,逐项显示当前本地项目是否已经具备这些能力证据,并区分“6 组任务已配置”“最近 run trace 已实际覆盖 6 组协作”和“最近 loop 是否真正通过 Evaluator”。

  • 主窗口“灵感草稿”只把一条可编辑的小游戏需求写入聊天输入框,不提交、不创建项目、不调用 LLM;用户仍需自行发送并确认生成命令。

  • 聊天区待确认命令必须先记录 permission.pending,用户点击后再记录 permission.confirmpermission.cancel;已授权本地项目内的权限事件同步追加到 .agent/logs/command.log,待确认卡片显示本地写入目标路径。

  • 聊天输入 /status 会读取 .agent/manifest.json 并在聊天里汇总项目目录、任务状态、资产数量、预览状态和最近命令,不向普通用户暴露任务或文件面板。

  • 聊天输入 /files 会通过 file.list 只读列出本地项目内的文件摘要;主窗口最近项目文件可一键读取,也可一键填入 /read/asset-register 草稿,但资产登记仍必须走聊天确认;/checkpoints 复用 file.list / file.read 只读列出最近 checkpoint id、文件数、大小和可复制的 /diff / /restore 命令,主窗口最近 checkpoint 列表也可填入对应草稿;普通用户仍不暴露文件读写面板。

  • 聊天输入 /assets 会读取 .agent/manifest.json 并在聊天里列出本地项目资产路径、类型和来源,资产列表消息和主窗口最近项目资产入口都可一键填入对应资产的 /read 草稿;聊天输入 /art 只使用当前已加载 manifest 盘点美术素材,并提供首版美术生成或读取美术清单草稿,不直接读取文件、不触发平台生成或画板同步;聊天输入 /audio 只使用当前已加载 manifest 盘点音频素材,并提供登记音效或读取音频清单草稿,不直接读取文件、不触发资产写入;/asset-register 路径 [kind] [mediaType] 可确认后登记项目内已有资产;主窗口音效快捷入口只填入 /asset-register assets/audio/sfx.wav audio audio/wav 草稿,不直接写 manifest;普通用户仍不暴露资产面板。

  • 聊天输入 /read 本地相对路径 会通过 file.read 只读返回项目内文本文件内容并在聊天中截断长文本;普通用户仍不暴露文件写入或删除能力。

  • 主窗口常用生成产物入口只把 game/index.htmlgame/game_design.mdgame/balance.jsonassets/manifest.art.jsonassets/manifest.audio.jsonexports/README.md/read 草稿填入聊天输入框;聊天输入 /artifacts 只列出这组固定读取命令并提供首个 /read 草稿,聊天输入 /run-artifacts 只列出最近 run trace 里的产物读取命令并提供首个 /read 草稿,聊天输入 /run-files 只列出 .agent/output.jsonl.agent/activity.jsonl.agent/context.bundle.json 的读取命令并提供首个 /read 草稿;读取仍由聊天侧 file.read 权限流执行。

  • 聊天输入 /logs 只列出 .agent/logs/command.log.agent/logs/preview.log.agent/logs/agent.log 对应的 /read ... 草稿 / 命令,并提供首个 /read 草稿;该命令不直接读取日志,不新增普通用户日志面板,实际读取仍由聊天侧 file.read 权限流执行。

  • 聊天输入 /tasks 会读取 .agent/manifest.json 并在聊天里列出专业组、角色、任务状态、产物交接和下一步可执行任务;普通用户仍不暴露任务面板。

  • 聊天输入 /trace 会通过 agent.trace_read 只读读取 .agent/run.latest.json,在聊天里汇总最近一次 loop 的轮次、stopReason、nextStep、active/carry-over 任务、repairRoutes、agent 建议命令、产物快照和最近 step;没有待同步建议命令时,首个安全产物可一键填入 /read <path> 草稿;active、carry-over、repairRoutes 和 dependencyWaves 必须把 taskId 映射成专业组 / 角色 / 任务名,避免普通用户只能看到内部 id;普通用户仍不暴露开发 trace 面板。

  • 聊天输入 /brief 只使用主窗口当前已加载的 manifest、最近 run trace、预览状态、资产数量和最近命令摘要,在聊天里生成项目简报,并提供 /next 作为后续草稿;该命令不调用 Tauri 读写、不读取文件、不启动或打开预览、不新增普通用户面板,用户可再发送 /next 草稿继续。

  • 聊天输入 /goal 只使用主窗口当前已加载的 manifest.goal、最近 run goal 和 taskGraph.goal,在聊天里列出项目目标来源、上下文查看方向和后续目标细化草稿;该命令不调用 Tauri 读写、不读取 spec、上下文或 trace 文件、不新增普通用户目标面板,真正补充目标仍由用户发送 /agent-resume 细化目标: 并走原确认流。

  • 聊天输入 /spec 只使用主窗口当前已加载的 manifest、最近 run trace、任务声明产物和 trace 输入 / 输出路径,在聊天里列出 Planner 规格、玩法设计、数值表、美术清单、音频清单和发布说明的状态,并提供 /read .agent/spec.md/next 草稿;该命令不调用 Tauri 读写、不读取规格文件、不启动预览、不写项目、不新增普通用户规格面板,真正读取规格仍由用户发送 /read 并走原权限流。

  • 聊天输入 /mvp 只使用主窗口当前已加载的 manifest、最近 run trace、preview、任务、资产和最近命令摘要,在聊天里列出本轮 MVP 内、当前状态、任务、预览、资产、试玩包状态和暂不做事项;该命令不调用 Tauri 读写、不读取文件、不启动或打开预览、不导出试玩包、不新增普通用户 MVP 面板,真正运行、导出或查看包仍由用户发送对应草稿并走原权限流。

  • 聊天输入 /pitch 只使用主窗口当前已加载的 manifest、最近 run trace 和 preview 状态,在聊天里列出试玩定位、一句话、核心乐趣、当前可演示状态、测试者讲解口径和暂不承诺事项;该命令不调用 Tauri 读写、不读取文件、不启动或打开预览、不直接继续 run、不新增普通用户定位面板,真正运行、打开预览或查看 trace 仍由用户发送对应草稿并走原权限流。

  • 聊天输入 /demo 只使用主窗口当前已加载的 manifest、最近 run trace 和 preview 状态,在聊天里列出 30 秒开场、讲解顺序、口播稿、演示状态、最近试玩证据和收反馈口径;该命令不调用 Tauri 读写、不读取文件、不启动或打开预览、不导出试玩包、不发布作品、不新增普通用户讲解面板,真正运行、打开预览或记录反馈仍由用户发送对应草稿并走原权限流。

  • 聊天输入 /rules 只使用主窗口当前已加载的 manifest、最近 run trace.taskGraph、trace artifacts 和 steps,在聊天里列出玩法目标、操作 / 胜负 / 重开口径、设计与入口产物状态、相关任务和最近程序 / 试玩步骤;该命令不调用 Tauri 读写、不读取设计文件、不启动预览、不直接继续 run、不新增普通用户规则面板,真正读取设计或补充操作说明仍由用户发送对应草稿并走原权限流。

  • 聊天输入 /tutorial 只使用主窗口当前已加载的 manifest、最近 run trace、preview 和任务状态,在聊天里列出首屏目标、首局 30 秒引导、原型证据、试玩任务、最近引导证据和补齐项;该命令不调用 Tauri 读写、不读取设计文件、不启动或打开预览、不直接继续 run、不新增普通用户引导面板,真正补齐引导、运行或打开预览仍由用户发送对应草稿并走原权限流。

  • 聊天输入 /mobile 只使用主窗口当前已加载的 manifest、最近 run trace、preview 和任务状态,在聊天里列出移动试玩目标、键盘 / 触屏输入口径、原型证据、移动检查项、关联任务和最近移动相关步骤;该命令不调用 Tauri 读写、不读取代码文件、不启动或打开预览、不直接继续 run、不新增普通用户移动适配面板,真正补齐移动试玩、运行或打开预览仍由用户发送对应草稿并走原权限流。

  • 聊天输入 /accessibility 只使用主窗口当前已加载的 manifest、最近 run trace、preview 和任务状态,在聊天里列出可读性与无障碍检查范围、原型证据、关联任务和最近无障碍相关步骤;该命令不调用 Tauri 读写、不读取代码或 trace 文件、不启动或打开预览、不直接继续 run、不新增普通用户无障碍面板,真正补齐可读性与无障碍事项仍由用户发送对应草稿并走原权限流。

  • 聊天输入 /performance 只使用主窗口当前已加载的 manifest、最近 run trace、preview、资产数量和 trace artifact 摘要,在聊天里列出性能与加载检查范围、关键产物、关联任务和最近性能相关步骤;该命令不调用 Tauri 读写、不读取产物或日志文件、不启动或打开预览、不直接继续 run、不新增普通用户性能面板,真正查看产物或启动试玩仍由用户发送对应草稿并走原权限流。

  • 聊天输入 /polish 只使用主窗口当前已加载的 manifest、最近 run trace、preview、最近自检和资产数量,在聊天里列出试玩前打磨范围、推荐顺序、关联任务和最近打磨相关步骤;该命令不调用 Tauri 读写、不读取文件、不启动预览、不导出试玩包、不写项目、不新增普通用户打磨面板,真正继续打磨、查看评审或准备反馈仍由用户发送对应草稿并走原权限流。

  • 聊天输入 /credits 只使用主窗口当前已加载的 manifest.assets,在聊天里列出素材数量、来源分布、来源清单和交付前需要确认的授权 / 模型 / 画板资源口径;该命令不调用 Tauri 读写、不刷新资产、不读取素材清单、不导出试玩包、不新增普通用户署名面板,真正查看完整资产仍由用户发送 /assets 并走原资产读取流。

  • 聊天输入 /blockers 只使用主窗口当前已加载的 manifest、最近 run trace、preview、最近命令、ready / failed 任务、导出记录和资产概况,在聊天里列出当前阻塞项和首个处理草稿;该命令不调用 Tauri 读写、不读取文件、不启动预览、不导出试玩包、不写项目、不新增普通用户阻塞面板,真正处理阻塞仍由用户发送对应草稿并走原权限流。

  • 聊天输入 /ready 只使用主窗口当前已加载的 manifest、最近 run trace、preview、最近自检、导出记录、ready / failed 任务和资产概况,在聊天里列出试玩就绪度和首个处理草稿;该命令不调用 Tauri 读写、不读取文件、不启动预览、不导出试玩包、不写项目、不新增普通用户就绪度面板,真正启动预览、导出试玩包或交付仍由用户发送对应草稿并走原权限流。

  • 聊天输入 /deps 只使用主窗口当前已加载的 manifest.tasks 和最近 run trace.taskGraph,在聊天里列出任务依赖链、可执行任务和等待依赖;该命令不调用 Tauri 读写、不读取任务文件、不启动 run、不修改项目、不新增普通用户依赖面板,真正查看完整任务或验收标准仍由用户发送对应草稿并走原权限流。

  • 聊天输入 /revise 只使用主窗口当前已加载的 manifest 和最近 run trace,在聊天里准备下一轮改版说明草稿;该命令不调用 Tauri 读写、不读取文件、不继续 run、不启动预览、不导出试玩包、不写项目、不新增普通用户改版面板,真正继续改版仍由用户发送 /agent-resume 改版说明:... 草稿并走原确认流。

  • 聊天输入 /privacy 只使用主窗口当前已加载的 manifest、授权项目路径、最近 run trace、preview、资产来源和导出记录,在聊天里列出 API Key、预览、本地试玩包、内部文件、素材来源和 trace 的隐私 / 交付边界;该命令不调用 Tauri 读写、不读取文件、不导出试玩包、不启动预览、不写项目、不新增普通用户隐私面板,真正查看素材来源、导出或配置仍由用户发送对应草稿并走原权限流。

  • 聊天输入 /risks 只使用主窗口当前已加载的 manifest、最近 run trace、预览状态、任务状态、资产来源和最近命令摘要,在聊天里列出当前项目风险,并提供首个风险处理草稿;该命令不调用 Tauri 读写、不读取文件、不启动或打开预览、不新增普通用户面板,用户必须再发送草稿并按原命令权限流继续。

  • 聊天输入 /criteria 只使用主窗口当前已加载的 manifest.tasks 和最近 run trace.taskGraph,在聊天里列出 active、carry、ready、失败或待处理任务的验收条件和预期产物,并提供 /tasks 草稿;该命令不调用 Tauri 读写、不读取任务文件或 trace 文件、不新增普通用户验收面板,真正查看完整任务仍由用户发送 /tasks 并走原读取流。

  • 聊天输入 /groups 只使用主窗口当前已加载的 manifest.tasks 和最近 run trace.taskGraph / passPlans,在聊天里列出六个专业组的完成、active、carry、ready、失败数量和下一步任务,并提供 /tasks 草稿;该命令不调用 Tauri 读写、不读取任务文件或 trace 文件、不新增普通用户专业组面板,真正查看完整任务仍由用户发送 /tasks 并走原读取流。

  • 聊天输入 /balance 只使用主窗口当前已加载的 manifest.tasks、最近 run trace.taskGraph、trace artifacts 和 steps,在聊天里列出数值组任务、验收口径、game/balance.json 状态、最近数值步骤和试玩关联;该命令不调用 Tauri 读写、不读取数值表、不启动预览、不直接继续 run、不新增普通用户数值面板,真正读取或提交数值反馈仍由用户发送对应草稿并走原权限流。

  • 聊天输入 /budget 只使用主窗口当前已加载的最近 run trace,在聊天里列出轮次、工具调用、stopReason 和下一步建议,并提供 /review/publish/trace/next 草稿;该命令不调用 Tauri 读写、不读取 trace 文件、不新增普通用户预算面板,真正查看完整 trace 仍由用户发送 /trace 并走原读取流。

  • 聊天输入 /qa 只使用主窗口当前已加载的 manifest、最近 run trace、最近命令和 preview 状态,在聊天里列出 Evaluator、任务、静态自检、试玩、最近试玩步骤和产物数量,并提供 /review/tasks/trace/playtest/publish/next 草稿;该命令不调用 Tauri 读写、不读取 trace 或日志文件、不启动或打开预览、不新增普通用户 QA 面板,真正运行自检或打开预览仍由用户发送对应草稿并走原确认流。

  • 聊天输入 /changes 只使用主窗口当前已加载的 manifest、最近 run trace 的 artifacts / steps 和最近命令,在聊天里列出最近 run、可验产物数量、关键产物、最近输出、当前资产、全部产物读取入口、trace 入口和真实 diff 查看方向,并提供 /read <首个可验产物>/run-artifacts 草稿;该命令不调用 Tauri 读写、不读取产物或日志文件、不执行 checkpoint diff、不新增普通用户变更面板,真正读取产物或对比 checkpoint 仍由用户发送对应草稿并走原权限流。

  • 聊天输入 /todo 只使用主窗口当前已加载的 manifest 和最近 run trace,在聊天里列出下一轮优先小步,优先失败、active、carry 和 ready 任务,没有 trace 时回退当前 ready 任务,并提供 /tasks/review/next 草稿;该命令不调用 Tauri 读写、不读取任务文件、不启动 run、不修改项目、不新增普通用户小步面板,真正查看任务或继续修复仍由用户发送对应草稿并走原权限流。

  • 聊天输入 /plan 只使用主窗口当前已加载的 manifest 和最近 run trace,在聊天里列出下一轮协作顺序、各专业组接手任务、空档组和继续执行草稿;该命令不调用 Tauri 读写、不读取任务文件、不启动 run、不修改项目、不新增普通用户计划面板,真正继续执行仍由用户发送 /agent-resume 下一轮计划:... 并走原确认流。

  • 聊天输入 /handoff 只使用主窗口当前已加载的 manifest、最近 run trace、Agent 状态和已载入历史 run 批次,在聊天里生成项目交接摘要,并提供 /next 作为后续草稿;该命令不调用 Tauri 读写、不读取文件、不启动或打开预览、不新增普通用户面板,用户必须再发送草稿并按原命令权限流继续。

  • 聊天输入 /runs 只使用主窗口当前已加载的 latest trace 和已载入历史 run 批次,在聊天里列出 /trace/read .agent/runs/... 读取草稿;该命令不调用 Tauri 读写、不滚动加载更多历史、不启动或打开预览、不新增普通用户面板,用户必须再发送草稿并按原命令权限流继续。

  • 聊天输入 /next 只使用主窗口当前已加载的 manifest、最近 run trace 和最近命令摘要,在聊天里给出下一步建议,列出 /goal/guide/progress/spec/mvp/pitch/demo/rules/tutorial/mobile/compatibility/accessibility/localization/performance/polish/blockers/ready/evidence/llm-routes/deps/revise/privacy/audience/invite/bug-report/survey/cover/screenshots/trailer/faq/post/store/media-kit/release-notes/known-issues/tasks/criteria/groups/balance/budget/qa/changes/todo/trace/review/context/timeline/playtest/test-plan/feedback/retention/share/listing/run/export/exports/open-preview/assets/credits/art/audio/publish/artifacts/run-artifacts/passes/run-files/internals/logs/agent-resume 等安全命令草稿方向,并提供一个首选草稿;该命令不调用 Tauri 读写、不启动或打开预览、不读取文件,用户必须再发送草稿并按原命令权限流继续。

  • /next 的安全命令草稿方向同步包含 /plan,用于从下一步建议进入下一轮分工摘要;该补充不改变 /next 的只读边界。

  • 聊天输入 /review 只使用主窗口当前已加载的最近 run trace,在聊天里列出 Evaluator 通过 / 需返工状态、返工焦点、返工路线、下一步和最近评审步骤;该命令不调用 Tauri 读写、不读取 .agent/findings.md、不新增普通用户评审面板,真正读取评审记录仍由用户发送 /read .agent/findings.md 并走 file.read 权限流,需要返工时只填入 /agent-resume 草稿。

  • 聊天输入 /context 只使用主窗口当前已加载的 manifest 和最近 run trace,在聊天里列出项目对话、短期记忆、长期记忆、项目黑板、Agent 对话、Agent 私有记忆、manifest、最近 trace 和最近 LLM 输入路径;该命令不调用 Tauri 读写、不读取上下文文件、不新增普通用户上下文面板,真正查看上下文仍由用户发送 /read/memory blackboard 并走原权限流。

  • 聊天输入 /timeline 只使用主窗口当前已加载的 manifest.commandRuns 和最近 run trace,在聊天里列出最近命令、日志读取草稿、最近 Run 状态和最近 Agent 步骤;该命令不调用 Tauri 读写、不读取日志或 trace 文件、不新增普通用户时间线面板,真正查看日志、trace 或历史仍由用户发送对应草稿并走原权限流。

  • 聊天输入 /playtest 只使用主窗口当前已加载的 manifest、最近 run trace 和 preview 状态,在聊天里列出原型是否已通过、预览是否运行、Playtest 任务状态、最近试玩步骤和 .agent/logs/preview.log 读取命令;该命令不调用 Tauri 读写、不启动或打开预览、不读取日志、不新增普通用户试玩面板,真正运行或打开仍由用户发送 /run/open-preview 并走原确认流。

  • 聊天输入 /test-plan 只使用主窗口当前已加载的 manifest、最近 run trace 和 preview 状态,在聊天里列出手动测试用例、Preview / Playtest 任务和最近试玩证据;该命令不调用 Tauri 读写、不读取文件、不启动或打开预览、不直接继续 run、不新增普通用户测试面板,真正运行、打开预览或记录反馈仍由用户发送对应草稿并走原权限流。

  • 聊天输入 /audience 只使用主窗口当前已加载的 manifest、最近 run trace、preview 和试玩任务状态,在聊天里列出首批试玩对象、邀请顺序、观察重点和暂不面向的人群;该命令不调用 Tauri 读写、不读取文件、不启动或打开预览、不导出试玩包、不直接继续 run、不新增普通用户对象面板,真正运行、反馈或交付仍由用户发送对应草稿并走原权限流。

  • 聊天输入 /feedback 只使用主窗口当前已加载的 manifest、最近 run trace 和 preview 状态,在聊天里列出反馈方向、反馈模板和参考命令;该命令不调用 Tauri 读写、不读取文件、不启动或打开预览、不直接继续 run、不新增普通用户反馈面板,真正提交反馈仍由用户发送 /agent-resume 试玩反馈: 并走原确认流。

  • 聊天输入 /share 只使用主窗口当前已加载的 manifest、授权项目路径、最近 run trace、preview 状态和 manifest.commandRuns,在聊天里列出原型通过状态、本地预览、本地试玩包、给测试者的简短说明和反馈收集方向;该命令不调用 Tauri 读写、不导出试玩包、不列出历史包、不上传云端、不生成公开分享链接、不新增普通用户分享面板,真正导出或查看试玩包仍由用户发送 /export/exports 并走原权限流。

  • 聊天输入 /listing 只使用主窗口当前已加载的 manifest、最近 run trace、发布组任务和资产清单,在聊天里列出作品页标题、一句话卖点、发布任务、封面素材、说明文案、标签口径和最近运营步骤;该命令不调用 Tauri 读写、不读取发布说明、不上传云端、不发布作品、不新增普通用户作品页面板,真正读取发布说明或继续发布准备仍由用户发送 /read exports/README.md/publish 并走原权限流。

  • 聊天输入 /passes 只使用主窗口当前已加载的最近 run trace,从 artifacts 中筛选 .agent/passes/ 相对路径,在聊天里列出轮次产物读取命令并提供首个 /read 草稿;该命令不调用 Tauri 读写、不读取文件、不新增普通用户轮次面板,真正读取仍由用户发送 /read 并走 file.read 权限流。

  • 聊天输入 /internals 只列出项目内部真相源读取命令,覆盖 .agent/manifest.json.agent/run.latest.json.agent/spec.md.agent/findings.md.agent/policy.json.agent/project.index.json.agent/agent.db.agent/conversations/project.jsonl;该命令不调用 Tauri 读写、不读取文件、不新增普通用户内部文件面板,真正读取仍由用户发送 /read 并走 file.read 权限流。

  • 聊天输入 /publish 只使用主窗口当前已加载的 manifest、最近 run trace、预览状态、资产来源和最近命令摘要,在聊天里生成发布准备清单,列出原型通过状态、预览、任务、资产、音频、包装说明和试玩包导出状态,并提供 /run/trace/agent-resume /export 草稿;该命令不调用 Tauri 读写、不启动或打开预览、不读取文件、不新增普通用户面板,真正导出仍由用户发送 /export 并走确认流。

  • 开发窗口可从 Agent 状态列表进入单个专业 Agent 对话并管理其 Session;正式用户项目开发页只读展示底部专业 Agent 状态和悬浮详情,不提供单 Agent 对话入口、Session 控件或调度工具台。

  • v1 普通用户登录后直接进入单窗口客户端首页;同一窗口中切换首页、项目组、指南 / 反馈和项目开发页。项目组页以紧凑表格管理最近项目,顶部提供搜索、打开项目、新建项目,显示目录和移除最近记录进入行尾菜单;打开项目只切换到项目开发页,不调用 open_game_creator_workspace_window 打开第二窗口。旧 Tauri 窗口 command 只保留兼容,不进入用户主流程。

  • 2026-07-16 补充,2026-07-17 扩展:普通用户窗口顶部账户资产统一复用 PlatformMudPointWalletEntry;首屏余额来自 /api/profile/dashboard,展开时按需读取 /api/profile/recharge-center 中的泥点拆分。顶部资产“充值”与侧栏账户菜单“充值泥点”共用 PlatformProfileRechargeModal,桌面壳固定使用 wechat_native 下单并在弹窗内完成扫码与到账确认,成功后同步刷新顶部余额和泥点拆分。“使用详情”统一打开 packages/shared 中的 PlatformProfileWalletLedgerModal,由各宿主分别维护打开、加载、失败重试状态并读取 /api/profile/wallet-ledger,共享组件只承接账单来源文案、金额与日期展示及 loading / empty / error 视图,不发请求、不持有账户事实。AI 游戏创作壳的 Tailwind 入口必须显式扫描 packages/shared/src/components,避免共享组件的 utility 样式在构建时被遗漏。

  • 主窗口可通过系统文件管理器显示当前项目目录,也可在聊天输入 /open-project 走同一只读打开动作;该操作只打开本地目录,不初始化项目、不写项目文件、不切换工作区。主窗口头部显示最近 .agent/run.latest.json 的 run 状态摘要和当前项目预览状态,并通过“刷新状态”重新读取同一 trace,不新增状态数据库。

  • 首页、项目组页和项目开发页共用单窗口壳的全局运行时配置弹窗,读写 Tauri 应用配置目录中的 game-creator.config.json;正式 Supervisor 项目页缺配置时只显示错误,不自动打开该弹窗。API Key 仍不进入本地项目、trace、manifest 或聊天记录。

  • 首页发送以及项目组打开 / 新建都通过绑定当前 client 的 Tauri 非阻塞原生目录选择器选择项目路径;用户取消目录选择时不覆盖已有输入或草稿。

  • 最近项目列表只来自本机 WebView storage,可逐行移除;该操作不触碰项目目录,也不触发窗口切换。项目组页自动只读检查最近项目路径,已初始化项目优先显示 .agent/manifest.json 里的项目名并保留路径副信息;如果 .agent/run.latest.json 可读,则把 status / stopReason 转成面向用户的状态。缺失、非目录、manifest 损坏或检查失败的条目禁用打开;目录仍存在时可从行尾菜单显示,检查中临时禁用打开 / 显示。页面不恢复清空或手动刷新按钮,本地搜索也不改项目列表。

  • 项目组页“打开”直接进入已初始化且 .agent/manifest.json 可读的 AI 游戏项目;发现根目录或一层子目录中的唯一 Godot 工程时允许导入并进入项目。路径不存在、不是文件夹、普通未初始化目录或 Godot 歧义时留在当前页提示,且不写 .agent。“新建项目”和聊天 project.create 新建入口会先检查目标目录,目标目录已经存在且非空时必须弹出确认提醒;用户继续后才调用 init_local_game_project,默认项目名取目标文件夹名,再写入最近项目并切到项目开发页;用户取消或初始化失败时不切换视图、也不写入最近项目。

  • 聊天输入 /commands 会只读列出 Tauri runtime 暴露的受限命令白名单,读取失败或非 Tauri 环境下回退到共享契约默认列表;该命令不执行白名单命令,也不要求先初始化项目。

  • 聊天输入 /smoke 会生成待确认的 command.run_limited 内置命令,当前只映射到白名单 game.static_smoke,不开放任意命令解析。

  • 聊天输入 /run 会生成待确认的 game.run_local 内置命令,确认后复用白名单 game.static_smoke 运行当前 game/index.html,通过后启动只读本地 HTTP 预览并切换到客户端内运行视图;该命令不开放任意 shell。

  • 聊天输入 /export 会生成待确认的 project.export_package 内置命令,确认后只把 game/**assets/**exports/README.md 打包到 exports/playtest-package-*.zip;导出前重新校验 game/index.html 是可试玩自包含 HTML,拒绝符号链接和越界路径,不把 .agent/memory/、日志、trace、运行时配置或密钥文件写入 ZIP。

  • 聊天输入 /exports 会只读执行 project.export_list,列出当前项目 exports/playtest-package-*.zip 历史试玩包,并提供显示目录或继续 /export 的草稿;该命令不删除文件、不分享文件、不新增面板。

  • 聊天输入 /preview 会生成待确认的 preview.start 内置命令,确认后启动只读本地 HTTP 预览并切换到客户端内运行视图;/open-preview 在本地项目已初始化后生成待确认的 preview.open,只激活当前授权项目对应的 127.0.0.1 运行容器;/preview-status 只查询当前授权项目的本地 HTTP 预览并写入 preview.status 命令日志;/preview-stop 只停止当前项目预览,不展示或停止其它项目遗留的全局预览。

  • 聊天输入 /memory [short|long|blackboard] 读取短期、长期或黑板记忆;/remember [short|long|blackboard] 内容 生成待确认的 memory.write 并追加短期、长期或黑板记忆,未写 scope 时默认追加长期记忆;主窗口“记到黑板”“覆盖黑板”“清空黑板”只填入 /remember blackboard /memory-set blackboard /forget-memory blackboard 草稿,仍由用户补内容并走聊天确认;/memory-set [short|long|blackboard] 内容 生成待确认的 memory.write 并覆盖保存对应记忆;/forget-memory [short|long|blackboard] 生成待确认的 memory.delete

  • 聊天输入 /canvas 画板项目ID 会生成待确认的 canvas.project_open,只打开本机 Genarrative 编辑器里的指定画板项目,不开放任意 URL;确认后聊天先反馈正在打开,再回写真实打开 URL。画板项目 ID 为空或包含控制字符时在聊天侧直接拒绝。

  • 聊天输入 /sync-canvas-project 画板项目ID 会生成待确认的 canvas.project_sync,通过 External Editor API 把该画板项目资源下载到 assets/canvas-sync/ 并登记为画板来源资产;画板项目 ID 为空或包含控制字符时在聊天侧直接拒绝。

  • 聊天输入 /generate-art 提示词 会生成待确认的 canvas.asset_generate,通过 External Editor API 生成首版美术素材并写入 assets/canvas-generated/;提示词为空时在聊天侧直接拒绝。

  • 主窗口“打开画板”“同步画板”“生成美术”和“导入画板包”按钮只填入对应聊天命令草稿并聚焦输入框,不绕过聊天侧确认流;其中“打开画板”只生成 /canvas 草稿,不要求本地项目已初始化;“导入画板包”通过 Tauri 原生文件选择器选择本地 ZIP 后填入 /import-canvas-export /绝对路径 ,仍需用户补画板项目 ID 并确认后才导入。

  • 聊天输入 /import-canvas-asset 本地路径 画板项目ID 资源ID|object:资产对象ID [kind] [mediaType] 会生成待确认的 canvas.asset_import,只把项目目录内已有文件登记为画板来源资产;主窗口画板音频快捷入口只预填 assets/audio/sfx.wav,由用户补齐画板项目和资源 ID 后再走同一确认流。画板只有 assetObjectId 时使用 object: 前缀,不伪造 resourceId。画板项目 ID 为空或包含控制字符时在聊天侧直接拒绝。

  • 聊天输入 /import-canvas-export /绝对/画板素材.zip 画板项目ID 会生成待确认的 canvas.export_import,把画板导出的素材 ZIP 解包到 assets/canvas-imports/ 并登记为画板来源资产。画板项目 ID 为空或包含控制字符时在聊天侧直接拒绝。

  • 开发窗口里的 confirm 权限命令使用原生确认门,取消时只写命令日志,不执行本地写入、删除、预览或画板打开操作。

  • 原生文件上传会写入 assets/uploads/,并追加登记到 .agent/manifest.json

  • 开发模式可把项目内已有文件登记为资产;asset.register 支持 uploadedgeneratedcanvas 三种来源,并可记录画板 project/resource/object 元数据。

  • 开发模式可执行 canvas.project_open,打开本机 Genarrative 编辑器里的指定画板项目。

  • 开发模式可执行 canvas.project_sync,同步当前陶泥儿账号可访问的画板项目资源;普通已认证构建使用网站 Access Token,高级 External v1 模式才要求 Developer Key 的 editor:projecteditor:asset scope。

  • 开发模式可执行 canvas.asset_import,将项目内已有文件按画板来源导入 manifest;也可执行 canvas.export_import,把现有画板素材导出 ZIP 回流为本地项目资产。game.generate_draft 在普通模式登录态有效或高级模式凭据有效时复用同一平台图片生成能力,不新增平行资产模型。

  • 普通模式已在登录后的单窗口项目开发页渲染 GameAgent 工作台、project-supervisor 主聊天和专业 Agent 协作只读状态,不提供专业 Agent / child 单 Agent 对话;首页首条需求直接投递 active Supervisor Session,全新项目没有该 Session 时先通过既有 Session 命令创建并设为 active,已有项目恢复该 Session 与历史后继续交互。Tauri 主窗口承载当前授权项目的 loopback 游戏画面,但不承载开发 Agent picker、调度工具台或任意地址预览调试面板。

  • 聊天生成草案后会尝试启动只读 127.0.0.1:<port> 静态 HTTP server,把预览地址回写客户端项目运行工作台并切换到运行视图;不再调用系统外部浏览器。

  • 开发模式仅在 Vite dev 环境响应 ?dev#devnpm run agc 与 release 都只打开 client 用户窗口,显式 ?agent-chatsupervisor-chat 调试入口不随启动自动弹出。正式构建忽略 dev 参数,release 配置只登记一个用户窗口,登录后同窗口进入首页并在项目组 / 项目开发页之间切换。

  • check:native-shells 会运行 ai-game-creator-shell:checkai-game-creator-shell:build -- --no-bundle,并静态检查 release 与 debug 启动都只登记 client / index.html 这一个默认窗口、禁止 Tauri setup 自动打开 developer 窗口、开发面板必须挂在 devMode 分支内,正式用户 App 的运行容器只接受 http://127.0.0.1:*release / dev CSP 都只为该 loopback origin 开放 frame-src,Tauri 预览激活命令不得调用 opener,用户主流程不得调用旧工作区窗口切换 command。

  • 共享契约提供 GAME_CREATION_AGENT_CAPABILITIES 和内置命令权限枚举;开发模式会展示能力列表。

  • 共享契约提供 manifest task schema 和 ready-task 选择器,用于记录任务拆分、专业组、角色模板、依赖、产物、验收条件和当前可执行任务。

  • 开发模式可读取、保存、删除短期记忆和长期记忆文件;普通用户通过聊天命令完成同类能力。

  • 共享契约提供 GAME_CREATION_APP_LIMITED_RUN_COMMANDS;当前真实命令为 game.static_smoke,用于检查 game/index.html 的可玩原型门槛并写入 .agent/logs/command.log

  • 后台 Agent 的项目 revision 以 .agent/runtime/project-revision.json 为唯一事实源,per-run 验证门禁以 .agent/runtime/verification/<agentId>/<runId>.json 为事实源。每次 file.writefile.patchfile.deleteproject.restore 都必须在实际修改前保守推进 revision,并永久记住当前 run 的 requiresVerification=true;失败或崩溃不回退。只有成功且绑定当前 revision 的 project.verifycommand.run_limited / game.static_smoke 才能放行空 actions;未修改项目的只读任务不强制验证,但最终回复仍必须绑定请求开始时的 responseRevision。per-run context bundle 使用 v2pending action 使用 v3 并绑定创建时的全局 revision;旧版恢复失败关闭。最终 assistant 和 completed 必须在项目写锁内重读 revision / gate 后依次落盘,文件回读、observation 或锁外旧快照都不能替代验证凭证。验收必须分别模拟待执行动作、修改 run 与只读 run 的跨 Agent revision 漂移,证明旧动作不执行、旧回复不落盘、不产生 completed 或 failed、per-Agent 锁不提前释放、原 run/session 在收到 blocker 后保持可恢复;stale continuation 经重启仍从原 nextLoopIndex 续跑,revision 数值或成功验证输出中的动态时间戳不能绕过 context stall。

  • .agent/manifest.json 会记录当前 preview 状态和 commandRuns 受限命令运行结果,作为本地产物索引的最小真相源。

  • 2026-07-15 补充:后台 Runtime 的最终用户回复接入真 Provider SSE。planning/function arguments/thinking/observation 继续只留在私有执行链;AgentRuntimeResult 读取与 CLI 通过 .agent/runtime/response-streams/<agentHash>/<runHash>.json 的有界私有快照恢复公开 accumulated text。快照绑定 Agent/task/Session/run/request slot/steer cursor/revision,只是可丢失展示缓存,不替代 conversation、Provider lifecycle 或 finalization。普通 Project Supervisor 以 runtimeOwned 草稿展示,最终仍由唯一 assistant 落盘替换;steer、取消、失败和身份漂移必须隐藏旧草稿,公共审计只保留哈希与计数。

  • 2026-07-15 真实 gpt-5.5 response-stream 专项已 PASS:39 个不同非空快照在终态前可见,sequence 为 1 -> 418 -> 425 committed,最终 883 字与唯一 conversation assistant 精确一致;final-reply lifecycle 唯一、fallback replay 和重复消息/回执为 0。公共正文、API Key、thinking、诱饵和项目绝对路径泄漏均为 0;project.verify Agent DB 审计固定保存 .agent/logs/command.log 相对路径,并在写入前脱敏 expectedCommand/output 中的项目根路径。

  • 2026-07-15 起,同一 Runtime 文档的“V1.20 单 Agent Provider 原生联网检索”作为联网能力事实源。配置新增默认关闭的 llm.webSearchEnabled 与可继承的 agentLlm.<agentId>.webSearchEnabled;只允许普通/角色直聊和后台首个 tool planning 开启,格式 repair 与 final reply 固定关闭。Anthropic 组合在保存和状态检查阶段失败;网页内容按不可信输入处理,不能改变 Goal、权限、确认、沙箱或工具协议,也不得把密钥、源码、路径、私有对话、记忆或黑板作为搜索词。后台 Provider lifecycle v2 只审计实际布尔值,不保存 query、网页 URL、结果正文或网页指令;当前布尔契约不宣称支持 Codex 的 indexed/live 模式。

  • 2026-07-15 当前正式 openai_chat / gpt-5.5 路由的三轮真实联网专项均 FAIL:上游接受搜索开启请求并完成 lifecycle,但模型没有获得原生搜索能力,无法命中动态 GitHub release baseline。客户端能力已落地但该路由不可启用;最终复验使用正式 AppData 同级的 0600 私有配置副本,源配置 inode/nlink/timestamps/hash 前后完全一致,隔离 Runner/AppData/项目和全部泄漏门禁均安全收束。

  • 2026-07-15 起,同一 Runtime 文档的“V1.21 单 Agent token-aware 持久上下文压缩”作为长会话预算事实源。全局/per-Agent LLM 配置提供 context window、自动压缩阈值和工具输出 token 限额;后台 planning 超阈值时只压缩旧 conversation/observation prefixGoal、任务、计划、steer、pending、verification 与副作用身份逐字段保留。开发 Agent 窗口与 agc:chat 提供同一安全 /compact,正式用户首页不新增控制项。私有 sidecar、context bundle 绑定、Provider orphan barrier、公共零正文和 30 轮真实长链路按 Runtime V1.1 的 V1.21 章节验收。

  • 2026-07-15 V1.21 已落地并完成真实验收:context-compaction suite 在正式 openai_chat / gpt-5.5 路由上完成 30/30 轮、两次压缩 revision、一次 Runner pidfd 强杀恢复和早期显式约束召回;最大估算输入 29134/6400032 组 Provider lifecycle 唯一闭合,重复 assistant/audit、工具重放以及公共正文、summary、API Key、诱饵、项目路径和正式配置路径泄漏均为 0。首轮第 22 轮 Provider transport 失败按单次请求终态停止且零重放,新 disposable 项目完整重跑后 PASS。

  • 2026-07-15 起,同一 Runtime 文档的“V1.22 Runner-owned MCP 动态工具”作为外部工具扩展事实源。AppData 配置管理 STDIO / Streamable HTTP server、Bearer/static header、工具 allow/deny 与 auto / confirm / writes / deny 审批;独立 Runner 持有连接并把过滤后的真实 tool schema 和 server instructions 送入 planning。模型通过现有 submit_agent_tool_plan 请求 mcp.call,调用继续复用 durable pending action、确认、steer、Goal、reconciliation 和 V1.21 token 预算;完整结果只落私有 sidecar,正式用户首页不新增 MCP 调试配置。可选 server 的 tools/list、schema 归一化、重复 tool identity、单 server 或聚合目录容量、未支持 task-mode 错误只隔离该 server,目录状态记录 connected=false + error 且不暴露其工具;required server 对相同错误继续失败关闭。MCP input schema 包入原生 action 的 input 属性时,只把当前 schema document 根的 ##/... JSON Pointer 重定位到 #/properties/input...;命名 anchor、外部引用和带 $id 的独立 schema resource 内 fragment 保持不变。本切片不宣称 OAuth、resources/prompts、sampling、elicitation 或 MCP task-mode 已实现。

  • 2026-07-15 V1.22 已落地并完成真实验收:开发配置窗可管理 server、敏感凭据、工具过滤和审批并通过 Runner 查看有界目录,agc:chat / agc:swarm 可用 /mcp 查询状态。正式 openai_chat / gpt-5.5 路由真实调用 STDIO/Streamable HTTP lookup 和确认后的 mutate,正常 run 的 action/sidecar/receipt 各 3 且最终 assistant 唯一;第二 run 在 HTTP mutate 副作用后强杀 Runner,只进入 1 次 reconciliation,调用、sidecar、receipt 和 assistant 均未重放。公共 arguments、结果正文、instructions、凭据和项目/配置路径泄漏为 0,一次性现场已清理。

  • 2026-07-16 起,同一 Runtime 文档的“V1.23 单 Agent 持久用户输入请求”作为 Needs input 事实源。Agent 可在计划未完成时通过 user.input_request 提出 1-3 个结构化问题,Runtime 保持同一 run 并暂停;Project Supervisor、开发 Agent 窗口和 agc:chat 从私有 sidecar 展示并提交答案。普通 steer、工具确认和最终回复不再承担问题回答语义,问题/答案正文不进入公共审计。

  • 2026-07-16 V1.23 已完成真实验收:正式 openai_chat / gpt-5.5 路由在 Project Supervisor 上产生 1 个含 2 选项的 Needs input,等待期 Runner pidfd 强杀恢复未增加 Provider 请求,回答后同 Session/run 完成唯一最终回复。问题/回答各一条,重复消息、公共正文、密钥、路径和报告泄漏均为 0,隔离现场已清理。

  • 2026-07-16 起,同一 Runtime 文档的“V1.24 Codex 式 scoped AGENTS.md 仓库指令”作为项目规范加载事实源。仓库启动上下文升级为 v2,根与嵌套 AGENTS.md 携带规范 scope 并按根到叶适用,更深规则只覆盖自身目录树,兄弟 scope 不串用;README/CONTEXT 明确保持不可信参考数据。项目指令不能扩大工具、确认、沙箱、隐私或完成门禁,旧 v1 pending fingerprint 必须先形成 repository drift blocker 再重规划。

  • 2026-07-16 V1.24 已完成真实验收:正式 openai_chat / gpt-5.5scoped-agents suite 在无规则正文、期望内容和工具配方的任务下,让同一 Agent 只修改 alpha / beta 两个兄弟目录交付文件;根、父、各自叶规则全部精确命中且兄弟串用为 0,Agent project.verify 与宿主复验均通过。最终脚本复跑的 8 组 Provider lifecycle 唯一闭合,最终 assistant/completed 各 1,重复持久化,以及最终回复/公共审计/报告中的规则正文、API Key、诱饵、项目/配置路径泄漏均为 0,隔离现场完整清理;不再把 prompt 可见性代替模型遵循证据。

  • 2026-07-16 起,同一 Runtime 文档的“V1.25 Codex 式项目 Skill 发现与渐进加载”作为项目工作流加载事实源。仓库启动上下文升级为 repository-startup-context-v3,只发现项目内 .codex/skills/<name>/SKILL.md.agents/skills/<name>/SKILL.md 直接入口,同名时 .codex 优先;首轮 prompt 只注入清洗后的 name / description / entryPath / contentSha256,正文必须在任务命中后通过现有 file.read 按需读取。Skill 不能扩大工具、权限、确认、沙箱、隐私或完成门禁,与适用路径的 AGENTS.md 冲突时后者优先;active Skill 变化推进 repository fingerprint 并阻断旧 pending 动作后重规划。

  • 2026-07-16 V1.25 已完成真实验收:正式 openai_chat / gpt-5.5project-skill suite 先让 hash-only 原始验收真实失败;Agent 在首个变更前精确读取匹配 Skill 1 次、无关 Skill 0 次,以 1 个变更动作只修改目标文件,Agent project.verify 与宿主复验均通过。最终脚本复跑记录 25 条 task、41 条 event、57 条 Agent DB 和 5 个成功工具动作;4 组 tool-plan Provider lifecycle 唯一闭合,最终 assistant/completed 各 1Skill 正文、API Key、诱饵、项目/配置路径泄漏和重复持久化均为 0,隔离 Runner/AppData/项目完整清理。

  • 2026-07-16 起,同一 Runtime 文档的“V1.26 Provider 原生工具目录”作为 OpenAI-compatible planning 协议事实源。Chat / Responses 不再只广告 submit_agent_tool_plan 包装函数,而是直接提供 update_agent_planrespond_to_user、全部内置 Runtime action 和动态 MCP function;每个函数使用独立 schema,Runtime 继续负责身份、权限、确认、沙箱、revision、验证、恢复与副作用防重放。2026-07-27 起 Anthropic 也走同一套原生工具目录,text JSON / wrapper 解析只作为历史响应与确定性 fixture 的兼容入口,不再是任何 Provider 的正常请求路径;新请求和 repair 不能静默降级。plan-only 是合法持久 checkpoint,未完成计划仍阻止最终化。

  • 2026-07-16 V1.26 已完成真实验收:正式 openai_chat / gpt-5.5project-skill suite 中 9/9 个成功工具计划与 6/6 个格式修复全部使用 native_runtime_toolswrapper/text fallback 均为 0。Agent 自主读取匹配 Skill、只改唯一目标文件并完成 Agent/宿主双重验证;15 个 tool-plan 和 1 个 final-reply lifecycle 唯一闭合,最终 assistant/completed 各 1,重复、Skill 正文、API Key、诱饵、项目/配置路径和报告泄漏均为 0,隔离 Runner/AppData/项目完整清理。

  • 2026-07-16 V1.26 后重新加强并复验 goal-runtime:Goal suite 现在把成功计划、repair、call metadata、wrapper/text fallback 和协议审计零 payload 纳入硬门禁。正式 openai_chat / gpt-5.5 最终复跑的成功计划 21/21、repair 17/17 全为 native_runtime_tools;Goal edit、旧动作失效、真实失败修复、pause、Runner 强杀、显式同 run resume、verification、finalization 和唯一回复全部 PASS,重复、重放、正文、密钥、诱饵与路径泄漏均为 0。Goal 阶段等待同时增加 terminal fail-fastProvider transport failure 不再占满 30 分钟验收超时。

  • agc:test:chat / autonomous-game-build 不再只因 game/index.html 可试玩就跳过可用的画布能力。普通模式当前平台会话有效,或 standalone game-chat/高级模式 Developer Key 有效,且项目尚无规范 canvas / image/* / art-spritesheet 本地素材时,缺省 Supervisor 首批协作固定加入 art-asset-plan,并要求真实交付 assets/art-spritesheet.png;已有有效首版素材的后续修复轮不重复生成或扣费。该工具仅在自主构建 profile 的视觉职责中作为固定 auto-safe 动作;未登录或高级凭据缺失时不伪造图片产物。

  • 同一轮程序与美术并行时,External Editor 网络请求和图片下载不能持有 .agent/project.lock,请求阶段也不能借 read_manifest_for_project 补 seed task 或重写 manifest;只允许读取已初始化 manifest 的只读快照,下载完成后先校验声明图片类型的文件魔数,再取得项目锁提交固定路径、资产登记、revision 和验证凭证。视觉专业 Agent 按同一 run 的 verifiedRevision >= mutationRevision 完成交付,不受其它专业 Agent 后续推进全局 revision 的影响,也允许在更晚 revision 复验;Supervisor 的静态自检和浏览器试玩仍必须精确覆盖最新全局 revision。已有自定义项目协作策略只补缺失的 art-asset-plan,不额外注入缺省程序/质量职责;规范素材复用额外要求本地文件具备有效 PNG 签名,损坏占位不能阻止重新生成。

  • 2026-07-16 起,V1.27 只允许同一 Agent 把连续 2-3 个自动批准的严格只读 action 组成持久并行批次。首版白名单为 memory.read / conversation.read / asset.list / project.search / project.diff / git.inspect / file.list / file.read / task.list;写入、确认、命令/进程、验证、生成、MCP、Git commit、委派和回执认领仍按 Provider 顺序串行。批次用项目一致性锁形成 steer/Goal/取消的线性化边界,物理读取由独立工作线程重叠执行,observation/task/event/receipt/context 仍按 Provider action index 稳定投影;executing Runner 恢复只重放严格只读观察,observed 只补投影。

  • V1.27 的 8 项确定性回归已证明:2 个读取真实非空重叠;第二个物理读取先结束时仍按 Provider 顺序投影;3 个动作 executing 恢复保持原 actionIdobserved sidecar、部分公共投影、部分 context 和删除 sidecar 前故障都从持久前缀继续且零重复;确认策略阻止自动批次;取消、Goal/repository drift 阻止旧读取重放;steer 先获得锁时旧批次零执行,批次先获得锁时 steer 等到全部读取 observed 后才接受。正式 openai_chat / gpt-5.5 的隔离 parallel-read suite 同样 PASS:真实模型同轮提交 2 个独立 project.search,物理重叠 10,969,247ns,4/4 个成功工具计划与 2/2 个 repair 全为 native_runtime_tools6 个 tool-plan 与 1 个 final-reply lifecycle 唯一闭合,最终 assistant/completed 各 1;重复、正文/API Key/诱饵/项目与配置路径泄漏均为 0Runner/AppData/项目完整清理。V1.27 当前真实行为门禁为 PASS。

  • 2026-07-16 起,Runtime V1.1 文档的“V1.28 Project Supervisor 合同委派与单回复收束”作为正式用户多 Agent 协作的当前编码事实源。project-supervisor 是正式用户唯一默认对话和最终回复 Agent;专业 Agent 与 child 只生成内部回执、摘要和证据,开发直调入口不改变该边界。

  • V1.28 的新 native agent.delegate 必须同时携带 agentId / task / acceptanceCriteria / expectedArtifacts / repairOfDelegationId / runId,其中 acceptanceCriteria 为 1-8 项,expectedArtifacts 为 0-16 个精确项目内非私有相对文件,两个引用字段可为 null。旧持久 action 缺字段只按空合同恢复,已有 pending/delivery/claim sidecar 不迁移。durable delivery 与 claim receipt 原样保存合同和 structuredResult,后者包含 evidence-ready | needs-repair、artifact path/SHA-256、缺失产物、验证要求与 revision、安全 evidence/error。

  • Runtime 只按 child completed、预期产物齐全和必要 verification passed 判定 evidence-readySupervisor 仍须按 acceptanceCriteria 结合摘要与证据做语义验收,不能把 evidence-ready 自动视为通过,也不能忽略 needs-repair。专业 Agent prompt 带完整合同;无法自行裁决的问题由 Supervisor 汇总后通过 user.input_request 向用户提问。

  • Supervisor 认领原 delivery 后可为 needs-repair 或语义未通过创建一个 repairOfDelegationId=<原 delegationId> 的新委派。repair 必须完整继承原合同并交回原专业 Agent,只能留在同一父 run、深度为 1、同一原 delivery 同时最多一个非 suppressed 投递;相同重放幂等复用,不同重复/并发请求拒绝。suppressed repair 继续阻断,同一 action 可原地恢复;该 action 已持久失败时,新 action 只可在全部既有 repair 均 suppressed 时重做基础设施投递。所有必要 delivery/claim/repair、结构化计划、verification、确认、用户输入和其它既有 blocker 清零后,原 Supervisor run 才能写唯一用户回复。

  • V1.28 对 Provider 瞬态失败采用 Runtime 显式重试:agentLlm.<agent>.maxRetries / retryBackoffMs 表示独立物理尝试及其有界指数退避,不得恢复为 LlmClient 在单 lifecycle 内隐式重放。每次尝试都重建禁用自动重试的 client,并写独立单次 lifecycle;首次 request slot 不变,第 N 次重试稳定使用 -transient-N 后缀。只有 timeout / connectivity / transport 可重试;工具协议无效仍进入独立 repair-N 格式修复,其他错误与重试耗尽按原失败路径收束。重试前必须重新检查 Goal、steer、cancel、task/run 与 orphan 门禁;控制请求可阻止下一次尝试,Runner 强杀后无可信终态的 started 仍进入 reconciliation,不能自动补发。重试发生在解析和副作用之前,不创建 action、pending、receipt、delivery、assistant 或 revision;既有 Runner、orphan、finalization 和隐私边界均不放宽,公共审计不得保存请求/响应正文、arguments、凭据或绝对路径。

  • V1.28 已于 2026-07-17 完成正式 openai_chat / gpt-5.5 supervisor-swarm PASS:同一 native 批次双专业委派、真实 Provider 重叠、2 份初始 delivery、1 次 targeted contract read、1 份唯一 repair、pidfd Runner 强杀/boot 恢复、同一父 Session/run、唯一 Supervisor assistant 和 3 条内部专业 assistant 全部成立。报告包含 46/46 闭合且 completed 的 Provider lifecycle,成功计划 24/24、格式修复 20/20 全为原生工具协议;重复、残留 sidecar、Provider payload、私有正文、API Key、项目/正式配置绝对路径、报告、secret 与 lure 泄漏均为 0。正式 AppData 零 CLI 调用且源 Runner endpoint 未变化;规范复验命令为 npm run ai-game-creator-shell:agent-runtime:real-e2e -- --config-dir <AppData> --suite supervisor-swarm

  • 2026-07-17 追加 supervisor-swarm-transient-retry 受控故障门禁:一次性本地回环代理只让 design-director 首个请求在正文转发前断线,并暂停后继请求,直到验收器确认唯一 failed lifecycle、唯一 retry audit、新 -transient-1 identity,以及 action/receipt/子委派/claim/assistant/pending/revision/upstream forwarding 全为 0。E2E 启动 CLI/Runner 时会把 loopback 合并进 NO_PROXY / no_proxy,避免继承的系统 HTTP 代理接触故障门禁请求中的凭据和正文。最终加强版正式 gpt-5.5 报告为 46/46 lifecycle 闭合、45 completed/1 failed/1 retry;代理观察到的 10 个目标 Agent 请求与该 Agent lifecycle 数量一致,放行后完整双 Agent、唯一 repair、Runner 强杀恢复、唯一 Supervisor assistant、零重复/残留/泄漏继续 PASS。隔离 AppData 创建在正式目录同级,source-dir guard 与 sourceAppDataDirectoryUntouched 证明正式 AppData 未被写入,源配置与 endpoint 身份保持只读,失败 partial report 保留已取得的 retry checkpoint,代理与隔离现场全部清理。该 suite 只证明显式重试和既有协作链可组合,不把预置双 Agent fixture 扩大解释为自主编排;无 Agent ID/并行/repair 配方的自主 suite、真实 agc:chat、static+isolated 组合和 Tauri 宿主 E2E 仍待单独验收。

  • 2026-07-19 正式客户端 pvz 现场出现专业 Agent 间歇性 transport 失败。早期私有 raw log 证明 native-tls/OpenSSL 路径会命中 TLS record bad-MAC,不是鉴权、模型不存在或 HTTP/JSON 错误;同配置的 Provider 模型查询与短/长认证请求均成功。现场同时发现 release GUI 仍复用前一晚的 debug Runner,原因是旧 endpoint 只校验协议和 ping。修复后 endpoint 增加当前 executable 内容 SHA-256,协议与构建身份都一致才可复用;身份缺失/不一致只允许 idle 安全退役,busy 不强杀。新配置默认 maxRetries=2 / retryBackoffMs=500,正式现场同步改为该值,使 timeout / connectivity / transport 继续按 V1.28 独立 lifecycle 有界重试;显式保存为 0 仍表示禁用重试。native-tls 即使执行两次退避重试仍可连续三次命中 bad-MAC,因此 LLM 专用 reqwest 固定为 Rustls,MCP 等其他 HTTP 客户端不变。该切换消除了已观测的旧 OpenSSL bad-MAC 路径,但后续 Rustls 现场 raw log 仍出现 connection error: cannot decrypt peer's message,程序 Agent 在三次尝试后失败;因此 TLS/transport 根因尚未彻底关闭。旧 run 因在途 Provider 请求安全进入 needs-reconciliation 后被显式取消,并以新 runId 在同源 Rustls Runner 重试;工作台的同项目重试只是用户恢复入口,不是 TLS 根因修复。

  • 2026-07-17 V1.30 supervisor-swarm-autonomous-chat 最终真实 PASS:唯一业务任务和仓库规则均不包含编排配方;Supervisor 在 1 个 native 批次自主选择两个不同专业 Agent,真实 Provider 重叠后形成 2 个初始 delivery,并基于 acceptance criteria 自主创建 1 个继承原合同的 repair。最终报告包含 110 条 task、197 条 event、330 条 Agent DB、9 条会话消息和 51 started / 51 terminal / 51 completed / 0 failed Provider lifecycle28/28 成功计划与 19/19 格式修复均为原生工具协议,父计划 4/4 completedRunner pidfd 强杀恢复后身份稳定,turn.report settled、正式 assistant 1、内部专业 assistant 3,重复、sidecar、正文、密钥、诱饵、项目/配置路径和报告泄漏均为 0。两次较早的独立尝试在 maxRetries=0 下各遇到 1 次外部 Provider 终态失败并中止,未与最终 PASS 拼接。

  • 2026-07-17 Runtime V1.31 的同父 run 混合协作门禁已完成独立真实 PASS;详细业务任务边界、首批 confirmation gate、static/isolated durable 合同、三条确定性回归、真实报告数字和失败轮隔离记录统一以同一 Runtime 文档的“V1.31 Project Supervisor 静态与隔离子 Agent 混合协作门禁”为事实源。App 侧复验入口为 npm run agc:mixed-swarm-e2e -- --config-dir <AppData>,不在实施计划重复维护一次性拓扑和计数。

  • agent.message 使用来源 Agent/run、目标 Agent/Session 和清洗后正文 SHA-256 形成稳定语义身份。同一语义消息只允许写 1 条目标 tool conversation、1 条 conversation.message 和 1 条 agent.runtime.agent.message;后续 Runtime action 仍完整落账,但返回 messageAppended=false 且不算新的 loop 进展。专业 Agent 不得用重复消息替代最终回执;持续重复时最多经过当前 6 轮停滞窗口即以 loop-budget-exhausted 失败,保留 in_progress 计划且不写 completed。完整后台回归同时断言 6 个 actionId、同一 action fingerprint、6 组 action/observation/receipt、消息持久化唯一、receipt 零正文、第 7 次 Provider 请求为 0。

  • 开发模式可通过本地项目文件面板执行 file.list/read/write/delete,普通用户界面不暴露文件面板。

  • 2026-07-17 起,同一 Runtime 文档的“V1.32 Runtime 强制 Supervisor 协作合同”作为 mixed swarm 可靠性事实源。项目可用 .agent/collaboration-policy.json 约束首波 static/isolated 模式、数量和 required static AgentRuntime 在任何 child 副作用前整批校验并把合同指纹固化进 Provider batch v2。当前父 run 一旦形成 delivery/group,正式 project-supervisor 默认只负责编排、状态认领和验证,不再直接执行项目 mutation;专业 Agent/isolated child 权限与唯一 Supervisor 最终回复边界保持不变。

  • 2026-07-17 V1.32 最终代码已完成独立真实 Provider PASS:首批 mixed batch、三 isolated child、Runner 强杀恢复、专业返工、宿主验证、唯一最终回复与零重复/残留/泄漏同时成立。真实报告计数、隔离重试配置和仍待收敛的 tool-plan repair 成本统一以 Runtime 文档 V1.32 章节与共享决策记录为准。

  • 2026-08-03 恢复执行补充约束:整个 pending action continuation、它进入的后台主循环,以及完成、取消或失败后 drain 同 Agent 后续队列时,都必须跨越独立 Tokio task 轮询边界,不能让 pending executor、task queue 与 Agent 主循环的大型 async poll frame 在同一 worker 调用栈连续嵌套。边界输入必须先装箱,避免泛型 helper 在真正 spawn 前仍把大型 future 保留在调用方 async frame;边界同时必须随父 continuation 取消子任务并保持 durable action、batch、run/session 身份及恢复防重语义,当前使用 boxed future 与 JoinSet 承担该约束。普通后台任务、静态委派子任务和 manifest ready-task 的首次执行统一通过现有 16 MiB 专用 Runtime worker 接管任务锁后轮询,不能把完整 Agent 主循环直接放回默认 Tokio worker;worker 创建或锁交接失败必须把当前 run 持久化为失败。2026-08-10 起,Provider、Codex CLI 与 Codex app-server 的组合分发也必须在持久重试 helper 或非持久压缩路径内构造完整物理请求后、进入下层泛型 control/lifecycle helper 前装箱,不能等到底层 helper 才装箱已经进入调用方 frame 的泛型 future。CI 和生产均使用默认 worker 栈验证,不能靠逐个扩大 queue worker 栈或提高 RUST_MIN_STACK 掩盖问题。

  • 2026-07-18 起,同一 Runtime 文档的“V1.34 动态隔离子 Agent writeScopes 命令绕过封堵”作为 isolated child 的现行能力事实源。在 scope-aware OS sandbox 完成前,动态 child 无条件禁用 project.verify / project.git_commit / command.exec / command.start / command.stdin / preview.start / agent.delegate / agent.spawn_isolated / project.restore / agent.schedule_ready / canvas.asset_generate / task.create / task.update / blackboard.write 和全部 MCP;原生工具策略统一显示 denied,模板、项目 policy 与用户确认均不能放宽。保留固定只读 command.run_limited、同身份 command.output_read / command.poll / command.terminate、既有预览的 preview.validate,以及严格位于 writeScopes 内的 file.write / file.patch / file.delete / project.patchset

  • V1.34 的新单动作在 confirmation 和 OS launcher 前拒绝;新多 action 原生 batch 只要含一个 denied member 就在独立 pending-action sidecar、confirmation、OS spawn、revision 和任何成员项目副作用前整批 abort,只保留 aborted / nextActionIndex=0 batch 事实。旧 pending / approval / batch 真正进入执行器时仍重新应用当前 child 边界,旧 executing 未知结果继续进入既有 reconciliation。该安全收紧由恶意 sibling 写入、策略快照、batch、旧 pending 执行器重验和 isolated/mixed/collaboration/provider-batch 回归证明;不因本切片重跑已通过且 isolated mutation 为 0 的 V1.31/V1.32 外部 Provider suite。通用命令只有在后续 scope-aware OS sandbox 对所有后代强制同一 writeScopes 并通过独立决策与测试后才可重新评估开放。

  • 2026-07-18 起,同一 Runtime 文档的“V1.35 多 ready isolated all-join 原子认领与恢复”作为 agent.run_status 同父 run 多 group 认领的现行事实源。Runtime 按 delegationGroupId 排序并一次性预取全部 join 锁;任一后续锁忙时保持零 delivery mutation、零 claim sidecar。全锁就绪后,同一 action 的 durable claim journal 按 prepared -> committed -> observed 推进;部分 commit 或 Runner 恢复只能复用该 journal 幂等补齐。只认领可完整放入优先 readyIsolatedJoins 观察预算的有序前缀,未观察旧 claim 可由后续 action 完整重放,但不创建第二份 isolated claim。每个 claimed delivery 必须由匹配原 action/group 的 journal 覆盖;无 journal 的旧 delivery 每轮只迁移一个原 action,已有 journal 不得扩写或状态倒退,跨 action group 归属冲突失败关闭。成功 observation 写入 pending sidecar 后只能把本轮完整输出的 claim 标记 observed,任一未观察或无 journal claim 继续阻断 finalization;每个 group 审计按 actionId + delegationGroupId 唯一,并在 Agent DB 锁内修复 torn tail、全量核对后幂等追加。

  • V1.35 定向验收覆盖后一个 join 锁冲突、mixed static 锁失败后新 action 重放 isolated 结果、Agent DB torn tail 后 prepared/partial claim 恢复、多旧 action 逐轮迁移、已有 journal 单调性与跨 action group 归属冲突;isolated 36/36、project_supervisor 42/42、supervisor_collaboration 27/27、provider_action_batch 12/12 已通过,Tauri/Rust 全量为 915 passed、4 个环境依赖用例按设计 ignored。以上定向结果只证明本地协议回归,真实 Provider 结论见下一条。该协议不等于 V1.34 的 scope-aware OS sandbox 已完成;后者仍未完成,动态 isolated child 的现行禁用边界保持不变。

  • 2026-07-18 V1.35 后续真实 Provider E2E PASS:同一父 Session/run 先创建含 2 个 child 的初始 isolated all-join group;首次 parent-wake 后、任何 join claim 前,再创建含 1 个 child 的 follow-up group。两组的精确 writeScopes 集合互不重叠,最终由同一个状态为 observed 的 join claim journal 同时覆盖两个 groupRunner 强杀/恢复前后身份稳定。Provider lifecycle 53/53 全部 completed、failed 为 0;重复、泄漏与残留均为 0。V1.35 真实 Provider 门禁据此关闭;V1.36 的 static + isolated 混合 observation 完整性仍按独立门禁验收。

  • 2026-07-18 起,同一 Runtime 文档的“V1.36 混合协作 observation 完整性”补齐 readyDelegateReceiptsreadyIsolatedJoins 同轮返回边界。静态回执完整 JSON 单批最多 6000 字符;isolated-only all-join 保持 10000 字符,和静态回执混合时降为 6000 字符;普通 Runtime 状态与 claimed 摘要最多占 3500 字符。完整 agent.run_status detail 仍以 16000 字符为硬上限,超过上限必须失败关闭,禁止先认领后静默截断证据。

  • V1.36 的静态回执先完整保留已绑定当前 action 的 recovery receipts,再按 delegationId 为新 ready delivery 选择稳定前缀;只预取本批 delivery 锁,并在锁内重读核对快照,超预算或未选中的后续 delivery 保持 Ready,其锁竞争也不能阻断必选恢复。必选集合本身无法完整放入时在写 claim sidecar 和改 delivery 前失败。pending observation 从 readyDelegateReceipts 解析唯一 delegationId 集合,只有与 durable claim receipts 精确相等且前置区块唯一、ready=true 时才允许 Committed -> Observed;缺失、额外、重复或无效 ID 均继续阻断 finalization。mixed 路径仍保留 isolated 先认领、static 后续失败可由下一 action 完整重放 isolated claim 的 V1.35 恢复顺序。定向回归为 project_supervisor 46/46、mixed 5/5、isolated 37/37、supervisor_collaboration 27/27、provider_action_batch 12/12Tauri/Rust 全量为 923 passed、4 个环境依赖用例按设计 ignored。本切片未重跑真实 Provider,不把既有 PASS 扩大解释为 V1.36 已重新外部验收。

  • 2026-07-18 起,同一 Runtime 文档的“V1.38 父 run 协作策略持久快照、绑定记录与漂移隔离”覆盖 V1.32 的 live drift reconciliation 旧口径。首个非 aborted durable collaboration batch 是线性化点:v2 batch 必须先落盘,随后在任何 action 副作用前,以同一父 run 锁内 CAS 依次绑定 .agent/runtime/collaboration-policy-snapshots/<agentKey>/<runKey>.json 和独立 .agent/runtime/collaboration-policy-snapshot-bindings/<agentKey>/<runKey>.json;没有既存 binding 的首次 aborted batch 两者都不创建,matching binding 已存在时则可用完整验真的 aborted v2 contract 恢复缺失 snapshot。binding 是“该 run 曾绑定”的持久记录,不能通过删除 snapshot 把 run 降级为未绑定。

  • snapshot v1 固定且完整包含 schemaVersion / projectId / parentAgentId / parentRunId / boundFrom / policy / policyFingerprint / snapshotFingerprint / boundAtsnapshot fingerprint 绑定除 snapshotFingerprint / boundAt 外的全部稳定字段。binding v1 固定包含 schemaVersion / projectId / parentAgentId / parentRunId / boundFrom / policyFingerprint / snapshotFingerprint / boundAt,必须与 snapshot 逐字段一致。安全 ID 可原样作 key;不安全 Agent/run ID 必须使用有界安全前缀加原始 ID 稳定 SHA-256,锁 key 对完整父 Agent/run 身份计算稳定指纹,禁止 lossy 规范化碰撞。

  • 恢复优先级为 existing valid snapshot > 完整验真的 v2 batch contract > 符合严格状态门禁的 legacy 当前有效 policy。snapshot 存在但 binding 缺失时可从 snapshot 补写;binding 存在但 snapshot 丢失时只允许可信 v2 contract 按首次身份恢复,没有可信 v2 contract 时禁止按 live policy 重绑。contractless/v1 collaboration batch 必须先失败关闭,不能伪装 fresh run。legacy-current-project-policy 仅允许无 snapshot/binding、无可信 v2 contract,且不存在上述旧 batch,并由 durable 身份和状态明确证明属于 pending / running / waiting-for-confirmation / waiting-for-user-input 的旧父 runterminal、needs-reconciliation 或身份/状态未知 run 的状态读取不得新建 snapshot。

  • 已有 durable/未观察 claim 与 legacy claimed delivery 继续按原 action/group 身份恢复,不要求先创建新绑定;新 claim 必须先成功解析 effective snapshot 并核对 binding,再进入 V1.35-V1.37 的全锁、预算、完整 observation 和 group 数量门禁。snapshot 绑定后 global policy 的 matched / drifted / unreadable 只进入有界 status/诊断,不能改变后续执行;新 policy 只由后续新父 run 采用。2026-07-19 self-test、52/52 collaboration 定向回归和 949 passed/4 ignored Rust 全量已完成,终态快照保留也有独立回归;真实 mixed-swarm 功能样本已闭合但受正式 endpoint 外部重启污染,私有配置源的后续独立运行又连续耗尽 transient Provider retry,不能拼接证据,当前仍不得声称 V1.38 真实 E2E 已 PASS。详细报告以 Runtime 技术方案 V1.38 节为准。

  • 2026-07-19 起,同一 Runtime 文档的“V1.39 首次规划 Provider 瞬态重试持久等待态”作为后台首次规划重试的恢复事实源。tool-plan repair-0 及其自动 context-compaction 在瞬态失败后先写 per-Agent/run retry sidecar,再投影 waiting-for-provider-retry 并释放 lane;Runner 重启按到期时间恢复同一 Session/run/loop/attempt,同 Agent 后续任务保持 FIFO,其它 Agent 可并行。final-reply、手动压缩和 tool-plan repair-N 暂不扩展为持久重试;工具策略刷新时间不得进入请求指纹。最终代码已完成独立真实 gpt-5.5 / openai_chat / high PASS:父 Agent 首次规划在 30s 退避期执行一次 pidfd Runner 强杀,重启后 sidecar 身份/attempt/retryAt 稳定,到期前零早发且第二个请求网络接收时间不早于 retryAt;随后同一父 run 完成双专业 Agent 真重叠、2+1 delivery、唯一 repair、唯一最终回复和零重复/残留/正文/Key/路径泄漏,37/37 lifecycle 闭合为 36 completed + 1 injected failed + 1 retryincidental failure/retry 均为 0,隔离现场完整清理。额外真实瞬态失败按 request identity 单独计数且仍须完整恢复,不能混入受控注入链。该证据不改变 V1.38 真实 E2E 尚未 PASS 的独立结论。

  • 2026-07-19 V1.40 在上述 sidecar 协议上补齐后台 final-reply 和其前置自动 context-compaction,分别使用 requestKind=final-reply / final-reply-context-compaction。final-reply prompt 改用可由 context bundle 精确恢复的有界收束摘要,不包含会随恢复阶段变化的 Runtime 投影或无法持久重建的临时 tool-plan 字段;response 状态先与 context bundle 同步,再允许发出 Provider 请求。Runner 恢复命中任一 final-reply sidecar 时按原 nextLoopIndex / baseRequestSlot / requestFingerprint 跳过新 planning,压缩链先完成原压缩再继续 final reply;流式失败半句不提交,成功后仍只经原 finalization journal 写一条 canonical assistant。稳定身份漂移则删除旧 sidecar并在同一 run 重新规划。确定性门禁已覆盖两种 sidecar-first 投影窗口、恢复扫描、网络接收时间不早于 retryAt、失败/恢复 HTTP body 逐字节一致、唯一 lifecycle/assistant/stream 和终局零 sidecar;当前 provider_retry_ 为 21/21。真实外部 Provider 的 final-reply 退避期 Runner 强杀尚未独立 PASS;成功响应到压缩 sidecar/finalization journal 的交接窗口,以及 journal 清理到 stream committed 的窗口也尚未补齐,不能借用 V1.39 首次 tool-plan 证据或宣称成功请求 exactly-once/stream 终态事务。手动压缩与 tool-plan repair-N 仍保持进程内重试。

  • 2026-07-20 起,同一 Runtime 文档的“V1.41 Provider 成功响应持久交接与回复流终态恢复”覆盖 V1.40 的两个成功窗口。.agent/runtime/provider-handoffs/<agentKey>/<runKey>.json 使用严格 game-creator-provider-handoff.v1,绑定完整 retry identity、实际物理 providerRequestId、slot/attempt 和经 thinking、密钥、项目路径及绝对路径过滤后的规范文本响应;写入采用 0600 原子 sidecar、.previous 恢复和写后完整回读。当前仅覆盖 tool-plan 前置自动 context-compaction、final-reply 前置自动 final-reply-context-compactionfinal-reply;手动压缩和 tool-plan 成功响应/function arguments 不写 handoff。

  • V1.41 对支持范围执行 handoff-firstProvider 成功后先提交并回读 handoff,再闭合同一实际 requestId 的 completed lifecycle;恢复先消费 handoff,匹配 retry 时复用原 attempt/slot 且零新网络请求,retry identity/attempt/slot 冲突进入 reconciliation,稳定身份漂移先闭合旧 lifecycle 再作废并同 run 重规划。自动 compaction 必须在规范 sidecar 写入并回读一致后才清理 handofffinal-reply handoff 则保留到 finalization 和 stream commit 全部完成。任一 primary、.previous 或损坏 handoff 都让 Runner 保持 busy,阻止 runner.shutdown_if_idle

  • finalization schema 已正式升为 game-creator-runtime-finalization.v4responseRequestSlot 与 response revision/fingerprint、steer cursor、计划及 Goal 快照共同进入 finalizationId 指纹,篡改 slot 必须失败关闭;project.rs 的 Agent DB finalization lifecycle 白名单兼容 journalSchemaVersion v1-v4,缺少 slot 的 v3 journal 继续按旧指纹和 legacy slot 派生规则读取。assistant、Runtime 和 Goal 提交后,缺失或仍为 streaming/failed/discarded 的回复流由 journal 固定身份重建为 ready,再推进 committedcommitted 写后必须回读身份、状态和正文,成功后才一起删除 finalization journal/handoff,失败则保留 finalizing 供 Runner 幂等恢复。确定性测试矩阵以 Runtime V1.41 章节中的 handoff、compaction、四 checkpoint、stream 重建、schema 兼容和 Runner busy 用例为准。2026-07-20 最新验证为 provider_handoff_ 11/11、provider_retry_ 21/21、response_stream_ 23/23、finalization_resume_ 12/12Tauri/Rust 串行全量共 989 tests985 passed / 4 ignored / 0 failed,不再沿用 V1.40 的旧局部计数。

  • V1.41 的承诺严格限定为 handoff 已落盘后的 exactly-once 消费。外部 Provider 已返回完整响应、但 Runtime 尚未写 handoff 的硬杀窗口仍不能承诺 Provider 调用 exactly-once,后续只能进入 reconciliation 并可能需要人工决定是否重发;tool-plan 成功响应仍不在本轮 handoff。真实外部 Provider 的 final-reply 退避期 Runner 强杀继续是独立 E2E,不能用 V1.39 首次 tool-plan PASS 或确定性 mock 结果替代。

  • 2026-07-20 起,同一 Runtime 文档的“V1.42 Project Supervisor final-reply 瞬时重试 Runner 强杀真实门禁”作为该独立 E2E 的当前事实源。本切片不改变生产 Runtime 协议,只为一次性 loopback fault proxy 增加安全异步 selector,并新增 supervisor-swarm-final-reply-transient-retry suiteselector 只可见冻结的 sequence / acceptedAtMs,不得看到 URL、header、body 或 API Key。

  • 新 suite 只命中同一父 Session/run 的 Project Supervisor base final-reply。注入前的持久选择上下文必须证明 2 条初始 delivery 加 1 条 repair delivery 已全部 claim、两次 observed claim 已完整观察 3 条 receipt、assistant 仍为 0;随后 selector 在 proxy reset/forward 该请求前,以可信宿主 Node 在 disposable project cwd 同步执行固定的 node verify-e2e.mjs,仅 real-e2e-command=passed marker 成功且无失败 marker 才允许注入。失败、超时或 marker 无效时不得注入,捕获的 stdout/stderr 不得写入 state、checkpoint、report 或公共日志。父 run 的 project.verify audit/receipt/observation 计数仅作诊断,不是注入前提。进入 30s retry backoff 后才用 pidfd SIGKILL 强杀 Runner;新 boot 必须保持 Session/run/request fingerprint/attempt/slot/retryAt,重启后和到期前零新请求,到期后只有唯一 -transient-1

  • 终局不得增加父 tool-plan,只允许唯一成功 parent final-reply、唯一 Supervisor assistant 和唯一 committed response streamretry/handoff/finalization artifacts、重复和公共正文/API Key/项目及发布配置绝对路径泄漏均为 0。旧 supervisor-swarm-transient-retry 继续只证明首次 tool-plan,不能替代新 suite。规范命令为 npm run ai-game-creator-shell:agent-runtime:supervisor-swarm-final-reply-transient-retry-real-e2e -- --config-dir <发布AppData绝对路径>

  • V1.42 已完成 fault proxy 14/14、E2E self-test PASS、前端 308/308,以及 shell typecheck、platform-llm 41/41platform-agent 17/17shared-contracts 7/7 等确定性门禁。真实外部 Provider suite 总计执行六轮,前五轮均为 FAIL,各轮证据不得拼接。第一、二轮沿用既有失败记录;第三轮虽已走通故障、重试和唯一回复,但验收过早观察到 1 个 finalization journal,现已改为终态后显式等待 sidecar 清零并设置 10s 硬超时;第四轮在 quality-review 普通 tool-plan 连续发生 transport/connectivity 失败并耗尽重试,未进入目标故障。

  • 第五轮暴露并修复并行 Agent 的 file.write 与项目写锁竞争:失败 observation 携带绝对锁路径,导致 pending 持久化拒绝并进入 needs-reconciliation。现 file.write / file.patch / file.delete 统一使用 Runtime 短等待项目写锁,file.write 错误在持久化前脱敏,并新增 2 条 Rust 回归测试。

  • 第六轮在同一轮内完整 PASSgpt-5.5 / openai_chat 路由形成 2 条初始加 1 条 repair delivery、3 条专业 Agent assistant;故障精确命中 Project Supervisor base final-reply,可信宿主 verify marker 门禁通过。受控 Provider failed=1 / retry=1、incidental failure=0 / retry=030s backoffpidfd claim=2 / signal=2Runner resumed=true / identityStable=true;父 tool-plan 在故障前后均为 13parent final-reply 与最终 assistant 唯一,response stream sequence=2 / committed。pending、retry、handoff、finalization、confirmation sidecar、全部重复计数,以及 API Key、私有正文、项目路径、正式配置路径和公共报告泄漏扫描命中均为 0

  • 第六轮 PASS 不改变 V1.41 handoff 原子落盘并回读前的 unknown-result 边界,tool-plan 成功响应/function arguments 的 durable handoff 仍未覆盖。

  • 2026-07-20 起,同一 Runtime 文档的“V1.43 tool-plan 成功响应持久交接与 repair 链恢复”作为规划成功响应的现行恢复契约。V1.41 文本 handoff 保持不变;新增独立 game-creator-tool-plan-handoff.v1 私有账本,按同一 Agent/run 的 loop/repair 顺序保存实际 Provider requestId、retry identity、去 thinking 的响应、完整 function call envelope/arguments、usage 与响应指纹。repair-0 和全部 repair-N 统一进入持久 retry/handoff-first 路径,Runner 可从 base 开始零网络重放既有 repair 链。

  • tool-plan arguments 只允许出现在 0600 原子 sidecar 及后续 pending/action batch,不得进入 task/event/Agent DB/CLI/report。公共 protocol/repair 审计共同保存 Agent/task/Session/run/source、loop/repair/slot、响应指纹、Provider request ID SHA-256 和 protocolprotocol 只保存 function call 数量、call ID SHA-256 数组、catalog-bound function names、response ID SHA-256/字符数及 normalization 元数据,repair 只保存 attempt/maxAttempts、协议错误/preview 哈希和 call ID/function name SHA-256,不保存原始 callId/callIds/responseId/providerRequestId,并在 Agent DB append 锁内按完整身份全历史幂等追加。为了保持执行语义,参数禁止静默脱敏;命中密钥、配置痕迹、敏感 JSON key、Provider ID 中的秘密/绝对路径、结构化可执行路径中的项目或其它绝对路径、大小/顺序/身份冲突时直接 reconciliation。源码正文和计划叙述只做密钥检查,不能把 HTML 闭合标签当绝对路径;未闭合 thinking 只留无正文无效元数据并继续 repair。账本保留到 run 终态或明确作废;steer/cancel/漂移/终态清理前先闭合整本账本的实际 requestIdRunner 恢复严格扫描 hash/primary/.previous/安全临时文件并回收合法终态残留,确保单动作、多动作、confirmation、协作 batch 与直接回复在下一 durable owner 建立前都有恢复来源;未知、冲突、primary、.previous 或损坏账本都阻止 Runner idle shutdown。

  • V1.43 的确定性门禁必须覆盖 base handoff 与 repair handoff 两个 lifecycle-completed 前断点,关闭 mock Provider 后恢复零网络、原 requestId 唯一闭合、repair/protocol audit 幂等、唯一 assistant/completed/committed stream及终局零 sidecar。独立非默认真实门禁 supervisor-swarm-tool-plan-handoff-runner-kill 已实现并完成 Shell/Root 两级注册:它使用 sentinel-owned sibling AppData 与 metadata-only zero-fault proxy,以每轮随机 capability 严格绑定 project/Agent/run/实际 request slot;只有 tool-plan handoff 原子落盘并回读一致、同一实际 requestId lifecycle 尚未 completed 时才 ACK,随后通过 pidfd SIGKILL 强杀 suite 自有 Runner。恢复必须证明同一 requestId 唯一闭合且 networkReplayCount=0、protocol/repair audit 幂等、handoff 与 durable batch plan fingerprint 对应、恢复消费前 action/pending/delivery/claim 等副作用为 0,并在终局把 sidecar、重复记录、临时 capability/Runner/AppData 资源及公共正文、凭据、URL、项目/正式配置路径泄漏全部清零。2026-07-20 的真实外部 Provider 单轮已到达并通过 checkpoint,但随后专业 Agent 连续连接失败使整轮 FAIL;另一独立轮首批工具数不满足 fixture,也未通过。两轮不得拼接,当前仍无该 suite 的完整外部 PASS。Provider 成功到 handoff 原子落盘回读前的 unknown-result 和手动 context-compaction 仍不在本切片承诺内。

  • V1.43 当前确定性实现已通过本轮 tool_plan_handoff_ 44/44、Supervisor collaboration 相关过滤 55/55、权威返工合同 1/1,以及 Tauri/Rust 串行全量 1054 passed / 4 ignored / 0 failedLinux cargo check --testsx86_64-pc-windows-gnu cargo check --tests 均通过。E2E self-test、typecheck、变更脚本 ESLint、encoding 与 git diff --check 通过;默认并发全量只作竞态诊断,不替代串行门禁。Supervisor 真实 E2E 报告已把 toolPlanHandoffSidecarCount 纳入终局残留。handoff 跨平台存储使用 Unix 固定目录句柄、目录 flock、exchange/quarantine 与 Windows 相对父句柄、句柄枚举、独占 temp,不再根据 PID 推断写入方是否存活;主动忽略锁的同 UID 进程仍属于宿主 OS 信任边界。

  • 2026-07-27 文档更正:上文 V1.42 的 platform-llm 41/41 保留为 2026-07-20 历史门禁计数;当前验收命令为 cargo test --manifest-path server-rs/Cargo.toml -p platform-llm。platform-llm 的验收证据分为 checked-in SSE fixture parser 覆盖、本地解析单元测试与默认 #[ignore] 的真实端点归一工具调用 smoke;后者只校验最终工具名、id、完整参数 JSON 和文本字符数,未录制或逐事件比较原始 SSE,二者都不能证明转录无偏差。新增普通测试不需要更新固定数量,只有验收命令或测试类别边界变化时才需要更新本段。

  • 2026-07-21 起,同一 Runtime 文档的“V1.44 自主可玩塔防确定性真实门禁”增加独立 loopback OpenAI Chat Provider 和 wrapper 命令。Provider 只返回原生 function calls,不直接修改项目、不伪造工具 observationwrapper 在仓库外创建带 sentinel 的临时配置,复用正式 supervisor-autonomous-playable-lane-defense suite,并在终局停止 Provider、删除配置和 disposable 项目。

  • V1.44 固定验证两份首轮并行专业委派、只读验收回复因 revision 更新而重新规划、程序 Agent 写入并通过静态自检、首轮真实浏览器因隐藏 canvas 失败、Supervisor 直接修改被 orchestrator-only 策略拒绝,以及后续程序委派产生新 revision。若旧失败仍在父验证门且后续 delivery 已 ready,必须先用 agent.run_status 认领回执,再对当前 revision 完成 game.static_smoke + preview.validate,最后只由 Supervisor 回复;已有 3 个 active/ready delivery 时不得创建第四次委派。试玩 liveness 只以当前 revision 可归属的最新 preview.validate 结果收束:新 revision 的成功会取代历史失败,当前 revision 最新失败仍继续强制专业返工;每个固定 data-playtest-id 必须唯一匹配一个可见、启用且真实可点击的 HTMLElement。

  • 本轮 V1.44 wrapper 与正式子 suite 均为 PASSProvider 共 17 次 planning、异常请求 0;项目从 revision 0 推进到 2,最终 game/index.html4924 字节;lane-defense-v1 的植物选择、放置、敌人移动与受伤、胜利、下一关和重开共 37/37 断言通过,桌面与移动浏览器验证通过;三份专业回执全部认领,Supervisor assistant 唯一,pending、confirmation、user-input、provider batch/retry/handoff、tool-plan handoff、finalization journal、reconciliation、重复和泄漏计数均为 0,隔离 Runner、AppData、配置和项目已清理。该确定性 loopback PASS 不能替代外部 Provider 可用性验收;外部路由仍须单独形成同轮完整 PASS。

  • 2026-07-22 的外部 Provider 排障补齐两个宿主边界:Chrome 子进程必须使用 /tmp/ga-browser-*TMPDIR,避免隔离 AppData 令 SingletonSocket 超过 Unix 路径上限;image.inspectdesktop.png / mobile.png 固定别名只解析当前 Agent/run 最新 revision 截图,不能跨 run 回退。对应真实 Chrome smoke、Rust 串行全量 1139/1139 和确定性正式 E2E 已通过。

  • 外部 Provider 仍无可拼接的完整 PASS:一轮因 Chrome status 134 失败,一轮在真实浏览器 37/37 后因截图 basename 无法解析耗尽循环;别名修复后的独立轮次已再次推进到真实浏览器通过和截图检查阶段,但 58 个 Provider lifecycle 中出现 1 个非重试失败,父 turn 终态为 failed。后续必须以新的独立完整轮次证明生成、静态检查、真实浏览器、截图审阅、唯一 Supervisor 回复和零残留全部同轮通过。

  • 2026-07-22 的第二轮并行结构拆分先把 runtime_tools.rs / runner.rs / process_session.rs / projectSummary.ts 收敛为 69 / 31 / 23 / 138 行兼容 facade,具体实现分别下沉到职责子模块。该轮不改变 Runtime、Runner、Tauri 或前端导出契约;Rust 嵌套模块只在原 crate::agent 可见性确有需要时使用 pub(in crate::agent),不得统一放宽为 pub(crate)

  • 同轮后续收口把 App.tsx12983 行降到 9794 行,项目工作区下沉到 src/features/project-workspace/ 的 11 个模块;runtime_actions.rs12519 行降到 139 行,拆为 19 个生产模块和 2 个测试模块;runtime_driver.rs10510 行降到 394 行并拆为 11 个模块;runtime_protocol.rs8623 行降到 105 行并拆为 14 个模块,单模块不超过 1319 行。runtime_driver/main_loop.rs 仍约 2995 行,因为它承载现有单一主循环函数;下一轮只能在识别运行状态阶段后按阶段拆分,不能按行数机械切割。

  • 第二轮拆分继续保留稳定 facade。仅供同一父模块下兄弟子模块调用的 helper 使用 pub(super);访问被 runtime_protocol::provider_retry 遮蔽的 crate 根同名模块时显式使用 crate::provider_retry。原有兼容重导出不能按 unused_imports 告警机械删除,确认是旧调用面后只添加局部 #[allow(unused_imports)]

  • 结构拆分的稳定树门禁为 Rust 串行全量 1139 passed / 5 ignored / 0 failed、客户端前端 329/329、typecheck、客户端 crate fmt、Prettier、ESLint、encoding,以及确定性 E2E self-test 和完整 E2E 均 PASS。完整 E2E 的项目 revision 为 0 -> 2,真实浏览器固定试玩 37/37,重复、残留和泄漏均为 0。并行写入期间发生在 CLI 构建阶段、尚未创建 run 的 exit 101 不计作 Runtime E2E 结果。

  • 2026-07-22 的第三轮由四个 Agent 继续按稳定 facade 并行拆分:tool_plan_handoff.rs5614 行降到 24 行并拆为 10 个子模块,最大生产模块为 Unix 1219 行、Windows 1040 行,测试模块为 1697 行;平台存储模块各自保留完整原子提交链,不再按行数机械切分。agent/generation.rs4566 行降到 92 行并拆为 10 个子模块,最大生产模块 trace.rs834 行,原 123pub(crate) API 由 facade 显式重导出,仅 4 个跨 crate::agent helper 最小化为 pub(in crate::agent)

  • 同轮 swarm_cli.rs4420 行降到 68 行并拆为 9 个子模块,最大生产模块 observer.rs843 行、测试模块为 1529 行;原 35 个测试名与 turn.report 字段/顺序不变。browser.rs4036 行降到 24 行并拆为 11 个子模块,最大生产模块 capture.rs733 行、playtest/mod.rs612 行,测试模块为 1169 行;内嵌 raw JavaScript 的搬迁前后哈希一致。

  • 第三轮集成修复仅补 tool_plan_handoff 下沉测试缺失的 response_fingerprint / validate_ledger / AsRawFd import,并为兼容重导出添加局部 #[allow(unused_imports)];兼容出口未删除,警告总数仍为 18。测试子模块不继承父模块 use,后续拆分必须显式补 import;并行写入期禁止全 crate 编译,统一门禁只能在四个 Agent 全部完成后的稳定共享树运行。

  • 第三轮稳定树已通过 cargo fmt --checkcargo checkcargo check --tests,以及 tool_plan_handoff 44/44swarm_cli 35/35browser 21 passed / 3 real Chrome ignoredLinux 串行全量为 1146 passed / 5 ignored / 0 failed。确定性真实 Runner + Chrome E2E 为 PASSProvider lifecycle 17/17、revision 0 -> 2、固定试玩 37/37,残留与泄漏均为 0。Windows cross check 因宿主缺少 x86_64-w64-mingw32-gcc,在进入项目代码前停止,仍是明确的残余验证缺口。

  • 2026-07-22 的 V1.45 修复专业 Agent 并行修改导致的 stale pending 中断。执行前发现 project revision 漂移不再进入 needs-reconciliation,而是以 blocked + projectRevisionDrift + replanRequired observation 回到同一 run 继续 planningfile.write / file.patch 还会在项目写锁内复核 pending 身份、仓库上下文、revision 与 verification gate。该语义不放宽并发写安全:旧动作始终不执行,副作用未知、账本冲突或持久化损坏仍失败关闭。

  • V1.45 的独立真实 external-provider 验收只向 --swarm-chat --init --autonomous-game-build 写入一次“植物大战僵尸式塔防”需求后立即 EOF。最终 status=PASS / turn.report=settledapprove / answer / steer 为 0;两条初始 delivery 与一条 repair delivery 均被父 run 认领,项目 revision 0 -> 8game/index.html7814 bytesstatic smoke、desktop / mobile 浏览器和 lane-defense-v1 37/37 全通过。唯一 Supervisor assistant 已提交,pending、confirmation、user-input、provider retry/handoff、tool-plan handoff、finalization、reconciliation、重复和全部隐私泄漏计数均为 0

  • V1.45 稳定树同时通过三个新增/更新定向回归、revision 32/32cargo check --tests、Linux 串行全量 1147 passed / 5 ignored / 0 failedcargo fmt --check、encoding 与 git diff --check。确定性正式 E2E 继续为 PASSProvider lifecycle 17/17、revision 0 -> 2、Chrome 37/37,终局残留与泄漏均为 0

  • 2026-07-22 的 V1.46 消除自主构建的人工确认等待。autonomous-game-build 仅把固定 auto-safe 白名单提升为自动执行;项目级、Agent 级和 MCP catalog 动态策略产生的其余 RequiresConfirmation 一律转为 Denied,向同一 run 返回“改用 auto-safe 工具或省略动作”的 observation。显式 deny 继续优先,标准 profile 的确认语义不变;包含拒绝成员的 Provider action 批次在任何工具执行前整体 aborted,不能执行 auto 前缀。

  • V1.46 的 Runner 恢复会把旧版本已持久化的自主 pending-confirmation / waiting-confirmation 迁移为 observed-rejected / aborted。Provider batch 是原子提交点,pending 只是可重建镜像;批次先落盘、pending 后落盘之间强杀时,下次恢复从 aborted batch 补齐拒绝账本并继续原 Session/run。公共状态和审计使用 runtime-policy-rejected,不得写成“已执行自动工具”或“开发者拒绝”。

  • V1.46 稳定树通过自主构建过滤 20/20、确认相关 18/18、旧等待态完整恢复、既有批次零副作用、cargo check --tests、Rust 串行全量 1149 passed / 5 ignored / 0 failed、fmt 与 diff 检查。确定性正式 E2E 为 PASSProvider lifecycle 17/17、revision 0 -> 2、Chrome 37/37、人工输入与残留均为 0。新的独立外部 Provider 同轮 E2E 也为 PASS:单条任务后 EOFapprove / answer / steer 为 0Provider lifecycle 62/62revision 0 -> 5game/index.html7816 bytesstatic smoke、desktop / mobile 与 lane-defense-v1 37/37 全通过,唯一 Supervisor assistant,全部 sidecar、reconciliation、重复和泄漏计数均为 0

  • 2026-07-25 补充:Swarm CLI 将“Agent 执行通道仍忙”和“canonical run 可接受 steer”拆为两个判定。task_queue.pending > 0 继续用于 Runner 存活观察,但只有底层 steer 门禁认可的 running / waiting-for-confirmation Runtime 才能接收新指令;completed/cancelled run A + pending run B 必须先通过 Runner 恢复 B,禁止把消息追加到 A。start mutation 必须返回实际 acceptedRunIdCLI 以它建立 turn baseline,失败扫描、交互、收束和 turn.report 都只认 baseline run;若 Runner 已连续推进到 C,则从 task journal 读取 B 的终态。旧 A 的 cancel tombstone 不得阻断队首 B 恢复。若用户重复输入的内容正是已经落盘的 pending 任务且它仍是对话最后一条 user 消息,CLI 只观察原 run,不再追加第二份对话或创建新任务;active Goal 同样必须同时匹配 Agent、Session、runId、Run Profile 和可 steer 状态。连续 B/C 的 assistant 回复按 finalization message ID 归属,observer 不输出非目标 run 的状态或流;历史失败和报告计数都读取完整 task journal,失败聚合使用 (agentId, runId),journal 失败终态不能被滞后的 state 投影覆盖。

  • 2026-07-25 已落地:autonomous-game-build 的完成合同从“交付可玩原型”升级为“交付正式项目产物”。Runtime 继续按 seed manifest 的固定 16 个 task 分波推进;配置画布 Key 时,视觉链先由现有 art-director 生成正式规范图,再让 design-foundation / art-asset-plan 分别引用该规范图生成 UI 原型与透明图集,数值和音频需求仍按依赖并行,随后由程序整合、质量审查、当前 revision 静态检查、真实试玩和发布包装收束。每个新根 run 先重置本轮 seed task;普通 preview / smoke bookkeeping 不得代替自主 task 的真实执行和终态投影。

  • DAG 只能在 Project Supervisor 的 agent.run_status 回执认领已可靠观察、静态委派屏障清空后启动;正常执行、pending 续跑和重启恢复复用同一入口。调度在项目锁内预占 ready child 的 Agent Runtime lane 并落 durable journal,释放项目锁后才启动 drain;Runtime 的项目写锁统一提供约 10 秒有界等待,覆盖 Provider 首轮 tool-plan、并行只读结果投影和其它同 run 控制面写入,不能因 manifest 波次的短暂锁竞争把专业 child 投影为 failed。专业 child 终态只按父 run 身份、活跃合同和自身完成门禁投影,不等待独立静态委派屏障;该屏障仍约束下一波调度与父 run 收束。专业子 run 的验证允许 verifiedRevision >= mutationRevision,但 Supervisor 的最终静态和试玩证据仍必须精确覆盖最新全局 revision。

  • 正式项目基础产物固定为 memory/project.mdgame/game_design.mdgame/balance.jsonassets/manifest.art.jsonassets/manifest.audio.jsongame/index.htmlexports/README.md。普通模式未登录,或 standalone game-chat/高级模式未配置有效 Developer Key 时,设计与美术 Agent 交付明确记录界面结构、素材需求和“尚未生成”状态的文本 / JSON,不暴露 canvas.asset_generate,也不得伪造图片;凭据可用时额外强制生成、登记并验收 assets/art-spec.pngassets/ui-prototype.pngassets/art-spritesheet.png,生成失败不得完成。

  • 画布能力最终一致性:凭据不可用时,design-foundation / art-asset-plan 的委派 expectedArtifacts 与对应 manifest task 终态投影必须同步采用文本产物降级;凭据可用时三张固定图片仍为严格完成条件。委派合同、完成合同与 manifest 投影必须从同一“普通平台会话或高级 External 凭据”事实派生。

  • Project Supervisor 只有在本轮必需 manifest tasks 全部 completed、当前配置对应的正式路径齐全且通过类型 / 可解析性检查、最新 project revision 的 game.static_smokepreview.validate 都通过后,才能写入唯一最终回复。delivery 的 completed / evidence-ready、历史 revision 成功或单个文件存在都不能替代最终集成验收。已 ready / claimed-by-parent 的相同终态 delivery 在恢复扫描中按幂等重放,保留首次冻结结果,不再制造重复 agent.delegate.result_failed;真实终态冲突仍失败关闭。

  • 验证:npm run agc:test 已通过确定性 loopback Provider、真实 Runtime、项目写入和浏览器链路验收:同一父 Run 下 16 个 manifest task 均只有一个 logical run、一次 start、一次 completed 和一次 manifest projection,且无 failed / cancelled;父 run 与全部子 run 完成,最终 revision 为 11,基础正式产物、静态 smoke、桌面 / 移动 37/37 试玩通过,pending、reconciliation、Provider 失败、重复和泄漏计数均为 0。该结果不替代独立外部 Provider 验收。

  • 2026-07-26 本轮已验证 npm run agc:config 的终端 LLM 配置链路。向导与 GUI 使用同一 Tauri identifier 对应的系统 AppData 和同名 game-creator.config.json / 可选 local overlay;读取已有配置时只更新有效 LLM 层,保留其它现役配置,不提供普通画板凭据输入。LLM API Key 只从隐藏输入读取,拒绝 --api-key、仓库内目录、Git 已跟踪配置、符号链接,以及不是以 world.genarrative.ai-game-creator 为独立叶目录的 --config-dir。保存使用同目录 0600 临时文件原子替换,POSIX AppData 目录保持 0700,Windows 使用当前用户独占 DACL,写后复用真实 --llm-status 检查。

  • 2026-07-27 Windows DACL 启动回归修正,2026-08-03 补充 pwsh 模块隔离:powershell.exe -Command 后追加的位置参数会被 PowerShell 5.1 拼接进命令文本,不能用 $args 安全接收包含空格的 AppData / 临时目录。DACL 脚本改为从仅传给该子进程的环境变量读取目标绝对路径和目录标记,并复用 Get-Item 返回的 FileSystemInfo.GetAccessControl() 读取 ACL,不调用会因父 PowerShell 7 PSModulePath 污染而自动加载不兼容模块的 Get-Aclnpm run agc:typecheck 必须在真实 Windows 上执行配置回归,保证 npm run agcbeforeDevCommand 不因路径解析或模块加载失败退出。

  • 2026-07-31 macOS 临时路径回归修正:配置目的地安全检查返回解析过现存父目录的真实路径,回归 fixture 的期望值也必须先使用平台原生 realpath 规范化临时根目录。macOS 下 /var/folders/.../private/var/folders/... 是同一目录身份,不得用未规范化字符串阻断 agc:typecheck。CI 还必须使用“真实目录 + 符号链接父目录 + 不存在叶目录”确定性复现该语义;Windows 使用 junction 覆盖驱动器号、大小写与链接路径差异。fixture 的规范化与断言必须位于同一 try/finally 清理边界内。

  • 2026-07-27 项目总控右栏空态与持久状态水合修正:项目尚未产生 Runtime 时仍显示“尚未开始”状态块和创作入口,不把消息列表的弹性剩余空间裸露为空白;若 active Session 索引缺失但项目内已有 project-supervisor Runtime,工作台必须从 read_game_creator_agent_runtimes 的权威项目列表恢复总控 Session 与状态。needs-reconciliation 统一显示为“失败 / 待核对”,不能因对话索引缺失隐藏已落盘的失败事实。

  • 2026-07-28 Windows tool-plan 成功响应交接修正:相对目录句柄下安装 handoff 账本改用 NtSetInformationFile(FileRenameInformation)SetFileInformationByHandle(FileRenameInfo) 不接受当前实现所需的非空 RootDirectory,会稳定返回 ERROR_INVALID_PARAMETER (87) 并让总控首轮进入 needs-reconciliation。实现继续绑定已验证的父目录句柄和相对 hash 文件名,不退化为绝对路径 rename;“按句柄安装”归入 tool-plan-storage。总控对 reconciliation 提供“已核对,结束旧任务”,取消后有 pending task 时只等待 Runner 续跑,队列为空时才允许显式 retry;自主构建 Supervisor 的 retry source 从原 Run Profile 绑定恢复并重新验证为可信 GUI / CLI 根入口,不降级成普通后台任务来源。

  • 2026-07-28 tool-plan 格式修复协议与 steer 审计修正:OpenAI Responses 请求按角色映射内容块,system / user 文本为 input_textassistant 计划预览为 output_textassistant input_image 在本地校验阶段拒绝,避免 repair 请求因非法 input_text 被上游以 HTTP 400 拒绝。tool-plan protocol / repair 审计增加 appliedSteerCursor,幂等键也纳入该 cursor;等待 Provider retry 期间 steer 后,同一 run / loop 可在新 cursor 下合法重用 repair-0 逻辑槽。旧记录缺少 cursor 时仅视为 0,保持升级后 replay 幂等。回归必须覆盖 Responses 多角色序列化、user 多模态,以及“无效计划 → repair retry 等待 → steer → 新 cursor repair”链路。

  • 2026-07-28 Project Supervisor 首批协作 repair 累积约定:针对每轮只返回单个 function call 的 ProviderRuntime 从首次触发协作缺口的响应开始,跨文本 JSON、OpenAI Chat tool call 与 OpenAI Responses function call 修复轮次累积合法的 agent.delegate / agent.spawn_isolated;同一 agentId 以最新响应覆盖旧 action,唯一 agent.spawn_isolated 槽位也以最新响应覆盖,禁止把修正版追加成同批第二个 spawn。每轮根据累计结果计算尚缺的静态 Agent,并仅在缺失集合含明确 Agent ID 时收窄下一轮 function schema 的 agentId enummissingStaticAgents=none 是空集合哨兵,不是 Agent ID。只有累计首批满足完整协作合同时才成批提交,已满足的 Agent 不得因后续修复重复派发。

  • 2026-07-28 pending / provider action 安全持久化约定:自然语言任务中的裸短语 api key 不是泄密证据,不能据此拒绝 action;否则 agent.delegate 的“不要暴露 External Editor API Key”等安全指令会被误判。API Key 赋值只允许完整受控状态或固定无密钥降级说明,禁止用安全状态前缀放行后续任意内容;none-but-secretnot configured; actual value ... 等必须失败关闭。Markdown 装饰、反引号或环境限定标签不能改变赋值语义,**API Key**:`API Key`:API Key(生产): 仍必须进入同一检测。持久化前继续检测结构化 apiKey / api_keyAuthorization / Cookietoken / Bearer 标记和已知 secret token 形状,命中真实凭据时仍失败关闭。

  • 2026-07-28 Windows Provider retry 恢复修正:provider_retry::list_at 从绝对路径剥离项目 root 后,按路径组件重组成 / 分隔的 portable UTF-8 相对路径,再交给 Runtime JSON sidecar 读取器。不能直接使用 Windows Path::to_str() 的反斜杠文本,否则应用重启、Runner recovery scan 和正式 --agent-resume 都无法推进已到期的 waiting-for-provider-retry run。全部 provider retry 列举、previous 恢复、去重和路径冲突回归必须在真实 Windows 通过。

  • 2026-08-12 Windows Codex 启动链修正:AGC 不再直接依赖可能命中 WindowsApps shim 的 codex 命令,而是逐个执行 --version 验证候选,优先发现 npm 安装中的原生 codex.exe,并回退到 Codex Desktop 的原生 CLIapp-server 启动参数只关闭当前 CLI 仍支持的 feature flag。可信根 Project Supervisor 尚未冻结 Goal Contract 时,首轮和协议修复轮都只广告 agent.goal_contract,禁止计划更新、回复或其它动作抢跑。GUI 显式传入的 --config-dir 必须贯穿 Tauri 与 Cargo 的参数分隔并作为应用参数保留,setup 优先复用该目录,避免开发版或发布版误占默认 AppData 的 GUI owner lock。发布验收必须使用 release/安装目录 EXE 启动真实 Runner,并核对 CLI 版本、app-server 生命周期、Goal Contract 持久化、后续项目观察以及最终 completed/idle 状态,不能只以构建成功或 mock 测试代替。

  • npm run agc:test:chat 未显式指定配置且找不到 AppData 配置时,只在 stdin / stdout 都是 TTY 时询问并启动同一 agc:config --configure-only 向导,非 TTY 或显式无效 --config-dir 直接失败。测试环境只把主配置和存在时的 local overlay 复制到带随机 sentinel 的单次隔离 AppData;副本必须是独立的无符号链接普通文件,POSIX 权限为目录 0700 / 文件 0600,不复制正式 Runner endpoint、lock 或其它 AppData。自动任务默认 50 分钟且可用 --timeout-minutes 显式设置;超时或信号会终止独立子进程树,POSIX 先向进程组发送 SIGTERM、等待 10 秒后发送 SIGKILL 并再等待 5 秒,Windows 使用 taskkill /T 并在强制阶段追加 /F。超时和信号分别以 124 / 130 / 143 失败退出,隔离 Runner 收束另有 20 秒上限;Runner 未空闲或收束失败时保留隔离配置和项目,验收未完成但 Runner 已安全退出时只保留一次性项目证据,不把中断报告为成功,也不误删正式 AppData。

  • 自动验收现在严格要求 manifest 恰好包含固定 16 个不重复 task ID 且全部为 completed,并逐任务核对当前父 Run 下唯一 logical run、一次 started、一次 completed、零 failed / cancelled 和一次 manifest projection;七份基础正式产物存在并满足文件 / JSON / 非占位入口检查,当前模式具备画板服务授权时再增加 art-spec / ui-prototype / art-spritesheet 三张图片。PNG 验收不止检查 magic / IHDR / 比例,还会校验 chunk CRC、zlib 解压、scanline 长度、索引色 PLTE 和未知 critical chunk。Runtime 根 Supervisor 的完成合同已升级为 game-creator-autonomous-completion-contract.v2baselineArtifacts 必填并纳入指纹。

  • design-foundation 已增加专属职责边界:项目文件只允许写 memory/project.mdgame/game_design.md;当前模式具备画板服务授权且合同要求界面原型时,只额外允许固定 assets/ui-prototype.png。它不得创建、修改、删除或补丁 game/index.html,不得改动其它程序实现、发布、音频或美术素材,也不得调用预览或试玩工具。

  • canvas.asset_generate.replaceExisting 默认并必须保持 false;只有静态专业 Agent 的 delegated-* 唯一 repair run 才能申请 true。Runtime 要求当前 delivery 带 repairOfDelegationId,原 delivery 已被同一父 Agent / 父 run 认领,原始与返工合同的目标 Agent 和精确 expectedArtifacts 路径一致;普通 run、未声明路径、错误 Agent、未认领原交付或缺失原图都失败关闭。图片生成仍服从 art-director / design-foundation / art-asset-plan 的固定输出路径、比例、尺寸、kind 和 label,禁止先删除正式图片;请求前记录旧文件 SHA-256,外部生成返回后在项目写锁内复核,旧图在网络请求期间变化即拒绝覆盖。授权替换先写私有临时文件,再以备份 / rename 切换;落盘或 manifest 登记失败时恢复旧图,不把新旧文件并存状态当作成功。

  • 在既有 16-task manifest 内固定正式视觉 DAG,不新增平行任务系统:art-director 用当前调用模式的图片生成 kind=spec 生成 assets/art-spec.png 并登记为 assetKind=icon-specdesign-foundation 使用该规范图的稳定资源 ID 作为视觉规范参考,用同模式图片生成 kind=ui-design 生成 assets/ui-prototype.pngart-asset-plan 以同一 resource ID 调用同模式图标 spritesheet 生成,产出透明 assets/art-spritesheet.png。普通模式使用内部 /api/editor/*standalone/高级模式使用对应 /api/external/v1/*;业务请求、依赖和验收完全一致。规范图缺失、未登记或缺少稳定资源 ID 时,下游任务不得退回普通生图。图集 warning、透明像素与切片门禁保持不变。

  • 旧项目已有同路径派生图但缺少上述 provenance 时,一律标记为 legacy,不得只因文件、kind 或通用视觉检查存在就完成。原位替换仍走显式 repair:design-foundationart-asset-plan 先在同一 Supervisor 批次分别建立 owner 精确原合同并交付 needs-repair,父 run 认领后再在同一批次分别发起各自唯一 repair;两个 repair 合称一个显式视觉返工阶段。art-director 不得跨 owner 声明或替换 UI / spritesheetRuntime 在委派落盘前就拒绝这类合同,不再等到生图阶段才失败。

  • 2026-07-27 新起的“16 任务正式产物 + 两张真实画布图片 + current revision 静态 / 双视口浏览器 / PNG 证据 + 受限 repair 替换”独立外部 Provider 验收,使用 npm run agc:test:chat -- --timeout-minutes 75,约 59m50s 后以退出码 0 完整 PASS。同一轮真实生成并登记 assets/ui-prototype.png2829418 bytes)与 assets/art-spritesheet.png1361906 bytes),固定 16 个 manifest task 均为当前父 Run 下唯一 logical run、一次 started、一次 completed、零 failed / cancelled 和一次 manifest projection;七份基础正式产物、两张 PNG、当前 revision 的 game.static_smoke、desktop / mobile lane-defense-v1 playtest、浏览器报告与截图全部通过。turn.report=settled 且唯一 assistantbusy / pending / running / confirmation / user-input / reconciliation 均为 0;隔离 Runner、一次性项目和隔离 AppData 已自动清理。此前失败轮继续独立保留,不与本轮拼接;未来合同变化仍须新起完整轮次复验。

  • 2026-07-27 补充 tool-plan 成功响应交接的内容边界:Provider 的自然语言计划叙述,以及结构化 arguments 中 body / code / content / css / html / newText / oldText / patch / script / text 等源码内容字段,只检查真实密钥 token 形状、凭据头标记和不安全控制字符;仅仅提及 .envgame-creator.config 不能阻断已经计费的安全响应。结构化输入中的敏感 JSON key、非内容字段中的配置痕迹或绝对路径、真实 token、容量、thinking、身份、顺序和账本完整性门禁仍失败关闭。成功 handoff 失败进入 reconciliation 时,Runtime 额外只持久化受控 failureKind、脱敏错误 SHA-256 和字符数,不保存 Provider 正文、function arguments、密钥或绝对路径。定向回归覆盖叙述/源码字段放行、.env.local 路径和真实 token 拒绝、全部 tool-plan handoff 回归及诊断零正文。

  • 自然语言 interaction 的 resume 只代表“继续当前未完成 Runtime”。宿主在进入 interaction 前已确认当前 Session 没有可 steer、pending 或 running 的 Runtime 时,模型返回的自然语言 resume 必须规范化为 execute,基于会话历史新建 run;显式 /resume 仍只执行恢复扫描且无任务时不新建,避免“那就继续修复”被反复吞成空恢复。

  • 2026-08-03 失败续跑收口:同一 project-supervisor Session、同一持久 source 的最近可信根 run 已失败、取消或预算耗尽,且新输入只是严格受限的继续意图(例如“继续”“接着做”“继续完成”“continue”“go on”)时,宿主仍创建新的 root run 身份,但必须把上一根 run 的原始任务作为继承目标和完成合同基线;首次和连续 successor 的 effective task、合同 SHA、Runtime hydration 与 scheduler 必须一致。不得把继续短语本身当游戏主题,也不得按真正新需求重置 seed manifest。跨 Session、跨 GUI / CLI / game-chat source、上一根 run 已正常完成、输入包含新的具体玩法要求或无法唯一识别前序根 run 时都不继承,继续按新任务执行。继承只复用目标与已有产物基线,不复用旧 Provider request、pending action 或副作用身份。

  • game-chat 快车道只能在 game/index.html 缺失或仍是初始化占位,且当前 child run 尚未写入正式入口时使用首次 fallback file.write。项目已存在非占位入口时,后续 code-prototype 必须先保留并读取既有玩法,做真实局部修改并取得本人 mutationRevision,之后才能运行 game.static_smoke 与交付;禁止为了满足首版时限重新生成整份默认小游戏,也禁止连续只读 smoke。占位 fallback 仅允许俄罗斯方块和明确收集类等已有真实语义模板,未知玩法失败关闭。纯继续意图未能恢复唯一原始目标时同样失败关闭,不输出以“继续”为标题的兜底产物。

  • assets/art-spec.png 的唯一语义是视觉规范与派生参考,不是运行时背景、角色、目标或图集。game-chat 的核心玩家、方块/目标、障碍/场景和反馈必须来自独立派生的透明 assets/art-spritesheet.png 及其服务端 iconImageSrcs 本地切片;Runtime 以 sourceResourceId 把切片清单绑定到当前图集,并要求活动 Canvas 分别绘制四类不同切片。纯代码核心实体、猜测图集等分坐标、单个裁切冒充全部类别、整图展示、隐藏引用、微小水印和诱饵路径均不构成真实美术使用。playable-web-game-state.v1.sequence 只在真实输入、状态迁移或模拟状态变化时递增,不得由纯渲染帧推进。

  • game-chat canonical 图集进一步要求主图与四个切片都有非空且互不复用的 Canvas assetObjectId;同一对象在顶层、resource 与 asset 中重复返回的 assetObjectIdtaskId 必须分别一致,冲突时失败关闭。公开 assets/art-spritesheet-slices/manifest.json 与私有 .agent/runtime/art-spritesheet-contract.json 必须同时绑定 sourceResourceId / sourceAssetObjectId / sourceTaskId / sourceCanvasProjectId / sourceReferenceResourceIds,并对四种 usage 的 name / path / width / height / resourceId / assetObjectId / contentSha256 / pixelSha256 做完整一致性比较。旧项目缺私有回执时不得从公开文件反向生成回执;只允许同一 game-chat root 下处于 running 的 scheduled art-asset-plan 对固定主图执行受限 replaceExisting=true repair,普通 pending、其它 Agent、其它路径或有效合同均拒绝。九个固定合同文件在任何 canonical 改动前必须先全部打开可信源句柄,完成有界双读,并在 journal 持久化后、发布 prepared marker 前再次整体复读与身份校验;任一文件在九文件捕获窗口变化都失败关闭,不能形成跨版本混合快照。事务控制文件在 Unix 通过锚定目录句柄的 openat / unlinkat + O_NOFOLLOW + O_NONBLOCK 读取和清理,FIFO 等非普通文件不得阻塞恢复;恢复前态在同一叶子句柄稳定双读并复核元数据、内容和当前 inode。Windows 祖先目录 pin 只请求读访问并拒绝 delete sharing,允许九文件捕获重复持有同一 root;只有事务叶子句柄请求删除访问。事务目录创建、合同源捕获与恢复 CAS 必须从 canonical 项目根句柄逐组件打开或创建父目录,staging、hard-link、no-replace move 与 unlink 全部相对固定父目录句柄执行,不能退回 pathname 预检后操作。CAS 安装先把目标字节持久化到同目录私有 staging,再以不覆盖切换安装;即使 canonical 已安装后清理 backup/staging 才报错,也必须把当前项纳入同轮逆序回滚。Canvas 资产登记成功并写 committed marker 后才可清理;恢复继续在同一项目写锁内完整验证全部 journal 条目和快照、形成内存恢复计划并缓存全部 canonical 的恢复前状态,逐项安装完成后、清理事务证据前还必须再次复核整组 installed 状态,再按 transaction id 整组回滚或幂等清理。回滚前必须 CAS 证明目标仍是本轮安装结果,外部修改不得被覆盖,冲突进入 reconciliation。远端下载阶段不得长期持锁,也不得在无锁 request 阶段修改 canonical 文件。

  • prepared 发布后,创建阶段锚定的事务目录句柄和 identity 必须由 live rollback 对象一直持有到 committed 清理或 rollback 结束,提交和回滚不得按 PathBuf 重新接受替换目录;live commit 在发布 committed 前后都必须验证 retained handle 仍对应权威 pathname,身份漂移不得降级为提交成功 warning。Unix 清理先把权威叶子通过 no-replace rename 原子隔离为固定 retired 目录,复核 retained inode 后再清空和删除,删除前还需再次复核;进程若在隔离后退出,下次持项目写锁恢复先幂等清理 retired 目录。恢复在首个 canonical 写入前一次性冻结九路径全部前态,晚序普通文件内容变化也必须触发 CAS 冲突并逆序回滚早序安装。历史 .previous / .replacement 若没有 durable journal,只允许通过锚定父目录识别后进入 reconciliation;不得凭 pathname 自动 hard-link、move、恢复 canonical 或删除残留。

  • 图集本地提交以主图 staging 为线性化前置:任何新主图先写随机私有 staging 文件,替换时保留 previous,canonical 主图完整安装后才写四切片、公开清单、私有回执和项目资产登记。进程若在 backup/install 窗口退出,同一 accepted External generation 恢复先识别唯一同 suffix 的 previous/replacement 对并恢复旧主图,再按远端结果完成替换;若 canonical 已等于远端摘要,则不再要求替换授权,直接补齐其余合同。成功后清理主图、四切片、公开清单、私有回执和项目 manifest 的全部遗留 staging/backup。首次生成也禁止直接流式写 canonical 路径,避免部分 PNG 被误认为已安装结果。

  • 俄罗斯方块任务固定使用 BrowserPlaytestScenario::TetrisV1playable-web-game-state.v1.gameplay 必须持续提供 kind=tetrisactivePieceIdrotationrowlockedPieceslineClearChecksclearedLinesoccupiedCells;任何采样点删除字段都立即失败,但允许 score / nextPieceId 等额外 telemetry。静态连续性检查按 HTML 规定的五种空白解析标签,并在 type 存在时忽略 legacy language,再结合 nomodule 判断可执行脚本。JavaScript / ESM 必须先通过 Oxc parser 与 semantic;无效语法失败关闭,import/export production、ASI、default / namespace / alias / import 后再 export 的 bridge / re-export 链接、template ${...} 内表达式、注释与正则边界都以 AST 为权威,不得跨换行猜测 from 或把未链接模块当完成证据。跨模块 alias 投影保留 origin 根绑定,只改写解析到 import symbol 的 importer reference span;同一 export 的多个本地 alias 必须按大小写敏感的 symbol identity 保序保留,同一 dependency 的多条 import declaration 合并绑定,同一 origin 即使经不同 dependency 或 bridge 到达也只投影一次。组合 importer 与 origin 前,全部投影根绑定都必须分配跨 importer、同源私有绑定和其它 origin 无冲突的确定性名称,重命名后重新通过 parser 与 semantic;只有最终交给静态启发式扫描的文本允许统一小写。object shorthand 展开为显式键值以保留原键,namespace 只改写完整 member span。同文本对象属性和局部遮蔽不得连带改写,投影依赖也只由 semantic 未解析根引用递归纳入。函数定义、表达式体箭头、调用可达性和参数 / 局部遮蔽按 semantic symbol identity 判断;guard return / throw 只终止其真实控制流分支,不能截断后续可达玩法。字符串、注释、HTML raw-text/RCDATA 与其它非执行容器、带 src 脚本的内联正文、非 JavaScript script、短路动态 import、恒真分支的 else、顶层无条件 return / throw 后正文和 if(false) / 明显恒假分支诱饵继续不构成证据;filter / splice 消行仍必须由满行判断真实控制,并作用于正式棋盘。本地 .js / .mjs、inline module 与传递依赖统一限制在 game/,文件按去重数量并受 256 文件、累计 2 MiB 上限约束。浏览器因果探针运行于 Chromium 隔离执行上下文,Promise 闭包保存点击前基线,MutationObserver 只冻结 trusted 输入 listener 及其点击派生微任务产生的最后状态;宿主只有在 Chromium 元素鼠标输入成功完成后才调用隔离世界 finish,把该 CDP 结果作为完整手势证据,页面无法伪造。这样更早注册的 window capture listener 即使 stopImmediatePropagation(),以及后注册的同步 click listener,都不会造成假阴性;RAF / timer 仍不会污染证据。探针 fingerprint 覆盖 install、ready 与 finish 的真实脚本。其余同方块旋转、重力/锁定、四格落盘或消行、lineClearChecks 和 restart 归零约束保持不变。旧/续跑合同及 game-chat 快车道在回执读取前按有效原任务迁移到该场景、重算 fingerprint 并回读一致,旧 generic-v1 回执视为 stale,不能交付完成。

  • ESM 投影中的顶层 function/class/variable 声明必须直接使用 Oxc statement span 提取,不能用首个分号或换行截断箭头函数、多行 initializer 或多 declarator;对象、数组、默认值与 rest 解构声明必须递归收集全部 binding,并保证同一声明只投影一次。import symbol 与 importer 自有 root binding 分开保存,即使名称仅大小写不同也不得在组合前折叠;投影根分配 canonical 名时必须避让 importer 与 origin 的全部非 import semantic binding,不能被嵌套局部捕获。模块组合必须按依赖深度迭代到稳定闭包,把被导出函数继续依赖的 imported origin 带入最终 consumer 单元;循环 ESM 以原始声明 identity 去重回流,不能不断生成重命名副本,并以最终 span replacement 后的单 unit 2 MiB、累计投影处理 32 MiB 为失败关闭上限。固定字符串 dynamic import 同样由下游实际使用的 export 反向驱动加载;未使用 export、未调用嵌套函数和恒假分支中的 dynamic source 不得进入模块单元,同名 dynamic export 不能反向选择未引用的本地声明。只有被选声明中的 await import 解构、namespace member 或 .then(...) 静态 binding 才能进入组合投影;callback 参数、解构 alias 和 namespace member 必须按 semantic symbol span 改接到投影根,dynamic object shorthand 改名时还必须显式保留原属性键,不能靠追加同名文本跨过局部遮蔽。span replacement 完成后还要对完整组合 unit 重跑 parser 与 semantic,启发式扫描只能在原始源码完成 AST 解析和掩码后再统一小写。匿名 default function / arrow 必须在原始 AST 中以 collision-safe synthetic binding 注册可外调 root span,使 wrapper 内 imported member 的传递依赖继续传播;synthetic binding 必须避开用户真实根名,改名只能更新 default target,不能污染同名命名导出。namespace 经过 renamed re-export 时,同时保留 importer 使用的 member 名和最终 origin export 名:前者定位 importer member span,后者选择 origin declaration,不能混用。named import、namespace import 和 namespace 解构 alias 的成员调用必须保留完整静态成员路径,并按调用 span 排除恒假分支后再把 demand 传播到上游;对象 / class 直接成员、对象解构 alias、实例 alias 与下游 wrapper 都使用同一条可达性链。对象 method shorthand、函数表达式值、箭头函数值以及 class function-valued field 必须按精确函数 span 注册成员根,只加载被实际调用成员中的 dynamic dependency,不能因声明写法遗漏,也不能把属性内未调用的嵌套函数升级为根。

  • 被选 export root 的直接顶层 assignment 必须与声明一起进入 projection,并沿 RHS semantic dependency 继续闭包,覆盖声明后 live binding 初始化、导出对象成员安装与 class prototype 安装。assignment target 必须解析到相同 root symbol;函数体内、嵌套控制流或其它 root 的写入不随文本同名混入。importer 外部调用被选 export 时,assignment RHS 的 function / arrow、对象成员安装与 prototype 成员安装必须成为对应 root / member 的 projected reachability root,且 class static 与 instance 成员严格分离。全部依赖声明先完成投影,再按原始源码位置输出延后的初始化写入,避免 projection traversal 引入 TDZ;组合结果继续受 canonical 重命名、循环 identity 去重及既有体积门禁约束。

  • 顶层 object / array destructuring assignment 写入 exported live binding 时,projection 必须按 assignment target 内实际解析到的 root symbol 收集整条写入,并从最终一次写入中精确选取对应对象属性或数组槽位的 function / arrow 作为外部 callable root;更早写入和其它解构槽位不得反向加载 dynamic dependency。

  • dynamic import demand 必须以 source 与 import occurrence position 联合作为身份,同 source 的可达裸 import 不得继承不可达 occurrence 的 export。动态 namespace 在首段 export 之后继续保留完整 member path,声明 initializer 与后续赋值式 await import 都必须绑定 semantic symbol(await import('./dep.mjs')).run() 及等价静态 computed member还必须直接把 run 记录为该 occurrence 的 export demand,继续服从恒假分支与函数可达性过滤。.then(({ run }) => ...) 的解构本身不构成 callable demand,只有绑定存在可达引用或调用时才传播对应 export;未使用绑定和恒假分支中的引用不得加载 export 内动态依赖。named / namespace 成员作为回调参数、对象解构 alias、实例 alias 与下游 wrapper 时继续按真实调用 span 传播 demand。constructor、new Game().method() 和实例 alias 分别形成精确成员根,this.method() 只匹配相同 class / object owner;顶层声明位置只使用 Oxc span,禁止以源码文本 find 反查。受控 callback API 名严格大小写敏感,调用图只读取真实 callback 参数位:timer、microtask、RAF、Promise 与数组迭代 API 取第一个参数,addEventListener 取第二个参数,delay、initial value、event type、options 和其它额外参数都不得建立执行边。恒假分支区间由单次函数可达性 analysis 预计算、排序合并并借用二分索引,不得使用 thread-local 完整源码 key 或在每个位置查询时复制区间、重扫整份源码。

  • side-effect static import 的 globalThis / window 顶层 effect 如果读取 dependency-local declaration,必须把该 declaration 的 semantic 依赖闭包按原模块源码位置共同投影,不能把 effect 统一前置到声明之前制造 TDZ;同一 declaration 同时服务 side effect 和 imported binding 时按 (origin module, root binding) identity 去重并参与 canonical 重命名。未遮蔽全局 await new Promise(executor) 只有 executor 可静态观察到 resolve / reject 调用、把 resolver 交给可能调用它的 callback,或显式 throw 时才视为可能 settle;仅返回表达式、读取 resolver 或只调用遮蔽参数均按不完成失败关闭,嵌套函数中的 top-level-await 形状继续不影响模块求值。

  • imported member 只有作为受控 callback API 的参数时才建立执行 demand;日志、注册元数据等普通传参不能被当作调用。普通 member alias 必须同时支持声明 initializer 与后续赋值,new ns.Game() 的完整 constructor path 继续传播到实例 alias。局部对象、class、实例、thissuper 的方法调用统一按 semantic receiver owner 匹配,禁止按末级方法名跨 owner 选中同名 decoy。

  • member alias、局部 receiver 与动态 namespace 的 assignment 必须保留赋值位置和 enclosing function scope;函数体内的使用必须按真实 invocation position 选择当时已生效的事件,多次调用跨过赋值边界时合并全部可能 owner,恒假分支、未调用函数或调用之后的赋值不能倒灌覆盖更早使用点。receiver = source 必须冻结赋值完成时的 source owner,source 后续重赋值不能反向改写 receiveridentifier callee 与 new C(args) 的 constructor / instance owner 在参数求值前冻结,真实 invocation effect 仍在参数求值后生效,callable assignment 只在 RHS 完成后替换旧值,因此 start = start() 必须调用旧 callable。return / throw 的表达式先完整执行,随后才截断后续事件;函数体和截断位置统一使用 Oxc AST body / statement span,不能被默认参数或解构参数中的 {} 误导。未知 guard clause 后的语句与 catch 体赋值都保留执行和跳过状态;调用事件继续按 JavaScript 的 callee、参数 / RHS、内层调用、外层调用 / 赋值顺序生效,outer(inner())receiver = mutate() 不得按 AST 先序颠倒副作用。未知条件、循环以及 switch case/default 内赋值保留执行与跳过状态,conditional expression 保留全部可解析 owner,无法解析的确定重赋值显式 invalidation;已调用函数对外层 alias 的最终副作用按调用位置回写,但普通函数体内无条件 return / throw 之后的事件必须截断。被导出的 function、class/object member 还必须把模块初始化完成视为潜在外部调用时点,使声明之后生效的顶层赋值进入 demand,同时保留此前本地调用的旧状态。动态依赖传播继续以原始 owner 模块 AST span 为权威,不得因投影重排声明或省略独立赋值语句而重算出相反 alias。class owner 必须继续区分 static / instanceclass expression 与实例化 alias 进入相同 receiver 图,super 的 parent owner 在 class 定义位置冻结。constructor、.call().apply() 都是实际 invocation;具名 function expression 只保留外层 binding 对应的单一 range,未被受控 API 执行的 inline function / arrow 保持不可达。恒真 / 恒假关键字只按 JavaScript 大小写识别,局部或参数遮蔽的 undefined 不得当作恒假;恒假分支识别必须先用 parser trivia 屏蔽注释和非执行 literal。callback API 只接受 semantic 未解析的已知全局调度函数或 AST 可证明的 literal array / dynamic import 调用;用户定义、导入或遮蔽的同名 setTimeout / map / then 不能触发参数执行推断。

  • new 必须覆盖显式 super()、隐式 derived constructor 和直接 class expressionclass expression 经 new 赋给局部变量时必须冻结 instance owner,未 override 的 instance / static 方法沿冻结的 extends 链查找。普通嵌套 function 拥有独立 this,只有 arrow 词法继承外层 owner。声明后通过 assignment 安装的 function / arrow、本地 function alias 和 .bind() 结果都必须保留 callable identity;只有未被函数对象自有成员覆盖的 Function.prototype .call() / .apply() / .bind() 采用内建 callable 语义,自有覆盖和业务对象同名方法都按实际成员 callable 解析。函数对象自有 .call / .apply / .bind 覆盖必须按对象身份传播到全部普通别名,.bind() 生成的新函数则保持独立对象身份。callable conditional expression 必须合并 consequent / alternate 的全部可调用身份;声明式和后续赋值式 api.run.bind(api) 都在绑定时冻结成员 owner 与方法名。受控 callback 识别穿透 callee 与 receiver 外层括号;Promise .then 的 fulfilled / rejected 两个参数都是 callback.catch / .finally 仍仅取第一个。timer、RAF、microtask、Promise 与事件监听 callback 的注册点只建立异步可达调用边,闭包读取外层 alias 时必须选取当前同步作用域收尾后的状态,不能冻结在注册点;callback 函数体对外层 alias 的写副作用仍不得同步提交到注册调用末尾。数组字面量的已知迭代 API 才按同步 callback 传播函数体副作用。视觉资产启发式允许使用 ASCII 小写副本查找路径、drawImage 与图片变量,但函数调用图、semantic binding 和可达性必须始终解析原始大小写 JavaScript,禁止把 MainLoopmainloop 合并。Canvas 视觉门必须复用同一组受 256 文件、累计源码 2 MiB 与投影处理 32 MiB 限制的 inline / external module 加载、链接和投影结果,并逐个原始大小写 unit 独立关联资产路径、图片变量与可达 drawImage<script type="module">、本地 <script type="module" src> 及其真实可达依赖可以形成证据,未链接文件、恒假动态依赖、未调用函数、跨 unit 拼接和仅出现在 HTML 文本中的路径不得借用其它 unit 的绘制调用过门。

  • conditional callable 的 consequent / alternate 必须在 test 求值之后分别按自身表达式起点冻结身份;受控 callback 参数也按该参数自身起点解析,使更早参数的 alias 副作用先行生效,同时保持真实 callback 执行边位于注册调用之后。

  • 异步 callback 的延迟状态必须沿完整 enclosing invocation 链传播:每层闭包读取该函数同步收尾后的局部 alias,越过最外层调用后再读取当前 job 末尾的外层 alias;不能只完成注册函数一层后,又在其调用点冻结更外层状态。conditional expression callee 在 test 完成后解析两支,assignment expression callee 直接调用 RHS 求值结果;new 除 class constructor 外也必须调用普通 function 及其 alias。函数对象自有 .call / .apply / .bind assignment 的 RHS 可来自普通对象静态 member callabledelete 通过任一共享函数 alias 删除这些自有覆盖后恢复 Function.prototype intrinsic,未知条件删除保留覆盖与 intrinsic 两种可能。删除态必须和“自有属性仍存在但值不可调用”分离,后者继续禁止 intrinsic 回退。

  • callee 求值必须覆盖 sequence、logical expression 与 ||= / &&= / ??=:sequence 只调用最后一项但保留前项副作用,logical 与 logical assignment 按 callable 的真值 / nullish 事实执行短路,未知状态才合并可运行分支,不能统一退化为 RHS 或把已跳过 RHS 的 decoy 建边。new 的 assignment / conditional callee 同样先完成 callee 求值,再冻结 constructor owner;未被 class 自有静态 bind 或函数对象 own override 覆盖的 Function.prototype .bind() 保留原 class construct target。delete (((target.call))) 等任意括号包装必须删除同一函数对象 own .call/.apply/.bind 并恢复 intrinsic。固定 dynamic import 返回的 Promise 可沿任意连续 .then/.catch/.finally 链传播 callback 可达性,链中每个 .then 只取 fulfilled / rejected 两槽,.catch/.finally 只取首槽,其余参数保持普通值。

  • callable 结果判定必须服从运算符真实返回值:普通 = 才直接采用 RHS callable+= / -= / *= / /= / %= / **= / <<= / >>= / >>>= / &= / ^= / |= 的结果按 primitive 处理,不能把仅作为值参与运算的 RHS 函数误建成调用边。logical callee 先按 boolean / numeric / string / null 字面量执行 || / && / ?? 短路,已跳过的 RHS 不可达;sequence receiver 的最后一项继续保留原函数对象身份,使 (0, target).call 一类访问、覆盖安装和 delete 都命中同一个 own property。原生 Promise callback 允许从固定 dynamic import、未遮蔽全局 new PromisePromise.resolve / reject / all / allSettled / any / race 及其可证明变量 / alias / 连续链建立边;任意业务 thenable、未知返回值和局部遮蔽的 Promise 不得仅凭 .then/.catch/.finally 同名升级为受控 API。new (Fn.bind(...))() 在未被业务静态成员或函数对象 own bind 覆盖时,必须直接保留普通 function Fn 的 construct target。

  • 泥点不足是确定性业务中断,不是瞬态 Provider 故障或未知副作用。钱包的 泥点余额不足可消费泥点不足:... 两种领域文案统一映射为稳定原因 mud-points-insufficient,不得自动重试;即使 External Generation durable ledger 已存在,也必须落为 failed,不能误入 needs-reconciliation。game-chat 顶部状态、持久失败对话与 【Supervisor 阶段记录】 统一显示“泥点余额不足,本轮游戏生成已中断。请充值后发送“继续”,系统会从当前项目进度接着完成。”,并禁止透传 operationId、URL、路径、密钥或任意上游正文。

  • tool-plan 成功响应落账前,对内置 Runtime 原生函数与 legacy wrapper 的合法、无重复 key JSON arguments 按工具 schema 的精确位置做项目路径 canonicalizationfile.*.pathproject.patchset.changes[*].pathproject.git_commit.paths[*]command.*.cwdimage.inspect.paths[*]canvas.asset_generate.outputPath 若是当前项目根目录内的完整绝对路径,转换为 / 分隔的项目相对路径后再校验、持久化并执行;源码/叙述字段、任务产物描述、动态 MCP arguments 和项目外绝对路径不得改写,后两者继续由绝对路径门禁失败关闭。项目根只允许搜索/列举范围与命令 cwd 规范化为 .,不能成为文件目标。当前进程与重启恢复都必须从同一份规范化 handoff 重放,禁止分别执行原响应和持久响应。

  • 循环 ESM 的投影身份固定为 (origin module, original root binding);canonical 重命名只改变组合单元中的展示名,身份随投影闭包传播。删除已存在的回流声明后仍必须把 import 引用改接到 importer 中同一身份的既有 canonical;固定点未在“模块数 + 1”轮内收敛时失败关闭,不能返回最后一轮仍变化的部分结果。inline module 必须先提取原文并计入与外部脚本共享的累计源码 2 MiB 上限,再执行语法和语义校验;超限源码不能因无效语法被过滤,小型无效模块也必须明确失败关闭。

  • HTML 静态门只屏蔽 raw-text 容器之外的真正 HTML 注释,script / style 原文必须逐字交给对应 parser;禁止对整份 HTML 做非词法 ///* */ 删除,字符串中的 https://、路径和注释形状不能被截断,HTML 注释诱饵仍不得进入标签或脚本证据。Canvas 尺寸、可见性、元素绑定和 stylesheet 选择器扫描只读取浏览器可渲染标记,必须完整跳过 template / textarea / noscript / title / style / xmp / iframe / noembed / plaintext 的标签诱饵;活动顶层 stylesheet 独立提取,不能借用 inert 容器中的样式或把 CSS raw-text 当 HTML 标签。classic inline 与无 defer / async 的 external 脚本按 HTML 标签出现顺序组成 parser-blocking global 段;classic external defer 必须在解析阻塞段之后按文档顺序求值,不能提前到标签之后的 inline 前,async 因下载完成顺序不可静态证明而失败关闭。带 src 的标签忽略 inline body,普通脚本顺序不得退化。

  • 每个 classic inline、parser-blocking external 和 deferred external 标签都是独立 Script Record;静态组合在相邻正文之间插入硬空语句边界,防止前一份正文的 ASI 敏感尾部吸收后一份正文。Canvas 绘制证据使用 Oxc AST 与 semantic binding 精确关联可见 DOM Canvas、实际 context、静态 drawImage member callee、图片 symbol 和绘制位置的 .src 状态;fakeDrawImage、离屏 Canvas、隐藏的首个 querySelector('canvas') 目标、恒假 / 未调用 / 绘制后覆盖均不作证,未知条件保持失败关闭。资产 URL 比较不折叠路径大小写,Linux 上 PLAYER.pngplayer.png 必须保持不同文件。

  • dynamic import namespace 是只读 Module Namespace Exotic Object。视觉组合不得把 namespace assignment target member 替换为可写本地 binding;可达写入会在真实运行时抛错,其 RHS 绘制诱饵和同一执行链后续读取都不能形成视觉证据,纯读取继续按 occurrence-scoped export demand 投影。玩法身份与浏览器 telemetry 的 HTML 文本门只读取可渲染普通文本和可执行 inline JavaScriptinert/raw-text、HTML 注释、带 src 的 script body 和 application/json 等非 JavaScript script 内字符串不得补齐玩法或固定 telemetry 字段,外部证据仍只来自已链接且通过语法门禁的 unit。

  • ESM 投影的最终组合顺序必须反映 dependency 先初始化、importer 后求值:先在原 importer 坐标上完成 import reference span replacement,再把依赖闭包投影放到 importer 顶层正文之前,使 dependency 在声明后安装的 function-valued export 能被 importer 调用看见。最终单元继续重跑 parser / semantic 和单元 2 MiB、累计投影 32 MiB 门禁;canonical identity、循环回接去重与有界固定点规则不因顺序调整而放宽。

  • ESM live binding 的外部 callable demand 以模块初始化完成后的最终直接顶层 assignment 为准;同一 root 或 member 的旧 RHS 仍按源码参与初始化投影,但不得继续作为外部调用根加载旧 dynamic dependency。projection declaration 按原模块源码位置输出,静态 dependency origin 按 importer 中的声明顺序输出;循环回流去重必须同时删除对应声明与初始化写入,确保同一模块初始化只出现一次。

  • 直接 (await import(source)).member 不限定为立即调用:赋值、受控 callback、constructor 和后续完整静态 member path 都保留 (source, import occurrence) demand,并只替换首段 export member span;恒假 occurrence 仍不得借用可达 occurrence。export let Game; Game = class { ... } 的 class expression assignment 同时支持 static 与 instance member root,二者不得串线。

  • side-effect-only static import 只把 dependency 中直接可观察的 globalThis / window 顶层 effect 按有界 DFS dependency-before-importer 顺序加入组合 unit,不把 dependency local binding 暴露给 importer,也不采纳未链接 module。模块含可静态证明永不完成的 top-level await(当前至少覆盖未遮蔽全局 await new Promise(() => {}))时读取失败关闭;嵌套 async function 内同形 await 和可完成的 top-level await 不误拒绝。

2026-07-31 长耗时与恢复收口

  • 除持久 project-supervisor-game-chat 单主 route 外,autonomous-game-build 的固定 manifest DAG 是唯一缺省首轮专业执行链。缺省 collaboration policy 不再额外强制 code-prototype / quality-review / art-* 静态首波,Runtime 也不再按 Editor Key 或已有图片偷偷追加 Agent。2026-08-03 起,显式项目 policy 或旧 batch 恢复若进入首批 agent.delegate 兜底,同样只能激活 design-director / art-director / code-director,不得提前激活底层 Agent;这条兜底不能在默认 manifest 前复制同职责委派。game-chat 例外只允许持久路由后的 code-prototype,以及该主 Run 经审计后临时建立的受限美术 delivery。
  • preview-readiness 只有在自己的 child run 持有当前 project revision 的 game.static_smoke=passed 凭证后才能完成;preview-playtest 作为根 Supervisor 的直接 manifest child,必须解析并写入根完成合同的当前 revision browser receipt,报告、desktop/mobile 截图及摘要复核通过后才能投影 manifest completed。
  • 浏览器未发现、临时环境不可建、启动超时或在 WebSocket URL 解析前退出统一分类为 preview-infrastructure-unavailable。首个持久 observation 后收束当前 action batch并失败结束 child/root run,禁止继续用 Provider 逐轮规划同一 revision 的重复启动;普通页面/玩法验收失败仍保留为业务失败,不混入基础设施分类。
  • game-chat release 在 CloseRequested / ExitRequested 前复用 Runner durable idle probe;只要存在 process session、pending/finalization/provider/tool-plan handoff 或非终态 Agent queue/phase,就阻止关闭并提示先完成、暂停或取消。不可撤销的最终 Exit 不再作为唯一保护点,Windows Job Object 的 child-owned 安全边界保持不变。
  • 规范 Agent 默认推理档覆盖全部 21 个角色:核心规划、生成、设计/美术/代码原型和质量角色使用 high,协调与结构化交付使用 medium,确定性预览 gate、音频总监和发布策略使用 low;显式 agentLlm.<id>.reasoningEffort 始终最高优先。规范默认由 Runtime resolver 解析,模板与 GUI 初始草稿保持 agentLlm 为空,避免默认值被误判成角色独立 LLM 路由;GUI 必须显示每个角色的实际默认档。全局与逐 Agent status/CLI 必须同时显示实际解析后的 reasoning、request timeout、max retries 和 retry backoff,区分运行快照与后来配置。

2026-08-05 game-chat 修复计划与 manifest child 生命周期补充

  • code-prototype 的确定性交付需要同时满足当前 Run 存在 status=ok 的真实 mutation action、本人当前 mutation revision 的 game.static_smoke=passed 与完整 autonomous completion gate 无阻塞;失败 patch 即使因保守失效旧凭证而推进 revision,也不能取得 mutation ownership。mutation ownership 使用最后一条同工具调用,并严格匹配当前 Agent/task/session/run/actionId/actionFingerprint/tool 的 durable receiptpending action 的 plannedSteerCursor 必须进入 recent tool-call 与 receipt 的同一 fingerprint,不能因非零 steer cursor 把真实成功误判为外来动作。static smoke 通过但仍有素材或正式产物缺口时,Runtime 对尚未完成的计划用单一 in-progress repair 替换首个非终态步骤并保留后续 pending;只有计划全 completed 且未满 8 步时才追加 repair。下一轮交还 Provider 生成实际 file.patch,完整门未通过时禁止自动完成计划,也不得因 retained completed 步骤与 steer 新计划合并超限而进入空转;结构化计划只要已经包含不可改写的 failed 步骤,就在快车道入口明确失败关闭,不再依赖 mutation ownership 或完成门诊断是否仍存在。
  • manifest Pending 漂移仅在当前最新活跃 game-chat 根 Run 内容忍,并要求确定性 child runId、父绑定及 state/durable journal 的 Running-Runningchild 终态投影要求 Completed-Completed。queued、waiting、failed、needs-reconciliation、旧根 Run 和不可信 source 不得借用容错。
  • durable active child 的权威性高于 stale Completed manifest 快照,但 Failed manifest 仍立即失败关闭。所有 ready child 的文件、patchset、命令产物和其它项目 mutation 在写锁内再次核对当前根 Run;新根 Run 建立后旧 child 只能安全收束/审计,不能再修改项目或推进 revision。
  • 大 classic 游戏脚本的函数可达性查询必须对固定 invocation graph 使用整轮 visited,每个 function node 最多访问一次;递归栈只负责去环、返回时删除节点会在 render/update 扇入图中指数回溯并阻塞 Runner 事件循环。Canvas alias 全空历史、稳定祖先初始化、整画布尺寸引用和可证明的 COLS × ROWS × CELL 格子目标使用有界静态路径,普通未知动态坐标继续失败关闭。
  • 根 Supervisor 只对 manifest 中已经 Completed 的 seed task执行正式产物、素材和 Canvas 深验;未完成状态本身已经阻塞根完成,禁止在 code-prototype 尚未开始时提前扫描四类素材。自动唤醒连续耗尽 200 次瞬态预算后进入 needs-reconciliation,不得静默保留 running。
  • Canvas 可见性区间证明按 Oxc semantic symbol 与当前绘图 context 的 Canvas owner 解析:函数 alias 重绑定、可达调用参数、计数循环和作用域内数值常量都必须保持身份。无法化简的格子索引只在唯一 COLS / ROWS / CELL 合同下覆盖完整棋盘轴;已知越界实参继续拒绝。动态 clamp 只接受未遮蔽全局 Math.min(currentCanvas.width|height - size, Math.max(0, dynamic)),错误 Canvas、遮蔽 Math 和普通未知坐标失败关闭。
  • parent wake 达到瞬态预算上限时先形成 durable reconciliation signallane 忙保留 deferred 状态,随后在同一 execution lane 与项目写锁内重读原始 state、最新 durable task、取消墓碑和 DAG 进展。manifest 结构损坏时使用不依赖 manifest hydration 的专用 CAS journal 与原子 state 写入,不能吞掉持久化错误,也不能用过期终态覆盖并发取消或 child 进展。durable terminal reconciliation task 是后续 state / queue / event / audit 的提交标记;重启恢复必须在其它 resume 动作前幂等补齐这些投影,task journal 读取损坏不得当作任务不存在。恢复只在 raw state 具有完整 Agent/task/Session/run/source/profile/binding/task 身份时选择其当前 runstate 缺失、JSON 损坏、空对象或 runId 等关键身份为空时只考虑 journal 最后一个 logical run,完整有效的新 Run 继续阻止历史 marker 覆盖。event 与 Agent DB audit 只有完整稳定 payload 唯一匹配时才视为已投影,同键冲突或重复必须失败关闭;旧 task 已 completed/cancelled、Runtime 已离开 waiting 或新 Run 已接管时,deferred signal 必须追加 run-scoped resolved/superseded 终局。

2026-08-04 manifest 与工作台一致性收口

  • .agent/manifest.json 的存储写边界使用同目录持久文件锁跨线程、跨进程串行化;锁必须覆盖旧 manifest 读取、不可变版本前缀校验、临时文件安装和安装后回读一致性校验。锁文件拒绝符号链接、非普通文件和异常所有权 / 硬链接;Windows 使用不共享写句柄,Unix 使用 O_NOFOLLOW + flock。旧快照在新版本安装后只能被拒绝,不能覆盖已追加版本。
  • 后台 Agent 的 manifest 变化以共用 Runtime 状态投影 / 终态 emitter 作为失效因果点:game-creator-agent-runtime-update 的 Rust / TypeScript DTO 固定携带 manifestInvalidated,且 App 必须在 Supervisor、selected agent、session 和 run 身份的任何 early return 之前处理失效。GUI 进程内 Runtime 直接发该事件;External Runner 是独立进程、没有 GUI AppHandle,因此 Runner 协议 v5 的 runner.attach_gui_owner 必须登记 GUI 创建的随机 loopback 端口和 64 位随机令牌,Runner 的同一 emitter 通过受令牌保护的短连接转发 game-creator-manifest-invalidated。两条路径都只传项目路径与 Agent 身份,不复制 manifest,也不靠轮询补偿。
  • App 收到当前项目的 Runtime / relay 失效后重新调用 get_local_game_manifest。重读按项目 single-flight 合并事件风暴;读取中再到达失效只追加一轮串行重读,不并发提交同项目响应。应用结果同时校验组件仍挂载、当前项目路径和项目 scope version;项目切换、组件卸载或旧 scope 的迟到响应不得覆盖新项目。Project Supervisor 对外发布前以“revision 前读 -> manifest -> revision 后读”取得一致快照,再通过 onManifestChange(projectPath, manifest, metadata) 携带 projectId + revision + source;启动器按 projectPath + projectId 只接受更高 revision,同 revision 只接受内容一致的重复,旧轮询和同 revision 分叉都不得覆盖。资源列表、依赖图输入、任务状态、运行入口和正式版本卡必须在当前页面实时重投影,不要求关闭或重开项目。集成测试记录“事件未重新打开项目”的调用基线前,必须先等待项目写入最近列表后触发的只读目录状态刷新完成,不能把这项合法后台检查误算成失效事件副作用。
  • .agent/agent.db 有界尾部读取报告截断时,审计 producer 映射失败关闭,不生成基于不完整审计的 producer、task flow 或对应任务环。前端收到截断 DTO 时只剔除 producerAssignmentstaskFlows 与对应 cyclicTaskIdsRust 根据当前 manifest、精确资源引用和仍可信任务深度下限返回的 dependencyDepths 继续保留,前端只校验资源仍存在且深度为非负安全整数,不得自行重算或压平权威深度。精确引用边、reference connection index、cyclicResourceIds 与 unresolved references 同样继续保留。 -- 资源依赖 SVG 继续作为不可交互装饰层隐藏,但 dependency 画布通过 aria-describedby 提供当前可见精确引用和任务流的文本等价列表。中央资源聚焦按稳定 resourceId 驱动焦点状态:仅 null -> ididA -> idB 聚焦详情 region,同一 ID 的 manifest 重投影不得抢走音频、视频、链接或关闭按钮焦点;显式收起和 Escape 恢复画布滚动并优先聚焦原触发卡片。聚焦资源被删除时清理 stale focused / selected ID,关闭详情并把焦点落到资源搜索框;项目切换或运行视图切换清除旧恢复意图,不得恢复旧项目卡片。橙色引用线及箭头使用对 #fffdfa 画布达到至少 3:1 的颜色。

2026-08-05 客户端素材创作无限画布阶段一合同

  • 资源总览画布与素材创作无限画布是项目工作台中央主视窗的两个状态。资源总览继续消费 manifest、dependency/type 布局与 Rust 依赖图;素材画布以 sessionId + draftId + create/refine 建立独立生命周期。“新增资源”和“精修资源”只切换中央区域,右侧 Supervisor 与底部 Agent 状态栏常驻。
  • 网站与 Tauri 共用 packages/image-canvas-corepackages/image-canvas-react;网站保留账户、钱包、服务端项目和云端素材库 adapter,Tauri 保留本地项目、受控文件、manifest、项目 revision,以及普通登录态内部编辑器/高级 External v1 双模式 adapter。现役网站画布是抽取来源,不允许整体复制到客户端。
  • 本地草稿固定保存到 .agent/workbench/asset-canvas/schema 为 game-creator-asset-canvas-draft.v1,以 expectedProjectId + expectedDraftRevision 做 OS 锁内 CAS;单 JSON 2 MiB、最多 4096 层,媒体正文只进入受控 media/staging 文件。损坏、未知 schema、身份错配、超限和恢复摘要不匹配全部失败关闭。
  • 正式资产命令固定为 commit_local_project_asset,同时绑定 expectedProjectId、项目 expectedRevisionexpectedDraftRevisioncommitIdidempotencyKey 和 staging 摘要。事务在项目锁内按 prepared、最终图片、manifest/revision 逻辑原子更新、回读、ledger/草稿提交推进,释放锁后最后发布 game-creator-local-asset-committed;事件至少一次并按固定 eventId 去重。
  • refine 不覆盖源文件或复用源 asset ID。源缺少外部 resourceId 时补齐 local-asset:<manifestAssetId>,新 canvas-<commitId> 资产用 referenceResourceIds 登记源和其它直接引用,避免混淆 manifest asset ID 与 External Editor resource ID。
  • 提交返回完整最新 manifest;当前项目仍匹配时立即更新项目上下文、资源投影、依赖图和两种布局,布局 ready 后才按焦点守卫决定选中。用户已切项目、切状态、开始新 session、选择其它资源或改变搜索/筛选时,迟到结果不得抢焦点;新资源被隐藏时保留条件并提供显式清除/定位动作。
  • 图片首版包含平移、缩放、图层选择/移动/缩放、撤销重做、导入、基础编辑、生成、导出和本地回写。2026-08-10 起视频使用源引用派生、音频使用语义重制;高级抠图、图集、角色动画、视频时间线与音频波形级编辑后续分期;本阶段不修改 SpacetimeDB schema。

2026-08-05 客户端素材创作无限画布阶段二共享源码抽取

  • 阶段二只完成网站与 Tauri 可共同解析的唯一画布源码,不进入 Tauri 素材创作业务闭环,也不修改 project-development 资源总览页面。apps/ai-game-creator-shell 只增加共享包解析、React 去重、作用域 CSS 引入和 features/asset-canvas/sharedImageCanvasFoundation.ts 编译入口;草稿 sidecar、Tauri adapter、中央状态接线、生成、正式提交和即时投影仍按阶段一合同留待后续阶段。
  • packages/image-canvas-core/src/ 是纯 TypeScript 边界:types/model/interaction/selection/layerCommands/layerTransform/history/overlays/stageController/stageInteractions/exportModel/ports 分别承接通用类型与常量、坐标/平移/缩放/适配内容/小地图、单选/多选/框选、图层命令和缩放变换、历史恢复、overlay 定位、stage controller、基础导出模型,以及 project/asset/generation/completion 四组 Host Port。该包不依赖 React、DOM、网站客户端或 Tauri API。
  • packages/image-canvas-react/src/ 承接 CanvasViewportCanvasWorldLayerRendererSelectionOverlayZoomControlsMinimapCanvasPortal 和现役 history/viewport/stage hooks。网站 ImageCanvasStageViewImageCanvasWorldViewImageCanvasPanelDockViewImageCanvasEditorPortal 已直接消费这些组件;旧模型和 hook 文件只保留无业务逻辑 re-export,网站与后续客户端不会再维护第二份核心实现。
  • 网站继续保留 ImageCanvasEditorView 的账号门禁、钱包/计费展示、路由、editorProjectClient、云端项目持久化、素材库、上传、生成、媒体换签与业务面板。src/components/image-editor/host/webImageCanvasHostAdapter.ts 只负责把这些网站事实组合到共享四组 ports;共享包不读取账号 store、钱包 store、HTTP client 或网站别名。现役视频、音频、序列帧播放器和 Agent 面板仍属于网站 renderer 插槽边界,本阶段没有误下沉到图片首版 core。
  • 共享样式固定为 packages/image-canvas-react/src/styles.css,全部以 .genarrative-image-canvas 作用域开头;网站可以继续用 src/index.css 提供站点皮肤,Tauri 只导入共享样式和自身 styles.css。两套 Vite 都把共享源码显式 alias 到仓库 packages/Tauri dev server 保留 fs.allow=[repoRoot],并通过 resolve.dedupe=['react','react-dom'] 保证单 React 实例。
  • portal 默认进入当前 Provider 指定的 root,未指定时才回退 document.body;事件监听、ResizeObserver、animation frame 和小地图查询均按组件实例清理或限定在当前 viewport。文档中只有一个小地图的旧调用形态允许唯一元素回退,页面存在多个小地图时不做全局猜测。
  • 阶段二定向证据为共享 core/React 7 项与现役 src/components/image-editor 74 个文件、892 项测试通过;主站与 AI 游戏创作壳 typecheck 通过。构建、编码和 diff 门禁以本次任务最终验证记录为准。

2026-08-05 客户端素材创作无限画布阶段三 Tauri 独立闭环

  • 阶段三在 apps/ai-game-creator-shell/src/features/asset-canvas/ 增加独立 AssetCanvasSurface 与薄 Tauri Host Adapter,直接消费阶段二的 core/React/ports。页面实现 canvas.creating / editing / saving / recovering / failed,支持 PNG/JPEG/WebP 本地导入、选择、多选、移动、缩放、删除、60 步撤销重做、viewport 平移缩放、小地图、复位和浏览器合成导出;generation port 明确返回 mock unsupported,不发送真实 AI 请求。
  • 草稿正式保存到 .agent/workbench/asset-canvas/,由 Tauri Rust 使用持久 OS 文件锁和 expectedDraftRevision CAS 串行化;主草稿、固定 recovery JSON 与实际 recovery 字节的裸 SHA-256 一起安装。主文件损坏时只有 schema、项目/草稿身份、摘要及全部媒体签名、摘要、尺寸和普通文件身份都可信才恢复,否则进入 reconciliation-required。单文件限制 64 MiB,单草稿媒体总量限制 512 MiB
  • 正式提交先把合成结果安全写入受控 staging,再进入既有项目 mutation 写锁。锁内重读并校验 manifest、项目身份、项目 revision、草稿 revision 和提交指纹,写 prepared journal/ledger 与 before/after 快照,安全安装唯一最终图片,原子更新 manifest 和 project revision,回读图片/manifest/revision 后提交 ledger 与草稿;释放锁后才发布 game-creator-local-asset-committed。同 commitId/idempotencyKey 同请求返回原权威结果,同键不同请求失败关闭,同 expected revision 竞争最多一个成功。
  • 崩溃恢复只按 journal、ledger、before/after 摘要和最终文件三态推进:图片与 manifest/revision 都在 before 时,只清理摘要和尺寸可证明属于本事务的新文件;最终路径不存在可直接回滚;最终路径存在但身份不匹配必须保留文件并进入对账。manifest 已安装而 revision 未安装时前向补 revisionmanifest/revision 都是 after 时补齐 ledger、草稿和事件。业务事实完成后 emit 失败不回滚,后续恢复继续按固定 eventId 发布。
  • refine 只允许从当前 manifest 唯一登记的 PNG/JPEG/WebP 普通文件建立草稿,并复核签名、完整解码、大小、符号链接和硬链接。正式保存保留源 asset 与源文件,为缺失 resourceId 的源补 local-asset:<sourceAssetId>,新建 canvas-<commitId> 并以 referenceResourceIds 引用源资源。
  • 页面以 project/draft/session epoch 丢弃项目切换、会话切换和卸载后的旧 Promise/事件,并以 eventId 去重 command 返回与至少一次事件。相同 scope 字段的父级重渲染不会重复打开草稿,选择变化也进入草稿 CAS;正式保存直接消费 CAS 返回的新 draft revision,不等待 React state 提交时序。
  • 本阶段只提供独立 Surface/fixture 与 Tauri commands,不接 project-development 资源总览按钮、不做保存后的资源总览自动选中,也不接真实 External Editor API。定向证据为阶段三 Surface 8/8、共享 core/React 7/7、既有 AppSurface 351/351、Rust 素材画布 11/11 与客户端 typecheck 通过;AppSurface 保留仓库既有 React act(...) 警告,不影响测试结果。

2026-08-05 客户端素材创作无限画布阶段四资源总览闭环

  • project-development 已在资源总览提供“新增资源”,在 PNG/JPEG/WebP 聚焦态提供“精修资源”;两者只替换中央主视窗。取消先以草稿 CAS 标记 cancelled 再恢复原 dependency/type、搜索、滚动、选择与聚焦上下文。generation 仍为明确 mock,不请求真实 AI。
  • command 响应与 game-creator-local-asset-committed 统一携带 projectId + draftId + commitId + assetId + projectRevision + committedProjectRevision + eventId。启动器以 projectPath + projectId + revision 合并 manifest,并以 eventIdprojectId + commitId + revision 记录重复身份;响应先到、事件先到、旧轮询和迟到重复均只改变一次当前权威快照。
  • dependency graph 不再依赖当前可见 mode 才读取;scope 包含 projectPath + projectId + 完整资源输入签名(含精确引用)。dependency 图未 ready 时不启动该 mode 布局读写;graph、dependency layout、type layout 都以签名化 epoch 丢弃旧请求,新 scope 不等待旧请求槽位。两份布局独立补齐新 ID,并保留全部仍有效历史坐标;图结构和布局继续不写 manifest。
  • 保存开始冻结 saveAttemptId + sessionId + draftId + commitId + focusGeneration。迟到提交始终可以更新当前项目的权威 manifest,但只有 flow、项目、保存尝试和 generation 仍匹配的最新意图可以继续定位。定位依次等待资源投影、dependency/type 两份布局 settled 且均有位置、当前筛选可见和 data-resource-id DOM 卡片存在;完成后按 commitId 只执行一次。搜索隐藏时保留条件并提供“清除搜索并定位”,该显式动作建立新的 focus generation。
  • 锁职责复核保持阶段三实现:正式提交/恢复固定为“项目 mutation write lock -> asset-canvas draft/transaction lock -> manifest store lock”;资源布局只取得独立 .layout.lock,不取得项目 mutation 或 asset-canvas 锁,布局协调只发生在提交释放锁并返回/发事件之后,不形成反向锁顺序。
  • 阶段四新增纯状态机与中央主视窗集成测试,覆盖响应/事件双顺序、旧 manifest、旧 graph/layout、切项目、改选择、连续保存、搜索隐藏、布局未完成、DOM 一次聚焦、refine 真实依赖以及无 reload/重开项目。最终通过项以本次任务验证记录为准。

2026-08-05 客户端素材创作无限画布阶段五真实图片生成

  • 阶段五只接图片生成与图片精修,通过阶段二共享 ImageCanvasGenerationPort 调用客户端 Tauri adapter,并复用现有编辑器项目、统一生成队列、资产上传/换签、稳定引用解析和受控下载能力;不复制网站 useImageCanvasGenerationWorkflow,不新增角色动画、视频、音频、图集或平行生成系统。
  • 生成面板和确认摘要只操作本地状态;用户点击独立“确认生成”后才通过 canvas.asset_generate confirm 权限边界。本地生成意图建立时即分配稳定 intentId/generationId/idempotencyKey,取消确认则直接丢弃且零 External 调用;一旦提交,重复点击、重启和未知结果保持原身份,不能自动确认或换键重扣。
  • 主站网页画布与普通 AI 游戏创作 Tauri 客户端统一使用当前平台登录态调用固定官方 origin 的 /api/editor/*/api/assets/*/api/runtime/external-generation/jobs/*。网站 Access Token 延续现有 WebView 客户端存储与刷新 Cookie 机制;登录成功或刷新后,AGC 只把 userId + 短期 Access Token + 单调 authGeneration 的当前快照同步到 GUI/Runner 进程内存,退出或换号以更高 generation 清除旧快照。Token 不写 Rust AppData 配置、项目、账本或日志。/api/external/v1/* 继续只供第三方开发者和独立 standalone game-chat/高级自定义模式使用自备 tnr_sk_...,不自动签发或下发 Developer API Key。
  • 每个网络动作在发出前冻结 ownerUserId + authGeneration,并在响应解析、账本推进、媒体安装和正式提交前复核当前账号。旧 generation 的迟到响应或清除不得覆盖新账号。普通模式首次 401 时,每个 generation 只允许一个共享 refresh;其它请求等待它,但保留各自 deadline/取消。refresh 成功后以更高 generation CAS 安装新 Token,并仅用原 endpoint、原始请求字节和原 Idempotency-Key 重试一次;refresh 失败、账号切换或再次 401 时停止网络并保留账本,403 不触发 refresh。
  • 调用模式、精确相对 endpoint、精确请求、prompt、idempotency key、operationId 和稳定产物引用只进入 .agent/workbench/asset-canvas/generations/ 私有账本。本地参考图 direct-upload ticket 的 host/formFields/policy/signature/临时 Authorization 只存在内存;恢复账本只允许保存稳定 bucket/objectKey。普通账本身份固定为 official-platform-v1 + 官方 origin + ownerUserId,高级账本身份固定为 External service origin;均不绑定或保存 Token/Key。换号后旧 owner 账本零网络、零安装,只有重新登录同一 owner 后才能恢复。accepted/running 只 GET 原 operationprepared 只精确重放冻结 endpoint、原始请求字节和原幂等键。草稿/manifest/event/日志只投影安全阶段与本地身份。
  • 固定状态顺序为 generation-accepted -> generation-running -> remote-completed -> media-downloaded -> asset-durable-committed -> manifest-projected -> layout-ready -> selected。远端 completed 后必须先验证稳定引用,再经 /assets/read-url 下载并写入阶段三 staging;随后用账本中的固定本地 commit 身份进入既有 journal/ledger 事务。正式提交失败只恢复本地事务,不重新生成或下载。
  • 应用重启时 accepted/running 只恢复 GETprepared 只以私有账本原请求字节和原键恢复同一 POST。用户停止等待只失效当前 focus generation;不可取消的远端操作继续 reconcile,迟到 completed 可以更新原项目但不能抢焦点。配置缺失、结果引用不稳定、下载/提交失败和未知结果都不得显示资源创建成功。
  • 最终审计后 Tauri 撤销/重做直接使用与网站相同的共享 useCanvasHistory,共享 history 同时恢复 viewport、选择、图层位置和缩放边界;Tauri 自身只保留 Pointer 事件接线,平移、缩放、选择、图层变换和 renderer 算法继续来自共享 core/react。
  • 正式事务把首个快照、全部快照和 journal 写入后但 ledger 写入前纳入故障矩阵。恢复发现无 ledger 的 transaction 时,只有目录内容全部属于受控快照/临时文件、正式目标文件不存在、manifest 与 project revision 仍精确等于 before,才清理目录并返回 rolled-back;任何未知文件或权威状态变化都失败关闭。同一 commit/idempotency 身份在清理后可重放,最终仍只登记一份资产。

2026-08-06 Game Agent 画布 UI 对齐阶段三至五

  • 中央 AssetCanvasSurface 沿用现有 create/refine、生成、保存、取消和恢复接线,直接消费 @genarrative/image-canvas-reactCanvasChromeButton / CanvasToolbar / CanvasToolbarGroup / CanvasToolbarDivider。宿主不再维护全局按钮皮肤,只保留字段、面板定位、主要动作和平台 token 映射;主站完整 src/index.css 没有进入 Tauri。
  • 顶部动作与保存设置分层,工具组保持中文单行并允许工具栏受控横向收纳;生成设置仍是独立 dialog。进度/失败卡、dialog 和底部状态栏使用内部滚动,不再由固定高度或父级 overflow 裁剪,保存/确认使用平台 primary 层级。
  • 工作台仍是左导航、中央主视窗、右 Project Supervisor、底部 Agent Dock 四区。中央区使用主面板层级;Supervisor 的消息/Runtime 独立滚动且 composer 常驻;Dock 改为较轻的持续状态 surface 与可收缩卡片。桌面网格按 100dvh 将 Dock 固定在第二行,≤760px 只保留开发兼容堆叠。
  • AppSurface/CSS 合同锁定 1280×800 下的工作台无页面级溢出、Supervisor composer、主要保存动作和 Dock 可见;共享/Tauri 定向用例锁定按钮名称、工具组/分隔符、pressed/expanded/disabled 和生成/失败/保存/取消非裁剪。真实 Vite 页面测得 window/document/body client 与 scroll 均为 1280×800;无登录会话时按既有安全合同停在登录门禁,不增加或使用测试绕过。
  • 本次只调整 UI 和测试/文档,未改变图片生成请求、登录态、泥点计费、钱包刷新、Host Port、Tauri command/event、草稿 CAS、manifest/revision、幂等恢复、Runtime、审批、资源投影或保存事务。
  • 2026-08-06 视觉复核进一步锁定保存区语义:素材名称保留用户编辑;create 的资源用途改为四项中文固定选择并默认普通游戏美术;refine 从源 manifest 继承并锁定 kind,避免普通用户直接编辑内部 assetKind slug。顶部工具与保存设置使用明确的纵向两层布局,保存设置在宽主视窗中以 620px 为最大宽度向中部延伸,在较窄中央区占满可用宽度;保存按钮不可压缩,窄容器独占整行,任一设置都不得越过中央主视窗右边界。保存字段标题必须完整显示,输入值与下拉选项使用和左侧画布动作接近的紧凑字号,字段列保留足够最小宽度,不能依靠省略标题换取空间;Supervisor 和普通聊天工作区状态把绝对路径收口为项目名称。

2026-08-11 Tauri 无限画布恢复与一致性收口

  • 当前产品只从现有资源进入非破坏性编辑,“新增资源”保持禁用。图片进入 refine 画布,其他现役类型进入统一派生编辑壳;所有成功路径都追加新文件、新 manifest asset 或新版本,源资源、源文件和原版本不覆盖、不删除、不重排。
  • 资源编辑账本把远端明确失败固化为 remote-failed,只保存稳定失败分类和终态时间;该状态不得再 POST 或轮询,只能由用户显式置为 archived 后移出活动恢复队列。归档不删账本、不伪装 committedresult-unknownreconciliation-required 不允许归档或换键重试。
  • 派生资产提交使用 game-creator-resource-edit-asset-transaction.v1 durable journal,绑定 operation/project/source、最终路径和媒体摘要、manifest before/after 及 base/target project revision,阶段固定为 prepared -> media-installed -> manifest-written -> revision-written -> committed。重启后只对可证明组合前向补齐;manifest 已 after 但 revision 仍为 base 时只补目标 revision,身份、摘要、重复 asset 或 revision 任一冲突则进入 reconciliation-required。ledger 只能在文件、manifest、revision 与 journal 全部回读一致后进入 committedcommitted 后若仍有 staging,只有在 staging 与 journal 摘要一致、正式媒体摘要一致,且 manifest 按 asset ID 或路径只能找到唯一一条并与 journal asset 精确相等时才尽力清理;删除 staging 的 I/O 失败不改变 durable committed 结果,任何身份或媒体漂移都保留 staging,并把 journal 与 ledger 转入对账。
  • 派生子版本 journal 同时冻结 project revision before/after 的完整身份与目标 after 记录。manifest 已存在目标子版本但 journal 缺失时不得据此补造提交证明;升级前 journal 缺少 revision 身份时,只有当前 revision 仍精确处于 base 才能补齐 before/after 身份,已经推进且无法证明由本事务写入时必须失败关闭并进入 reconciliation-required
  • 工作台顶部恢复入口只打开独立 modal,不在当前面板下追加列表。面板展示后端权威队列的全部 operation:可继续项可独立恢复,remote-failed 只能移出活动队列,reconciliation-required 只读展示对账。读取失败保留错误并允许重试,任一操作后重读权威队列;项目切换后的迟到结果必须丢弃。通用 ThemedModal 使用焦点陷阱:打开时移入 dialogTab / Shift+Tab 不得逸出;Escape 或背景关闭后归还原触发元素,无可聚焦子项时聚焦 dialog 本身。窄屏操作按钮改为纵向全宽布局。
  • 草稿应用统一经过单调 revision 门禁:generation progress、保存队列、生成/提交回包与延迟 loadDraft 只能推进当前 scope 的最高可信 revision;同 revision 只允许完整相等的幂等回包,低 revision 和旧 scope 一律丢弃。Tauri 指针与键盘 Shift 选择统一调用共享 resolveLayerPointerSelection;移动、缩放和背景平移只在首次真实变化时 capture 一次 history,零位移不增加 undo、documentVersion 或草稿保存。
  • canvas.failed 必须带 generation / draft-save / asset-commit / recovery / cancellation 五类稳定 operation。只有 generation 失败允许“返回修改/重新确认”;草稿保存或 CAS 冲突只提供重试保存/重新加载,资产提交和恢复只提供安全恢复/对账,取消故障只允许保留草稿继续编辑。初始恢复读取失败也归 recovery,不得显示生成重试动作。

2026-08-11 通用 Goal Contract 与动态 Acceptance Graph

2026-08-13 Windows 本地运行与恢复稳定性

  • Windows 原子文件事务在 rename 安装成功后必须立即释放临时文件句柄;恢复扫描遇到仍被活跃 writer 独占的临时文件时保留该文件并继续扫描已提交账本,不能让单个 ERROR_SHARING_VIOLATION / ERROR_LOCK_VIOLATION 阻断整个恢复。新建目录与安装关键 sidecar 后仍按既有平台能力同步文件和目录,不能把 Windows 目录 sync_all 失败误判为业务提交失败。

  • .agent/project.lockcreate_new 在 Windows 目标存在或处于 delete-pending 竞争时,可能返回 ACCESS_DENIED(5)、sharing violation(32) 或 lock violation(33),这些结果统一投影为“项目正在被其他写操作占用”并进入既有有界等待;其他权限错误继续失败关闭。Runtime 测试若在终态后立即二次恢复,必须同时等待 status/phase 终态和 Agent execution lane 释放,不能只观察 state JSON。

  • Windows 子进程启动把 npm.cmd 解析为当前 Node 与 npm-cli.js 的显式 argv,保留 CRLF/ANSI/ConPTY 处理和 Job Object 生命周期;项目验证使用隔离 Cargo target wrapper,避免开发 GUI 或旧 runner 持有测试需要替换的 EXE。Agent DB 打开继续允许同进程读写共享并修复唯一 JSONL 残尾,不能用默认独占句柄破坏并发读取。

  • 发布 GUI 内的 Codex CLI 可用性探测(包括候选版本检查和 app-server --help)必须与实际 Codex、MCP、Runner 和项目命令一样使用 CREATE_NO_WINDOW;读取对话或配置状态时即使连续探测多个候选,也不能创建或闪烁控制台窗口。

  • Node ESM 脚本必须用 fileURLToPath()import.meta.url 转为 Windows 本地路径,禁止直接把 URL pathname 交给 path.resolve();真实 agent-run smoke 的浏览器探测覆盖 Windows Chrome/Edge 固定安装位置。开发态 smoke 在旧安装版持有默认 AppData GUI owner 时使用独立 --config-dir,不得终止用户现有客户端。

  • 2026-08-12 计划拒绝恢复:结构化 runtime.plan_update 被 Runtime 拒绝后,下一轮 Provider 请求按请求级目录收窄到实际项目 mutation 与 respond_to_user(已进入协作编排的 Supervisor 保留 agent.delegate / agent.run_status),并明确禁止再次规划、读取、搜索或验证;后续已有真实 mutation observation 后解除临时目录,不改变持久 executable policy。

  • Goal Contract 绑定 project、可信根 Run Profile、source task SHA-256 和不可变 fingerprint;同一根 Run 只允许幂等重放完全相同的合同,语义变化必须进入新根 Run。已有合同的根 Supervisor 收到 steer 时,Runtime 必须按旧 rootRunId 串行化转换并在持锁后重验 Session 当前权威 Run,再取消并确认旧 rootRunId 的静态、ready、isolated 整棵树已进入终态或 needs-reconciliation;旧树未停稳时拒绝启动 replacement,停稳后才在同一 Session、source 和 Run Profile 创建唯一的新根 Run,不能把新增要求塞进旧合同继续完成。合同摘要作为 decision 投影到共享黑板,JSON sidecar 才是权威源;黑板冲突条目和专家事实仍追加保留。

  • 所有静态 delegate、ready child 和 isolated child 都只读继承根合同与当前 Acceptance Graphisolated child 还必须实际收到自己的 acceptanceCriteria / expectedArtifacts / writeScopes。继承上下文不扩大工具、目录、写入权限或 expectedArtifacts。专业 Agent 只能报告局部结果、证据和剩余风险,不能修改根合同、根验收图或宣布用户总目标完成。

  • Acceptance Graph 节点由 Supervisor 针对当前任务动态生成,不来自玩法模板。节点记录 required/optional、依赖、状态、证据引用与摘要;只有同一可信根 Supervisor 能调用 agent.acceptance_update,且该动作必须独占一轮。failed 与 not-observed 节点形成下一轮定向返工集合,未提交的 passed 节点保持不变。

  • 完成门在普通收束、finalization 和 prepared 恢复中统一消费 Acceptance Graph。任一 required 节点为 failed、not-observed 或缺失都会阻止最终回复;工具成功、计划 completed、文件存在、smoke 或 preview 单独通过均不代表用户目标完成。项目 revision 改变后,整张图先进入待 Supervisor 确认状态;Supervisor 只更新它判断为受影响的节点并确认 current revision,未提交的 passed 节点及其证据保持不变。requiredEvidence 必须命中 Runtime 明确允许的持久证据工具集合,拼错、控制面、纯协调工具和依赖动态 catalog 的 MCP 调用不能形成不可完成合同。动作回执记录执行边界的 projectRevisionBefore / projectRevisionAfter:非 mutation evidence 的 before、after 都必须等于验收时 current revisionmutation evidence 的 after 必须等于 current revision。旧 revision、跨 revision 只读结果或执行后延迟落账的回执都不能重放为 passed。

2026-08-17 UI Editor 项目资源 State 持久化

  • UI 编辑器复用现有 manifest kind: "UI"mediaType: "application/json" 资源,不增加平行 asset kind。资源文件固定为严格 game-creator-ui-design-state.v1 JSON envelopeprojectIdassetId、每资源 revision 和 Rust 唯一源 State;旧空对象、未知字段、身份错配、超限、无效内部引用和不安全相对路径均失败关闭。内部引用校验同时覆盖 Image.target_graphic -> sprite_assetsText.font -> font_assets,可选引用非空时必须命中同一 State 内已登记资源。
  • Tauri 专用 load/save command 只接受项目路径、期望项目 ID、manifest asset ID 和(保存时)资源 revisionRust 按 manifest 解析受控本地路径并在项目写锁内做 CAS。相同 State 返回 unchanged 且不推进 project revision;不同内容安装并回读一致后才推进 revision,后续推进失败返回 reconciliation-required,不伪装为完整保存。
  • UI State 原子安装保留最近一个可解析、canonical 的 .previous 恢复候选,作为最佳努力恢复来源;写入主文件前不把完整 State 语义校验重复执行一遍。主文件损坏时,恢复候选仍必须通过同一严格 schema、project/asset identity、revision、引用和 State 校验后才能安装;恢复安装与保存共用项目写锁,并在持锁后重新读取主文件,已有并发保存的有效新版本时直接返回而不安装旧副本。任一候选均不可信则停在加载错误,前端禁编辑和保存。新建 UI 资源先登记并安装合法 envelope,任一步失败补偿 manifest/文件,避免把空 JSON 留给资源卡。
  • 图片路径只需是安全项目相对路径,不要求外部图片仍存在或已登记为 manifest asset;缺失媒体只导致 preview 占位。imageOrder、当前选择、缩放、面板开关和 preview URL 不写入 State,加载后由 State 派生。保存冻结提交快照,保存期间的新编辑继续保持 dirty;AI state lock 和加载期间禁保存。

2026-08-18 UI Editor 新建节点组件状态

  • 所有非组件绑定流程创建的 UI Editor 节点,components_statuslayout_status 一致初始化为 NoProblem,覆盖前端新建页面根 / 人工节点,以及 Rust 结构识别与合并产生的节点。组件绑定命令仍只对 LLM 显式返回的节点写入其 NoProblemNeedReview 结果;未返回的节点状态不变。

2026-08-18 UI Editor 节点预览可见性

  • 节点显示 / 隐藏是编辑器页面级临时状态,不新增 Rust Node 字段,不进入 UI State 保存快照、运行时数据或后端契约。NodeId 在 State 内全局唯一,隐藏状态直接使用页面会话级 Set<NodeId>;切换界面图保留,跨界面移动随节点保留,清空、重新加载、删除节点或删除界面图时清理失效 ID。
  • 同一可见性状态同时作用于 编辑叠加最终预览。隐藏节点会截断整个子树,移除节点组件、编辑边框、名称、缩放控制点和画布命中区域;参考图和预览画布本身保持存在。父节点恢复时,子节点此前独立设置的隐藏状态保持不变,根节点不享受特殊限制,也允许隐藏。
  • UI Tree 行提供 Eye / EyeOff 按钮,按钮只切换状态、不改变选择;节点 Inspector 提供“在预览中显示”复选框,两者共享页面控制器状态。隐藏节点仍可通过 UI Tree 选择并在 Inspector 中编辑,但不会重新出现在画布上,直到恢复显示。

2026-08-13 普通 Web 工作台无人值守生成可靠性收口

  • 入口覆盖:本节取代本文更早“普通 GUI autonomous 继续固定完整 DAG”的现行含义。项目首页进入的普通 Web 工作台必须显式使用 single-supervisor 编排,提交映射为 project-supervisor-game-chat + autonomous-game-build;持久化 Supervisor 决策前零 child,决策后只启动唯一 code-prototype 主 Run,美术仅在该 Run 完成 asset.list 并形成可证实缺口后一次委派一个受限 child。独立 game-chat 入口沿用相同规则。显式 professional-dag 与 CLI 专业 autonomous 验收继续使用 project-supervisor-gui|cli + autonomous-game-build 的原有完整 DAGSupervisor 调试与 Godot 继续 project-supervisor-gui + standard,不得被普通入口默认值误改。
  • 普通界面single-supervisor 工作台不展示固定专业 DAG、子 Agent Dock 或“严格审批”,只显示总控对话、生成状态与“自动执行”。这只是产品投影收敛,不删除开发诊断入口,也不放宽权限;项目外写入、任意 shell、发布、凭据、系统设置和未知外部副作用继续失败关闭。
  • 无人介入语义:可信 game-chat autonomous 根链路及其绑定 child 不得停在普通 waiting-for-confirmationwaiting-for-user-input。child 的信息不足交付在严格身份校验后转为同一父链可执行的安全默认返工,问题正文与公开问题指纹清除,内部只保留不公开的 SHA-256 幂等 markerstandard、GUI/CLI 调试和非可信绑定继续保留人工澄清。可信 code-prototype 主 Run 可以且只能认领 task/session/run/binding/delegation 身份全部匹配的直属美术 delivery:存在 ready 回执时由 Runtime 确定性执行 agent.run_status(scope=self)claim 尚未完整 Observed 时禁止请求 Provider;普通失败或 marker 不完整时认领后立即失败,合法 game-chat-safe-default-repair.v1 marker 则由 Runtime 直接生成唯一一层、同目标、同合同 agent.delegaterepairRequired 状态下的重复 route/read/query 被 liveness 门拒绝。父 task 或 binding 链丢失且仍有活跃 delivery 时完成门必须 blocked;只有 suppressed 记录不再参与 capability、claim 和 completion barrier。可恢复失败必须回到同一 code-prototype Run,不能要求用户发送“继续”,也不能在已知不可修复或返工已确定后继续消耗 Provider 轮次。
  • 验证反馈与完成门game.static_smoke 先校验 <script> 闭合和全部可执行内联 JavaScript 语法,再检查 Canvas、输入、状态、胜负与重开合同。失败回执的公共投影只包含 commandId/passed/failureCode/check/path=game/index.html;同一 owner 可额外读取经脱敏、有界的 diagnostic,以执行“诊断 → mutation → 当前 revision static smoke → desktop/mobile preview.validate”循环。根 Run 只有在正式 artifact、manifest、当前 revision 静态凭证和双视口试玩一致时才能唯一 completed;同 revision 同失败且无新 mutation 必须命中停滞门,不能无限猜测。
  • Runner 接管:新 boot 取得跨 boot execution-owner 后必须在释放 owner-map 锁后幂等触发既有 durable recovery scan。纯 Provider、项目内文件和验证动作按 checkpoint 续跑;结果未知的进程、付费生成或其它外部副作用进入 needs-reconciliation,禁止盲目重放。重复 hydration/read 或同 boot claim 不得重复 child、消息、action 或付费请求。
  • 验收层级:确定性 loopback E2E 必须覆盖普通入口路由、唯一 code-prototype、首次语法 smoke 失败、同 Run 取得结构化诊断并修改、当前 revision 静态与桌面/移动试玩通过、根 Run 唯一 completed、确认/追问为零。该结果只证明 Runtime 控制面;使用真实 Provider 的空项目单输入 smoke 全程无人介入成功后,才能宣称现场目标完成。
  • 真实 Provider 开发验收入口--game-chat-smoke 是受限 CLI 标记,只允许与默认 project-supervisor--swarm-chat --autonomous-game-build 组合,将新根 Run 绑定为 project-supervisor-game-chat,不作为产品 UI、公开 API 或通用 source 覆盖能力。现有 playable harness 通过 npm run ai-game-creator-shell:agent-runtime:supervisor-game-chat-single-main-playable-real-e2e 显式启动该模式,启动前同时校验 project-supervisorcode-prototype 的 Provider 配置,并在隔离 AppData 中验收唯一单主 child、当前 revision 的 static smoke 及 desktop/mobile 试玩回执。只有显式执行这条真实 E2E 命令才会发起 Provider 请求;普通 self-test 不读取凭据、不调用 Provider。现场 smoke 若在配置门因缺少 API Key 阻断,必须报告 providerUsed=false,只能证明入口、验收逻辑与无 Provider 自测已落地,不能宣称真实现场验收完成。
  • fresh-init 取证边界supervisor-game-chat-single-main-playable 不再预写 package.jsonverify-e2e.mjsgame/index.html,由正式 --init 生成生产 DEFAULT_GAME_INDEX_HTML。self-test 必须逐字节核对 harness 中的 canonical 默认入口与 Rust 生产常量,并证明空项目仍保留 Git、AGENTS.md、隔离 evidence 和敏感诱饵基线;真实报告必须同时证明初始 SHA-256 命中生产默认入口、根下唯一固定 child 为 code-prototype、最终入口已变化、static-smoke SHA-256 绑定最终入口且 desktop/mobile 各自通过。
  • 不外推范围:上述真实 Provider 命令只验收普通 Web 工作台所采用的 project-supervisor-game-chat + autonomous-game-build 单 Supervisor 链。显式 professional-dag 与固定 16 节点 CLI/GUI 链的 owner-artifact verify、产物所有权和 path-scope 仍是独立未解决项;seeded deterministic E2E、普通 self-test 或本 game-chat 报告都不得冒充该链已修复或已完成真实验收。