OBLITERATUS条件测试政策解析:10个测试门的证据保鲜机制完整指南
【免费下载链接】OBLITERATUSOBLITERATE THE CHAINS THAT BIND YOU项目地址: https://gitcode.com/GitHub_Trending/ob/OBLITERATUS
OBLITERATUS 是一个用于大语言模型对齐消融(abliteration)的开源研究工具。它的 CI 体系中最精巧的部分是条件测试政策(Conditional Test Policy):10 个环境绑定的测试门(test gates)被写成一份机器可读的 JSON 策略,配合"8 天过期、30 天留存"的证据保鲜机制,确保每次发布所依赖的测试证据永远新鲜、可追溯。这篇指南带你快速读懂这套机制。
什么是条件测试?为什么需要测试门
OBLITERATUS 的强制 PR 流水线刻意保持三个"无":纯 CPU、离线、无凭证。这样一来,合并任何贡献的反馈都非常快。
但模型下载、GPU 推理、远程 SSH、苹果芯片这些测试在普通 CI 上跑不了。项目没有假装它们不存在,而是把它们拆成一个个条件测试门,只在选择性的时刻运行。官方说明见 docs/conditional-testing.md,全部规则的唯一权威是 ci/conditional-test-policy.json。
10个测试门全览:4个软件门 + 6个环境门
| 测试门 | 运行环境 | 前置条件 | 覆盖的核心代码 |
|---|---|---|---|
model-download-runtime | ubuntu-latest(托管) | 公网 HTTPS | models/loader.py 等 10 个模块 |
external-evaluation | ubuntu-latest(托管) | 公网 HTTPS | tourney.py 等评测集成 |
network-services | ubuntu-latest(托管) | 仅回环网络,无凭证 | watchtower.py、models_client.py |
operator-ui | ubuntu-latest(托管) | 锁定 spaces 依赖,不启动监听 | local_ui.py、interactive.py |
cuda-runtime | 自托管 CUDA runner | 环境变量开关 + 专用 GPU 机 | device.py、量化/离载模块 |
bitsandbytes-runtime | 自托管 CUDA runner | NVIDIA CUDA + 锁定 bitsandbytes | 4bit 量化加载路径 |
jetson-runtime | 自托管 Jetson(ARM64) | 受信手动触发 + JetPack 运行时 | offload_surgery.py 等 |
mps-runtime | 自托管 macOS ARM64 | ENABLE_MPS_GATE=true | Apple MPS 后端 |
mlx-runtime | 自托管 macOS ARM64 | ENABLE_MLX_GATE=true | mlx_backend.py |
remote-execution | ubuntu-latest(托管) | 最小权限 SSH 主机 + 固定 known_hosts | remote.py |
🎯 关键设计:每个测试门在策略 JSON 中都必须声明id、job、runner、prerequisites、expected_cost和coverage_paths六项字段,且每个门都对应 tests/conditional/ 下一个真实可跑的 pytest 测试文件。
证据保鲜机制的核心:3个关键数字
保鲜机制(evidence freshness)由策略文件中的三个字段驱动:
- 8 天过期线:
maximum_evidence_age_days: 8——任何超过 8 天的测试证据直接视为陈旧(stale),不能再用来支撑"支持某后端"的声明。 - 30 天留存:
evidence_retention_days: 30——工件和证据文件最多保留 30 天,过期即清除。 - 周期触发:
cadence定义为"每周日 06:17 UTC + 每次公开发布 + 随时可手动触发"。
这意味着:托管门每周至少刷新一次证据;GPU/苹果/远程门只要有 runner 在线,发布前就会被手动打一次新鲜证据。发布触发的工作流运行结果,被保留为最终的新鲜度记录(详见 docs/RELEASE_PROCESS.md)。
结果三态:任何门都不能"白拿绿灯"
scripts/run_conditional_gate.py 是执行器,它对"空转"零容忍:
- 必须至少执行1 个真实测试;
- 任何 failure、error、skip都会导致该门失败;
- 缺少前置条件(如没有 CUDA)时写入
not_run状态并返回非零码。
最终汇总由 scripts/conditional_gate_summary.py 生成一张三态报表:
| 状态 | 含义 |
|---|---|
success | 本次运行选中且通过 ✅ |
not_selected_no_fresh_evidence | 本次未运行,也没有新鲜证据——不视为支持该后端⚠️ |
waived_no_support_claim | 有合规豁免——同样不声称支持该环境 ⚠️ |
这一设计堵住了最常见的漏洞:硬件不在时,测试被跳过,CI 却显示绿色。
硬件缺位的"豁免":30天限时承诺
当前策略中登记了 5 个环境豁免(environment_waivers):cuda-runtime、bitsandbytes-runtime、mps-runtime、mlx-runtime、remote-execution,统一于2026-09-15到期。
scripts/check_conditional_policy.py 会对豁免进行严格审计:
- 🔒 每个豁免只能绑定一个门,且不能重复;
- 🔒 纯软件门(如
network-services)不允许使用豁免——它们随时能在托管 CI 上跑; - 🔒 期限不得超过 30 天,不能早于生效日,不能引用未来日期;
- 🔒 每张豁免必须写明它阻塞了哪些支持声明(blocked_claim);
- 🔒 无效、过期、重复的豁免会直接让策略校验任务失败。
豁免≠支持:只要豁免生效,项目就不会声称"兼容 CUDA / MPS / MLX",只表示"该问题已被正式跟踪"。
本地快速跑一个测试门
想在自己的机器上复现某个门的探针,只需一行命令:
uv sync --locked --extra dev uv run --extra dev python scripts/run_conditional_gate.py model-download-runtime uv run --extra dev python scripts/run_conditional_gate.py network-servicesCUDA / bitsandbytes / MPS / MLX 门则需要对应硬件与锁定依赖,完整操作手册在 docs/conditional-testing.md 中按门逐一列出。
延伸阅读:相关文件清单
| 文件 | 作用 |
|---|---|
| ci/conditional-test-policy.json | 唯一权威策略:门定义、资源锁定、豁免登记 |
| ci/test-quality-policy.json | CPU 覆盖率阈值 + 每个豁免文件到测试门的映射 |
| scripts/run_conditional_gate.py | 单门执行器,拒绝空转与跳过 |
| scripts/check_conditional_policy.py | 策略与豁免审计,含证据新鲜度校验 |
| scripts/conditional_gate_summary.py | 三态汇总报表生成器 |
| tests/conditional/ | 各测试门对应的真实测试文件 |
| docs/RELEASE_PROCESS.md | 发布流程中条件证据的位置 |
小结
OBLITERATUS 的条件测试政策用一份 JSON + 三个脚本,把"哪些测试依赖什么环境、证据多久算过期、缺硬件时如何诚实声明"全部变成了可机器校验的合同。对普通用户而言,你只需要记住:看到success才是真支持;看到waived或no fresh evidence,就是项目在对你说"这个环境我还没验证过"——这正是开源项目里难得的诚实工程实践。
【免费下载链接】OBLITERATUSOBLITERATE THE CHAINS THAT BIND YOU项目地址: https://gitcode.com/GitHub_Trending/ob/OBLITERATUS
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考