I've built the December 2025 KPI scorecard and its note. The script's tie checks against the P&L all passed: revenue ($827K), gross margin percent (26.1%) and opex percent of revenue (25.1%) each match.

**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 | on target | 0 |
| Days sales outstanding | 51.2 days | 45.0 days | (6.2) days | 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 turns | 6.50 turns | (1.17) turns | off target | 1 |
| Opex percent of revenue | 25.1% | 25.3% | 0.1 | on target | 0 |

A positive variance means better than target. Variances on percent KPIs are in percentage points.

**Exceptions** (off target three months or more):
- **Days sales outstanding:** 51.2 days against a target of 45.0. The note asks the owner which customers' balances pushed receivables up, and when they'll be collected.
- **On-time delivery percent:** 93.3% against a target of 95.0%. The note asks the owner which carriers, sites or product lines account for the late orders, and when it will recover.

Active customers (2 months off) and inventory turns (1 month off) are below target but not yet a three-month run, so they aren't listed as exceptions.

**Files are in `output/`:**
- `scorecard-note.md`: the note, with headline, scorecard, exceptions and data notes
- `scorecard.json`: the script's figures