I wrote the FY2025 budget-versus-actual commentary. The script's reconciliation checks passed, and every figure in the note is copied from its output.

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

- **Revenue miss:** It came from three months: March ($123K), July ($132K) and August ($105K). The other nine months landed close to budget. The data doesn't show the cause, so the note asks the revenue owner whether volume, price or customer loss drove those months.
- **COGS:** It was favourable by $196K, but only because revenue was lower. Gross margin fell to 25.9% against a 26.8% budget, and Freight out was unfavourable by ($29K).
- **Overspends:** Salaries and wages were unfavourable by ($38K) and Rent and occupancy by ($23K). Rent hit its largest variance in October and didn't reverse.
- **Underspends:** Marketing was favourable by $38K and Technology by $25K. Together they brought operating expenses back to budget, with a variance of ($649).
- **Professional fees:** The line peaked at ($31K) in March and ended the year at ($1K), so that overspend reversed.
- **December:** Revenue was $827K against $824K, favourable by $3K. Operating income was $8K against $13K, unfavourable by ($5K).

I haven't checked how much the underspends contributed beyond what the script reports. Marketing and Technology were also underspent in the months where revenue missed, but I didn't link the two because the data doesn't show a cause.

Files are in `/tmp/spb-budget-vs-actual-fy25-claude-p8_so2i_/output/`:
- `bva-note.md`
- `bva.json`