Debt Register
Illustrative rows for a fictional B2B billing platform, Sedgemoor. Interest is the excess hours per change over the codebase median of 3.1, times the change count in twelve months.
| Module | Severity rank | Changes, 12m | Hours per change | Interest, h/yr | Rank by interest |
|---|---|---|---|---|---|
| Invoice rendering | 7 | 118 | 8.3 | 614 | 1 |
| Tax rules engine | 2 | 62 | 9.6 | 403 | 2 |
| Subscription state machine | 1 | 52 | 10.2 | 369 | 3 |
| Webhook dispatch | not in the register | 94 | 6.9 | 357 | 4 |
| Legacy pricing tables | 3 | 3 | 12.6 | 28 | 11 |
| Currency conversion, old | 5 | 1 | 11.4 | 8 | 13 |
| Data import v1 | 4 | 0 | not measurable | 0 | none |
The severity column and the measured column disagree almost everywhere. Invoice rendering was ranked seventh and costs more per year than the top three combined, because it changes 118 times to their 52 and 62 and 3. Nothing about it felt urgent. Every single change to it was merely tedious.
Two of the team’s own top four are in code nobody touches. Legacy pricing tables had 3 changes in a year and data import v1 had none at all, so its interest is zero however bad the code is. Across the full 47-item register, 16 items sat in modules with no commit in twelve months.
Four of the ten most expensive modules in the codebase, carrying 780 hours a year between them, were not in the register at all. The largest was webhook dispatch, where every new event type needed edits in three places and nothing failed at compile time when one was missed.