# 训练前多维度审查（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 ValueError；n_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=None（judge 基础设施异常）与 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。
