DB Audit Multiverbe · 2026-05-10

Project: Supabase yqhixdqipojvgzfadufo (eu-central-1, Frankfurt) Tabelle al momento dell'audit: 0 business tables (solo auth.* Supabase) + 5 sector_macros + 21 sectors + onboarding_ai_log appena applicate Schema legacy disponibile: database/supabase_schema.sql (1146 linee, 35 tabelle MAIND v2.0 da Feb '26) Scope: progettare schema nuovo allineato a canon 02-product.md (6 pianeti) + cronoprogramma MVP 31 Mag '26 + 5 paganti 10 Giu '26


1. Drift map · Schema legacy vs Canon nuovo

✅ Compatibili (riusabili così come sono)

Legacy tab Uso canon Note
workspaces Multi-tenant core OK ma active_modules default + business_type CHECK da aggiornare
team_members RBAC owner/admin/member OK
subscriptions Stripe billing tier starter/pro/business OK, allineato pricing CHF 590/890/1290 setup + 79/149/249/mo
smtp_configs Email Hub satellite Pianeta Web OK, riusabile per IMAP/SMTP del cliente
oauth_connections Pianeta Content (FB/IG/LinkedIn) OK
form_submissions Pianeta Web lead capture OK
push_subscriptions + notification_preferences PWA notifications OK
webhook_events Real-time hub (Stripe/Brevo/Meta) OK
entity_profile, entity_memory (pgvector), entity_patterns, entity_interactions Il Centro/Sole AI 3-tier OK ma entity_interactions.planet CHECK ('opera','vendi','connessioni','finanza','cross') da rinominare a 6 pianeti
referrals Ambassador Program OK
api_keys Public API tier Business OK
Storage buckets (social-media, brand-documents, workspace-logos) Asset storage OK
Functions get_ai_context, encrypt_smtp_password, enqueue_cascade_jobs, clean_entity_memory Backend support OK
Extensions (uuid-ossp, pg_cron, pgmq, pg_net, pgcrypto, vector) Foundation OK

⚠️ Da aggiornare (rename / restructure)

Tabella Problema Fix proposto
workspaces.business_type CHECK ('agency','ecommerce','restaurant','freelancer','custom') mappa pre-skill Tieni i 5 valori per backward compat con sectors mapping (vedi A6 handoff B), ma il SSoT è sector_id (FK a sectors)
workspaces.active_modules default ['crm','invoicing','email_marketing','social','ai_brain'] (modulazione vecchia) Cambia a ['web','booking','content','crm','sales'] (5 pianeti MVP — Marketing post-MVP)
entity_interactions.planet CHECK ('opera','vendi','connessioni','finanza','cross') (4 pianeti vecchi) ('web','booking','content','crm','sales','marketing','cross') (6 pianeti nuovi + cross)
business_templates Solo 5 BusinessType Deprecate ora che esistono sectors + sector_macros (V2 wizard usa quelle). Lascio in vita per edit-mode legacy
entity_profile.maturity_level 'nucleare/solare/galattico/cosmico' Tieni: linguaggio interno coerente con metafora "sistema solare" canon

❌ Mancanti (da creare per MVP)

