diff --git a/.task/archive/feature-fast-slow-o2-c8-review.md b/.task/archive/feature-fast-slow-o2-c8-review.md new file mode 100644 index 00000000..e4135cae --- /dev/null +++ b/.task/archive/feature-fast-slow-o2-c8-review.md @@ -0,0 +1,162 @@ +# feature/fast-slow-o2-c8-review 任务卡 + +任务主记录:PR #667 https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/667;状态:已完成(合入前闭合);owner:weichen + +## 基线与授权 + +- 权威仓:ssh://git@192.168.3.2:2222/weichen/Agent-System-Dev.git;目标分支:main;R0(initial_base_sha)= a9566a68505ac97dead15ed3b5672954f15cea1c +- 工作区:/home/weichen/projects/Agent-System-Dev-wt-feature-fast-slow-o2-c8-review(worktree);分支:feature/fast-slow-o2-c8-review +- 分支类型:standalone;root_target:main;immediate_target:main;accepting_requirements:false +- 需求分流:verdict=NEW;selected_initiative=无;requirement_sha256=5047963d4ab90c90c1c0f90e1e71ae0a04b16e9d082d3c9b94ac4bf0e0d0aeda;triage_receipt=/tmp/o2c8-20261021/triage.json;receipt_sha256=6a53842b6c14e09edbe1334abfa0b9b3829772a2129fe1325c2916fdbd324fa0 + +- 授权与交付终点:用户选择「1 零付费复核 C8」;允许离线只读调查、写复核文档与任务卡、Review、PR、CI 与合入。未授权:任何付费请求/复跑、代码实施、实例配置写入、部署 +- 交付模式:goal-first(目标、范围和交付终点一次确认;范围内连续推进) +- 实施执行:agent-per-unit(配置:AGENT-EXECUTION.md) +- 合入执行:agent(已授权交付范围内,Review 通过、冲突解决且当前 HEAD 的 CI 通过后合入) +- 人工决策点:仅限目标/范围/验收变更、重大取舍、高后果操作或无法自动判定的业务验收 +- 当前阶段:合入;当前增量:I1 复核文档(host 豁免路径,无实施单元) +- 流程依据:仓库根目录 policy/delivery.md(归档后仍按仓库根目录定位) + +## 目标与非目标 + +目标:离线确定 P2 第 3 次请求 C8 的成因(工具名未声明还是参数 schema 不符),只读评估「schema 不符交给工具层返回可修正错误」的改法,并记录 P2 花费与结论。 + +非目标:不改 Backend/agent-native 代码、不改路由契约、不发起付费请求。 + +## Agent 实施收据 + +路由与 fail-stop 规则见根目录 AGENT-EXECUTION.md 与 policy/delivery.md;每次尝试一行,原始日志留在源码外收据路径。 + +| 单元 ID | 预期范围 | 配置摘要 | 角色 | 候选顺序 | attempt | CLI/模型 | 终态 | transport | fallback | 源码外收据路径 | +|---|---|---|---|---|---|---|---|---|---|---| +| 无 | 仅 `docs/superpowers/specs/**` 与 `.task/**`(host 豁免) | 不适用 | — | — | — | — | 不适用 | — | — | — | + +## 关联方向与规划 + +- 适用状态:适用(O2 fast-slow A01 证据合规的后续复核) +- 主记录路径/版本:docs/superpowers/specs/2026-10-20-fast-slow-o2-a01-evidence-design.md(main a9566a6) +- 对应里程碑:O2 A01 付费复验通过 + +## 需求分析 + +| ID | 描述 | 项目符合度及依据 | 优先级 | 验收条件 | 依赖 | 结论 | +|---|---|---|---|---|---|---| +| R1 | 确定 C8 成因并评估改法,记录 P2 结论 | 符合:O2 下一步取决于此 | P0 | 复核文档给出可复核依据与建议 | P2 证据目录 | 完成:C8=工具名未声明;改法不适用 | + +## 方案与计划 + +- 方案引用:docs/superpowers/specs/2026-10-21-fast-slow-o2-c8-review.md(Backend dfb31da、agent-native 2fc66be) +- 实施计划引用:不适用(只读复核) +- 测试计划引用:不适用;零付费,未运行模型 + +## 阶段记录 + +| 阶段 | 对象版本 | 状态 | 决策/执行者 | 时间 | 依据 | +|---|---|---|---|---|---| +| 需求拆解 | a9566a6 | 完成 | host | 2026-10-21 | 用户选择「1」 | +| 需求评估 | a9566a6 | 完成 | host | 2026-10-21 | R1 | +| 需求表确认 | a9566a6 | 完成(范围由用户选项确定) | 用户 | 2026-10-21 | 选项 1 | +| 方案设计 | c5e8b47 | 完成(只读复核文档) | host | 2026-10-21 | 复核文档 | +| 实施计划 | — | 不适用 | — | — | 无代码变更 | +| 实施与自检 | — | 不适用 | — | — | 无代码变更 | +| 正式测试与验收 | c5e8b47 | CI 待核 | CI | — | make test + make build | +| 代码 Review | 511e079→c5e8b47 | 通过(1 阻塞已修) | 独立 code-reviewer 子会话 | 2026-10-21 | 见合入与清理 | +| 合入 | 待定 | 待执行 | — | — | — | +| 合入核验与收口 | 待定 | 待执行 | — | — | — | + +## 探索试验与迭代 + +| 增量/试验 | 假设 | 范围 | 判断和停止条件 | 授权/决策依据 | 结果 | 变更影响 | 需重审补测 | +|---|---|---|---|---|---|---|---| +| P2 A01 付费复验(前序已授权) | 证据说明收紧后 A01 不再被拒 | 3 次请求 / 17955 tokens,守卫 30000 | 0 拒绝且路由契约通过 | 用户「批准」 | NOT_PASS:第 3 次 C8;2 检查点 0 拒绝;收据 ec02e80753db2f85 | 证据合规已达成,阻塞转为 final-only 阈值 | 修正后需一次付费复验(待授权) | +| C8 零付费复核 | C8 来自 schema 不符 | 只读代码 + P2 记录 | 能否确定成因 | 用户选择「1」 | 否定假设:C8=工具名未声明(final-only 移除检查点工具) | 无代码变更 | 否 | + +## 同步记录 + +| 节点 | sync_base_sha | tested_head_sha | checked_at | +|---|---|---|---| +| 启动 | a9566a68505ac97dead15ed3b5672954f15cea1c | a9566a68505ac97dead15ed3b5672954f15cea1c | 2026-10-21T02:28:21Z | + +## 证据(Evidence) + + +| 时间(UTC) | 命令 | 被测HEAD | exit | 来源 | sha256(16) | +|---|---|---|---|---|---| + +## 交付调度 + +- 调度状态:窗口已领取;调度记录:issue #518 评论 +- entry_id:mq-dev-20261021-fast-slow-o2-c8-review-01;attempt_id:01;窗口执行者:当前主模型 +- 固定候选:无(base/head、组件与相关配置引用实际尝试) +- 调度依据:policy/delivery.md#合入调度 +- 固定后证据:源码外 RECEIPT;实际结果后按授权原样导入和闭合 + +## 结果与验证 + +- 结果:C8 成因为 `publish_work_checkpoint` 在 final-only 请求中未声明(已存 2 个检查点与预算预留两条件同时触发 final-only),A01 预算只够两轮检查点加一次最终答复,与任务指令 reading→crosscheck 冲突;「schema 不符交给工具层」不适用且不建议实施。P2:3 次付费请求、17955 tokens、NOT_PASS(C8),证据合规达成(2 检查点 0 拒绝),路由文件已删除;本次复核零付费。 +- 验证:只读复核,依据见复核文档;模型复验 NOT_RUN(未授权) +- 影响与剩余项:推荐 F1(宿主判定下一次为 final-only 时由工具结果告知,并使任务指令与预算一致),需单独授权实施及一次付费复验 + +## 规划进展与下一步 + +- 本次推进/剩余:C8 成因已确定;O2 A01 付费通过仍待修正与复验 +- 首选下一任务:F1 final-only 上限告知(Backend) +- 推荐依据:不动契约、零付费单测可验证宿主侧行为 +- 前置条件/待确认:用户授权实施 F1 与之后的付费复验 +- 预期产物/验收条件:final-only 前一次检查点结果含提示;付费复验无 C8 +- 重复任务核对:无在途同题任务 +- 启动授权:未授权(建议不自动启动新任务,仍须明确授权) + +## 合入与清理 + +- Review 记录:全新独立 code-reviewer 子会话(fresh_session=true,session id not-observable,仅收目标/base a9566a6/head 511e079/diff/源码与 provider-records),只读重算 E4 并核对行号。阻塞 1:final-only 同时由预算预留条件触发(outputCap 4000),已在 c5e8b47 修正 E1/E4/E5/F1/F2 与卡;次要:缓存归因、argschema properties 前提已修,卡头权威仓地址为 task-start 生成值未改 +- 冲突记录:NOT_RUN(最新目标同步、冲突处置、组合兼容核验及复审/补测) +- CI 记录:NOT_RUN(当前 HEAD 完整 SHA、全部必需检查、运行链接、执行身份及 GATE 结果) +- 合入记录:NOT_RUN(交付授权范围、PR、被核验 HEAD、合入 SHA、目标分支及内容核验) +- 清理记录:NOT_RUN(授权依据、写者退出确认、worktree/分支/任务卡处置) + + +```json +{ + "summary_schema": 1, + "source": "SELF", + "timestamp": "2026-10-21T02:27:26.256614+00:00", + "command": "make precheck", + "exit_code": 0, + "cwd": "/home/weichen/projects/Agent-System-Dev", + "before_head": "a9566a68505ac97dead15ed3b5672954f15cea1c", + "after_head": "a9566a68505ac97dead15ed3b5672954f15cea1c", + "branch": "main", + "target_branch": "main", + "target_head": "a9566a68505ac97dead15ed3b5672954f15cea1c", + "root_target": "main", + "immediate_target": "main", + "before_tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "after_tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "output_tail": [ + "make[1]: Entering directory '/home/weichen/projects/Agent-System-Dev'", + "[repo] branch=main head=a9566a6850", + "[remote] origin/main=a9566a6850 ahead=0 behind=0", + "[tree] clean submodules_drift=0 uninit=0", + "[worktrees] linked=3", + "[cards] 已合入未闭合任务卡:feature-project-access-lifecycle.md——make task-close 回填归档(主检出运行)", + "[initiatives] local cards (not authoritative): none", + "[hooks] core.hooksPath=scripts/hooks(pre-commit/post-merge 实际接线)", + "[facts] policy/facts.md 6 条事实均在有效期内", + "[required-reading] core/baseline.md, workflows/delivery.md §1, policy/delivery.md", + "[R0] a9566a6850(完整:a9566a68505ac97dead15ed3b5672954f15cea1c)", + "[worktree] before-sync: recursive component checks passed", + "[verdict] READY — 保留本次 precheck receipt 后建任务工作区:PRECHECK_RECEIPT=/tmp/task-precheck.json make task-start NAME=feature/your-branch", + "make[1]: Leaving directory '/home/weichen/projects/Agent-System-Dev'" + ], + "output_sha256": "a891afd4f3610dd6ce63a808b10cc78b8c6c411454f4851c724ac3c6213ac62a", + "receipt_sha256": "e58dbf12cb9208a2e86ed98f3d39405cb8a8278205d60f1bfaeae9852d264ac2", + "receipt_path": "/home/weichen/.cache/agent-system-dev/evidence/e58dbf12cb9208a2e86ed98f3d39405cb8a8278205d60f1bfaeae9852d264ac2.json" +} +``` + +## 闭合记录(合入前折叠) + +- 本卡在 PR #667(https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/667)合入前闭合并归档,随该 PR 一同合入。 +- 该 PR 的合并提交即本任务的落地记录。 +- 合入后无需回填,也无需单独的闭合 PR。 diff --git a/docs/superpowers/specs/2026-10-21-fast-slow-o2-c8-review.md b/docs/superpowers/specs/2026-10-21-fast-slow-o2-c8-review.md new file mode 100644 index 00000000..16f92273 --- /dev/null +++ b/docs/superpowers/specs/2026-10-21-fast-slow-o2-c8-review.md @@ -0,0 +1,50 @@ +# O2 A01 P2 复验 C8 零付费复核 + +日期:2026-10-21;性质:只读复核(零付费、不改代码);对象:Backend `dfb31da20ab0276ea8e167cf26675f7ac95a1b26`、agent-native `2fc66be65201232ea38ba64d457efad5565d869d`、P2 收据 `ec02e80753db2f85…`、provider-records `add19bd1500127bb…`。 + +## 结论 + +P2 第 3 次请求的 C8 是**工具名未声明**,不是参数 schema 不符。第 3 次请求被宿主切到 final-only,从工具声明里移除了 `publish_work_checkpoint`;模型按任务指令(reading → crosscheck)仍去调用它。final-only 由两个条件同时触发:已保存 2 个检查点;30000 预算在 4000 输出上限下只够再留一次最终答复。即使只存了 1 个检查点,第 3 次也会是 final-only。根因是:A01 的预算只够两轮检查点请求加一次最终答复,任务指令却期望至少两个阶段再加最终答复;同时模型无视了 final-only 系统提醒。 + +所以「schema 不符时不丢弃整轮、交给工具层返回可修正错误」这一改法**不适用于本次失败**,即使实施也不会让 P2 通过。 + +## 依据 + +| # | 事实 | 来源 | +|---|---|---| +| E1 | 物料子 Agent 在 `SavedCheckpoints >= 2` 或 `remaining <= 2*(LastPrompt+OutputCap+margin)` 时进入 final-only | Backend `internal/runtime/material_final_reserve.go:21-30` | +| E2 | final-only 请求从 `requestDecls` 中删除 `publish_work_checkpoint`,并插入系统提醒「不再发布检查点」 | Backend `internal/runtime/sub_loop.go:125-148` | +| E3 | P2 在第 3 次请求前已保存 2 个检查点(均 ok、0 拒绝),且 `phaseId` 只出现过 `reading` | P2 数据库 events | +| E4 | 第 3 次请求的预算核算:已用 12317、上次 prompt 5926、outputCap 4000、limit 30000。剩余 17683 > 5926+1481,不触发 stop;17683 <= 2×(5926+4000+1481)=22814,且已存 2 个检查点,两个条件都触发 final-only | provider-records 第 1、2 次 usage 与 outputCap,按 E1 公式计算 | +| E5 | 第 3 次 prompt_tokens 为 5160,比第 2 次的 5926 少。历史变长、prompt 反而变短,与「删去大段检查点工具声明」一致。cache_read 从 5503 跌到 128,由删声明与在首条 system 后插入提醒共同造成 | provider-records 第 2、3 次;`sub_loop.go:137-148` | +| E6 | 第 3 次思考末句为「Now crosscheck phase.」,随后发出一个 1000 字节、可解析的工具调用;任务指令要求 crosscheck 阶段调用 `publish_work_checkpoint` | P2 数据库;Backend `internal/runmgr/material.go:306` | +| E7 | C8 = `callsDeclared` 失败,即工具名不在本次请求声明中,或顶层 `argschema.Validate` 失败 | agent-native `runtime/llm/route_contract.go` `check`/`callsDeclared` | + +E1、E2、E4 是确定性代码路径,可以确定第 3 次请求未声明 `publish_work_checkpoint`。E5、E6 佐证模型调用的就是它。原始参数按设计不落盘,所以「调用名是 `publish_work_checkpoint`」属于高置信推断,未经原文核实。 + +## 对「schema 不符交给工具层」的只读评估 + +- **不解决本次问题**:本次是名称未声明,不经过 schema 分支。 +- **schema 分支本身风险有限,但收益也有限**:`argschema.Validate` 只校验顶层,即必填项非空、顶层原始类型,以及在声明了 `properties` 时拒绝未声明的顶层键;不递归 `findings`。证据结构等深层错误本来就由工具层返回可修正结果。 +- **改契约语义需要设计评审**:C8 是 O2 已批准契约的一项。放宽后,一次顶层违规会从「终态失败」变成「多一轮请求」,影响付费上限的估算。 +- **即使没有契约也是终态**:final-only 阶段调用检查点时,`runTool` 返回可修正错误,但同时置位 `finalOnlyRejected`;下一次请求直接以 `checkpoint requested after final-only transition` 结束(`sub_loop.go:109-110`、`380-388`)。所以单改契约不能把它变成可恢复路径。 + +结论:不建议实施该改法。 + +## 可选修正(未实施,需单独授权) + +| 选项 | 做法 | 影响 | 建议 | +|---|---|---|---| +| F1 | 让模型提前知道下一次是 final-only:宿主按 E1 的两个条件,判定下一次请求将是 final-only 时,在当次检查点工具结果里写明「下一步直接写最终结论,不再发布检查点」;任务指令把阶段要求改为与预算一致(例如第 2 次检查点即 crosscheck,或预算紧时允许跳过)。本次的 final-only 系统提醒已被无视,所以工具结果提示是否有效必须付费复验 | 只改 Backend 物料提示与工具结果文字,不动契约;零付费单测可以验证宿主侧行为 | **推荐** | +| F2 | final-only 阶段保留检查点声明,由工具层拒绝,并去掉 `finalOnlyRejected` 终止 | 避免 C8,但每次违规多一轮付费请求,可能击穿最终答复预留;缓存还受插入提醒影响,不会因此稳定 | 备选 | +| F3 | C8 对未声明名称改为可修正 | 削弱路由契约,与 O2 设计相悖 | 不建议 | + +F1、F2 是否真能让模型遵守,只能靠付费复验判定;零付费单测只能证明宿主侧行为。 + +## P2 花费与结论(记录) + +- 授权:用户批准一次 A01 付费复验(label `approved-o2-a01-evidence`,30000 tokens 守卫)。 +- 花费:3 次付费请求,共 17955 tokens(5873 + 6444 + 5638),未超守卫。 +- 结论:NOT_PASS。路由契约在第 3 次请求判 C8(`terminal_error`),子运行以 `tool call stream ended before [DONE]` 失败,outcome 为 partial。 +- 证据合规目标已达成:2 个检查点,0 拒绝,`material_record` 均未附 evidence。 +- 路由文件已在复验后删除;本次复核没有发起任何付费请求。