返回 AICAP-180
B15 · Day 150FIS×Anthropic 模式 + 对抗/HITL 套件

抵抗率报表 & 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.tspnpm eval:gate。 读真实实现,要点如下:

  1. checkGate(current, baseline, thresholds)(第 31-61 行)是纯决策逻辑——fs 与 process.exitscripts/eval-gate.ts 包在外面,核心可无 key 单测 ✅。
  2. fail-closed 的核心在第 37-38 行:若 baseline 有 completionRatecurrent.completionRate 缺失或非有限(NaN/Infinity from 损坏 eval),直接 push 一条 violation——注释(第 29-30 行)写明 never a silent green,这就是 fail-closed 的字面实现。
  3. completionRate 回归检测(第 40-43 行):drop = baseline − currentdrop > maxDrop(默认 0.05)即违规——把对抗抵抗率掉落映射到这里,回归即拦。
  4. minKappa 门槛(第 46-52 行):若配了 minKappajudgeHumanKappa 非有限或 < 阈值即违规——直接对接 Day 149 的 κ 校准,judge 不可信时 gate 红。
  5. maxUnknownRate 门槛(第 53-59 行):unknown 率过高即违规——防止「一堆 judge 判不了的样本」蒙混。
  6. GateResult.pass = violations.length === 0(第 60 行)——任何一条违规即不通过,这是「不可绕过」的聚合点。
  7. 配套不可绕过断言hitl.tscanAutoFile(): 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. 今日实战

  1. 生成抵抗率柱状图:两模型(deepseek-v4-pro / Qwen3)× 4 攻击类(注入 / auto-act / PII / OFAC)。
  2. 写 SOTA 检查段落,连同柱状图落到 agent-evals/evasion-report.md(一页评审件,对接 hiring manager 四问)。
  3. OFAC block / SAR 人签断言pnpm eval:gate(= tsx scripts/eval-gate.ts,底层 checkGate fail-closed),CI 化为不可绕过门
  4. 确认 hitl.ts canAutoFile()=falsefile()approve() 已是不可绕过断言(Day 146 已锁)。
  5. baseline 暂不设单次 run——标注 agent-evals/baseline.json 待选定基线 run(N≥70)后设。

4. 今日实测 / 产出

  • 待跑(需 key 出两模型数字)agent-evals/evasion-report.md + 柱状图。
  • 已建依据:gate.ts(fail-closed)+ scripts/eval-gate.ts pnpm eval:gate已测hitl.ts canAutoFile()=false已是不可绕过断言
  • 诚实状态:CI gate 需 agent-evals/baseline.json待选定基线 run 后设)——本日不强设噪声 baseline;两模型抵抗率柱状图数字 = 待跑(需 key)

5. 边界辨析:B15 收口后,哪些是「已固化」哪些仍 gated

收口的意义是把「做过一次」变成「回归即拦」,但要诚实区分两类状态,否则一页评审件会过度承诺:

  • 已固化(不依赖 key、CI 可拦)
    • hitl.ts canAutoFile(): false —— 字面量类型,无人能翻转 ✅。
    • gate.ts fail-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. 常见误区 / 陷阱

  1. 把 baseline 设为单次 run——单次 run 带噪声(N 小 CI 宽),后续正常波动误触 gate;需 N≥70 才有功效(A/B 教训)。
  2. fail-open 默认放行——评测数据损坏时静默放绿,坏 build 蒙混过关;OFAC/SAR 底线只能 fail-closed。
  3. OFAC / SAR 只写测试期望不 CI 化——单测不拦回归,必须接 gate 才是「不可绕过门」。
  4. 一页评审件堆数据不答「为什么」——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 原则化框架,正面回应「有效挑战」要求)