🗺️ Audit "finto-fatto" — cosa è merged ma NON vivo · 2026-06-30

Verificato sul DB di produzione reale (MCP Supabase yqhixdqipojvgzfadufo) + 2 scansioni codice + advisor live. NON a memoria. Scopo: checklist esatta da eseguire appena Vercel torna su (~3 lug, outage 402). Le prossime sessioni partano da qui. Origine: richiesta founder 2026-06-29 sera ("mappa cosa è merged-ma-non-vivo, dammi la lista azioni").


TL;DR — il verdetto in 3 righe

  1. DB pulito: nessun drift di schema (migration delle PR aperte già applicate via MCP) · advisor 0 ERROR · restano 3 WARN minori.
  2. Tutto il lavoro recente è in prod ma a 0 utilizzo (Web Hub, Content, Connettori, Obiettivi Finanza) — manca un interruttore acceso, non altro codice.
  3. Cuore transazionale vivo (Booking 28 righe, CRM/LTV 22, Sole-che-pensa 104 agent_runs/7gg).

Il censimento che spiega tutto — righe reali in prod (30/6)

Feature (PR) Righe prod Verdetto
Booking source (#450/#438) 28 ✅ VIVO ed esercitato
CRM LTV lifetime_value_chf>0 (#461) 22 ✅ VIVO
agent_runs ultimi 7gg (cervello Sole, US-direct) 104 ✅ Il Sole pensa (chat/loop)
legal_acceptances (compliance) 18 ✅ VIVO
sites generati 2 🟡 esercitato al minimo
content_items / content_calendar_events 1 / 0 🔴 Content NON consegna
external_site_audits (#457/#468/#474/#478) 0 🔴 mai eseguito in prod
oauth_connections (Google/Clarity/X) 0 🔴 nessun connettore collegato
planet_goals (#458 obiettivi Finanza) 0 🔴 mai esercitato → target_planets morto
site_legal_reviews (#427 gate sanitario) 0 🔴 mai esercitato
finance_enabled_workspaces 1 (solo Multiverbe) 🟢 gated by design

Distinzione chiave: il Sole "pensa" (agent_runs 104, brain Anthropic US-direct via llm-client.ts/agent-core.ts) ma il Content "non genera" (gateway sovrano Vertex EU spento → 503). Sono due piani AI distinti (cf. decisions-log v191).


Fronte A — DB / migration: PULITO ✅

  • Nessun drift di schema. Le migration delle PR aperte risultano già applicate in prod (ultima: external_site_audits_457, 29/6). Pattern Multiverbe: founder applica via MCP prima del merge.
  • Falso allarme memoria "native_api NULL" (#462): la colonna reale è connection_type (+ api_credentials_enc, provider_meta) ed esiste. Schema avanti, non indietro.
  • Advisor = 0 ERROR → barra re-baseline "advisor 0 errori" formalmente PASS. Da chiudere, per serietà:
Sev Advisor Oggetto Azione
WARN SECURITY DEFINER eseguibile da authenticated recovery_codes_status() REVOKE EXECUTE o SECURITY INVOKER · lint 0029
WARN multiple_permissive_policies (SELECT) lead_candidates, sales_icp_profiles consolidare 2 policy → 1
INFO rls_enabled_no_policy agent_copy_memo, auth_recovery_codes, external_api_usage, idempotency_keys confermare service-role-only (atteso) o aggiungere policy · lint 0008
INFO×175 unindexed_FK (62) + unused_index (113) igiene conta a scala, non a 0 traffico → backlog post-lancio

Fronte B — Dormant: codice live, spento da un env/flag · la checklist founder 🔴

Tutto già in prod, inerte finché non metti la credenziale. Ordinato per leva:

# Cosa accendi Gate (file) Variabili Cosa sblocca
1 Vertex AI EU (gateway sovrano testo/img/video) api/_lib/sovereign/vertex-adapter.ts isVertexConfigured() GCP_VERTEX_PROJECT, GCP_VERTEX_LOCATION, GCP_SA_CLIENT_EMAIL, GCP_SA_PRIVATE_KEY (Vercel + Supabase Edge) TUTTO il Content Studio (oggi 503). Leva massima. Guida: docs/sovereign-routing-provisioning.md
2 Inngest (il "Sole che AGISCE") api/_inngest/client.ts emit no-op senza key INNGEST_EVENT_KEY + INNGEST_SIGNING_KEY, sync https://multiverbe.app/api/inngest Digest per-pianeta, azioni autonome, memoria, follow-up Sales, reminder booking, auto-publish content. Qui vive PR5 tick-orario (#477)
3 Onboarding V2 src/App.tsx USE_ONBOARDING_V2 VITE_ONBOARDING_V2=true Flusso nuovo 5 macro + deduzione settore AI. Gratis (1 flag)
4 Connettori dogfooding Google not_configured; Clarity api/connectors/clarity/connect.ts 503 Google: GOOGLE_OAUTH_CLIENT_ID/SECRET/REDIRECT_URI + OAUTH_TOKEN_ENCRYPTION_KEY. Clarity: solo OAUTH_TOKEN_ENCRYPTION_KEY Il Sole legge analytics/SEO/GBP + heatmap reali. 0 oauth oggi
5 QStash (Upstash) api/_lib/qstash-client.ts throw senza token QSTASH_TOKEN + 2 signing keys Site Builder autonomo (oggi resta queued) + audit multipagina #478
6 Push VAPID useWebPush.ts; Vault + Edge VITE_VAPID_PUBLIC_KEY, VAPID_PRIVATE_KEY, Vault push_fanout_url/secret, PUSH_FANOUT_SECRET Notifiche push su device dalla campanella
7 Perf Web Hub (#474) gated su key verifica GOOGLE_PAGESPEED_API_KEY / GOOGLE_CRUX_API_KEY già su Vercel (v183) PSI+CrUX nel report
8 X/Twitter (#383) x-oauth.ts 503 X_CLIENT_ID/SECRET, OAUTH_STATE_SECRET Auto-post X. ⚠️ ~$100/mo → dopo dogfooding
9 Post-lancio vari Perplexity (AEO), SEARCH_PROVIDER+key (trend), Geoapify+.pmtiles (mappa Sales), VITE_SIGNUP_ENABLED=true contorno

Già impostati (solo da confermare presenti su Vercel): CRON_SECRET (#371) · key PSI/CrUX (v183).


Fronte C — Core scritto ma NON cablato · serve codice 🟠

Motore File Stato Azione Effort
Specialist agents del Sole (6 specialisti + 7 helper) api/_lib/agents/run-specialist.ts + specialist-registry.ts 0 ref esterne non-test. Costruito, testato (decisions-log v87), mai chiamato — manca l'orchestratore "PR4" mai esistito Dispatcher: su un insight sceglie specialista (getSpecialistByPlanet) → runSpecialist. Innesto su sole-actions.ts / growth/act.ts (già live). Sblocca anche target_planets M
Visual-QA loop (#466) src/lib/site-design/visual-qa/thresholds.ts @wip: checker soglie esiste, manca runner headless + giuria + loop Adapter Playwright+Lighthouse → evaluateVisualQa → rigenera se fail L
scoreAndRank (churn) api/_lib/crm/churn-score.ts Dead code: superato da churn-batch.ts. Knip lo manca per api/**! Cancellare S

Confermati VIVI (non orfani): ✅ model-as-judge (runJudge) cablato ai 3 endpoint da #476 · ✅ ~40 compute*/build*/analyze* wired · ✅ content engine cablato (il 503 è il provider Vertex spento, non orfano).


⚠️ Correzione onesta: il "publisher che fallisce in silenzio"

L'auto-publishing sui social mainstream (Meta/LinkedIn) NON è un bug — non è costruito, per scelta ToS (commento esplicito in content-scheduler.ts). Il cron emette il segnale "è ora di pubblicare" + notifica. Il loop reale che si può chiudere è: (a) manuale-effortless + auto-post X dormiente = PR #415; (b) auto-publish via Inngest (Fronte B #2). Quindi il Content non consegna per 2 interruttori spenti (Vertex + Inngest) + #415 da mergiare, NON per un bug da cacciare.


La sequenza esatta "appena Vercel è su"

  1. Paga Vercel → prod torna.
  2. 3 env quasi-gratis: VITE_ONBOARDING_V2=true · Clarity (OAUTH_TOKEN_ENCRYPTION_KEY) · conferma CRON_SECRET/PSI keys.
  3. Vertex AI EU (4 env) → Content Studio respira.
  4. Inngest (2 env) → Sole agisce + auto-publish.
  5. Merge cascata PR: #468→#474→#478 · #472→#473→#475 · #477 · #479 · #465 · #460 · #448 · #415.
  6. Fix DB veloci: recovery_codes_status SECURITY INVOKER + consolida 2 policy permissive.
  7. QStash + VAPID → site builder autonomo + push.
  8. Codice born-green (avanzabile anche con Vercel giù): cancella scoreAndRank (S) · costruisci orchestratore specialisti (M).
  9. Giro end-to-end reale per pianeta → verifica le righe 0→>0 (external_site_audits, content, oauth, planet_goals).

I punti 8 sono gli unici avanzabili mentre Vercel è giù.


Owner: Gregorio · Verificato da: sessione Claude 2026-06-30 (DB prod live + 2 audit codice + advisor) · Memory: project_finto_fatto_audit_2026_06_30