I've written the FY2025 budget-versus-actual commentary to `output/bva-note.md`, and the figures behind it are in `output/bva.json`. The script reported that its figures reconcile. Every number in the note is copied exactly from the script's output.

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

| Measure | Actual | Budget | Variance |
| --- | --- | --- | --- |
| Revenue | $11,238K | $11,600K | ($362K) |
| COGS | $8,324K | $8,491K | $167K |
| Gross profit | $2,914K | $3,109K | ($194K) |
| Gross margin | 25.9% | 26.8% | (0.9) pts |
| Operating expenses | $2,527K | $2,526K | ($1K) |
| Operating income | $388K | $583K | ($195K) |

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

**Drivers I chose for the note:**
- **Revenue:** the miss came mostly in three months: March ($123K), July ($132K) and August ($105K).
- **Cost of goods sold:** favourable by $196K, or 2.4%, after peaking at $215K in August.
- **Salaries and wages and Freight out:** unfavourable by ($38K) and ($29K). Both were largest in December, so neither variance is reversing.
- **Professional fees:** unfavourable by ($31K) at its March peak, but only ($1K) by year end. Because it reversed, I've called it timing.

The data shows where and when the variances happened, but not why. So each driver points the reader to the people who can explain it (Sales, Operations, Finance), along with the data that would answer the question. The main open question is whether Cost of goods sold came in under budget because volume was lower or because unit cost was lower; unit data would answer it.

Because each amount is rounded separately, the Gross profit and Operating income rows don't add up exactly in the table; the note says this under Data notes.