I've written the FY2025 commentary to `output/bva-note.md`. The full figures are in `output/bva.json`. The script's checks passed, so revenue, costs and operating income add up for both December and the full year.

**Headline:** Full-year revenue was $11.2M against a $11.6M budget, a variance of ($362K), or (3.1%). Operating income was $388K against $583K, a variance of ($195K), or (33.5%).

**What drove it:**
- **Revenue:** The miss came from three months: March ($123K), July ($132K) and August ($105K). The other nine months were close to budget.
- **Cost of goods sold:** It came in $196K under budget, or 2.4%, partly offsetting the revenue miss. Freight out ran over by ($29K). Even so, gross margin was 25.9% against a 26.8% budget, (0.9) pts below.
- **Operating expenses:** The total was almost exactly on budget, at a variance of ($649), because the lines offset each other. Marketing was $38K under and technology $25K under. Salaries and wages were ($38K) over and rent and occupancy ($23K) over.
- **Professional fees:** These were ($31K) over budget by March but only ($1K) over by year end, so the early overrun was timing.
- **December:** Revenue was $3K above budget. Operating income was ($5K) below, because gross margin fell (0.7) pts.

The data doesn't show causes, so the note doesn't name any. Instead, two bullets in the note ask what to find out:
- Sales should explain the March, July and August misses by customer and product.
- Operations should say whether the cost of goods sold saving came from lower volume or lower unit cost.