Flusso del gate di onboarding
Gli 8 passaggi del gate di onboarding che ogni installazione nuova deve superare prima che il launcher venga renderizzato. L'ordine è strutturale: ogni passo imposta uno stato da cui dipendono i successivi, oppure applica un confine di compliance.
Flusso
| Passo | Categoria | Imposta | Blocca rigidamente su |
|---|---|---|---|
| 1 Età + Paese | Gate | ageConfirmed, country | Checkbox non spuntato, nessun paese |
| 2 Benvenuto / Lingua | Gate | language (en / it) | n/d — avanzamento al click |
| 3 Video | Gate | — | n/d — sia SKIP che CONTINUE fanno avanzare |
| 4 Legale | Compliance | consents.tos, .privacy, .eula | Anche una sola delle 3 checkbox non spuntata |
| 5 Consenso EDC | Compliance | consents.edcGameplay | Toggle gameplay o checkbox non spuntati |
| 6 Connetti Steam | Identity | oauth.steam.{status,username}, OTEL host.username | OAuth Steam non si completa mai |
| 7 System Check | Diagnostics | SystemCheckReport (solo telemetria) | Qualsiasi voce con severity: blocking |
| 8 Pronto / GO | Done | playroll.onboardingV3Complete = true | n/d — avanzamento con singolo pulsante |
Perché questo ordine
- Compliance prima dell'identità. Legal + EDC devono essere accettati prima che venga collegato qualunque account, in modo che i record di consenso abbiano un timestamp
acceptedAtantecedente alla registrazione dell'ID Steam. - Identità prima della diagnostica. L'OAuth Steam al passo 6 chiama
otelLogger.setUserContext({ ownerId, username }). Ogni evento diagnostico emesso dal passo 7 viene quindi taggato automaticamente conhost.username+enduser.id, così i guasti opachi arrivano su SigNoz già attribuiti a un tester noto invece che a un dispositivo anonimo. - Diagnostica prima del launcher. I blocchi a livello hardware (assenza di encoder GPU, driver NVIDIA troppo vecchio, disco pieno, OS troppo vecchio) emergono prima del primo tentativo di registrazione, con pulsanti d'azione che li risolvono con un click.
Passo 7 — System Check
Cinque probe, tre livelli di severità. CONTINUE è subordinato a hasBlockers === false.
| Controllo | Sorgente | Soglie | Scala di severità |
|---|---|---|---|
| OS | os.release() | Win10 build 18362 / 20348 | block < 18362 · warn < 20348 · ok |
| CPU | os.cpus().length | 8 / 12 thread | warn < 8 · ok |
| RAM | os.totalmem() | 8 / 16 GB | block < 8 · warn < 16 · ok |
| Disco | statfs(recordingsPath) | 10 / 50 GB liberi | block < 10 · warn < 50 · ok |
| GPU | /api/environment/{check,adapter} (playroll-core) | Driver NVIDIA ≥ 570 (NVENC-only) | block su sistemi AMD-only / Intel-only, o encoder NVIDIA inutilizzabile · warn driver vecchio · ok |
Le soglie rispecchiano la pagina Notion 🖥️ System Requirements. Aggiornare entrambe in sincronia quando una build sposta una soglia.
Telemetria — attribuita per design
L'OAuth Steam al passo 6 inizializza setUserContext in otel-logger.ts, così gli eventi del passo 7 arrivano su SigNoz con host.username già allegato.
| Evento | Quando | Livello | Attributi chiave |
|---|---|---|---|
onboarding.system_check.result | ogni esecuzione (auto + retry) | mappato da overall | outcome, has_blockers, gpu_probe_source, entries.{count,blockers,warnings}, run_trigger |
onboarding.system_check.entry | per ogni voce non-ok | mappato da severity | entry.id, entry.severity, entry.measured, entry.required, entry.action_hint |
onboarding.system_check.unavailable | IPC mancante / crash | warn / error | reason (ipc_missing / ipc_error), error.message |
Query di triage ClickHouse:
-- testers blocked at GPU step with NVIDIA driver too old
SELECT host.username, system_check.entry.measured
FROM otel_logs
WHERE event.name = 'onboarding.system_check.entry'
AND system_check.entry.id = 'gpu'
AND system_check.entry.action_hint = 'update_nvidia_driver';
-- block-rate per check id
SELECT system_check.entry.id, count() AS blocks
FROM otel_logs
WHERE event.name = 'onboarding.system_check.entry'
AND system_check.entry.severity = 'blocking'
GROUP BY system_check.entry.id;
Superficie di stato
OnboardingState è mantenuto in un useReducer e riversato in GateState tramite setGateState al completamento. Lo stato locale dei componenti (checkbox, toggle) si resetta su BACK; lo stato del reducer (lingua, paese, età, consensi, OAuth) persiste attraverso la navigazione all'indietro.
I consent records raccolti qui (age + tos + privacy + eula + edcGameplay) vengono batch-submittati alla edge function consents-accept dopo lo step 6 (login Steam), così le righe atterrano su playroll_user_consents con lo user_id autenticato. La logica di re-prompt al boot (quando ruotiamo un documento sotto una modifica material) vive in Versioning dei consensi.
| Chiave | Tipo | Impostato a | Persistenza |
|---|---|---|---|
playroll.onboardingV3Complete | boolean | Passo 8 | GateStore — blocca il rientro nell'onboarding |
playroll.language | "en" | "it" | Passo 2 | GateStore — locale dell'intera app |
playroll.profile.country | CountryCode | Passo 1 | GateStore |
playroll.consents.{tos,privacy,eula,edcGameplay} | {acceptedAt} | Passi 4–5 | GateStore — audit trail |
oauth.steam.{status,username} | solo reducer | Passo 6 | persistito tramite AuthManager, non in GateStore |
SystemCheckReport | solo reducer | Passo 7 | solo telemetria, non persistito |
Postura pre-lancio
La v3 è stata progettata per installazioni nuove. Non esiste un percorso di migrazione da nessuna versione precedente dell'onboarding — ogni dispositivo vede la v3 da zero al primo avvio. I frame v2 esistenti rimangono sulla canvas Paper marcati DEPRECATED — DO NOT USE solo a scopo archivio.
Riferimenti
- UI:
src/renderer/features/onboarding/—steps.ts,OnboardingFlow.tsx,steps/SystemCheckStep.tsx - Main:
src/main/system-check/— checker, soglie, IPC handler - Core:
src/service/env_check.cpp,src/service/http_server.cpp(/api/environment/check,/api/environment/adapter) - Linear: EC-184 (bug tecnici UX-recoverable), EC-185 (disco), EC-186 (driver NVIDIA)