Files
Agent-System-Dev/docs/superpowers/specs/2026-10-20-fast-slow-o2-i1-review.md
T
weichenandCursor ec0bf4b42e Record O2 I1 stage 6 approval and Agent-Native merge
Why: The user approved O2 I1 at stage 6 on 2026-10-20, accepted the C2 numbering, and asked to start I2.
Evidence: Agent-Native #48 merged at 2fc66be after head 899fd70 status success; merged tree 720ec93 matches the pre-merge merge-tree.
Impact: Task card and review package only.
Refs: Agent-Native#48, Agent-System-Dev#647
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-20 05:54:51 +00:00

4.6 KiB
Raw Blame History

快慢通道 O2 I1(Agent-Native route_contract_eof):阶段 6 评审包

  • 状态:用户阶段 6 通过(2026-10-20),接受第 3 节第 1 条的 C2 编号,并要求启动 I2。Agent-Native #48 已合入 main(2fc66be)。I3(Dev 改钉)待 I2 后启动,P1 付费探针另提资源方案。
  • 日期:2026-10-20;作者:host;Dev 任务:feature/fast-slow-o2-i1-agent-native。
  • 依据:阶段 4 方案与阶段 5 计划 §2(用户 2026-10-20 通过;C2 同时接受 http2_stream 与 known_length+match)。
  • 交付对象:Agent-Native 草稿 PR #48,base 9c24e22(origin/main),head 899fd70。

1. 交付内容

方案条目 实现 位置
路由合同与身份绑定(§4.1) RouteContractEOF{Model, BaseURL, IdentitySHA256}、RouteContractIdentity、NormalizeRouteBaseURL(仅 https,含 userinfo/query/fragment 一律不匹配);Client.RouteContract 为 nil/零值即关闭;重定向逐项比较 scheme、host、port、path runtime/llm/route_contract.go、client.go
解析器延后判定(计划 §2.2) 公开 ParseSSE 签名与零值行为不变;内部 parseSSE(…, sseHooks) 只在“有工具且缺 [DONE]”时把成功候选与今天的失败事件一起交给传输层;新增 finishChunks、multiChoice、fragmentAfterFinish 统计 runtime/llm/sse.go
放行条件 C1–C9(§4.2) 按顺序判定,记录第一个不满足的编号;放行时 StreamComplete=false、CompletionBasis=route_contract_eof route_contract.go check
参数 schema 子集(§4.3) 新包 runtime/argschema.Validate,由 validateArgs/matchesType 逐字迁移;registry 改为委托 runtime/argschema/、runtime/tools/registry.go
可观测性(§4.4) Event.CompletionBasis;TerminalObservation.completionBasis/contractCheck(仅枚举值);[DONE] 成功路径记 done_marker types.go、client.go

2. 验证

  • 实施:Cursor worker(agent-exec,attempt 2 success;attempt 1 因单元包 allowed_paths 误用 ** 被判 scope-expansion,修正写法后经用户授权全新重跑),agent-exec apply 快进集成。
  • host 验证(SELF)@899fd70:改动文件 gofmt 合格;git diff --check;go vet ./runtime/...;go test ./runtime/llm/... ./runtime/argschema/... ./runtime/tools/... -count=1(另跑 -race)与 go test ./... -count=1 全部通过。
  • CI(GATE):PR #48 head 899fd70 三项检查 success(ci / vet-and-test、ci / docker-checkout-hostgateway、governance / governance)。
  • 独立 Review(全新会话 code-reviewer,只接收需求、base/head 与 diff;评审者自跑为 SELF):PASS,无阻塞项。确认零值合同行为不变;拒绝事件与合同关闭事件除 contractCheck 外 reflect.DeepEqual;argschema 与旧实现逐行一致;无数据竞争;计划 §2 测试矩阵每一行都有带断言的用例,并同时断言 Usage 保留与放行次数。

3. 需人审确认与非阻塞项

  1. C3 行的编号差异:计划写的是 HTTP/2 RST_STREAM/中途断连期望 C3,实现返回 C2。原因是 C2(传输边界)先于 C3 判定,断流时没有见到 EOF,先在 C2 失败。结论同样是拒绝,contractCheck 记录的是“第一个不满足的条件”,不一定是根因。请确认接受。
  2. 无工具的错误终态也会带 contractCheck(非阻塞):合同开启时,纯文本流遇到供应商错误这类终态也会补一次判定(如记为 C2),这类流本来就不可能放行。不影响验收条件 3,也不泄漏内容;可在后续把补判限定为含工具调用的终态。
  3. 重复 finish_reason 会被 C4 拒绝(非阻塞,失败关闭):若供应商在 usage 块里重复 finish_reason,一律拒绝。MiniMax 真实流是否这样,列为 P1 付费探针的观察点。
  4. 测试可加强(非阻塞):release/http2 与 close-delimited 用例可直接断言 BodyBoundary.FramingClass;补一个“合同开启时纯文本流不变”的回归用例(评审者已用临时探针确认行为不变)。

4. 下一步(通过后)

  1. 合入 Agent-Native #48(组件仓,无需 #518 窗口)。
  2. 启动 I2(Backend:系统层配置键、openLLMClient 按身份挂合同、透传 completionBasis;启动前核对 Backend 是否有读 StreamComplete 的工具门控)。
  3. I3 Dev 改钉组合验证;P1 另提资源方案。