Dogfooding Gap Audit — Multiverbe come primo cliente Business

2026-06-04 · sessione "collega Multiverbe a Multiverbe". Account reale metaverbe@gmail.com → workspace Multiverbe (web-agency, Lugano/CH, tier Business). Audit di qualità production-ready su ogni pianeta, dalla prospettiva di un cliente Business.

Risultati strutturali della sessione

  • Primo vero utente creato e completo (onboarding reale via UI, Sole con identità entity_profile: tono direct, brief web-agency).
  • Bug gate-blocker risolto + in prod (PR #189): l'onboarding scriveva workspaces.sector (colonna rimossa) → PGRST204 → ogni cliente bloccato su "Errore durante il salvataggio". Solo i DEMO seedati via SQL risultavano completi. Fix verificato end-to-end sul deploy nuovo.
  • Tier Business attivato (subscription plan_tier=business) → Content + Sales sbloccati. Marketing/HR/Finanza restano nascosti perché planet_registry.status='planned' (corretto).

Tema trasversale dominante (il vero P0)

L'app GENERA con AI di qualità ma spesso non CONSEGNA, e l'intelligenza non è ovunque. I motori di generazione sono solidi; si rompono i loop a valle (invio/pubblicazione/scheduling) e manca del tutto l'AI dove serve di più: la gestione messaggi.

Nota di accuratezza: il tono utente è applicato nella generazione (Content generate-text, Sales generate-outreach) via buildSoleIdentityrenderToneLine su tutte le surface (sole-identity.ts:548,599-609). Il gap NON è "il tono non è iniettato", ma "manca generazione AI nei messaggi CRM" e "i loop non chiudono".

Gap-list per pianeta (P0 = blocca cliente pagante)

⚠️ CORREZIONE 2026-06-05 (sessione B · verificata sul codice + DB prod). Alcuni P0 qui sotto erano imprecisi. Verifica SEMPRE sul codice prima di costruire.

  • Web NON è "Inngest worker mancante". L'architettura Site Builder è QStash, non Inngest: start.ts pubblica → api/site-builder/worker.ts (esecutore, c'è) → orchestrator.ts (pipeline 6-stage completa) → llm-client.ts (Anthropic + Moonshot/Kimi). Frontend cablato (Step6 → start → poll → SneakPeekLive). Il vero buco di codice = Stage 4 immagini tutte stub (src/lib/site-design/ai-pipeline/stage-4-visual-director.ts fa throw "not yet implemented") → il sito si genera ma senza immagini AI (fail-soft). Fix giusto: cablare Stage 4 al gateway sovrano dispatchImage (Imagen Vertex EU, già in prod per Content) via injection (come llm). Il vero blocco GATE è infra: env QSTASH_* + Vertex + MOONSHOT_API_KEYmai girato end-to-end in prod (DB: 0 righe ai_generation_jobs; l'unico sites è un demo seedato via SQL).
  • Content "l'app genera ma non consegna". Causa vera del "Approva non salva": drift platform='meta_*' + status='APPROVED' violavano i CHECK di social_posts → insert respinto + catch {} silenzioso → 0 righe, calendario vuoto. RISOLTOPR #262: save canonico + programmazione (scheduled_at) + worker promemoria onesto (/api/cron/content-scheduler). Resta post-gate: auto-post social reale (epic API Meta/LinkedIn + OAuth) e consolidamento su content_items (canon).

Web (core solido, satelliti stub)

  • P0 AI Pipeline worker mancante (Inngest)vedi CORREZIONE sopra: il worker QStash esiste e la pipeline è completa; il buco reale di codice è Stage 4 immagini stub (cablare a dispatchImage), il blocco gate è infra (QSTASH_*/Vertex/Moonshot env, mai girato end-to-end).
  • P0 Web Hub adapter concreti non implementati (collegamento sito esterno) — rinviati a luglio.
  • P0 Email Hub + blog satellite assenti.
  • P1 MFA UI stub (SettingsPage.tsx:1118), observability/Sentry, email delivery monitoring (bounce/unsub).
  • Solido: Site Builder orchestrator, Stripe end-to-end, Reach/SEO cockpit, auth/RLS, qualità visiva (moat).

Booking (flusso solido, 5 blocker)

  • P0 Schema drift starts_at/ends_at vs slot_start/slot_end tra migration.
  • P0 Race condition double-booking: count+insert fuori transazione (serve advisory lock).
  • P0 Template Brevo non seedati (seed-brevo-templates-booking da creare).
  • P0 Webhook Stripe deposito incompleto (no checkout.session.completed per booking).
  • P0 Rate-limit in-memory (non distribuito) → falsi negativi a scala.
  • P1 No-show UI, tabella notification_preferences assente, refund workflow, allocazione multi-team.

Content (generazione solida, consegna mancante)

  • P0 Calendario editoriale + scheduling assenti (no scheduled_for, no /api/content/schedule).
  • P0 Auto-publish (n8n) è solo testo UI, non implementato.
  • P1 Quality-score non gating pre-publish; parsing JSON platformReady fragile.
  • Solido: generazione testo (Gemini EU) + immagine (Imagen EU) con tono+humanizer+provenance Art.50, fail-closed sovrano.

CRM + Messaggi (inbox email solida, intelligenza assente) ← mandato founder

  • P0 Zero AI drafting/reply: nessun /api/ai/draft-message. Il "gestire messaggi con intelligenza" non esiste ancora.
  • P0 Humanizer mai cablato al compose; settore ignorato nel messaging.
  • P0 WhatsApp/SMS/IG = stub 501 (richiede Meta Business API + Twilio).
  • P1 LTV sparkline mockato, reply-suggestions da storico assenti, loyalty config hardcoded.
  • Solido: inbox UI multi-canale, invio email Brevo reale, timeline (trigger), Sole CRM suggestions (agentico, PII-gated) — ma isolato dal compose.

Sales (pipeline solida, non transazionale)

  • P0 Genera outreach ma zero invio reale (no /api/sales/send-outreach).
  • P0 Automation cold 3-step (delay email2/DM) non implementata (n8n json statico).
  • P0 CRM timeline disconnessa (call log placeholder).
  • P1 Territory auto-assign stub, commission rules senza logica, leaderboard non persistito.
  • Solido: pipeline kanban, boss-view + RLS 2 livelli, quotas, sub-accounts, generazione Mistral EU con tono.

Cross-cutting / infra

  • Comp/internal account: manca un modo pulito per assegnare un piano senza checkout Stripe (subscriptions.stripe_customer_id NOT NULL). Per il dogfooding usato comp_internal_hq_multiverbe (dato, reversibile). Da formalizzare per early-adopter/comp.
  • Legacy 'opera': pipeline_opera, OperaSection ecc. da deprecare verso i 6 pianeti canonici.

Piano in ordine (qualità, allineato al mandato)

STATO 2026-06-05 (sessione A→C→B): #1 FATTO → "il Sole che scrive" CRM (PR #221 merged: /api/messages/draft-reply tono+settore, sovrano EU). #3 FATTO → Booking a prova di pagante (PR #226 merged: race double-booking via RPC atomico, email Brevo inline, webhook deposito Stripe). #2 (Sales send) DEFERITO con piano → non shippabile via relay transazionale (ToS Brevo + reputazione dominio): è l'Email epic (invio per-workspace dalla casella propria). Piano: ops/path-b-sales-send-outreach-plan-2026-06-05.md.

  1. Motore "Sole che scrive" come servizio condiviso + AI nei messaggi CRM. Estendere la voce (tono entity_profile + humanizer + settore), già viva in Content/Sales, al compose dei messaggi: /api/ai/draft-message (bozza + reply dal contesto thread/contatto), wired in MessagesPage. Risolve il P0 più citato e il mandato founder.
  2. Chiudere i loop genera→consegna. Content: scheduling + auto-publish. Sales: send-outreach + automation 3-step. (Email reale già c'è via Brevo.)
  3. Booking hardening (5 blocker P0) — primi clienti hospitality/beauty.
  4. Web: Inngest pipeline worker (P0 critico) + Email Hub.
  5. Deprecare 'opera' legacy (mappare impatto, poi rinominare senza rompere).
  6. Collegamento dati/landing (no hardcoded) + comp/internal account pulito.

Email — epica già pianificata (task separato)

Sistema completo (test SMTP/IMAP reale senza Render + invio da casella propria + inbox IMAP sync + AI compose) ≈ 35-40h. Architettura: endpoint Vercel Node (nodemailer/imapflow) + edge relay + pg_cron. Fasi: 0 (collega+test+invio) → 1 (inbox sync) → 2 (UX wizard). Confluisce nello Step 1-2 sopra per la parte AI.