A piece of technical debt to address
Technical debt is the future cost of a shortcut taken in code or design today. A technical debt item is that shortcut made trackable: a named entry with a principal (the work to fix it), an interest (the drag it imposes until then), and a decisionDecisionStrategyA recorded decision with context, rationale, and consequencesView reference → attached about whether and when to pay. Without the item, debt stays a vague feeling of slowness that nobody can argue about or schedule.
Ward Cunningham coined the metaphor in a 1992 OOPSLA experience report on the WyCash financial system. His framing was about evolving understanding: shipping first-time code is like going into debt, fine so long as it is paid back promptly with a rewrite, dangerous when the interest compounds. Cunningham later clarified on video that he never meant the metaphor as licence to write messy code. His debt was the gap between what the team understood when they shipped and what they came to understand later, repaid by refactoring as the domain became clear.
The metaphor drifted, as useful metaphors do, until it covered any quick-and-dirty work. Martin Fowler reclaimed some precision in 2009 with the technical debt quadrant. He crossed two axes: deliberate versus inadvertent (did you know you were taking debt on?) and prudent versus reckless (was it a considered call?). Deliberate and prudent debt, shipping now and booking the fix, is a legitimate business move. Reckless debt, deliberate or not, is the kind that quietly sinks a codebase. The quadrant moved the conversation from "is debt bad" to "what kind of debt is this, and was the decision sound."
The principal-and-interest distinction does the practical work. Principal is the one-off cost of fixing the thing. Interest is the recurring tax every featureFeatureProduct SpecificationA product capability or featureView reference → pays while it stays unfixed. Debt with high interest and low principal gets paid first; debt with low interest, however large the principal, can sit on the books indefinitely.
A team ships a checkout flow against a hard launch date by hard-coding three payment providers instead of building the planned provider abstraction. They log a debt item: principal estimated at five days to introduce the abstraction, interest running at roughly half a day every time a new provider or pricing rule is added. This is deliberate and prudent, in Fowler's terms, and the decision that created it is recorded.
Eight months on, the item has accrued. Four provider changes have each cost the predicted half-day, and a fifth is now blocked because the hard-coded branch cannot express a regional tax rule. The interest has caught up with the principal, and a feature now sits behind the debt. The team schedules the five-day fix, because the tracked item turned an argument about "the code feels fragile" into a comparison of two numbers.
In the Unified Product Graph, a technical debt item lives in the engineering region as a tracked liability rather than a comment buried in code. It attaches to the thing that bears it (ServicecarriesTechnical Debt Itemhierarchy), traces back to the choice that created it (service_carries_technical_debt_itemDecisionincursTechnical Debt Itemcausal), names what it holds up (decision_incurs_technical_debt_itemTechnical Debt ItemblocksFeaturecross-domain), and connects to the hazard it may have grown from (technical_debt_item_blocks_featureRiskmanifests asTechnical Debt Itemcross-domain). That risk_manifests_as_technical_debt_itemblocks_feature edge is the one that gets debt paid: a liability with no visible cost stays unfunded forever, and an item wired to a stalled feature makes the interest impossible to ignore.
Type-specific fields on BaseNode
debt_typestringType of debt. `code` = quality issues. `architecture` = structural problems. `security` = unpatched vulnerabilities. `test` = missing/flaky tests. `docs` = missing or stale documentation. `dependency` = outdated packages.
severityobjectSeverity on system or team. Requires human evaluation.
effort_to_fixobjectEstimated effort to resolve. Requires team knowledge of the codebase.
ownerstringOwning person or team responsible for paydown.
affected_areastringCodebase location, service, or module. @example "apps/graph/src/canvas/", "UserService", "auth module"
intereststringOngoing cost of leaving it unresolved (the "interest" in the financial metaphor). @example "~2h/sprint of workarounds", "blocks type-safe refactor of checkout"
intentionalitystringOrigin of the debt. `deliberate` = conscious decision to ship something imperfect (prudent or reckless). `inadvertent` = discovered after the fact. Based on Fowler's Technical Debt Quadrant.
idstringrequiredUnique identifier (UUID)
typeNodeTyperequiredDiscriminator for the entity type
titlestringrequiredDisplay name
descriptionstringOptional detailed description
statusstringLifecycle status
tagsstring[]Freeform tags for filtering
5 phases — initial: identified
5 edge types connected to this entity.
root_cause_manifests_as_technical_debt_itemtechnical_debt_item_blocks_featurerisk_manifests_as_technical_debt_item