The one-page FY2025 summary for the CFO is written. Revenue was $11.2M against a $11.6M budget, and operating income was $388K against $583K.

The script's reconciliation checks passed, and every figure is copied from its output. Quarterly revenue sums to the full-year figure, and operating income built from the P&L lines matches the subtotal.

- **Results:** Revenue missed budget by ($362K). Gross margin was 25.9% against 26.8%.
- **Quarters:** Q1 and Q3 account for most of the miss, at ($121K) and ($229K). Q2 and Q4 were within ($7K) of budget.
- **Drivers:**
  - Revenue was unfavourable by ($362K).
  - Cost of goods sold was favourable by $196K.
  - Salaries and wages and freight out were unfavourable by ($38K) and ($29K).
- **Watch list:** Days sales outstanding (51.2 days against 45.0) and on-time delivery (93.3% against 95.0%) have each been off target for 3 months. Active customers (40 against 42) have been off for 2. I left inventory turns off because it has missed target for only 1 month.
- **Question for leadership:** The summary asks what drove the Q1 and Q3 revenue shortfall. The data doesn't show whether it was volume, price or customer losses, so it names no cause.

The data notes cite both input files with their row counts and hashes.

Files are in `/tmp/spb-exec-summary-fy25-claude-mghpv_60/output`:
- `exec-summary.md`
- `summary.json`