chore: snapshot in-progress question-gen work before preflight fixes

This commit is contained in:
2026-07-16 04:12:21 -04:00
parent 11a5545f57
commit a4c429b247
39 changed files with 738 additions and 283 deletions
@@ -0,0 +1,51 @@
# 训练前多维度审查(video-split 冻结切分 → Video-MME 900 训练)
> 2026-07-16。8 维度并行审查 + 每条发现 2 名独立验证员对抗核实:**19 条确认 / 4 条存疑 / 12 条误报被反驳**。
> 场景锚定:global 冻结池 210/90/600、12 题型、baseline=infer_adhoc、concurrency=24、3 epochs、skill_update_mode=patch。
> 关键条目(P0-1/P0-2/微型题型)已由主会话人工复核确认。
## P0 —— 不修则训练无效或必崩
| # | 位置 | 缺陷 | 后果 |
|---|------|------|------|
| P0-1 | `runner.py:2272` + `prompts/` | 进化模板 `evolve_skill/system/tool/rank.md``consolidate_system.md` 全部缺失(TRM4 有),`_load_evolve_prompts``else ""` 静默兜底空串 | 全部进化 LLM 调用以空 system prompt 运行,edits 恒空 → 3 epochs 表面正常跑完但 **零进化**。已跑过的 train-ar30 / train-action-recognition 同样受影响,结果需回查 |
| P0-2 | `inference.py:462` | traces 表只建表、全仓库无写入(TRM4 TracePlugin 未迁移);训练轨迹只存 `predictions.steps_json` | 训练内 `run_diagnosis``get_traces` 拿空轨迹 → 诊断瀑布坍缩(算法保真 #7 失效)。离线管线已有 `StepsJsonRunLog` 适配器可复用 |
| P0-3 | `runner.py:2044` / `validate.py:682` / `gate.py:99` | 微型题型三连雷(根因同一):新冻结切分中 Temporal Perception、Spatial Perception、Spatial Reasoning 在 val 池 **0 题**`_class_baseline_acc` AssertionError;非 test 单元仅 2 个 → 案例包排除后阶梯为空 raise ValueErrorn_plan=1 时 e-process 结构性 reject_inertia | 训练中途必崩两处 + 微型类白烧进化成本。建议训练 task_types 排除微型类,或切分加 per-class val 下限 |
| P0-4 | `inference.py:423,446` | prediction 未归一化且落库 insert 在 try 块之外;LLM 提交 `{"answer": ["B"]}` 等非标量 → sqlite 绑定异常击穿整个 gather | 训练崩溃,且 Redis 缓存重放使 resume 后确定性复现 → 死循环 |
| P0-5 | `runner.py:316` vs `config.py:63` | early_stop_patience 实际按 **step** 计数(每 epoch 一次性累加 ~20),文档语义是"轮" | patience=4 时 epoch 1 只要没严格超过 baseline 就终止全部训练,交付 v1 基线 |
| P0-6 | `momentum.py:151` | `prompts/slow_momentum.md` 缺失,`use_slow_momentum=true` 下无条件 read_text | 修复 P0-1 后必现:首个 accept 的 epoch 末 FileNotFoundError,崩在慢更新中段(叠加慢更新非幂等 → resume 二次污染) |
## P1 —— 信号污染类,强烈建议训练前修
| # | 位置 | 缺陷 |
|---|------|------|
| P1-1 | `main.py:93` + `redis_cache.py:42` | REDIS_CACHE_TTL=0 → 永不过期;缓存键仅 hash(model+messages),不含采样参数。prompt 未被进化修改的题跨 epoch 逐字节重放首次采样,γ-EMA/e-process 把重放当独立证据 |
| P1-2 | `llm.py:116,575` | SSE 流截断(无 [DONE])当成功处理并写入永不过期缓存 → 半截答案永久毒化 |
| P1-3 | `llm.py:182` | httpx.RemoteProtocolError/ReadError/ConnectTimeout/PoolTimeout 不在瞬时错误清单,零重试直接落错题;8 次重试预算对最常见断连完全无效 |
| P1-4 | `validate.py:304,593` | 基线臂 INFRA 错误(prediction=None)折叠为"基线答错"永久写 BaselineCache(内容寻址无失效),INFRA 护栏在缓存写入之后才检查 |
| P1-5 | `diagnose.py:2194` + `runner.py:1019` | cause_category=Nonejudge 基础设施异常)与 degraded 题在训练链路中进 defect 正文进化路径,反转"判不准默认 lapse"的保护方向;runner 对 degraded_count 零检查 |
| P1-6 | `patch.py:343,320` | 冻结区判定只查 edit target 起点不查跨度:起点在正文、末端延伸进 appendix/momentum 区的 delete/replace 被放行 → marker 破坏 → epoch≥2 时 `appendix_region_bounds` ValueError 崩溃 |
| P1-7 | `workspace.py:282,311,365` | manifest.json 全部写路径为裸 write_text 非原子写(checkpoint.py 已有 tmp+replace 先例);训练高频重写,截断即 workspace 不可恢复 |
## P2 —— 操作规程可规避 / 影响半径小
| # | 位置 | 缺陷 | 规避 |
|---|------|------|------|
| P2-1 | `video_split_cli.py:557` | 冻结产物无覆盖保护(承诺的 --force 门不存在),commit 换 SHA 后重跑会静默替换 pools.json | 立即备份当前冻结产物并记录 sha256;训练前不再重跑切分脚本 |
| P2-2 | `log.py:77` | 只读查询也以 baseline_run_id 打开 HarnessLog → upsert 改写 infer_adhoc 的 _runs 溯源元数据 | 违反 log.py 自身 docstring 约定,宜改走 RunLogImpl |
| P2-3 | `diagnose.py:2081` / `inference.py:461` | predictions/traces 无主键 + step 中途崩溃 resume 同 run_id 重跑 → 重复行双计入诊断统计 | 避免中途 kill;后续补去重 |
| P2-4 | `diagnose.py:2194`(离线) | 孤立 C3 瞬时失败 → 题永久 uncertain 且断点续跑不重试(影响个位数题;C1/C2 失败会 fail-loud 全崩,批量污染不可达) | 检查 uncertain 占比(本轮 3/236 |
| P2-5 | `runner.py:1444` | R2 的 dual_metric "final" 行在 revert 判定前落库,回退版本留下污染记录(存疑级) | harness-eval 读数时注意 |
| P2-6 | `breaker.py:36` | 熔断半开无单探针语义,cooldown 到期 24 并发同时放行(存疑级) | 持续故障时人工暂停 |
| P2-7 | `runner.py:2286` | `prompts/span_eval_user.md` 缺失(同款空串兜底),但 diagnose.py 实际未消费该字段 | 迁移时顺手补 |
## 反驳的 12 条(误报,不需处理)
McNemar 护栏时序、diag_fingerprint 声明式指纹、T0 计入 val 错题、sub_pattern 序列化丢失、correctness 重复行、双题目权威、resume 结构键缺池参数、evolve_single_tool TypeError、momentum guidance 消毒、缓存反序列化无防护、CLI store_true 覆盖 YAML、load_config 静默过滤未知键 —— 均经双验证员核实为不可达或有上游防御。
## 结合前一轮预检的完整训练前 checklist
1. 接线:seed 携带 pools.json 机制(或 frozen_pools_path 配置)+ 新建 adhoc-baseline seed + 训练 yaml/sh`questions: benchmarks/Video-MME`、run_holdout_eval 显式决策)。
2. P0-1~P0-6 全部修复;P1 按成本尽量修(P1-1 至少给训练 run 加缓存 salt 或 TTL)。
3. 备份当前冻结产物(P2-1)。
4. 训练启动前预检脚本:val per-class 覆盖、微型题型排除、evolve/diagnose 模板存在性 fail-loud。