1 April 2026 , Blackgate
Vibe coding is shorthand for building while you figure it out - tight loops with an AI assistant or a small team, sketching in code, refactoring when the shape emerges. Spec-first delivery starts from a written definition of behaviour, edge cases, integrations, and acceptance before implementation gets serious. Neither is universally right; client work usually punishes whichever one you take to an extreme.
This is distinct from “should we use AI” (covered at a high level in our note on practical AI adoption). Here the question is process: how much structure you lock in before you ship.
What each approach optimises for
Vibe-style exploration optimises for learning speed when the problem or the UI is still fuzzy. You discover constraints by touching them - data shape, third-party APIs, what the client actually reacts to in a prototype. The cost is direction drift: without guardrails you can paint yourself into a corner, duplicate half the domain model, or demo something that cannot be hardened in budget.
Spec-first optimises for predictability - shared understanding, estimates, QA against written acceptance, fewer “I thought you meant…” moments after the fact. The cost is false certainty: long specs based on guesses age badly, and you can spend weeks documenting something you could have invalidated in days with a spike.
When vibe-heavy delivery tends to work
Vibe-style work shines when the question is not yet “build v1.0” but “is this direction worth the next month?” You are buying learning with code, and you have agreed in advance what “enough to decide” looks like.
- Discovery and prototyping - disposable code, narrow scope, a clear throwaway or “promote to real” decision after a timebox.
- Ambiguous product shape - the client knows the audience and rough goals but not the interaction model; you need something on-screen to react to.
- Fast feedback from a single decider - someone who can review weekly (or faster) and owns trade-offs; exploration dies when feedback queues sit for a sprint.
- Low blast radius - internal tools, marketing microsites with modest integration, experiments where downtime or rework is acceptable.
When spec-first (or spec-heavy) tends to work
Here the cost of a wrong assumption is not “we refactor the screen”—it is “we renegotiate a contract, notify regulators, or roll back money.” The spec is less about waterfall ceremony and more about shared testability: everyone knows what “wrong” means before you wire it in production.
- Integrations, payments, privacy, or regulated domains - mistakes are expensive; behaviours need to be agreed and testable.
- Many stakeholders with different KPIs - a spec (or a thin BRD plus acceptance criteria) is a negotiation artefact, not just a dev convenience.
- Fixed price or hard deadline - you need a boundary on “done” that everyone signed; open-ended exploration without change control burns margin.
- Handoff and maintenance - another team (or the client’s in-house devs) needs to own the system; implicit knowledge from a vibe session does not travel in a repo alone.
The regrets to watch for
From under-spec’d exploration
- Rewrites triggered by “we didn’t know we needed that integration.”
- Demo-optimised shortcuts that become production paths.
- Invisible coupling to one person’s mental model of the codebase.
From over-spec’d gates
- Documenting fantasy features instead of de-risking unknowns with spikes.
- Analysis paralysis while competitors ship a rougher but real v1.
- Specs that nobody maintains once building starts - stale truth is worse than little truth.
A practical hybrid most teams can defend
You can get most of the upside with less regret by timeboxing exploration, then freezing a thin vertical slice as the contract for the next phase:
- Spike or prototype with a written goal (“prove we can sync X to Y and render Z in under 200ms”) - not an open-ended vibe.
- Capture decisions - data model sketch, integration assumptions, out-of-scope list, environments, who approves UAT.
- Build production increments against that slice; significant changes go through an explicit change note so scope and estimate stay honest.
That is not bureaucracy for its own sake; it is how you keep exploration from silently becoming the production plan.
Client collaboration without melted scope
Vibe coding needs continuous but bounded client involvement: what you are deciding this week, what is deferred, what would trigger a formal change. Spec-first needs early alignment on success criteria and mid-flight checkpoints - not radio silence until UAT.
Whichever mode you lean on, document what you actually built - runbooks, env vars, deployment steps, and “known limitations.” Agencies burn trust when exploration stays fun for the build team and opaque for whoever operates the thing next month.
Frequently asked questions
What is vibe coding?
An exploratory style of building: implement, try, adjust, often with tight tool-assisted loops, instead of locking every behaviour in a document before coding.
What is spec-first delivery?
Defining requirements, interfaces, and acceptance criteria up front (at least for the phase in scope), then implementing against that definition with controlled change management.
When should I use vibe coding?
When you need to reduce uncertainty quickly, the client can review often, and the cost of throwing work away is acceptable.
When is spec-first more appropriate?
When risk, compliance, integrations, or fixed commercial terms mean you need an agreed definition of done before you invest in implementation.
Can you combine both?
Yes - common pattern is timeboxed discovery in code, then written scope for productionisation, with explicit change control after that.