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 project multiverbe-sites) serve tutti i siti su *.multiverbe.app via 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 Storage site-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/#menu funzionanti.
  • 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"):

  1. 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.
  2. Editor live: NON esiste (oggi genera→pubblica). WebsiteTab.tsx = solo form-connector per siti esterni; SiteBuilderWizard.tsx = wizard di generazione.
  3. Pixel/analytics: GA4/Meta/Plausible NON cablati; og:image dinamico, image-opt runtime, alt-text AI backfill mancanti.
  4. Compliance: identità legale (P.IVA/UID) solo in brand_dna non 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-salongymstudio-professionale → resto dei 28. Meccanismo: scrivi constitutions/<id>.tsscripts/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 in fetch-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 utentesite-assets bucket (EXIF strip già esiste in content/_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 validazione CHE-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/og route 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_tokens inferiti → 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-sites Vercel (via Chrome MCP, autonomia founder): eliminati JWT_SECRET (zero usi) e SUPABASE_SERVICE_ROLE_KEY (morto nel path anon: fetch-page usa NEXT_PUBLIC_SUPABASE_ANON_KEY ?? SERVICE_ROLE, anon è settata → fallback mai raggiunto; tolta mina cross-project iouqem); corretto NEXT_PUBLIC_SUPABASE_URL scope Development iouqem…yqhixdqipojvgzfadufo (valore confermato dal vivo). Tenuti ANON_KEY+NEXT_PUBLIC_SUPABASE_URL Production (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/*+three ora inutilizzati in sites-runtime/package.json (cleanup deps a parte, no pnpm-lock a mano). Aggiornare BOS cantiere.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 (filtra workspace_id in 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, Vercel multiverbe-sites) serve tutti i *.multiverbe.app via 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 costituzione restaurant.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 + memory project_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 modello restaurant.ts per hair-salongymstudio-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. about o menu) o la costituzione hair-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_06 e il doc ops sopra. Poi dichiara il piano del giorno e procedi a qualità massima.