Record O2 C8 zero-paid review findings #667
@@ -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)
|
||||
|
||||
<!-- CMD="<命令>" make evidence 写入;手抄/转写输出视为无效证据(AGENTS.md 证据与验证门禁)。 -->
|
||||
| 时间(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/分支/任务卡处置)
|
||||
|
||||
<!-- Local receipt: SELF. Digests detect corruption; they do not authenticate a reviewer or CI. -->
|
||||
```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。
|
||||
@@ -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。
|
||||
- 路由文件已在复验后删除;本次复核没有发起任何付费请求。
|
||||
Reference in New Issue
Block a user