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-logosemail_accounts— Email Hub: account IMAP/SMTP collegati per workspace (multi-mailbox)email_threads— Email Hub: conversazioni unificate cross-accountemail_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 configbooking_team_calendars— sub-calendari per ogni collaboratore (link ateam_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 postcontent_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_postslegacy: 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) — JSONBcrm_segments— segmentazione tag/liste dinamichecrm_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_logper 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 MAINDgeography_strategy— geo-bias outreach MAINDdaily_strategy— director EXPLOIT/EXPLORE MAINDbrand_intelligence— entries 12-layer brain (sostituito da entity_memory)daily_kpi— KPI dashboard MAINDdashboard_config— config legacyai_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 | sì |
| Cold emails / mo | 0 | 1.000 | 5.000 | sì |
| Social platforms | 1 | 3 | 5+ | sì |
| CRM contacts | 500 | 5.000 | illimitato | sì |
| Sub-accounts venditori | 0 | 3 | illimitato | sì |
| 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. Aggiungerelists = 100(per dataset fino a ~10k righe) o riadattare quando si scala.- Tutte le tabelle con
workspace_id: btree index obbligatorio (skillmultiverbe-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_idFK.
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).