--- id: platform-retrofit prd: docs/work/prds/platform-retrofit.prd.md title: Platform retrofit — repurpose template-vertical as the Veect monorepo type: epic status: in-progress features: [ blog, media, marketing-pages, navigation, web-tanstack, web-next, core-events, core-realtime, ] created: 2026-07-12T10:22:00Z updated: 2026-07-12T11:16:19.512Z --- ## Goal Turn the `template-vertical` starter into a clean, truthful Veect monorepo: commit the product spec under `docs/product/`, delete the four demo content features and `apps/web-tanstack`, reduce `apps/web-next` to a compiling auth shell, scaffold `core-events` + `core-realtime`, archive the shipped template work, move release-please to a single root version, pre-approve the editor's library traces, and rewrite CLAUDE.md/AGENTS.md for Veect — with every conformance gate green on every slice. ## Why Three concrete pains (PRD): dispatch agents in worktrees cannot read the untracked `.proto/` spec bundle; `pnpm work status`, CLAUDE.md/AGENTS.md, and release-please all describe a blog/CMS starter that no longer reflects the product; and the demo features occupy the workspace, router/CMS composition, and versioning config that the Veect features (workspaces, projects, design-doc, discovery, ai) need. ADR-027/028/029 are the decision baseline; this epic implements their repo-level consequences only. ## Baseline gate waiver (founder-approved 2026-07-12) The template snapshot's baseline (single squashed initial commit — CI never ran on it) is broken in two ways discovered by the first dispatched slice and verified by the orchestrator: 1. **`pnpm lint` aborts at turbo task-graph construction** — committed package cycle `core-trpc → core-api → {blog, navigation, marketing-pages} → core-trpc` with `lint.dependsOn: ["^lint"]`. No ESLint rule ever runs. **Waived for this epic's commits until story 03's final deletion slice lands** — deleting the three demo features removes the only edges closing the cycle (`auth` has no `core-trpc` dependency), so the waiver expires there and `pnpm lint` becomes mandatory again. 2. **The L0 full-coverage run fails** — 9 packages lack `@vitest/coverage-v8`, and the documented invocation doesn't parse under turbo. **Waived until story 00 lands** (the repair story). All other gates (`typecheck`, `test`, `conformance`, `fallow:audit`, `coverage:diff`, `coverage:aggregate`) remain mandatory on every slice — no exceptions. ## Stories - [ ] [00 — Baseline repair: L0 coverage tooling and documented command](00-baseline-repair/_story.md) - [ ] [01 — Commit the product spec and design references under docs/product/](01-commit-product-docs/_story.md) - [ ] [02 — Rewrite release-please to a single root product version](02-single-version-release-please/_story.md) - [ ] [03 — Delete web-tanstack and the four demo content features](03-delete-demo-apps-and-features/_story.md) - [ ] [04 — Reduce web-next to an auth shell with a boot smoke assertion](04-web-next-shell/_story.md) - [ ] [05 — Scaffold core-events and core-realtime](05-scaffold-optional-cores/_story.md) - [ ] [06 — Archive the shipped template work tree](06-archive-template-work/_story.md) - [ ] [07 — Library traces for @xyflow/react and zustand](07-editor-library-traces/_story.md) - [ ] [08 — Rewrite CLAUDE.md and AGENTS.md for Veect](08-rewrite-agent-docs/_story.md) ## Out of scope (from PRD) - Any new Veect feature code (walking-skeleton PRD and successors). - The landing page (`polish-playground-landing` PRD). - Generator retargeting beyond what deletions force — the feature generator's Payload+tRPC shape is correct for Veect's control plane (ADR-027 §5) and stays as-is. - Runner infrastructure, Docker images, fixtures; billing, GitHub App, self-host distribution (deferred per ADR-027).