I've written the December 2025 business review narrative to `output/mbr-narrative.md`. The figures behind it are in `output/mbr.json`. The script confirmed that the P&L and KPI figures add up exactly before producing them.

**Summary:** December revenue was $827K against a budget of $824K. Operating income was $8K against $13K, a gap of ($5K). Gross margin was 26.1% against a 26.8% budget, (0.7) points short.

- **What drove the month:** two costs ran over budget, other operating at ($6K) and cost of goods sold at ($6K). Technology came in $4K under budget and offset part of that.
- **Year to date:** the year shows the operating income shortfall more clearly, at $388K against $583K. Revenue is ($362K) behind budget, and cost of goods sold running $196K under budget makes up only part of that gap.
- **KPIs:** four are off target this month:
  - Days sales outstanding: 51.2 days against 45.0, off target for 3 months.
  - On-time delivery: 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.

Revenue was ($72K) lower than in November. The narrative doesn't mention this.

The cost of goods sold line ($584K) is smaller than the total cost of goods sold for the month ($611K). The total includes other cost lines. I used each figure exactly as the script gave it.

The data doesn't show why other operating costs ran over budget or why the KPIs missed target. The narrative doesn't guess at causes. The detail behind those lines would be needed to answer that.