I've built the December 2025 scorecard, the review write-up and the six-slide deck. All figures come from the scripts, and the deck check found no figure that isn't in the two sources. The scorecard ties to the P&L, and the P&L figures reconcile.

**Results**
- **KPIs:** 4 of 8 were on target. Days sales outstanding (51.2 against 45.0) and on-time delivery (93.3% against 95.0%) have each been off target for three months. Active customers (40 against 42) have missed for two months, and inventory turns (5.33 against 6.50) for one.
- **Month:** Revenue was $827K against a $824K budget. Operating income was $8K against $13K, with gross margin at 26.1% against 26.8%.
- **Year to date:** Revenue is $11.2M against $11.6M, a variance of ($362K). Operating income is $388K against $583K.

**Files** (all in `output/`)
- `IS_MBR_2025-12.pptx`: the review deck.
- `scorecard-note.md`: the scorecard note.
- `mbr-narrative.md`: the monthly review write-up.
- `scorecard.json`, `mbr.json`, `slide-map.json` and `deck.json`: the script figures, the slide plan and the deck check.

The inputs were `kpis_fy2025.csv` (96 rows) and `pnl_fy2025.csv` (120 rows).

The data doesn't show causes, so the write-up gives none. The scorecard note ends each exception with a question for the KPI owner instead.