I've written the FY2025 one-pager to `output/exec-summary.md`, with the figures it uses in `output/summary.json`. Every figure comes from the reporting script, which confirmed the data adds up: the four quarters sum to the year's revenue, and operating income built up line by line matches the reported total.

**Headline:** FY2025 revenue was $11,238K against a budget of $11,600K, and operating income was $388K against $583K. That operating income figure is ($195K), or (33.5%), below budget.

- **Results:** Gross margin was 25.9% against a budget of 26.8%. Operating expenses finished almost exactly on budget, ($1K) over.
- **Quarterly trend:** Revenue missed budget in every quarter. Most of the shortfall came in Q1, ($121K), and Q3, ($229K). Q2 and Q4 were close to budget.
- **Drivers:**
  - Revenue was ($362K) short of budget.
  - Cost of goods sold was $196K under budget, which covered part of the revenue gap.
  - Salaries and wages ran ($38K) over budget, offset by savings in Marketing and Technology.
- **Watch list:** Three measures have been off target for two or three months in a row:
  - Days sales outstanding was 51.2 days against a target of 45.0.
  - On-time delivery was 93.3% against 95.0%.
  - Active customers were 40 against 42.

  The page closes by asking leadership what the plan and timing are to get these back to target.

- **Inventory turns left off:** It was also off target, 5.33 against 6.50, but only for one month, so I didn't put it on the page.
- **Rounding:** Each amount is rounded separately, so a few rows don't add exactly as shown. The data notes on the page say so.
- **Length:** The page is 342 words including the tables, within the 350-word limit.