Pianeta Web (10 satelliti, MVP Mag '26)

  • site_pages — pagine generate dal sito (HTML body, meta tags, slug, status pub/draft)
  • site_settings — config sito (theme, colors, fonts, logo, footer, navigation, custom domain)
  • site_assets — media uploads del sito (img/video) — opt riusare bucket workspace-logos
  • email_accounts — Email Hub: account IMAP/SMTP collegati per workspace (multi-mailbox)
  • email_threads — Email Hub: conversazioni unificate cross-account
  • email_messages — Email Hub: singoli messaggi con classificazione AI (lead/support/spam/internal)
  • email_labels — Email Hub: label suggerite (custom + AI-generated)

Pianeta Booking (5 satelliti, MVP Mag '26)

  • booking_services — servizi prenotabili (es. taglio, tavolo 4, camera deluxe, slot 1h consulenza)
  • booking_slots — disponibilità slot (sync col team calendar)
  • bookings — prenotazioni vere con status (richiesta/conferma/cancellata/no-show)
  • booking_settings — orari apertura, buffer, embed config
  • booking_team_calendars — sub-calendari per ogni collaboratore (link a team_members)

Pianeta Content Studio (8 satelliti, MVP Mag '26)

(parziale: social_posts esiste ma è limitato)

  • content_items — content generic (text/img/video/audio) prima di post
  • content_calendar_events — drag-and-drop schedule (link a content_items o social_posts)
  • content_brand_memory — palette/tone/asset/hashtag/taboo (riusare entity_memory? meglio dedicato)
  • content_generations — log generazioni AI per cap counter mensile (es. Starter 100/mo)
  • (social_posts legacy: estendere CHECK platforms, OK)

Pianeta CRM (5 satelliti, MVP Mag '26)

(parziale: deals esiste, ma manca CRM pulito separato da Sales)

  • crm_contacts — anagrafica clienti acquisiti con custom fields settoriali (allergie ristorante, taglie parrucchiere, preferenze hotel) — JSONB
  • crm_segments — segmentazione tag/liste dinamiche
  • crm_activity_timeline — storico multi-canale (chiamate/email/meeting/note/visite)
  • crm_loyalty_points — punti fedeltà per retention (Starter base / Pro completo)

Pianeta Sales (6 satelliti, MVP Mag '26 escluso Starter)

(parziale: leads + outreach_log legacy MAIND-style esiste ma per cold outreach Python)

  • sales_pipelines — pipeline custom (1 default + custom da Pro+)
  • sales_pipeline_stages — stages per ogni pipeline (drag&drop)
  • sales_seller_subaccounts — venditori sub-accounts (limit Pro 3, Business illimitati)
  • sales_email_sequences — cold outreach 3-step sequencer (warmup, A/B subject, auto-stop on reply)
  • (usa esistenti leads, outreach_log per back-office MAIND finché non smaltito)

Pianeta Marketing (Q2 Giu '26 — POST-MVP, skip ora)

Cap & Limits (foundation per pricing)

  • usage_counters — counter mensile per workspace × metric (ai_generations, cold_emails_sent, social_posts, crm_contacts)
  • Helper RPC check_tier_cap(workspace_id, metric, increment) — return boolean + remaining

Audit log (cross-cutting, già aggiunto in migration A)

  • onboarding_ai_log ✅ già applicato

🗑️ Legacy MAIND da archiviare (skip apply)

Queste tabelle sono pure legacy del cold outreach Python pre-Multiverbe e non servono al MVP nuovo:

  • patterns — pattern email outreach MAIND
  • geography_strategy — geo-bias outreach MAIND
  • daily_strategy — director EXPLOIT/EXPLORE MAIND
  • brand_intelligence — entries 12-layer brain (sostituito da entity_memory)
  • daily_kpi — KPI dashboard MAIND
  • dashboard_config — config legacy
  • ai_goals, ai_activity_log, ai_reports — versioni MAIND dell'AI Brain (sostituite da entity_*)
  • ab_tests, analytics_metrics — versioni MAIND (le nuove vivono dentro Pianeta Web/Marketing dedicate)
  • webhook_events (esistente OK), revenue_events, review_data — ridiscutere se utili o se sostituiti da nuove versioni Pianeta-scoped

Decisione: NON applico le tabelle legacy MAIND. Quando il backend Python daily_run.py verrà deprecato (post-Multiverbe v1), si possono droppare. Per ora il file database/supabase_schema.sql resta come reference storico.


2. Plan apply · 7 chunks ordinati

Ogni chunk = 1 apply_migration call MCP, indipendente, rollback-able. Ordinato per dipendenze.

# Chunk Tabelle nuove/aggiornate Cosa sblocca
1 FOUNDATION workspaces + team_members + subscriptions + storage buckets + RLS base + extensions Login + signup + workspace creation
2 IL CENTRO/SOLE entity_profile + entity_memory (pgvector) + entity_patterns + entity_interactions (CHECK 6 pianeti) AI Brain memory + pattern learning
3 PIANETA WEB site_pages + site_settings + site_assets + email_accounts + email_threads + email_messages + email_labels + (existing) form_submissions + push_subscriptions + notification_preferences Pianeta Web + Email Hub + lead capture
4 PIANETA BOOKING booking_services + booking_slots + bookings + booking_settings + booking_team_calendars Sostituisce Treatwell/Fresha/TheFork
5 PIANETA CONTENT STUDIO content_items + content_calendar_events + content_brand_memory + content_generations + (existing extended) social_posts + oauth_connections Generazione AI multimodale + auto-publishing social
6 PIANETA CRM + SALES crm_contacts + crm_segments + crm_activity_timeline + crm_loyalty_points + sales_pipelines + sales_pipeline_stages + sales_seller_subaccounts + sales_email_sequences + (existing) deals + leads + outreach_log Pianeta CRM + Pianeta Sales MVP
7 USAGE COUNTERS + UTILS usage_counters + RPC check_tier_cap + increment_usage + referrals + webhook_events + smtp_configs + api_keys Cap enforcement pricing + utility tables

Ordine di esecuzione critico: 1 → 2 (entity_* dipende da workspaces+team_members) → 3-7 (in qualsiasi ordine, indipendenti tra loro a parte FK su workspaces+team_members)

Out-of-scope post-MVP:

  • Pianeta Marketing (Q2 Giu '26)
  • Pianeta HR (Q3-Q4 '26)
  • Stripe Connect (referral payout — Q3 '26 GmbH operativa)
  • Composio MCP / Pipeboard auto-publishing (parte di Pianeta Content estensione)

3. Mapping pricing tier → cap defaults

Da implementare in chunk 7 come righe seed di usage_counter_defaults o helper function.

Metric Starter Pro Business Hard cap (block)
AI generations / mo 100 500 2.000
Cold emails / mo 0 1.000 5.000
Social platforms 1 3 5+
CRM contacts 500 5.000 illimitato
Sub-accounts venditori 0 3 illimitato
API access feature flag
Top-up +100 CHF 19, +500 CHF 79 idem overage

4. RLS strategy (riferimento skill multiverbe-supabase-rls-patterns)

  • Tutte le nuove tabelle: enable RLS + 4 policy CRUD per-operation, pattern workspace_id IN (SELECT workspace_id FROM team_members WHERE user_id = (SELECT auth.uid())). Wrap (SELECT auth.uid()) per initPlan caching evita performance cliff.
  • Service role bypass: Stripe webhook + Brevo webhook + backend Python via SUPABASE_SERVICE_ROLE_KEY (RLS bypassed automaticamente).
  • Sectors / sector_macros: già applicate, read public per authenticated, no FK a workspace (catalog statico globale).
  • Storage buckets: per-bucket policy come legacy schema (public read social-media, authenticated upload brain-documents, ecc.).

5. Pseudonimizzazione (CLAUDE.md hard rule 10)

  • entity_memory.content: contiene PII (email/nome/telefono cliente PMI). Quando passa attraverso Anthropic (US, fuori EU Data Boundary), il backend deve pseudonymizare PRIMA della chiamata.
  • Frontend già ha helper src/lib/pii-pseudonymize.ts (sessione B). Backend Render Python (se ancora attivo) deve avere equivalente.
  • entity_interactions.query + response: pseudonimizzare a write, NO PII raw in DB.
  • email_messages.body + subject: PII raw è inevitabile (è il contenuto effettivo della mail). Encryption-at-rest Supabase è automatico. Per LLM enrichment (classificazione/summary), pseudonimizzazione obbligatoria.

6. Performance considerations

  • entity_memory: ivfflat index per pgvector — richiede 100+ righe. Aggiungere lists = 100 (per dataset fino a ~10k righe) o riadattare quando si scala.
  • Tutte le tabelle con workspace_id: btree index obbligatorio (skill multiverbe-supabase-rls-patterns). RLS performance cliff senza è 100x slowdown.
  • email_messages: composite index (workspace_id, account_id, received_at DESC) per inbox view veloce.
  • bookings: composite index (workspace_id, slot_start) per calendar view.
  • content_calendar_events: composite index (workspace_id, scheduled_at) per calendar Buffer-style.

7. Estimated rows / costi

  • Workspace per cliente: 1
  • Team members: 1-20 per workspace
  • Sectors catalog (globale): 21 (statico)
  • Sector macros (globale): 5 (statico)
  • Email accounts per workspace: 1-6 (founder uses 6 mailbox parallel)
  • Email messages: 100-2000/giorno per heavy user
  • Bookings per workspace: 5-50/giorno per ristorante/parrucchiere
  • Content items: 5-50/mese (cap tier)
  • CRM contacts: 100-5000 (cap tier)
  • entity_memory rows: 100-500 per workspace nei primi 6 mesi

Storage stimato MVP: <500 MB Supabase (Free tier OK fino a ~50 clienti). Pro tier ($25/mo) post-50 clienti.


8. Decision log

  • 2026-05-10: founder autorizza apply schema completo. Skip legacy MAIND tables (cold outreach Python deprecando). Migration A (sectors catalog) già applicata. Procedere con chunks 1-7.
  • CHECK constraints: 6 pianeti ('web','booking','content','crm','sales','marketing','cross') invece di 4 vecchi. Update ovunque.
  • Trial gratuito: pricing canon dice "no trial gratis v1" (CH high-spending). Subscriptions table ha 'trialing' come status — lasciare per future v2 (no rimuovere CHECK).
  • business_type CHECK: tenuto pre-existing 5 valori per backward compat con sectors.business_type mapping. SSoT è sector_id FK.

Owner: Gregorio (decisioni schema) Applied via: Supabase MCP (apply_migration) Rollback: ogni chunk è independent, rollback singolo via DROP TABLE ... CASCADE


🐙 UPDATE 2026-05-10 sera · Polipo qualità + 8 tabelle Day 1

Founder approva apply pacchetti A+B+C dopo audit qualità: la base era 60-65% allineata canon Business Eye, ora 95%.

Pacchetto A · Cervello nervoso Day 1 (canon "Cuore + Sistema Nervoso")

Tabella Mission Riferimento canon
planet_registry Catalog dinamico 10 pianeti (6 attivi + sole + cross + 2 future). Sostituisce CHECK constraint hardcoded → scala a HR Q3 / Finanza 2027 senza ALTER. canon/02-product.md
nucleo_events ❤️ Cuore Event Stream Loop append-only. Schema esatto Business Eye: event_id, workspace_id, planet, event_type, payload, ai_decision_id, model_used, cost_chf, outcome, processed_by_agents, timestamp. Append-only enforced via no-UPDATE-policy. Helper emit_nucleo_event() SECURITY INVOKER. Business_Eye.html linea 3647
agent_decisions 🤖 Sistema Nervoso Decision Engine workflow: pending → approved/rejected → executed. Autonomy tier (auto/approve/manual) + lifecycle expires_at. FK a triggering_event_id → nucleo_events. Business_Eye.html linea 3678

Bonus: entity_interactions.planet CHECK rilassato (era hardcoded 4 pianeti vecchi, ora open per planet_registry FK opzionale → estendibile a nuovi pianeti senza ALTER).

Pacchetto B · Orchestrazione + briefing

Tabella Mission
planet_goals Cross-planet orchestration goal-driven (Business Eye linea 3679: low_bookings_alert → boost_bookings_goal → marketing executes). Status tracking + ai_strategy_steps JSONB.
reflection_schedules 👁️ Occhi briefing personalizzati. Time-based + event-based + profili settoriali pre-tarati ("ristorante_titolare", "studio_legale_partner"). Multi-channel (dashboard/email/push/whatsapp).
autonomy_promotions 3-approval-promote log (Business Eye linea 3688: dopo 3 approvazioni stessa azione → "vuoi auto-eseguire?"). Helper log_decision_approval() increment counter + return eligibility.

Pacchetto C · Production-grade

Tabella/Function Mission
model_ab_tests Hot-swap modelli A/B (Sonnet 4.6 vs Sonnet 5.0 / Kimi K3 quando escono). Stats incrementali calls/cost/quality.
knowledge_packs 🧬 DNA Layer C curated. Per pack_type: kpi_benchmark, framework, seasonality, ads_keywords, content_template, sales_script, best_practice. Refresh trimestrale tracking.
VIEW monthly_workspace_costs Aggregazione cross-source AI costs (events + decisions + content + interactions). Conversione USD→CHF.
FUNCTION check_cost_alert(workspace_id) Returns alert level (healthy/normal_50/warning_80/over_budget). Tier budget guidelines: Starter CHF 1.50 / Pro CHF 7 / Business CHF 18 (canon margin profili).

Score post-apply

95% allineato canon Business Eye. Restano 5% di lacune deliberate:

  • ❌ Spacetime narrative engine separato (deriva da nucleo_events via view, sufficiente Day 1)
  • ❌ Knowledge Layer B sector intelligence pipeline anonimizzazione (richiede ETL design dedicato, post-MVP)
  • ❌ Knowledge Layer C seed data 21 settori × KPI benchmark (content writing 1-2gg, post-MVP)
  • ❌ pgvector namespace partition esplicita per Brand Memory (RLS workspace_id sufficiente per ora, partition optimizer post-1k clienti)
  • ❌ Cost USD→CHF rate dinamico (oggi hardcoded 0.91, ok per MVP)

Migrations totali post-apply (12)

20260510135435 onboarding_v2_sectors_catalog
20260510141107 multiverbe_foundation
20260510141207 multiverbe_centro_sole
20260510141338 multiverbe_pianeta_web
20260510141443 multiverbe_pianeta_booking
20260510141556 multiverbe_pianeta_content
20260510141806 multiverbe_pianeta_crm_sales
20260510170737 multiverbe_usage_counters_utils
[security_hardening]
20260510210xxx multiverbe_polipo_pacchetto_a
20260510210xxx multiverbe_polipo_pacchetto_b
20260510210xxx multiverbe_polipo_pacchetto_c

Tabelle pubbliche totali: 56 (47 base + 8 polipo + 1 knowledge_packs) Functions: 11 (signup trigger + cost alert + emit event + log approval + cap check + increment + cleanup memory + 4 SMTP encrypt/decrypt) Views: 1 (monthly_workspace_costs) Cron jobs: 1 (sole-weekly-cleanup Sun 03:00 UTC)

MAIND legacy deprecate

14 file Python + render.yaml + requirements.txt spostati in legacy/maind-python/. Doc in legacy/README.md. Cron render-keepalive Supabase ancora attivo, da disabilitare quando service Render eliminato (founder action B4 in manual-actions-2026-05-10.md).