# M5 近期變更 — 提供 M4 同步

**日期**：2026-05-07

---

## 程式碼變更（需同步）

### 1. Identity Agent — 迭代多角度 face matching
**檔案**：
- `src/core/tmdb/face_agent.rs` — 重寫 `match_faces_against_tmdb`，支援 iterative multi-angle propagation
- `src/api/identity_agent_api.rs` — `analyze_identity` 改為會寫入 DB + `match_faces_iterative` 函數
- 新增 `quality_check_temporal_collisions`：時序碰撞 QC

**效果**：TMDb seed → 99% trace 綁定（2769 traces 中 2759 matched）

### 2. Scene Classification — ANE CoreML
**檔案**：
- `scripts/scene_classifier.py` — CoreML predict 改為 numpy array 輸入 + softmax
- `src/core/processor/scene_classification.rs` — 傳入 CoreML model path
- 已轉換 CoreML 模型：`/Users/accusys/models/resnet18_places365.mlpackage`（23MB）
- ANE 延遲：0.4ms（CPU 12.4ms，28x 加速）

### 3. Places365 模型
- 下載安裝：`/Users/accusys/models/resnet18_places365.pth.tar`（MIT 授權，可商用）

### 4. Pipeline 優化
- `src/worker/processor.rs` — `sweep_stale` 改為 reset 到 Pending（非 Failed）
- `src/worker/processor.rs` — `kill_existing_processor` 防止重複啟動
- `src/worker/job_worker.rs` — `any_pending` + `any_skipped` 檢查，防止 premature completion
- `src/api/server.rs` — 預設 processor 加入 scene
- `src/core/processor/executor.rs` — timeout 時保留 partial 輸出（.tmp → .json 非 .err）

### 5. 5W1H+ Prompt
**檔案**：`src/api/five_w1h_agent_api.rs` — 重寫，parent 5W1H+ → child enhanced sentences

### 6. Embedding ANE CoreML
- CoreML 模型：`/Users/accusys/models/mxbai-embed-large-v1.mlpackage`（669MB）
- ANE 延遲：8.5ms（Ollama 14.6ms，1.8x 加速）
- 環境變數：`MOMENTRY_EMBED_URL=http://localhost:11435`

## 環境變數 `.env.development` 新增

```
MOMENTRY_EMBED_URL=http://localhost:11435
MOMENTRY_LLM_SUMMARY_URL=http://192.168.110.201:8081/v1/chat/completions
MOMENTRY_LLM_SUMMARY_MODEL=google_gemma-4-26B-A4B-it-Q5_K_M.gguf
```

## 已下載的模型

| 模型 | 位置 | 用途 |
|------|------|------|
| Gemma4 26B MoE | `/Users/accusys/models/google_gemma-4-26B-A4B-it-Q5_K_M.gguf`（18GB） | 5W1H LLM |
| Qwen3 30B MoE | `/Users/accusys/models/Qwen_Qwen3-30B-A3B-Instruct-2507-Q5_K_M.gguf`（20GB） | 備用 LLM |
| Mistral 24B | `/Users/accusys/models/Mistral-Small-3.1-24B-Instruct-2503-Q5_K_M.gguf`（16GB） | 備用 LLM |
| mxbai-embed-large CoreML | `/Users/accusys/models/mxbai-embed-large-v1.mlpackage`（669MB） | ANE embedding |
| ResNet18 Places365 CoreML | `/Users/accusys/models/resnet18_places365.mlpackage`（23MB） | ANE scene class |
| bge-m3 GGUF | `/Users/accusys/models/bge-m3-q8_0.gguf`（605MB） | 備用 embedding |
| mxbai-embed-large GGUF | `/Users/accusys/models/mxbai-embed-large-v1-q8_0.gguf`（341MB） | 備用 embedding |
| nomic-embed-text-v2-moe GGUF | `/Users/accusys/models/nomic-embed-text-v2-moe.Q5_K_M.gguf`（354MB） | 備用 embedding |

## 背景任務執行中
1. **Face re-scan**：對 482 個 cut scenes 以 1-frame interval 重新掃描臉部，補充 single-frame traces
2. **Scene classification**：以 ANE CoreML + 5s 間隔，對 Charade 進行場景分類

## 已知問題
- Scene classification 輸出只有 1 個 scene（class 129: door），需要進一步調試 merge 邏輯
