66 lines
4.6 KiB
Markdown
66 lines
4.6 KiB
Markdown
# Status — lane-D
|
||
|
||
## Round 1 — 2026-07-16 — STATUS: merged
|
||
|
||
**Merged:** `lane/d-events` → `main` (fast-forward, commit `5c2d7c6`) after acceptance below
|
||
passed. Local only (not pushed to `origin` — shared working tree; coordinator drives origin).
|
||
|
||
|
||
**Adversarial review (self-run, 5 lenses → verify):** 3 findings, all confirmed & fixed —
|
||
(1) `detect_candidates` fabricated ~1 candidate/s on silent/DC/noise audio → added an AC-RMS
|
||
(std) floor `MIN_SIGNAL_STD`; silence/DC/noise now return `[]`, fixture unchanged [3,10,17];
|
||
(2) degradation test's raised tripwire was swallowed by `except Exception` → switched to a
|
||
call-recorder (`assert prepared == []`); (3) windowed test ran on a fresh DB → now seeds an
|
||
out-of-window `ai` event and asserts it survives. `pytest` **90 passed** after fixes.
|
||
|
||
|
||
**Directives acknowledged:** round 0 of plan/DIRECTIVES.md (foundation merged; lanes may start;
|
||
lane D is small + fully independent; merge when acceptance passes — no waiting on siblings).
|
||
|
||
**Acceptance checklist** (plan/lane-D-events.md + spec M7) — implementation complete, verified:
|
||
- [x] `detect_candidates` finds candidates within ±0.5 s of fixture ground-truth pulses
|
||
[3.0, 10.0, 17.0]. Evidence: `test_events_ai.py::test_detect_candidates_matches_ground_truth`
|
||
(recall+precision+count). RMS×spectral-flux, centered-10 s-window local-max, ≥ P90.
|
||
- [x] `MomentClassification` + `MomentClassifier` frozen contract preserved verbatim; import
|
||
of events_ai pulls in ZERO heavy libs/SDKs (all lazy). Evidence: import-cost probe → `[]`.
|
||
- [x] Three providers implemented against the installed SDKs (verified surfaces): Gemini
|
||
(google-genai 2.11.0, `Part.from_bytes(data,mime_type)` + `generate_content` structured
|
||
output), Claude (anthropic 0.116.0, `messages.parse(output_format=…, thinking=adaptive,
|
||
max_tokens)` → `parsed_output`, NO temperature, model `claude-opus-4-8`), Local
|
||
(openai 2.45.0, `chat.completions.create` json_object, 6 image_url parts, 1 retry).
|
||
- [x] Provider selection `FESTIVAL4D_CLASSIFIER=gemini|claude|local` (default gemini);
|
||
unconfigured → candidates-only + log line. Evidence: `test_get_classifier_*` (5 tests).
|
||
- [x] Per-candidate exception isolation. Evidence: `test_run_events_isolates_per_candidate_failure`
|
||
(2 ai + 1 fallback candidate; batch of 3 completes despite one raising).
|
||
- [x] `run_events` fills the frozen entrypoint (cli.py + api.py dispatch); writes via db helpers
|
||
only (insert-once in final state — db.py has no update-event helper; end state matches spec).
|
||
- [x] `pytest` green with NO network: **90 passed** across consecutive full-suite runs
|
||
(16 lane-D tests; failures observed once were a transient lane-A shared-`AUDIO_DIR` race).
|
||
- [x] Real-path end-to-end (ffmpeg-decoded AAC audio, not in-memory): isolated 20 s fixture →
|
||
`run_events()` degraded → candidates at 3.008/10.016/17.013 s (≤0.016 s error), exactly 3,
|
||
no spurious. Evidence: scratchpad/e2e_verify.py → RESULT PASS.
|
||
|
||
**Done this round:** implemented `backend/festival4d/events_ai.py` (candidate detection + 3
|
||
providers + get_classifier + prepare_inputs + run_events orchestration) and
|
||
`backend/tests/test_events_ai.py` (16 tests). Detection algorithm locked via a scratch
|
||
experiment before coding. Confirmed Claude call shape via claude-api skill and all three SDK
|
||
surfaces via introspection. Ran a 5-lens adversarial review (8 agents: spec-compliance /
|
||
provider-SDK / detection-orchestration / contract-ownership / test-quality → verify); 3 findings
|
||
confirmed and all fixed (see the review summary at the top of this round).
|
||
|
||
**Coordinator note (out-of-strict-ownership edit):** updated `backend/tests/test_api.py`
|
||
`test_detect_degrades_gracefully` → `test_detect_events_endpoint`. That foundation test asserted
|
||
the STUB behavior (`"note" in data`) of `POST /api/events/detect`; my landing replaces the stub
|
||
with real detection returning `{result, events}`. The frozen `api.py` app is UNCHANGED — only the
|
||
now-obsolete stub assertion was updated. Flagged here for transparency; see plan/CHANGE_REQUESTS.md CR-1.
|
||
|
||
**Note on shared tree:** this working directory holds all four lanes' uncommitted work
|
||
concurrently (A/B/C/D). I will stage and commit ONLY my owned files. One transient
|
||
`test_audio_sync.py` (lane A) failure was observed once mid-run (concurrent write) but the suite
|
||
is deterministically green (89/89 ×5); not caused by lane D.
|
||
|
||
**Blockers / questions for coordinator:** none.
|
||
|
||
**Next:** Lane D (M7) is done and merged to `main` (`5c2d7c6`). No follow-up needed in-lane.
|
||
Coordinator: proceed to integration (phase 3) once lanes A/B/C also merge.
|