I've built the December 2025 KPI scorecard, and it ties to the P&L. Revenue, gross margin percent and opex percent of revenue each match the figures from `pnl_fy2025.csv`, so the scorecard script ran without errors.

**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 | 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) | off target | 3 |
| Order fill rate percent | 97.6% | 97.0% | 0.6 | 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 | on target | 0 |

Variances for percent KPIs are in percentage points. Figures in parentheses are worse than target.

**Exceptions:** two KPIs have been off target for three months or more.
- **Days sales outstanding:** 51.2 days against a target of 45.0. The note asks the collections owner which customers are driving the increase.
- **On-time delivery percent:** 93.3% against a target of 95.0%. The note asks the operations owner where the late deliveries come from.

Active customers and inventory turns are also off target, but for fewer than three months, so they aren't listed as exceptions.

The opex row may look wrong at first. Its rounded actual and target are 0.2 points apart, but the variance shows 0.1. Both are correct: the unrounded gap is about 0.14 points.

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