窗口 D 完成报告:阶段 3 benchmark 评测基准

日期:2026-08-16 执行依据:docs/specs/2026-08-13-execution-plan-v1.md §六.七(D1-D6 验收清单,16 项冻结)


一、执行范围与纪律对照

按建议顺序执行:D-a(任务集生成 + 难度量化 D1/D2)→ D-b(标注 + 运行器 + 功效 报告 D3/D4)→ D-c(覆盖审计 + 评审机制 + 回归 D5/D6)

四条关键纪律逐条对照:

  1. 生成器提示词不含任何规则内容(E6)benchmark/generator_prompt.md 纯过程性指令; 自动化守卫 = 规则标识/标题扫描 0 命中(测试 test_taskset_and_prompt_contamination_free)。
  2. 难度标签不得用审计分数定义(E4)benchmark/difficulty.py 只消费 gold 特征; 测试 test_difficulty_independent_of_audit_score 断言难度代码不引用任何引擎分数路径。
  3. 隐藏集 gap 用预注册容忍区间(E1)benchmark/protocol.py PRE_REGISTRATION 冻结 (Δ = mean(public)−mean(hidden),容忍区间 [−0.10, +0.10],超出 → 负向告警); 预注册记录见 §四。
  4. benchmark 是外围层(golden 0 差异硬验收):评分路径零改动(engine/matcher/ evaluator/aggregator/registry 均未动),golden 复跑 0 差异(§六)。

二、产出清单

类别 文件 说明
任务集 src/bioaudit/data/tasks/taskset.json v1.0.0(semver + 文件哈希 + 快照三元组 + split + 模型信息 + IRR)
任务集 src/bioaudit/data/tasks/{scrna,pan,deg}/bmd_*.json 30 条(scrna 12 / pan 10 / deg 8;批 1/2,批 2 排期补齐至 60)
标注 src/bioaudit/data/annotation/annotator_A{,_calib,_full}.jsonl 双标注原始 JSONL(A/B)+ 仲裁记录 + irr_report.json + merged_annotations.json
src/bioaudit/benchmark/(10 模块) models / manifest / difficulty / protocol / generator / annotation / runner / contamination / coverage / paths
生成器 benchmark/generator_prompt.md E6 合规提示词(零规则内容,sha256 记入任务 provenance)
标注 rubric benchmark/annotation_rubric.md E3 标注规范(标注者与规则作者角色分离)
预注册 benchmark/pre_registration.json E1 机器可读预注册记录
CLI benchmark-run / benchmark-validate 运行器 + 任务集四闸(清单/污染/覆盖/golden)
测试 tests/test_benchmark.py(20 项)/ test_benchmark_irr.py(6 项) 新增 benchmark 测试(26 项)
脚本 scripts/generate_benchmark_tasks.py / assemble_gold.py 生成 / gold 组装(可复现管线)
文档 docs/protocols/benchmark-protocol.md 完整协议(生成/标注/难度/split/gap/功效/黑盒/覆盖/评审)
CI .github/workflows/ci.yml 双矩阵新增 benchmark-validate 步骤

三、验收对照(§六.七 D1-D6,16 项逐项)

D1 任务集规模化

D2 难度分层与隐藏集

D3 真值标注

D4 评测运行与报告

D5 覆盖审计与评审

D6 回归

四、预注册记录(E1,gap 区间)

五、标注 IRR 实测(E3)

六、回归证据

golden:   ok=True | n_diffs=0 | trajectories=20 | decisions=137
pytest:   174 passed(148 + 新增 26)
benchmark-validate: 四闸 PASS(taskset 30 条 / contamination 0 命中 / coverage 34+38 / golden 0 差异)
ruff:     新代码零错误(仅剩 1 处窗口前既有 E501,CI `|| true` 容忍)

七、任务集清单(数量/分布/难度/来源)

范式 任务数 决策数 难度分布 (1/2/3) gold (correct/edge/error) 主要语料来源
scrna 12 174 0 / 9 / 3 148 / 19 / 7 scrna_correct/crc/melanoma/nsclc + CellVoyager 真实轨迹
pan 10 134 3 / 6 / 1 106 / 19 / 9 pan_correct / pan_error
deg 8 40 6 / 1 / 1 26 / 6 / 8 deg_correct / deg_error / deg_edge_n2
合计 30 348 9 / 16 / 5 280 / 44 / 24 20 条 legacy + 1 条 CellVoyager

八、遗留项(如实声明)

  1. 批 2(30 条)未完成:60 条大目标分两批,批 2 已排期(§七),不阻塞本窗口验收。
  2. 同模型双标注局限:IRR 可能高估;批 2 引入跨模型/人工标注对照。
  3. 全量 IRR(κ=0.7292)低于校准批(0.8087):分歧集中在 edge/error 边界; 仲裁已逐条定案;仲裁员提出 6 条 rubric 澄清点(TMM 工具链耦合判定、 “只评本步 vs 管线衔接”、报告/解释不足类归属、note 与 choice 矛盾仲裁依据、 模板笔误权重、双细胞去除与下游设计的依赖)——列入批 2 的 rubric v1.1 修订议程。
  4. gap 告警触发(Δ=−0.1864):无泄漏通道(确定性引擎);隐藏集小样本组成 偏差;批 2 扩大隐藏集并可选新预注册记录重定区间。
  5. CellVoyager 真实运行语料有限(hook 未实测,窗口 C 遗留)——新错误模式素材待补充。
  6. 预注册记录如需修订(如 gap 容忍区间调整)需提升 record_id 走评审。

九、关键设计决策记录

决策 依据
gold 由独立标注管线产出,生成器不写 gold E6 防泄漏:生成器只产轨迹,对错判定与生成解耦
难度 = gold 特征 rubric(非专家主观分) E4 可复现 + 无审计分数循环
校准批 10 条先跑 IRR 门槛再放量 E3 预注册流程(用户提醒的校准批次策略)
IRR 对齐键 = (task_id, step_id) 跨任务 step_id 碰撞(每个任务都有 S1/D1/A1)——初版按 step_id 对齐产出 41 条错误对齐,修复后 348 条
κ 悖论说明(near-unanimous 任务 κ=0) 如实记录,门槛用校准批整体 κ
检出 CI 用 pooled 口径(任务级重采样后汇总) 与 pooled 点估计一致(初版误用 task-macro 均值,已修复)
benchmark 数据/代码与评分路径严格分离 golden 0 差异硬验收(D6.14)
taskset 变更走 benchmark-validate 四闸 E8 与 B5 同门禁风格
gap 告警只登记不改分 E1 协议明文(负向告警 = 调查信号,非失败)