完善 Agent Provider 持久重试真实验收

将瞬态故障注入迁移到 Project Supervisor 首次工具规划并验证持久退避恢复
为故障代理补充仅含序号和时间的元数据请求审计与对应测试
强化真实 E2E 对并行委派、重启恢复、重试时序、分账和终局清理的验收
修正瞬态重试目标的 maxRetries 配置门禁并同步 Runtime 文档与项目记忆
This commit is contained in:
AIGameCreator App
2026-07-19 23:24:51 +08:00
parent 21abd45f86
commit 160fe3a8b4
8 changed files with 792 additions and 141 deletions
@@ -1369,9 +1369,11 @@ V1.39 把 V1.28 的显式瞬态重试从单纯进程内退避扩展为可跨 Run
确定性回归必须覆盖:未到期零请求、到期唯一请求、耗尽清理、cancel、steer、Goal pause/resume 跨秒保持正文与 attempt、自动 context-compaction 先恢复再进入 tool-plan、sidecar 先于 task/state 的 torn projection、Runner 重启扫描、同 Agent FIFO、跨 Agent 并行、finalization/idle blocker、`.previous` 恢复/去重/排序和危险路径身份。原有 final-reply/repair 进程内重试回归必须继续通过。
V1.39 当前只完成确定性实现与回归,不把 V1.38 的失败轮、旧瞬态重试真实样本或最小 HTTP 探针拼接成新的真实 Provider PASS。需要真实验收时必须在最终代码上以独立 disposable 项目和隔离 AppData 完整运行,并证明 Runner 在退避期强杀后仍只发送同一 `-transient-N` attempt、其它 Agent 真并行、同 Agent FIFO、唯一最终回复、零重复/残留/正文/密钥/路径泄漏
V1.39 的真实 suite 把受控故障放在 Project Supervisor 首次 tool-plan,此时尚无子 Agent in-flight Provider 请求;否则强杀共享 Runner 会让无可信终态的旁路请求按既有 orphan 规则进入失败关闭,不能用它证明单一 retry sidecar 的恢复。隔离 collaboration policy 要求首批同批产生 `design-director + quality-review` 两个 static delegate,单委派由正式 preflight/协议修复拒绝,不能只依赖提示。故障代理使用 `30s` 退避与 metadata-only 时间日志:只记录请求序号及 `acceptedAtMs / faultInjectedAtMs / heldAtMs / forwardingStartedAtMs`,不记录 URL、method、headers、正文或凭据;退避期强杀后,sidecar 完整身份、字节、attempt、slot 和 `retryAt` 必须保持不变,重启后与到期前请求数均为 1,第二个请求的网络接收时间不得早于 `retryAt`
2026-07-19 最终代码的确定性门禁已通过:`provider_retry_` 19/19、`provider_transient_retry_` 6/6Tauri/Rust 串行全量为 968 passed、4 个环境依赖用例按设计 ignored,`cargo check`、rustfmt、编码与 diff 检查通过。以上结果不替代尚未执行的 V1.39 独立真实 Provider E2E。
2026-07-19 最终代码的确定性门禁已通过:`provider_retry_` 19/19、`provider_transient_retry_` 6/6Tauri/Rust 串行全量为 968 passed、4 个环境依赖用例按设计 ignored,`cargo check`、rustfmt、编码与 diff 检查通过。
同日最终代码的独立 `openai_chat / gpt-5.5 / high` 真实 Provider suite **PASS**,最终样本单轮耗时 `891.1s`。37 个 request identity 全部形成唯一终态:`37 started / 37 terminal / 36 completed / 1 injected failed / 1 retry`incidental Provider failure/retry 均为 0;目标父 Agent 的首次请求在正文转发前断线,retry sidecar 与 task/state 完整进入等待态后执行一次 pidfd Runner 强杀,新 boot 从旧 boot 恢复同一父 Session/run/loop/attempt。强杀前、重启后、到期前代理请求数均为 1,early request 为 0,第二个请求 `acceptedAtMs >= retryAtMs`,后继仅有一个稳定 `-transient-1` identity。放行后完成同批两个指定 static delegate、专业 Provider 真重叠、2 条初始 delivery + 1 条继承原合同的 repair、2 次 Observed claim、宿主验证、5 个父计划步骤、唯一 Supervisor assistant 与 3 条内部专业 assistant;重复 lifecycle/action/receipt/delivery/message 均为 0pending/confirmation/finalization/provider-action-batch/provider-retry sidecar 全为 0Provider 正文、私有正文、API Key、项目路径和正式配置路径泄漏均为 0,代理、Runner、隔离项目与 AppData 全部清理。验收器按 request identity 区分受控注入与真实网络抖动:额外瞬态失败只有逐条通过既有 lifecycle/retry/后继终态门禁并以相等 incidental failure/retry 计数公开时才允许继续,不能混入注入链。此前首批合同不完整、在专业 Agent in-flight 时强杀、sidecar-first 投影窗口误判、单委派和额外已恢复 Provider 抖动样本均只保留为独立失败证据,不与本次 PASS 拼接;V1.38 的真实 E2E 结论仍独立记账。
## 验收命令
@@ -605,4 +605,4 @@ game-project/
- snapshot v1 固定且完整包含 `schemaVersion / projectId / parentAgentId / parentRunId / boundFrom / policy / policyFingerprint / snapshotFingerprint / boundAt`snapshot 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` 暂不扩展为持久重试;工具策略刷新时间不得进入请求指纹。当前只记录确定性回归,不改变 V1.38 真实 E2E 尚未 PASS 的结论。
- 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 retry`incidental failure/retry 均为 0,隔离现场完整清理。额外真实瞬态失败按 request identity 单独计数且仍须完整恢复,不能混入受控注入链。该证据不改变 V1.38 真实 E2E 尚未 PASS 的独立结论。