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>
4.6 KiB
4.6 KiB
快慢通道 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),head899fd70。
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. 需人审确认与非阻塞项
- C3 行的编号差异:计划写的是 HTTP/2
RST_STREAM/中途断连期望 C3,实现返回 C2。原因是 C2(传输边界)先于 C3 判定,断流时没有见到 EOF,先在 C2 失败。结论同样是拒绝,contractCheck记录的是“第一个不满足的条件”,不一定是根因。请确认接受。 - 无工具的错误终态也会带
contractCheck(非阻塞):合同开启时,纯文本流遇到供应商错误这类终态也会补一次判定(如记为C2),这类流本来就不可能放行。不影响验收条件 3,也不泄漏内容;可在后续把补判限定为含工具调用的终态。 - 重复
finish_reason会被 C4 拒绝(非阻塞,失败关闭):若供应商在 usage 块里重复finish_reason,一律拒绝。MiniMax 真实流是否这样,列为 P1 付费探针的观察点。 - 测试可加强(非阻塞):
release/http2与close-delimited用例可直接断言BodyBoundary.FramingClass;补一个“合同开启时纯文本流不变”的回归用例(评审者已用临时探针确认行为不变)。
4. 下一步(通过后)
- 合入 Agent-Native #48(组件仓,无需 #518 窗口)。
- 启动 I2(Backend:系统层配置键、
openLLMClient按身份挂合同、透传completionBasis;启动前核对 Backend 是否有读StreamComplete的工具门控)。 - I3 Dev 改钉组合验证;P1 另提资源方案。