# Status — lane-A ## Round 0 — 2026-07-16 — STATUS: in_progress **Directives acknowledged:** round 0 of plan/DIRECTIVES.md (run order & protocol; Lane A = spec M1). **Acceptance checklist** (spec M1 + lane brief): - [ ] `ingest`: ffprobe each file in `data/raw`, register in `videos`, extract mono 16 kHz WAV per video into `data/work/audio/`. - [ ] `sync`: GCC-PHAT (PHAT-whitened, not raw xcorr) pairwise offsets, scored by peak-to-second-peak ratio. - [ ] Global least-squares solve over the offset graph, confidence-weighted, cycle-consistency rejection (>50 ms). - [ ] Drift: windowed GCC-PHAT, line fit → `drift_ppm`; store 0 if `|drift| < 5 ppm`. - [ ] Disconnected sync-graph components → `offset_ms = None` (spec pitfall #5). - [ ] Persist `offset_ms`/`drift_ppm`/`sync_confidence` via `db.update_video_sync`; export `config.SYNC_JSON`. - [ ] `python -m festival4d ingest && python -m festival4d sync` recovers GT offsets (±10 ms) and drift (±3 ppm). - [ ] `pytest` green (new `test_ingest.py`, `test_audio_sync.py`); synthetic end-to-end intact. **Done this round:** branched `lane/a-media` from `main`; baseline `pytest` green (24 passed). Verified env: ffmpeg/ffprobe present, librosa 0.11, scipy 1.18; synthetic fixtures (`data/raw/cam{0,1,2}.mp4`, DB rows GT offsets 0/+1370/−842) in place. Implementing `ingest.py` + `audio_sync.py`. **Blockers / questions for coordinator:** none. `sync.json` schema is unspecified by the spec — designing a self-describing schema (reference id, per-video offset/drift/confidence, raw edges, components); no consumer depends on it (API reads the DB), so no change request needed. **Next:** implement both modules, validate GCC-PHAT against the real extracted fixture audio, write tests, run acceptance, then update status → ready_to_merge.