I've written the FY2025 budget vs actual commentary to `output/bva-note.md`, with the script's figures in `output/bva.json`. The script's check that the variances add up passed.

**Headline:** FY2025 revenue was $11.2M against an $11.6M budget, unfavourable by ($362K), or (3.1%). Operating income was $388K against $583K, unfavourable by ($195K), or (33.5%).

**Drivers in the note:**
- **Revenue:** most of the miss came in three months: March ($123K), July ($132K) and August ($105K). The other nine months were close to budget.
- **Cost of goods sold:** favourable by $196K, or 2.4%. Gross margin still fell (0.9) pts, so the note asks Operations how much of the saving came from lower volume and how much from unit cost.
- **Salaries and wages:** unfavourable by ($38K), or (2.5%). This variance was at its largest in December, so it has not reversed.
- **Freight out:** unfavourable by ($29K), or (8.3%), also at its largest in December.

**Left out:** the note allows at most four driver bullets, so these didn't make it in. You may want to add them by hand:
- **Rent and occupancy:** unfavourable by ($23K).
- **Marketing:** underspent by $38K.
- **Technology:** underspent by $25K.
- **Professional fees:** they ran ($31K) over budget in March and had dropped to ($1K) by year end. This looks like a timing difference that has closed.

**December:** revenue was $3K favourable, but operating income was ($5K) unfavourable.

The data shows where the variances are, but not their causes. Each driver bullet ends with a question for the person responsible for that line.