返回 AICAP-180
B7 · Day 70OAuth 2.1 + MCP 安全 + CI gate

修复回归 + 双 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 的三块拼图如何咬合:

  1. stateless MCP server(B6,2026-07-28 spec 风格:每请求新建 server+transport,无协议级 session)——可跑在普通 HTTP 基础设施后,是「真实网络服务」底座;
  2. OAuth 2.1 + jose(Day 61-66)——给这个 stateless 底座补上资源服务器授权:per-call token + scope 双校验、401/403 语义、sub/aud/jti 审计;
  3. 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 边界)

  1. revert 动作:把 Day 69 在 src/agent/eval/tasks.ts 里改坏的若干 codeCheck(人为负样本)还原回原正则/谓词,使 EVAL_TASKS(tasks.ts:353)的任务重新可通过,completionRate 回到基线水平。
  2. 转绿路径(scripts/eval-gate.ts:36):还原后重跑报告 → checkGate(current, baseline, thresholds)drop = baseline − current ≤ 0.05 → 无 violation → res.pass=true → eval-gate.ts:44 打印 [eval-gate] PASSprocess.exit 不触发非零 → job ✅。
  3. 已 built+tested 的真实边界(要分清「逻辑已测」与「端到端待跑」):
    • gate.tscheckGate,fail-closed)— 已 built+tested(纯逻辑,无 key)。
    • auth.tsmintToken/verifyAccessToken/requireScope)+ server.ts(startHttpServer 的 401/200 分支)— 已 built+testedOAuth 无 token→401 / 合法 token→200 已实测
    • 整体 423 tests green
  4. 仍待跑的部分:双 transcript 的端到端 agent 实跑、含真实数值的绿色 gate run——均 待跑(需 key 跑选定基线后)agent-evals/baseline.json 当前仍不存在(reports/ 有两份真实 run)。
  5. 归档动作(非代码、属作品集工程):把 Day65/Day66 两份 transcript 链接进 docs/ 作品集索引;写 docs/aipa/day70-b7-retro.md(B7 复盘 + SOTA 检查)。这是交叉引用,不是本仓 src 代码走读。

3. 今日实战

  1. revert src/agent/eval/tasks.ts 的 Day69 回归改动(还原那 K=3 条被改坏的 codeCheck),使 pnpm eval:gate 转绿。
  2. pnpm test 确认仍 423 tests greenpnpm typecheck + pnpm build 确认 static export 不破。
  3. 本地 pnpm eval:gate dry-run,看到 [eval-gate] PASS(或无 baseline 时的 skip(0) 绿)。
  4. 归档 Day65「被拒(403 + insufficient_scope)」与 Day66「成功(200 + 2 工具 + 审计行)」transcript 进 docs/ 作品集索引(可链接,对应 AISA 证据要求)。
  5. 写 B7 复盘 docs/aipa/day70-b7-retro.md:stateless MCP + OAuth 2.1(jose) + fail-closed eval gate 三件套如何构成 AISA「安全+评测」支柱 + 残余 gap 清单 + SOTA 检查。
  6. 更新作品集主索引,把 B7 链接挂上(评测支柱 + 安全支柱各一条可点开的证据)。
  7. 在复盘里明确标注待跑/待数据/待接线清单(见下表),保持 first-party & depth 的诚信纪律。
  8. 确认 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+tested423 tests green
server 401/200 分支(server.ts)已实测无 token→401、合法 token→200
eval gate 决策逻辑(gate.ts)已 built+testedfail-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 版本执行当周核对。

自测题(讲得出才算掌握)

  1. 收口为什么要验「好→绿」而非只验「坏→红」?(答:gate 可能过严,正常改动也拦=阻断开发;双向都要成立。)
  2. revert 后仍红说明什么?(答:回归改动有副作用残留,污染了其它逻辑,须排查。)
  3. B7 三件套对应 AISA 四问里的哪两问?(答:评测 + 数据流(安全切面)。)
  4. 收口时哪些项仍是待跑/待数据?(答:baseline 选定、含数值绿 run、双 transcript 端到端=待 key;κ 校准=待 ≥50 标注。)
  5. 能不能靠放宽 gate 阈值来「转绿」?(答:不能,那是作弊;收口靠 revert 回归改动转绿。)

衔接

  • 昨天:Day 69 — 制造回归验证 gate 会红(testing the test,坏→红已验)。
  • 今天:revert 使 gate 转绿(好→绿),归档 OAuth 成功/被拒双 transcript,B7「安全+评测」三件套复盘收口。
  • 明天:Day 71 — HTTP API 边界设计(进入 B8:真 API + 流式 + Docker,把底座对外暴露成可调用服务)。