Quality Follow-up Post-S4 · board operativa

Origine: decisions-log v53. La verifica live della Boss-View ha scoperto due bug di produzione (RLS recursion team_members, drift schema oauth_connections) che hanno rivelato problemi sistemici di qualità e processo. Questo file è la board che chiude quei buchi prima del gate del 10 giugno 2026 (14 giorni).

SSoT dello stato. Aggiornato a ogni passo. Legenda: ⏳ pending · 🟡 in progress · ✅ done · 🤔 decision pending · ⏸ blocked.

Stato sintetico

Priorità Done In corso Pending Decisioni aperte
P1 (questa settimana) 4/4 0 0
P2 (settimana prossima) 2/3 0 1
P3 (pre-lancio 10 giu) 0/3 0 3
Decisioni strategiche (F) 5/6 + 2 parziale 0 0 0 (risposte 2026-05-26 sera)

P1 · Questa settimana — copertura minima qualità (~6h)

# Item Stato PR Note
P1-1 Drift detector types/supabase.ts vs prod schema in CI #101 merged Secret aggiunto, advisory mode (no-block). Flip a hard gate dopo P2-5 (audit drift completo). Diff residui visibili come artifact in ogni run
P1-2 E2E smoke "fresh login → dashboard → Sales" in CI #105 merged Playwright + cron 30min (prod) + workflow_dispatch. PR-time deferred a P2 (serve Vercel bypass token per le preview protette).
P1-3 Test unitario useSalesLeaderboard (MTD ranking) #102 merged Refactor computeLeaderboard pure + 6 test vitest + step CI
P1-4 UX login page · waitlist opt-in (build phase) #104 merged Migration prelaunch_signups in prod + componente WaitlistOptIn + wire LoginPage. Brevo sync da fare in P2

P1-1 · Drift detector schema vs types

Cosa: workflow GitHub Actions su PR. supabase gen types --project-id $REF → diff con frontend/multiverbe-app/src/types/supabase.ts. Se diff, fail. Perché: il drift su oauth_connections (status, enc, provider_account) era invisibile finché non l'ho colpito a runtime. Con questo gate, ogni futuro apply_migration che dimentica di rigenerare i types fallisce in PR. Setup richiesto al founder: secret GitHub SUPABASE_ACCESS_TOKEN (token Personal Access Token Supabase, da generare in dashboard). Rischio iniziale: la prima run probabilmente fallisce su tabelle ancora in drift → utile, ci dice quante altre tabelle vanno riconciliate (collegato a P2-5).

P1-2 · E2E smoke su fresh login

Cosa: workflow GitHub Actions su PR. Playwright contro Vercel preview: navigate → login claude-demo → assert Home carica → assert "Pianeta Sales" cliccabile → screenshot artifact. Perché: la ricorsione RLS è morta SOLO sui login freschi (sessioni in cache la mascheravano). Una probe automatica avrebbe preso il 500 al primo PR che ha introdotto la ricorsione. Setup richiesto al founder: secrets GitHub CLAUDE_DEMO_EMAIL + CLAUDE_DEMO_PASSWORD (gli stessi che ho in locale). Estensione futura: stessa probe contro prod post-deploy, eseguita ogni 30 min, alert se fallisce (P2 / D1).

P1-3 · Test unitario useSalesLeaderboard

Cosa: vitest test che valida che il ranking sia per revenue_mtd desc, non per total_revenue_chf desc. Dati sintetici: seller A (storico alto, MTD basso), seller B (storico basso, MTD alto) → assert rank A=2, B=1. Perché: il bug Issue 1 era pura logica (un .slice prima del sort). Un singolo unit test l'avrebbe preso in code review della PR #73. Setto qui il precedente per altre regole di business critiche. Prerequisito: verificare presenza di vitest in devDeps; se assente, setup minimo.

P1-4 · UX FounderGate

Cosa: quando l'email non è in VITE_FOUNDER_EMAILS, mostrare una pagina dedicata "Multiverbe è in fase di build" con: messaggio chiaro, form email opt-in (lead capture), riferimento al lancio del 10 giu. Distinta dall'errore "Invalid login credentials". Perché: oggi un utente che mistypa l'email vede "Invalid login credentials" (uguale a password sbagliata) ed è confuso. Un visitatore curioso che digita la mail vera vede "Invalid login credentials" e pensa che l'app sia rotta. Persa di lead-gen passiva. Estensione: l'email captata va in Brevo (lista "Pre-lancio") via API.


P2 · Settimana prossima — qualità solida (~8h)

# Item Stato PR Note
P2-5 Audit + reconciliation drift su tutte le tabelle audit schema-audit-2026-05-26.md + #108 regen merged + #109 hard gate Tsc non si è rotto → frontend non era tipizzato in profondità. Master ora pulito. Drift detector → hard gate.
P2-6 Sentry frontend con alert su 500 PostgREST + logout spurio Osservabilità minima D1
P2-7 Seed QA esteso a 3 workspace settoriali (Ristorante / Parrucchiere / Studio) applicato in prod via MCP 2026-05-26 DEMO · Trattoria Bellinzona (5+10+12) / DEMO · Salone Lugano (6+10+15) / DEMO · Studio Legale Locarno (5+8+10). claude-demo owner di tutti via team_members.

