Aller au contenu

Z8 — Onboarding & First Use Experience

Cold start · Recovery premier upload · Confiance parent Day 1

L'onboarding est le moment de vérité : un parent qui télécharge l'app un mardi soir et ne voit rien d'utilisable dans les 3 premières minutes désinstalle. Un élève dont le premier OCR échoue sans guidance pense que « ça ne marche pas ». Un parent qui rejoint et attend 6 jours son premier signal ne revient pas. Cette zone couvre les 3 gaps critiques d'adoption qui ne sont pas adressés par les zones existantes.

NOTE : Les zones Z6 (engagement) et Z7 (routine de soirée) couvrent le comportement du système une fois que l'élève a du contenu actif. Z8 couvre spécifiquement la transition entre « l'app est installée » et « l'élève a sa première session réussie + le parent a compris la valeur ». Sans Z8, les 163 AC précédents décrivent un produit excellent… auquel personne n'arrive.

Z8-AC01 — Chapitre démo pré-chargé (cold start)

Lot 0 P1
GIVEN L'élève vient de créer son compte (email/OAuth). Il n'a encore uploadé aucun chapitre. L'app est vide.
WHEN L'élève arrive sur le dashboard pour la première fois.
THEN Un chapitre démo est automatiquement présent dans l'app : matière « Physique-Chimie », titre « Densité et masse volumique (démo) ». Ce chapitre contient 8 items pré-générés (2 MCQ, 2 CLOZE, 2 SHORT, 1 NUMERIC, 1 DEFINITION), tous en état UNKNOWN, difficulté 1. Le dashboard affiche un bandeau contextuel : « Essaie une session de révision avec ce chapitre d'exemple — 3 min ». L'élève peut lancer une evening_first sur le chapitre démo exactement comme sur un vrai chapitre (même moteur de session Z6-AC04/AC05, même débrief Z1-AC15, mêmes micro-célébrations Z1-AC14). Le chapitre démo est marqué is_demo = true dans la base. Il est exclu de la progression globale, du digest parent, du pool de composition des sessions daily/pre_class, et de l'EveningPlan (Z7-AC01). Seule la session evening_first initiale est proposée sur le chapitre démo. Quand le pipeline J0 du premier vrai chapitre se termine avec ≥ 1 item valide, le chapitre démo est automatiquement archivé (ne pollue plus le dashboard). L'élève peut le supprimer manuellement à tout moment. Si l'élève n'interagit pas avec le chapitre démo et uploade directement un vrai chapitre, aucune friction — le chapitre démo est archivé silencieusement.

NOTE : Le chapitre démo résout le problème #1 d'adoption : le cold start. Un parent qui télécharge l'app à 22h un mardi peut voir son enfant faire un quiz en 3 minutes, sans cahier, sans photo, sans attente OCR. Le contenu « Densité et masse volumique » est volontairement un sujet de 5e/4e accessible, sans prérequis. Le coût technique est quasi nul : 8 items statiques injectés à la création du compte, traités par le même moteur. L'archivage automatique évite que le chapitre démo ne devienne du bruit une fois que l'élève a du vrai contenu.

Z8-AC02 — Empty state guidé avant premier upload

Lot 0 P1
GIVEN L'élève a créé son compte. Le chapitre démo est visible (Z8-AC01) mais l'élève n'a encore uploadé aucun vrai chapitre.
WHEN L'élève ouvre le dashboard (après la session démo ou sans l'avoir faite).
THEN Le dashboard affiche un empty state structuré en 3 étapes visuelles : (1) « ✓ Compte créé » (coché, vert). (2) « Photographie ton premier cours » avec un bouton « Capturer » proéminent + indication « 30 secondes ». (3) « Ta première session de révision » (grisé, avec « ~5 min après la capture »). Chaque étape a une icône, un texte court, et un état (fait / à faire / à venir). L'empty state disparaît dès que le premier chapitre est uploadé avec succès (pipeline J0 terminé avec ≥ 1 item valide). Si l'élève a fait la session démo, l'étape (1) devient « ✓ Session démo réussie — maintenant avec ton vrai cours ! ».

