# AR30 靶向题"太简单"根因分析（baseline 29/30 = 96.7%）

- **日期**: 2026-07-14
- **目的**: 30 道用 `ActionRecognitionStrategy` 6 个 SubPattern 靶向生成的 Action Recognition 题，本意复现 Agent 在 Video-MME AR 上的 6 种失败子模式（原生 AR 正确率约 65%），但 baseline 正确率 96.7%。逐题核实为何失败模式未被触发。
- **数据**: `scratchpad/ar30_baseline_analysis.json`（30 题 × question/options/reasoning）+ `store/questions/generated-ar30/accepted_questions.json`（source_nodes/difficulty）
- **对照**: [2026-07-11-benchmark-failure-taxonomy.md]（M1–M5 失败机理）
- **代码**: `app/question_gen/strategy_action_recognition.py`（6 SubPattern）、`store/prompts/question_gen/action_recognition.md`（出题 prompt）、`store/prompts/question_gen/gate_multi_true.md`（去歧义门）

## 一、结论摘要

**单一系统性根因：干扰项是"负空间"（视频中根本不存在的事件），而非"易混正例"（真实发生过、需辨析的近似动作）。** Agent 的工具箱（`search_similar`×3 → 判定不存在）恰好擅长确认"不存在"，于是每道题坍缩成一次**检索存在性核对**——"哪个选项能搜到证据，其余三个搜不到就排除"——而非动作理解。这与靶向的失败模式（M1 负证据幻觉、M3 多实例锚定、M4 视觉粒度）**正好相反**：靶向想让 Agent 的坏启发式（搜不到就断言不存在）害它出错，但因为干扰项真的不存在，这个坏启发式反而变成了对的。

| 量化证据 | 数值 |
|---------|------|
| reasoning 通过"干扰项无证据/未出现"排除法定位答案 | **24 / 30（80%）** |
| 时序题直接读取树内显式时间戳排序（无需时序推理） | **9 / 30** |
| source_nodes = 6（单个小 L2 子树即含全部答案） | **13 / 30** |
| 唯一答错题 [29] 的失败原因 | 树内**缺**证据（T1），非靶向失败模式 |
| SubPattern 归属是否持久化到 accepted_questions | **否**（诊断盲区，见 §五） |

## 二、根因一：干扰项质量——"负空间"干扰项使排除法万能

出题 prompt 的 `distractor_rules` 与全局约束共同把干扰项推向"视频中不存在的动作"。典型 reasoning 结构是"正解有证据 + 其余三项全网搜不到"：

| 题 | 正解证据 | 干扰项性质 | reasoning 片段 |
|----|---------|-----------|---------------|
| [2] 0kRsiSdDFYg | 举起/黑盒/PS5 三帧确认 | 跨域捏造 | "B: 全视频搜索无任何 bicycle kick 或 goalkeeper hug 场景，排除" |
| [22] 068rdc75mHM (John Bell) | 三重确认 | 完全无关物件 | "B: coffee cup/city skyline/satellite dishes 完全未出现…C: dice/cups with lights 无任何节点提及" |
| [0] 0ncLRRLvdfk (金融) | 3 个 L1 一致 | 异域动作（写代码/电视直播） | "D: 全视频无任何软件编码或自动交易算法相关内容" |
| [9] 5WIdIs3A9Ok (美洲豹) | 凯门鳄/牛尸独立证据 | 未发生的捕食 | "B：无任何伏击鹿或牧场睡觉的证据。D：未发现跟踪水豚或猎杀活牛的证据" |
| [23] 4IenX7OHumk | 鸟起飞/雄狮穿行两帧 | 未发生 | "C: 鸟类俯冲向水坑和狮子爬树在整个视频中均无任何证据" |

干扰项区分度过大：Agent 无需理解"发生了什么动作"，只需确认正解选项能被检索命中、其余三项检索空返回。**Video-MME 原生题之所以难，是错误选项都是"可能发生/部分发生"的近似物**，逼真辨析；而这里错误选项是可证伪的缺席，`search_similar` 三次空返回即高置信排除。

### 门控是"负空间干扰项"的制度性推手（smoking gun）

`gate_multi_true.md`：**"≥2 个选项 plausibly correct → verdict fail"**。任何把干扰项做成"真实近似正例"的题，天然会让≥2 选项都合理，被此门直接毙掉。出题 prompt（`action_recognition.md`）末条同样写死 **"Do NOT write questions where multiple options could reasonably be correct"**。二者联合导致：**只有"1 个清晰正解 + 3 个明显缺席"的安全题能通过门控**，恰好把复现 M2/M3/M4 所需的易混题全部过滤掉。去歧义门在为"合法"服务时，杀死了"有用"。

