移除GameAgent宿主运行时间上限
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust crates (pull_request) Has been cancelled
Project CI / Backend tests (pull_request) Has been cancelled
Project CI / Native shell tests (pull_request) Has been cancelled
Project CI / Frontend tests (pull_request) Has been cancelled
Project CI / Repository checks (pull_request) Has been cancelled
Project CI / AI game creator shell web tests (pull_request) Has been cancelled

删除累计执行与整轮墙钟限制、配置字段及专属计时任务
迁移旧配置与执行账本,保留原回合身份、用时和终态
保留Codex与Claude独立超时、取消、进程清理和交付复核
补充长回合、配置恢复与账本迁移回归并更新提示词和规范
记录257项定向测试及类型检查结果和未验证平台边界
This commit is contained in:
2026-10-06 10:06:37 +01:00
parent f33b7be0ca
commit e8c6846689
16 changed files with 429 additions and 281 deletions
@@ -3,7 +3,7 @@
| 字段 | 值 |
| --- | --- |
| Milestone | [移除GameAgent宿主运行时间上限](./【里程碑】移除GameAgent宿主运行时间上限-2026-10-06.md) |
| Status | proposed,待评审后实施 |
| Status | implemented,自动化通过,待运行时验收 |
| Owner | 当前任务 Agent |
| Date | 2026-10-06 |
@@ -36,7 +36,7 @@
## 实现顺序
1. 先列出所有 tick、期限检查、Exhausted 生产者与消费者。区分时间耗尽、交付复核次数耗尽和历史终态,不能整体删除 Exhausted。核对计时字段在统计/日志中的读取者,保留有现役用途的用时。
2. 收敛配置:正式结构只保留 maxRuns;仅在现有持久化加载边界识别并删除 maxExecutionSeconds/maxTurnSeconds,校验后安全写回当前格式,之后正常加载无需转换。不保留 deprecated 字段、serde 别名、默认值或关闭开关,不开放任意未知字段兼容;写回失败报告真实错误,不标记迁移成功或覆盖其它配置。
2. 收敛配置:正式结构只保留 maxRuns;仅在现有持久化加载边界识别并删除 maxExecutionSeconds/maxTurnSeconds,校验后在 App 管理的配置目录安全写回当前格式,之后正常加载无需转换;仓库旁的共享只读配置仅在加载边界转换,不自动改写源文件。不保留 deprecated 字段、serde 别名、默认值或关闭开关,不开放任意未知字段兼容;写回失败报告真实错误,不标记迁移成功或覆盖其它配置。
3. 执行账本升为 `agc-direct-execution.v4`:对已发布 v1/v2/v3 在加载边界白名单移除 maxExecutionMs/maxTurnMs,延续原有必要的旧合同迁移,保留用时与归属事实;校验与取得归属后安全持久化 v4。新 v4 类型无这两个字段且拒绝未知字段;历史终态及报告不改,旧活动操作继续执行原恢复检查。更新早期项目侧账本的提示原因,不将缺少可信归属的历史记录提升为执行权限。迁移只做数据转换,不调用旧预算逻辑;不再支持这些旧升级来源时删除转换与专属测试。
4. 删除宿主时间超限终态与仅服务该上限的周期任务/时钟回退期限检查;删除失去职责的 tick 方法及全部调用,不保留返回成功的空壳。逐调用点保留阶段、取消、操作身份与锁内检查,尤其是 begin_paid_dispatch、写入取得锁后和 begin_sealing;不删除整个执行适配器 watchdog。移除仅供预算使用且已无统计消费方的时钟状态与辅助方法。
5. 同步验证/交付回执、配置类型和文案;保留 usedExecutionMs 等已用时事实。缓存与历史回执若含旧上限,只作为历史字段读取,不据此重新启用限制或改写证据哈希。
@@ -59,7 +59,7 @@
cargo test --locked --manifest-path apps/ai-game-creator-shell/src-tauri/Cargo.toml direct_execution -- --test-threads=1
cargo test --locked --manifest-path apps/ai-game-creator-shell/src-tauri/Cargo.toml direct_delivery -- --test-threads=1
cargo test --locked --manifest-path apps/ai-game-creator-shell/src-tauri/Cargo.toml direct_validation -- --test-threads=1
cargo test --locked --manifest-path apps/ai-game-creator-shell/src-tauri/Cargo.toml config::tests -- --test-threads=1
cargo test --locked --manifest-path apps/ai-game-creator-shell/src-tauri/Cargo.toml config:: -- --test-threads=1
cargo test --locked --manifest-path apps/ai-game-creator-shell/src-tauri/Cargo.toml codex_app_server -- --test-threads=1
cargo test --locked --manifest-path apps/ai-game-creator-shell/src-tauri/Cargo.toml claude_code_cli -- --test-threads=1
npm run agc:typecheck
@@ -75,4 +75,27 @@ git diff --check
- 移除预算后,长任务由用户停止、Provider/工具独立超时及现有交付控制收束;不承诺模型一定在固定总时长内完成。
- 迁移不得在旧执行器仍持有归属锁时写入;不允许删除旧账本来消除状态或复核限制。
- v4 写入后旧程序不能假定可直接读取。回滚必须先停止活动执行器并保留完整宿主状态;采用向前修复,或在核对身份与操作状态后恢复升级前备份,不能简单降级包体或重开失败回合。
- 本次交付仅文档与分支,未修改运行时、未迁移真实用户数据;代码测试和 smoke 留待实现后执行。
- 已实施运行时与数据加载迁移,验证使用隔离临时配置和项目,未迁移真实用户数据。真实模型、手动 GUI 与 Windows 专项结果不由本地协议夹具代替。
## 实施结果与验收证据(2026-10-06)
已删除两个正式配置字段、账本上限字段、宿主 250ms 期限 watchdog、tick/tick_locked 及调用、专属墙钟状态和超限报告;执行适配器的取消/断连/交付收束 watchdog 保留。用时统计、交付复核、原回合写入/付费许可和退出证明继续有效。旧字段名仅出现在必要迁移及迁移测试中。
| 条款 | 验证 | 结果 |
| --- | --- | --- |
| 超过旧上限仍可执行与正常结束 | `direct_execution` 定向组:无合同完成、并发执行统计、长时间写入/付费后取消、同回合恢复 | 37 passed |
| 合同复核与真实证据 | `direct_delivery` 定向组 | 12 passed |
| 验证缓存与回执 | `direct_validation` 定向组 | 9 passed |
| 配置迁移与恢复 | `config::` 定向组:迁移落盘、重复读取、只读源、备份恢复、未知字段及写入失败 | 18 passed |
| 独立 Codex 超时、关闭与进程退出 | `codex_app_server` 定向组;包括一小时旧回合及累计执行 2000 秒的协议夹具,分别正常回复及合同交付 | 144 passed,4 个既有 ignored |
| Claude 独立执行行为 | `claude_code_cli` 定向组 | 13 passed |
| 提示词边界与编译 | `--test prompt_source_boundaries --test runtime_prompt_bundle_build` | 6 + 18 passed |
| 前端配置类型 | `npm run agc:typecheck` | PASS |
| 文档、编码与空白 | `npm run check:doc-index`、`npm run check:encoding`、`git diff --check` | PASS |
| 格式 | `cargo fmt --manifest-path apps/ai-game-creator-shell/src-tauri/Cargo.toml -- --check` | PASS |
Rust 定向命令在上述 manifest 下加 `--bin genarrative-ai-game-creator-shell`,均使用 `--locked` 和 `--test-threads=1`。配置与 Codex 的网络夹具先因沙箱禁止 loopback bind 失败,开放本地网络后通过。首次配置迁移测试对既有原子写入器的备份保留行为作了错误假设,修正为重复读取不写回和实际恢复来源保留检查后通过。
未验证:真实付费/模型请求、手动 GUI/CLI 操作、Windows Job 专项及真实连续运行超过 30 分钟。长时间边界通过修改测试私有账本与操作开始时刻验证,无产品测试开关。Codex 的 4 个既有 ignored 涉及真实捆绑目录、OAuth、子进程辅助夹具与需要认证的模型 smoke;不算新增通过证据。旧记录迁移由数据加载触发,本次只操作临时测试数据。
主规范与共享决策已同步;当前只有这一个里程碑,不推进其它工作。运行时验收后删除临时里程碑与实施计划,持久验证边界保留在主规范。
@@ -3,9 +3,9 @@
| 字段 | 值 |
| --- | --- |
| Version | 1.1 |
| Status | proposed |
| Status | implemented,自动化通过,待运行时验收 |
| Date | 2026-10-06 |
| Parent Spec | [AGC 实施计划:宿主运行时间上限移除](../../technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md#direct-宿主运行时间上限移除2026-10-06待实现) |
| Parent Spec | [AGC 实施计划:宿主运行时间上限移除](../../technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md#direct-宿主运行时间上限移除2026-10-06) |
## 目标与范围
@@ -25,18 +25,19 @@ Codex 15/110 分钟静默与 120 分钟硬上限、Claude 静默与 45 分钟硬
## 验收标准
- [ ] 无合同及有合同回合越过旧累计 900 秒、墙钟 1800 秒后,均不因时间进入终态;仍可开始合法操作与正常收尾。
- [ ] 内部重试、交付返修和重启读取旧状态不会恢复旧时间上限;旧终态不重开,遗留操作不自动重放。
- [ ] 新配置及状态响应无退役上限字段;旧配置可加载并清理退役字段,未知字段保持既有校验。
- [ ] 两项上限的字段、默认值、执行判断、专属定时任务、空壳方法与失效测试/说明全部删除;旧字段名只允许出现在必要的持久化迁移及其测试中,迁移后不再重复转换。
- [ ] 已用执行时间和回合耗时保持可观测,不虚构剩余预算。
- [ ] 用户取消、断连、Provider 超时、并发容量、回合归属、迟到写入和付费提交门禁仍有效,清理完成需要真实退出证明。
- [ ] 合同完成仍要求可信视觉/玩法证据,复核次数限制不变;无合同回复正常完成。
- [ ] Codex 与 Claude 的独立超时回归通过;GUI/CLI 共享入口及平台验证边界有明确证据。
- [x] 无合同及有合同回合越过旧累计 900 秒、墙钟 1800 秒后,均不因时间进入终态;仍可开始合法操作与正常收尾。
- [x] 内部重试、交付返修和重启读取旧状态不会恢复旧时间上限;旧终态不重开,遗留操作不自动重放。
- [x] 新配置及状态响应无退役上限字段;旧配置可加载并清理退役字段,未知字段保持既有校验。
- [x] 两项上限的字段、默认值、执行判断、专属定时任务、空壳方法与失效测试/说明全部删除;旧字段名只允许出现在必要的持久化迁移及其测试中,迁移后不再重复转换。
- [x] 已用执行时间和回合耗时保持可观测,不虚构剩余预算。
- [x] 用户取消、断连、Provider 超时、并发容量、回合归属、迟到写入和付费提交门禁仍有效,清理完成需要真实退出证明。
- [x] 合同完成仍要求可信视觉/玩法证据,复核次数限制不变;无合同回复正常完成。
- [x] Codex 与 Claude 的独立超时回归通过;Linux 共享执行适配器的协议夹具通过。
- [ ] 真实模型 GUI/CLI smoke、停止按钮操作及 Windows Job 专项验证(当前未执行,不以 Linux 协议夹具替代)。
## 证据要求
- 自动化:模拟越界、取消/清理、合同与无合同收尾、旧配置及各受支持账本版本迁移、Provider 超时回归。
- 运行时:至少一次本地协议夹具经生产入口完成长时间边界模拟,并验证停止按钮或 CLI 取消;真实模型 smoke 单独记录,不用夹具冒充。
- 边界:旧失败报告保留、损坏状态拒绝、未知字段拒绝、未结算操作恢复与远端付费不确定性。
- 当前状态:仅计划,以上运行时行为均未实施或验收。
- 当前状态:代码已实施;自动化与 Linux 协议夹具结果见实施计划的证据矩阵。保留本文件至运行时验收完成。
@@ -9805,7 +9805,7 @@ CI 上 `background_agent_runtime_recovers_stale_running_before_pending_task` 在
## 2026-10-04:Direct 普通操作与交付复核解耦
- 普通工具准入只检查原回合活动状态、时间预算、并发和既有权限,不要求先登记交付合同;成功/失败/取消只结算本次操作,删除全局 Draining 与执行/返修批次计数。
- 普通工具准入只检查原回合活动状态、并发和既有权限,不要求先登记交付合同;成功/失败/取消只结算本次操作,删除全局 Draining 与执行/返修批次计数。
- 验证失败和源码漂移影响对应证据,不阻断无关工作。远端不确定结果沿资源自身 operation/幂等记录核对;本地执行器失控或持久状态损坏仍结束回合。
- 保留累计执行时间、整轮墙钟、原生执行前审批、关闭时清理与原回合写入/付费提交检查。模型执行结束时先关闭准入,确认清理后才允许交付反馈继续;普通失败不进入关闭阶段。
- `validation.maxRuns` 只保留交付回复复核用途;合同的创建与两类要求简化见下条决策,视觉/玩法判据保持原样。图片工具仍等待结果,Codex 调度不变。
@@ -9831,7 +9831,7 @@ CI 上 `background_agent_runtime_recovers_stale_running_before_pending_task` 在
- 回合收尾和合同完成使用平台可证明的受控归属退役:Windows 为自有 Job,Unix 为受控进程组。进程组成功退出不再被完整子树标志误判为中断,但不宣称逃逸后代已退出;缺失或失败的清理仍阻止完成。
- Linux 排除僵尸时必须保守处理不完整扫描;数字 PID 的读取/解析不确定性不能成为组已空的证据,已确认消失的 PID 可以忽略。
- 正常关闭连接的迟到通知不创建或覆盖成功回合的终态报告;无合同收尾新产生的预算报告优先返回,其他真实关闭错误保留。
- 权威边界见[Direct 合同规则](../../technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md#宿主验收与执行许可合同)。视觉/玩法判据和预算值不变。
- 权威边界见[Direct 合同规则](../../technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md#宿主验收与执行许可合同)。视觉/玩法判据不变;宿主时间上限已由 2026-10-06 决策移除。
## 2026-10-05:AGC 标题栏项目标签评审后续(空态、视图门控与文案)
@@ -9842,3 +9842,10 @@ CI 上 `background_agent_runtime_recovers_stale_running_before_pending_task` 在
- 仍有意不做:后台项目在菜单里是目录名;判定 `aria-current` 的路径匹配仍是 `projectPathsMatchForInvalidation`;不改 Rust、快照命令字段、公共 API 与持久化。
- 验证方式:`npx vitest run apps/ai-game-creator-shell/tests/directActiveTurns.test.tsx apps/ai-game-creator-shell/tests/WindowChrome.test.tsx apps/ai-game-creator-shell/tests/workspaceWindowSync.test.tsx` → 25 passed;对照旧实现分别临时禁用 `launcherView` 门控、去掉面板空态守卫,对应用例各自转红。真机运行时证据仍缺,见里程碑文末「仍未取得证据」。
- 关联:issue #618、本文件上一条(2026-10-04 标题栏项目标签)、`docs/project-memory/plans/【里程碑】Direct回合跨页面生命周期与运行中项目可见性-2026-09-15.md`(2026-10-05 修订)。
## 2026-10-06:Direct 移除宿主运行时间上限
- 删除累计执行与整轮墙钟上限、对应配置和专属计时任务,旧预算规则不再作为现行约束。用时统计仍用于观测。
- Codex 15/110 分钟事件静默与 120 分钟硬上限、Claude 独立超时保持不变;取消、回合归属、并发、交付复核次数与进程退出证明继续有效。
- 正式执行账本为 v4,旧上限只在已发布数据的加载迁移边界识别;不保留旧运行时路径。App 管理配置安全写回,共享只读配置不改源文件;旧终态与报告不重开。
- 权威行为与验证边界见 [AGC 主规范](../../technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md#direct-宿主运行时间上限移除2026-10-06)。
@@ -106,7 +106,7 @@ UI 编辑器的“分析参考图”步骤、Rust 命令 `suggest_ui_design_sema
## 2026-09-23 Direct 宿主继续请求输入修复
- 首次模型请求使用原始结构化用户输入,保留 Skill 提及及其它引用;未提供结构化输入时沿用请求正文与图片转换。
- 验收反馈和可修复错误触发的后续模型请求,显式标记为宿主继续,只发送本次反馈正文,不再用原始用户条目覆盖。GUI 与 CLI 共用这一规则,验收条件、重试上限和执行预算保持不变。
- 验收反馈和可修复错误触发的后续模型请求,显式标记为宿主继续,只发送本次反馈正文,不再用原始用户条目覆盖。GUI 与 CLI 共用这一规则,验收条件、重试上限和操作归属保持不变。
- 原始用户条目仍用于历史持久化和回合事件关联,沿用同一 clientTurnId/itemId;反馈不是新的用户输入。不要通过丢弃原始条目来修复发送内容。
- 定向回归检查首次结构化输入、验收继续和错误继续的实际 wire input,以及同一用户条目的历史去重。
@@ -127,14 +127,14 @@ UI 编辑器的“分析参考图”步骤、Rust 命令 `suggest_ui_design_sema
## 2026-09-20 DirectProject 七项效率闭环(补齐合同)
本节补齐并覆盖下节中仅靠 Skill 要求预检、收尾、批读和原生命令预算的部分。完整目标仍为:自动预检、宿主验收与收尾、分层验证、统一时间预算、稳定测试基线、请求耗时与批量读取、所有工具并行。已有代码及测试不等于全部目标已完成;按下表逐项验收。
本节补齐并覆盖下节中仅靠 Skill 要求预检、收尾、批读和原生命令预算的部分。完整目标仍为:自动预检、宿主验收与收尾、分层验证、统一操作控制、稳定测试基线、请求耗时与批量读取、所有工具并行。已有代码及测试不等于全部目标已完成;按下表逐项验收。
| 要求 | 必须成立的行为 | 完成证据 |
| --- | --- | --- |
| 自动预检 | 新建 Web 游戏由实际用户入口和宿主自动执行,不依赖模型主动调用;失败不得启动正式生成或付费素材 | 首页/后端正反用例、真实构建与双端截图 |
| 验收与收尾 | 必需范围和验收项在宿主持久化;证据绑定当前输入;模型正常响应结束后复核,通过后关闭本轮新的修改/执行/付费扩项并产生交付报告 | 真实工具链状态转移、重启/并发/新增扩项拒绝用例 |
| 分层验证 | 视觉、定点玩法、项目测试和必要完整闭环按已登记标准执行;不混淆证明范围 | 双端正例与单端失败反例 |
| 统一预算 | 内置验证、托管脚本和原生命令执行受同一宿主预算约束;不以命令文本猜测“是不是试玩”,不把每条普通开发命令单独计为一次返修 | 捆绑 app-server 的执行前控制、拒绝无副作用、跨入口/重启/耗尽/超时用例 |
| 统一预算 | 内置验证、托管脚本和原生命令执行受同一宿主操作控制约束;不以命令文本猜测“是不是试玩”,不把每条普通开发命令单独计为一次返修 | 捆绑 app-server 的执行前控制、拒绝无副作用、跨入口/重启/取消/超时用例 |
| 稳定基线 | 可复用的固定种子跑酷基线,真实短按/长按跳跃、单次收力、滑铲释放及公平越障窗口 | 物理单测、双端真实输入、原案例缺陷参数反例 |
| 速度可归因 | 实际并行批读与宿主首轮上下文预取按真实调用验证;界面耗时与模型使用记录各守其证明范围,旧请求分段计时链不算生产能力 | 有界读取/并发屏障/安全边界/减少独立读取往返证据 |
| 工具并行 | 现有全部工具并行、在途上限、同资源事务和付费防重继续有效 | 混合调用、图片双 POST 同时到达、同参防重回归 |
@@ -166,14 +166,14 @@ UI 编辑器的“分析参考图”步骤、Rust 命令 `suggest_ui_design_sema
### 宿主控制与后续验收边界
- 执行预算按工具占用累计时间和回合墙钟管理,不设置执行/返修批次或按普通失败扣减次数。任意代码执行必须具备当前回合的有效执行许可及累计执行时长边界。
- 工具占用累计时间与回合耗时仅用于观测,不设置宿主时间上限、执行/返修批次或按普通失败扣减次数。任意代码执行必须具备当前回合的有效执行许可。
- 原生命令入口必须以捆绑版本的真实协议证明可在执行前拒绝;不得用执行后的日志通知或文本分类器冒充执行门。能力检测失败不得静默退回无控制模式。
- 原生执行控制的精确协议与许可持久化,在对应里程碑评审后落地;不得提前宣布这一项已完成。
- 不修改 Provider 的 maxRetries;不减少引擎或任意代码执行的合法能力,不引入平行 Agent 框架,不改公开 API/数据库,不提交私密运行记录。
### Direct 宿主运行时间上限移除(2026-10-06,待实现)
### Direct 宿主运行时间上限移除(2026-10-06)
本节记录已明确的需求与待评审实现合同,当前代码仍执行下文的时间预算。实现并验收后,本节覆盖下文关于宿主累计执行时间、整轮墙钟上限及其耗尽行为的要求,并同步融合旧表述。活动文件:[里程碑](../project-memory/plans/【里程碑】移除GameAgent宿主运行时间上限-2026-10-06.md)、[实施计划](../project-memory/plans/【实施计划】移除GameAgent宿主运行时间上限-2026-10-06.md)。
本节是 Direct 宿主运行时间与独立 Provider 超时的现行合同。活动文件:[里程碑](../project-memory/plans/【里程碑】移除GameAgent宿主运行时间上限-2026-10-06.md)、[实施计划](../project-memory/plans/【实施计划】移除GameAgent宿主运行时间上限-2026-10-06.md)。
- 目标:GameAgent 的 Direct 回合不再因累计工具执行达到 900 秒或回合墙钟达到 1800 秒而停止。删除这两项宿主限制及其可配置入口,不用零值、极大值或新开关模拟移除;无合同、已登记合同、内部返修与重试均遵循同一规则。
- 保持独立超时:Codex 无活动 MCP 时的 15 分钟事件静默、存在活动 MCP 时的 110 分钟事件静默、单次模型调用的 120 分钟硬上限,以及它们与 requestTimeoutMs 的取大规则不变;Claude 静默与 45 分钟硬上限、单工具/RPC/网络/进程清理超时不变。完成回合后等待用户不适用这些运行中超时。
@@ -181,28 +181,30 @@ UI 编辑器的“分析参考图”步骤、Rust 命令 `suggest_ui_design_sema
- 交付合同与视觉/玩法证据判据不变,validation.maxRuns 继续只限制交付复核次数。正常响应结束后才能启动交付封口;缺失证据或退出证明仍不能判定完成,真实失败保持原原因。
- 保留已用执行时长及回合时间的可观测信息,但不能再据此拒绝操作、取消执行或产生时间耗尽报告。新状态回执不再公开 maxExecutionMs 或虚假的剩余时间;历史回执按原记录展示。
- 清理要求:彻底删除两项限制的运行时代码、配置字段、默认值、校验、专属定时任务、错误分支及失效测试/说明;不保留 deprecated 字段、禁用开关、空壳 tick 或新旧执行双路径。时间统计只有仍被现役观测消费时才保留。
- 数据迁移:仅在持久化加载边界将旧配置与旧账本转成当前格式;从配置删除 maxExecutionSeconds/maxTurnSeconds,从账本删除 maxExecutionMs/maxTurnMs,校验后安全落盘,每份记录成功迁移后不再转换。正式配置类型、执行账本类型及运行时不认识这些旧上限;其它未知字段继续严格校验。保留回合身份、用时、合同、证据、操作、复核计数和退出事实;旧 Completed/Interrupted/Exhausted 终态与报告不重开或覆盖。旧活动状态仍按归属与恢复规则处理,更早项目侧账本不能升级为可信宿主权限或证据。迁移只保留支持已发布存量数据所必需的字段识别与测试,退出条件为不再支持含这些字段的升级来源,届时同步删除迁移与专属测试,不保留永久兼容层。
- 数据迁移:仅在持久化加载边界将旧配置与旧账本转成当前格式;从配置删除 maxExecutionSeconds/maxTurnSeconds,从账本删除 maxExecutionMs/maxTurnMs,校验后安全落盘,每份记录成功迁移后不再转换。仓库旁共享配置属于只读输入,仅在加载边界转换,不自动改写源文件。正式配置类型、执行账本类型及运行时不认识这些旧上限;其它未知字段继续严格校验。保留回合身份、用时、合同、证据、操作、复核计数和退出事实;旧 Completed/Interrupted/Exhausted 终态与报告不重开或覆盖。旧活动状态仍按归属与恢复规则处理,更早项目侧账本不能升级为可信宿主权限或证据。迁移只保留支持已发布存量数据所必需的字段识别与测试,退出条件为不再支持含这些字段的升级来源,届时同步删除迁移与专属测试,不保留永久兼容层。
- 非目标:不承诺无限运行,不调整 Provider 重试、工具调度、付费额度、资源幂等、外部 MCP、公开 API 或数据库;不恢复已因旧预算结束的回合。
- 验收:用受控时间或已用时夹具越过两条旧边界后,回合仍可正常执行、写入、登记合同和结束;同时验证取消、真实 Provider 超时、断连、交付复核失败、迁移及退出证明仍有效。GUI/CLI 共用入口及 Codex/Claude 的共享宿主状态均纳入边界核对,真实平台 smoke 与模拟时间证据分别记录。
实现验证(2026-10-06):执行状态、交付、验证、配置、Codex 与 Claude 定向回归及提示词测试通过;Linux Codex 协议夹具覆盖一小时旧回合、累计执行超过旧上限后的正常回复与合同交付,取消/进程清理回归通过。前端类型、编码及文档检查通过。真实模型 GUI/CLI、Windows Job 与实际持续 30 分钟以上的端到端运行未验证;模拟时间与协议夹具不替代这些证据。
### Direct 操作控制(2026-10-04)
本节与下节共同描述当前 Direct 操作控制,执行/返修批次与全局 Draining 已移除。操作控制不改变 Codex 的工具调度、模型循环或图片工具的等待返回方式。
- 普通操作开始前,宿主检查原回合是否活动、时间预算是否足够、并发容量是否可用,并执行原有权限、路径及资源约束。交付合同是否存在、前一个工具是否成功不构成普通操作的准入条件。
- 普通操作开始前,宿主检查原回合是否活动、并发容量是否可用,并执行原有权限、路径及资源约束。交付合同是否存在、前一个工具是否成功不构成普通操作的准入条件。
- 操作成功、失败或取消后结算占用与用时,返回真实结果,由 Agent 决定后续操作。没有全局 Draining、执行/返修批次计数及对应重试门禁;验证输入变化只使相关证据失效,不使无关工作停顿。不新增租约到期续租、Agent 释放租约或独立后台任务接口。
- 保留原时间预算数值与累计口径、并发上限及回合身份。回合关闭、取消或时间耗尽后拒绝新操作,取消自有在途工作并核实本地进程退出;等待资源锁后的写入及每次新增付费提交仍核验原回合权限。操作记录清除不能代替执行结束证明。
- 保留用时统计、并发上限及回合身份。回合关闭、取消或异常中断后拒绝新操作,取消自有在途工作并核实本地进程退出;等待资源锁后的写入及每次新增付费提交仍核验原回合权限。操作记录清除不能代替执行结束证明。
- 普通工具失败和资源级结果不确定不终止整个回合;资源自身的幂等、operation ID、恢复及对账继续有效,不能因客户端取消而推断远端取消,也不能盲目重复付费。宿主控制状态损坏或无法确认自有执行器退出仍按实际控制失败处理。
- 交付复核与操作准入分离。合同由 Agent 按用户制作/交付游戏的意图登记,验收仅在正常响应结束后启动,当前只保留视觉/玩法要求。`validation.maxRuns` 暂保留现有交付复核次数用途,不再用于执行/返修批次;时间配置不变。
- 同回合重试或进程重启不刷新预算;仅保留预算、回合归属、必要退出记录和资源自身恢复所需的持久状态,不恢复旧租约为可执行权限。旧版本未结束状态须先确认旧执行器退出,不能通过直接删除账本解除控制。
- 交付复核与操作准入分离。合同由 Agent 按用户制作/交付游戏的意图登记,验收仅在正常响应结束后启动,当前只保留视觉/玩法要求。`validation.maxRuns` 暂保留现有交付复核次数用途,不再用于执行/返修批次;不提供宿主时间上限配置。
- 同回合重试或进程重启不重置复核计数和用时统计;仅保留复核计数、用时、回合归属、必要退出记录和资源自身恢复所需的持久状态,不恢复旧租约为可执行权限。旧版本未结束状态须先确认旧执行器退出,不能通过直接删除账本解除控制。
验收至少覆盖失败图片与长命令并存时无关写入成功、连续工具失败不触发返修次数限制、所有退出路径释放并发占用、关闭后零新增执行/付费提交、迟到写入被拒绝,以及远端不确定任务不重复提交。Linux 进程组清理不冒充 Windows Job 的完整子树退出证明。
验证边界:Linux 定向回归已覆盖操作准入、合同复核与恢复、实际子进程退出、无合同及 ready 合同完整回复、进程扫描不确定性、迟到关闭通知与收尾预算报告。用户已确认手动 GUI 检查完成。未提供 Windows Job 完整子树退出及 Windows 捆绑补丁专项结果,也未以真实模型多语言意图或付费 Provider 场景替代协议夹具;这些边界不因合入或清理临时计划而视为已验证。后续目标平台验证沿用现有测试与本规范。
验证边界:Linux 定向回归已覆盖操作准入、合同复核与恢复、实际子进程退出、无合同及 ready 合同完整回复、进程扫描不确定性、迟到关闭通知与真实终态报告。2026-10-05 合同重构的手动 GUI 检查已由用户确认;该确认不覆盖 2026-10-06 时间上限移除。未提供 Windows Job 完整子树退出及 Windows 捆绑补丁专项结果,也未以真实模型多语言意图或付费 Provider 场景替代协议夹具;这些边界不因合入或清理临时计划而视为已验证。后续目标平台验证沿用现有测试与本规范。
### 宿主验收与执行许可合同
- 正式 GUI 和 CLI 的共同 Direct 回合入口建立宿主控制状态,绑定 canonical 项目路径、稳定 clientTurnId 和原始用户输入摘要;宿主私有目录保存权威账本并独占该回合,项目 `.agent` 仅允许保存展示副本。配置或项目侧文件被改写、工具切换、Provider 重试和进程重启不得刷新同一回合的预算。
- 正式 GUI 和 CLI 的共同 Direct 回合入口建立宿主控制状态,绑定 canonical 项目路径、稳定 clientTurnId 和原始用户输入摘要;宿主私有目录保存权威账本并独占该回合,项目 `.agent` 仅允许保存展示副本。配置或项目侧文件被改写、工具切换、Provider 重试和进程重启不得重置同一回合的复核计数与执行归属。
- Direct 回合集成测试也按生产入口计算原始用户输入的 SHA-256 十六进制摘要(64 字符),不能用请求名称替代。用户回显过滤回归继续覆盖实时消息去重、回合起止身份关联及历史落盘过滤。
- 直接启动 Direct 工具桥的图片生成通知测试,须复用真实宿主执行会话夹具,再发起工具请求;继续验证资源提交后发出 manifest 失效通知,以及空提示词被参数校验拒绝且不发通知,不绕过执行许可门禁。
- 交付合同不参与普通工具准入。模型通过结构化工具登记本轮游戏交付的必需范围与验收项;合同非空、有界且只冻结一次。模型只能声明要求,不能提交“通过”作为证据。后续扩项留到新的用户回合。
@@ -210,20 +212,18 @@ UI 编辑器的“分析参考图”步骤、Rust 命令 `suggest_ui_design_sema
- 新合同格式为 `agc-direct-delivery.v2`,只接受非空、有界的 visual/gameplay 要求。artifact/command 类型、初始文件变化摘要及 host-entry/host-build 已删除;普通文件、命令、构建和 agc_run_validation 工具及真实失败回执保留。主动登记新 Web 合同时,宿主沿用首次交付事实补充既有双端视觉/玩法底线并返回完整要求;未登记不补合同。冻结后同参重放复用 newWebGame,不重算范围。用户于 2026-10-05 确认视觉/玩法检查保持现状,本次重构不继续调整这两类判据。
- 同一份双端玩法证据可同时满足视觉项,避免重复浏览器运行。视觉/玩法仍校验双端、固定场景及版本、当前运行指纹、报告与截图摘要;只有宿主真实验证回执有效,项目内自行写出的验证 JSON 无效。删除 artifact 要求不删除浏览器证据文件的防篡改校验。
- `validation.maxRuns` 保留已配置值,仅用于交付回复复核次数;普通执行成功、失败、取消和验证输入漂移均不消耗该次数。验证证据继续绑定输入,失败或漂移仅使相应证据不能证明交付;Agent 可以继续无关工作。
- `validation.maxExecutionSeconds` 默认 900,必须为正整数,是整个 clientTurnId 的累计执行时间上限,同回合重试不清零。并行操作分别计时累加,内置工具不与 app-server 的外层 MCP 事件重复计费。时间耗尽立即拒绝新执行、写入和付费扩项,保留最近证据与未完成项;Provider 的重试次数保持独立。
- `validation.maxTurnSeconds` 默认 1800,必须为正整数,是同一宿主回合从开始起的墙钟上限,重启不重置,用于约束模型空转和超出单个工具事件边界的后台会话。墙钟上限与累计执行时间分别记录,任一耗尽都收束自有执行器;不能把模型等待时间报告成工具执行时间。
- 捆绑 app-server 的原生命令使用已验证的逐次审批能力;宿主只返回单次接受/拒绝,不允许会话授权或 exec policy 修订。第三方 MCP 必须显式启用逐调用询问,不能依赖不可信 readOnlyHint。询问缺少调用 ID 时,按服务器与回合中的并发组保守管理,不能解析展示文案猜测归属。
- 原生、内置与第三方所有入口都经过同一宿主状态;独立工具继续并行,只有身份、回合关闭、收尾与必要资源冲突形成短临界区。能力检测失败不得退回无控制执行。
- 上述回合控制适用于 DirectProject。独立客户端 HTTP MCP 显式使用 ExternalClient 来源,保持其原有权限、幂等和浏览器能力,不借用当前项目另一条 Direct 回合的预算或可信证据;新交付合同与托管验证命令工具要求 Direct 会话。服务端 external_mcp 不变。
- 自动交付验收只在模型正常结束本次响应后启动;操作结算、AGC 补丁成功、登记与状态查询都不触发封口。正常完成后证据齐备则进入 Sealing,拒绝新副作用,确认在途归零和执行器退出,再复核运行输入及证据,成功才进入 Completed 并返回宿主报告。未达标仍在原预算与复核次数内反馈修复;取消、耗尽、断连等异常终止保持其原因,不能因证据齐备改成成功。
- 上述回合控制适用于 DirectProject。独立客户端 HTTP MCP 显式使用 ExternalClient 来源,保持其原有权限、幂等和浏览器能力,不借用当前项目另一条 Direct 回合的执行权限或可信证据;新交付合同与托管验证命令工具要求 Direct 会话。服务端 external_mcp 不变。
- 自动交付验收只在模型正常结束本次响应后启动;操作结算、AGC 补丁成功、登记与状态查询都不触发封口。正常完成后证据齐备则进入 Sealing,拒绝新副作用,确认在途归零和执行器退出,再复核运行输入及证据,成功才进入 Completed 并返回宿主报告。未达标仍在原回合与复核次数内反馈修复;取消、复核失败、断连等异常终止保持其原因,不能因证据齐备改成成功。
- Windows app-server 在任何模型工具执行前绑定不可脱离的自有 Job,超时/取消/断连时验证整个 Job 已退出。其它平台继续保留受控进程组;受控归属退出可用于回合收尾及合同完成,但进程组证明不宣称逃逸后代或完整子树均已退出。正常操作回合在 Closing 清理后返回 Working,再由回复复核完成;已封口回合保持 Sealing 直至验收完成。缺失或失败的归属清理仍进入 Interrupted。已受理的远端付费任务保留原不确定围栏,断连不构成自动重放授权。
- Linux 进程组检查排除僵尸;目录枚举失败或数字 PID 的状态不可读取、不可解析时,不以不完整扫描证明组为空,回退到进程组存在性检查。已确认消失的 PID 可以忽略;非进程目录不参与扫描。
- 无合同收尾在预算检查中产生终态报告时,回复复核优先返回已持久化报告;没有终态报告的关闭失败仍保留真实错误,不把预算耗尽改成 Completed。
- 无合同回复复核优先返回已持久化终态报告;没有终态报告的关闭失败仍保留真实错误,不把失败改成 Completed。
- 宿主正常关闭连接产生的迟到通知仅作为诊断,不为 Working/Closing/Sealing 生成终态报告,也不改写 Completed 的回复;只有 Interrupted/Exhausted 的既有失败终态可以追加收尾说明。
- 付费许可始终绑定原回合和原操作,不能在容量或同动作锁排队结束后借用新回合。排队可取消,每次新 POST 前与封口共用宿主状态短锁,核对原许可、期限与阶段并持久化提交边界;封口、终止或耗尽后不得新增提交。已经越过提交边界的请求不丢弃,其 operation ID 和不确定状态继续持久化并允许原 GET 对账,多阶段生成的下一次 POST 仍须重新核验。ExternalClient 与手工资源操作保持既有语义。
- 执行账本使用 `agc-direct-execution.v3`,删除 requiresContract,保留回合预算、归属、活动操作、退出证明及合同证据。读取 v1/v2 只白名单移除退役字段,未知字段仍拒绝;旧终态不重开,含旧合同的非终态保留要求并转为 Interrupted,提示新用户回合继续,不因删除要求宣告成功。旧无合同账本移除强制标记后仍按原预算与活动操作恢复规则处理;更早项目侧验证账本缺少可信时间,不能授予同回合新预算。旧合同终态可查询历史但不再按新标准评估。
- 付费许可始终绑定原回合和原操作,不能在容量或同动作锁排队结束后借用新回合。排队可取消,每次新 POST 前与封口共用宿主状态短锁,核对原许可、取消状态与阶段并持久化提交边界;封口或终止后不得新增提交。已经越过提交边界的请求不丢弃,其 operation ID 和不确定状态继续持久化并允许原 GET 对账,多阶段生成的下一次 POST 仍须重新核验。ExternalClient 与手工资源操作保持既有语义。
- 执行账本使用 `agc-direct-execution.v4`,不含宿主时间上限与 requiresContract,保留用时、复核计数、归属、活动操作、退出证明及合同证据。读取 v1/v2/v3 只白名单移除退役字段,未知字段仍拒绝;旧终态不重开,含旧合同的非终态保留要求并转为 Interrupted,提示新用户回合继续,不因删除要求宣告成功。旧无合同账本移除强制标记后仍按原活动操作恢复规则处理;更早项目侧验证账本缺少可信宿主归属,不能授予同回合执行权限。旧合同终态可查询历史但不再按新标准评估。
- 模型一次执行结束时先进入 Closing,关闭新操作和迟到提交,核实自有执行器退出及活动操作归零后才能回到 Working 接受交付反馈;整个用户回合结束后撤销旧许可。Closing 只用于实际关闭,不由普通工具失败触发。普通无合同回合完成不宣称游戏验收通过。
- 本地写事务未结算或失败仍需核对时不得封口。与失败写入重叠的旧写入/旧验证不能清除该围栏;只有失败之后新准入的成功修复或可信验证可以恢复验收。普通文件写入与账户/本地资产导入显式携带原写入许可,取得项目锁后再与宿主状态锁共同核验期限并提交短本地事务;等待锁或下载期间终止的请求不得继续落盘,网络等待不持宿主状态锁。
- 本地写事务未结算或失败仍需核对时不得封口。与失败写入重叠的旧写入/旧验证不能清除该围栏;只有失败之后新准入的成功修复或可信验证可以恢复验收。普通文件写入与账户/本地资产导入显式携带原写入许可,取得项目锁后再与宿主状态锁共同核验原操作与回合状态并提交短本地事务;等待锁或下载期间终止的请求不得继续落盘,网络等待不持宿主状态锁。
## 2026-09-20 DirectProject 交付效率与可观测性
@@ -240,13 +240,13 @@ UI 编辑器的“分析参考图”步骤、Rust 命令 `suggest_ui_design_sema
### 分层验证与预算
- 复用客户端浏览器与现有固定玩法场景。视觉检查采集双端画面/布局/资源/诊断;玩法检查分别在 desktop/mobile 执行明确的固定场景和真实输入,按视口保存结果。旧报告缺少移动端玩法结果时保持未知,不补通过。报告必须声明检查层级;视觉通过不能宣称玩法通过,固定场景通过也不能宣称覆盖未执行的完整关卡。
- 浏览器工具回执在 `mode=gameplay` 时新增 `gameplayResults` 双端有界投影,每个视口包含 `viewport`、`passed`、`diagnostics`、`assertions` 及 `initialPhase` / `initialSequence` / `initialLevel`、`finalPhase` / `finalSequence` / `finalLevel`。`assertions` 仅列当前固定场景的断言名称和通过状态;每端最多公开 4 条诊断,每条最多 512 字符。缺少某端结果时仍返回该视口 `passed=false`,诊断说明证据缺失,断言为空且六个状态字段为 `null`;断言的 `passed=false` 可包含未执行,不能据此断言该断言已独立执行且失败。`mode=visual` 的 `gameplayResults` 为空,并在摘要中明确玩法未执行。摘要从同一投影给出每端首条诊断和首个未通过断言,不能与结构化结果相矛盾。工具回执不得展开完整宿主报告;`reportPath` 只作宿主证据引用。宿主报告结构、验收门禁、持久化预算和私有路径保护保持原合同,旧回执不回填新字段。
- 浏览器工具回执在 `mode=gameplay` 时新增 `gameplayResults` 双端有界投影,每个视口包含 `viewport`、`passed`、`diagnostics`、`assertions` 及 `initialPhase` / `initialSequence` / `initialLevel`、`finalPhase` / `finalSequence` / `finalLevel`。`assertions` 仅列当前固定场景的断言名称和通过状态;每端最多公开 4 条诊断,每条最多 512 字符。缺少某端结果时仍返回该视口 `passed=false`,诊断说明证据缺失,断言为空且六个状态字段为 `null`;断言的 `passed=false` 可包含未执行,不能据此断言该断言已独立执行且失败。`mode=visual` 的 `gameplayResults` 为空,并在摘要中明确玩法未执行。摘要从同一投影给出每端首条诊断和首个未通过断言,不能与结构化结果相矛盾。工具回执不得展开完整宿主报告;`reportPath` 只作宿主证据引用。宿主报告结构、验收门禁、持久化操作记录和私有路径保护保持原合同,旧回执不回填新字段。
- 回执验收覆盖 start 禁用、点击后 phase 不符合和玩法成功;逐视口核对持久报告与摘要中的状态、首条诊断和首个未通过断言,并检查成功、失败两条最终 MCP 回包路径。
- 输入或碰撞改变先做定点玩法检查;纯图像/颜色变化做视觉检查;首次交付和影响闭环的修改做所需玩法验证。新增失败或相关代码变化才重跑对应层,不因改说明文字重复完整验证。
- 内置试玩和客户端托管的外部 Node/npm 验证共用当前 clientTurnId 的持久化预算。客户端分配递增执行序号,模型提供的旧 attempt 仅作兼容输入,不能减少计数或重置预算;同一轮错误反馈、工具切换和进程重启均不能刷新已消费次数。
- 新增本地 validation.maxRuns(默认 3,正整数)独立于 llm.maxRetries;显式配置原样使用,不按角色或运行模式改写。超限直接返回已用/上限和最近证据,停止新的验证。预检与正常构建不计作重复试玩。
- 同一层级、场景/验证命令和项目输入指纹已有成功证据时复用,不再次运行;真实源码或素材变更使缓存失效,失败不缓存为成功。所有验证回执标明是否复用、项目指纹、实际序号和预算剩余。
- 外部验证只通过客户端提供的 Node/npm 入口运行,在同一预算内保存退出码和有界输出;生产 Skill 明确禁止转到原生 shell 自建并重复执行另一套试玩来规避预算。任意原生 shell 的语义不能由字符串猜测可靠识别,本合同不声称已通过权限沙箱硬阻断所有绕行。
- 内置试玩和客户端托管的外部 Node/npm 验证共用当前 clientTurnId 的持久化操作状态。客户端分配递增执行序号,模型提供的旧 attempt 仅作兼容输入,不能修改宿主计数;同一轮错误反馈、工具切换和进程重启均不能重置归属与复核记录。
- 本地 validation.maxRuns(默认 3,正整数)独立于 llm.maxRetries;显式配置原样使用,仅约束交付复核失败次数,不限制工具执行或试玩次数。
- 同一层级、场景/验证命令和项目输入指纹已有成功证据时复用,不再次运行;真实源码或素材变更使缓存失效,失败不缓存为成功。所有验证回执标明是否复用、项目指纹、实际序号和已用执行时间。
- 外部验证通过客户端提供的 Node/npm 入口保存退出码和有界输出;原生命令仍须经过相同的宿主操作控制,不能绕过已关闭回合。任意原生 shell 的语义不能由字符串猜测可靠识别,本合同不声称已通过权限沙箱硬阻断所有绕行。
- 鉴权、权限、余额、项目身份、传输丢失、取消及付费结果不确定继续遵守原终止/对账边界;确定性参数错误先修参数,不原样重复付费请求。
### Direct 历史、审计与耗时的现行边界(2026-09-23 核准)