There is a particular kind of project that never gets finished — not because it's too hard, but because the builder keeps restarting it. A new framework comes out. A better approach occurs to them at 2am. The old code starts to feel embarrassing.
Every restart resets the one thing you can't buy back: domain-specific momentum. The second time you build something you move faster — not because you're smarter, but because the shape of the problem is already in your head.
// the real compounding curve
const value = completions ** 2 - restarts * 0.8
Shipping something imperfect is a skill. It requires ignoring the gap between what you built and what you imagined, at least temporarily.
The gap between what you built and what you imagined never fully closes. The question is whether you can tolerate it long enough to get to done.
Different people have different thresholds. Some ship too early, some never ship. The goal is to calibrate yours over time — not to eliminate the discomfort, but to stop letting it make the decision for you.
Pick a definition of done before you start. Write it down. When you feel the urge to restart, read it. If what you've built satisfies it, ship.