# V4.0 Migration 问题追踪报告

> Date: 2026-04-28 20:50
> Status: Phase 1 + Phase 2 完成，数据源问题修复中

---

## 已完成工作

### Phase 1: 术语统一 (video_uuid → file_uuid)

| 类别 | 数量 | 状态 |
|------|------|------|
| **Rust 代码** | 11 文件 | ✅ 完成 |
| **Portal (PHP)** | 6 文件 | ✅ 完成 |
| **文档** | 117 处 | ✅ 完成 |
| **Migration 025** | DB 列重命名 | ✅ 完成 |

### Phase 2: 架构简化 (person_identities 删除)

| 类别 | 状态 |
|------|------|
| **Migration 026** | file_identities 表创建 ✅ |
| **Migration 027** | identities.identity_id 添加 ✅ |
| **Migration 028** | person_identities 删除 ✅ |
| **SQLx Cache** | 已更新 ✅ |

### 今日修复

| 问题 | 分析报告 | 修复状态 |
|------|----------|----------|
| **UUID 长度问题** | `UUID_LENGTH_ISSUE.md` | ✅ 分析完成（保持兼容） |
| **Videos 表命名** | `VIDEOS_TABLE_NAMING_ISSUE.md` | ✅ 分析完成（保持现状） |
| **Rule 1 Face 数据源** | `RULE1_FACE_DATA_SOURCE_FIX.md` | ✅ 修复完成 |

---

## 发现的问题

### 问题 1: UUID 长度不一致

**现象**:
- 20 个 video 使用 16-char UUID（旧格式）
- 7479 个 video 使用 32-char UUID（Birth UUID）

**示例**: `384b0ff44aaaa1f14cb2cd63b3fea966` (16-char)

**原因**:
- `compute_uuid()` 取 SHA256[0:16]
- `compute_birth_uuid()` 取 SHA256[0:32]

**决策**: 保持兼容模式（不强制迁移）

**影响**: 
- Birth UUID 功能受限（`is_birth_uuid()` 返回 false）
- 跨设备同步不支持

---

### 问题 2: 表命名不一致

**现象**:
- 表名: `videos`
- 术语: `file_uuid`

**原因**: Phase 1 迁移计划缺失表重命名

**对比**: `talents → identities` 已完成，但 `videos → files` 未执行

**决策**: 短期保持现状，中期添加别名，长期完整重命名

**影响**:
- 文档与代码不一致
- 新开发者困惑

---

### 问题 3: Rule 1 数据源不匹配

**现象**:
- Face 数据在 face_detections 表
- rule1_ingest.rs 从 pre_chunks 读取

**修复**: fetch_face_frames() 改为从 face_detections 读取

**验证**: 编译通过，数据源正确

**遗留**: YOLO/ASRX 数据缺失

---

## Processor 状态 (384b0ff44aaaa1f14cb2cd63b3fea966)

| Processor | processor_results | chunks_produced | 数据源状态 |
|-----------|-------------------|-----------------|------------|
| **ASR** | completed | 3664 | pre_chunks ✅ |
| **CUT** | completed | 1332 | pre_chunks ✅ |
| **Face** | failed | 0 | face_detections 有 78 条 ⚠️ |
| **YOLO** | failed | 0 | pre_chunks 缺失 ❌ |
| **OCR** | failed | 0 | pre_chunks 缺失 ❌ |
| **ASRX** | 未运行 | - | pre_chunks 缺失 ❌ |

---

## Rule 1 数据可用性

| 数据类型 | 可用 | Rule 1 可用 |
|----------|------|-------------|
| **ASR segments** | ✅ 3664 | ✅ |
| **CUT segments** | ✅ 1332 | ✅ |
| **Face frames** | ✅ 78 (修复后) | ✅ |
| **YOLO frames** | ❌ 0 | ❌ → metadata.yolo_objects = [] |
| **ASRX segments** | ❌ 0 | ❌ → metadata.speaker_id = "UNKNOWN" |

---

## 待解决问题

### 高优先级

