fix: address whole-impl review (INFRA T0 rows, reproducible manifest, evolution_target report, dead config, canonical DRY)

C-1: persist_infra_t0_rows 补 INFRA/空预测错题的 T0 信号行(不进诊断故须单独落库),run_pipeline 加 Phase 0,dry-run 用假数据走通。
C-2: CLI 加 --generated-at,真实运行默认盖真实 UTC now,可显式固定以字节级复现 manifest。
I-1: coverage_report 增 evolution_target_distribution(T2 信号按 tool/skill/system 计数)。
I-2: 删除 PoolConfig 死字段 n_trainval/floor_k/epsilon/report_floor/val_wrong_min(grep 确认无消费者,视频级切分用独立 VideoSplitConfig/SplitBuildConfig/SelectConfig)。
I-3: 抽共享 load_canonical_predictions(db_path, run_id),CLI 与 build_split 共用;消除 canonical 取行 + correct 判定重复。
M-1: build_split docstring 注明 val_wrong_min-agnostic 契约(McNemar 护栏由 CLI 冻结后执行,Task 11 契约)。
This commit is contained in:
2026-07-15 13:39:14 -04:00
parent 02b8145b7f
commit 8fef7ced42
6 changed files with 302 additions and 134 deletions
+4 -13
View File
@@ -160,16 +160,12 @@ class PoolConfig:
eval_min_per_class: 验证池中每类保底样本数(GlobalStrategy 用)。
train_ratio: train/(train+val) 比例(PerCategoryStrategy 用)。
test_questions_dir: 外部 test 题源路径(PerCategoryStrategy 用)。
n_trainval: trainval 目标视频数(结果驱动视频级切分用;0 表示不启用)。
floor_k: 各高信号 task_type 的 T2 defect 下限(视频级切分硬约束;空表示无约束)。
epsilon: test 相对全局的最大允许分布偏差(视频级切分 test 代表性守护)。
report_floor: per-type 报告门限,题数 ≥ 此值的 task_type 才入 ε 约束(视频级切分用)。
val_wrong_min: validation 池最少错题数(McNemar 功效护栏;0 表示不检查)。
实现细节:
视频级切分五个旋钮均带惰性默认(0 / 空 dict),使现有 GlobalPoolStrategy /
PerCategoryStrategy 的构造点无需改动即可保持行为不变。floor_k 为不可哈希 dict
标 hash=False 排除出 frozen dataclass 的自动 __hash__,避免入 set/dict 键时报错。
结果驱动视频级切分不复用本配置——它有独立的 VideoSplitConfig /
SplitBuildConfig / SelectConfig(见 app/harness/video_split_cli.py 与
split_selection.py),故本类不承载 n_trainval / floor_k / epsilon 等视频级
切分旋钮,避免死配置面。
"""
task_types: tuple[str, ...] | None
@@ -184,8 +180,3 @@ class PoolConfig:
train_ratio: float
test_questions_dir: _Path | None
batch_correct_ratio: float | None = None
n_trainval: int = 0
floor_k: dict[str, int] = field(default_factory=dict, hash=False)
epsilon: float = 0.0
report_floor: int = 0
val_wrong_min: int = 0