The FY2025 budget-vs-actual commentary is written to `output/bva-note.md`, with the script figures in `output/bva.json`. The script reconciled, and every figure in the note is copied from its output.

**Headline:** Full-year revenue was $11,238K against a $11,600K budget, unfavourable by ($362K), or (3.1%). Operating income was $388K against $583K, unfavourable by ($195K), or (33.5%).

**Drivers in the note:**
- **Revenue:** The miss was concentrated in March ($123K), July ($132K) and August ($105K), all unfavourable. The data doesn't show the cause, so the note asks sales owners to confirm whether it was lost volume or deferred orders.
- **Cost of goods sold:** It was favourable by $196K, but Freight out was unfavourable by ($29K). Gross margin was 25.9% against 26.8% budgeted, (0.9) pts. The note says the data doesn't show why Cost of goods sold came in under budget.
- **Marketing and Technology:** They were favourable by $38K and $25K. Both peaked in December, so the note asks owners whether this is underspend or deferred spend.
- **Salaries and wages, and Rent and occupancy:** They were unfavourable by ($38K) and ($23K), and neither reversed during the year.

December on its own was close to budget: revenue was $3K favourable and operating income ($5K) unfavourable.

The note's data line cites `pnl_fy2025.csv`, 120 rows, with its sha256 prefix. It also carries the script's caveat that the rounded Gross profit and Operating income rows don't add exactly.

One shell command with `$?` was blocked by the harness. I re-ran the script without it and it completed normally.