Vibe coding has a shelf life
Type a vague idea into an agent and it will happily produce a thousand lines by lunch. That feels like speed, but it isn't shipped software, it's a pile of guesses waiting to be sorted. An agent given a vibe instead of a blueprint will fill in every gap you didn't specify, and it fills it with whatever seems plausible, not what you meant. The fix isn't writing less code yourself, it's writing a clearer instruction before any code exists. Since the code is cheap to regenerate, there's no reason to be precious about it. The spec is the thing worth protecting.
Write the spec like you're arguing with yourself
A real spec isn't a paragraph, it's three things: the why behind the ask, what good looks like, and what's explicitly wrong, including the edge cases. State the background first so the agent isn't just pattern matching, it's reasoning toward your actual goal. Then describe outcomes as scenarios: given this state, when this happens, then this should be true. That structure is boring on purpose. It removes the ambiguity that turns a fast agent into a confidently wrong one.
- "Add a login page"
- No mention of edge cases
- No reason given for the ask
- Agent fills gaps with guesses
- Given/when/then scenarios
- States what should fail and why
- Explains the goal behind the feature
- Agent has nothing left to guess
Give it boundaries before you give it a login
The same looseness that produces broken code produces worse outcomes once an agent can act on real systems, not just write files. An agent that can click, send, or deploy without a person checking first will do exactly what it's told with whatever data is closest at hand, including things it should never touch. That isn't a hypothetical, it's the default behavior of any system optimizing for a goal with no one watching. So draw the line before you hand over access: anything with real consequences, sending, deploying, spending, needs an explicit human checkpoint, or the agent shouldn't be able to reach it at all.