# BÁO CÁO BÀN GIAO (HANDOFF REPORT) — EXPLORER M3-3
**Vai trò**: M3 Orchestrator & Ambience Asset Specialist  
**Working Directory**: `c:\Projects\KieuStory\.agents\teamwork\explorer_m3_3`  
**Parent ID**: `f9992164-c0e4-4f7d-ba4a-25a83a4436bf`  
**Milestone**: M3 (4-Stem Audio Engine & Ambience Continuity)

---

## 1. OBSERVATION (Quan sát trực tiếp)

1. **`05_Production_Pipeline/production_orchestrator.py` (dòng 350-405)**:
   Hàm `concat_scene_shots` hiện tại tạo bộ lọc FFmpeg:
   ```python
   concat_filter = f"{''.join(filter_parts)}concat=n={n}:v=1:a=1[v][a]"
   ```
   Lệnh thực thi `subprocess.run(cmd, ...)` trực tiếp gọi filter trên mà KHÔNG hề gọi đến `AudioContinuityEngine.stitch_with_audio_crossfade()`.
2. **`05_Production_Pipeline/production_orchestrator.py` (dòng 407-451 & dòng 454-470)**:
   Hàm `master_scene_audio` và CLI argument parser:
   - Chỉ có argument `--bgm` (Stem 1).
   - Hoàn toàn KHÔNG có tham số `--ambience` (Stem 2).
   - Gọi `engine.normalize_loudness` theo chế độ 1-pass `loudnorm=I={target_lufs}:TP={target_tp}:LRA={target_lra}`.
3. **`04_Assets/audio_sfx/`**:
   - `list_dir` tại `c:\Projects\KieuStory\04_Assets\audio_sfx` trả về `Empty directory` (0 files).
   - Quét toàn bộ repository: File âm thanh duy nhất tồn tại là `04_Assets/audio/scene01_bgm.m4a` (178.88s, 48kHz stereo, Opus, mean_volume -18.0 dB).
   - Hoàn toàn KHÔNG tồn tại file Stem 2 liên tục cho âm cảnh đám đông hội xuân (Scene 04).
4. **`04_Assets/videos/` cho Scene 04**:
   - Chỉ có 2 file video shot: `ep01_scene04_shot01_10s.mp4` và `ep01_scene04_shot02_10s.mp4`.
   - Cả 2 video có audio codec aac, sample rate 24000 Hz, 1 channel (mono).
   - Âm lượng trung bình: Shot 01 là -26.9 dB, Shot 02 là -30.0 dB. Chênh lệch delta = 3.1 dB (vượt ngưỡng kiểm tra 3.0 dB của `AudioContinuityEngine.inspect_sequence`).
   - File `ep01_scene04_master.mp4` hiện tại có thời lượng 20.0s (ghép từ 2 shot trên bằng naive concat), trong khi kịch bản Cảnh 04 quy định 12 shots = 120s (2m00s).
5. **`PROJECT.md` (dòng 48-49)**:
   ```markdown
   | M2 | Universal Standards & Prompt Registry | Create Universal Acting Directives, update Gemini Banana & Muse.ai prompt registries with 188 shots (R3, R4, R5, Director Directives) | M1 | IN_PROGRESS |
   | M3 | 4-Stem Audio Engine & Ambience Continuity | Audio crossfade concat, continuous festival ambience, 2-pass EBU R128 -14 LUFS normalization | M1 | PLANNED |
   ```
   Chạy `python tests/run_all_tests.py` ghi nhận:
   `Ran 155 tests in 6.761s. OK. Total Tests Executed: 155, Passed: 155 (100.0%), Failures: 0, Errors: 0`. Toàn bộ yêu cầu M2 của Worker M2 1 đã hoàn thành.

---

## 2. LOGIC CHAIN (Chuỗi suy luận logic)

1. Từ Quan sát 1: `production_orchestrator.py` dùng `concat=n=N:v=1:a=1[v][a]`, suy ra **`production_orchestrator.py` KHÔNG mặc định sử dụng `audio_continuity_engine.py`'s crossfade concatenation**. Kết quả ghép nối hiện tại là hard cut âm thanh, tạo tiếng nổ click/pop và hẫng âm giữa các shot, vi phạm Feature F8 ("Audio Continuity & Crossfade Concat").
2. Từ Quan sát 2: `master_scene_audio` thiếu `--ambience`, suy ra hiện tại pipeline không thể tự động lồng ghép luồng âm cảnh Stem 2 liên tục (bắt buộc theo F9 và `CINEMATIC_AUDIO_PIPELINE.md`) khi xuất xưởng scene master.
3. Từ Quan sát 3: `04_Assets/audio_sfx/` rỗng, suy ra **chưa có tài nguyên Stem 2 festival ambience**. Để Cảnh 04 đạt yêu cầu âm thanh hội xuân đạp thanh liên tục 120s, Worker cần tạo script sinh hoặc cung cấp asset `ep01_scene04_festival_crowd_ambience_120s.wav` (48kHz stereo) vào thư mục này.
4. Từ Quan sát 4: Cảnh 04 có độ lệch âm lượng giữa 2 shot là 3.1 dB và sample rate 24kHz mono từ Muse.ai, suy ra phương thức `stitch_with_audio_crossfade` là tuyệt đối cần thiết để resample lên 48kHz, crossfade `qsin` 1.0s và chuẩn hóa gain staging trước khi ghép nối.
5. Từ Quan sát 5: 155/155 test suites đã pass 100%, M2 đã xong trọn vẹn, suy ra dòng 48-49 của `PROJECT.md` cần được chuyển ngay sang trạng thái: M2 `DONE`, M3 `IN_PROGRESS`.

