LeadDoing the work

Technical Debt Conversations That Survive Triage

The word refactor is the reject. A dated slice on a risk the PM already owns is the slot.

The card that sounded like cleanup was already on the floor. Style reference: photo by Walls.io on Unsplash.
The card that sounded like cleanup was already on the floor. Style reference: photo by Walls.io on Unsplash.

You're twelve minutes into triage. The board is already overcommitted. You paste the ticket: Refactor checkout retries. The PM doesn't argue architecture. They don't even look at the description.

They look at the title, then at the partner go-live, then at you.

"Later."

Later is not a slot. Later is how the same ticket dies for the third quarter in a row.

The Ticket That Never Made the Cut

You were right about the code. That is not what the room was scoring.

Triage is a scheduling meeting. The product owner will have to explain slips to someone else. A ticket that sounds like optional cleanliness has no acceptance test they can defend.

So it loses to anything with a date.

"We'll do it later" is a decision. It is not a maybe.

The Refactor Kill-Switch

What the PM hears when you say refactor is: unbounded work, no user-visible change, no way to know you're done.

Same hearing, cousin words: cleanup, hygiene, "tech-debt epic," "pay down the platform."

That hearing is rational. Unbounded cleanup has no demo. It has no "we missed the SLA." It has a vibe.

"Tech debt" does not save you. You didn't stop saying refactor. You said it in French.

Fowler's debt metaphor is handy for talking to non-technical people — and even he flags the gap: some of the real debt (the "now we know how we should have designed it" kind) has no clean financial parallel, which makes it hard to explain to managers why it appeared.

So the metaphor got you a vocabulary. It did not get you a slot.

Housekeeping language dies in the same way. "Clean up the code" sounds like optional chores next to a launch.

A separate "tech debt backlog" competing for leftover capacity never ships. That is not a morale problem. That is how leftover capacity works.

The kill-switch is the category. If the ticket still lives in cleanliness, triage will treat it as optional. Every time.

The Three-Field Slot — Risk, Leak, Date

You do not need a board deck. You need three fields the PM already uses.

Risk they already have to explain. Not "the module is messy." A named failure they will be asked about: partner SLA, checkout timeouts, a security review that already slipped a deal.

Revolgy's product-side version of this is blunt: bring forward only the debt slowing what the business is betting on this quarter. A cleanup of code nobody is touching this quarter should lose.

Fowler's version of the same cut: you only pay interest when you have to work that code. Crufty and stable can wait.

Leak you can point at in last week's hours. Not an estimate to fix. Hours already gone: on-call, support, the extra day every checkout change takes. Google SRE calls the toxic version of this toil — manual, repetitive, interrupt-driven work that expands if you leave it.

You are not requesting capacity. You are naming where it went.

A date already on their calendar. Partner go-live. Promo. Audit. Renewal. The PM is not funding cleanliness. They are funding not missing Thursday.

Those three fields are the slot. Everything else is atmosphere.

One Sprint, Not the Mountain

Checkout. Retry storm on a flaky downstream. Support is in it every week. On-call is in it. The partner integration goes live in eight weeks.

Last Tuesday: six hours across two engineers reproducing a double-charge that was retries, not fraud. The PM already knows Tuesday. They do not know the module name.

Wrong ticket: Refactor checkout. Five points of hope. No done definition. Hidden rewrite of the module you've been ashamed of since 2023.

Right ticket: Kill the retry loop that will miss the partner SLA. One sprint. Feature flag. Rollback date. Acceptance: no retry amplification in staging under the partner's timeout budget.

Walk it as three fields in the room, out loud, without a slide:

  • Risk: partner SLA, eight weeks, already on the roadmap they printed.
  • Leak: six hours last Tuesday, plus every checkout change that waits on the same loop.
  • Date: the go-live they will have to explain if it slips.

That is the same engineering work in the place that matters. It is not the mountain.

Fowler's gradual-paydown rule is the technical version of this: spend extra days on the cruft in the code you are already changing, not a principal payment on the whole nightmare. PM playbooks that are actually usable say the same thing from the other side — break high-effort work into chunks on the roadmap, don't treat it as fix-versus-don't.

The hidden-rewrite tell: the "slice" still requires a new service, a new data model, and two other teams. If the slice cannot ship behind a flag without those, you are not asking for a slice. You are smuggling a program.

"Tech debt" as a catch-all for the platform needs improvement is how scale-up teams talk themselves into a rebuild they have not scoped — or a rewrite bet nobody sized. Triage can smell that. So can you, if you are honest.

The product leader resists because they hear a stop. Take the stop away. Do not ask for a quarter to rebuild and pause everything else.

A slice that survives triage leaves the rest of the mess standing. That is the deal.

"Can't We Ship the Feature First?"

Sometimes they are right.

If the leak is not on the path of the thing shipping this Thursday, you do not get to tax that Thursday. Take the half-slice: the retry budget for the partner path only. Leave the rest of checkout ugly.

Sometimes they are not.

"Ship first" is the right call only below the design-payoff line — the point where skipping design still gets you the release sooner. Fowler puts that line in weeks, not months. If every checkout change already costs an extra day, you are not below the line. You are paying interest on the feature you think you are shipping first.

Say that without saying refactor.

"If we ship the new discount flag on this retry path, we will spend the week in support instead of the partner test. The slice is the retry loop. The flag can land in the same sprint after it."

You now own a deadline. Miss it and the next ask is radioactive. That is the cost of attaching work to their date. Take it or stay off the board.

If nobody owns the date — shared platform, four product teams, no partner go-live — you still need a calendar. Pick the next launch that actually hits the module. If there isn't one, you don't have a triage argument.

You have a budget argument. Different room.

This Is Not the Spreadsheet

There is a different conversation for budget forums: annual carry cost, hours × rate, principal versus bleed. That is a carry-cost worksheet. It is not this room.

Triage is twelve minutes and a board that is already full. Dollars help later. Here you need a risk, a leak, and a date.

You are not the engineer who finally taught them architecture. You are the engineer who stopped handing them a ticket they are paid to cut.

Identity is the contrast. The 15-percent-every-sprint handbook assumes a PM who will run a system. The board-case handbook assumes a CTO with four executives. You are in a room with one person who owns Thursday.

Bring Thursday's problem. Ask for one sprint. Leave the word at the door.

Close

Cleanliness does not get a date.

A date gets a slice.

Related

← Back to hub