Vibe coding
Fast exploration through prompts, examples, and iteration. Good for discovery, risky for commitments.
Vibe coding can be useful for exploration. It becomes risky when the same vague prompt is used for production changes. Spec coding keeps the creative pass, but adds boundaries before implementation.
Fast exploration through prompts, examples, and iteration. Good for discovery, risky for commitments.
Implementation starts after scope, criteria, non-goals, and evidence are written down.
Use vibe coding to explore options, then convert the chosen direction into a spec before production code.
The problem is not experimentation. The problem is letting a model convert an ambiguous wish into production behavior without a reviewable contract.
Spec coding does not remove speed. It moves the slow questions earlier: what counts as done, what is out of scope, and what evidence will prove the result.
Use this when a request sounds clear in conversation but still leaves the AI room to invent behavior.
# Vibe Request To Spec Vague request: - Clarifying questions: - Who is affected? - What exact behavior changes? - What must not change? - Which failure or permission path matters? - What evidence proves it? Spec version: ## Outcome - ## Scope - In: - Out: ## Acceptance Criteria - [ ] Given ..., when ..., then ... - [ ] Failure path: - [ ] Boundary path: ## Evidence - Test: - Manual check: - Changed files: Do not generate production code until this is testable.
The same request becomes much safer when it stops asking for a vibe and starts naming behavior.
Vague: - Make checkout feel more reliable. Spec: ## Outcome - Show a recoverable error when payment authorization times out. ## Scope - In: payment submit handler, checkout error banner, payment tests - Out: provider client API, database schema, order confirmation page ## Acceptance Criteria - [ ] Given payment authorization times out, when the user submits checkout, then the page shows "Payment is taking longer than expected" and keeps the order pending. - [ ] Given the user retries after timeout, when the provider succeeds, then the order moves to paid once. - [ ] Given the provider returns card_declined, when checkout submits, then no retry banner is shown. ## Evidence - npm test -- checkout-payment - Screenshot: timeout banner state
The useful pattern is not vibe coding versus spec coding forever. The useful pattern is timing. Explore loosely while the work is still a question, then switch to a spec the moment the output will affect production behavior, shared contracts, user data, money, permissions, or review responsibility.
Vague prompts are fine when you are comparing options, sketching copy, exploring UI states, or asking an agent to explain possible approaches. At this stage, the output is material for thinking, not a decision that should be merged.
Once you choose a direction, write the outcome, non-goals, scope, acceptance criteria, and evidence. This turns the creative exploration into a reviewable agreement. The coding agent should implement the agreement, not continue discovering product behavior through the diff.
If the generated implementation suggests extra fields, new states, dependency changes, or a cleaner architecture, do not immediately merge the idea. Capture it as a follow-up spec or update the current spec before another generation pass.
Vibe Coding vs Spec Coding is not just a prompt for an AI tool. It should help people decide whether the task is ready for implementation, who owns unresolved questions, and which evidence will remain with the pull request. Use these questions in team conventions, PR templates, or pre-implementation review.
Before using Vibe Coding vs Spec Coding, name the person or role allowed to approve scope changes. Open questions without an owner become an invitation for the agent to fill gaps, and they make reviewers discover product, data, or permission decisions only after the code exists.
Separate questions that must be answered from questions that can move forward as accepted risk. Blocking items usually include public APIs, data migrations, permission boundaries, payment behavior, rollback paths, and user-facing copy. If these are unclear, do not ask an agent to generate production code yet.
The final pull request should link vibe-to-spec.md, list changed files, name skipped checks, and map tests, screenshots, logs, or metrics back to acceptance criteria. Without that record, future readers have to reverse-engineer the decision from the diff.
The prompt invites iteration but never defines what done means.
The model invents copy, states, retries, or error behavior that nobody approved.
Reviewers learn the scope only after code has already been generated.
Use the comparison to choose the right next artifact.
Convert a vague request into a bounded AI coding packet.
Open generatorTurn the selected direction into pass/fail behavior.
Write criteriaCommit the final decision as a durable source of truth.
Copy spec.mdNo. It is useful for exploration. It becomes risky when vague prompts directly change production behavior.
It adds a short upfront step, but usually reduces rewrite time because success and evidence are defined before code exists.
Switch when the work touches production behavior, data, APIs, permissions, payments, background jobs, or shared helpers.
Explore freely, then write the spec before the generated code becomes a product decision.
Convert a prompt