I've written the FY2025 one-pager to `output/exec-summary.md` (315 words, so it fits on one page). All figures come from the reporting script, whose output is in `output/summary.json`. The script checked that the four quarters add up to the full-year revenue and that operating income matches the P&L lines, and both checks passed.

**The headlines:**
- **Against budget:** revenue was $11.2M against a budget of $11.6M, short by ($362K). Operating income was $388K against $583K, short by ($195K). Gross margin was 25.9% against 26.8%. Operating expenses finished on budget, with a variance of ($649).
- **Quarterly trend:** revenue was below budget in every quarter. Most of the shortfall came in Q3, at ($229K), and Q1, at ($121K). Q2 and Q4 were close to budget.
- **Drivers:** the revenue shortfall, partly offset by lower cost of goods sold, $196K under budget. Salaries and wages were ($38K) over budget, but savings in other cost lines covered that.
- **What to watch:**
  - Days sales outstanding was 51.2 days against a target of 45.0, missed for 3 months in a row.
  - On-time delivery was 93.3% against 95.0%, also missed for 3 months.
  - Active customers were 40 against a target of 42, missed for 2 months.

**What I chose:**
- I left inventory turns off the watch list. It was 5.33 against a target of 6.50, but it has missed only one month, so it doesn't yet need the board's attention. It's easy to add back if you want it.
- The data doesn't explain why revenue fell short, so the summary doesn't give a reason. Instead, it ends with a question for the business: are the slow payments, late deliveries and lost customers coming from the same accounts?