This version has breaking changes — APIs, conventions, and file structure may all differ from your training data. Read the relevant guide in node_modules/next/dist/docs/ before writing any code. Heed deprecation notices.
- Always import the wrapper
<Link>fromapp/_components/link.tsx. Never importnext/linkdirectly outside that file. The wrapper handlesonMouseDownnavigation, hover prefetch, and per-route image manifest warmup. Bypassing it loses the perf wins. - Suspense fallbacks must reserve layout space with explicit pixel heights (e.g.
h-[20px]). Streaming content into a zero-height fallback causes CLS. - Mutations are Server Actions, not API routes. Use
updateTagfor same-request invalidation,revalidateTagfor background. - Cache Components is enabled. Don't use
export const revalidate,export const dynamic, orunstable_cache— use'use cache'+cacheLife()+cacheTag()instead. Seenode_modules/next/dist/docs/01-app/03-api-reference/05-config/01-next-config-js/cacheComponents.md. - The card browser (
app/_components/builder/card-browser/) has pluggable data sources selected viasource-picker.tsx(scryfall= local DB browse;edhrec= commander suggestions). Each source feeds the sharedBrowserStatefrom its own hook, but every result is aCardSearchResultso the add-to-deck flow is source-agnostic. External sources must be fetched server-side behind a rate-limited route with a timeout (seelib/edhrec/recommendations.ts+app/api/cards/edhrec/route.ts) and map names→cards viafindCardsByNames— never block the UI on the upstream call.
Issues live as markdown files under .scratch/<feature-slug>/. See docs/agents/issue-tracker.md.
Five canonical roles (needs-triage, needs-info, ready-for-agent, ready-for-human, wontfix) — defaults, no remap. See docs/agents/triage-labels.md.
Single-context: CONTEXT.md + docs/adr/ at the repo root. See docs/agents/domain.md.