🗺️ 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
- DB pulito: nessun drift di schema (migration delle PR aperte già applicate via MCP) · advisor 0 ERROR · restano 3 WARN minori.
- Tutto il lavoro recente è in prod ma a 0 utilizzo (Web Hub, Content, Connettori, Obiettivi Finanza) — manca un interruttore acceso, non altro codice.
- 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"
- Paga Vercel → prod torna.
- 3 env quasi-gratis:
VITE_ONBOARDING_V2=true· Clarity (OAUTH_TOKEN_ENCRYPTION_KEY) · confermaCRON_SECRET/PSI keys. - Vertex AI EU (4 env) → Content Studio respira.
- Inngest (2 env) → Sole agisce + auto-publish.
- Merge cascata PR: #468→#474→#478 · #472→#473→#475 · #477 · #479 · #465 · #460 · #448 · #415.
- Fix DB veloci:
recovery_codes_statusSECURITY INVOKER + consolida 2 policy permissive. - QStash + VAPID → site builder autonomo + push.
- Codice born-green (avanzabile anche con Vercel giù): cancella
scoreAndRank(S) · costruisci orchestratore specialisti (M). - 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