## 三、根因二：证据集中度——答案在树摘要里，不需要跨段/多帧推理

- **时序题的正确顺序被写成树内时间戳，排序退化为数值比大小。** [15] "指地图(437s)→锤木板(478s)→行军(519s)→骑兵(539s)，时间戳完全匹配"；[18] "sandwich(2504s)→chocolate(2667s)→soda(2691s)→eat(2761s)"；[25] "1576s→1747s→1897s→2046s 升序"。设计意图是"打乱时序即答错"，但正确时序在 L2/L3 摘要里以时间戳明写，Agent 读出来排序即可，**时序推理环节被树旁路**。9/30 属此类。
- **跨段题的合并已由 L1 摘要代劳。** `cross_segment_entity_tracking` 采样在 L1（`sampling_level_override=1`），而 L1 摘要本身就是跨段聚合后的高层描述。[0] "三个 L1 节点一致支持"、5 步作答——树替 Agent 完成了跨段合并，`cross_segment` 的"漏读某段"失败无从发生。
- **13/30 题 source_nodes=6**（单个带帧的小 L2 子树），正解在头 1–2 次 `view_node` 即到手。步数中位数≈11 的高步数（[26]=20、[28]=18、[23]=15）几乎全花在**反复检索确认干扰项缺席**这种冗余动作上，而非构建正解——空转仍稳落正确。

## 四、6 个 SubPattern 逐一复现失败分析

| SubPattern | 靶向失败 | 为何未触发（题例） |
|-----------|---------|-------------------|
| premature_evidence_anchoring | 找到首个证据就停搜 | 干扰项是缺席事件而非"前段的强局部匹配"。[8] 赛果题正解=官方成绩表，"首段诱饵"根本不存在，无从过早锚定 |
| temporal_reasoning_failure | 排错序/数错第 N 次 | 正确顺序=树内时间戳，读数即排序（[15][16][18][24][25]）；干扰项是时序全反的排列，一眼可判 |
| semantic_rigidity | 要求字面匹配拒同义词 | 同义改写太浅、且干扰项仍是缺席动作。[5] 吸管"缠绕"直接命中字幕，[4] 释义题靠排除异域项即中 |
| fine_grained_visual_action | 分不清"怎么做" | 干扰项换成了缺席的执行方式而非"同动词的另一种真实做法"。[19] 墨镜"摘下 vs 推头顶/放鼻梁"——后两者视频无证据，非真实近似；[21][28] 同理 |
| cross_segment_entity_tracking | 无法跨段合并实体 | L1 摘要已聚合（§三）；干扰项混入的是"未发生动作"而非"另一实体的真实动作"，[3][14][22] 排除法即中 |
| evidence_gap_confabulation | 缺证据时编造因果 | 反被利用：正解是"仅旁白暗示/描述未展示"的诚实项，干扰项是缺席因果链，Agent 排除缺席项即选中诚实项。[20][12] 均一次命中 |

**共性**：每个 `distractor_rules` 名义上要求"近似/合理但错"，但都留了"未出现/缺乏证据支持"的口子（如 fine_grained 的"确保都是合理执行方式"未被 VLM 落实），VLM 一律取"捏造缺席动作"这条最省力且最不会触发 multi_true 门的路径。

## 五、VLM + 门控的系统性偏差

VLM 面对采样素材被要求写 3 个错项，**最省力且最安全的路径是编造素材里没有的动作**：保证"错"、gate_key_verify 不会误判正解、且绝不触发 multi_true 门。反之，"错但有部分真实证据支撑"的近似干扰项需要 VLM 在素材里挖真实近似事件（更难），还有被 multi_true 门判歧义毙掉的风险。于是**出题目标函数（过门率最大化）与靶向目标（复现失败模式）直接冲突**：门控奖励"唯一清晰答案"=奖励"容易"。

附带缺陷：`build_prompt_context` 记录了 `sub_pattern`，但 `accepted_questions.json` 未持久化该字段（§一表）；不过 `run_store` 的 DB（`logs/question_gen_ar30.db`）落了 `sub_pattern` 列，可据此做真实归属核对（见 §5.5）——**产物 JSON 未落盘 sub_pattern 仍是可观测性盲区，需从 DB 补齐到 JSON**。

## 5.5 归属核对：题目内容 vs 声称的 SubPattern（用 DB 真实归属）

