I've written the December 2025 narrative to `output/mbr-narrative.md`. The figures it uses are in `output/mbr.json`. The script confirmed that operating income, revenue and the revenue KPI all reconcile to the P&L to the cent.

**December results:**
- **Month:** revenue was $827K against a $824K budget, $3K ahead. Operating income was $8K against $13K, ($5K) short.
- **Why the month missed:** gross margin was 26.1%, (0.7) points below budget. Operating expenses were $438 under budget.
- **Year to date:** revenue was $11.2M, ($362K) below budget, and operating income was $388K, ($195K) below budget. So the full year shows the same profit shortfall, and revenue is also below budget.
- **Line items:**
  - In the month, the largest misses were Other operating and Cost of goods sold, both ($6K).
  - For the year, revenue is the largest variance. Cost of goods sold, $196K under budget, offsets part of it.
- **KPIs:** four of the eight are off target:
  - Days sales outstanding and on-time delivery percent: off target for 3 months.
  - Active customers: 2 months.
  - Inventory turns: 1 month.

**Choices you may want to change:**
- In Drivers I put the two December lines first, then the two year-to-date lines. The Technology line, $4K favourable in the month, was left out to stay within the four-bullet limit.
- I added units ("days", "turns") after the KPI figures to make them easier to read.
- The data doesn't show why cost of goods sold came in under budget for the year, so the narrative says so rather than guessing at a cause.