Commentary

Vibe Prompt of the Day: Do We Have Any Tech Debt That We Should Clean Up Before We Continue?

A reflection on using a simple GenAI working prompt to find the kind of technical debt that only becomes obvious after the next step.

Some debt is not visible until the system starts charging interest.

GenAISoftware DevelopmentTechnical DebtSystems Thinking

Today’s Vibe Prompt of the Day is:

Do we have any tech debt that we should clean up before we continue?

One of the promises of GenAI-assisted development is speed. More code. More experiments. More automation. More momentum. So it is disappointing to discover that GenAI also produces technical debt at computer speed.

Not because it is uniquely careless. Humans produce technical debt too. We always have. But after watching the pattern for a while, I noticed that a lot of the debt we were finding was not obvious at first. It became obvious only after the next question, the next run, the next publish, the next smoke test, the next midnight pass through the workflow.

In other words, some debt is not visible until we start paying interest on it.

The Kind Of Debt I Mean

I am not talking about the lazy version of technical debt, where someone knowingly cuts a corner and hopes no one notices. I mean the debt created by uncertainty.

The workflow is still forming. The naming convention is not yet real. The first version of the validator only knows the first version of the artifact. The deployment process works, but only because the person driving it remembers the three manual steps that are not written down yet. The smoke test proves the happy path, but the next run reveals that the test setup itself was making an invalid assumption.

Sometimes these are artifacts of discovery, not failures of discipline.

When we move quickly through unfamiliar territory, we tend to build something that is locally reasonable and globally awkward. The problem may not exist yet because the surrounding system has not grown enough to reveal it.

What The Logs Showed

This is not academic research. This is just a pattern I noticed in my working logs.

One example involved generated test-run artifacts. A folder from an earlier exploratory pass looked enough like an active retained test run to be swept up by validation, but it was missing the run.json contract that real retained runs require. At the time it was created, it was just useful output. Later, when environment validation became stricter, that old useful output became a false participant in the current system.

The fix was not dramatic. We did not invent fake metadata to appease the validator. We moved the old package into an archive where it still existed, but no longer pretended to be an active run.

That is a tiny example, but it captures the shape of the problem. The debt was not “bad code.” It was an artifact that had outlived the assumptions under which it was created.

Another example came from a status-reporting workflow. The first version could generate a useful DevOps status report, but the next question was obvious: how do we know the newsletter is using the latest report? A date-based path or a guessed file location might work for a demo. It would not be trustworthy once the report became part of a daily operating rhythm, especially if we ran it multiple times during an incident.

The cleanup was to make each run timestamped and make the latest report path explicit. Again, not glamorous. But without that cleanup, the team could easily read yesterday’s status while believing it was reading today’s.

That is the kind of debt that quietly becomes operational risk.

The Sandbox Taught Us Before Production Did

One of the clearer examples came while building a Supabase control-plane pattern.

The goal was not exotic: create a reusable place for operational controls such as locks and maintenance mode. But we intentionally tested it in a dedicated sandbox first.

That was a good decision. The first pass exposed a few problems:

  • a CLI working-directory mistake created nested temp state in the wrong place.
  • a database function had an ambiguous on conflict reference.
  • the smoke test tried to simulate an expired lock in a way that violated the table’s own timing constraint.
  • direct database access failed from this machine because the host resolved to an IPv6 address with no usable route, so the runner needed to use the linked pooler URL instead.

None of those issues were obvious from the idea alone. They became visible only when the workflow was exercised as a workflow.

If we had kept going without stopping to ask the tech-debt question, the friction would probably have shown up later in a more expensive place. A lock mechanism that is almost right is dangerous because it can fail exactly when coordination matters. A maintenance-mode control that works in the author’s terminal but fails in another network context is not an operational control. A smoke test that violates the schema while trying to prove the schema is not a trustworthy test.

The sandbox let us pay the interest early, while the bill was still small.

The Publish Pipeline Had A Similar Lesson

We saw the same pattern in publishing work.

The actual publishing path eventually became clear: source note to Astro article, verify, dry-run the published-site sync, sync the site, then handle the relevant nested repos. But that clarity came after a few runs where adjacent ideas pulled on the process.

At one point, an article publish task drifted into an unrelated intake-workflow lane before being corrected. In another case, the logs reminded us that generated site output can create expected Pagefind and hashed-asset churn, which should not be mistaken for unrelated changes. In another, a local-only publishing boundary mattered: run the pipeline, but do not push.

That is process debt more than code debt.

But with GenAI, process debt matters because the agent will happily execute the wrong process if the process boundary is fuzzy enough. The cleanup is not to make everything heavyweight. It is to encode the next right move where the system can retrieve it.

Why This Prompt Works

The useful part of the prompt is the timing. It does not ask, “Can we make this perfect?” It asks:

Before we continue, is there anything we should clean up?

This framing creates a pause between momentum and commitment. It catches the moment when a prototype is about to become a tool, a tool is about to become a workflow, or a workflow is about to become an operating habit.

That pause matters because GenAI can collapse the time between those stages. A human team may have had days or weeks for awkwardness to become visible. A coding agent can build several layers of dependency before anyone has emotionally registered that the first layer was provisional.

So the question becomes a debt checkpoint. Not a ceremony. Not a governance board. Not a request to polish every corner. Just a short systems-thinking interruption:

  • What did we learn only after building this?
  • Which assumptions are now stale?
  • Which generated artifact is pretending to be canonical?
  • Which manual step has become load-bearing?
  • Which validator is catching yesterday’s shape of the system?
  • Which shortcut will become harder to unwind if we add one more layer?

Not All Debt Is A Mistake

Technical debt as moral failure. Sometimes debt is a bad shortcut. Sometimes it is a rational tradeoff. Sometimes it is the receipt from learning something the system could not have known earlier.

That last category matters in GenAI-assisted work. We are asking new tools to build on infrastructure created by decades of human decisions, conventions, exceptions, forgotten compromises, and half-documented survival moves. We should not be surprised when the first pass leaves residue.

The question is whether we notice the residue before we build the next floor on top of it.

Trying to prevent all technical debt up front sounds responsible, but I am not convinced we know how to do that yet. Not in ordinary software work, and certainly not when human intent, legacy infrastructure, generated code, local automation, cloud services, and living documentation are all moving at once.

For now, I trust the checkpoint more than the fantasy of perfect prevention.

The Practice

So today’s prompt is now part of my daily process:

Do we have any tech debt that we should clean up before we continue?

When the answer is: “no, we are good,” we can make a check point and keep going. But when the answer is yes, it is usually cheaper to hear it now than after one more layer, one more workflow, one more dependency, one more late-night publish.

Even with compression, the software development life cycle is still a marathon, not a sprint. Our goal is to stay mindful and not let a previously true assumption keep us from finishing.

The goal is to keep speed from outrunning trust.