I've written the December 2025 narrative to `output/mbr-narrative.md`. Revenue beat budget slightly, but operating income missed, and the full year confirms that profit is behind plan. The script checked the figures before reporting them, and they reconcile. Every number in the write-up is copied from its output, `output/mbr.json`.

**The month**
- **Revenue:** $827K against a $824K budget, $3K ahead.
- **Operating income:** $8K against $13K, a ($5K) miss.
- **Gross margin:** 26.1% against 26.8%, (0.7) points below budget.
- **Main cause:** cost of goods sold was ($6K) over budget. That erased the revenue beat.
- **Operating expenses:** on budget overall. Other operating was ($6K) over, and Technology was $4K under, which offset most of it.
- **Against November:** revenue fell ($72K) from $899K.

**Year to date**
- **Revenue:** $11.2M against $11.6M, ($362K) short.
- **Operating income:** $388K against $583K, ($195K) short.
- **Where the gap sits:** in gross profit, ($194K) below budget. Operating expenses are within ($649) of budget.

**KPIs off target:** four of eight.
- **Days sales outstanding:** 51.2 against 45.0, off target for 3 months.
- **On-time delivery:** 93.3% against 95.0%, off for 3 months.
- **Active customers:** 40 against 42, off for 2 months.
- **Inventory turns:** 5.33 against 6.50, first month off.

The data doesn't explain the Other operating overrun, so the write-up doesn't give a cause. The transaction detail for that line would answer it if leadership asks.

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