I've produced the December 2025 KPI scorecard, the monthly business review write-up and the review deck. All three scripts passed their checks: the scorecard ties to the P&L, the P&L figures add up across month and year to date, and the deck script confirmed all 69 figures on the slides come from the two sources.

**Deck:** `output/IS_MBR_2025-12.pptx`. The deck script printed: *"December 2025 deck: 6 slides, 69 figures, every one from a source."*

**December 2025 in brief**
- **P&L:** Revenue was $827K against a budget of $824K. Operating income was $8K against $13K, a variance of ($5K), and gross margin was 26.1% against 26.8%.
- **Year to date:** The year is behind budget. Revenue was $11,238K against $11,600K, a variance of ($362K). Operating income was $388K against $583K, a variance of ($195K).
- **KPIs:** 4 of 8 KPIs were on target.
  - Days sales outstanding (51.2 against a target of 45.0) and on-time delivery (93.3% against 95.0%) have each been off target for 3 months.
  - Active customers (2 months off) and inventory turns (1 month off) also missed target.
- **Month drivers:** Other operating costs were ($6K) over budget and cost of goods sold was ($6K) over budget. Neither data file shows why other operating costs ran over; the month's expense ledger would.

**Rounding:** Each figure is rounded on its own, so some rows don't add exactly as shown. This affects the Opex-percent variance and several P&L subtotal rows, and is recorded in each file's data notes.

Files are in `output/`:
- `IS_MBR_2025-12.pptx`
- `scorecard-note.md`
- `mbr-narrative.md`
- `slide-map.json`
- `scorecard.json`
- `mbr.json`
- `deck.json`