I've written the December 2025 business review narrative. The script's checks all passed: operating income rebuilt from the P&L lines matches revenue less costs, the monthly revenue adds up to the year-to-date total, and the revenue KPI matches P&L revenue.

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

- **Month:** Revenue beat budget by $3K, but gross margin was 26.1% against a budget of 26.8%, a (0.7) point gap. The main cost overruns were cost of goods sold at ($6K) and other operating costs at ($6K). Technology spending came in $4K under budget, which kept operating expenses close to budget.
- **Year to date:** The year does not match December's revenue beat. Revenue is ($362K) below budget at $11.2M and operating income is ($195K) below budget at $388K. Gross margin is 25.9%, (0.9) points under budget, even though cost of goods sold is $196K under budget.
- **KPIs off target:** Four of eight missed target.
  - Days sales outstanding was 51.2 against a target of 45.0, off target for 3 months.
  - On-time delivery was 93.3% against 95.0%, off target for 3 months.
  - Active customers were 40 against 42, off target for 2 months.
  - Inventory turns were 5.33 against 6.50, off target this month only.

The data doesn't show why costs or the KPIs moved, so the narrative states only what moved and by how much.

Files are in `output/`:
- mbr-narrative.md
- mbr.json