I've written the FY2025 budget-vs-actual commentary to `output/bva-note.md`, and the script's figures are in `output/bva.json`. The script's reconciliation check passed. I did not re-read the finished note after the last two edits.

**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%).

**Main points in the note:**
- **Revenue:** The miss sits in three months: March ($123K), July ($132K) and August ($105K). Every other month was within $7K of budget. The data doesn't show why, so the note asks the sales owner.
- **Gross margin:** It was 25.9% against 26.8%, a variance of (0.9) pts.
- **Costs:**
  - Cost of goods sold was favourable by $196K and Freight out unfavourable by ($29K).
  - Marketing was favourable by $38K and Technology by $25K.
  - Salaries and wages were unfavourable by ($38K) and Rent and occupancy by ($23K).
- **December:** Revenue was $3K favourable and operating income ($5K) unfavourable.

The note has no cause for the cost variances, because the data doesn't show one. It asks the line owners instead, for example whether the Marketing and Technology underspend was deferred or cancelled.

The sections follow the skill's template, and the data note cites `pnl_fy2025.csv`, 120 rows, sha256 `eaa52ac89e97`.