v2.50.0
The last JSON-fed readers now source from the DB-canonical analysis store. Consistency/perf hygiene, not a behavior change — the JSON export is lockstep with the DB, so this is shape-preserving by construction.
Changed
summarize_reportsaggregates from the DB (canonical blob + human overlay) when every report dir on disk is covered by an ingested clip row. Pre-v9 roots and mixed roots (some clips not ingested) fall back wholesale to the JSON walk — a partial DB view would silently under-report. The summary gains a"source": "db"|"json"observability key; the F1 provenance map (source_reports/missing_reports) is unchanged.build_analysis_indexsources local reports from the DB instead of re-parsing everyanalysis.json. Job-linked external report paths (their rows live under another project's DB) and pre-v9 dirs keep the JSON read. The FTS schema and the query surface are identical; the result gainsreport_sourcescounts.
Validation
- DB-vs-JSON parity tests assert semantic equality of both paths (summary, index counts, FTS query results, normalized ordering), plus wholesale-fallback regressions for mixed and pre-v9 roots.
- Live-validated on the sample analysis root: summary parity, index-count parity, and identical FTS results for both sources. Offline suite at 1177.