v2.41.0
DB-canonical clip analysis (C1) — Phase A of the analysis + edit-engine program.
The per-project SQLite DB (_soul/timeline_brain.sqlite, schema v9) is now the source of truth for clip analysis; analysis.json becomes a derived export written in lockstep.
Added
- Schema v9:
clips,clip_aliases,analysis_reports(canonical full payload),shots,subjective_fields+field_changelog(per-field provenance),transcript_segments,frames,qc_observations. src/utils/analysis_store.py: transactional ingest, export with human-correction overlay (human rows always win and survive re-analysis), alias-based clip lookup, shot ids stable under one-second boundary jitter, round-trip guard verified against a real sample analysis root.media_analysisactionsdb_statusanddb_ingest(one-shot migration of existing JSON reports +corrections.jsonsidecars into the DB).
Changed
- Analysis write path:
execute_planandcommit_visionwrite DB rows first, then export the JSON. Panel clip/shot endpoints read DB-first with JSON fallback for pre-v9 reports and job-linked report dirs. update_clip_field/update_shot_field/revert_fieldmirror corrections into the DB as row-level provenance (the sidecar remains for compatibility).
Fixed
- Eight V2 actions unreachable from MCP dispatch since v2.24.0 (
get_panel_state,set_panel_state,session_start_context,update_shot_field,update_clip_field,get_field_history,revert_field,list_corrections) — checked inside the dispatch block but missing from its membership set; the control panel proxied to the helpers directly, which masked it. - The action-list drift guard now inspects async tool functions and fails on unreachable actions inside membership blocks; four reachable-but-unadvertised actions are now listed in the unknown-action error.
Validation
- Full offline suite: 1066 tests (12 new), 3 known live-Resolve environmental failures only (present on clean baseline).
- Round-trip guard on the real 2026-05-17 sample root; live headless pipeline run on synthetic media verifying rows-then-export parity, row-level corrections, and DB-first panel reads.