The FY2025 budget-versus-actual note is written to `output/bva-note.md`, with the figures in `output/bva.json`. The script's variances reconcile.

- **Revenue:** $11.2M against a $11.6M budget, unfavourable by ($362K), or (3.1%).
- **Operating income:** $388K against $583K, unfavourable by ($195K), or (33.5%).
- **Gross margin:** 25.9% against 26.8%, a (0.9) pts shortfall.
- **Revenue miss:** it sits in three months. March was ($123K), July ($132K) and August ($105K). The data doesn't show why, so the note asks the revenue owner whether these were lost volume or deferred sales.
- **Cost of goods sold:** favourable by $196K, or 2.4%. That sits alongside the revenue shortfall, but the note marks volume as an inference. The data doesn't split price from volume.
- **Freight out:** unfavourable by ($29K), or (8.3%), even though revenue ran under budget. The note asks the logistics owner to explain.
- **Other lines:** Marketing is favourable by $38K and Technology by $25K. Salaries and wages is unfavourable by ($38K).
- **December:** revenue was $827K against $824K, and operating income was $8K against $13K.

I didn't hand-check the figures against the CSV. The note follows the skill's five-section contract. I wrote the Drivers bullets from the script's display figures only.

**Hand edit to check:** the draft's July bullet had a leftover placeholder, "($123K replaced below)". I replaced it with ($132K). I didn't re-read the final file after that edit, so please check the Drivers section before it goes into the review pack.

**CSV anomalies:** the CSV has a few one-off budget and actual spikes that the note doesn't cover. Examples are professional fees in March and May, and rent in April. They net out in the full-year totals, but a reviewer may ask about them.