I've written the commentary to `output/bva-note.md`, with the script's figures in `output/bva.json`. The figures reconcile. FY2025 came in below budget: revenue was unfavourable by ($362K), or (3.1%), and operating income was unfavourable by ($195K), or (33.5%).

**Results against budget**

| 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) |

**Lines that came in favourable or unfavourable**
- **Favourable (4 lines):** Cost of goods sold $196K, Marketing $38K, Technology $25K, Other operating $0.1K.
- **Unfavourable (6 lines):** Revenue ($362K), Salaries and wages ($38K), Freight out ($29K), Rent and occupancy ($23K), Professional fees ($1K), Depreciation ($1K).

**What drove the result**
- **The revenue miss came from three months:** March 2025 ($123K), July 2025 ($132K) and August 2025 ($105K). No other month missed by more than ($6K).
- **Cost of goods sold was $196K under budget, which partly offset the revenue miss.** The data doesn't show whether that came from lower volume or better unit cost. A price-volume-mix analysis would answer that.
- **Operating expenses ended level with budget at ($1K)** because the lines offset each other. Salaries and wages ($38K), Freight out ($29K) and Rent and occupancy ($23K) were over budget. Marketing $38K and Technology $25K were under.
- **Professional fees was over budget by ($31K) in March but ended the year at only ($1K).**
- **December was close to budget:** revenue was favourable by $3K and operating income unfavourable by ($5K).

The data shows where the variances happened, not why. Before the meeting, the committee will likely want to know:
- From Sales: which customers or orders slipped in March, July and August.
- From HR and Marketing: whether the salaries overspend and the marketing underspend are permanent or just timing.

The amounts are rounded one by one, so in the table the gross profit and operating income rows don't add up exactly. The note says this in its data notes.