NOTE : L'empty state transforme le vide anxiogène (« cette app est cassée ? ») en checklist rassurante. Les 3 étapes numérotées créent un sentiment de progression immédiat. Le « 30 secondes » pour la capture et le « ~5 min » pour la session posent des attentes réalistes et désamorcent le « j'ai pas le temps ».

Z8-AC03 — UX de recovery si le premier OCR échoue

Lot 0 P2
GIVEN L'élève vient de photographier son premier cours (1 à 5 pages). Le pipeline J0 échoue : OCR illisible (confidence < 0.3 sur toutes les pages) OU timeout (> 60s sans réponse) OU 0 items valides générés.
WHEN Le pipeline J0 retourne un statut d'échec ou un résultat vide (0 items).
THEN L'élève voit un écran de recovery (pas une erreur technique) : (1) Message empathique : « Les photos sont un peu difficiles à lire. Pas de panique, ça arrive souvent au début ! » (2) Conseils visuels : 3 mini-illustrations montrant (a) bonne luminosité vs ombre, (b) page bien cadrée vs coupée, (c) écriture lisible vs trop petite. (3) Bouton primaire : « Reprendre les photos » → rouvre la caméra avec les pages déjà prises visibles comme vignettes (pas de perte du travail précédent, l'élève peut re-photographier uniquement les pages problématiques). (4) Bouton secondaire : « Essayer quand même » → si le pipeline a produit au moins 1 item malgré la faible confidence, permettre de continuer en mode dégradé (les items générés sont marqués validation_required = true, Z3). (5) Fallback chapitre démo : si 0 items et c'est le tout premier upload, le message ajoute : « En attendant, tu peux t'entraîner sur le chapitre d'exemple ». Le nombre de retries n'est pas limité. Chaque retry relance le pipeline J0 normalement. L'écran de recovery est loggé (event = 'j0_first_upload_recovery') pour monitorer le taux d'échec premier upload.

