v0-class managed pipelines — Figma import, prompt iteration, PR export — are legitimately fast for the surfaces they fit. The teams that get burned are the ones that never wrote down what the pipeline is allowed to own. This playbook is that contract: which surfaces, which code, which gates, and where the boundary sits.
Tier: Foundation · Workflow area: Design-to-code & design systems · Tools: v0 (Figma import), v0 Git panel, your design system
pb-01 used these tools as throwaway explorers. This playbook covers the other legitimate mode: letting a managed pipeline own real, shipping surfaces — marketing pages, internal tools, low-risk product screens — under an explicit contract. The failure mode isn't using v0 in production; it's using it without deciding what it may own, so its output metastasizes into core product code nobody can maintain.
Write the ownership contract first — one page, agreed, committed. This is the playbook's deliverable; everything else is mechanics:
V0 PIPELINE CONTRACT — acme-web, agreed 2026-08-05
MAY OWN (v0 is source of truth; edit via v0, export via Git panel):
- /marketing/** pages, /internal/tools/** dashboards
- Presentational components under src/v0/** only
MAY NEVER OWN:
- Anything under src/features/** (product code)
- Auth, payments, data mutations beyond form-post to existing APIs
- Shared primitives (@acme/ui) — v0 CONSUMES these, never redefines
BOUNDARY MECHANICS:
- v0 output lands in src/v0/** via PR only, never direct push
- Graduating a surface out of src/v0/** = rewrite PR onto @acme/ui
with tests (the pb-01 re-implementation rule applies)
GATES (same as human code, no exemptions):
- typecheck, lint, axe scan, Lighthouse >= 90 perf on marketing pages
OWNER: web-platform team. Review quarterly.
Bind v0 to your design system before the first real surface. In v0's project settings, wire your registry/theme so generation starts on-system: point it at your published shadcn-style registry (pb-03), or at minimum upload your tokens (Tailwind config) and forbid its defaults in the project system prompt:
Project rules: use the @acme registry components for all primitives
(Button, Card, Input, Badge). Tailwind config is attached — use its
semantic color and spacing tokens only. Never use default shadcn
colors, never invent gradient heroes, follow src/v0/CONVENTIONS.md.
Import the Figma frame and iterate by prompt — in v0, not in the repo. Paste the Figma frame link into v0 (or use the Figma import), then iterate conversationally: Tighten the pricing tier cards to match the frame — 24px internal padding, align CTAs to the card bottom. Add the FAQ accordion below, collapsed by default, first item open. The discipline: while a surface is v0-owned, all edits go through v0. Hand-editing exported files forks the source of truth — the classic pipeline failure.
Export through the Git panel into the boundary directory. Connect the repo in v0's Git panel and export as a PR targeting src/v0/marketing-pricing/. Then run the same gates as any PR:
npx tsc --noEmit && npx eslint src/v0/marketing-pricing
npx playwright test e2e/pricing.smoke.spec.ts
npx lighthouse http://localhost:3000/pricing \
--only-categories=performance,accessibility --quiet
Review the PR for boundary violations specifically: no imports from src/v0/** into src/features/**, no redefined primitives, no secret env usage. An ESLint no-restricted-imports rule makes the first check automatic:
{ "no-restricted-imports": ["error", { "patterns": [
{ "group": ["**/v0/**"], "message": "Product code may not import v0-owned surfaces" }
] }] }
Run the fidelity and review loops like any AI output. The managed pipeline doesn't exempt the result: multimodal fidelity diff against the Figma frame (pb-11), provenance checklist on the PR (pb-28), axe scan in CI. A good exported surface passes all three with at most minor findings — if it repeatedly can't, that surface class belongs on the "may never own" list.
Graduate or retire deliberately. Quarterly, per the contract review: surfaces that grew product logic get rewritten onto the design system and moved out of src/v0/** (a scheduled, budgeted rewrite — not a panic); dead campaign pages get deleted. The boundary directory should trend toward small.
The single most expensive v0-pipeline mistake is silent hand-editing of exported code. The moment a human patches src/v0/** directly, the v0 project and the repo diverge — the next export tramples the patch, and nobody knows which version is real. Enforce "edit in v0 or graduate it out" in review, with the contract as the citable rule.
git log src/v0/ for direct-push commits (there should be none).v0-class pipelines are safe exactly as far as the boundary you write down: peripheral surfaces in, contract-gated PRs through, product logic never. The tool isn't the risk — the undocumented ownership is.