The FY2025 budget versus actual commentary is written to `output/bva-note.md`, with the figures in `output/bva.json`. The script's reconciliation check passed. The input was `pnl_fy2025.csv`, 120 rows, sha256 `eaa52ac89e97`.

**Headline:** Full-year revenue was $11.2M against a $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:** The miss came from three months: March ($123K), July ($132K) and August ($105K). Every other month was within $7K of budget.
- **Cost of goods sold:** Favourable by $196K, or 2.4%. The data doesn't show whether lower volume or lower unit cost caused it.
- **Salaries and wages:** Unfavourable by ($38K), or (2.5%), and the variance kept growing through the year.
- **Professional fees:** The variance peaked at ($31K) in March and ended the year at ($1K), so it reversed.

The note also has the Results table, a December month paragraph and the data-notes line.

I did not give a cause for the revenue miss or the cost of goods sold variance, because the CSV doesn't show one. The note flags both as questions for the line owners.