I've written the one-pager to `output/exec-summary.md`. The calculation script passed its reconciliation checks: the quarters add up to the full-year revenue, and the revenue figure matches between the P&L and the KPI file.

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

- **Results:** gross profit fell ($194K) short of budget and gross margin was (0.9) pts below it. Operating expenses finished on budget, with a variance of ($649).
- **Quarterly revenue:** most of the shortfall came in Q1 at ($121K) and Q3 at ($229K). Q2 and Q4 were close to budget.
- **Drivers:** the revenue shortfall of ($362K), lower cost of goods sold that saved $196K, and salaries and wages over budget by ($38K).
- **Watch list:** three KPIs are off target:
  - Days sales outstanding is 51.2 against a target of 45.0, off target for 3 months.
  - On-time delivery is 93.3% against 95.0%, off target for 3 months.
  - Active customers is 40 against 42, off target for 2 months.

I left inventory turns (5.33 against a target of 6.50) off the watch list because it has only been below target for one month. Say if you want it added back.

The one-pager doesn't say which customers or accounts caused the revenue shortfall. That would need customer-level sales data, which isn't in these two files. All figures are copied as printed by the script, which saved them to `output/summary.json`.