The December 2025 scorecard is done: 4 of the 8 KPIs met target and 4 missed. It's saved at `output/kpi_scorecard_2025-12.md`, and you can rebuild it with `python3 kpi_scorecard.py [YYYY-MM]`.

| KPI | Actual | Target | Variance | Status | Months missed in a row |
|---|---:|---:|---:|---|---:|
| Revenue | $826,751 | $823,600 | +$3,151 (+0.4%) | ✅ Met | 0 |
| Gross margin % | 26.1% | 26.0% | +6 bp | ✅ Met | 0 |
| Days sales outstanding | 51.2 | 45.0 | +6.2 days | ❌ Missed | 3 |
| On-time delivery % | 93.3% | 95.0% | −170 bp | ❌ Missed | 3 |
| Order fill rate % | 97.6% | 97.0% | +60 bp | ✅ Met | 0 |
| Active customers | 40 | 42 | −2 | ❌ Missed | 2 |
| Inventory turns | 5.33 | 6.50 | −1.17 (−18%) | ❌ Missed | 1 |
| Opex % of revenue | 25.1% | 25.2% | −14 bp | ✅ Met | 0 |

The saved file also has the November figures and month-on-month change for each KPI, how many months each target was met this year, full-year revenue against target, and a table of the last six months.

**What stands out:**
- **Days sales outstanding is the biggest miss and keeps getting worse.** It went 44.9 → 47.3 → 48.6 → 51.2 days from September to December, so customers are taking longer to pay. This needs a look at overdue invoices.
- **On-time delivery has missed target for 3 months running** and was below 95% in 5 of the last 6 months. Order fill rate, by contrast, recovered from 91% in July and has beaten target since October.
- **Inventory turns fell sharply in December**, from 6.67 to 5.33. Lower recent sales combined with higher month-end inventory would produce a drop this size, but I haven't confirmed that's the cause.
- **Active customers dropped for the second month in a row** (42 → 41 → 40).
- **Revenue only just beat target**, and December's target was the year's lowest. For the full year, revenue was $11.24M against $11.60M, **3.1% under**, and only 4 of 12 months met target.
- Opex was 25.1% of revenue, up from 22.6% in November, mainly because revenue fell. It stayed just under the budgeted 25.2%.

**Limits:**
- **"Met" means at or better than target, with no tolerance.** Revenue (+0.4%) and gross margin (+6 bp) passed by very little.
- **Some figures aren't checked against the P&L.** The data says revenue, gross margin and opex % come from `pnl_fy2025.csv`, but that file isn't in the workspace, so I took them from the KPI file as given.
- **The last column of the trend table shows December's targets only.** Revenue and opex targets change from month to month. The ✗ marks in that table do use each month's own target.