I saved the note at `output/ttm-note.md`. The checks passed: operating income reconciles to the lines, and the monthly revenue variances add up to the twelve-month figure.

Over the twelve months to June 2025, revenue was $11.3M against a $11.5M budget, unfavourable by ($157K), or (1.4%). Operating income was $485K against $598K, unfavourable by ($113K), or (18.8%).

- **Revenue miss:** it sits mainly in March 2025, at ($123K), and in July and August 2024, at ($45K) and ($44K).
- **Cost lines:** COGS was favourable by $82K, while salaries and wages ($19K), freight out ($16K) and rent ($15K) were unfavourable. Professional fees reversed from a ($29K) peak in March 2025 to $959 favourable.
- **Month:** June 2025 revenue was ($3K) against budget and operating income ($6K).

**Workaround for the 12-month window.** The budget-vs-actual script only runs from January of one calendar year, so it can't produce a twelve-month window. I ran a copy of it with the window set to July 2024 to June 2025. That copy keeps the same figures and reconciliation checks. I ran it on the two CSVs joined into one file of 240 rows, so the data-notes line names that combined file, `pnl_fy2024_fy2025.csv`, not your two originals.

I couldn't copy the combined CSV and the modified script into `output/` because the copy needed approval. They are in `/tmp/ttm/` (`pnl_fy2024_fy2025.csv`, `bva_ttm.py`). The script's figures are at `output/bva-ttm.json`. Copy the two files across if you want the note to be reproducible from `output/`.