plugins/frontend-toolkit/skills/tech-debt-management/SKILL.md
Inventory and prioritize technical debt — TODO/FIXME/HACK, any usage, deprecated APIs, untested logic — with impact × effort matrix. Use at quarter start, before a refactoring sprint, when a new teammate joins, or when feature velocity slows. Not for actually paying down debt (use code-refactoring) or recording a migration approach (use decision-records) — this only inventories and prioritizes.
npx skillsauth add jaykim88/claude-ai-engineering tech-debt-managementInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Make hidden tech debt visible so it can be prioritized and repaid. Untracked debt compounds silently; tracked debt is just a backlog item.
Universal — the inventory + impact×effort + sprint-budget pattern applies to any codebase; tool names (grep patterns, deprecated APIs) vary by stack.
Inventory comment-flagged debt
// TODO(owner, TICKET-123): ... (a lint rule can forbid bare TODOs) so debt links to the trackerInventory type-system escape hatches
any/as any, Python # type: ignore, etc.)Inventory deprecated dependencies and APIs
outdated reportIdentify untested business logic
Score each debt item: Impact × Effort
| | Low effort | High effort | |---|---|---| | High impact | 🟢 Do now | 🟡 Plan a project | | Low impact | 🔵 Backlog | 🔴 Delete from list |
git log churn, CodeScene)Document in TECH-DEBT.md (or docs/exec-plans/tech-debt-tracker.md if using craft-kit conventions)
Allocate 15-20% sprint capacity to debt
TDR = (fix-cost) / (build-cost from scratch)Schedule quarterly review
TECH-DEBT.md lists every known debt item with impact × effort score (Impact weighted by change frequency)any types — some may be intentional pending downstream library typesTECH-DEBT.md (or docs/exec-plans/tech-debt-tracker.md if using craft-kit conventions) with table:
grep -rEn 'TODO|FIXME|HACK|XXX' src/any grep: grep -rEn ': any($|[^a-zA-Z])|as any' src/moment → date-fns/dayjs, class components → hooks, componentDidMount → useEffectnpm outdated or pnpm outdatedvitest run --coverageNgModule → standalone components; @Input() → input() signalcode-refactoring — most debt is paid down through refactoring passesdecision-records — large debt items deserve an ADR for the migration approachdevelopment
Design webhooks correctly on both sides — sending (HMAC signing, retries with backoff, at-least-once) and receiving (verify signature on raw body, enqueue + 200 fast, dedupe on event id). Use when adding webhook delivery or consuming a provider's webhooks. Not for internal service-to-service events (use async-messaging) or general outbound-call retry policy (use resilience-patterns).
testing
Use transactions and isolation levels correctly — keep them short, no network calls inside, explicit isolation, retry on serialization conflicts, and choose optimistic vs pessimistic locking. Use when a write spans multiple tables, when concurrent updates corrupt data, or when designing money/inventory flows. Not for cross-service event delivery (use async-messaging Outbox) or schema-level constraints (use schema-design).
development
Backend testing pyramid — unit for pure logic, integration against a real DB (Testcontainers), and consumer-driven contract testing (Pact) for service boundaries. Use before a feature, after a bug fix, or when services break each other on deploy. Not for load testing (use performance-profiling) or security testing (use backend-security-audit).
data-ai
Design a relational schema — normalize to 3NF then denormalize with justification, choose the right Postgres index type per data shape, enforce constraints at the DB. Use when modeling a new domain, when queries are slow, or before a migration. Not for diagnosing slow queries (use query-optimization) or shipping the change without downtime (use migration-strategy).