The one-page CFO summary is ready at `output/exec-summary.md`. It's 335 words, under the 350-word limit. The script passed all its checks: the quarters add up to the year's revenue, operating income matches its line items, and the December revenue KPI matches the P&L.

**Headline:** FY2025 revenue was $11,238K against a budget of $11,600K. Operating income was $388K against a budget of $583K, a ($195K) shortfall.

- **Results:** revenue was ($362K) under budget. Gross margin was 25.9% against 26.8%, a gap of (0.9) pts. Operating expenses were on budget, ($1K).
- **Quarters:** Q1 missed budget by ($121K) and Q3 by ($229K). Q2 and Q4 were within $7K of budget.
- **Drivers:** revenue was ($362K) under budget, offset in part by Cost of goods sold coming in $196K under. Salaries and wages ran ($38K) over and Freight out ($29K) over.
- **Watch list:** three measures are off target:
  - Days sales outstanding is 51.2 against a target of 45.0, off for 3 months.
  - On-time delivery is 93.3% against 95.0%, off for 3 months.
  - Active customers are 40 against 42, off for 2 months.

Things to know before you send it:
- **Inventory turns left out:** it's also off target, at 5.33 against 6.50, but only for one month. I left it off the watch list; it's easy to add back.
- **Two cost-of-goods figures differ:** the Cost of goods sold line is $196K favourable, but the cost-of-goods subtotal in the script output is $167K. The difference likely comes from lines like Freight out, which are in that subtotal but listed separately. I haven't confirmed that. Only the $196K appears in the summary, but a careful reader could spot it if they compare against other reports.
- **Rounding:** each amount is rounded on its own, so some rows don't add up exactly as shown. The data notes say so.

The script's full figures are in `output/summary.json`.