I've written the full-year commentary to `output/bva-note.md`. The underlying figures are in `output/bva.json`. The script's reconciliation checks all passed: the line variances add up to the operating income variance, and the monthly revenue variances add up to the full-year variance.

**Headline:** FY2025 revenue was $11.2M, ($362K) or (3.1%) below budget. Operating income was $388K, ($195K) or (33.5%) below budget.

**What the note covers:**
- **Revenue:** the miss came almost entirely from three months: March ($123K), July ($132K) and August ($105K). The other months were close to budget.
- **Margin:** Cost of goods sold came in $196K under budget, which offset part of the revenue miss. Gross margin still fell by (0.9) pts, to 25.9%.
- **Operating expenses:** in total they finished on budget, at ($649). Underneath, Salaries and wages was ($38K) over budget and the gap was still growing at year end. Underspends in Marketing ($38K) and Technology ($25K) cancelled out overspends elsewhere.
- **Professional fees:** this line was ($31K) over budget in March, but it had evened out to ($1K) by year end, so it was timing.
- **December:** revenue was $3K above budget, but operating income was ($5K) below it.

**Left out:** the note allows four driver bullets, so two other overspends didn't make it in: Freight out at ($29K), or (8.3%), and Rent and occupancy at ($23K). You may want to mention them in the review.

The data doesn't explain why things moved. So the note doesn't give causes; it says who to ask instead (Sales, Operations and HR).