Merge remote-tracking branch 'origin/master' into feat/game-fork
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Successful in 7m31s
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Successful in 6m17s
Project CI / AI game creator shell Rust crates (pull_request) Successful in 4m47s
Project CI / Frontend tests (pull_request) Successful in 3m46s
Project CI / Backend tests (pull_request) Successful in 8m28s
Project CI / AI game creator shell web tests (pull_request) Successful in 4m6s
Project CI / Native shell tests (pull_request) Successful in 9m42s
Project CI / Repository checks (pull_request) Successful in 7m30s

This commit is contained in:
2026-10-06 19:03:25 +08:00
15 changed files with 469 additions and 274 deletions
@@ -9830,19 +9830,19 @@ CI 上 `background_agent_runtime_recovers_stale_running_before_pending_task` 在
## 2026-10-04:Direct 普通操作与交付复核解耦
- 普通工具准入只检查原回合活动状态、时间预算、并发和既有权限,不要求先登记交付合同;成功/失败/取消只结算本次操作,删除全局 Draining 与执行/返修批次计数。
- 普通工具准入只检查原回合活动状态、并发和既有权限,不要求先登记交付合同;成功/失败/取消只结算本次操作,删除全局 Draining 与执行/返修批次计数。
- 验证失败和源码漂移影响对应证据,不阻断无关工作。远端不确定结果沿资源自身 operation/幂等记录核对;本地执行器失控或持久状态损坏仍结束回合。
- 保留累计执行时间、整轮墙钟、原生执行前审批、关闭时清理与原回合写入/付费提交检查。模型执行结束时先关闭准入,确认清理后才允许交付反馈继续;普通失败不进入关闭阶段。
- 累计执行与整轮耗时仅用于观测,保留原生执行前审批、关闭时清理与原回合写入/付费提交检查。模型执行结束时先关闭准入,确认清理后才允许交付反馈继续;普通失败不进入关闭阶段。
- `validation.maxRuns` 只保留交付回复复核用途;合同的创建与两类要求简化见下条决策,视觉/玩法判据保持原样。图片工具仍等待结果,Codex 调度不变。
- v2 执行账本只对白名单 v1 字段迁移,保留预算与终态,不恢复旧活动权限;没有可信时间记录的更早项目侧账本不授予同回合新预算。
- 执行账本现为 v4,已发布 v1/v2/v3 只在加载边界白名单迁移,保留用时、复核计数与终态,不恢复旧活动权限;更早项目侧账本不能证明宿主归属,不授予同回合执行权限。
- 权威边界与验收入口:[AI 游戏创作智能体 App 实施计划](../../technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md#direct-操作控制2026-10-04)。Windows Job 退出证明仍须由 Windows 环境验收。
## 2026-10-04:Direct 合同按用户意图登记、正常响应结束后复核
- 合同自动检查只在模型正常结束响应后触发;删除操作结算与补丁成功触发的提前封口,状态查询保持只读评估。异常终止与预算耗尽仍独立处理,不以证据齐备覆盖失败事实。
- 合同自动检查只在模型正常结束响应后触发;删除操作结算与补丁成功触发的提前封口,状态查询保持只读评估。异常终止与交付复核次数耗尽仍独立处理,不以证据齐备覆盖失败事实。
- 提示 Agent 在用户要求制作、完成或交付游戏时登记合同,由 Agent 理解用户意图;首次输入也按同一用户意图条件登记,提示与技能不另设空项目或首次输入的免登记说明。无合同既不阻断普通操作,也不阻断正常结束。
- 删除 artifact/command 合同要求及宿主自动补入项,保留普通文件、命令与构建能力。视觉/玩法的现有判据和证据真实性校验不改,仅在主动注册后应用原有新 Web 视觉/玩法补充;用户于 2026-10-05 确认这两类检查保持现状。
- 旧未完成合同不得因过滤退役要求变成成功;保留旧预算、终态和操作身份,版本迁移与恢复有独立验收。
- 旧未完成合同不得因过滤退役要求变成成功;保留用时、复核计数、终态和操作身份,版本迁移与恢复有独立验收。
- 权威规则:[Direct 合同规则](../../technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md#宿主验收与执行许可合同)。运行时已实现;验证边界保留在主规范,不以协议夹具代替真实模型或 Windows 专项证据。
## 2026-10-05:Direct 重构手动 GUI 检查与范围收敛
@@ -9855,8 +9855,8 @@ 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 标题栏项目标签评审后续(空态、视图门控与文案)
@@ -9867,3 +9867,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)。
@@ -6477,7 +6477,7 @@ Cocos Creator 根目录由 `package.json.creator.version` 与普通 `assets/`
- **根因**:`claude_code_cli.rs` 先把 AGC 进程继承来的 `ANTHROPIC_BASE_URL` / `ANTHROPIC_AUTH_TOKEN` 原样复制给 sidecar,再让它们优先于平台会话(`claude_base_url` 里 `std::env::var("ANTHROPIC_BASE_URL")` 排在 `.or_else` 最前,凭据有 `if … is_none()` 守卫因此永远不覆盖)。实测:直接跑 sidecar 探针,`claude.exe`(PID 43256)的两条 443 连接落在 `198.18.2.60` = 用户个人的 `yunyi.rdzhvip.com`,完全没碰 `dev.genarrative.world` / Router;同一个 token 对 `POST https://yunyi.rdzhvip.com/claude/v1/messages` 45 秒不返回(Bearer 与 `x-api-key` 都一样)。用户 `~/.claude/settings.json` 里的 env 反而无关——sidecar 用 `settingSources: []` 关掉了设置文件来源,事故来源是**进程环境**。
- **现行口径**:cc 的路由与凭据只由 AGC 决定,本机 `ANTHROPIC_*` **完全不参与**(`claude_code_route` 的入参里没有进程环境)。官方模型 + 平台会话 → `{apiBaseUrl}/api/llm/anthropic` + `Bearer <平台 access token>`;`customEnabled` 或配了 `llm.apiKey` → AGC 配置的 baseUrl(自定义端点用 `x-api-key`,其余保持 Bearer);没登录也没配 key 就报「cc 模式需要先登录陶泥儿账号」,不再退回本机环境。`ANTHROPIC_API_KEY` / `ANTHROPIC_AUTH_TOKEN` 也不再进 `copy_env` 白名单,只由解析出的路由下发。个人中转要走 AGC 的 `customEnabled` + baseUrl + apiKey,不做隐式继承。
- **同时(配置隔离)**:sidecar 子进程把 `HOME`、`USERPROFILE`、`CLAUDE_CONFIG_DIR` 全部指向项目内隔离目录(`.agent/runtime/claude-code/home`)。只改 `HOME` 不够——Windows 上 Node 的 `os.homedir()` 只看 `USERPROFILE`,Claude Code 会照样读用户自己的 `~/.claude.json`(个人 `mcpServers`、插件市场、凭据)并把 `projects/`、`sessions/` 写回真实 profile。实测隔离前 CLI 先花 ~90 秒在个人配置上、真实 `~/.claude/sessions` 每次回合都被写;隔离后 `time_to_request_ms=41`,且只写隔离目录。
- **同时(超时语义)**:`requestTimeoutMs`(默认 180000)在 cc 执行器里只作**静默预算**:sidecar 每有一条事件就重置,连续静默超过预算才按 `sidecar-turn-timeout` 收口;另有 `CLAUDE_CODE_TURN_MAX_DURATION`(45 分钟)兜底事件流假活,正常情况更早到的是 DirectProject 的 `maxTurnSeconds`。原来「整回合 180 秒墙钟」会把「网关慢但仍在下发事件」的正常回合掐死——实测 19:46 那轮 sidecar 一直在出事件,第 180 秒被墙钟杀掉。
- **同时(超时语义)**:`requestTimeoutMs`(默认 180000)在 cc 执行器里只作**静默预算**:sidecar 每有一条事件就重置,连续静默超过预算才按 `sidecar-turn-timeout` 收口;另有 `CLAUDE_CODE_TURN_MAX_DURATION`(45 分钟)兜底事件流假活;DirectProject 的宿主墙钟上限已移除,不再存在更早触发的 `maxTurnSeconds`。原来「整回合 180 秒墙钟」会把「网关慢但仍在下发事件」的正常回合掐死——实测 19:46 那轮 sidecar 一直在出事件,第 180 秒被墙钟杀掉。
- **排查手段**:sidecar 每次启动都写一行 `agent.direct_codex.claude_route source=<Platform|Custom|Config> host=<…> auth=<key|session|none>`(只写主机名,不含路径与凭据)。这一行是判断"回合到底发到哪个网关"的唯一低成本证据。
- **注意**:日志脱敏标记包含 `credential`、`x-api-key`、`bearer `、`token=`、`api_key`,命中即整行替换成 `<sensitive diagnostic details redacted>`。诊断行只能写 `source=`/`host=`/`auth=` 这类自查过的字段(第一版写成 `credential=bearer`,整行被吃掉过一次)。
- **验证**:`cargo test --features=cocos-editor-execute,unity-editor-execute,godot-editor-execute --bin genarrative-ai-game-creator-shell claude_code_cli::tests::` 11 passed,覆盖平台优先、自定义端点保留配置、未登录时不回落本机环境且报「先登录」、baseUrl `/v1` 归一化、主机名诊断、sidecar 环境隔离(`USERPROFILE`/`CLAUDE_CONFIG_DIR` 指向隔离目录且不带本机 `ANTHROPIC_*`);另用本地假 Anthropic 端点跑通真 sidecar:`REQ HEAD /api/hello` → `REQ POST /v1/messages?beta=true auth=bearer` → `result=PROBE_OK`。
@@ -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,29 +166,45 @@ UI 编辑器的“分析参考图”步骤、Rust 命令 `suggest_ui_design_sema
### 宿主控制与后续验收边界
- 执行预算按工具占用累计时间和回合墙钟管理,不设置执行/返修批次或按普通失败扣减次数。任意代码执行必须具备当前回合的有效执行许可及累计执行时长边界。
- 工具占用累计时间与回合耗时仅用于观测,不设置宿主时间上限、执行/返修批次或按普通失败扣减次数。任意代码执行必须具备当前回合的有效执行许可。
- 原生命令入口必须以捆绑版本的真实协议证明可在执行前拒绝;不得用执行后的日志通知或文本分类器冒充执行门。能力检测失败不得静默退回无控制模式。
- 原生执行控制的精确协议与许可持久化,在对应里程碑评审后落地;不得提前宣布这一项已完成。
- 不修改 Provider 的 maxRetries;不减少引擎或任意代码执行的合法能力,不引入平行 Agent 框架,不改公开 API/数据库,不提交私密运行记录。
### Direct 宿主运行时间上限移除(2026-10-06)
本节是 Direct 宿主运行时间与独立 Provider 超时的现行合同。
- 目标:GameAgent 的 Direct 回合不再因累计工具执行达到 900 秒或回合墙钟达到 1800 秒而停止。删除这两项宿主限制及其可配置入口,不用零值、极大值或新开关模拟移除;无合同、已登记合同、内部返修与重试均遵循同一规则。
- 保持独立超时:Codex 无活动 MCP 时的 15 分钟事件静默、存在活动 MCP 时的 110 分钟事件静默、单次模型调用的 120 分钟硬上限,以及它们与 requestTimeoutMs 的取大规则不变;Claude 静默与 45 分钟硬上限、单工具/RPC/网络/进程清理超时不变。完成回合后等待用户不适用这些运行中超时。
- 回合归属、权限/路径、并发容量、停止按钮、异常中断、在途结算及受控进程退出证明仍是正式控制边界。排队写入取得锁后、每次新付费提交前仍校验原回合与原操作;移除时间判断不能放宽终态后的副作用门禁。
- 交付合同与视觉/玩法证据判据不变,validation.maxRuns 继续只限制交付复核次数。正常响应结束后才能启动交付封口;缺失证据或退出证明仍不能判定完成,真实失败保持原原因。
- 保留已用执行时长及回合时间的可观测信息,但不能再据此拒绝操作、取消执行或产生时间耗尽报告。新状态回执不再公开 maxExecutionMs 或虚假的剩余时间;历史回执按原记录展示。
- 清理要求:彻底删除两项限制的运行时代码、配置字段、默认值、校验、专属定时任务、错误分支及失效测试/说明;不保留 deprecated 字段、禁用开关、空壳 tick 或新旧执行双路径。时间统计只有仍被现役观测消费时才保留。
- 数据迁移:仅在持久化加载边界将旧配置与旧账本转成当前格式;从配置删除 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 失效通知,以及空提示词被参数校验拒绝且不发通知,不绕过执行许可门禁。
- 交付合同不参与普通工具准入。模型通过结构化工具登记本轮游戏交付的必需范围与验收项;合同非空、有界且只冻结一次。模型只能声明要求,不能提交“通过”作为证据。后续扩项留到新的用户回合。
@@ -196,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 交付效率与可观测性
@@ -226,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 核准)