前节靠题面反推有偏差。改用 `logs/question_gen_ar30.db` 的 `sub_pattern` 列（真实归属）逐题核对接受题（30 道），发现**近一半题目内容与其声称的失败结构脱节**。

| SubPattern | 接受/生成 | 过门率 | 靶向意图 | 题目实际内容 | 名副其实? |
|-----------|----------|--------|---------|-------------|----------|
| temporal_reasoning_failure | 5/44 | 11% | 排错序/定位第 N 次 | 5 道全是明确 "correct chronological order" 排序题 | ✅ 是（但顺序在时间戳里明写，故太简单） |
| cross_segment_entity_tracking | 7/26 | 27% | 无法跨段合并实体 | 6/7 确跨段追踪同一实体（替补球员、white skirt、jaguar 跨段对比） | ✅ 基本是（但 L1 摘要已聚合） |
| fine_grained_visual_action | 4/8 | 50% | 分不清"怎么做" | 3/4 是 how/manner 细粒度（handle sunglasses、manipulate straws、cat's manner） | ✅ 匹配最好 |
| evidence_gap_confabulation | 3/31 | 10% | 缺证据时编造因果 | 仅 1/3 真涉证据缺口（predation evidence），另 2 道泛序列题 | ⚠️ 部分跑偏 |
| premature_evidence_anchoring | 5/34 | 15% | 首个证据即停搜 | 几无一体现"前段诱饵→过早锚定"结构，全是普通结局/序列题 | ❌ 基本跑偏 |
| semantic_rigidity | 6/24 | 25% | 字面匹配拒同义词 | 几无一是真正"同义改写 vs 字面原文"辨析，退化成通用 "which sequence/description accurate" | ❌ 基本跑偏 |

**结论**：DB 忠实记录了每题"打算"针对哪个子模式，但 11 道（semantic_rigidity 6 + premature_anchoring 5）严重跑偏，另 2 道（evidence_gap）部分跑偏。

**跑偏机制**：`instruction` 注入到 prompt 的 `## Special Focus:` 段后，VLM 未贯彻特异的失败结构，**回退到最省力的"哪个序列/描述准确"通用模板**。尤其 semantic_rigidity（需"正解同义改写 + 干扰项字面原文语义错"这种精巧结构）被直接忽略。

**佐证**：过门率越是靠"易混"取胜的模式越低——temporal 11%、evidence_gap 10%、premature 15%，说明真正尝试做易混的题大量被 multi_true 门杀掉，能通过的都是退化后的安全题。这与 §二"负空间干扰项"是同一病的两面：过门率压力下，VLM 既把干扰项做成缺席事件，也把题型拉平成通用序列题，两头都丢特异性。

## 六、Action Items

### A. 改 SubPattern（`app/question_gen/strategy_action_recognition.py`）
1. **全部 `distractor_rules` 增加硬约束**："每个干扰项必须对应视频中真实发生过的动作/实体，仅在时点、主体、执行方式或对象上与正解不同；严禁使用视频中不存在的动作作为干扰项。" 落实"负空间干扰项"禁令。
2. **temporal**：`distractor_rules` 增加"正确顺序不得可由单一时间戳字段线性读出；采用同一 L2 段内、时间戳接近（<Δ 秒）的多个真实事件，迫使逐帧核对而非读数排序"。
3. **fine_grained**：强制"4 选项为同一动词的 4 种真实执行方式（如顺/逆时针、单手/双手），其中≥2 种在视频不同片段真实出现过"。
4. **cross_segment**：`sampling_level_override` 由 1 改回 **2（L2）**，避免 L1 摘要预聚合；`distractor_rules` 要求"强干扰项=只包含部分片段真实动作的合法子序列"。
5. **premature_anchoring**：强制"前段必须存在一个与某干扰项字面吻合的真实局部匹配"（诱饵必须真实存在，当前是缺席）。
6. **持久化 `sub_pattern`**：在候选落盘时写入 accepted_questions（补 `metadata.sub_pattern`），供后续诊断按模式分层统计（DB 已有，需同步到产物 JSON）。
6b. **修复归属跑偏（semantic_rigidity / premature_anchoring）**：这两类 instruction 太抽象，VLM 回退成通用序列题（见 §5.5）。改法：instruction 内嵌 1-2 个"必须长这样"的具体题型模板 + few-shot 正例，并加一个"结构符合度"额外 gate（extra_gates），校验题目是否含该模式的必要成分（如 semantic_rigidity 必须有一个字面复用素材原文的干扰项），不符则退回重生成。

