tech-debt-tracker
Turn vague "this is messy" complaints into a ranked debt ledger
with carrying-cost estimates and a repayment plan the team can
execute. Frames debt as principal (the gap) plus interest
(what we keep paying because the gap exists). Output is copy-paste
ready; ticket / backlog write-back is user-gated.
When to use
- The user lists code smells, dead code, or "we should refactor X"
and wants them turned into trackable items.
- A retro surfaced multiple debt complaints; the team needs them
ranked, not all addressed at once.
- A new initiative is about to add features on top of debt; the
team wants the carrying cost surfaced before committing.
- German triggers: "Tech-Debt-Liste", "wo bremst es uns?",
"Aufräumen-Plan".
Do NOT use when:
- The user wants a single bug fixed — route to
/bug-fix.
- The complaint is about process, not code (slow CI, noisy alerts) —
surface as ops debt, not code debt; consider escalating to PO.
- The "debt" is actually a missing feature — route to
po-discovery.
Procedure
1. Inspect inputs and collect candidate debt items
Read the input (retro notes, code-review threads, pasted complaints,
agent observations). Analyze each source for one candidate per
bullet, no editing yet.
2. Classify each item
| Class |
Examples |
| Code debt |
Smells, duplication, dead code, weak tests, missing types |
| Architecture debt |
Coupling, layer violations, missing seams |
| Operations debt |
Manual deploys, alert fatigue, runbook gaps |
| Knowledge debt |
Stale docs, single-owner systems, missing onboarding |
Items spanning two classes split into two entries — never merge.
3. Estimate principal and interest
For each item:
- Principal — rough effort to repay (S / M / L; days, not hours).
- Interest — what we keep paying every week / sprint / month
because the debt exists. Quantify or mark
unknown (unknown
interest is itself a finding — surface it).
Carrying cost = interest × time-until-repaid. High principal +
zero interest → leave it. Low principal + recurring interest →
top of the queue.
4. Rank by interest ÷ principal
Sort descending. The top ten are the candidates. Items below the
top ten get a single line each (so they are not lost) but no
deeper analysis — debt-list bloat is itself a debt.
5. Shape a repayment plan
For the top 3-5 items:
- Repayment shape — single PR · multi-PR series · campaign ·
re-architecture.
- Owner role — engineering · ops · PO · platform team.
- Trigger — what makes us pay this next (e.g. "before adding
feature X", "when test runtime > 10 min", "next quarterly").
Items without a trigger sit forever. A trigger that is "someday"
is no trigger — push back.
6. Issue a verdict
| Verdict |
When to issue |
track |
Items added to the ledger; no immediate action |
pay-now |
One or more items have a trigger that already fired |
block |
New feature work blocked until top item is repaid (rare) |
7. Validate the ledger
Verify before emitting: every top item has a class, principal,
interest (or unknown), trigger, and owner; the ranking matches
interest ÷ principal; tail items have one line each. Ensure no
"someday" triggers and no agent-owned repayment owners slipped in.
Output format
The ledger is a single block with these ordered fields:
Inventory: — count and classes touched
Top items: — numbered list ranked by interest ÷ principal,
each with class, principal, interest, trigger, owner, shape
Tail: — one-line bullets for tracked-but-deferred items
Verdict: — exactly one of track / pay-now / block
Next: — handoff target (/adr-create or backlog write-back)
Tech-Debt Ledger
Inventory: <count> items, <classes touched>
Top items (interest ÷ principal):
1. [arch] <item> Principal: M Interest: high (3 hrs/sprint)
Trigger: <condition> Owner: <role> Shape: <PR / series / campaign>
2. [code] <item> Principal: S Interest: med ...
...
Tail (tracked, no immediate action):
- <item>
- <item>
Verdict: track | pay-now | block
Next: /adr-create (if a tradeoff lock is needed) | backlog write-back
Gotcha
- "Refactor X" is not a debt item — it is a wish. The item must
name the gap and what it costs.
- Interest the team cannot measure is real but invisible. Mark
unknown and ask a probe ("how often do you hit this?") rather
than inventing a number.
- A debt list with no trigger is paperwork. Reject items the team
has no plan to ever repay.
Do NOT
- Do NOT enumerate every smell in the codebase — the top ten plus
a tail is the contract.
- Do NOT propose repayment owners the agent itself owns; debt
repayment belongs to a human role.
- Do NOT push items into Jira / Linear without explicit ask;
output is copy-paste ready, write-back is gated.
- Do NOT silently inflate principal estimates to discourage repayment
the team should do.
1---2name: tech-debt-tracker3description: Use when surfacing tech debt as trackable items — interest-vs-principal framing, prioritisation by carrying cost, repayment plan — even if the user just says 'this codebase is a mess'.4---56# tech-debt-tracker78> Turn vague "this is messy" complaints into a **ranked debt ledger**9> with carrying-cost estimates and a repayment plan the team can10> execute. Frames debt as **principal** (the gap) plus **interest**11> (what we keep paying because the gap exists). Output is copy-paste12> ready; ticket / backlog write-back is user-gated.1314## When to use1516- The user lists code smells, dead code, or "we should refactor X"17 and wants them turned into trackable items.18- A retro surfaced multiple debt complaints; the team needs them19 ranked, not all addressed at once.20- A new initiative is about to add features on top of debt; the21 team wants the carrying cost surfaced before committing.22- German triggers: "Tech-Debt-Liste", "wo bremst es uns?",23 "Aufräumen-Plan".2425Do NOT use when:2627- The user wants a single bug fixed — route to `/bug-fix`.28- The complaint is about process, not code (slow CI, noisy alerts) —29 surface as ops debt, not code debt; consider escalating to PO.30- The "debt" is actually a missing feature — route to `po-discovery`.3132## Procedure3334### 1. Inspect inputs and collect candidate debt items3536Read the input (retro notes, code-review threads, pasted complaints,37agent observations). Analyze each source for one candidate per38bullet, no editing yet.3940### 2. Classify each item4142| Class | Examples |43|---|---|44| Code debt | Smells, duplication, dead code, weak tests, missing types |45| Architecture debt | Coupling, layer violations, missing seams |46| Operations debt | Manual deploys, alert fatigue, runbook gaps |47| Knowledge debt | Stale docs, single-owner systems, missing onboarding |4849Items spanning two classes split into two entries — never merge.5051### 3. Estimate principal and interest5253For each item:5455- **Principal** — rough effort to repay (S / M / L; days, not hours).56- **Interest** — what we keep paying *every week / sprint / month*57 because the debt exists. Quantify or mark `unknown` (unknown58 interest is itself a finding — surface it).5960Carrying cost = `interest × time-until-repaid`. High principal +61zero interest → leave it. Low principal + recurring interest →62top of the queue.6364### 4. Rank by `interest ÷ principal`6566Sort descending. The top ten are the candidates. Items below the67top ten get a single line each (so they are not lost) but no68deeper analysis — debt-list bloat is itself a debt.6970### 5. Shape a repayment plan7172For the top 3-5 items:7374- **Repayment shape** — single PR · multi-PR series · campaign ·75 re-architecture.76- **Owner role** — engineering · ops · PO · platform team.77- **Trigger** — what makes us pay this *next* (e.g. "before adding78 feature X", "when test runtime > 10 min", "next quarterly").7980Items without a trigger sit forever. A trigger that is "someday"81is no trigger — push back.8283### 6. Issue a verdict8485| Verdict | When to issue |86|---|---|87| `track` | Items added to the ledger; no immediate action |88| `pay-now` | One or more items have a trigger that already fired |89| `block` | New feature work blocked until top item is repaid (rare) |9091### 7. Validate the ledger9293Verify before emitting: every top item has a class, principal,94interest (or `unknown`), trigger, and owner; the ranking matches95`interest ÷ principal`; tail items have one line each. Ensure no96"someday" triggers and no agent-owned repayment owners slipped in.9798## Output format99100The ledger is a single block with these ordered fields:1011021. `Inventory:` — count and classes touched1032. `Top items:` — numbered list ranked by `interest ÷ principal`,104 each with class, principal, interest, trigger, owner, shape1053. `Tail:` — one-line bullets for tracked-but-deferred items1064. `Verdict:` — exactly one of `track` / `pay-now` / `block`1075. `Next:` — handoff target (`/adr-create` or backlog write-back)108109```110Tech-Debt Ledger111Inventory: <count> items, <classes touched>112113Top items (interest ÷ principal):114 1. [arch] <item> Principal: M Interest: high (3 hrs/sprint)115 Trigger: <condition> Owner: <role> Shape: <PR / series / campaign>116 2. [code] <item> Principal: S Interest: med ...117 ...118119Tail (tracked, no immediate action):120 - <item>121 - <item>122123Verdict: track | pay-now | block124Next: /adr-create (if a tradeoff lock is needed) | backlog write-back125```126127## Gotcha128129- "Refactor X" is not a debt item — it is a wish. The item must130 name *the gap* and *what it costs*.131- Interest the team cannot measure is real but invisible. Mark132 `unknown` and ask a probe ("how often do you hit this?") rather133 than inventing a number.134- A debt list with no trigger is paperwork. Reject items the team135 has no plan to ever repay.136137## Do NOT138139- Do NOT enumerate every smell in the codebase — the top ten plus140 a tail is the contract.141- Do NOT propose repayment owners the agent itself owns; debt142 repayment belongs to a human role.143- Do NOT push items into Jira / Linear without explicit ask;144 output is copy-paste ready, write-back is gated.145- Do NOT silently inflate principal estimates to discourage repayment146 the team should do.