NOTE : L'échec du premier OCR est le moment le plus dangereux du funnel : l'élève n'a aucune tolérance à l'erreur car il n'a pas encore construit de confiance dans l'app. Le ton empathique (« ça arrive souvent ») + les conseils visuels (pas un message d'erreur technique) + le fallback vers le chapitre démo (Z8-AC01) garantissent que l'élève n'est jamais dans un cul-de-sac. Le logging du recovery permet d'identifier si le problème est systémique (OCR défaillant) ou ponctuel (mauvaises photos).

Z8-AC04 — Écran de progression pendant le traitement J0

Lot 0 P1
GIVEN L'élève vient de soumettre ses photos (premier upload ou upload suivant). Le pipeline J0 est en cours de traitement.
WHEN Le traitement dure plus de 3 secondes.
THEN Un écran de progression s'affiche avec : (1) Animation de chargement engageante (pas un spinner technique — ex : une page qui se « scanne » visuellement). (2) Message contextuel en 3 phases : phase 1 (0-5s) « Lecture de tes pages… », phase 2 (5-15s) « Création des questions… », phase 3 (15s+) « Presque fini… ». (3) Si le traitement dépasse 30s, un message additionnel : « C'est un peu plus long que d'habitude. Tu peux fermer l'app — on te préviendra quand c'est prêt. » + l'app envoie une notification push quand le pipeline J0 termine (succès ou échec). L'élève peut quitter l'écran de progression à tout moment sans interrompre le pipeline. S'il revient dans l'app, l'écran de progression se réaffiche si le pipeline est toujours en cours, ou le résultat (session proposée ou recovery Z8-AC03) s'affiche si le pipeline est terminé.

NOTE : Le silence pendant le traitement est anxiogène — l'élève ne sait pas si l'app a planté ou si elle travaille. Les messages en phases donnent une illusion de progression même si le backend est asynchrone. Le seuil de 30s pour le message « tu peux fermer » est basé sur les standards UX mobile : au-delà de 30s d'attente, le taux d'abandon dépasse 50%. La notification push de fin transforme l'attente passive en promesse active.

Z8-AC05 — Onboarding parent : premiers écrans + digest anticipé

Lot 0
GIVEN Le parent vient de créer son compte et de le lier à l'élève via le code 6 caractères (Z6-AC44).
WHEN Le parent accède au dashboard pour la première fois.
THEN Avant d'afficher le dashboard, le parent voit un mini-onboarding en 3 écrans (swipeable, skippable) : (Écran 1) « Voici ce que fait [Prénom] » : résumé visuel du principe (photo → questions → révision espacée → maîtrise). Durée de lecture : 10s. (Écran 2) « Votre tableau de bord » : aperçu annoté du dashboard avec 3 flèches : progression globale, matières actives, lien vers le script 3 minutes (Z1-AC17). (Écran 3) « Restez informé sans effort » : explication des notifications (routine terminée, digest hebdo, alerte inactivité) + bouton « Gérer mes préférences » (Z6-AC20). Après le 3e écran ou le skip, le parent arrive sur le dashboard réel. Si aucune session n'a été faite, l'Écran 1 utilise le futur (« Voici ce que fera [Prénom] ») et le dashboard affiche « [Prénom] n'a pas encore commencé — vous serez notifié dès sa première session. »

NOTE : 3 écrans = 30 secondes. C'est le minimum pour que le parent comprenne (1) ce que fait l'app, (2) ce qu'il voit, (3) ce qu'il recevra. Sans ça, le parent voit un dashboard avec des % qu'il ne comprend pas et des boutons qu'il n'ose pas toucher.

Z8-AC06 — Digest parent anticipé (J+2 après liaison)

Lot 0
GIVEN Le parent a lié son compte à l'élève (Z6-AC44). Le prochain digest standard est dimanche 9h (Z6-AC27).
WHEN (48h se sont écoulées depuis la liaison OU l'élève a complété 3 sessions, ce qui arrive en premier) ET l'élève a fait au moins 1 session depuis la liaison. Si 0 sessions à 48h, le digest anticipé est reporté jusqu'à la première session complétée.
THEN Le parent reçoit un digest anticipé (notification push + email si activé) avec : (1) Nombre de sessions complétées depuis la liaison. (2) Temps total de révision. (3) Matières actives et nombre de chapitres. (4) Progression mastery globale (% FRAGILE → OK ou mieux). (5) Message d'encouragement contextualisé : « [Prénom] a révisé [X] min en [N] sessions depuis [jour]. Les premiers résultats arrivent vite — voici ce qu'on observe déjà. » Ce digest anticipé est unique — il n'est envoyé qu'une fois, après la première liaison. Les digests suivants reprennent le rythme hebdomadaire standard (dimanche 9h, Z6-AC27). Si le parent lie le compte un samedi, le digest anticipé est envoyé lundi (48h), et le digest standard dimanche suivant — pas de doublon si < 3 jours d'écart (le digest standard de ce dimanche est sauté, le prochain est le dimanche d'après). Le digest anticipé est également dédupliqué avec le digest pré-contrôle (Z6-AC25) : si les deux sont programmés dans un intervalle de 48h, ils sont fusionnés en un seul envoi. Le champ parent.first_digest_sent_at empêche les envois multiples.

NOTE : Attendre 6 jours (mercredi → dimanche) pour le premier signal parent est un churn silencieux. Le parent oublie l'app, l'enfant perd son allié. Le digest anticipé dit « l'app marche, votre enfant l'utilise, voici les preuves ». Le trigger dual (48h OU 3 sessions) couvre les deux cas : l'enfant actif (3 sessions en 24h = digest dès le lendemain) et l'enfant occasionnel (digest à 48h même avec 2 sessions). Le coût technique est un cron conditionnel sur parent.linked_at + 48h — trivial.

Z8-AC07 — Invitation parent : timing optimal dans l'onboarding

Lot 0
GIVEN L'élève a terminé sa première session evening_first sur un vrai chapitre (is_demo = false, cf. Z6-AC05). La session démo ne déclenche pas l'invitation. L'élève n'a pas encore invité de parent (aucun compte parent lié).
WHEN L'écran de débrief de la première session (Z1-AC15) est affiché.
THEN Après le débrief standard, un écran d'invitation parent s'affiche : « Bravo pour ta première session ! Invite un parent pour qu'il suive ta progression. » Avec deux boutons : (1) « Inviter maintenant » → déclenche le flow Z6-AC44 (génération code 6 caractères + partage). (2) « Plus tard » → ferme l'écran, l'invitation reste accessible dans les paramètres. L'écran d'invitation n'est montré qu'une seule fois (après la 1re session). Si l'élève tape « Plus tard », un rappel discret apparaît dans les paramètres (badge notification sur l'icône settings) mais aucune notification push ni pop-up de relance. Le timing « après la 1re session » est intentionnel : l'élève a vécu le produit, il peut expliquer à son parent « c'est une app qui me pose des questions sur mes cours ». Avant la 1re session, l'élève ne sait pas ce que fait l'app et ne peut pas la recommander.

NOTE : Z6-AC44 spécifie le mécanisme de liaison mais pas le quand. Proposer l'invitation à la création du compte (avant toute session) est prématuré : l'élève ne sait pas encore ce qu'il recommande. Après la 1re session, l'élève vient de vivre le « moment magique » (ses propres questions de cours transformées en quiz) et a un pitch naturel. C'est aussi le moment où le parent voit son enfant excité par une app éducative — fenêtre d'opportunité maximale.

Z8-AC08 — Séquence d'onboarding déterministe (orchestration Day 0)

Lot 0 P2
GIVEN L'élève vient de créer son compte. Les composants d'onboarding sont répartis entre Z6 (schedule), Z7 (tutoriel soirée), et Z8 (démo, empty state, recovery, parent invite).
WHEN L'élève interagit avec l'app pour la première fois.
THEN La séquence d'onboarding est déterministe et suit cet ordre : (1) Création de compte → (2) Chapitre démo apparaît (Z8-AC01) + Empty state visible (Z8-AC02) → (3) Session démo optionnelle (evening_first sur le chapitre démo, ~3 min) → (4) Première soirée dans la fenêtre de soirée : tutoriel Z7-AC16 (overlay guidé vers capture du vrai cours) → (5) Premier upload : saisie emploi du temps contextuelle (Z6-AC01) → pipeline J0 avec écran de progression (Z8-AC04) → si échec : recovery (Z8-AC03) → (6) evening_first sur vrai chapitre (Z6-AC04/AC05) → (7) Débrief (Z1-AC15) → Invitation parent (Z8-AC07). Les étapes (3), (5), (6), (7) sont des transitions event-driven, pas des timers. Si l'élève fait les étapes hors ordre (ex : upload avant la fenêtre de soirée), le tutoriel Z7-AC16 s'adapte en sautant les étapes déjà complétées. À aucun moment deux overlays/écrans modaux ne sont affichés simultanément.

NOTE : Cet AC est un orchéstrateur : il ne définit pas de nouveau comportement mais impose un ordre de priorité quand plusieurs composants veulent s'afficher en même temps. Sans lui, un développeur implémentant Z7-AC16 et Z8-AC02 indépendamment pourrait superposer le tutoriel sur l'empty state. La règle est simple : un seul écran modal à la fois, dans l'ordre défini ci-dessus.


Ces 171 AC couvrent les zones à risque identifiées pour le vibe coding. Ils sont conçus pour être directement transformés en tests (Jest / Pytest / Playwright). Chaque session de génération de code doit recevoir les AC de la zone concernée comme contexte système, avec l'instruction explicite de générer les tests correspondants avant le code d'implémentation (TDD-first).

Fin du document — Révise Mieux AC