# Rule 1 数据源修复记录

> Date: 2026-04-28 20:45
> Fix: Face 数据源从 pre_chunks → face_detections

---

## 修复内容

### 修改文件

| 文件 | 修改内容 |
|------|----------|
| `src/core/chunk/rule1_ingest.rs` | Face 数据源修复 |

### 代码变更

#### 1. FaceDetection 结构更新

```rust
// Before
struct FaceDetection {
    person_id: String,
    confidence: f64,
}

// After
struct FaceDetection {
    face_id: String,           // person_id → face_id
    confidence: f64,
    identity_id: Option<i32>,  // 新增 V4.0 字段
}
```

#### 2. fetch_face_frames() 重写

```rust
// Before: 从 pre_chunks 读取
SELECT coordinate_index as frame, data
FROM pre_chunks
WHERE file_uuid = $1 AND processor_type = 'face'

// After: 从 face_detections 读取
SELECT 
    frame_number as frame,
    face_id,
    confidence,
    identity_id
FROM face_detections
WHERE file_uuid = $1
ORDER BY frame_number
```

#### 3. 调用参数移除

```rust
// Before
let face_frames = fetch_face_frames(pool, file_uuid, &pre_chunks_table).await?;

// After
let face_frames = fetch_face_frames(pool, file_uuid).await?;
```

#### 4. find_face_ids() 字段名更新

```rust
// Before
if face.confidence > 0.5 && !face_ids.contains(&face.person_id)

// After
if face.confidence > 0.5 && !face_ids.contains(&face.face_id)
```

---

## 数据验证

### 384b0ff44aaaa1f14cb2cd63b3fea966 数据统计

| 数据源 | 记录数 | 状态 |
|--------|--------|------|
| **ASR (pre_chunks)** | 3664 | ✅ 可用 |
| **CUT (pre_chunks)** | 1332 | ✅ 可用 |
| **Face (face_detections)** | 78 | ✅ 可用（修复后） |
| **YOLO (pre_chunks)** | 0 | ❌ 缺失 |
| **ASRX (pre_chunks)** | 0 | ❌ 缺失 |
| **OCR (pre_chunks)** | 0 | ❌ 缺失 |

### face_detections 详情

```
file_uuid: 384b0ff44aaaa1f14cb2cd63b3fea966
count: 78
frame_range: 1798 - 88102
```

---

## Processor Results 状态

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

---

## Face 数据矛盾分析

### 现象

- processor_results: Face = failed (chunks_produced = 0)
- face_detections: 78 条数据存在

### 原因推测

1. **Face Processor 直接写入 face_detections**
   - Face processor 不写入 pre_chunks
   - 直接写入 face_detections 表
   - processor_results 记录失败（可能是其他原因）

2. **processor_results 记录不准确**
   - chunks_produced 只记录 pre_chunks 数量
   - face_detections 数量未反映

### 结论

Face 数据应从 **face_detections** 读取，而非 pre_chunks。修复已完成。

---

## YOLO/ASRX 缺失问题

### 原因

| Processor | 状态 | 缺失原因 |
|-----------|------|----------|
| **YOLO** | failed | Processor 运行失败 |
| **ASRX** | 未运行 | ASRX processor 未启动 |

### 影响

Rule 1 输出的 chunk metadata 将缺失：
- `yolo_objects`: []（空数组）
- `speaker_id`: "UNKNOWN"

### 解决方案

需启动 YOLO 和 ASRX processor：
1. 检查 YOLO processor 错误日志
2. 启动 ASRX processor
3. 等待完成后重新运行 Rule 1

---

## 编译验证

```bash
cargo check --lib

# Result: Passed (warnings only)
# - unused imports (不影响功能)
```

---

## 后续任务

### 已完成

- ✅ Face 数据源修复（pre_chunks → face_detections）
- ✅ 编译验证通过

### 待处理

- 🔧 YOLO/ASRX processor 启动
- 🔧 Rule 1 测试运行
- 🔧 chunks metadata 验证

---

## 相关文件

| 文件 | 说明 |
|------|------|
| `src/core/chunk/rule1_ingest.rs` | Face 数据源修复 |
| `docs_v1.0/RULE1_CHUNK_INGESTION_CHECK.md` | Rule 1 问题分析 |
| `docs_v1.0/RULE1_TRIGGER_MECHANISM.md` | Rule 1 启动机制 |

---

## 技术细节

### Face 数据聚合逻辑

```rust
// 新实现：按 frame_number 聚合
let mut frame_map: HashMap<i64, FaceFrame> = HashMap::new();

for row in rows {
    let frame = row.try_get("frame").unwrap_or(0);
    let face_id = row.try_get("face_id").ok();
    let confidence = row.try_get("confidence").unwrap_or(0.0);
    let identity_id = row.try_get("identity_id").ok();

    if let Some(face_id) = face_id {
        frame_map
            .entry(frame)
            .or_insert_with(|| FaceFrame { frame, faces: Vec::new() })
            .faces
            .push(FaceDetection { face_id, confidence, identity_id });
    }
}

// 按帧号排序
let mut frames: Vec<FaceFrame> = frame_map.into_values().collect();
frames.sort_by_key(|f| f.frame);
```

### 旧实现 vs 新实现

| 维度 | 旧实现 | 新实现 |
|------|--------|--------|
| **数据源** | pre_chunks | face_detections |
| **SQL** | processor_type='face' | 直接表查询 |
| **聚合** | 单行解析 JSON | 多行聚合到 HashMap |
| **字段** | person_id | face_id + identity_id |

---

## 结论

Face 数据源问题已修复。Rule 1 现在可正确读取 face_detections 数据。

YOLO/ASRX 数据缺失需单独解决（启动相应 processor）。
