I've written the full-year budget versus actual commentary to `output/bva-note.md`. For FY2025, revenue came in **($362K), or (3.1%), below budget** and operating income came in **($195K), or (33.5%), below budget**: $388K against $583K. The script's checks passed: operating income equals revenue less costs, the line variances add up to the operating income variance, and the monthly revenue variances add up to the full-year variance.

What the commentary covers:
- **Revenue:** The miss came almost entirely from March ($123K under budget), July ($132K under) and August ($105K under). No other month was more than $6K under budget.
- **Cost of goods sold:** It was $196K under budget, which is favourable, but gross margin still fell 0.9 points to 25.9%. The P&L can't tell whether costs were lower because volume was lower or because unit costs fell, so the note asks operations to confirm.
- **Operating expenses:** Overall they were on budget, $649 over. Salaries and wages ran $38K over budget and freight out ran $29K over, and both were at their largest in December. Underspends on marketing ($38K) and technology ($25K) balanced them out.
- **Timing:** Professional fees were $31K over budget in March but finished only $1K over, so the early overspend was timing.
- **December:** Revenue was $3K above budget and operating income was $5K below.

The data has no customer or product detail, so the note doesn't give causes for the March, July and August misses. It names who should explain them instead. The figures behind the note are in `output/bva.json`.