# Pipeline 整合測試報告

**作者**：M4  
**日期**：2026-05-06  
**測試環境**：M5 (192.168.110.201)  
**Playground**：port 3003  
**影片**：short_clip.mov (UUID: `20b548b97c1a336263f23db20bafc2ec`, 30s, 59.9fps, 1920x1080)  

---

## 1. 註冊 (Registration)

| 項目 | 結果 | 備註 |
|------|------|------|
| POST `/api/v1/files/register` | ✅ PASS | file_uuid 正確產出 |
| duration | ✅ PASS | 30s |
| fps | ✅ PASS | 59.9 |
| GET `/api/v1/file/:uuid/probe` | ✅ PASS | 回傳完整 metadata |

---

## 2. 處理器 (Processors)

指定 7 個 processor：`["asr", "cut", "yolo", "ocr", "face", "pose", "asrx"]`

| Processor | 狀態 | 耗時 | 產出 |
|-----------|------|------|------|
| asr       | ✅ completed | ~60s | 3 個 segments |
| asrx      | ✅ completed | ~5s  | 3 個 segments（Qdrant voice write 失敗） |
| cut       | ✅ completed | ~2s  | 2 個 scenes |
| yolo      | ✅ completed | ~30s | 1200-1800 detections |
| ocr       | ✅ completed | ~1s  | 0（影片無文字） |
| face      | ✅ completed | ~20s | 32 face embeddings |
| pose      | ✅ completed | ~30s | 32 frames |

**7/7 processors completed** ✅

---

## 3. Post-Processing（全部失敗）

| 項目 | 結果 | 原因 |
|------|------|------|
| Rule 1 chunking | ❌ FAIL | job 在 post-processing 前即 failed，未觸發 |
| face_trace + DB store | ❌ FAIL | 同上 |
| Rule 3 scene chunking | ❌ FAIL | 同上 |
| 5W1H summary | ❌ FAIL | 同上 |
| Qdrant face sync | ❌ FAIL | 同上 |

---

## 4. Job 狀態

| 項目 | 值 |
|------|------|
| Job ID | 239 |
| Final status | **failed** |
| chunks 產出 | 0 筆 |
| face_detections | 0 筆 |
| Qdrant face collection | 已建立，0 筆資料 |

---

## 5. 失敗根本原因

### 5.1 Qdrant voice collection 不存在（🔴 Critical）

ASRX processor 在 `processor.rs` 執行完畢後，嘗試寫入 Qdrant voice vector 到 `momentry_dev_voice` collection，但該 collection 從未被建立。

```
Qdrant upsert failed: 404 Not Found
Collection `momentry_dev_voice` doesn't exist!
```

導致 **panic**：

```
thread 'tokio-rt-worker' panicked at src/worker/processor.rs:184:17
```

### 5.2 Worker thread panic 蔓延（🔴 Critical）

panic 發生在 async task 中，未被抓取（no `catch_unwind`），導致：
1. 該 processor 雖然 pre-chunks 已寫入，但 processor_result 標記流程中斷
2. worker 重試該 processor（yolo / asrx 被重試）
3. 重試後仍失敗，job 被標為 `failed`
4. `check_and_complete_job` 從未觸發 → post-processing（Rule 1 / face_trace / Rule 3 / 5W1H）全部跳過

---

## 6. 已修復的 Bug（pipeline 測試前已套用）

| Bug | 檔案 | 說明 |
|-----|------|------|
| Worker completion check | `job_worker.rs` | 原來硬塞 10 個 processor，改為使用 job 實際指定的數量 |
| `uuid`→`file_uuid` column rename | `rule3_ingest.rs` | 3 處 WHERE uuid 改為 WHERE file_uuid |
| `uuid`→`file_uuid` column rename | `five_w1h_agent_api.rs` | 2 處 WHERE uuid 改為 WHERE file_uuid |
| `uuid`→`file_uuid` column rename | `postgres_db.rs` | chunks/videos/processor_results 查詢修復 |
| Search embedding model | `search.rs` | `nomic-embed-text`(768D) → `mxbai-embed-large`(1024D) |

---

## 7. 待解決項目

| # | 項目 | 優先級 | 說明 |
|---|------|--------|------|
| 1 | Qdrant `momentry_dev_voice` collection 自動建立 | 🔴 High | ASRX panic 根因，需在寫入前檢查 collection 是否存在，不存在則自動建立 |
| 2 | `processor.rs` panic 不該 kill worker thread | 🔴 High | 應使用 graceful error handling，panic 應被 catch 並轉為 processor Failed 狀態 |
| 3 | Rule 1 chunking 未驗證 | 🟡 Medium | chunks 表唯一約束 ON CONFLICT 待確認 |
| 4 | face_trace Python exit code 2 | 🟡 Medium | 需確認 Python script 的錯誤原因 |
| 5 | 5W1H LLM 串接 M5 Gemma4 | 🟡 Medium | 需設 `MOMENTRY_LLM_SUMMARY_URL` 環境變數 |
| 6 | Qdrant face collection 重建（1024D） | 🟡 Medium | 現有 768D 需用 mxbai 重新 indexing |
| 7 | smart search / universal search 未測試 | 🟡 Medium | 需 LLM 或改純向量搜尋 |

---

## 8. 測試環境

| 項目 | 值 |
|------|------|
| **機器** | M5 (MacBook Pro) |
| **IP** | 192.168.110.201 |
| **macOS** | 26.4.1 |
| **RAM** | 48GB |
| **CPU** | 18 cores |
| **PostgreSQL** | 18.3（source build） |
| **Redis** | 7.4.3（source build） |
| **Qdrant** | 1.17.1（source build） |
| **Ollama** | 0.23.1 + mxbai-embed-large(1024D) |
| **Gemma4 LLM** | 31B Q5_K_M @ 8081 |
| **Momentry Playground** | port 3003 |
| **測試工具** | curl + M5 端 CLI |
