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

**December:** Revenue was $827K against a budget of $824K, a beat of $3K. Operating income was $8K against $13K, a miss of ($5K). Gross margin was 26.1% against 26.8%, which is (0.7) points.

**Year to date:** Revenue was $11.2M against $11.6M, a shortfall of ($362K). Operating income was $388K against $583K, a shortfall of ($195K). Gross margin was 25.9% against 26.8%, which is (0.9) points. December's small revenue beat does not recover the year.

**Biggest line variances:**
- **Month:** Other operating and cost of goods sold each missed by ($6K). Technology was favourable by $4K.
- **Year to date:** Revenue missed by ($362K) and salaries and wages by ($38K). Cost of goods sold was favourable by $196K.

**KPIs off target (4 of 8):**
- **Days sales outstanding:** 51.2 against 45.0, off target for 3 months.
- **On-time delivery percent:** 93.3% against 95.0%, off target for 3 months.
- **Active customers:** 40 against 42, off target for 2 months.
- **Inventory turns:** 5.33 against 6.50, off target for 1 month.

The data doesn't show why any of these moved. The narrative says so rather than guessing at causes.

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