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 schemaoauth_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.signOutchiamate 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) + paginabos-app/app/silent-customers/page.tsx(design Osservatorio · Nebula Glass · empty-state educativo) + voce nav "Clienti silenziosi" in Sidebar (Core, dopo Action items). Snapshot inizialecount: 0atteso 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 + integrazioneD:\Desktop\Multiverbe-Landingcome PR9 pending Loris/Claude entro 4 giu.