### B. 改出题管线 / 门控
7. **`gate_multi_true` 松绑为分级**：区分"两个选项都完全正确"（应毙）与"两个选项都部分沾边、需辨析"（应留）。当前二元门是易混题的主要杀手，需改为"仅当≥2 选项完全满足题干时 fail"。
8. **`action_recognition.md` 删除/改写** "Do NOT write questions where multiple options could reasonably be correct" —— 改为"错误选项应是视频中真实发生、但在时点/主体/方式/对象上与正解不同的近似动作（near-miss），而非视频中不存在的动作"。
9. **新增"负空间干扰项"检出门**：对每个干扰项做一次 `search_similar`/树核实，若某题≥2 个干扰项在树中零命中 → 判定为"负空间安全题"，退回重生成（把"能被排除法秒杀"变成显式失败信号）。
10. **新增难度基线门（观测性）**：出题后用当前 baseline agent 试答，正确率>85% 的批次触发告警——把"太简单"从事后发现变成管线内的可观测指标。

## 七、独立审查修正（Codex，只读核实原始数据/代码/门控）

Codex 独立重数了 reasoning、查了 DB 拒绝原因、读了门控与管线代码，**证实主病但修正三处夸大、补三处遗漏根因**。整体可信度：诊断 7/10、action items 7/10。

### 被修正的原结论（本报告更新为以下）
| 原结论 | 修正 |
|--------|------|
| §一"80% 靠负证据排除"（24/30） | 排除式 reasoning 约 23/30 成立；但**纯"负空间"事件**严格计只 18–21/30——原数把"错序/错主体/表格反证"也混入了负空间 |
| §二 multi_true 是完整 smoking gun | multi_true 确是首因拒绝最多的门（137 拒中约 63 次首因），**但大量 multi_true='fail' 的实际原因是 "No source material provided"，源于下方 gate 树错配 bug，而非"两真实近似选项都合理"**——smoking gun 被此 bug 污染，不能全算门控之过 |
| §5.5 evidence_gap "仅 1/3 贴合" | 实为 **2/3 贴合**（#12 描述未展示、#20 展示 vs 旁白暗示均属 evidence gap），仅 #10 跑偏 |

### 遗漏的根因（新增，均已核实）
1. **gate 树错配 bug（真代码 bug，最高优先级）**：`pipeline_v2.py` retry 换视频后用 `current_tree` 采样/生成（370/391 行），但 `run_gates(tree=tree,...)` 仍传**原始 tree**（471 行）。换视频重试的题门控用错树验证→大量"无 source material"假拒绝，**污染了 DB 拒绝原因统计**。需先修此 bug 再重估门控归因。
2. **gate_key_verify 过宽**：只要"文本或帧任一支持正解"即 pass，不校验错误选项是否 near-miss，故放行"1 正解+3 缺席动作"。
3. **OCR/静态文本泄漏未挡**：#1 gym visible_text、#8 最终成绩表、#26 board/Spanish labels 本质是读屏字非动作识别。

### Action items 评估修正
- **纯改 `distractor_rules` 文案不够**（A1/A3 等）：当前失败正是 VLM 不落实抽象规则，必须配"真实动作候选池"或结构 gate。
- **松绑 multi_true 有风险**：需把 rubric 精确为"错误选项可有局部证据，但在题干限定的主体/时点/方式/对象下必须为假"，否则放进真歧义坏题。
- **A9 负空间检出门用 search_similar 成本高、误判多**（同义/视觉细节/字幕缺漏会误判）：更优是**先从素材抽真实动作库存，再由库存组合 near-miss 干扰项**（从源头杜绝负空间，而非事后检出）。
- **新增更优改法**：①先修 tree bug；②建"真实动作候选池"（实体/动作/时点/对象/方式）供 near-miss 构造；③per-pattern 结构验证器（semantic 必含"同义正解+字面陷阱"、premature 必含"前段真实诱饵"）；④AR 加 OCR/静态文本惩罚门；⑤"树可见性"难度评估——用完整树/去时间戳树/L2-only/frame-only 分别测，定位到底是视频理解难还是摘要泄漏。

## 相关文件
- 6 SubPattern 定义：`app/question_gen/strategy_action_recognition.py:26-212`
- 出题 prompt：`store/prompts/question_gen/action_recognition.md`
- 去歧义门（根因制度推手）：`store/prompts/question_gen/gate_multi_true.md`
- 数据：`store/questions/generated-ar30/accepted_questions.json`、`scratchpad/ar30_baseline_analysis.json`
- SubPattern 真实归属（DB）：`logs/question_gen_ar30.db` 表 `question_gen_items` 列 `sub_pattern`（§5.5 核对依据）
