I've written the December 2025 write-up for leadership. The script reconciled the figures to the cent before I used them.

**December against budget**
- Revenue was $827K against a budget of $824K, and operating income was $8K against $13K.
- Gross margin was 26.1% against 26.8%, which is (0.7) pts below budget. Operating expenses were on budget at $208K.
- Revenue fell ($72K) from November's $899K.

**Year to date**
- Revenue is $11,238K against $11,600K, a variance of ($362K).
- Operating income is $388K against $583K, a variance of ($195K).
- Gross margin is (0.9) pts below budget, so the year to date confirms the December margin shortfall.

**Drivers**
- In the month, the two largest variances are Other operating ($16K against $10K) and Cost of goods sold ($584K against $578K). Each is ($6K).
- For the year to date, the revenue shortfall is the main driver. Cost of goods sold is $196K favourable.
- The data doesn't show why costs ran over or revenue fell short. Customer-level revenue and COGS detail would answer that.

**KPIs off target:** four of the eight were off target in December.
- Days sales outstanding was 51.2 against 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 for 1 month.

The data notes list the input files with row counts and hashes. They also say that some rows don't add exactly as shown, because each amount is rounded on its own.

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