# Pipeline 問題分析報告

**作者**：M4  
**日期**：2026-05-07  
**測試標的**：YouTube Charade (25fps, AV1, English) UUID: `aeed71342a899fe4b4c57b7d41bcb692`

---

## 總覽

7/7 processors completed，job 標為 completed，但部分 post-processing 產出為 0。

---

## 問題 1：ASR 輸出格式與 Rule 1 不匹配 🔴

### 現象
- ASR processor completed（457 segments）
- Rule 1 Ingestion completed: **0 chunks inserted**
- Qdrant `momentry_dev_rule1` 卻有 1,630 points

### 根因
ASR 輸出使用 `segments` 格式：
```json
{
  "language": "en",
  "segments": [
    {"start": 197.04, "end": 199.04, "text": "You", "scene_number": 25, "language": "en"},
    ...
  ]
}
```

但 Rule 1 ingest (`rule1_ingest.rs`) 預期 `frames` / `faces` 格式：
```rust
// rule1_ingest.rs 中的 fetch_asr_segments() 查詢
// 從 pre_chunks 讀取，processor_type='asr'
// 期待 data 中有 text, start, end 等欄位
```

ASR 的 segments 格式雖然正確寫入了 pre_chunks（data 欄位包含 text/start/end），但 Rule 1 的解析邏輯可能與 segments 結構不完全相容。

### 影響
- 無法產生 sentence chunks → Rule 3 無內容可聚合 → 5W1H summary 無法執行
- Qdrant `momentry_dev_rule1` 有 1,630 points（可能從其他地方來）

---

## 問題 2：ASR 輸出寫入 .err 檔案 🟡

### 現象
```bash
ls output/*.asr.json      # ❌ 不存在
ls output/*.asr.json.err  # ✅ 55KB，內含完整 ASR JSON
```

### 根因
ASR processor 將 stdout 寫到 `.asr.json`，stderr 寫到 `.asr.json.err`。但 ASR script 將 JSON 輸出寫往了 stderr 而非 stdout。

### 影響
- 若不手動複製 `.err → .json`，後續 processor 找不到 ASR 輸出
- 已在 M4 手動修正後 pipeline 才順利跑完

---

## 問題 3：face_detections = 0 🟡

### 現象
- face.json：3,993 frames, 6,188 face detections（sample_interval=30）
- Face trace + DB store：✅ completed
- face_detections table：**0 筆**

### 根因推測
1. **sample_interval=30** 對 25fps 影片 = 每 1.2 秒一幀。相鄰 frame 間隔過大，IoU + embedding matching 無法建立 trace
2. 或 `store_traced_faces.py` 執行時找不到 `scene.json` 或 `cut.json`（因 registration 時 cut 失敗）
3. 或 scene-cut 邏輯將所有 face 都 reset 掉（1330+ scenes）

### 影響
- 無法做 trace-based identity binding
- Qdrant face collection 有 5,831 points（processor 直接寫入的），但沒有 trace_id

---

## 問題 4：Registration 階段 cut_processor 參數錯誤 🟡

### 現象
```
[REGISTER] CUT failed: cut_processor.py: error: unrecognized arguments: --threshold 27
```

### 根因
`src/api/server.rs` 在 `register_single_file()` 中傳遞 `--threshold 27` 給 `cut_processor.py`，但該 script 已更新，不再支援此參數。

### 影響
- Registration 時 CUT/scene detection 失敗
- 但 pipeline 中的 CUT processor 可以單獨執行成功（不傳 threshold）
- 需要同步 server.rs 與 cut_processor.py 的介面

---

## 問題 5：search/universal Chunk 缺少 fps 🔴

**檔案**：`src/api/universal_search.rs`

`SearchResult::Chunk` 有 `start_frame`、`end_frame`，但**沒有 `fps`**。前端無法將 frame number 換算為時間。

---

## 問題 6：IdentityChunkItem 缺少 frame 欄位 🟡

**檔案**：`src/api/identity_api.rs`

`IdentityChunkItem` 只有 `start_time`、`end_time`，缺 `start_frame`、`end_frame`、`fps`。

---

## 問題 7：多個 search endpoint 缺少 frame 欄位（文件已補，code 未修）

詳見 `M5_workspace/2026-05-06_bug_search_missing_fps.md`

---

## 癥結圖

```
ASR (.err→.json 問題)
  │
  ├── segments format → Rule 1 ingest 無法解析 → 0 sentence chunks
  │                                                    │
  │                                          Rule 3 無內容可聚合
  │                                                    │
  │                                          5W1H summary 無法執行
  │
  └── 手動複製 .err → .json 後可讀
      但格式仍是 segments，Rule 1 仍無法產出 sentence chunks
```

## 建議優先順序

| # | 問題 | 優先級 | 影響 |
|---|------|--------|------|
| 1 | Rule 1 支援 ASR segments 格式 | 🔴 High | 5W1H pipeline 阻塞 |
| 2 | ASR 輸出寫入正確檔案路徑 | 🔴 High | 每次需手動修正 |
| 3 | cut_processor --threshold 參數 | 🟡 Medium | Registration 時 CUT 失敗 |
| 4 | face tracker scene-cut + 稀疏取樣 | 🟡 Medium | face_detections 0 |
| 5 | universal search Chunk 缺 fps | 🟡 Medium | 前端 frame 定位 |
| 6 | IdentityChunkItem 缺 frame 欄位 | 🟢 Low | 前端顯示 |
