I've built the December 2025 scorecard. It's in `kpi_scorecard_2025-12.md`, and `scorecard.py` produces it. Every figure is calculated by the script. You can run `python3 scorecard.py 2025-11` to get any other month.

**December 2025: 4 Green, 1 Amber, 3 Red out of 8 KPIs**

| KPI | Actual | Target | Variance | Status | Change from Nov |
|---|---|---|---|---|---|
| Revenue | $826,751 | $823,600 | +$3,151 (+0.4%) | Green | –$71,929 |
| Gross margin | 26.1% | 26.0% | +6 bp | Green | +27 bp ▲ |
| Days sales outstanding (DSO) | 51.2 | 45.0 | +6.2 days | **Red** | +2.6 ▼ |
| On-time delivery | 93.3% | 95.0% | –170 bp | Amber | –40 bp ▼ |
| Order fill rate | 97.6% | 97.0% | +60 bp | Green | +20 bp ▲ |
| Active customers | 40 | 42 | –2 | **Red** | –1 ▼ |
| Inventory turns | 5.33 | 6.50 | –1.17 | **Red** | –1.34 ▼ |
| Opex % of revenue | 25.1% | 25.2% | –14 bp | Green | +254 bp ▼ |

**Main points**
- **Collections are getting worse.** DSO has risen four months in a row, from 44.9 in September to 51.2 in December. This is the biggest miss.
- **Inventory turns fell sharply** from 6.67 to 5.33. Since December revenue was lower, inventory was probably built up ahead of demand. That's worth checking against the inventory balance (account 1200).
- **Active customers have dropped** from 43 in September to 40, and on-time delivery has been at or below 95% for six of the last seven months. These two may be connected.
- **Revenue met its target, but the target itself was low.** Full-year revenue was $11.24M against $11.60M, 3.1% under, and only 4 of 12 months hit target.
- Opex % met its target, but it rose 254 bp from November because revenue fell. Fill rate has recovered steadily from 91.2% in July.

**Rules I chose (change them if you use different ones)**
- **Green** means at or better than target. **Amber** means worse by no more than 2% of the target. **Red** means worse by more than that. The 2% threshold is my choice; it's a setting called `AMBER_TOL` in the script.
- **Year-to-date** revenue is a sum. Every other KPI's year-to-date figure is a simple average of the monthly values, not weighted by revenue. That makes the year-to-date opex % and gross margin approximate.
- I took the CSV values as given. The definitions refer to `pnl_fy2025.csv` and to account balances, but those files aren't in the workspace, so I couldn't check the figures against them.

The output file also has a six-month trend table. I can add charts if you need a version to present.