The one-page FY2025 summary is in `output/exec-summary.md`, and the figures it uses are in `output/summary.json`. The script's checks passed: the quarters add up to the full-year revenue, operating income matches the P&L lines, and the revenue KPI matches P&L revenue.

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

- **Revenue:** most of the ($362K) shortfall came in Q3, at ($229K), and Q1, at ($121K). Q2 and Q4 were close to budget.
- **Margin:** cost of goods sold came in $196K under budget, but gross margin still fell (0.9) pts, to 25.9%.
- **Operating expenses:** almost exactly on budget, at a ($1K) variance. Salaries ran ($38K) over, and Marketing and Technology savings balanced it out.
- **Watch list:**
  - Days sales outstanding was 51.2 against 45.0, off target for 3 months.
  - On-time delivery was 93.3% against 95.0%, off target for 3 months.
  - Active customers were 40 against 42, off target for 2 months.

I left inventory turns off the watch list. It is also off target, at 5.33 against 6.50, but only for one month. Tell me if you want it back on.

Each amount is rounded separately, so some rows and the quarterly totals don't add up exactly as shown. The data notes on the page say this. The page is at the 350-word limit, counting the tables.