I've written the December 2025 business review narrative to `output/mbr-narrative.md`, with the script's figures in `output/mbr.json`. The reporting script's checks passed, so the figures reconcile.

**What it says:**
- **Month:** Revenue was $827K against a budget of $824K, a $3K beat. Operating income was $8K against $13K, ($5K) short. Gross margin was 26.1%, (0.7) pts below budget.
- **Month drivers:** Cost of goods sold and other operating costs were each ($6K) over budget. Technology came in $4K under budget, which offset part of that.
- **Year to date:** The month's revenue beat doesn't change the year. Revenue is ($362K) below budget at $11,238K, and operating income is $388K against $583K. Revenue also fell ($72K) from November.
- **Year-to-date drivers:** Cost of goods sold is $196K under budget for the year, the opposite of December.
- **KPIs:** Four of eight are off target. Days sales outstanding and on-time delivery have each missed for 3 months, active customers for 2, and inventory turns for 1.
- **Data notes:** Both input files are listed with row counts and file hashes. Because each amount is rounded on its own, some table rows don't add up exactly as shown, and the notes say which ones.

**Two things to know:**
- The cost of goods sold line in the drivers ($584K) is smaller than the cost of goods sold figure in the script's month totals ($611K). I expect other cost lines are included in the total, but I haven't checked the P&L to confirm.
- The KPI bullets print values without units, exactly as the template sets them out. For example, days sales outstanding reads "51.2 against a target of 45.0". The script does provide unit labels, such as "days", if you want them added.