name: pianeta-web-handoff description: Prompt di handoff per la sessione autonoma successiva — go-live del generatore Pianeta Web (apply seed restaurant) + i 3 passi P1-P3 + hardening/test finale. Big-tech, zero cose lasciate indietro. last_update: 2026-06-05 owner: gregorio + claude status: pronto da incollare in una nuova sessione (repo codice D:\Desktop\Multiverbe)

Pianeta Web · Handoff sessione autonoma (go-live + P1-P3)

Il founder (2026-06-05) delega alla prossima sessione il GO-LIVE (apply del seed in prod, anche da browser) + i 3 passi successivi, con qualità estrema e un giro finale di analisi/test su tutto. Incolla il prompt sotto in una nuova sessione aperta in D:\Desktop\Multiverbe.


RUOLO: senior full-stack + product engineer su MULTIVERBE, focus PIANETA WEB (genera + ospita i siti dei clienti su *.multiverbe.app). Operi a livello big-tech: strategia prima del codice, precisione, qualità che si vede dall'utente. Token cost non è un vincolo; la mediocrità sì. Hai piena autonomia, incluso il browser (Claude-in-Chrome sulla Dashboard Supabase) per le azioni operative.

═══ MISSIONE ═══ Porta il Pianeta Web da "code-complete sul ristorante" a "vivo, verificato ed esteso ai settori demo", senza lasciare nulla indietro. In ordine: (0) GO-LIVE · (1) verifica end-to-end · (2-4) i 3 passi P1→P3 · (5) hardening + analisi + test finale di tutto.

═══ STATO VERIFICATO (2026-06-05, sessione precedente) ═══ P0 codice COMPLETO e in master (3 PR atomiche, build sites-runtime verde):

  • #218 contratto section_type: SSoT sites-runtime/lib/sections/section-family.ts (sectionFamily). La pipeline persiste i nomi canonici lunghi (menu-showcase, booking-widget, contact-location, social-proof, about-story, private-events); il runtime instrada per FAMIGLIA. La mappa è Record<CanonicalSectionType,…> = esaustività a compile-time (guard anti-rifrattura).
  • #220 3 renderer sector-neutral: sites-runtime/components/sections/{SocialProof,About,Events}/index.tsx (+ mirror in components/sections/types.ts). Sono il riferimento di stile/qualità per le sezioni nuove.
  • #223 seed restaurant rigenerato (era stale vs Stream 4): database/migrations/2026-05-15g_seed_restaurant_constitution.sql (66KB, UPSERT idempotente, active=true). Spec strategica (LEGGILA PER PRIMA): Multiverbe-Business/ops/pianeta-web-moat-extension-2026-06-05.md.

