Merge pull request 'Add fast-slow completion signal evaluation for user decision' (#633) from feature/fast-slow-completion-signal-eval into main
ci / svc-realcombo (push) Successful in 4m13s
ci / test (push) Failing after 9m33s
ci / test-pg (push) Successful in 12m26s

This commit was merged in pull request #633.
This commit is contained in:
2026-10-19 15:00:04 +00:00
2 changed files with 230 additions and 0 deletions
@@ -0,0 +1,160 @@
# feature/fast-slow-completion-signal-eval 任务卡
任务主记录:PR #633 https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/633;状态:已完成(合入前闭合);owner:weichen
## 基线与授权
- 权威仓:ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Dev.git;目标分支:main;R0(initial_base_sha)= 46e331a7a81c94c6f5881c997ae0aca45664c830
- 工作区:/home/weichen/projects/Agent-System-Dev-wt-feature-fast-slow-completion-signal-eval(worktree);分支:feature/fast-slow-completion-signal-eval
- 分支类型:standalone;root_target:main;immediate_target:main;accepting_requirements:false
- 需求分流:verdict=NEW;selected_initiative=无;requirement_sha256=9ea2d573b0e9f5d8a54ad2fc9d07ce8363ffcdee483232c63b6f4feb8f67b430;triage_receipt=/tmp/fscs-triage-20261019.json;receipt_sha256=be542a3a92d5b61f37d470092fea2ada8773b0d55d44fc455eb772495704f2cf
- 授权与交付终点:用户 2026-10-19 在遗留项推进中选定“快慢通道:评估是否把 tool_calls + Usage + 干净 EOF 认作该供应商的完成信号(属于口径变更)”;终点为评估文档经 Dev PR 合入并提交用户口径决策。未授权:产品代码、任何真实模型/付费请求、A01、部署。
- 交付模式:goal-first(目标、范围和交付终点一次确认;范围内连续推进)
- 实施执行:agent-per-unit(配置:AGENT-EXECUTION.md)
- 合入执行:agent(已授权交付范围内,Review 通过、冲突解决且当前 HEAD 的 CI 通过后合入)
- 人工决策点:仅限目标/范围/验收变更、重大取舍、高后果操作或无法自动判定的业务验收
- 当前阶段:方案设计(评估稿);当前增量:I1(评估文档)
- 流程依据:仓库根目录 policy/delivery.md(归档后仍按仓库根目录定位)
## 目标与非目标
- 目标:形成可复核的口径评估(证据、供应商文档、对照 r0.6 四前提、风险、O1/O2/O3 方案与验证设想),交用户决策。
- 非目标:不改 Agent-Native/Backend 终态门禁,不新增付费请求,不改已批准的 r0.6 设计。
## Agent 实施收据
路由与 fail-stop 规则见根目录 AGENT-EXECUTION.md 与 policy/delivery.md;每次尝试一行,原始日志留在源码外收据路径。
| 单元 ID | 预期范围 | 配置摘要 | 角色 | 候选顺序 | attempt | CLI/模型 | 终态 | transport | fallback | 源码外收据路径 |
|---|---|---|---|---|---|---|---|---|---|---|
| 不适用 | 仅 host 豁免路径 docs/superpowers/specs/** 与 .task/** | — | — | — | — | — | — | — | — | — |
## 关联方向与规划
- 适用状态:适用
- 主记录路径/版本:modules/documents/docs/proposals/2026-10-14-fast-slow-u3-r06-transport-completeness-design.md(阶段 4 已批准);.task/archive/feature-fast-slow-u2-u3-plan.md(部分收口)
- 对应里程碑:快慢通道 U3 真实模型质量(未解决)
## 需求分析
| ID | 描述 | 项目符合度及依据 | 优先级 | 验收条件 | 依赖 | 结论 |
|---|---|---|---|---|---|---|
| R1 | 评估限路由完成信号口径 | 符合:r0.6 设计第 41 行定义提出等价终态的四前提 | P1 | 评估稿含证据、供应商文档核对、四前提逐项评估、风险与 O1–O3 | 无 | 纳入 |
## 方案与计划
- 方案引用:docs/superpowers/specs/2026-10-19-fast-slow-completion-signal-evaluation.md
- 实施计划引用:不适用(仅评估文档;选 O2 后另立计划)
- 测试计划引用:不适用(文档链接与 make test 由 CI 覆盖)
## 阶段记录
| 阶段 | 对象版本 | 状态 | 决策/执行者 | 时间 | 依据 |
|---|---|---|---|---|---|
| 需求拆解 | R0 46e331a | 完成 | host | 2026-10-19 | 用户选定评估项 |
| 需求评估 | 待定 | 待执行 | — | — | — |
| 需求表确认 | 待定 | 待执行 | — | — | — |
| 方案设计 | 评估稿 | 完成(待用户口径决策) | host | 2026-10-19 | 本卡 R1 |
| 实施计划 | 待定 | 待执行 | — | — | — |
| 实施与自检 | 待定 | 待执行 | — | — | — |
| 正式测试与验收 | 待定 | 待执行 | — | — | — |
| 代码 Review | 待定 | 待执行 | — | — | — |
| 合入 | 待定 | 待执行 | — | — | — |
| 合入核验与收口 | 待定 | 待执行 | — | — | — |
## 探索试验与迭代
| 增量/试验 | 假设 | 范围 | 判断和停止条件 | 授权/决策依据 | 结果 | 变更影响 | 需重审补测 |
|---|---|---|---|---|---|---|---|
| 不适用 | — | — | — | — | — | — | — |
## 同步记录
| 节点 | sync_base_sha | tested_head_sha | checked_at |
|---|---|---|---|
| 启动 | 46e331a7a81c94c6f5881c997ae0aca45664c830 | 46e331a7a81c94c6f5881c997ae0aca45664c830 | 2026-10-19T14:28:50Z |
## 证据(Evidence)
<!-- CMD="<命令>" make evidence 写入;手抄/转写输出视为无效证据(AGENTS.md 证据与验证门禁)。 -->
| 时间(UTC) | 命令 | 被测HEAD | exit | 来源 | sha256(16) |
|---|---|---|---|---|---|
## 交付调度
- 调度状态:未入队;调度记录:无
- entry_id:无;attempt_id:无;窗口执行者:无
- 固定候选:无(base/head、组件与相关配置引用实际尝试)
- 调度依据:policy/delivery.md#合入调度
- 固定后证据:源码外 RECEIPT;实际结果后按授权原样导入和闭合
## 结果与验证
- 结果:
- 验证:<结论摘要 PASS/FAIL/SKIP/NOT_RUN 逐项;逐条证据由 make evidence 写入上方证据表>
- 影响与剩余项:
## 规划进展与下一步
- 本次推进/剩余:待核对(依据实际成果更新适用方案/规划)
- 首选下一任务:待核对(无适用规划、已完成或受阻时如实说明,不虚构任务)
- 推荐依据:待填写
- 前置条件/待确认:待核对
- 预期产物/验收条件:待定义
- 重复任务核对:待核对(已有/在途任务、PR 与规划记录)
- 启动授权:未授权(建议不自动启动新任务,仍须明确授权)
## 合入与清理
- Review 记录:NOT_RUN(审阅智能体/平台身份、base/head、结论、问题闭合及重放依据)
- 冲突记录: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-19T14:28:00.109630+00:00",
"command": "make precheck",
"exit_code": 0,
"cwd": "/home/weichen/projects/Agent-System-Dev",
"before_head": "46e331a7a81c94c6f5881c997ae0aca45664c830",
"after_head": "46e331a7a81c94c6f5881c997ae0aca45664c830",
"branch": "main",
"target_branch": "main",
"target_head": "46e331a7a81c94c6f5881c997ae0aca45664c830",
"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=46e331a7a8",
"[remote] origin/main=46e331a7a8 ahead=0 behind=0",
"[tree] clean submodules_drift=0 uninit=0",
"[worktrees] linked=3",
"[recycle] merged un-recycled branches: feature/layered-python-env",
"[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] 46e331a7a8(完整:46e331a7a81c94c6f5881c997ae0aca45664c830)",
"[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": "3b728a0b62ddb071c6fcb0f74110b2a3da23e5670b2f3fd2bb4364e3217d52ba",
"receipt_sha256": "2073d669c43e38ba9881008c1dccf6040721142a6d55a55ee618b3c315781d4d",
"receipt_path": "/home/weichen/.cache/agent-system-dev/evidence/2073d669c43e38ba9881008c1dccf6040721142a6d55a55ee618b3c315781d4d.json"
}
```
## 闭合记录(合入前折叠)
- 本卡在 PR #633(https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/633)合入前闭合并归档,随该 PR 一同合入。
- 该 PR 的合并提交即本任务的落地记录。
- 合入后无需回填,也无需单独的闭合 PR。
@@ -0,0 +1,70 @@
# 快慢通道:MiniMax 工具流完成信号口径评估
- 状态:**评估稿,待用户口径决策。** 本文不授权产品代码改动、付费请求、A01 复验、合入产品变更或部署;用户选定方向后,按 policy/delivery.md 另立方案/计划评审。
- 日期:2026-10-19;执行者:host(只读调查与文档撰写);来源等级:SELF(本地收据与当日抓取的公开文档,可按“复核方法”重放)。
- 上下文:[r0.6 传输完整性设计](../../../modules/documents/docs/proposals/2026-10-14-fast-slow-u3-r06-transport-completeness-design.md)(已获阶段 4 批准)、[U2/U3 核验报告](../../../modules/documents/docs/reports/2026-10-13-fast-slow-u2-u3-validation.md)、归档任务卡 [feature-fast-slow-u2-u3-plan](../../../.task/archive/feature-fast-slow-u2-u3-plan.md)(部分收口:零付费机制已合入,真实模型质量未解决)。
## 1. 问题
现行门禁:工具流缺少 SSE 字面 `[DONE]` 时,工具一律不放行、不执行。当前 MiniMax-M3 路由在三次独立观察中都以“`finishReason=tool_calls` + Usage + 干净 EOF、无 `[DONE]`”结束,因此真实 A01 在该路由上无法跑通。需要决定:是否为该路由定义一个**限路由的等价完成信号**,还是保持拒绝或更换路由。
## 2. 已有证据
| 观察 | 对象 | 结果 |
|---|---|---|
| r0.4 A01 | 两次付费 run、三次调用 | 返回 `tool_calls` 与 Usage,客户端未见 `[DONE]`;工具安全拒绝 |
| r0.5 短探针 | Dev `0959e1c`,513 tokens | HTTP 200、`finishReason=tool_calls`、`clean_eof`、最后一帧 JSON 完整、Usage 存在、`StreamComplete=false`;放行/执行 0/0 |
| r0.6 短探针 | 收据 `fast-slow-u3-r06-20261019/private-probe/run-001/terminal-receipt.json`,472 tokens | HTTP/2、`framingClass=http2_stream`、`eofSeen=true`、`lengthRelation=unknown`、`finishReason=tool_calls`、Usage 存在、`toolFragments=1`、参数 28 字节且为 JSON 对象、`tailEventKind=json_frame`;`diagnosis=eof_unproven`,放行/执行 0/0 |
三次观察一致:**缺 `[DONE]` 是该路由的稳定行为**,不是长任务或偶发中断特有的现象。r0.6 的分层观察进一步表明响应体以 HTTP/2 流正常结束,而非连接异常关闭。
## 3. 供应商文档核对(2026-10-19)
- MiniMax 对话补全 OpenAPI 规范 `https://platform.minimaxi.com/docs/api-reference/text/api/openapi-chat-openai.json`(当日 WebFetch 文本 SHA-256 `d73496802f4af2b38d0a1d56afdf6ed35e4cc3a7aac44e597b355c6f8dcfe9af`):
- 流式响应声明为 `text/event-stream`,元素模式为 `ChatCompletionChunk`。
- 流式块的 `finish_reason` 说明为“生成停止的原因,**未结束时为 null**”。
- `stream_options.include_usage` 控制是否在流中返回用量。
- 全文**没有出现 `[DONE]`**;流式示例以一个带 `finish_reason` 的块结束。
- [OpenAI SDK 接入页](https://platform.minimaxi.com/docs/api-reference/text-openai-api)只给出用 SDK 迭代流的示例,未说明结束哨兵。官方 SDK 在流正常结束时停止迭代、不要求 `[DONE]`——这是对 SDK 行为的推断,**不能视为供应商对完成语义的承诺**([未经证实])。
结论:供应商以“`finish_reason` 非空”表示生成结束,有可核验的文档依据;但文档**未写明**是否发送 `[DONE]`、Usage 块相对 `finish_reason` 块的顺序,也没有版本化契约。
## 4. 对照 r0.6 已批准设计的四个前提
r0.6 设计规定,提出等价终态规则至少要同时满足以下四项,且满足后也只进入下一轮方案评审:
| 前提 | 现状评估 |
|---|---|
| ① 可复核的供应商契约,说明无 `[DONE]` 时如何表示业务完成 | **部分满足**:OpenAPI 规范写明 `finish_reason` 非空即结束、全文无 `[DONE]`;缺 Usage 顺序与版本承诺 |
| ② 本地解析器能识别约定的终止形式,并有正常/截断/半帧/缺 Usage/重定向/取消的正反例 | **可零付费实现**:Agent-Native `ParseSSE` 已有 `finishReason`、Usage、帧完整性与工具片段观察,补夹具即可 |
| ③ 客户端可区分“按协议结束”与“未知关闭”,工具身份与参数完整性可验证,预算/停止门禁成立 | **基本具备**:r0.6 已能区分 `http2_stream`/`known_length`/`close_delimited`/`unknown`;工具 ID/名称/JSON 对象可校验;**尚无参数 schema 校验** |
| ④ 规则只绑定经核验的路由身份 | **可实现**:按模型名 + 主机 + 受保护路由文件哈希绑定,不泛化到其他 OpenAI 兼容服务 |
## 5. 风险分析
- **截断被误判为完成**:若上游在 `finish_reason` 块之前截断,就不会出现非空 `finish_reason`,规则自然拒绝。残余风险在于供应商先发 `finish_reason`、后补参数片段——文档与三次观察都没有显示这种顺序,但也无法证伪,可通过“`finish_reason` 之后不得再有工具片段”的约束拒绝。
- **未知关闭**:`close_delimited`、`unknown` 或读取错误无法区分正常结束与中断,必须继续拒绝。r0.6 探针属于 `http2_stream` 正常结束,不在此列。
- **参数语义**:JSON 对象可解析不等于参数符合工具 schema。放宽终态后,参数错误会直接进入工具执行,建议同轮引入 schema 校验。
- **供应商行为漂移**:文档无版本承诺,路由身份变化(模型、主机、路由文件哈希)必须使规则失效并回到拒绝。
## 6. 可选方案
| 方案 | 内容 | 代价 | 评估 |
|---|---|---|---|
| O1 保持拒绝 | 维持现行门禁;该路由不可用于工具流 | 零 | 最安全;真实 A01 在该路由上继续无法跑通 |
| O2 限路由等价终态 | 仅对核验过的 MiniMax 路由,在下述全部条件成立时视为完成:HTTP/2 流正常结束或已知长度且字节相符;恰好一个非空 `finish_reason=tool_calls` 块;请求开启 `include_usage` 且收到 Usage;`finish_reason` 之后无工具片段;全部工具调用 ID/名称齐全、参数为 JSON 对象并通过 schema 校验;最后一帧完整、无取消/读错。默认关闭的配置开关;终态记录单独标为 `route_contract_eof`,不与 `[DONE]` 混同 | 零付费:解析器夹具与 schema 校验;付费:1 次短工具探针 + 1 次 A01,需单独资源提案与路由文件 | **推荐进入下一轮方案评审**:前提 ①–④ 大体具备,风险可由条件组合限定 |
| O3 更换路由 | 改用已验证会发送 `[DONE]` 的模型路由 | 新模型质量基线、路由配置与资源评审 | O2 被否或供应商行为不稳定时的后备 |
## 7. O2 的验证设想(供下一轮计划细化)
1. 零付费:`httptest`/TLS HTTP/2 假流覆盖——有 `[DONE]`;无 `[DONE]` 但满足全部条件(放行);缺 Usage;Usage 在 `finish_reason` 之前或之后;`finish_reason` 后追加工具片段;半帧;参数非 JSON 或不符 schema;`close_delimited`/`unknown`;取消;路由身份不符(以上除第二项外均拒绝),并核对放行/执行次数与后继请求数。
2. 付费(需另行批准):固定新候选后 1 次短工具探针,确认 `route_contract_eof` 放行且工具执行一次;再 1 次 A01 验证真实质量。预算按 r0.5/r0.6 探针(约 500 tokens)与 r0.4 A01 规模另行提案。
## 8. 需要用户决定
- 选 O1、O2 或 O3。选 O2 时,下一步是编写方案/计划(阶段 4/5 人工评审),而非直接改代码。
## 复核方法
- 探针收据:读取 `~/.local/share/agent-system-evidence/fast-slow-u3-r06-20261019/private-probe/run-001/terminal-receipt.json` 的字段(不含正文)。
- 供应商文档:重新抓取上述 OpenAPI 规范,检索 `[DONE]`、`finish_reason`、`include_usage`;内容变化时以新抓取为准并更新本节。