| 问题 | 影响 | 解决方案 |
|------|------|----------|
| **YOLO processor failed** | YOLO objects 缺失 | 检查错误日志，修复 processor |
| **ASRX processor 未运行** | Speaker ID 缺失 | 启动 ASRX processor |
| **2 个 Rule1 jobs QUEUED** | Rule 1 未执行 | 启动 Job Worker |

### 中优先级

| 问题 | 影响 | 解决方案 |
|------|------|----------|
| **Face processor failed** | processor_results 记录错误 | 检查错误原因 |
| **chunks metadata 空** | Face/Speaker 未绑定 | 重新运行 Rule 1 |

### 低优先级

| 问题 | 影响 | 解决方案 |
|------|------|----------|
| **20 个 16-char UUID** | Birth UUID 功能受限 | 长期迁移计划 |
| **videos 表命名** | 术语不一致 | 长期重命名计划 |

---

## Jobs 状态

```sql
SELECT id, status, rule, created_at 
FROM dev.jobs 
WHERE asset_uuid = '384b0ff44aaaa1f14cb2cd63b3fea966';

-- Result:
id: 9e5df703... status: QUEUED, rule: rule1, created: 2026-04-21 19:04
id: 751d90b5... status: QUEUED, rule: rule1, created: 2026-04-21 16:54
```

**问题**: Job Worker 可能未运行

---

## 下一步计划

### Phase 1: Processor 启动

1. 检查 YOLO processor 错误日志
2. 启动 ASRX processor
3. 等待 processor_results 完成

### Phase 2: Rule 1 测试

1. 启动 Job Worker
2. 执行 Rule 1 处理
3. 验证 chunks metadata:
   - speaker_id (来自 ASRX)
   - yolo_objects (来自 YOLO)
   - face_ids (来自 face_detections)

### Phase 3: Identity 绑定

1. 创建 identity_binding_v4.rs
2. Face → Identity 直接绑定
3. Chunk 自动绑定

---

## 相关文档

| 文档 | 说明 |
|------|------|
| `docs_v1.0/UUID_LENGTH_ISSUE.md` | UUID 长度问题分析 |
| `docs_v1.0/VIDEOS_TABLE_NAMING_ISSUE.md` | 表命名问题分析 |
| `docs_v1.0/RULE1_FACE_DATA_SOURCE_FIX.md` | Face 数据源修复 |
| `docs_v1.0/RULE1_CHUNK_INGESTION_CHECK.md` | Rule 1 问题分析 |
| `docs_v1.0/RULE1_TRIGGER_MECHANISM.md` | Rule 1 启动机制 |
| `docs_v1.0/V4_MIGRATION_COMPLETE.md` | Migration 完成报告 |

---

## 统计数据

### 数据库记录

| 表 | 记录数 | 备注 |
|-----|--------|------|
| **videos** | 7499 | 20 个 16-char UUID |
| **face_detections** | 78 (384b0ff44...) | 通用数据 |
| **chunks** | 3664 | sentence 类型 |
| **pre_chunks** | 4996 | ASR + CUT |

### Migration 文件

| 文件 | 说明 | 状态 |
|------|------|------|
| `025_rename_video_uuid_to_file_uuid.sql` | 列重命名 | ✅ |
| `026_create_file_identities_table.sql` | file_identities 表 | ✅ |
| `027_add_identity_id_to_identities.sql` | identity_id 列 | ✅ |
| `028_drop_person_identities_table.sql` | 删除旧表 | ✅ |

---

## 代码质量

### 编译验证

```bash
cargo check --lib   # ✅ Passed (warnings only)
cargo test --lib    # ✅ 178 tests passed
cargo clippy --lib  # ✅ Passed
```

### 未修改文件

- identity_binding_v4.rs（已删除，待重写）
- Job Worker（待检查运行状态）

---

## 结论

**已完成**:
- ✅ V4.0 Migration Phase 1 + Phase 2
- ✅ UUID 长度问题分析（决策：保持兼容）
- ✅ Videos 表命名问题分析（决策：保持现状）
- ✅ Rule 1 Face 数据源修复

**待处理**:
- 🔧 YOLO/ASRX processor 启动
- 🔧 Job Worker 启动
- 🔧 Rule 1 测试验证

**建议**: 先解决 Processor 问题，再测试 Rule 1 完整流程。