P2-5 · Audit drift completo

Eseguire un confronto sistematico colonna-per-colonna su tutte le ~47 tabelle business. Output: tabella in markdown delle drift residue + plan di reconciliation. Probabilmente non solo oauth_connections aveva nomi obsoleti.

P2-6 · Sentry + alert

  • Frontend: capture 5xx da Supabase REST + cattura supabase.auth.signOut chiamate ravvicinate.
  • Alert se rate signOut spurio > 1/min su utenti non-founder.
  • Costo: Sentry free tier basta finché siamo sotto 5k events/mese.

P2-7 · Seed esteso multi-settore

Tre workspace demo realistici:

  • Trattoria Bellinzona: Ristorazione · prenotazioni + ContentStudio + 2 venditori
  • Salone Lugano: Parrucchieri · booking + waitlist + 1 dipendente
  • Studio Notarile Locarno: Servizi Pro · CRM + appointments + 3 collaboratori

Doppio uso: copertura QA multi-tenant + materiale per la demo ai primi clienti (anche video).


P3 · Pre-lancio 10 giugno (~4h)

# Item Stato PR Note
P3-8 Calendar entry hard "Cleanup ambiente QA Claude" — 9 giu Vedi checklist 10 giu già committata
P3-9 Dry-run onboarding con 1 cliente reale (anche non pagante) Carla? Loris? scegli tu
P3-10 Definire e implementare "first wow" — primi 60 secondi Vincola design onboarding

🤔 Decisioni strategiche aperte (founder)

Non eseguibili da me. Servono input.

F Domanda Decisione founder (2026-05-26 sera) Stato
F-1 Cosa accade nei primi 60 secondi del primo cliente? Cinematic flight-tour fra pianeti con anello completamento, form sector-aware integrato (NO seed wow). Stima 16-24h R3F. Ultimo in ordine. 🟡 spec ✅ 2026-05-27 canon/14-onboarding-cinematic-spec.md · implementazione 11-15 giu (post-gate 10 giu)
F-2 7 pianeti o subset di default (2-3) all'onboarding? Gating per tier (non per settore): Starter 3 / Pro 5 / Business 6 (prima versione). UI pianeti bloccati + CTA upgrade. ✅ 2026-05-27 · PR #127 + canon 02-product.md
F-3 Vero moat in CH? Chiamata umana SÌ (setup fee paga onboarding chiavi-in-mano) · bexio NO per ora (deferred post-gate). ✅ 2026-05-27 · playbooks/onboarding-call-script.md
F-4 Landing: 3 case study finti plausibili + video demo 90s entro 4 giugno? SÌ confermato. Testi Claude entro 4 giu (riusa seed P2-7) · video Loris/Gregorio Loom 90s. 🟡 testi ✅ 2026-05-27 in landing/case-studies/ · video Loom + integrazione landing PR9 pending
F-5 Trial: setup fee secco o CHF 79 refundabile a 14gg? Setup fee pieno + garanzia 30gg "soddisfatti o rimborsati" + trial 10gg trial gratuito già esistente. Doppia rete. Refund manuale via Stripe Dashboard primi 50 clienti. ✅ 2026-05-27 · canon 03-pricing.md + playbooks/refund-policy-30gg.md + legal/tos-warranty-clause-30gg.md
F-6 Retention loop post-attivazione (logga > 7gg → chiamata umana)? SÌ. Vista "Clienti silenziosi" nel BOS · snapshot JSON da auto via script · refresh manuale fino a 20 clienti poi cron. ✅ 2026-05-27

Note di sessione

  • 2026-05-26: board creata in seguito a decisions-log v53. Avvio da P1-3 (test unitario leaderboard) come quick win, poi P1-1 drift detector (massima leva).
  • 2026-05-26 sera: founder ha risposto a tutte le 6 F (vedi founder-decisions-pending-2026-05-26.md). Ordine di esecuzione: F-6 → F-3 → F-4 → F-2 → F-5 → F-1.
  • 2026-05-27: F-6 chiuso. Script scripts/fetch-silent-customers.mjs (snapshot JSON via Admin API) + pagina bos-app/app/silent-customers/page.tsx (design Osservatorio · Nebula Glass · empty-state educativo) + voce nav "Clienti silenziosi" in Sidebar (Core, dopo Action items). Snapshot iniziale count: 0 atteso pre-lancio.
  • 2026-05-27: F-3 chiuso. playbooks/onboarding-call-script.md (380 righe) · script verbatim della call onboarding chiavi-in-mano · 6 blocchi 60 min + pre-call brief + post-call recap + gestione obiezioni + varianti settori senza booking pubblico.
  • 2026-05-27: F-4 parziale. Testi 3 case study scritti in landing/case-studies/ (Trattoria Bellinzona / Salone Lugano / Studio Legale Locarno) · humanizer clean zero em-dash · benchmark verificabili (Treatwell 35% · TheFork CHF 4'692/anno · stack medio CHF 250-400/mo) · seed P2-7 referenziati. Video Loom 90s + integrazione D:\Desktop\Multiverbe-Landing come PR9 pending Loris/Claude entro 4 giu.