Files
agentic-dev/docs/product/design-app-prd.md
Danijel Martinek 4d1d53432e docs(product): commit Veect product spec bundle under docs/product/
Sandcastle implementers run in git worktrees that contain only committed
files, so every PRD referencing the spec was unreadable to dispatch
agents while the bundle sat untracked in .proto/. The eight spec
documents are copied verbatim (filenames preserved) from
.proto/veect-product-docs/ and become the canonical source.

The stray veect-product-docs.zip at the repo root was already removed
before this change — that half of the task is a verified no-op.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016j8z4VHjedXDTjEDNg7qHK
2026-07-12 13:15:26 +02:00

206 lines
22 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# PRD — Veect MVP · v2
> **⚡ v3 PIVOT NOTE (2026-07-10, updated for spec rev 1.2) — read first.** Distribution pivoted from cloud SaaS to **repo-native**, delivered as a **standalone app + Docker image**: connect a remote repo (GitHub/git URL) or local checkout; `veect.config.json` points at component folders; git worktree per design project (app-managed, repo untouched); SQLite + JSON-in-branch persistence; **Publish** pushes `veect/<slug>` for an ordinary PR. The npm-in-repo package is a later distribution. **Prototype note:** the built editor's multi-view frames (desktop/tablet/mobile clusters) supersede F3's "desktop breakpoint only," and its two-way code grammar supersedes F5's read-only code view — see `veect-design-spec-current.md` + `veect-ui-gap-spec.md`. **`veect-technical-spec.md` is now the authoritative build document.** Superseded here: F1 (token-file import → tokens read from the repo), F2's mapping half (components are the repo's real ones by construction), F7's zip export (output = commits on a branch), F8 (auth/cloud). Still authoritative here: the wedge, personas, JTBD, F3F6 canvas/AI/preview behavior, F9 craft layer, §8 out-of-scope discipline, §13 validation gate (V1 concierge-PR test now runs _through the tool's own output_), and all Given/When/Then that concern editor behavior.
_Founder OS · Phase 6 (MVP Definition) · 2026-07-09_
_Companion docs: `company-context.md` (strategy) · `design-brief-veect.md` (UI/UX)_
_v2 changes (from adversarial product review + Impeccable integration): **real-component mapping pulled into MVP** (the wedge depended on it); **Impeccable craft/Polish layer added** (F9); validation gate **sequenced with kill criteria**; trust metric moved to **engineer-observed merge behavior**; scope trims (share link, frame-linking, full authoring → deferred)._
_Tags: 🟢 verified · 🟡 reasoned · 🔴 assumed / needs validation_
---
## 1. Problem & why now
Product designers with an existing design system can't ship on-brand UI without engineering, and AI tools (v0, Lovable, Bolt, Figma Make) generate **generic, throwaway** code that ignores their tokens and components. Veect makes the design system the source of truth — a canvas where everything you compose is **real React built from your own components** — and holds output to a **craft standard (Impeccable)** so it's on-brand _and_ genuinely good, not slop. (Evidence in `company-context.md`.)
## 2. Goals & non-goals
**Goals (MVP)**
- Prove the core bet: **your design system in → on-brand, high-craft, production React out, from a visual canvas.**
- Get a designer from "bring my system" to "export a screen's real code" in **one sitting (<20 min)** 🟡.
- Clear the trust bar: an engineer would **merge** the output (import their real components, pass review), not rewrite it 🟢. _This is the bar the whole wedge rests on._
**Non-goals (MVP)**
- Not a full-app/backend builder (Lovable/Bolt's lane) — Veect is **UI + prototypes**.
- Not a Figma replacement or vector-illustration tool.
- Not multi-framework, not real-time multiplayer, not repo round-trip, not a component-authoring studio (all deferred; §8).
## 3. Success metrics
| Metric | Definition | MVP target |
| ---------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------- |
| **North Star** | Weekly shipped screens (code exported & used), proxied by an explicit **"mark as shipped"** + design-partner check-ins (no repo integration yet) | trend up 🟡 |
| **Trust bar (primary, engineer-judged)** | Real PRs opened at design partners: **merge rate**, **% LOC changed pre-merge**, structural-vs-nit review comments | ≥60% merged with <10% LOC changed 🔴 |
| **Wedge-usage** | % of exported screens composed _majority_ from the user's **mapped/real** components (not stock base kit) | 50% floor 🔴 |
| **Activation** | First screen composed from own system **and exported** | 40% of signups 🔴 |
| **Time-to-first-value** | Signup first exported on-brand screen | <20 min median 🔴 |
| **Craft** | Open Polish issues per exported screen | trend 0 🟡 |
| **Guardrail** | Canvas interaction latency | <16 ms/frame on a 50-node screen (node = one rendered element instance) 🟡 |
## 4. Target users
- **P1 "Maya," product designer** (primary): has a design system, ships React, blocked on eng, burned by generic AI output. Often does **not** own a clean token file (it lives in Figma/repo).
- **P2 "Devon," design-systems / design-engineer lead** (champion + gatekeeper): owns the **real coded component library**; cares that output imports _their_ components and passes review. Holds the merge veto.
## 5. Core value & the "aha"
_"I typed a screen, it came out in MY components and MY tokens, it's genuinely well-designed, and the code imports our real library."_ Four trust beats: my system re-themes the tool the canvas renders the **real** component **Polish** makes it craft-grade export imports our **real** components.
## 6. MVP — the core loop
```
1. Bring your system → 2. Map to your real components → 3. Compose on canvas
tokens·fonts·assets (Devon; optional if no coded lib) real components
(file OR 5-token path) ↓
↑ 4. AI compose (constrained)
└──────────── 7. Export (imports your real code) ← 6. Polish (craft) ← 5. Preview
```
## 7. In scope (MVP) — each traced to the wedge
| # | Capability | MVP boundary | Traces to |
| ------ | -------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------- |
| F1 | **Design-system import** | Tailwind config **or** paste CSS variables **or** Figma Variables (if available); **no-file path: set 5 core tokens** over the base kit. Upload fonts (woff2) + assets. One source of truth. | Whole wedge; Maya's real input path |
| F2 | **Component library + mapping** | Tokenized **base kit** (~15 components, **semantic HTML + ARIA**). **Map base-kit components → the team's real components** (import path + prop names) so export references their library. Save composed **patterns**. _(Full variant/prop authoring deferred.)_ | Wedge-critical: clears the merge bar; JTBD #2 |
| F3 | **Canvas / composer** | Frames, drag/drop, **auto-layout** stacks (dir/gap/padding = tokens), props, token binding, undo/redo, keyboard-first. **Desktop breakpoint**; layout model responsive-ready. | Figma-like half; flow |
| F4 | **AI compose (constrained)** | Prompt assembles **only** from mapped/base components + tokens; **propose→accept** (staged ghost layer); shows provenance; **graceful refusal** (offers to compose from primitives w/ token binding + save) never emits non-system markup. | The differentiator; JTBD #4 |
| F5 | **Real code output** | Clean **React + Tailwind**; **imports the user's mapped components** (not inlined clones); tokens as CSS vars/Tailwind theme; Prettier; deterministic (same tree same code). | The trust bar; JTBD #1 |
| F6 | **Live preview** | Same runtime as canvas/export renders the **real** components; breakpoint switch; **real hover/focus/active states**. _(No frame-to-frame linking — see §8.)_ | Kills "dead document"; JTBD #1 |
| F7 | **Export / handoff** | Copy component code; **download runnable project (.zip)** wired to tokens + real component imports. _(Share link deferred.)_ | Activation; North Star |
| F8 | **Auth / projects** | Projects, autosave, single-player. **Manual provisioning acceptable** for a ~10-team design-partner MVP. | Table stakes |
| **F9** | **Craft / Polish layer (Impeccable)** | Generated & composed output adheres to a **craft ruleset**; a **Polish** action critiques the screen (spacing, hierarchy, type, contrast, alignment, states), proposes **one-click fixes in your tokens/components**, and **explains why** (teach). | On-brand **and** high-craft = anti-slop; new user ask |
| F10 | _(fast-follow)_ **Pluggable standard** | Choose craft standard: Veect default / **Impeccable** / custom. | Extends F9; deepens moat |
## 8. Explicitly OUT of scope (the load-bearing section) — deferred
> Rule: _"Does the core value — on-brand, high-craft real code from a visual canvas — survive without it?"_ If yes → cut.
- **Full component-authoring studio** (variant/prop/slot editor). MVP = base kit + **mapping** + pattern-save; authoring recreates Subframe and risks a third source of truth. fast-follow
- **Real-time multiplayer.** Single-player + (later) share link. v2
- **Repo round-trip / two-way Git sync.** The dream; not needed to prove value. Export-only. v2
- **Share/read-only preview link.** Copy+zip is the activation event; link is virality, not the bet. fast-follow
- **Frame-to-frame prototyping / interaction linking.** Figma-parity creep; conflicts with "not a Figma replacement." Real component states come free. v2
- **Figma file (layout) import.** Fidelity rabbit hole (v0/Anima's failure). Tokens/Variables yes; layouts no. v2
- **Multiple frameworks** (Vue/Svelte/SwiftUI/HTML). React+Tailwind only. later
- **Full vector/illustration tools.** Composer, not illustrator. out of lane
- **Backend / data / auth-in-app / business logic.** Out of Lovable/Bolt's lane. out of lane
- **Second breakpoint (mobile).** Desktop MVP; model responsive-ready. near-term follow
- **Design-token governance/versioning, multi-brand; plugins/marketplace; comments/redline.** v2
## 9. User stories & acceptance criteria (Given/When/Then)
**US-1 — Bring my system (incl. no-file path)**
- **Given** a Tailwind config / pasted CSS vars / Figma Variables, **when** I import, **then** tokens parse and the base kit re-themes within ~3s.
- **Given** I have no token file, **when** I choose the 5-token path, **then** I set brand/neutral/radius/font/spacing and the kit re-themes live **no dead end**.
- **Given** an invalid file, **when** I import, **then** I get a line-referenced error with manual mapping.
**US-2 — Map to my real components**
- **Given** a coded component library, **when** I map "Veect Button" `@/components/ui/Button` and its props, **then** the code preview shows the exact real import, and canvas instances render as that mapped component.
- **Given** unmapped components on a screen, **when** I export, **then** I'm warned which will fall back to Veect defaults, and offered to map them.
**US-3 — AI compose, constrained**
- **Given** an imported system, **when** I prompt "pricing, three tiers," **then** the result uses **only** my mapped/base components + tokens, staged as a ghost layer to **accept/discard**, listing components used.
- **Given** the AI can't map a need, **when** it hits it, **then** it **says so** and offers to compose from primitives (with token binding + save) **it does not inject generic markup**. **AC:** across a 100-prompt eval, **0 unregistered elements** in output. 🟢 (differentiator integrity)
**US-4 — Trust the code (engineer-judged)**
- **Given** a composed screen, **when** Devon opens the code, **then** it **imports our real components** (not re-declared inline), references token vars, is Prettier-clean, `tsc`+`eslint` clean.
- **Given** an exported zip, **when** run (`npm i && npm run dev`), **then** it renders identically to preview (shared runtime).
**US-5 — Prototype**
- **Given** a screen, **when** I preview, **then** real hover/focus/active states work at the desktop breakpoint. _(No click-through linking in MVP.)_
**US-6 — Keep system in lockstep** _(new)_
- **Given** updated tokens, **when** I re-import, **then** I see a **diff + impact** ("affects 14 components / 3 screens") and can **apply with undo**; bindings are preserved; nothing silently breaks.
**US-7 — Polish to craft standard** _(new — Impeccable)_
- **Given** a composed screen, **when** I run **Polish**, **then** I get a ranked list of craft issues (off-scale spacing, weak hierarchy, contrast fail, misalignment, missing state), each with a **why** and a **one-click fix expressed in my tokens/components**.
- **Given** a clean screen, **when** I Polish, **then** it says "Impeccable. Nothing to fix." (earned, not flattery).
## 10. Low-fi wireframes
_See `design-brief-veect.md` §9 for full screens + states. Editor spine:_
```
Top: Project ▾ · [Desktop] · ⟳Preview · ✧Polish · </>Code · ⇪Export
Left: Pages/Layers · Library(map/patterns) · Tokens
Center: Canvas + ✦ AI bar Right: Inspector (props·tokens·layout) / Polish issues
Companion: Code panel — imports { Button, Card } from "@/components/ui"
```
## 11. Functional requirements
- FR-1 Parse Tailwind + CSS-vars + Figma Variables tokens; 5-token quick path; font/asset upload+storage; contrast check at import.
- FR-2 Base kit (~15, semantic + ARIA) bound to tokens; **component-mapping registry** (Veect component real import path + prop map); pattern save.
- FR-3 Canvas engine: frames, drag/drop, auto-layout, token-bound props, desktop breakpoint (responsive-ready model), undo/redo, shortcuts, autosave+offline/conflict handling.
- FR-4 AI compose constrained to the project registry; proposeaccept staging; provenance; graceful-refusal path; 0-unregistered-elements guarantee.
- FR-5 Codegen: tree React+Tailwind, **imports mapped components**, tokens as vars, Prettier, deterministic; export = runnable zip.
- FR-6 Single shared component runtime for canvas/preview/export; breakpoint switch; real interaction states.
- FR-7 **Polish engine (F9):** evaluate a screen against the craft ruleset; produce ranked, explained, auto-fixable issues expressed in tokens/components.
- FR-8 Token re-import: diff, impact analysis, safe apply+undo.
- FR-9 Auth/projects/autosave (manual provisioning acceptable for partner MVP).
## 12. Non-functional requirements
- **Performance:** <16ms/frame canvas on a 50-node screen; AI first paint <2s; Polish scan <2s on a typical screen. 🟡
- **Fidelity (corrected):** state the **shared-runtime invariant** (preview == export by construction) as the guarantee; **golden-file visual tests on real user-composed screens** with **pinned browser + fonts** (not base-kit-only). Target 98% match. 🟡
- **Code quality:** exported project passes `tsc`+`eslint`; imports resolve against the mapped library; **semantic HTML/ARIA** in base kit.
- **Security/privacy:** per-project isolation; assets/fonts scoped to project; **no training on user systems (absolute for MVP)**; SOC2 path noted (not MVP). 🟢 (eng/security veto)
- **Accessibility (tool):** WCAG 2.2 AA for Veect's UI; keyboard-operable canvas.
- **Browsers:** latest Chrome/Edge/Safari/Firefox; desktop-first.
- **Reliability:** autosave 5s; no lost work on refresh; offline read-only + reconnect.
## 13. Validation plan & gate (sequenced — review fix)
> The MVP is a **bet to validate**, not a green light. Run these **before/at the start of build**, with pre-registered kill criteria. Only the token-engine + shared-runtime spike may run concurrently.
| # | Experiment | Tests | Pass / Kill threshold |
| --- | ---------------------------------------------------------------------------------------------------------------- | ----------------------------------- | ---------------------------------------------------------------------------------------------- |
| V1 | **Concierge real-PRs:** hand-build 5 partners' screens from their systems, open **real PRs** against their repos | A1 + the trust bar (right judge) | **Pass** 3/5 merged with <10% LOC changed; **Kill/rethink** if <2/5 or reviews are structural |
| V2 | **Clickable-mock task test** (Figma prototype of the editor), 5 designers | A2 (will they work in a new canvas) | **Pass** 4/5 complete the core task unaided |
| V3 | **Fake-door demo** ("your system on-brand screen real code") vs. a v0-style generic control | Desirability / positioning | **Pass** waitlist conversion 2× control |
| V4 | **Subframe/competitor teardown** (owed from Phase 2) | A4 (is the wedge unowned) | Decision input; no code needed |
| V5 | **10 problem interviews** with design-system leads | A1 + A3 (tooling vs governance) | Qualitative gate |
## 14. Key risks & mitigations
| Risk | L/I | Mitigation |
| ----------------------------------------------------- | ------ | ----------------------------------------------------------------------------- |
| 🔴 Designers want the _outcome_, not to own code (A1) | M/High | V1 + V3 before heavy build; position as "export & hand to dev," code as proof |
| Output doesn't clear the merge bar (imports/clean) | M/High | Mapping in MVP; shared runtime; golden-file tests; V1 is the direct test |
| AI "fails open" to generic markup | M/High | Registry-only codegen; explicit refusal path; 0-unregistered eval |
| Won't displace Figma (A2) | H/Med | Position per-phase (coexist); V2 before canvas build |
| Subframe/incumbents own it first (A4) | M/Med | V4 teardown; sharpen system+craft wedge; Impeccable moat |
| Scope creep to "app builder" | H/Med | §8 is load-bearing; guard it |
| Impeccable rules not literally matched | L/Med | Reconcile with real ruleset / embed the Impeccable skill (F10) |
## 15. Open questions
- Import a **coded** library at MVP (mapping assumes one exists) vs. base-kit-only for library-less teams? (Support both; mapping is first-class.) 🟡
- Token source of truth first: Tailwind vs Figma Variables vs CSS vars? (Recommend Tailwind + CSS-vars, Figma Variables if API allows.) 🟡
- **Embed the Impeccable skill directly, or ship a compatible ruleset?** (F10 decision.) 🔴
- Promise "shippable" or "starting-point" code? (Fidelity labeling.) 🔴
## 16. Build sequence (trust path first)
0. **Validation gate (§13)** V1/V4 need no product code; start immediately.
1. **Component runtime + token engine** (base kit re-themes from tokens) the spine.
2. **Component mapping registry** (Veect real imports) the merge bar.
3. **Canvas compose + inspector** on that runtime.
4. **Codegen + export** (make the trust bar real early).
5. **AI compose, constrained** (proposeaccept, refusal).
6. **Polish engine (Impeccable)** + **token re-import**.
7. **Preview + auth/projects** hardening.
## Exit gate (Phase 6)
Scope is defensibly minimal every §7 item traces to the wedge/North Star, §8 removes the rest, and the wedge-critical **mapping** and **craft** capabilities are now in. **Phase 1's gate remains uncleared (🔴 A1A4):** treat this as the spec for a bet, and run §13 with its kill criteria before committing the full build.