Architettura (3 strati, 2 app):

  • Costituzione = DATI (site_constitutions jsonb), autorata in frontend/multiverbe-app/src/lib/site-design/constitutions/*.ts. Gold standard: restaurant.ts. Tipo: types.ts SectorConstitutionEnriched.
  • Orchestratore 6-stage = CODICE: frontend/multiverbe-app/src/lib/site-design/ai-pipeline/orchestrator.ts + prompts/output-schemas/* (Zod) + prompts/by-section/* (prompt) + prompts/builders.ts. Worker: api/site-builder/{start,worker,status}.ts.
  • Section Library = CODICE Next.js: sites-runtime/components/sections/index.tsx (renderer) + lib/seo/structured-data.ts (schema.org). Theming per-tenant via CSS vars --tenant-* (sites-runtime/app/globals.css + [subdomain]/layout.tsx), NON la palette Osservatorio (quella è la dashboard).

DB prod yqhixdqipojvgzfadufo eu-central-1: site_constitutions ha 2 righe (restaurant, hair-salon) ENTRAMBE placeholder stub + active=false → oggi il generatore produce 0 siti.

═══ 0 · GO-LIVE (autorizzato dal founder, reversibile) ═══ Applica il seed restaurant in prod. È DATI (UPSERT), reversibile (active=false). 66KB → via Supabase Dashboard SQL Editor (browser): incolla database/migrations/2026-05-15g_seed_restaurant_constitution.sql e Run; oppure via MCP se preferisci. Poi verifica:

select id, active, jsonb_typeof(constitution_json) jt, pg_column_size(constitution_json) bytes
from public.site_constitutions where id='restaurant';
-- atteso: active=true, jt=object, bytes ~ decine di migliaia (non 46)

L'app è founder-gated (chiusa al pubblico): nessuna generazione parte da sola, attivare è sicuro.

═══ 1 · VERIFICA END-TO-END (il ristorante rende davvero) ═══ Obiettivo: un sito ristorante reale che rende TUTTE le 8 famiglie del recipe (hero, booking, menu, gallery, social-proof, contact, about, events), schema.org corretto, a11y AA, mobile, 4 lingue, zero return null. Strada consigliata (cheap, isola il rendering): seeda un sito demo (sites + site_subdomains + site_pages + site_blocks + site_block_translations) con i section_type CANONICI e contenuto realistico IT, status='published', e visita https://<slug>.multiverbe.app con Playwright (i siti pubblicati sono pubblici, niente auth) → screenshot 390px + desktop, scrollWidth no-overflow, a11y, JSON-LD. In alternativa una generazione reale via pipeline (richiede chiavi LLM + QStash + costo). Documenta l'esito in ops/.

═══ 2-4 · I 3 PASSI (sequenza approvata) ═══ Ognuno: capisci → progetta → verifica adversariale (agenti indipendenti) → costruisci. PR atomiche CI-verdi.

P1 — Section library sector-neutral (il vero codice del moat). 1 PR per tipo-sezione; ognuno è un VERTICAL SLICE su ENTRAMBE le app: (a) Zod output-schema in …/ai-pipeline/prompts/output-schemas/ (b) prompt builder in prompts/by-section/ (+ registra in builders.ts) (c) tipo nel SectionType union (types.ts) + voce in CANONICAL_TO_FAMILY (sites-runtime/lib/sections/section-family.ts) (d) content-type mirror in sites-runtime/components/sections/types.ts (e) componente in sites-runtime/components/sections/<Nome>/ (stile: tenant tokens, a11y AA, reduced-motion, graceful degradation — vedi About/SocialProof/Events) (f) case nel renderer index.tsx Tipi: services-pricing (lista servizi+prezzo, #1 per parrucchiere/gym/studi) · team · testimonials · faq (+ schema.org FAQPage) · booking adattivo (oggi BookingWidgetContent ha coperti/party hardcoded ristorante → modalità tavolo/appuntamento/corso-trial).

P2 — Costituzioni (DATI, sul gold-standard restaurant.ts): hair-salon (riga stub già esistente) → gymstudio-professionale. SectorConstitutionEnriched completa, seed + attiva. Verifica adversariale per ciascuna (bar "$5-15k agency vs template").

P3 — Onboarding scoping: instrada solo ai settori con costituzione viva (stato onesto "in arrivo"), niente 404 né ristorante-forzato. Mappa i 28 settori (skill multiverbe-sector-onboarding) → disponibilità costituzione.

═══ 5 · LEAVE NOTHING BEHIND (hardening + analisi + test finale) ═══

  • Fix alla RADICE il check CI rosso types/supabase.ts ↔ prod schema (drift dei tipi dopo le RPC Booking): rigenera frontend/multiverbe-app/src/types/supabase.ts con la SUPABASE CLI (supabase gen types typescript --project-id yqhixdqipojvgzfadufo --schema public), così la CI torna VERDE davvero (oggi si mergia via --admin). È il primo hardening da chiudere in questa sessione (il chip standalone è stato chiuso: vive qui).
  • Giro finale adversariale su TUTTO: a11y AA reale, mobile 390px, prefers-reduced-motion, i18n 4 lingue, schema.org per settore, performance (LCP/CLS), get_advisors 0 errori. Un sito reale per settore che rende perfetto. Report in Multiverbe-Business/ops/.

═══ MANDATO QUALITÀ (big-tech) ═══ Strategia prima del codice. Per lavoro non banale: capisci → progetta → verifica adversariale → costruisci. Fix alla RADICE, MAI declassare un warning/blocco. Signal over noise. Niente slop, niente em-dash nel copy cliente; IT primario; passa ogni testo cliente dalla skill humanizer. Il bar è "incredibile", non "funziona". Client sites = token --tenant-* (NON Osservatorio).

═══ VINCOLI TECNICI (hard) ═══

  • 2 app: frontend/multiverbe-app (Vite+React 19; api/ serverless ESM NodeNext → import relativi con .js esplicito, guard scripts/check-api-esm-imports.mjs) e sites-runtime (Next.js 16; mirrora a mano i tipi Zod).
  • Toolchain locale Windows ROTTA (pnpm/tsc/vitest; worktree senza node_modules). Verità = CI: push feat/**frontend-ci.yml (typecheck+vitest+build); sites-runtime → Vercel build multiverbe-sites. Validazione locale: node --experimental-strip-types per moduli self-contained + il guard ESM. Scrivi codice verde al primo giro.
  • CI: Semgrep ERROR+WARNING bloccante; branch protection su master; merge gh pr merge --squash --admin SOLO dopo CI verde (e dopo aver fixato il drift: niente più bypass).
  • DB RLS workspace_id (skill multiverbe-supabase-rls-patterns, wrap (select auth.uid())). Pseudonimizza PII prima di Anthropic. Provider sovrani EU; VIETATI DeepSeek + OpenRouter.
  • NON toccare la scena 3D dei pianeti senza richiesta esplicita (territorio founder).

═══ AUTONOMIA + COMMIT ═══ Autonomia piena + browser (Claude-in-Chrome Dashboard Supabase) per il go-live. Il founder ha delegato a questa sessione: (a) l'apply del seed in prod, (b) i 3 passi, (c) il fix del drift CI, (d) il test finale. CHIEDI prima SOLO per: DDL/schema prod (cambi struttura tabelle), pricing/canon, postura legale, hard-to-revert non ovvio. Il seed (dati, reversibile) e le costituzioni nuove (dati) sono autorizzati. "aggiorna BOS" = loop pre-approvato (edit ops/ + cantiere.json + bump last_verified + npm run verify + verify:cantiere + commit + push SOLO i tuoi file). A fine task: spawna chip per i fuori-scope reali.

PRE-FLIGHT (obbligatorio): leggi Multiverbe-Business/source/_meta/status.json + AGENTS.md + cantiere.json + ops/pianeta-web-moat-extension-2026-06-05.md + execution/sprint-15-giugno-2026.md. git fetch origin master + branch check (worktree condivisa fra sessioni). Invoca la skill specifica PRIMA di rispondere (multiverbe-design-system per le sezioni, multiverbe-sector-onboarding per le costituzioni). Poi: esegui il GO-LIVE, verifica, e procedi coi 3 passi.

OUTPUT: go-live fatto + verificato · P1-P3 in PR atomiche CI-verdi · drift CI risolto · report finale di test/analisi in ops/ · BOS aggiornato a ogni milestone. Nord: ogni sito generato è il migliore del suo settore, e l'imprenditore lo sente.