I've written the December 2025 narrative to `mbr_narrative_2025-12.md` in the project root. I pulled the figures by script from both CSVs, but I didn't run a separate check on the finished file.

December revenue beat budget slightly, but operating income missed by 38%.

- **P&L:**
  - Revenue was $826.8k, which is $3.2k over budget.
  - Gross profit missed by $5.3k, because COGS and freight were both over budget.
  - Operating income was $7.9k against a $12.7k budget.
  - For the year, revenue was 3.1% under budget and operating income was 33% under.
- **Opex:** Total opex was on budget, but only because marketing and technology underspent. "Other operating" was $16.0k against a $10.0k budget.
- **KPIs missed:** DSO (51.2 days against a 45.0 target) and on-time delivery have each worsened for four straight months. Inventory turns (5.33 against 6.50) fell sharply from November. Active customers (40) were at their lowest of the year.
- **Gross-margin target conflict:** The KPI file targets 26.0% gross margin, but the P&L budget implies 26.8%. Margin passes against one and fails against the other, so someone needs to confirm which applies.

The files give no causes for any variance. The narrative lists those as open questions for owners instead of guessing, for example what drove the other-operating spike and why DSO is rising. The inventory balance isn't in the data, so the inventory-turns drop can't be explained from these files either.