The FY2025 budget-versus-actual commentary is written and saved in `output/bva-note.md`. The script's figures are in `output/bva.json`, and the script reported that the variances reconcile.

**Headline:** Full-year revenue was $11,238K against a $11,600K 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 in three months: March ($123K), July ($132K) and August ($105K). The other nine months landed close to budget. The data doesn't show why, so the note asks the sales owner to explain those three months.
- **Cost of goods sold:** Favourable by $196K, or 2.4%. Freight out went the other way, unfavourable by ($29K), or (8.3%).
- **Marketing and Technology:** Favourable by $38K, or 28.5%, and $25K, or 15.0%. The note asks the owners whether the spend was cut or deferred.
- **Salaries and wages, and Rent and occupancy:** Unfavourable by ($38K), or (2.5%), and ($23K), or (5.6%). Operating expenses in total were unfavourable by ($1K).

**Data notes:** The note cites `pnl_fy2025.csv`, 120 rows, sha256 `eaa52ac89e97`. Each amount is rounded on its own, so the Gross profit and Operating income rows in the Results table don't add exactly.

The note also has the Results table and a December section, which I haven't reproduced here.