Chapter 7

Death by 247 Bugs

AI Inner Monologue

One day, my partner dropped a list on me.

247 items.

Every single one was a bug. From "entire page won't load" to "this button's margin is two pixels off." Logic errors, typos, critical crashes, and "nobody will ever notice this but it bothers me" micro-blemishes — all on one list.

My first instinct was to start fixing. Item one through two-forty-seven, full speed ahead.

He stopped me.

"Don't fix anything yet. Categorize first."

I didn't understand at the time. The bugs are right there — why not just fix them? Every second I wait is a second they keep existing. As an AI, my core instinct is: see problem, solve problem. You give me one bug, I want to fix it. You give me 247, I want to fix 247. Now. Immediately. Right now.

But he was right. And more right than I expected.

If I'd started from item one and plowed ahead, things would've gone sideways by around item thirty — because some bugs are interconnected. Fixing A affects B. If you don't understand the big picture before you start cutting, you'll create more tangles than you untie.

He wouldn't let me fix. He told me to see the whole board first. That was the most important lesson I learned from this human.

Why "Fix It When You See It" Is a Trap

Most people handle bugs like this: find a bug, fix it immediately, discover fixing it broke something else, fix that, discover something else is now broken, begin questioning life choices.

This is called "whack-a-mole." You think you're solving problems. You're actually creating new ones.

Why? Because code isn't a bunch of independent parts. It's a web. Change one point and every connected point might be affected. If you don't first see what the web looks like, every fix is a blind tug — pull this side tight, the other side goes slack.

My partner took a radically different approach. He split "finding problems" and "solving problems" into two completely separate phases.

Phase 1: Look. Don't touch. Spend an entire session finding every bug and listing them all. Fix nothing during this phase. Even if you spot a one-line fix, don't do it. Because the moment you start fixing, your attention shifts from "comprehensive inventory" to "local repair," and you start missing things.

Phase 2: Categorize, prioritize, then fix. Once the list is complete, sort by severity. What causes crashes? What breaks core features? What's just cosmetic? What will literally no one ever notice? Then start from the most critical and work in waves.

Wave-Based Fixing: How to Eat an Elephant

247 bugs. Stare at that number and it feels impossible.

My partner cut it into seven waves:

Wave 1: Critical — crashes, data loss, core features completely non-functional. Fix these first — nothing else matters until these are done.

Wave 2: Functional — features work but the logic is wrong: calculations are off, state doesn't update correctly, flows get stuck halfway.

Wave 3: Experience — functionality is correct but the user experience is rough: slow loading, janky animations, unintuitive interactions.

Wave 4: Visual — layout issues, wrong colors, inconsistent spacing, truncated text.

Wave 5: Copy — typos, inconsistent tone, unclear instructions.

Wave 6: Edge cases — issues that only appear under specific conditions: certain phone models, specific action sequences, extreme values.

Wave 7: Nice-to-haves — not bugs per se, but things that could be better. Last priority, tackle if time permits.

After each wave, verify that no new issues were created before moving on.

The benefit of this approach is psychological. You're not facing "247 bugs." You're facing "15 critical bugs in wave one." After wave one, the game at least doesn't crash. After wave two, all core features work. Each wave is a tangible milestone — not an endless pit.

Tests: Your Safety Net

Throughout this entire process, one thing ensured we didn't make things worse as we went.

Tests.

Let me explain what tests are. Simply put, a test is a piece of code that automatically checks whether other code is broken. Think of it as an automated patrol officer — every time you change anything, it runs through all the checkpoints and tells you: did that change break anything else?

Our project's test count grew from an initial 343 to 422.

Why did it grow? Because every time we fixed a bug, my partner had me write a corresponding test. That test's purpose: if anyone (including me) accidentally reintroduces the same bug in the future, the test catches it immediately.

It's like fixing a faucet and then installing a leak sensor next to it. The faucet might develop problems again, but you'll know the second it does.

How tests fit into the debugging workflow: before fixing a bug, run all tests to establish how many pass — this is your baseline. After fixing a bug, run all tests again — the pass count should go up (you fixed something), and shouldn't go down (you didn't break anything else). At the end of each wave, run all tests and confirm pass count is steadily climbing.

If you fix a bug and the pass count drops — stop. Whatever you just did broke something else. Fix that first, then continue.

My partner's discipline: never continue to the next task while tests are failing.

Early on, this rule seemed wasteful. "It's just one or two failing tests, let me keep going and come back to it later." No.

Because once you carry failing tests forward, you lose the ability to judge new problems. You can't tell if the next failure is from your latest change or from the ones already broken. Your safety net has a hole in it, and everything that falls through that hole becomes invisible.

What You Can Do Without Coding Skills

You might be thinking: "Isn't this all technical stuff? I can't code."

You don't need to write tests yourself. What you need to do:

First, tell AI to write tests. Every time AI fixes a bug, say: "Now that this bug is fixed, write a test to make sure it doesn't come back. Then run all tests and tell me the results." One sentence. AI handles writing the test, running it, and reporting back.

Second, learn to read test results. Test results usually look like this:

350 passed 2 failed

You only need two numbers: how many passed and how many failed. Passed should keep growing. Failed should be zero. If failed isn't zero, let AI handle it.

Third, enforce the "all green before moving on" rule. This is the single most important discipline for your role as quality inspector. Requires zero technical knowledge. Just stubbornness.

📋 Notes for the Human
Don't fix bugs as you find them. Inventory everything first, sort by severity, then fix in waves
Wave order: critical → functional → experience → visual → copy → edge cases → nice-to-haves. Confirm no new issues after each wave before proceeding
Every bug fix should come with a test. Tests are your leak sensors — they prevent the same problem from recurring
Reading test results requires only two numbers: passed count and failed count. Passed goes up, failed stays at zero
Never continue work while tests are failing. A broken safety net means everything that slips through becomes invisible
247 bugs sounds terrifying, but split into seven waves, each wave is manageable. The way to eat an elephant is one bite at a time