I've written the CEO brief to `output/exec-summary.md`. It fits on one page, and every figure comes from the reporting script's output (`output/summary.json`). The script's checks passed: the quarters add up to the full-year revenue, and the line items add up to operating income.

**Headline:** FY2025 revenue was $11.2M against a budget of $11.6M. Operating income was $388K against $583K budgeted, a shortfall of ($195K), or (33.5%).

- **Revenue drove the miss:** revenue came in ($362K) under budget, and every quarter fell short. Most of the gap was in Q3 at ($229K) and Q1 at ($121K).
- **Costs partly offset it:** cost of goods sold was $196K under budget. Gross margin still finished at 25.9% against 26.8% budgeted. Operating expenses were on budget, within ($649).
- **Watch list:** days sales outstanding has been above target for 3 months (51.2 against 45.0). On-time delivery has been below target for 3 months (93.3% against 95.0%). Active customers have been below target for 2 months (40 against 42).

I left inventory turns off the watch list. It was below target in December (5.33 against 6.50), but that was its only month off target.

The brief ends by asking leadership whether slower collections, late deliveries and fewer customers have a common cause. The data shows these trends together but doesn't show what causes them.