I've written the December 2025 MBR narrative to `output/mbr-narrative.md`. The figures it uses are in `output/mbr.json`. Every number comes from the reporting script, which passed all its reconciliation checks.

**Headline:** December revenue was $827K against a $824K budget. Operating income was $8K against $13K, which is ($5K) short of budget.

- **Month:** Revenue beat budget by $3K, but costs of sales ran over budget. Gross margin was 26.1% against 26.8%, (0.7) pts below budget. Operating expenses came in on budget.
- **Year to date:** December's revenue beat leaves the full-year picture unchanged. Revenue is ($362K) below budget and operating income is ($195K) below budget, at $388K against $583K.
- **Drivers:** In December, three lines moved most against budget:
  - Cost of goods sold, ($6K) unfavourable.
  - Other operating, ($6K) unfavourable.
  - Technology, $4K favourable.

  For the year, the revenue shortfall is the main driver.
- **KPIs:** 4 of 8 missed target:
  - Days sales outstanding, 51.2 days against a 45.0-day target, off target 3 months running.
  - On-time delivery, 93.3% against a 95.0% target, also off target 3 months running.
  - Active customers, 40 against a target of 42.
  - Inventory turns, 5.33 against a target of 6.50.

**Rounding:** each amount is rounded on its own, so some rows in both tables don't add up exactly as shown. The narrative's data notes say so rather than adjusting the figures.

The "Cost of goods sold" line in the drivers ($584K) is smaller than the total costs of sales in the tables ($611K). It looks like other cost lines are counted in that total. Please check that before the review if anyone is likely to ask.