---

## 3. CAVEATS (Vấn đề lưu ý & Giới hạn khảo sát)

1. **Khác biệt thời lượng giữa Audio và Video khi dùng `acrossfade`**: Trong FFmpeg, `acrossfade` thu ngắn luồng audio đi `(N-1) * crossfade_dur` giây. Nếu luồng video dùng `concat` không cắt gọt, audio sẽ bị lệch pha (desync) với video. Do đó, khuyến nghị Worker cấu hình `AudioContinuityEngine`: hoặc dùng video `xfade` tương ứng, hoặc trải thảm Stem 2 ambience liên tục và dùng micro-crossfade cục bộ (0.5s - 0.75s) để bù đắp, hoặc dùng `apad` giữ độ dài audio.
2. **Số lượng shot thực tế của Scene 04 trên ổ cứng**: Mặc dù kịch bản định nghĩa 12 shots, hiện tại `04_Assets/videos/` chỉ có sẵn 2 shot vật lý (`shot01` và `shot02`). Việc kiểm thử render 10 shot còn lại thuộc thẩm quyền của render worker và tài khoản Muse.ai.

---

## 4. CONCLUSION (Kết luận & Đề xuất hành động)

1. **Khẳng định kết quả kiểm tra**:
   - `production_orchestrator.py` **chưa mặc định** dùng crossfade concat của `audio_continuity_engine.py`.
   - `04_Assets/audio_sfx/` hiện **chưa có** track âm cảnh đám đông hội xuân liên tục cho Cảnh 04.
2. **Chỉ đạo thực thi cho Worker M3**:
   - **Mục 1 (PROJECT.md)**: Cập nhật dòng 48 thành `DONE`, dòng 49 thành `IN_PROGRESS`.
   - **Mục 2 (`production_orchestrator.py`)**: 
     - Sửa `concat_scene_shots` để mặc định gọi `AudioContinuityEngine.stitch_with_audio_crossfade(..., crossfade_dur=1.0)`.
     - Bổ sung tham số `--ambience` và logic lồng Stem 2 vào `master_scene_audio`.
     - Áp dụng chuẩn versioning `_v*` cho file master xuất xưởng (`_v1.mp4`, `_v2.mp4`...).
   - **Mục 3 (`audio_continuity_engine.py`)**:
     - Bổ sung hàm `master_scene_multistem` (kết hợp video + Stem 2 ambience loop + Stem 1 BGM ducking).
     - Nâng cấp `normalize_loudness_2pass` cho broadcast EBU R128 (-14 LUFS).
   - **Mục 4 (`04_Assets/audio_sfx/`)**:
     - Viết script `05_Production_Pipeline/generate_festival_ambience.py` và sinh tệp `ep01_scene04_festival_crowd_ambience_120s.wav` (48kHz, stereo, 120s).

---

## 5. VERIFICATION METHOD (Phương pháp kiểm chứng độc lập)

1. **Kiểm tra trạng thái PROJECT.md**:
   `grep -n "M2" PROJECT.md` -> dòng 48 phải hiển thị `DONE`.
   `grep -n "M3" PROJECT.md` -> dòng 49 phải hiển thị `IN_PROGRESS`.
2. **Kiểm tra mã nguồn `production_orchestrator.py`**:
   `grep -n "stitch_with_audio_crossfade" 05_Production_Pipeline/production_orchestrator.py` -> phải tìm thấy lời gọi trong `concat_scene_shots`.
   `python 05_Production_Pipeline/production_orchestrator.py --help` -> phải hiển thị các tham số `--crossfade-dur` và `--ambience`.
3. **Kiểm tra sự hiện diện của tệp âm cảnh**:
   `dir 04_Assets\audio_sfx\ep01_scene04_festival_crowd_ambience_120s.wav` -> file tồn tại, kích thước > 0.
4. **Kiểm tra hồi quy toàn diện test suite**:
   Chạy lệnh: `python tests/run_all_tests.py` -> Kết quả bắt buộc: 155/155 test cases PASS (100.0%), zero failures, zero errors.
