Plan · Build · Sign-off
Porting www.babanuj.com from Next.js 15 (Vercel) to classic Shopify Hydrogen — React Router 7 + Vite — hosted on Vercel, in a new repo, with a parity-gated cutover.
Claude (Fable 5)plans, reviews every PR, maintains this board
Codex · gpt-5.6 @ mediumcodex exec, one task per PR, never merges
Delegated to reviewerMoe's standing instruction Jul 11; local squash as Moe Ghashim + DCO; Moe retains override
DNS does not move until every step is green, in order.
Skeleton builds and deploys to Vercel; the three platform risks — deployment adapter, caching without workerd, edge rewrites — proven before any product code.
Shopify client, GraphQL documents, BabanujProduct adapter boundary, and seed-data fallback — callable from React Router loaders.
Tailwind v4 tokens, self-hosted fonts, shared primitives, and the site shell so route milestones only assemble pages.
Cookie cart end-to-end: single optimistic context, RR7 actions, /api/cart/add with PostHog stamping, drawer UI. Checkout-host invariant enforced by test.
All 17 public pages as React Router routes, URL-identical to the old app.
Customer Account API OAuth behind the same URLs — Hydrogen's built-in client vs a port of the bespoke flow, decided by spike.
PostHog, Meta, GA4, Judge.me — behind the same public paths and env vars as production.
Everything Google sees — metadata, OG images, sitemap, redirects, structured data — plus the automated parity audit that gates cutover.
Noindexed staging next to production, automated + human gates, then a reversible DNS cutover with the old app as instant rollback.
| # | Risk | Severity | Mitigation |
|---|---|---|---|
| R1 | No first-party Vercel adapter for classic Hydrogen — the glue is ours | Retired | Spike PASSED Jul 11: live Storefront SSR + streaming proven on a Vercel deployment. One residual: Hydrogen's POST Storefront proxy hits a Node duplex bug — tracked for v0.7 consent decision |
| R2 | Losing tag-based revalidation → stale catalog | Mitigated | TTL matrix proven on CDN (s-maxage 900 + SWR 86400); /api/revalidate path preserved; final tuning in v0.8-t6. Found & fixed: Hydrogen's tracking-cookie default made responses uncacheable |
| R3 | SEO regression at cutover (canonicals, redirects, sitemap) | High | URL-parity script + gate; apex→www 308 explicitly re-verified |
| R4 | Attribution chain breaks (PostHog revenue, Meta CAPI) | High | Byte-level HMAC test + full rehearsal with a real refunded order |
| R5 | Hydrogen calver breaking changes quarterly | Medium | Pin exact versions; upgrades are explicit post-cutover tasks |
| R6 | Shopify+Vercel's official direction is the new framework-agnostic Hydrogen (Next.js starter) — this port swims against that current | Medium | Acknowledged at sign-off; toolkit path documented as R1's fallback |
feat/v0.2-data-layer match PLAN §9 with criteria intact and the v0.1 learnings baked in (bespoke-client boundary, CACHE_NONE discipline). Task 001 ports the pure domain layer — brands, categories, vendor mappings, redirect data, seed products — value-for-value, with a unit test enforcing the brand/category three-ID rule.feat/v0.2-data-layer. PR #595759d1 under Moe Ghashim <mohanadgh@gmail.com> (GitHub API squash stamps the wrong identity, so merges are local from now on). Task 004 is the last platform spike: PostHog /ingest reverse proxy + representative redirects (incl. apex→www rule) coexisting with React Router on Vercel.babanuj-hydrogen Vercel project (separate from production) and must prove live Storefront SSR + streaming on a preview URL. This is the R1 abort-criterion task.gpt-5.6-terra (gpt-5.6/sol rejected on this ChatGPT plan; Decisions log updated), and Codex's sandbox can't write .git, so the runner performs commits/PRs with Codex-authored content verbatim.moeghashim/babanuj-hydrogen created on GitHub; Codex (gpt-5.6 @ medium) invoked to generate the v0.1 task breakdown under dev/milestones/. It stops for review before any code.