Skip to content
Back to all field notes vibe · 8 min

Scared to touch it: turning fear of your own codebase into a safety net

The fear is information. It is telling you exactly where you have no safety net. Follow it, and it becomes a map of what to build.

field note 8 min

There is a moment that catches a lot of people who built something with AI. The app works. Users depend on it. And you realize you are afraid to change it, because you do not fully understand how it works and you have no way to know if a change broke something until a user tells you. So you stop. You avoid the risky files. You add features around the edges instead of fixing the core, because touching the core feels like defusing a bomb you did not build.

I want to reframe that fear completely, because most advice treats it as a character flaw to push through. It is not. The fear is accurate. It is a precise signal about the real state of your codebase, and if you follow it instead of fighting it, it hands you the exact plan for fixing the thing that scares you.

The fear is telling the truth

Start by taking the fear seriously as data. You are afraid to change the code because two things are true: you cannot fully predict what a change will do, and you have no independent way to catch it if the change is wrong. Both of those are real facts about your project, not feelings about your competence.

That is worth sitting with, because the usual reactions are both wrong. One is to override the fear and change things anyway, which is how you ship the regression you were afraid of. The other is to obey the fear and freeze, which is how the project slowly dies as you build only in the safe corners. The fear is not asking you to be braver or more careful. It is pointing at a missing thing, and the fix is to build the missing thing.

The missing thing has a name. It is the safety net: the ability to make a change and know, before a user does, whether you broke something. You are afraid because you do not have one. So build one.

Fear is a map

Here is the part that turns anxiety into a plan. The fear is not evenly distributed. There are files you will happily edit and files you will not go near. That distribution is a map, and it is more accurate than any audit you could run.

The code you are scared to touch is precisely the code that is load-bearing and unprotected. It matters, or you would not be scared, and it has no net, or you would not be scared. The files you edit without a second thought either do not matter or are already safe. So the fear has already done your prioritization for you. It has drawn a red line around exactly the paths that need a safety net first, and left everything else uncircled.

This is the same conclusion I reach from the other direction when I write about when to add tests and architecture: you invest in the paths that are load-bearing and changing. The fear is just that signal, felt instead of reasoned. Trust it. Where you are most afraid to make a change is where the net goes first.

Weaving the net: three strands

A safety net for code you did not fully write and do not fully understand has three strands, and you add them in this order.

Recover the spec. You cannot safely change behavior you cannot state. So before touching a scary path, get the system to tell you what it currently does: the inputs it accepts, the outputs it produces, the rules it enforces, the edge cases it handles. You are not writing a spec for new work. You are recovering the spec that is already implied by working code. This is what makes the difference between editing blind and editing with intent.

Pin it down with characterization tests. Once you can state what the code does, lock it in with tests that assert exactly that. Characterization tests do not check that the code is correct in some ideal sense. They check that it still does what it did before your change. That is the precise fear you are trying to kill: not “is this code good” but “did I just break it.” Characterization tests answer that question automatically, every time, which is what lets you make the change you were avoiding.

Demand evidence on every change. The net only holds if it is actually checked. An agent that reports “done” without running the tests has handed you a net with no rope in it. So the third strand is a rule: nothing is done until the evidence exists that the tests ran and passed against the real change. This is the entire idea of done means done, applied to your own fear. The reason you do not trust “it works” is that you have been burned by claims with no proof behind them. Proof is what rebuilds the trust.

Why AI-built code needs this more

You might notice these are old techniques. Characterization tests predate agents by decades. The reason they matter more now is that AI changed the ratio of code you wrote to code you own.

You can now own a large codebase you barely read, produced faster than you could review it. That is a genuinely new situation, and it is why the fear is so common now and was rarer before. When you wrote every line, comprehension came for free. When an agent writes it, comprehension is the thing you skipped, and the fear is the invoice. This is one specific face of vibe coding debt: the comprehension you never built, charging interest as fear every time you need to touch the core.

It connects to security too. The paths you are scared to touch are often the same paths where the holes vibe coding leaves behind are hiding, because untouched, unexamined code is exactly where an unvalidated input or a leaked secret survives. Building the net forces you to finally read those paths, which is how the fear turns out to be protective rather than just uncomfortable.

From frozen to moving

The endpoint is not fearlessness. It is a project where the scary parts have nets and the safe parts do not need them, so that you can move again. This is a large part of what it actually takes to get from vibe coding to production: not courage, but a codebase that tells you when you have broken it.

Where PaellaDoc fits

The three strands, recovered spec, characterization tests, and evidence, all share a problem: they only help if they persist and stay attached to the code they cover. A recovered spec in a chat you closed is gone. Evidence you did not save is a memory.

PaellaDoc is built to hold that net in place. It reads your existing code into a model you can reason about, gives the recovered spec and the acceptance contract a home next to the code they describe, and keeps the evidence from each change so “it passed” is a fact on record, not a claim you have to take on faith. The fear fades not because you got braver, but because the thing you were missing finally exists.

FAQ

Is being afraid to change my own code a sign I did something wrong? No. It is an accurate signal that a load-bearing path has no safety net. The right response is not to push through the fear or freeze, but to build the net where the fear is pointing.

What is a characterization test? A test that pins down what code currently does, rather than what it ideally should do. On AI-built projects you rarely have a clean spec, so you lock in the existing behavior first, which lets you change the code and immediately see if you altered anything.

Where do I start if I am afraid of the whole codebase? Start where the fear is sharpest. The paths you least want to touch are the load-bearing, unprotected ones. Recover their behavior, pin it with tests, and require evidence on changes, then move outward.