I've produced the December 2025 KPI scorecard, the monthly business review write-up and the review deck. All the scripts passed their checks: the scorecard matches the P&L, the P&L figures add up to the cent, and every figure in the deck traces back to one of the two sources.

**Files in `output/`:**
- `scorecard.json` and `scorecard-note.md`: KPI results against target
- `mbr.json` and `mbr-narrative.md`: the review write-up
- `slide-map.json`, `deck.json` and **`IS_MBR_2025-12.pptx`**: the deck. The build script printed: *"December 2025 deck: 6 slides, 68 figures, every one from a source."*

**December 2025:**
- **P&L:** revenue was $827K against a budget of $824K. Operating income was $8K against $13K, a ($5K) shortfall. Gross margin was 26.1% against 26.8%, (0.7) points under budget.
- **Year to date:** revenue is $11.2M against $11.6M, ($362K) behind. Operating income is $388K against $583K, ($195K) behind.
- **Main causes this month:** cost of goods sold was ($6K) over budget, and other operating costs were also ($6K) over. Technology came in $4K under budget.
- **KPIs:** 4 of 8 were on target. Two have now missed for 3 months running: days sales outstanding at 51.2 against a target of 45.0, and on-time delivery at 93.3% against 95.0%. Active customers missed for a second month (40 against 42) and inventory turns for the first (5.33 against 6.50).

**Check before this goes out:** the gross margin target in the KPI file is 26.0%, but the P&L budget gives 26.8%. So the scorecard shows gross margin "on target" at 26.1%, while the P&L slide shows it (0.7) points under budget. Both slides are in the deck. The scripts don't check that a KPI target matches the budget, so whoever owns the KPI targets needs to confirm which number is right.

The questions for the owners of the two 3-month misses are at the end of the Exceptions section in `scorecard-note.md`.