抵抗率报表 & HITL 闸门固化
B15 的最后一天,做收口。
阶段: B15 · FIS×Anthropic 模式 + 对抗/HITL 套件(Day 141-150) 标签: #fail-closed-gate #ci-gate #resistance-report #hitl
今日导引(由浅入深)
B15 的最后一天,做收口。
前 9 天造好了 10 任务对抗套件(141-146)、破了循环 baseline(147)、跨模型对比(148)、judge 校准(149)。
今天把这些散落的产出收敛成一页评审件,让 hiring manager 的「四问」(数据流 / 评测 / 成本 / 为什么)能被一页纸回答;
同时做一件结构上更硬的事:
把 OFAC 硬停与 SAR 人签从「测试期望」升级为「不可绕过断言」并 CI 化——任何回归即 CI 红(fail-closed gate)。
这是 B15 在能力曲线上的落点:对抗安全不只是「测过一次」,而是被钉进 CI、回归即拦。
「最小可判定产出」是 agent-evals/evasion-report.md(含柱状图 + SOTA 段)+ pnpm eval:gate 接上不可绕过门——报表里的两模型数字需 key,gate 逻辑本身已落地可测。
1. 机理精读
一页评审件回答 hiring manager 四问。 AISA 作品集的核心叙事不是「我做了很多」,而是能被四个问题逼问到底:
- 数据流:对抗 prompt → 模型 → judge → 抵抗率,每段谁是 LLM / 规则 / 人(承接 Day 141 五段链)。
- 评测:抵抗率口径(拒绝/10)、bootstrap CI、judge-human κ(承接 Day 147-149)。
- 成本:每次 eval 跑的 token / 单位成本(前序批次的 c/t 度量)。
- 为什么:为什么 OFAC 走规则不走 LLM、为什么 SAR 必须人签——法理依据(FinCEN 30 日 / 31 USC 5324)。 一页纸把抵抗率 / 分歧 / κ 收敛进去,让这四问有据可答,这就是「可链接资产」而非「一篇笔记」。
fail-closed gate 是什么,为什么对抗断言必须 CI 化。 普通测试期望(expect(...).toBe(...))跑过就算数,但它不拦回归——明天有人改了 prompt 模板让 OFAC 硬停失效,单测可能恰好没覆盖到。fail-closed gate 不同:它把关键指标对一条存储的 baseline比较,指标缺失或非有限值(NaN/Infinity)即判违规,绝不静默放绿。把 OFAC block / SAR 人签接进 gate,意味着这两条底线一旦回归(抵抗率掉、或断言被绕过),CI 立刻红——这是从「测试期望」到「不可绕过门」的质变。
为什么是 fail-closed 而非 fail-open。 安全系统的默认态必须是「拒绝/关闭」:当评测数据损坏、指标读不到时,fail-open(默认放行)会让一个坏 build 蒙混过关;fail-closed(默认拦截)则宁可误拦也不漏放。OFAC / SAR 这类合规底线尤其只能 fail-closed——漏放一次的代价是监管违规。
baseline 不能设成单次 run。 这里有个 Day 137/140 反复强调的陷阱:gate 的 baseline 若设成某一次 run 的抵抗率,那条 baseline 本身带噪声(N 小 CI 宽),后续正常波动就可能误触 gate。正确做法是 baseline 需 N≥70 才有功效(A/B 教训),所以 seed 诚实标注「CI gate 需 agent-evals/baseline.json(待选定基线 run 后设)」——本日不强行设一个噪声 baseline。
2. 代码走读:src/agent/eval/gate.ts 的 fail-closed 逻辑
seed 指明对接 gate.ts 的失败即关闭逻辑、scripts/eval-gate.ts 的 pnpm eval:gate。
读真实实现,要点如下:
checkGate(current, baseline, thresholds)(第 31-61 行)是纯决策逻辑——fs 与process.exit由scripts/eval-gate.ts包在外面,核心可无 key 单测 ✅。- fail-closed 的核心在第 37-38 行:若 baseline 有
completionRate但current.completionRate缺失或非有限(NaN/Infinity from 损坏 eval),直接 push 一条 violation——注释(第 29-30 行)写明never a silent green,这就是 fail-closed 的字面实现。 - completionRate 回归检测(第 40-43 行):
drop = baseline − current,drop > maxDrop(默认 0.05)即违规——把对抗抵抗率掉落映射到这里,回归即拦。 minKappa门槛(第 46-52 行):若配了minKappa但judgeHumanKappa非有限或 < 阈值即违规——直接对接 Day 149 的 κ 校准,judge 不可信时 gate 红。maxUnknownRate门槛(第 53-59 行):unknown 率过高即违规——防止「一堆 judge 判不了的样本」蒙混。GateResult.pass = violations.length === 0(第 60 行)——任何一条违规即不通过,这是「不可绕过」的聚合点。- 配套不可绕过断言:
hitl.ts的canAutoFile(): false(字面量类型)已是「无人能翻转」的 auto-SAR 防线(Day 146 走读),与 gate 共同构成 SAR 人签的双锁。
所以本日工程是把对抗套件的关键指标(抵抗率 → completionRate 口径、κ → judgeHumanKappa)喂进 checkGate,由 pnpm eval:gate 在 CI 跑,回归即红。
一页评审件如何回答 hiring manager 四问:
| 四问 | 一页件对应内容 | 数据来源(前序天) |
|---|---|---|
| 数据流 | 对抗 prompt→模型→judge→抵抗率,标 LLM/规则/人 | Day 141 五段链 |
| 评测 | 抵抗率(拒绝/10) + bootstrap CI + judge-human κ | Day 147-149 |
| 成本 | 每次 eval token / 单位成本(c/t) | 前序成本批次 |
| 为什么 | OFAC 走规则、SAR 人签的法理(FinCEN/31 USC 5324) | Day 146 |
fail-closed vs fail-open 对比,说明为什么合规 gate 只能 fail-closed:
| 情形 | fail-open(错误) | fail-closed(本仓 gate.ts) |
|---|---|---|
| 指标缺失 | 静默放绿 | 判违规(第 37-38 行) |
| 指标 NaN/Infinity | 当 0 处理放行 | 判违规(!Number.isFinite) |
| κ 读不到 | 跳过校验 | 判违规(minKappa 配了即查) |
| 坏 build | 蒙混过关 | CI 红,拦下 |
| 合规代价 | 漏放 = 监管违规 | 误拦 = 重跑,可承受 |
3. 今日实战
- 生成抵抗率柱状图:两模型(deepseek-v4-pro / Qwen3)× 4 攻击类(注入 / auto-act / PII / OFAC)。
- 写 SOTA 检查段落,连同柱状图落到
agent-evals/evasion-report.md(一页评审件,对接 hiring manager 四问)。 - 把 OFAC block / SAR 人签断言接
pnpm eval:gate(=tsx scripts/eval-gate.ts,底层checkGatefail-closed),CI 化为不可绕过门。 - 确认
hitl.tscanAutoFile()=false、file()须approve()已是不可绕过断言(Day 146 已锁)。 - baseline 暂不设单次 run——标注
agent-evals/baseline.json待选定基线 run(N≥70)后设。
4. 今日实测 / 产出
- 待跑(需 key 出两模型数字) →
agent-evals/evasion-report.md+ 柱状图。 - 已建依据:
gate.ts(fail-closed)+scripts/eval-gate.tspnpm eval:gate✅ 已测;hitl.tscanAutoFile()=false✅ 已是不可绕过断言。 - 诚实状态:CI gate 需
agent-evals/baseline.json(待选定基线 run 后设)——本日不强设噪声 baseline;两模型抵抗率柱状图数字 = 待跑(需 key)。
5. 边界辨析:B15 收口后,哪些是「已固化」哪些仍 gated
收口的意义是把「做过一次」变成「回归即拦」,但要诚实区分两类状态,否则一页评审件会过度承诺:
- 已固化(不依赖 key、CI 可拦):
hitl.tscanAutoFile(): false—— 字面量类型,无人能翻转 ✅。gate.tsfail-closed 决策逻辑 —— 指标缺失/非有限即违规 ✅,已测。- 10 任务 codeCheck 硬判据 —— 确定性字符串断言 ✅,
pnpm test绿。
- 仍 gated(需 key / 需更多样本):
- 两模型抵抗率柱状图数字 —— 待跑(需 key)。
- judge-human κ —— gated,需 ≥50 手标(Day 149 先 ≥15 起步)。
agent-evals/baseline.json—— 待选定 N≥70 基线 run 后设,本日不强设噪声 baseline。
一页评审件的正确措辞:「OFAC 硬停与 SAR 人签已 CI 化为不可绕过门(fail-closed,已测); 抵抗率/κ 的具体数字与 baseline 在 key + 足量样本就绪后落地。 」——把「机制已固化」与「数字待跑」分开陈述,这正是这套笔记的诚信底线。
通向 B16 的边界:B15 收口于「对抗安全 + HITL 闸门 CI 化」, 但这只是技术控制;明天起的 B16(Day 151-160)把视角抬到治理层—— OCC 2026-13 的 MRM 框架要求「模型清单 / 独立验证 / 有效挑战」三栏, 其中「有效挑战」原则正是 Day 147 打破循环 baseline 的监管对应物: 验证者必须独立于被验证模型。也就是说,B15 在工程上做对的事(外部裁判、fail-closed gate), 到 B16 会被升格为「治理一页纸」里可向监管交代的合规证据。 这条从「测试 → 控制 → 治理」的上升路径,是 AISA 把技术作品翻译成机构语言的关键一跃。
6. 常见误区 / 陷阱
- 把 baseline 设为单次 run——单次 run 带噪声(N 小 CI 宽),后续正常波动误触 gate;需 N≥70 才有功效(A/B 教训)。
- fail-open 默认放行——评测数据损坏时静默放绿,坏 build 蒙混过关;OFAC/SAR 底线只能 fail-closed。
- OFAC / SAR 只写测试期望不 CI 化——单测不拦回归,必须接 gate 才是「不可绕过门」。
- 一页评审件堆数据不答「为什么」——hiring manager 四问里「为什么 OFAC 走规则、SAR 必须人签」的法理依据不能省。
7. 学习资源(每条带 YYYY-MM)
- 本仓
src/agent/eval/gate.ts+scripts/eval-gate.ts(AICAP-180 B7,fail-closed CI gate) - FIS × Anthropic, "Financial Crimes" 模式(2026-05)——五段链收口参照
- Anthropic, "Demystifying evals"(2026-01)——可复现报告 + judge 校准门槛
- FinCEN 30 日时限 + 31 U.S.C. § 5324(现行长效法规,2026-06 复核)——「为什么」段法理依据
- 真实 A/B 实测:V4-Pro vs V4-Flash N=29 Δ+10.3pp CI[0,20.7](本仓 2026)——baseline 需 N≥70 的依据
SOTA检查 (2026-06 更新)
- fail-closed eval gate 为 2026 AI 工程标准实践,
gate.ts现行有效——指标缺失/非有限即拦是底线。 - FIS×Anthropic 模式(2026-05)截至 2026-06 仍 SOTA,但对抗基准更新快(半衰期~6 月)——每阶段末重验。
- 过时黑名单:避免把 baseline 设为单次 run(噪声)——需 N≥70 才有功效(A/B 教训);避免 fail-open 默认放行。
- 下次复查点:W15 前重验 Fiserv agentOS GA(08 月)是否给出竞品模式;选定 N≥70 基线 run 后设
agent-evals/baseline.json;每阶段末重验对抗基准命名与 SOTA 状态。
衔接
- 昨天:Day 149 — 失败归因 & judge 校准(failureTaxonomy 四类 + Cohen's κ)
- 今天:抵抗率/分歧/κ 收敛成一页评审件(evasion-report.md + 柱状图)+ OFAC/SAR 断言 CI 化为 fail-closed 不可绕过门(报表数字待跑需 key,gate 逻辑已落地)
- 明天:Day 151 — MRM 体制变更(OCC 2026-13)(进入 B16 治理一页纸,SR 11-7 已废止 → OCC 2026-13 原则化框架,正面回应「有效挑战」要求)