title: Pianeta Web · Programma "siti al massimo" + handoff sessione fresca date: 2026-06-06 owner: gregorio + claude status: P0 trattoria FATTO+verificato (PR #274/#279/#280 merged). Programma 4 fasi definito. Decisioni founder prese. Pronto per nuova sessione. related: project_pianeta_web_trattoria_impeccabile_2026_06_06 (memory) · pianeta-web-golive-verify-2026-06-05.md
Pianeta Web · Programma "siti al massimo"
0. Decisioni founder (2026-06-06)
- Primo fuoco: QUALITÀ + DESIGN della generazione (ogni sito generato già "incredibile" out-of-box), progettato editor-aware (i campi editabili devono essere puliti da modificare).
- Content = lo studio/editor · Web = host + aggancio + pubblicazione live. (Architettura confermata.)
- Siti esterni → "importa e traduci": un sito esterno agganciato viene tradotto nel modello dati Multiverbe → diventa modificabile + ottiene performance/SEO/GEO/sitemap/Lighthouse al massimo in automatico. All'utente restano foto, font e poche scelte (no noia). "Pensare a fondo" il parser/importer.
- Font/design plan-gated (free/pro/business) — confermato dal founder ("scegliere tra qualche font in base al piano").
- Modalità di lavoro nuova sessione: qualità al massimo, senza risparmiare (no token limits), tutto verificato dal vivo.
1. Verità architetturale (fondamentale)
- Non esiste "codice per-sito". UNA runtime condivisa (
sites-runtime, Next.js 16, Vercel projectmultiverbe-sites) serve tutti i siti su*.multiverbe.appvia routing per subdomain + ISR. - Il sito vive come dati in Supabase Postgres:
sites(brand_dna, design_tokens, structure, tier, locale),site_subdomains,site_pages,site_blocks,site_block_translations(testi/prezzi/frasi per lingua),site_assets(immagini, bucket Storagesite-assets),site_constitutions(basi di settore = il moat). - Modificare un sito = UPDATE righe + invalidare cache (
/api/revalidate,REVALIDATE_SECRET) → live, niente deploy. Questo rende la visione "edit in Content → save live su Web" tecnicamente diretta. - Pipeline generazione = 6 stadi Opus (
src/lib/site-design/ai-pipeline/orchestrator.ts): BrandDNA(1) → Art Director(2) → Copy(3) → Visual(4, Flux/Ideogram/Recraft/Imagen) → CRO(5) → Senior Review(6, gate qualità ≥85). Guidata dalle costituzioni.
2. Stato verificato (2026-06-06)
FATTO (trattoria demo, PR #274/#279/#280 merged + verificato LIVE su prod):
- Hero full-bleed + 8 immagini reali coerenti (WebP+blur, self-hosted /public per il demo) + about 2-col con foto + gallery masonry reale. Desktop+mobile, 4 lingue, schema.org Restaurant, advisor 0, CTA
#prenota/#menufunzionanti. - Bug-radice risolti: padding airy sull'hero; proxy non serviva asset statici /public sotto subdomain (matcher); ancore CTA assenti; rimosso WebGL hero morto.
- Dettaglio: memory
project_pianeta_web_trattoria_impeccabile_2026_06_06.
I 4 BUCHI (= "qualità molto distante dall'obiettivo"):
- Generazione/design: solo la costituzione
restaurant.tsè ricca (1933 righe, 18 page types, 4 mood, enriched). Le altre 19 sono scheletri. E le sezioni renderizzate vanno portate al livello hero su tutta la linea. - Editor live: NON esiste (oggi genera→pubblica).
WebsiteTab.tsx= solo form-connector per siti esterni;SiteBuilderWizard.tsx= wizard di generazione. - Pixel/analytics: GA4/Meta/Plausible NON cablati; og:image dinamico, image-opt runtime, alt-text AI backfill mancanti.
- Compliance: identità legale (P.IVA/UID) solo in
brand_dnanon strutturato; niente editor; imprint generato una volta + immutabile; manca validazione UID svizzero (CHE-).
3. Il programma (4 fasi · ordine)
FASE 1 — Base "incredibile" out-of-box (PRIMO, editor-aware) ← parte da qui
- Design-pass su TUTTE le sezioni (hero fatto): social-proof, about, menu, gallery, events, booking, contact, services-pricing, faq, + testimonials/team (P1 nuove). Barra = livello hero, tutto via token
--tenant-*, a11y AA, reduced-motion, graceful degradation. Verifica live per ognuna. - Header del sito (oggi NON esiste, solo footer): SiteHeader trasparente-sopra-hero → solido allo scroll + nav (ancore già pronte) + CTA "Prenota". Leva grossa di "impeccabile".
- Costituzioni ricche per i settori prioritari (gold-standard
restaurant.ts):hair-salon→gym→studio-professionale→ resto dei 28. Meccanismo: scriviconstitutions/<id>.ts→scripts/seed-<id>-constitution.ts→ applica via MCP + active=true → seeda demo → verifica render live con la barra trattoria. - Editor-aware: progettare gli schemi di contenuto/blocco così che ogni campo editabile (testo/prezzo/frase/slot-foto/font) sia un path pulito in
content_json/design_tokens→ l'editor farà UPDATE mirati. Non dipingersi in un angolo. - Riferimenti freschi MERGED: PR #244 (services-pricing), #248 (faq) per il pattern 10-punti del vertical-slice.
FASE 2 — Editor live in Content
- Editor che legge
sites/site_blocks/site_block_translations/site_assets→ modifica inline testi/prezzi/frasi → UPDATE righe →POST /api/revalidate(REVALIDATE_SECRET) → live su Web. (Preview mode già esiste infetch-page.ts.) - Scelta font/design plan-gated (proposta da affinare): Starter 3-4 abbinamenti curati · Pro ~10 + temi · Business pool ampio + override custom. (Tunable, è canon/pricing → confermare allocazione col founder.)
- Upload foto utente →
site-assetsbucket (EXIF strip già esiste incontent/_lib/storage.ts) → ottimizzazione → slot. Per il demo trattoria oggi le foto sono in/public; in prod usare il bucket.
FASE 3 — Compliance CH/UE
- Nuova tabella
workspace_legal_identity:legal_company_name,vat_id/p_iva,swiss_uid(CHE- con validazioneCHE-123.456.789),eu_vat_id,commercial_register_number,registered_address,registration_country. - Editor form (SettingsPage).
gatherLegalSiteInput()legge dalle colonne (non solo brand_dna). Rigenera impressum/footer al cambio. Imprint obbligatorio CH (UWG art. 3 lit. s) con UID.
FASE 4 — SEO/pixel best-in-class out-of-box
- Analytics per-tenant:
sites.seo_config.analytics(GA4 measurementId, Plausible domain, Meta Pixel, GTM) → wire nel layout runtime + emit eventi sezione (AnalyticsEventSpec già tipizzato). - og:image dinamico (
@vercel/ogroute per pagina). Image-opt runtime (next/image wrapper + srcset + blur). Alt-text AI al publish (backfill già codificato, va invocato). llms.txt + IndexNow submit. Internal-links + prev/next. Enforce CWV/Lighthouse in CI.
WORKSTREAM TRASVERSALE — Import-and-translate siti esterni
- Parser/importer: sito esterno → ricreato come
site_blocks(mappati alle famiglie sezione) +design_tokensinferiti → editabile in Content + SEO/GEO/sitemap/Lighthouse automatici. "Pensare a fondo": fattibilità, mapping, fedeltà, performance. Feature differenziante.
4. Residui sessione trattoria (non perdere)
- ✅ FATTO 2026-06-06 — Bonifica env
multiverbe-sitesVercel (via Chrome MCP, autonomia founder): eliminatiJWT_SECRET(zero usi) eSUPABASE_SERVICE_ROLE_KEY(morto nel path anon:fetch-pageusaNEXT_PUBLIC_SUPABASE_ANON_KEY ?? SERVICE_ROLE, anon è settata → fallback mai raggiunto; tolta mina cross-project iouqem); correttoNEXT_PUBLIC_SUPABASE_URLscope Developmentiouqem…→yqhixdqipojvgzfadufo(valore confermato dal vivo). TenutiANON_KEY+NEXT_PUBLIC_SUPABASE_URLProduction (yqhix, corretti) +REVALIDATE_SECRET(funzionante, shared secret non legato al progetto). Nessun redeploy (running deployment non toccato; live verificato 200). Zero riferimenti iouqem residui. - smooth-scroll sugli anchor (oggi jump nativo, Lenis non wired sugli hash). Favicon 404 (manca
public/favicon).@react-three/*+threeora inutilizzati insites-runtime/package.json(cleanup deps a parte, no pnpm-lock a mano). Aggiornare BOScantiere.json(Web siti-cliente). - Demo foto trattoria in
/public/demo/trattoria-bellinzona/(stock Unsplash, licenza libera): in prod Stage 4 userà il bucket.
5. File chiave (ruoli)
| File | Ruolo |
|---|---|
frontend/multiverbe-app/src/lib/site-design/ai-pipeline/orchestrator.ts |
Orchestratore 6 stadi generazione |
…/site-design/design-tokens.ts |
Generatore token 3-livelli (da BrandDNA) |
…/site-design/tier-gating.ts |
Caps per piano (pagine/sezioni/immagini/animazioni/styleTier) |
…/site-design/constitutions/restaurant.ts |
Gold-standard costituzione (gli altri 19 = scheletri) |
…/site-design/types.ts |
SectorConstitutionEnriched, BrandDNA, DesignTokens, SiteAsset |
…/site-design/markup-customization.ts |
Hint presentazione per-blocco (Stream 2b) |
frontend/multiverbe-app/api/site/publish.ts · unpublish.ts |
Scrittura dati + revalidate runtime |
frontend/multiverbe-app/src/components/site-builder/SiteBuilderWizard.tsx |
Wizard generazione (UI Web) |
frontend/multiverbe-app/src/components/settings/WebsiteTab.tsx |
Form-connector siti ESTERNI (lead), NON editor |
sites-runtime/ |
Runtime condivisa multi-tenant (render + SEO) |
sites-runtime/components/sections/* |
Le sezioni renderizzate (design-pass qui) |
sites-runtime/lib/theme/tenant-theme.ts · style-tier.ts |
Token → CSS --tenant-* + style-tier |
sites-runtime/lib/seo/* |
metadata/sitemap/robots/structured-data/seo-config |
sites-runtime/proxy.ts |
Routing host→subdomain (matcher esclude ora asset statici) |
sites-runtime/lib/data/fetch-page.ts |
Lettura dati (anon key + RLS public-read + preview mode) |
PROMPT DI HANDOFF (incollare in una sessione fresca)
Sei un senior staff full-stack + design engineer (livello big-tech) che porta il Pianeta Web di MULTIVERBE al massimo. MULTIVERBE è il SaaS che dà a una PMI svizzera (Ticino/Grigioni) tutta la presenza digitale (sito, prenotazioni, contenuti, CRM, vendite) coordinata da un'AI centrale. (Il "BOS"/bos.multiverbe.com è lo strumento interno, NON il prodotto.)
Standard (Engineering Charter — memory
operating_charter): un task è "fatto" SOLO se verificato dal vivo con metodo esplicito, piccolo e coeso, zero hardcoded customer-facing (ogni stringa vale per QUALSIASI tenant, tutto via token--tenant-*), sicuro (filtraworkspace_idin ogni query/cache/storage + RLS, valida ownership al data-layer), advisor Supabase 0 errori, niente regressioni, fix alla radice, merge SOLO a CI verde (squash+admin è il pattern del repo). Italiano ovunque (UI/copy). Pseudonimizza PII prima di Anthropic. Mai DeepSeek/OpenRouter. Plan-first per lavori non banali; proponi la scelta migliore con trade-off; verifica lo stato reale (DB/prod/CI) prima di agire; chiedi solo per schema-prod/pricing-canon/sicurezza/hard-to-revert. Chiudi OGNI sessione con un blocco 🔴 DA FARE. Per gli stack 2026 valida sul web (versioni/best-practice correnti), non solo dal training. Lavora a qualità massima, senza risparmiare.Verità architetturale (leggila e tienila): non esiste codice per-sito. UNA runtime condivisa (
sites-runtime, Next.js 16, Vercelmultiverbe-sites) serve tutti i*.multiverbe.appvia routing per subdomain + ISR. Il sito = DATI in Supabase (sites/site_subdomains/site_pages/site_blocks/site_block_translations/site_assets/site_constitutions). Modificare = UPDATE righe +/api/revalidate(REVALIDATE_SECRET) → live, no deploy. Generazione = 6 stadi Opus (src/lib/site-design/ai-pipeline/orchestrator.ts), guidata dalle costituzioni di settore.Decisioni founder già prese: (1) Content = editor/studio, Web = host+aggancio+pubblicazione. (2) Siti esterni → importa-e-traduci nel modello Multiverbe (editabili + SEO/GEO/sitemap/Lighthouse automatici al massimo; all'utente solo foto/font/poche scelte). (3) Font/design plan-gated (free/pro/business). (4) Prima la qualità+design della generazione, editor-aware.
Stato (verificato live 2026-06-06): la trattoria demo (
trattoria-bellinzona-demo.multiverbe.app) è stata resa "incredibile" e verificata (PR #274 hero+immagini, #279 proxy asset statici, #280 ancore CTA — tutte merged). Ma la QUALITÀ DI GENERAZIONE complessiva è ancora distante: solo la costituzionerestaurant.tsè ricca; le altre 19 sono scheletri; le sezioni renderizzate vanno portate al livello hero su tutta la linea; non esiste editor né header di sito; pixel/analytics e compliance legale sono buchi. Dettaglio completo:Multiverbe-Business/ops/pianeta-web-program-handoff-2026-06-06.md+ memoryproject_pianeta_web_trattoria_impeccabile_2026_06_06.Missione di questa sessione (FASE 1): alzare la qualità di generazione al "best-in-class out-of-box", progettata editor-aware. Concretamente, in ordine: (a) design-pass sulle sezioni runtime restanti (social-proof/about/menu/gallery/events/booking/contact/services-pricing/faq + nuove testimonials/team) alla barra-hero, tutto via
--tenant-*, a11y AA + reduced-motion + graceful degradation; (b) SiteHeader trasparente-sopra-hero → solido-allo-scroll + nav ancore + CTA Prenota (oggi NON esiste); (c) costituzioni ricche sul modellorestaurant.tsperhair-salon→gym→studio-professionale(poi resto dei 28), ognuna seedata + verificata live con la barra trattoria; (d) tenere ogni campo editabile come path pulito (content_json/design_tokens) per la Fase 2 (editor). Fasi successive (editor live, compliance CH/UE, pixel/SEO, import-and-translate esterni) sono nel doc ops.Primo passo concreto: apri
sites-runtime/components/sections/*+frontend/multiverbe-app/src/lib/site-design/constitutions/restaurant.ts+types.ts; scegli UNA sezione (es.aboutomenu) o la costituzionehair-salon; portala al massimo; verifica il render LIVE su un sito demo (pattern: seed → publish → revalidate → screenshot desktop+mobile, advisor 0). Done = differenza visibile "incredibile" verificata dal vivo + CI verde + PR merged, senza regressioni e senza hardcoded.Inizia leggendo memory
operating_charter+project_pianeta_web_trattoria_impeccabile_2026_06_06e il doc ops sopra. Poi dichiara il piano del giorno e procedi a qualità massima.