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: SSoTsites-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 incomponents/sections/types.ts). Sono il riferimento di stile/qualità per le sezioni nuove. - #223 seed
restaurantrigenerato (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_constitutionsjsonb), autorata infrontend/multiverbe-app/src/lib/site-design/constitutions/*.ts. Gold standard:restaurant.ts. Tipo:types.tsSectorConstitutionEnriched. - 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) → gym → studio-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): rigenerafrontend/multiverbe-app/src/types/supabase.tscon 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_advisors0 errori. Un sito reale per settore che rende perfetto. Report inMultiverbe-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.jsesplicito, guardscripts/check-api-esm-imports.mjs) esites-runtime(Next.js 16; mirrora a mano i tipi Zod). - Toolchain locale Windows ROTTA (pnpm/tsc/vitest; worktree senza
node_modules). Verità = CI: pushfeat/**→frontend-ci.yml(typecheck+vitest+build); sites-runtime → Vercel buildmultiverbe-sites. Validazione locale:node --experimental-strip-typesper 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 --adminSOLO dopo CI verde (e dopo aver fixato il drift: niente più bypass). - DB RLS
workspace_id(skillmultiverbe-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.