I've written the one-page FY2025 summary to `output/exec-summary.md`. The figures come from the house script, which checked that they reconcile (quarters add up to the full year, and P&L revenue matches the revenue KPI). Its full output is in `output/summary.json`.

**Headline:** FY2025 revenue was $11.2M against a budget of $11.6M, and operating income was $388K against $583K.

- **Results:** gross profit missed budget by ($194K) and gross margin by (0.9) pts. Operating expenses came in on budget, ($649).
- **Quarterly revenue:** every quarter missed budget. Most of the shortfall was in Q1, ($121K), and Q3, ($229K).
- **Drivers:**
  - Revenue was ($362K) under budget.
  - Cost of goods sold was $196K under budget, which offset part of the revenue miss.
  - Salaries and wages were ($38K) over budget. Savings in Marketing and Technology covered this.
- **Watch list:**
  - Days sales outstanding: 51.2 days against a target of 45.0, off target for 3 months.
  - On-time delivery: 93.3% against 95.0%, off target for 3 months.
  - Active customers: 40 against 42, off target for 2 months.
- **Question for leadership:** is the revenue shortfall linked to the lost customers and late deliveries, and what is the plan to bring collections back to target? The data doesn't show a cause, so it's posed as a question.

I left Inventory turns off the watch list. It was 5.33 against a target of 6.50 but has been off target for only one month; I can add it if you want all four KPIs that missed target.

The Cost of goods sold driver ($196K favourable) is bigger than the COGS subtotal variance ($167K) in the script output. The summary only uses the $196K. My guess is that the subtotal also includes Freight out, which was ($29K) unfavourable, but I haven't checked that against the P&L file.