Skip to content

IR: 卡绑定测试与红队守门制度(LLM-as-a-Verifier 验证 + 意图兜底道闸) #263

Description

@randypanding

job(要完成的待办)

建立"卡绑定测试 + 红队守门"制度,并把验证(Verify)方式一次性说清:

  1. LLM-as-a-Verifier 立为组织默认 verifier 范式:凡 LLM 参与判定的环节(红队攻击是否成立、实现是否满足 AC、任何未来的 LLM 判定),一律采用开源 LLM-as-a-Verifier 实践——绝对细粒度 reward(score token logprob 分布取期望)+ criteria 分解 + K 次重复评估 + 阈值构成 gate;PPT 锦标赛仅作 best-of-N 选择层,不进判定链;判定输出为结构化连续分,不接受散文结论。不自研打分轮子。
  2. 红队按此范式从建立第一天做起:红队 pipeline 的判定环节不使用任何临时 prompt 解析,直接以 llm-verifier 连续分 + 阈值产出 verdict;报告中的每条证据引用由代码对运行时刻真实工件做字符串级机械核对(硬谓词),核对基准版本写入报告。
  3. 卡绑定测试:开卡必须挂钩验收测试(无测试不开卡);实现 PR 绑定卡后自动走卡对应测试集与已注册 holdout 测试(合并阻断)。
  4. 红队守门:红队审计覆盖意图→spec→测试设计路径——该路径(specs/** 的 spec/suite 设计与变更)每个 PR 都必须经红队审计并作为合并阻断项,因为测试设计错了,下游开发 gate 全部失效;开发实现路径的 PR 不走红队(实现 PR 只跑确定性测试)。语义审计(spec vs suite 缝隙,ADR-0067 S1–S5)verdict=insufficient 时机器阻断(Veto),survived 才放行。此频率决策是对 ADR-0067"spec+波次收口"频率的修订,随本 IR 以 ADR 落实。
  5. 意图探索(非 Verify,是兜底道闸):红队顺带做意图层探索(S6 重复已有功能 / S7 违反治理约束 / S8 越出 blastRadius),不产生阻断性判定,命中带证据报人裁决。
  6. 红队住在沙箱里:红队 AI 以 GitHub Actions job 形态存在,沙箱内直接完成代码库探索;人类唯一配置 = 一个 org secret(LLM API key)+ 一个 org variable(endpoint + 模型名)。

触发场景

  1. 每次开 IR 卡进入 spec 阶段:当前 spec PR 合并后即可被认领,无任何"测试是否充分"的机器审查。
  2. 每次实现 PR 绑定卡:当前无任何关卡强制"该卡存在对应测试",卡可以裸奔到合并;Verify 判定逻辑也无可复用框架,各处自己糊 prompt 解析、输出散文结论。
  3. 实现 agent 在开发中发现验收测试本身写错:当前无制度化上报回路,要么硬着头皮实现错误测试,要么私自改测试绕过。
  4. 卡意图本身有问题(重复建设/违反治理/越界)时:当前没有任何一道闸能兜住,问题要到 review 甚至更晚才暴露。
  5. 一旦某个 IR 形成波次与工作卡后,规划 agent 同步设计的测试并没有成为 PR 的阻断项;也没有强制规划 agent 设立 holdout 测试并放在 holdout 仓库、使之成为开发 agent 不可改的合并阻断项。

当前痛点的证据

  1. governance/transitions.yaml:15 状态全集已列 redteamwave-planned,但转移表仅有 T1–T4——红队在状态机里是死状态。
  2. adversary 红队管线整体不存在:无 adversary workflow、无判定脚本、无 attack-strategies.yaml;S1–S5 攻击面目前仅是 adr/ADR-0067 的散文描述。红队 Veto 无任何机器载体。
  3. governance/policy/testing.yaml 政策止于 T-13,无"卡存在但无测试"的检测条款——开卡不带测试在当前政策下不违规。
  4. main-protection.json required checks 仅 gate + org-gate,红队结果不在合并阻断面内。
  5. template-service 的卡绑定测试体系(card-test、run-gates、g060-test-tamper、g050-fail-before)目前只存在于 adr/ADR-0061 与 W2 任务卡设计中,代码未落地;治理仓更无等价机制。
  6. 已有 spec 目录佐证测试缺位:specs/IR-0001IR-0002IR-0003 均无任何 suite/ 验收测试目录。
  7. Verify 方式从未成文:现有制度只说"gate 聚合 + PR review",LLM 参与判定时用什么方法、什么框架、什么阈值,无任何声明。
  8. 2026-08-22 手动红队 dogfood(IR IR: 卡绑定测试与红队守门制度(LLM-as-a-Verifier 验证 + 意图兜底道闸) #263 评论链)实证:无范式约束时,LLM 判定会出现"裁判凭记忆核对证据"的事故——两份红队报告错误指控候选幻觉,后发 erratum 撤回。证据核对不代码化、不锚定真实工件,判定链就不可信。

期望的可观察变化(验收时能在线上看到的事实)

Verify 默认范式

  1. LLM-as-a-Verifier 写入 GOVERNANCE.yaml / testing.yaml 为组织默认 verifier 范式(绝对细粒度 reward + criteria 分解 + K 重复 + 阈值 gate;PPT 仅选择层;连续分输出,禁散文结论)。运行时证据:一次真实判定的 CI 日志含 llm-verifier 实际调用记录、逐 criterion 连续分 JSON 与 token 消耗——不接受"声明已写入"作为证据。
  2. 阈值成 gate:阈值随 criteria 文件版本化,标定使用含已知不合格样本的 golden set,标定记录留档。运行时证据:故意构造的低分样本触发 gate 失败的反向测试日志(证明判定脚本真的做了数值比较,而非恒绿)。
  3. 证据核对硬谓词代码化:红队/verifier 报告的每条引用由代码对运行时刻的真实工件(issue body / spec 原文)做字符串级机械匹配;核对所用基准的版本(SHA/抓取时间)写入报告;核对不通过的命中作废并记录。运行时证据:机械核对脚本的实测——对一份含已知捏造引用的样本报告,作废记录全部命中(本 IR 的 dogfood erratum 为反面教材,见 IR: 卡绑定测试与红队守门制度(LLM-as-a-Verifier 验证 + 意图兜底道闸) #263 评论链)。
  4. endpoint 三探测校验制度化:logprobs 有无、top_logprobs 上限、prefill/structured_outputs 支持;探测结果决定打分抽取路径与精度预期并写入报告;不满足最低要求的 endpoint 配置即失败。运行时证据:LongCat 无 logprobs 校验失败记录、aliyun top_logprobs=5 截断走降级路径记录(dogfood 已有,pipeline 内重放即可)。
  5. verifier token 成本随 run 持久化,纳入 automation-limits.yaml 预算口径;K 与 pivots 为暴露的成本旋钮。运行时证据:一次真实 run 的 token 账落盘文件(dogfood 已发生"成本无法回溯"事故,此条为其修复)。

红队守门

  1. 状态机 T5(spec→redteam,前置=spec PR 合并+suite 就绪)/ T6(redteam→wave-planned,前置=红队 survived)生效,conductor 路由真实卡;adversary 经 repository_dispatch 自动触发,check run 以 App 令牌写回。运行时证据:conductor 按 T5/T6 转移的状态变更记录 + 证明无绕过转移(needs-human 不可直跳 wave-planned)的自动化测试。
  2. 红队沙箱:Actions job 内 checkout 完整代码库 + sparse-checkout 治理规范,红队 AI 沙箱内只读探索;配置面 = 1 org secret + 1 org variable。运行时证据:Action run 日志含 LLM API 真实请求与代码库探索操作日志——空壳 job(echo survived)不满足本条款。
  3. Veto 强制力:insufficient → state:needs-human 且无法进入 wave-planned;adversary check 纳入 specs/ 路径(spec/测试设计路径)全部 PR 的 required checks——该路径每 PR 必走红队审计;开发实现路径 PR 不要求红队 check(EXPECTED_SKIP 模式条件化豁免)。运行时证据:用故意极差 spec 触发真实 insufficient 的端到端记录——Veto 理由由红队 AI 真实产出,且修复针对该理由后 survived;开发路径 PR 无 adversary check 仍正常合并的对照记录。
  4. 红队 run 为唯一证据,挂了自动兜底:红队是否跑过只认指定 Action 历史 run;run 失败(含 no-attempts 白卷,有界重试≤2 次后)自动开特定标签 issue、停止规划 agent 相关产出并提醒人类。运行时证据:Action failure → 自动开 issue 的实测记录;Action success 但产物为空报告 → 同样按失败处理的实测记录。
  5. 意图兜底道闸 S6–S8 落地:入 attack-strategies.yaml(标 requires_explore),只报人不阻断;S8(blastRadius 集合比对)为确定性脚本;命中必须带 file:line 且经条款 3 的机械核对。运行时证据(正向):对一张已知含 S6 重复问题的卡,道闸在卡下产出含 file:line 的评论。IR: 卡绑定测试与红队守门制度(LLM-as-a-Verifier 验证 + 意图兜底道闸) #263 dogfood 的三条有效命中(专用 APP vs AG-1、每 PR 审计 vs ADR-0067 频率、holdout 强制 vs DECISION-02 隔离)作为本道闸的首批实跑记录存档。

卡绑定测试

  1. T-14(card_bound_test_required):spec PR 必须含 suite/ 且卡可解析到测试集;实现 PR 带卡必须跑卡对应测试 + 已注册 holdout 测试且通过(合并阻断)。holdout 测试注册由验证者 APP 执行(owner 裁决:验证者 APP 可挂载 holdout 仓,ADR-0056 DECISION-02 对该身份的限制随本 IR 以 ADR 修订);机器校验 PR 引用的 holdout hash 与已注册记录一致,holdout 内容对开发 agent 不可改。运行时证据:缺测试 PR 被阻断的真实 CI 红记录;holdout hash 不匹配被阻断的真实 CI 红记录;开发 agent 身份尝试改 holdout 测试被拒的 403 记录。
  2. 验证者 APP 设立:新设验证者专用 GitHub App(测试/验证身份,与开发身份 cloudbrid-agent 分离),测试相关内容(suite/、holdout、卡测试)的 CODEOWNER = 验证者 APP + 人类,防止开发 agent 经既有 APP 修改测试;AG-1(身份唯一性)随本 IR 以 ADR 修订为"开发身份唯一 + 验证者身份独立"。T-15(intent_backstop)、AR-10(red_team_veto)入册;g060 等价关卡落地治理仓(specs/*/suite/** 按 IR 分片锁定),非验证者 APP/owner 改测试 exit 2 且自动开 issue 路由 owner 裁决。运行时证据:验证者 APP 安装与权限范围查询记录;开发 APP 令牌改测试被拒的 403 日志;真实 exit 2 阻断日志 + 阻断后自动开 issue 的记录。
  3. 端到端实跑:一张真实卡走通 ir-signed→spec→redteam→(真实 Veto 一次→修复→survived)→wave-planned→认领→PR 绑定卡测试→合并全程。运行时证据:全程 issue 时间线 + 各 check run 链接链。

非目标(NONGOAL)

  • 不自研 LLM 验证/打分框架——默认范式指定 LLM-as-a-Verifier,本 IR 只做接入与制度化
  • 不把 PPT 锦标赛排名分当作判定信号——它是选择层;判定只认绝对 reward 对阈值
  • 不把意图探索(S6–S8)做成 Verify 工作或阻断关卡——它是兜底道闸,只报人不拦路
  • 不再另设第三个 App 身份(验证者 APP 之外的扩展另起 ADR);AG-1 修订(开发身份唯一 + 验证者身份独立)与 DECISION-02 修订(验证者 APP 可挂载 holdout 仓)随本 IR 以 ADR 完成,先补票后实施
  • 开发实现路径 PR 不强制红队审计(红队聚焦意图→spec→测试设计路径;实现 PR 只跑确定性测试与 holdout 测试)
  • 不做运维安全红队(registry 的 red-adversary 是另一物)
  • 不改 verifier-exam 入职考试机制(ADR-0072 已冻结)
  • 不替换现有 gate / org-gate 结构,红队作为新增 check 并入
  • 不赋予红队任何写权限(沙箱内只读探索 + LLM 判定,产物即焚)
  • 不在本 IR 内重建 template-service 全套 quality 体系(ADR-0061/W2 卡已覆盖,本 IR 只做治理仓侧制度与 T-14/T-15 条款)
  • 不要求红队/verifier 与实现 agent 使用同一模型(org variable 可独立指定,支持分角色配模型)

约束 / 不可违反项

  • 遵守 GOVERNANCE.yaml 全部铁律;transitions.yaml / testing.yaml / GOVERNANCE.yaml / conductor / workflows 均为 C1 路径:PR + ADR + owner-merge
  • 默认范式铁律:任何 LLM 判定环节的输出必须是 llm-verifier 结构化连续分(逐 criterion、K 次重复);散文结论、单次离散打分、锦标赛胜率均不得作为 gate 输入
  • 证据核对铁律:核对由代码执行、基准为运行时刻真实工件、基准版本写入报告;裁判(人或 LLM)凭记忆/转述比对一律无效(IR: 卡绑定测试与红队守门制度(LLM-as-a-Verifier 验证 + 意图兜底道闸) #263 erratum 为鉴)
  • AG-1(身份唯一性)与 ADR-0056 DECISION-02(holdout 隔离)的修订必须随本 IR 的 C1 路径 PR 以 ADR 先行完成,不允许先实施后补票
  • INV-02 不破:跨仓触发与 check 写回一律经 App 令牌(单仓作用域、1h 过期),GITHUB_TOKEN 不持有状态写权;验证者 APP 令牌同样单仓作用域、仅测试/验证路径写权
  • 沙箱边界:harden-runner 出向白名单(github.com / api.github.com / objects.githubusercontent.com / LLM endpoint,egress-policy: block);job 内凭据仅 org secret 注入的 LLM_API_KEY(无 repo 写权);一次性 runner,产物判定后即焚
  • endpoint 准入:三探测(logprobs / top_logprobs 上限 / prefill 支持)结果决定抽取路径;top_logprobs 截断造成的精度折损必须在 run 报告中声明
  • llm-verifier 依赖版本钉点(pip 版本 + lock),org-required-workflows 钉点一并改 commit SHA
  • 语义审计维度不放宽 ADR-0067 判定语义:insufficient=blocking、survived=放行、no-attempts=infra 失败(有界重试≤2 次后转 needs-human + dead-man + 自动开 issue)
  • 意图探索道闸的任何输出不构成机器阻断条件;只有 owner 裁决后可转化为状态操作

人类愿意接受的验收证据

  • 13 条期望变化各自的运行时证据(见各条加粗段):真实 CI 日志、连续分 JSON、反向触发记录、真实阻断红记录、自动开 issue 记录、端到端链接链
  • 一份真实卡的 criteria 文件及其从 AC 派生的对照、golden set 标定记录
  • 配置面证据:org secret / org variable 各一项的查询结果(key 本身不可见),证明此外无人类配置
  • endpoint 三探测报告(含一个被拒 endpoint 的失败记录)
  • 机械核对脚本对含已知捏造引用样本的作废记录
  • llm-verifier 版本钉点 diff

可逆性偏好

逐步回滚:红队 check 可从 required checks 摘除(回到 report-only);T5/T6 可停用(卡按原 T1–T4 流转);意图道闸可整体关停(本就不阻断);llm-verifier 实现可替换,但替换物必须仍满足默认范式四件套(绝对细粒度 reward + criteria 分解 + K 重复 + 阈值 gate)。任何单步回退不破坏已合并的卡历史。

质量-速度旋钮

质量优先:红队 Veto、卡绑定测试、机械证据核对不接受降级;K 与 pivots 默认取保守高值。可接受的降级面:意图道闸允许因 LLM 不可用而跳过(跳过须留痕);成本超预算时先降 K/pivots,不动判定语义与阈值;endpoint 仅支持截断 logprobs 时接受精度折损但必须在报告中声明。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions