I've written the December 2025 business review narrative to `output/mbr-narrative.md`. The script's figures are in `output/mbr.json`; it found that operating income built from the line items matches revenue less costs exactly.

**Headline:** December 2025 revenue was $827K against a budget of $824K, and operating income was $8K against $13K.

- **Month:** revenue came in $3K over budget, but gross profit was ($5K) short and gross margin missed by (0.7) pts. That was because cost of goods sold was ($6K) over budget, at $584K against $578K. Operating expenses were on budget: Other operating ran ($6K) over, and Technology came in $4K under, offsetting part of it.
- **Year to date:** the full year does not follow December's small revenue beat. Revenue is ($362K) below budget, at $11,238K against $11,600K, and operating income is ($195K) below, at $388K against $583K. Cost of goods sold is $196K under budget for the year, but gross margin still finished (0.9) pts below.
- **KPIs:** four of the eight KPIs are off target:
  - Days sales outstanding: 51.2 days against a target of 45.0, off 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.
- **Rounding:** each amount is rounded separately, so a few rows in the tables don't add up exactly. The data notes say so; no figures were adjusted.

The data doesn't show why costs ran over or why the KPIs slipped. The narrative states the movements and doesn't guess at causes.