I've drafted the December 2025 MBR commentary. The script's reconciliation checks passed, and every figure is copied from its output.

- **Month:** Revenue was $827K against a budget of $824K, and operating income was $8K against $13K. Gross margin was 26.1% against 26.8%, which is (0.7) pts.
- **Year to date:** Revenue was $11,238K against $11,600K, a variance of ($362K). Operating income was $388K against $583K, a variance of ($195K). Gross margin was 25.9% against 26.8%, which is (0.9) pts.
- **Drivers:** In the month, cost of goods sold was a variance of ($6K), and other operating was also ($6K). Year to date, the revenue shortfall is the largest line. Cost of goods sold was $196K favourable and offset part of it.
- **KPIs off target (4 of 8):**
  - Days sales outstanding was 51.2 against a target of 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.
  - Inventory turns were 5.33 against 6.50, off target for 1 month.
- **Causes:** The data doesn't show why costs or revenue moved, so the draft names no causes. Answering that would need a cost and customer-level breakdown.
- **Rounding:** Some month and year-to-date rows don't add exactly as printed, because each amount is rounded on its own. The data notes say so.

Files are in `output/`:
- `mbr-narrative.md`
- `mbr.json`