I've built the December 2025 scorecard: 4 KPIs are green, 1 amber and 3 red. It's saved in `output/kpi_scorecard_2025-12.md`, and `scorecard.py` recalculates it from `data/kpis_fy2025.csv` for any month (`python3 scorecard.py 2025-11`).

| KPI | Actual | Target | Status | Trend (Oct → Nov → Dec) |
|---|---:|---:|:---:|---|
| Revenue | $826,751 | $823,600 | Green (+0.4%) | down each month |
| Gross margin % | 26.1% | 26.0% | Green | flat |
| DSO (days) | 51.2 | 45.0 | **Red** | 47.3 → 48.6 → 51.2 |
| On-time delivery | 93.3% | 95.0% | Amber | 94.2% → 93.7% → 93.3% |
| Order fill rate | 97.6% | 97.0% | Green | improving |
| Active customers | 40 | 42 | **Red** | 42 → 41 → 40 |
| Inventory turns | 5.33 | 6.50 | **Red** | dropped from 6.67 in Nov |
| Opex % of revenue | 25.1% | 25.2% | Green | up 254 bp month on month |

**Main points:**
- **Full-year revenue:** $11.24M against $11.6M, a 3.1% miss. Almost all of it came from March, July and August. December itself met its target, but that target was much lower than in earlier months.
- **DSO:** it has risen for three months and is now 6.2 days over target, so collections are slowing.
- **Inventory turns:** the fall in one month is unusually sharp. It's worth checking the December inventory balance (account 1200) before reporting it.
- **Opex:** it met target only because the December target ratio was set high (25.2%). The actual ratio rose because revenue fell.

**Assumptions to confirm:**
- **Amber/red thresholds:** the data has none, so I used my own rule. A KPI is amber if it misses target by up to 2% of the target value, and red if it misses by more. A different rule would change which KPIs show amber or red.
- **Unchecked figures:** the definitions say revenue, gross margin and opex % should match `pnl_fy2025.csv`, but that file isn't in the workspace, so I couldn't check them.