I've built the December 2025 KPI scorecard and its note. It ties to the P&L: revenue ($827K), gross margin percent (26.1%) and opex percent of revenue (25.1%) all match `pnl_fy2025.csv`.

**Headline:** 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 |

**Exceptions (off target three months running):**
- **Days sales outstanding:** 51.2 days against a target of 45.0. The note asks the collections owner which customers' overdue balances drove the rise.
- **On-time delivery percent:** 93.3% against a target of 95.0%. The note asks the operations owner where the late orders come from.

Active customers (2 months off) and inventory turns (1 month off) also missed target but aren't listed as exceptions yet.

**Rounding:** Opex percent of revenue shows a variance of 0.1 pts. That isn't the exact gap between the rounded actual and target, because each figure is rounded separately. The note says so in its data notes.

I named the owners in the note ("credit and collections", "operations") myself; they aren't in the data. Replace them with the real owners before you circulate it.

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