@@ -1,107 +0,0 @@
# 【实施计划】移除GameAgent宿主运行时间上限
| 字段 | 值 |
| --- | --- |
| Milestone | [移除GameAgent宿主运行时间上限 ](./【里程碑】移除GameAgent宿主运行时间上限-2026-10-06.md ) |
| Status | implemented,自动化通过,待运行时验收 |
| Owner | 当前任务 Agent |
| Date | 2026-10-06 |
## 交付与优先级
一句话交付:删除 Direct 宿主的累计执行与墙钟限制,完整处理旧配置和账本,证明独立超时与生命周期控制仍有效。
- 必须项:时间停止逻辑、配置与账本迁移、工具状态投影、定向回归和权威文档同步。
- 风险项:计时检查与取消/提交锁耦合、旧终态误恢复、删除 watchdog 时丢失其它收尾职责。
- 可选项:无;不借机重构工具调度、Provider 或整套账本。
- 时间盒:调研与计划 20 分钟;实现按配置迁移、生命周期、定向验证三个检查点推进,每段约 45 分钟重新核对范围。时间盒仅用于任务管理,不改变产品行为。新增发现只有影响验收标准才扩围。
## 修改边界与现有依据
路径除特别注明外均相对 `apps/ai-game-creator-shell/` 。
| 位置 | 计划修改 |
| --- | --- |
| `src-tauri/src/agent/direct_validation.rs` | 删除两个秒数配置及默认值/正整数检查;保留 maxRuns 校验和用时统计,移除验证回执的 maxExecutionMs |
| `src-tauri/src/config.rs` 、`src/app/types.ts` | 加载边界迁移并落盘清除旧字段;正式类型和序列化完全删除两个字段,同步配置测试 |
| `src-tauri/src/agent/direct_execution.rs` | 删除累计执行/墙钟超限转换与专属周期检查;清理仅为期限存在的判断,保留用时统计、锁、归属、取消和退出证明 |
| `src-tauri/src/agent/direct_delivery.rs` | 删除状态回执上限;保留复核次数耗尽、合同封口和已有终态报告优先规则 |
| `src-tauri/src/agent/codex_app_server/execution.rs` | 清理宿主预算 tick 调用与失效文案,保留连接死亡、取消、Sealing 及终态收束 watchdog |
| `src-tauri/src/agent/claude_code_cli.rs` | 删除“maxTurnSeconds 先兜底”的过期注释,独立超时代码不变 |
| `src-tauri/src/agent/direct_execution/tests.rs` 及相关模块现有测试 | 旧越界中断测试改为越界继续;保留真实生命周期、迁移与退出证明回归 |
| AGC 主规范、相关提示/工具描述与共享记忆 | 搜索并更新现役时间预算表述,保留其它次数、资源额度与独立超时语义 |
不修改 Codex timeout 选值函数、Claude 独立超时、单工具/RPC/网络清理期限、Provider maxRetries、外部 API 或数据库。
## 实现顺序
1. 先列出所有 tick、期限检查、Exhausted 生产者与消费者。区分时间耗尽、交付复核次数耗尽和历史终态,不能整体删除 Exhausted。核对计时字段在统计/日志中的读取者,保留有现役用途的用时。
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 等已用时事实。缓存与历史回执若含旧上限,只作为历史字段读取,不据此重新启用限制或改写证据哈希。
6. 完成下列定向验证与生产入口 smoke;记录主规范/里程碑每条证据。实施验收后融合主规范旧时间预算段和相关共享记忆,删除已完成临时计划。
## 验证设计
- 使用测试内部受控时钟或宿主账本/操作开始时刻夹具,分别使累计执行超过 900 秒、整轮超过 1800 秒,不实际睡眠 30 分钟、不新增产品测试开关。检查仍为 Working、后续合法 Write/Execute/Paid 准入有效,统计继续累计。
- 同时覆盖无合同/有合同、并发操作、内部重试与旧账本恢复。已用时超限本身不阻止运行;带未结算操作的恢复仍按原规则中断。
- 对同一长任务注入取消、断连或 Codex 静默超时,验证停止、零新增副作用、进程退出以及真实失败原因;真实付费服务用现有幂等夹具替代,不产生付费调用。
- 旧配置及 v1/v2/v3 数据迁移保留原身份、合同、用时与历史失败报告;未知字段、损坏文件、错误回合身份仍失败关闭。Completed/Interrupted/Exhausted 不因升级重开。
- 验证迁移安全落盘、重复加载不再转换、写回失败不丢数据;检查旧字段名只留在必要迁移与测试,产品运行时没有旧限制分支、无效开关或空壳方法。删除失效的旧限制专属测试,而非保留跳过的测试。
- Codex 15/110/120 分钟选值及事件重置回归、Claude 独立超时回归保持通过;复核次数耗尽及缺少退出证明仍不能交付。
## 验证命令
仓库根目录执行,Rust 定向测试统一串行,避免共享运行时夹具冲突:
``` bash
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:: -- --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
npm run check:doc-index
npm run check:encoding
git diff --check
```
实现时核对每个过滤器实际运行非零测试。GUI/CLI smoke 使用现有协议夹具与可用本地环境,记录平台、入口和终态;Linux 证据不能替代 Windows Job 退出证明。确实缺失的环境列为未验证,不反复扩大测试范围。
## 风险与回滚点
- 移除预算后,长任务由用户停止、Provider/工具独立超时及现有交付控制收束;不承诺模型一定在固定总时长内完成。
- 迁移不得在旧执行器仍持有归属锁时写入;不允许删除旧账本来消除状态或复核限制。
- v4 写入后旧程序不能假定可直接读取。回滚必须先停止活动执行器并保留完整宿主状态;采用向前修复,或在核对身份与操作状态后恢复升级前备份,不能简单降级包体或重开失败回合。
- 已实施运行时与数据加载迁移,验证使用隔离临时配置和项目,未迁移真实用户数据。真实模型、手动 GUI 与 Windows 专项结果不由本地协议夹具代替。
## 实施结果与验收证据(2026-10-06)
已删除两个正式配置字段、账本上限字段、宿主 250ms 期限 watchdog、tick/tick_locked 及调用、专属墙钟状态和超限报告;执行适配器的取消/断连/交付收束 watchdog 保留。用时统计、交付复核、原回合写入/付费许可和退出证明继续有效。旧字段名仅出现在必要迁移及迁移测试中。
| 条款 | 验证 | 结果 |
| --- | --- | --- |
| 超过旧上限仍可执行与正常结束 | `direct_execution` 定向组:无合同完成、并发执行统计、长时间写入/付费后取消、同回合恢复 | 37 passed |
| 合同复核与真实证据 | `direct_delivery` 定向组 | 12 passed |
| 验证缓存与回执 | `direct_validation` 定向组 | 9 passed |
| 配置迁移与恢复 | `config::` 定向组:启动前归一化、迁移落盘、重复读取、只读源、备份恢复、未知字段及写入失败 | 19 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;不算新增通过证据。旧记录迁移由数据加载触发,本次只操作临时测试数据。
主规范与共享决策已同步;当前只有这一个里程碑,不推进其它工作。运行时验收后删除临时里程碑与实施计划,持久验证边界保留在主规范。
## 评审修复:桌面启动配置迁移顺序
- 启动的 agent-mode 迁移原先直接严格解析旧配置,先于普通读取的字段移除,导致 AppData 中仍有时间字段时启动失败。启动与普通读取现共用纯归一化函数;启动将字段移除计入自身 changed,沿原安全写回路径保存,无须提前注册全局目录。
- 新回归在配置测试锁下清空运行配置目录,覆盖主配置与本地覆盖、单项与双项退役字段、重复启动及非法字段拒绝不覆盖。修复前实测出现 `unknown field maxExecutionSeconds` ;修复后配置组 19 项通过。
- 浏览器试玩描述改为共享操作归属,旧 attempt 只描述客户端执行序号;共享决策与 Claude 超时排障说明同步到已移除宿主时间上限的现状。