修复回归 + 双 transcript 收口
B7 这一周从安全(Day 61-66:OAuth 2.1 RS + 审计)走到评测(Day 67-69:fail-closed gate + 红测)。Day 69 已证明「坏改动→红」成立;今天 Day 70 收口:revert 那个回归改动,让 pnpm eval:gate 转绿,证明「好改动→绿」也成立——「坏→红、好→绿」双向都成立,门禁才完整可信。同时把 Day 65「被拒(403)」和
阶段: B7 · OAuth 2.1 + MCP 安全 + CI gate(Day 61-70) 标签: #green-revert #portfolio-index #b7-retro #aisa
今日导引(由浅入深)
B7 这一周从安全(Day 61-66:OAuth 2.1 RS + 审计)走到评测(Day 67-69:fail-closed gate + 红测)。Day 69 已证明「坏改动→红」成立;今天 Day 70 收口:revert 那个回归改动,让 pnpm eval:gate 转绿,证明「好改动→绿」也成立——「坏→红、好→绿」双向都成立,门禁才完整可信。同时把 Day 65「被拒(403)」和 Day 66「成功(200)」两份 OAuth transcript 归档进作品集索引,形成可链接证据。在 B1→B18 曲线上,这是 B7 的终点、也是 AISA 作品集「安全+评测」两根支柱的封顶。明天 Day 71 起进 B8(真 HTTP API + 流式 + Docker),把这套底座对外暴露成可调用的服务。最小可判定产出:一次绿色 eval-gate run + 归档好的双 transcript 索引 + B7 复盘。
由浅入深三层
- 浅:Day 69 让 gate 红了,证明它能拦坏改动,似乎够了。
- 中:只验「坏→红」不够——若 gate 过严,正常改动也会被拦(阻断一切开发)。还要验「好→绿」。
- 深:revert 回归使 gate 转绿,「坏→红 ∧ 好→绿」双向都成立,门禁才完整可信;顺带证明回归改动可逆、无副作用残留。收口同时把 OAuth 双 transcript 归档成可链接证据,封顶 B7「安全+评测」两支柱。
1. 机理精读
收口 = 双向闭环验证。 Day 69 验了「坏→红」,今天 revert 回归改动验「好→绿」。两个方向都成立,才排除了两类残余失效:① gate 只会红不会绿(阈值/逻辑过严,正常改动也拦——等于阻断一切开发);② gate 只会绿不会红(Day 69 已排除)。「revert 后立即转绿」还附带证明了回归改动是可逆的、未污染其它逻辑——若 revert 后仍红,说明改动有副作用残留,需排查。
双 transcript = 可链接的外部证据。 AISA 作品集的纪律(见 MEMORY 的 first-party & depth 反馈)是:每个里程碑必须外部可验证(deployed / merged / measured),而非一篇自说自话的笔记。OAuth 这条线的两份 transcript 正是这种证据:
- Day 65「被拒(403 + insufficient_scope)」证明拒绝路径真的拒;
- Day 66「成功(200 + 2 工具 + 审计行)」证明成功路径真的放且可追溯。 两份合起来,对 hiring manager 的「你的 MCP server 有没有真的授权层」这个问题,给的是可点开的报文证据而非口头声明。
B7 三件套 = AISA 作品集的「安全 + 评测」支柱。 复盘 B7 的三块拼图如何咬合:
- stateless MCP server(B6,2026-07-28 spec 风格:每请求新建 server+transport,无协议级 session)——可跑在普通 HTTP 基础设施后,是「真实网络服务」底座;
- OAuth 2.1 + jose(Day 61-66)——给这个 stateless 底座补上资源服务器授权:per-call token + scope 双校验、401/403 语义、sub/aud/jti 审计;
- fail-closed eval gate(Day 67-69)——给「模型行为质量」上回归闸,进 CI 当 blocking 门禁。 安全(1+2)回答「谁能调、调用可不可追溯」,评测(3)回答「行为质量有没有退步」——这正是 AISA「数据流/评测/成本/为什么」四问里的「评测」与「安全」两问。
边界:收口不是终点的全部。 收口产出里仍有「待跑(需 key)」项(双 transcript 端到端、含数值的绿色 gate run),诚实标注它们 gated on baseline 与 key——收口收的是「逻辑闭环 + 已 built+tested 部分」,不是把待跑项谎报成已完成。
B7 三件套 → AISA 四问的映射(作品集叙事)。 AISA hiring manager 的四问是「数据流 / 评测 / 成本 / 为什么」。B7 这周的产出对应到:
- 评测:fail-closed eval gate(Day 67-69)+ 真实 V4-Pro 89.7% / V4-Flash 79.3% / partial-credit 0.900 / N=29 / Δ+10.3pp CI[0,20.7] —— 用真数字回答「你怎么知道它没退步、差异显著吗」。
- 数据流(安全切面):OAuth 2.1 RS(Day 61-66)—— 回答「工具调用谁有权发起、报文怎么流、可不可追溯(sub/aud/jti)」。
- 为什么(build-vs-buy):自建 stateless MCP + jose 校验内核,回答「为什么不直接用托管授权——因为自建过才讲得清托管平台每个组件的存在理由」。
- 成本:本周不直接产成本数(成本主线在 B8+),但 eval 的
totalCostUsd字段(当前 run 为 0,因 DeepSeek 免费额度/计量口径)是成本支柱的接口。 四问里 B7 实打了「评测 + 安全数据流」两问,是作品集的硬支柱。
复盘要诚实列残余(不只夸功能)。 B7 收口时仍未闭合的 gap:① baseline.json 未选定;② judge-human κ 未校准(judgeHumanKappa=null,minKappa 实质未生效);③ jti 自动注入与重放检测待建;④ per-tool 细粒度 scope 待建(当前只 mcp:call);⑤ RS256+JWKS 生产形态待迁;⑥ OTel/Langfuse 观测待接线;⑦ 双 transcript 端到端实跑待 key。把这些写进复盘,才是 first-party & depth 反馈要的「外部可验证 + 反浅层」纪律。
2. 代码走读(revert 路径 + 已 built+tested 边界)
- revert 动作:把 Day 69 在
src/agent/eval/tasks.ts里改坏的若干codeCheck(人为负样本)还原回原正则/谓词,使EVAL_TASKS(tasks.ts:353)的任务重新可通过,completionRate 回到基线水平。 - 转绿路径(scripts/eval-gate.ts:36):还原后重跑报告 →
checkGate(current, baseline, thresholds)的drop = baseline − current ≤ 0.05→ 无 violation →res.pass=true→ eval-gate.ts:44 打印[eval-gate] PASS,process.exit不触发非零 → job ✅。 - 已 built+tested 的真实边界(要分清「逻辑已测」与「端到端待跑」):
gate.ts(checkGate,fail-closed)— 已 built+tested(纯逻辑,无 key)。auth.ts(mintToken/verifyAccessToken/requireScope)+server.ts(startHttpServer 的 401/200 分支)— 已 built+tested,OAuth 无 token→401 / 合法 token→200 已实测。- 整体 423 tests green。
- 仍待跑的部分:双 transcript 的端到端 agent 实跑、含真实数值的绿色 gate run——均 待跑(需 key 跑选定基线后);
agent-evals/baseline.json当前仍不存在(reports/ 有两份真实 run)。 - 归档动作(非代码、属作品集工程):把 Day65/Day66 两份 transcript 链接进
docs/作品集索引;写docs/aipa/day70-b7-retro.md(B7 复盘 + SOTA 检查)。这是交叉引用,不是本仓 src 代码走读。
3. 今日实战
- revert
src/agent/eval/tasks.ts的 Day69 回归改动(还原那 K=3 条被改坏的codeCheck),使pnpm eval:gate转绿。 - 跑
pnpm test确认仍 423 tests green;pnpm typecheck+pnpm build确认 static export 不破。 - 本地
pnpm eval:gatedry-run,看到[eval-gate] PASS(或无 baseline 时的 skip(0) 绿)。 - 归档 Day65「被拒(403 + insufficient_scope)」与 Day66「成功(200 + 2 工具 + 审计行)」transcript 进
docs/作品集索引(可链接,对应 AISA 证据要求)。 - 写 B7 复盘
docs/aipa/day70-b7-retro.md:stateless MCP + OAuth 2.1(jose) + fail-closed eval gate 三件套如何构成 AISA「安全+评测」支柱 + 残余 gap 清单 + SOTA 检查。 - 更新作品集主索引,把 B7 链接挂上(评测支柱 + 安全支柱各一条可点开的证据)。
- 在复盘里明确标注待跑/待数据/待接线清单(见下表),保持 first-party & depth 的诚信纪律。
- 确认 Day69 临时回归分支已删除/未污染 main,main 仍 423 tests green。
4. 今日实测 / 产出
eval-gate ✅ 绿—— revert 后转绿(逻辑闭环,含真实数值的绿色 run 待跑)。- 里程碑双 transcript + CI gate 全部 committed。
gate.ts/auth.ts/server.ts均 已 built+tested(OAuth 401/200 已实测,整体 423 tests green)。- 双 transcript 与含数值的绿色 gate run:待跑(需 key 跑选定基线后);
baseline.json仍待选定(待跑/待建)。 - 真实锚点不变(不臆造):reports/ run
n=29/completionRate≈0.8965(89.7%)/codePassRate≈0.7931(79.3%)/partialCreditMean=0.900/judgeHumanKappa=null;B17 A/B Δ+10.3pp 95% CI[0,20.7]。
5. 常见误区 / 陷阱
- 只验「坏→红」不验「好→绿」:gate 可能过严(正常改动也拦),等于阻断开发;双向都要验。
- revert 后仍红却不排查:说明回归改动有副作用残留,污染了其它逻辑——必须查清。
- 把待跑项谎报成已完成:双 transcript 端到端、含数值的绿色 gate run 仍 gated on key+baseline,收口不改变其待跑状态。
- 复盘只夸功能不标 gap:B7 仍有 baseline 未选、κ 未校准(judgeHumanKappa=null)、OTel/Langfuse 待接线——复盘要诚实列残余。
- transcript 归档却不可链接:作品集证据的价值在「能点开看报文」;把 transcript 塞进无索引的角落等于没归档——要进
docs/索引、可链接。 - 把「逻辑闭环」当「端到端完成」:gate.ts/auth.ts/server.ts 已 built+tested 是逻辑闭环;含真数值的绿色 run + 端到端双 transcript 是另一回事(待 key),别合并表述。
附:概念辨析(易混淆)
- 逻辑闭环 vs 端到端完成:gate.ts/auth.ts/server.ts built+tested 是逻辑闭环;含真数值的绿 run + 双 transcript 端到端是另一回事(待 key)。
- 坏→红 vs 好→绿:Day 69 验前者,Day 70 验后者;双向都成立门禁才完整。只验单向都不够。
- transcript(合规/演示证据)vs trace(运维观测):transcript 是可链接的报文证据(归档进作品集);trace 是 OTel/Langfuse 的事(待接线)。
- revert vs 改 gate:收口靠 revert 回归改动转绿(验好→绿);绝不能靠放宽 gate 阈值来「转绿」(那是作弊)。
- 已实测 vs 待跑:401/200、423 tests green 是已实测;双 transcript 端到端、含数值绿 run 是待跑。表述务必分清。
附:B7 已建/待跑清单(一图流)
| 项 | 状态 | 证据 |
|---|---|---|
| OAuth mint/verify/scope(auth.ts) | 已 built+tested | 423 tests green |
| server 401/200 分支(server.ts) | 已实测 | 无 token→401、合法 token→200 |
| eval gate 决策逻辑(gate.ts) | 已 built+tested | fail-closed 单测 |
baseline.json 选定 | 待跑(需 key) | reports/ 有 2 份真实 run |
| 含数值的绿色 gate run | 待跑(需 key) | gated on baseline |
| 双 transcript 端到端(403 + 200) | 待跑(需 key) | key 已配,待跑 |
| judge-human κ 校准 | 待数据(≥50 标注) | 当前 κ=null |
| OTel/Langfuse 观测 | 待云/待接线 | 未 built |
6. 学习资源(每条带 YYYY-MM)
- MEMORY First-Party & Depth 反馈(2026-06)— 里程碑须外部可验证(deployed/merged/measured)、跑反浅层检查。
- MCP 规范(最终版 2026-07-28,RC 2026-05-21 锁定)— stateless core,server RS 要求。
- OAuth 2.1(IETF draft,2026 现行)+ RFC 9728(2025-04)/ RFC 8707(2020-02)— RS 授权与 audience 限定。
- Anthropic, Demystifying evals(2026-01)— fail-closed gate 方法论。
- 本仓
src/agent/mcp/{auth,server}.ts+src/agent/eval/gate.ts(2026-06)— 已 built+tested 边界。 - 本仓
src/agent/eval/tasks.ts(2026-06)— Day69 回归注入点,Day70 revert 还原对象。
SOTA检查 (2026-06 更新)
- 复查两条主线时效:① MCP 2026-07-28 最终规范(server RS 要求,定稿后须复验本仓 401/audience 实现是否需对齐);② OAuth 2.1(RFC 9728 2025-04 / 8707 现行)仍有效。
- 库版本:jose 执行当周核对 npm 版本与弃用算法告警。
- 过时黑名单:① MCP 无授权层旧叙事(2025 早期 spec);② HS256 当生产方案(应迁 RS256+JWKS);③ circular baseline 评测(B14 已修,禁回退);④ non-blocking warning gate。
- B7 整体是否仍 SOTA:stateless MCP(2026-07-28 spec 方向)+ OAuth 2.1 RS + fail-closed eval gate 三件套均为 2026 当前主流组合,仍 SOTA;唯一未触及 SOTA 的是「云端 durable execution / OTel-Langfuse 可观测」,那是 B8+ 的事。
- 下次复查点:2026-07-28 MCP spec 定稿(复验 RS/audience/审计字段是否标准化);baseline.json 选定后补绿色 gate run;κ 标注(≥50)到位后校准 judge;jose 版本执行当周核对。
自测题(讲得出才算掌握)
- 收口为什么要验「好→绿」而非只验「坏→红」?(答:gate 可能过严,正常改动也拦=阻断开发;双向都要成立。)
- revert 后仍红说明什么?(答:回归改动有副作用残留,污染了其它逻辑,须排查。)
- B7 三件套对应 AISA 四问里的哪两问?(答:评测 + 数据流(安全切面)。)
- 收口时哪些项仍是待跑/待数据?(答:baseline 选定、含数值绿 run、双 transcript 端到端=待 key;κ 校准=待 ≥50 标注。)
- 能不能靠放宽 gate 阈值来「转绿」?(答:不能,那是作弊;收口靠 revert 回归改动转绿。)
衔接
- 昨天:Day 69 — 制造回归验证 gate 会红(testing the test,坏→红已验)。
- 今天:revert 使 gate 转绿(好→绿),归档 OAuth 成功/被拒双 transcript,B7「安全+评测」三件套复盘收口。
- 明天:Day 71 — HTTP API 边界设计(进入 B8:真 API + 流式 + Docker,把底座对外暴露成可调用服务)。