I've written the December 2025 scorecard to `kpi_scorecard_2025-12.md`. The script `scorecard.py` calculates every figure from the CSV and can be re-run for any month (`python3 scorecard.py 2025-11`). December has **4 KPIs on target, 1 to watch and 3 off target.**

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

**What to look at:**
- **DSO is getting worse:** it went from 47.3 to 48.6 to 51.2 days over October to December, the worst figure of the year. Collections need attention.
- **Inventory turns fell sharply,** from 6.67 to 5.33 in one month. That points to inventory building up at year end while cost of goods sold drops with lower December sales.
- **On-time delivery has been below target for three months** and is slowly declining (94.2% to 93.7% to 93.3%).
- **Active customers have dropped by one each month** since October (42 to 41 to 40).
- **Revenue hit its December target, but the full year missed:** $11.24M against $11.60M, which is $362K (3.1%) short. Only 4 of 12 months met the revenue target.
- **Opex was on target only because the December budget was high.** The ratio rose 254 bp from November to 25.1%, just under its 25.2% target.

**Things to know:**
- **I chose the status thresholds myself,** since the data doesn't define any. "Watch" means worse than target by up to 2% relative; anything worse is "Off target". Tell me if you use different thresholds and I'll re-run it.
- **I couldn't check the figures against the P&L.** Several KPI definitions point to `pnl_fy2025.csv`, but that file isn't in the workspace, so I took the KPI actuals as given.