I've written the FY2025 budget vs actual commentary to `output/bva-note.md`. The figures behind it are in `output/bva.json`. The variance script passed its reconciliation checks, and every figure in the note is copied straight from its output.

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

- **Revenue:** almost all of the miss came in three months: March ($123K), July ($132K) and August ($105K). The other nine months each landed within $7K of budget.
- **Margin:** cost of goods sold came in $196K below budget, which partly offset the revenue miss. Gross margin still fell to 25.9% against a 26.8% budget, down (0.9) pts.
- **Operating expenses:** these finished almost exactly on budget, with a variance of ($649). Overspends on salaries ($38K), freight out ($29K) and rent ($23K) were offset by underspends on marketing ($38K) and technology ($25K).
- **Professional fees:** the overspend reached ($31K) in March but was back to ($1K) by year end. The note calls this timing because the overspend reversed.
- **December:** revenue of $827K beat budget by $3K. Operating income of $8K missed by ($5K), because gross profit fell short.

The data doesn't show why March, July and August fell short, so the note doesn't give a reason. Instead it lists the questions for the sales and operations owners, and says that revenue broken down by customer would answer the main one.