I've produced the December 2025 KPI scorecard. It ties to the P&L: the script's checks on revenue, gross margin percent and opex percent of revenue all passed.

**4 of 8 KPIs were on target in December 2025, and 2 have been off target for three months or more.**

| KPI | Actual | Target | Variance | Status | Months off |
| :-- | --: | --: | --: | :-- | --: |
| Revenue | $827K | $824K | $3K | on target | 0 |
| Gross margin percent | 26.1% | 26.0% | 0.1 pts | on target | 0 |
| Days sales outstanding | 51.2 | 45.0 | (6.2) | off target | 3 |
| On-time delivery percent | 93.3% | 95.0% | (1.7) pts | off target | 3 |
| Order fill rate percent | 97.6% | 97.0% | 0.6 pts | on target | 0 |
| Active customers | 40 | 42 | (2) | off target | 2 |
| Inventory turns | 5.33 | 6.50 | (1.17) | off target | 1 |
| Opex percent of revenue | 25.1% | 25.3% | 0.1 pts | on target | 0 |

The two KPIs off target for three months or more are:
- **Days sales outstanding:** 51.2 against a target of 45.0. The note asks the owner which customer balances are pushing receivables up.
- **On-time delivery percent:** 93.3% against a target of 95.0%. The note asks the owner what is causing the late deliveries.

Each figure is rounded separately. For opex percent of revenue, the 0.1 pts variance therefore doesn't match the gap between the actual and target shown in the table. The data notes in the scorecard note say this.

Files are in `output/`:
- `scorecard.json`
- `scorecard-note.md`