I've written the December 2025 narrative to `output/mbr-narrative.md`. The figures it uses are in `output/mbr.json`. The script's checks passed: the P&L lines add up to operating income, the monthly revenue adds up to the year-to-date total, and the revenue KPI matches P&L revenue.

**Main points:**
- **December:** revenue was $827K against a $824K budget, $3K over. Operating income was $8K against $13K, ($5K) short. Gross margin was 26.1% against 26.8%, (0.7) pts below budget, mainly because of the cost of goods sold line. Operating expenses were on budget: Technology came in under and offset most of the Other operating overrun.
- **Year to date:** the year doesn't back up December's revenue beat. Revenue is $11.2M against $11.6M, ($362K) short, and operating income is $388K against $583K, ($195K) short. Cost of goods sold was $196K under budget, which offset part of the shortfall.
- **KPIs:** four of eight are off target. Days sales outstanding and on-time delivery have each been off target for 3 months, active customers for 2, and inventory turns for 1.

**Things to know before circulating:**
- The table subtotal for cost of goods sold isn't the same as the "Cost of goods sold" line in the drivers. For December the subtotal is $611K and the line is $584K, so other lines must feed into the subtotal. Both numbers are as the script printed them, but a reader may ask why they differ.
- The data shows what moved but not why. Answering why Other operating costs ran over, or why DSO has risen, would need account-level detail and the receivables ageing.