---
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).
