Parcours de démarrage : socle des étapes de visite (huit lignes, « J'ai compris », cochage d'office) #425

Closed
opened 2026-10-12 21:07:17 +00:00 by maximus · 1 comment
Owner

Le parcours gagne deux étapes de visite, sans action que la base puisse compter : « Parcourir les catégories et les mots-clés » (5ᵉ, avant le classement) et « Parcourir les rapports » (8ᵉ). Elles se cochent par un bouton « J'ai compris » ; un profil qui avait déjà terminé le parcours les trouve faites. Cette issue pose le socle (types, préférences, fournisseur, bouton, liste, docs) ; les cartes des deux pages viennent avec #432. Retours de Max sur la v0.17.1 (#422).

Planifié le 2026-10-12 (/plan-run, jalon planned-2026-10-12-retours-onboarding-v0171), après /analyze et une revue /review-spec (sécurité, architecture, technique) dont les constats sont intégrés ci-dessous. Corps autosuffisant : la spec (spec-plan-retours-onboarding-v0171.md) est locale et ignorée par git. L'ancien corps est archivé en commentaire.

Préalable : ce jalon s'exécute après le merge de planned-2026-10-10-fiabilite-tests (#408, #409, #395, #389). Les numéros de ligne cités sont lus sur main à 8b5b3b1 et ont pu bouger : se fier aux noms de fonctions, aux clés et aux textes cités. #408 rend le verrou de db.ts strict (un appel getDb() lancé depuis le rappel d'une transaction attend derrière le verrou) ; #409 et #389 changent plusieurs harnais de test listés ci-dessous.

Contexte

  • Aujourd'hui, chaque étape se coche par un compteur SQL (getOnboardingSnapshot, src/services/onboardingService.ts). Les étapes passées vivent dans onboarding_skipped_<clé> (:35-37), la règle D9 dans onboarding_guided_initialized (initializeGuidedPath).
  • Le reducer du fournisseur (src/hooks/useOnboardingChecklist.ts) a des actions locales prioritaires sur le snapshot d'un chargement parti avant elles (HIDE, SHOW, SKIP, RESUME) ; SKIP libère aussi le verrou de carte (:120-128).
  • Le compteur du bandeau (OnboardingBanner.tsx), le rang de la carte (OnboardingStepCard.tsx:62) et la fin de parcours (bannerMode, cardNext dans onboardingPath.ts) attendent budgetReady.
  • La spec de la phase 2 excluait de changer les six lignes de la liste ; cette issue lève l'exclusion, à la demande de Max.

Travail à faire

  • Types (src/shared/types/index.ts) : ChecklistItemKey ajoute "categories" et "reports" ; CHECKLIST_ITEM_KEYS = profile, importFolder, source, import, categories, manualCategory, budget, reports ; nouvelle constante VISIT_STEP_KEYS = ["categories", "reports"].
  • computeChecklist (src/utils/onboardingChecklist.ts) : options acknowledged?: readonly ChecklistItemKey[] et visitStepsInitialized: boolean ; lignes categories (to: "/categories") et reports (to: "/reports"), faites quand reconnues. Tant que visitStepsInitialized est faux, ces deux lignes sont verrouillées (hors du total, de complete et de nextStep), comme Budget avant budgetReady, et leur to reste la page.
  • onboardingService.ts :
    • acknowledgedStepKey(key) = onboarding_acknowledged_<clé> ; lecture en une requête (LIKE 'onboarding_acknowledged_%'), filtrée sur VISIT_STEP_KEYS et la valeur « 1 » ; acknowledgeStep(key) = setPreference(acknowledgedStepKey(key), "1") ;
    • ONBOARDING_VISIT_STEPS_INITIALIZED_KEY = "onboarding_visit_steps_initialized" ;
    • getOnboardingSnapshot rend aussi acknowledged et visitStepsInitialized (seule la valeur « 1 » compte) ;
    • initializeVisitSteps(acknowledge: boolean) : sans transaction ; si acknowledge, acknowledgeStep("categories") puis acknowledgeStep("reports"), puis setPreference(ONBOARDING_VISIT_STEPS_INITIALIZED_KEY, "1"). Les écritures sont idempotentes : un arrêt entre deux refait le même calcul au lancement suivant. Aucune ne notifie le canal de données.
  • Fonction pure shouldAcknowledgeVisitSteps(checklist) (dans onboardingChecklist.ts) : vrai quand chaque ligne déverrouillée hors VISIT_STEP_KEYS est faite ou passée.
  • Fournisseur (src/hooks/useOnboardingChecklist.ts, src/contexts/OnboardingContext.tsx) :
    • action ACKNOWLEDGE : ajoute la clé à acknowledged avec un acknowledgedSetAt qui prime sur le snapshot d'un chargement parti avant elle, comme skippedSetAt ; elle garde cardPage (contrairement à SKIP), pour que la carte annonce « Fait. » puis l'étape suivante ; acknowledge(key) exposé par OnboardingContext, qui écrit par acknowledgeStep ;
    • cochage d'office : une seule fois par profil, après le premier chargement réussi où budgetReady est vrai et visitStepsInitialized faux, appeler initializeVisitSteps(shouldAcknowledgeVisitSteps(checklist)) puis relire ; garde contre le double montage de StrictMode sur le modèle du chargeur de D9 (createOnboardingLoader, promesse partagée) ;
    • le fournisseur expose visitStepsInitialized ; OnboardingBanner, OnboardingStepCard et le calcul du mode (bannerMode, cardNext) reçoivent budgetReady && visitStepsInitialized là où ils reçoivent budgetReady aujourd'hui ; l'état « en attente » de la ligne Budget garde budgetReady seul.
  • StepCard (src/components/onboarding/StepCard.tsx) : prop onAcknowledge?: () => void ; quand elle est fournie et que l'étape n'est pas faite, bouton « J'ai compris » avant « Passer cette étape ». OnboardingStepCard la passe quand VISIT_STEP_KEYS contient l'étape de la carte.
  • OnboardingChecklist (src/components/dashboard/OnboardingChecklist.tsx) : huit lignes ; rowState rend « en attente » pour une ligne de visite tant que visitStepsInitialized est faux (pas « verrouillée », qui afficherait le badge de l'édition Base).
  • Docs : voir ci-dessous.

Textes (FR | EN)

Clé FR EN
onboarding.checklist.items.categories Parcourir les catégories et les mots-clés Browse categories and keywords
onboarding.checklist.items.reports Parcourir les rapports Browse the reports
onboarding.card.acknowledge J'ai compris Got it

Docs

  • Guide Markdown §1, lignes repérées par leur texte : « Les six étapes ci-dessous » → « Les huit étapes ci-dessous » ; la liste numérotée du « Démarrage rapide » reçoit « 5. Parcourir les catégories et les mots-clés — ce que font les mots-clés, avant de classer » et « 8. Parcourir les rapports — la période, les faits saillants et les cartes de rapports » à leur rang (les suivantes se renumérotent) ; « « Démarrage 3/6 » » → « « Démarrage 3/8 » » ; « déplie les six étapes » → « déplie les huit étapes » ; dans la note qui suit la liste, les deux étapes de visite se cochent par « J'ai compris », et « le parcours se termine à 5/5 » → « le parcours se termine à 7/7 » ; ajouter qu'un profil qui avait terminé le parcours avant leur arrivée les trouve déjà faites ; la puce « Carte d'accueil d'un profil sans transaction… six étapes » → « huit étapes ».
  • Clés docs.gettingStarted.steps, docs.gettingStarted.subsections[0].steps[0] et [1], docs.gettingStarted.subsections[0].note, docs.dashboard.features[6] : mêmes changements, FR et EN.
  • docs/adr/0022-canal-evenements-donnees.md : acknowledgeStep et initializeVisitSteps entrent dans la liste « Ne notifient pas » (§2) ; au §5, le cochage d'office est admis comme D9 : une écriture unique par profil après un chargement réussi, qui relit elle-même.
  • docs/architecture.md, section Onboarding : huit lignes ; l'invariant « Chaque case est cochée par une donnée, jamais par un clic » devient « Les six étapes de données se cochent par une donnée, jamais par un clic ; les deux étapes de visite par « J'ai compris » (et, pour Rapports, l'ouverture de la carte Tendances mise en évidence) » ; préférences onboarding_acknowledged_<clé> et onboarding_visit_steps_initialized dans le tableau des préférences et dans la ligne user_preferences du tableau des tables.
  • Liste QA docs/qa-onboarding.html : huit lignes, « J'ai compris », cochage d'office d'un profil complet, lignes de visite « en attente » avant l'initialisation.

Fichiers concernés

  • Code : src/shared/types/index.ts, src/utils/onboardingChecklist.ts, src/services/onboardingService.ts, src/hooks/useOnboardingChecklist.ts, src/contexts/OnboardingContext.tsx, src/components/onboarding/StepCard.tsx, src/components/onboarding/OnboardingStepCard.tsx, src/components/onboarding/OnboardingBanner.tsx, src/components/dashboard/OnboardingChecklist.tsx, src/utils/onboardingPath.ts
  • Tests propres : src/utils/onboardingChecklist.test.ts, src/services/onboardingService.test.ts, src/hooks/useOnboardingChecklist.test.ts, src/hooks/useOnboardingChecklist.wiring.test.ts, src/contexts/OnboardingContext.render.test.tsx, src/components/onboarding/StepCard.render.test.tsx, src/components/onboarding/OnboardingStepCard.test.tsx, src/components/onboarding/OnboardingBanner.render.test.tsx, src/components/dashboard/OnboardingChecklist.test.tsx, src/utils/onboardingPath.test.ts
  • Tests à recaler (faux useOnboarding à compléter, ou totaux et rangs à décaler) : src/components/layout/AppShell.render.test.tsx, src/components/layout/AppShell.slot.test.tsx, src/components/dashboard/DashboardEmptyState.render.test.tsx, src/pages/DashboardPage.render.test.tsx, src/pages/ImportPage.render.test.tsx, src/pages/TransactionsPage.render.test.tsx, src/pages/BudgetPage.render.test.tsx, src/pages/BudgetPage.wiring.test.ts, src/components/budget/BudgetTable.wiring.test.ts, src/pages/settings/UsersSettingsPage.test.tsx
  • Docs : src/i18n/locales/fr.json, src/i18n/locales/en.json, docs/guide-utilisateur.md, docs/architecture.md, docs/adr/0022-canal-evenements-donnees.md, docs/qa-onboarding.html, CHANGELOG.md, CHANGELOG.fr.md

Règle des gabarits de test. Tout gabarit de parcours fini, et tout gabarit arrêté après l'étape d'import, reconnaît les deux étapes de visite et a visitStepsInitialized vrai (sinon nextStep devient categories). Rangs : manualCategory passe de 5 à 6 et budget de 6 à 7 ; totaux : 6 → 8 (Base+) et 5 → 7 (Gratuite).

Depends on

Lien d'ordre : mêmes fichiers (fr.json, en.json, guide, CHANGELOG) que les issues précédentes de la pile.

Tests

  • computeChecklist : huit lignes dans l'ordre ; totaux 8 (Base+) et 7 (Gratuite) ; une étape reconnue est faite, pas passée ; une étape de visite peut être passée ; avant l'initialisation, les deux lignes de visite sont hors du total et de nextStep.
  • shouldAcknowledgeVisitSteps : vrai pour six lignes faites ou passées (Base+) ; vrai en Gratuite avec Budget verrouillé et les cinq autres faites ; faux s'il en reste une ; les lignes de visite n'entrent pas dans le calcul.
  • Service : acknowledgeStep écrit la bonne clé ; le snapshot ne garde que les clés de visite à « 1 » ; initializeVisitSteps(true) écrit les deux reconnues puis le drapeau, initializeVisitSteps(false) le drapeau seul ; aucun appel à withTransaction.
  • Fournisseur : ACKNOWLEDGE prime sur un chargement parti avant lui et garde cardPage ; le cochage d'office ne s'exécute qu'une fois, et pas avant budgetReady ; premier rendu d'un profil au parcours fini : pas de bandeau « Étape suivante ».
  • StepCard : « J'ai compris » seulement avec onAcknowledge, jamais sur une étape faite.
  • OnboardingChecklist : une ligne de visite non initialisée s'affiche « en attente », sans badge d'édition.

Critères d'acceptation

  • Un profil neuf voit « Démarrage n/8 » en Base+, « n/7 » en Gratuite, une fois l'initialisation faite.
  • Un profil dont les six anciennes étapes étaient faites ou passées garde « Démarrage terminé » après la mise à jour, sans passer par « Étape suivante » : ses deux étapes de visite sont faites.
  • Un profil au parcours incomplet garde ses deux étapes de visite à faire, même après avoir fini les six autres.
  • Entre ce maillon et #432, le parcours s'arrête à l'étape 5 : /categories n'a pas encore de carte, donc ni « J'ai compris » ni « Passer cette étape ». Admis : la pile est mergée d'un bloc avant toute release.
  • npm run build et npm test verts.

Review caveats

  • 🔴 Sécurité, résolu par décision : avec le verrou strict de #408, un acknowledgeStep ou un getPreference dans le rappel d'un withTransaction bloquerait toute la base, à chaque lancement puisque le drapeau ne serait jamais écrit ; les tests de service simulent withTransaction et ne le verraient pas. Max a retenu une initialisation sans transaction (CWE-833, CWE-362).
  • 🔴 Technique, résolu : npm run build vérifie les types des fichiers de test ; un acknowledge obligatoire et les nouveaux champs du snapshot cassent les faux useOnboarding de dix fichiers, et le passage à huit lignes casse les totaux et rangs affirmés ailleurs. Fichiers listés et règle des gabarits.
  • 🔴 Technique, résolu : entre ce maillon et #432, les étapes de visite ne peuvent être ni reconnues ni passées (« Passer cette étape » n'existe que sur une carte) ; critère réécrit.
  • 🟡 Architecture et technique, résolu : avant le cochage d'office, un profil au parcours fini aurait clignoté vers « Étape suivante : Parcourir les catégories » ; lignes de visite « en attente » jusqu'à l'initialisation.
  • 🟡 Architecture et technique, résolu : ACKNOWLEDGE écrit « comme SKIP » aurait fait disparaître la carte au clic ; il garde le verrou de carte.
  • 🟡 Architecture, résolu : ADR 0022 (§2, §5) et invariant « jamais par un clic » amendés dans cette issue.

Décisions prises en planification

  • Catégories et mots-clés en 5ᵉ (avant le classement), Rapports en 8ᵉ (Max, 2026-10-12).
  • Validation des étapes de visite par « J'ai compris » ; « Passer cette étape » reste à côté (Max, 2026-10-12).
  • Cochage d'office des deux étapes pour un profil dont le parcours était complet (Max, 2026-10-12), sans transaction (Max, 2026-10-12, après revue).
  • L'étape de classement garde son critère ; sa carte (#430) guide vers « Ajouter comme mot-clé ».

Conventions

  • Toute chaîne en FR et en EN (src/i18n/locales/fr.json, en.json) ; les textes de ce corps s'écrivent mot pour mot (FR validé par Max le 2026-10-12, EN rédigé sur le même contenu).
  • CHANGELOG : une entrée sous ## [Unreleased] dans CHANGELOG.md et CHANGELOG.fr.md.
  • Tests de rendu : renderToStaticMarkup (pas de jsdom) et le faux t partagé livré par #389.
  • Aucune migration : tout l'état vit dans user_preferences (ADR 0016). npm run build (il vérifie aussi les types des fichiers de test) et npm test verts.
  • Guide Markdown (docs/guide-utilisateur.md) : repérer une ligne par son texte cité, pas par son numéro.

CHANGELOG

Added / Ajouté : FR « Parcours de démarrage : deux étapes de visite, « Parcourir les catégories et les mots-clés » (avant le classement) et « Parcourir les rapports » (en dernier), cochées par « J'ai compris » ; un profil qui avait terminé le parcours les trouve déjà faites. » EN "Getting started: two visit steps, “Browse categories and keywords” (before categorizing) and “Browse the reports” (last), checked with “Got it”; a profile that had finished the path finds them already done." (#432 complète cette entrée.)

Spec source

spec-plan-retours-onboarding-v0171.md (local, ignoré par git) ; décisions dans spec-decisions-retours-onboarding-v0171.md.

Le parcours gagne deux étapes de visite, sans action que la base puisse compter : « Parcourir les catégories et les mots-clés » (5ᵉ, avant le classement) et « Parcourir les rapports » (8ᵉ). Elles se cochent par un bouton « J'ai compris » ; un profil qui avait déjà terminé le parcours les trouve faites. Cette issue pose le socle (types, préférences, fournisseur, bouton, liste, docs) ; les cartes des deux pages viennent avec #432. Retours de Max sur la v0.17.1 (#422). > Planifié le 2026-10-12 (`/plan-run`, jalon `planned-2026-10-12-retours-onboarding-v0171`), après `/analyze` et une revue `/review-spec` (sécurité, architecture, technique) dont les constats sont intégrés ci-dessous. Corps autosuffisant : la spec (`spec-plan-retours-onboarding-v0171.md`) est locale et ignorée par git. L'ancien corps est archivé en commentaire. > > **Préalable :** ce jalon s'exécute après le merge de `planned-2026-10-10-fiabilite-tests` (#408, #409, #395, #389). Les numéros de ligne cités sont lus sur `main` à `8b5b3b1` et ont pu bouger : se fier aux noms de fonctions, aux clés et aux textes cités. #408 rend le verrou de `db.ts` strict (un appel `getDb()` lancé depuis le rappel d'une transaction attend derrière le verrou) ; #409 et #389 changent plusieurs harnais de test listés ci-dessous. ## Contexte - Aujourd'hui, chaque étape se coche par un compteur SQL (`getOnboardingSnapshot`, `src/services/onboardingService.ts`). Les étapes passées vivent dans `onboarding_skipped_<clé>` (`:35-37`), la règle D9 dans `onboarding_guided_initialized` (`initializeGuidedPath`). - Le reducer du fournisseur (`src/hooks/useOnboardingChecklist.ts`) a des actions locales prioritaires sur le snapshot d'un chargement parti avant elles (`HIDE`, `SHOW`, `SKIP`, `RESUME`) ; `SKIP` libère aussi le verrou de carte (`:120-128`). - Le compteur du bandeau (`OnboardingBanner.tsx`), le rang de la carte (`OnboardingStepCard.tsx:62`) et la fin de parcours (`bannerMode`, `cardNext` dans `onboardingPath.ts`) attendent `budgetReady`. - La spec de la phase 2 excluait de changer les six lignes de la liste ; cette issue lève l'exclusion, à la demande de Max. ## Travail à faire - [ ] Types (`src/shared/types/index.ts`) : `ChecklistItemKey` ajoute `"categories"` et `"reports"` ; `CHECKLIST_ITEM_KEYS` = `profile, importFolder, source, import, categories, manualCategory, budget, reports` ; nouvelle constante `VISIT_STEP_KEYS = ["categories", "reports"]`. - [ ] `computeChecklist` (`src/utils/onboardingChecklist.ts`) : options `acknowledged?: readonly ChecklistItemKey[]` et `visitStepsInitialized: boolean` ; lignes `categories` (`to: "/categories"`) et `reports` (`to: "/reports"`), faites quand reconnues. Tant que `visitStepsInitialized` est faux, ces deux lignes sont verrouillées (hors du total, de `complete` et de `nextStep`), comme Budget avant `budgetReady`, et leur `to` reste la page. - [ ] `onboardingService.ts` : - `acknowledgedStepKey(key)` = `onboarding_acknowledged_<clé>` ; lecture en une requête (`LIKE 'onboarding_acknowledged_%'`), filtrée sur `VISIT_STEP_KEYS` et la valeur « 1 » ; `acknowledgeStep(key)` = `setPreference(acknowledgedStepKey(key), "1")` ; - `ONBOARDING_VISIT_STEPS_INITIALIZED_KEY = "onboarding_visit_steps_initialized"` ; - `getOnboardingSnapshot` rend aussi `acknowledged` et `visitStepsInitialized` (seule la valeur « 1 » compte) ; - `initializeVisitSteps(acknowledge: boolean)` : **sans transaction** ; si `acknowledge`, `acknowledgeStep("categories")` puis `acknowledgeStep("reports")`, puis `setPreference(ONBOARDING_VISIT_STEPS_INITIALIZED_KEY, "1")`. Les écritures sont idempotentes : un arrêt entre deux refait le même calcul au lancement suivant. Aucune ne notifie le canal de données. - [ ] Fonction pure `shouldAcknowledgeVisitSteps(checklist)` (dans `onboardingChecklist.ts`) : vrai quand chaque ligne déverrouillée hors `VISIT_STEP_KEYS` est faite ou passée. - [ ] Fournisseur (`src/hooks/useOnboardingChecklist.ts`, `src/contexts/OnboardingContext.tsx`) : - action `ACKNOWLEDGE` : ajoute la clé à `acknowledged` avec un `acknowledgedSetAt` qui prime sur le snapshot d'un chargement parti avant elle, comme `skippedSetAt` ; elle **garde** `cardPage` (contrairement à `SKIP`), pour que la carte annonce « Fait. » puis l'étape suivante ; `acknowledge(key)` exposé par `OnboardingContext`, qui écrit par `acknowledgeStep` ; - cochage d'office : une seule fois par profil, après le premier chargement réussi où `budgetReady` est vrai et `visitStepsInitialized` faux, appeler `initializeVisitSteps(shouldAcknowledgeVisitSteps(checklist))` puis relire ; garde contre le double montage de StrictMode sur le modèle du chargeur de D9 (`createOnboardingLoader`, promesse partagée) ; - le fournisseur expose `visitStepsInitialized` ; `OnboardingBanner`, `OnboardingStepCard` et le calcul du mode (`bannerMode`, `cardNext`) reçoivent `budgetReady && visitStepsInitialized` là où ils reçoivent `budgetReady` aujourd'hui ; l'état « en attente » de la ligne Budget garde `budgetReady` seul. - [ ] `StepCard` (`src/components/onboarding/StepCard.tsx`) : prop `onAcknowledge?: () => void` ; quand elle est fournie et que l'étape n'est pas faite, bouton « J'ai compris » avant « Passer cette étape ». `OnboardingStepCard` la passe quand `VISIT_STEP_KEYS` contient l'étape de la carte. - [ ] `OnboardingChecklist` (`src/components/dashboard/OnboardingChecklist.tsx`) : huit lignes ; `rowState` rend « en attente » pour une ligne de visite tant que `visitStepsInitialized` est faux (pas « verrouillée », qui afficherait le badge de l'édition Base). - [ ] Docs : voir ci-dessous. ## Textes (FR | EN) | Clé | FR | EN | |---|---|---| | `onboarding.checklist.items.categories` | Parcourir les catégories et les mots-clés | Browse categories and keywords | | `onboarding.checklist.items.reports` | Parcourir les rapports | Browse the reports | | `onboarding.card.acknowledge` | J'ai compris | Got it | ## Docs - Guide Markdown §1, lignes repérées par leur texte : « Les six étapes ci-dessous » → « Les huit étapes ci-dessous » ; la liste numérotée du « Démarrage rapide » reçoit « 5. Parcourir les catégories et les mots-clés — ce que font les mots-clés, avant de classer » et « 8. Parcourir les rapports — la période, les faits saillants et les cartes de rapports » à leur rang (les suivantes se renumérotent) ; « « Démarrage 3/6 » » → « « Démarrage 3/8 » » ; « déplie les six étapes » → « déplie les huit étapes » ; dans la note qui suit la liste, les deux étapes de visite se cochent par « J'ai compris », et « le parcours se termine à 5/5 » → « le parcours se termine à 7/7 » ; ajouter qu'un profil qui avait terminé le parcours avant leur arrivée les trouve déjà faites ; la puce « Carte d'accueil d'un profil sans transaction… six étapes » → « huit étapes ». - Clés `docs.gettingStarted.steps`, `docs.gettingStarted.subsections[0].steps[0]` et `[1]`, `docs.gettingStarted.subsections[0].note`, `docs.dashboard.features[6]` : mêmes changements, FR et EN. - `docs/adr/0022-canal-evenements-donnees.md` : `acknowledgeStep` et `initializeVisitSteps` entrent dans la liste « Ne notifient pas » (§2) ; au §5, le cochage d'office est admis comme D9 : une écriture unique par profil après un chargement réussi, qui relit elle-même. - `docs/architecture.md`, section Onboarding : huit lignes ; l'invariant « Chaque case est cochée par une donnée, jamais par un clic » devient « Les six étapes de données se cochent par une donnée, jamais par un clic ; les deux étapes de visite par « J'ai compris » (et, pour Rapports, l'ouverture de la carte Tendances mise en évidence) » ; préférences `onboarding_acknowledged_<clé>` et `onboarding_visit_steps_initialized` dans le tableau des préférences et dans la ligne `user_preferences` du tableau des tables. - Liste QA `docs/qa-onboarding.html` : huit lignes, « J'ai compris », cochage d'office d'un profil complet, lignes de visite « en attente » avant l'initialisation. ## Fichiers concernés - Code : `src/shared/types/index.ts`, `src/utils/onboardingChecklist.ts`, `src/services/onboardingService.ts`, `src/hooks/useOnboardingChecklist.ts`, `src/contexts/OnboardingContext.tsx`, `src/components/onboarding/StepCard.tsx`, `src/components/onboarding/OnboardingStepCard.tsx`, `src/components/onboarding/OnboardingBanner.tsx`, `src/components/dashboard/OnboardingChecklist.tsx`, `src/utils/onboardingPath.ts` - Tests propres : `src/utils/onboardingChecklist.test.ts`, `src/services/onboardingService.test.ts`, `src/hooks/useOnboardingChecklist.test.ts`, `src/hooks/useOnboardingChecklist.wiring.test.ts`, `src/contexts/OnboardingContext.render.test.tsx`, `src/components/onboarding/StepCard.render.test.tsx`, `src/components/onboarding/OnboardingStepCard.test.tsx`, `src/components/onboarding/OnboardingBanner.render.test.tsx`, `src/components/dashboard/OnboardingChecklist.test.tsx`, `src/utils/onboardingPath.test.ts` - Tests à recaler (faux `useOnboarding` à compléter, ou totaux et rangs à décaler) : `src/components/layout/AppShell.render.test.tsx`, `src/components/layout/AppShell.slot.test.tsx`, `src/components/dashboard/DashboardEmptyState.render.test.tsx`, `src/pages/DashboardPage.render.test.tsx`, `src/pages/ImportPage.render.test.tsx`, `src/pages/TransactionsPage.render.test.tsx`, `src/pages/BudgetPage.render.test.tsx`, `src/pages/BudgetPage.wiring.test.ts`, `src/components/budget/BudgetTable.wiring.test.ts`, `src/pages/settings/UsersSettingsPage.test.tsx` - Docs : `src/i18n/locales/fr.json`, `src/i18n/locales/en.json`, `docs/guide-utilisateur.md`, `docs/architecture.md`, `docs/adr/0022-canal-evenements-donnees.md`, `docs/qa-onboarding.html`, `CHANGELOG.md`, `CHANGELOG.fr.md` **Règle des gabarits de test.** Tout gabarit de parcours fini, et tout gabarit arrêté après l'étape d'import, reconnaît les deux étapes de visite et a `visitStepsInitialized` vrai (sinon `nextStep` devient `categories`). Rangs : `manualCategory` passe de 5 à 6 et `budget` de 6 à 7 ; totaux : 6 → 8 (Base+) et 5 → 7 (Gratuite). ## Depends on - #431 > Lien d'ordre : mêmes fichiers (`fr.json`, `en.json`, guide, CHANGELOG) que les issues précédentes de la pile. ## Tests - `computeChecklist` : huit lignes dans l'ordre ; totaux 8 (Base+) et 7 (Gratuite) ; une étape reconnue est faite, pas passée ; une étape de visite peut être passée ; avant l'initialisation, les deux lignes de visite sont hors du total et de `nextStep`. - `shouldAcknowledgeVisitSteps` : vrai pour six lignes faites ou passées (Base+) ; vrai en Gratuite avec Budget verrouillé et les cinq autres faites ; faux s'il en reste une ; les lignes de visite n'entrent pas dans le calcul. - Service : `acknowledgeStep` écrit la bonne clé ; le snapshot ne garde que les clés de visite à « 1 » ; `initializeVisitSteps(true)` écrit les deux reconnues puis le drapeau, `initializeVisitSteps(false)` le drapeau seul ; aucun appel à `withTransaction`. - Fournisseur : `ACKNOWLEDGE` prime sur un chargement parti avant lui et garde `cardPage` ; le cochage d'office ne s'exécute qu'une fois, et pas avant `budgetReady` ; premier rendu d'un profil au parcours fini : pas de bandeau « Étape suivante ». - `StepCard` : « J'ai compris » seulement avec `onAcknowledge`, jamais sur une étape faite. - `OnboardingChecklist` : une ligne de visite non initialisée s'affiche « en attente », sans badge d'édition. ## Critères d'acceptation - [ ] Un profil neuf voit « Démarrage n/8 » en Base+, « n/7 » en Gratuite, une fois l'initialisation faite. - [ ] Un profil dont les six anciennes étapes étaient faites ou passées garde « Démarrage terminé » après la mise à jour, sans passer par « Étape suivante » : ses deux étapes de visite sont faites. - [ ] Un profil au parcours incomplet garde ses deux étapes de visite à faire, même après avoir fini les six autres. - [ ] Entre ce maillon et #432, le parcours s'arrête à l'étape 5 : `/categories` n'a pas encore de carte, donc ni « J'ai compris » ni « Passer cette étape ». Admis : la pile est mergée d'un bloc avant toute release. - [ ] `npm run build` et `npm test` verts. ## Review caveats - 🔴 Sécurité, résolu par décision : avec le verrou strict de #408, un `acknowledgeStep` ou un `getPreference` dans le rappel d'un `withTransaction` bloquerait toute la base, à chaque lancement puisque le drapeau ne serait jamais écrit ; les tests de service simulent `withTransaction` et ne le verraient pas. Max a retenu une initialisation sans transaction (CWE-833, CWE-362). - 🔴 Technique, résolu : `npm run build` vérifie les types des fichiers de test ; un `acknowledge` obligatoire et les nouveaux champs du snapshot cassent les faux `useOnboarding` de dix fichiers, et le passage à huit lignes casse les totaux et rangs affirmés ailleurs. Fichiers listés et règle des gabarits. - 🔴 Technique, résolu : entre ce maillon et #432, les étapes de visite ne peuvent être ni reconnues ni passées (« Passer cette étape » n'existe que sur une carte) ; critère réécrit. - 🟡 Architecture et technique, résolu : avant le cochage d'office, un profil au parcours fini aurait clignoté vers « Étape suivante : Parcourir les catégories » ; lignes de visite « en attente » jusqu'à l'initialisation. - 🟡 Architecture et technique, résolu : `ACKNOWLEDGE` écrit « comme `SKIP` » aurait fait disparaître la carte au clic ; il garde le verrou de carte. - 🟡 Architecture, résolu : ADR 0022 (§2, §5) et invariant « jamais par un clic » amendés dans cette issue. ## Décisions prises en planification - Catégories et mots-clés en 5ᵉ (avant le classement), Rapports en 8ᵉ (Max, 2026-10-12). - Validation des étapes de visite par « J'ai compris » ; « Passer cette étape » reste à côté (Max, 2026-10-12). - Cochage d'office des deux étapes pour un profil dont le parcours était complet (Max, 2026-10-12), sans transaction (Max, 2026-10-12, après revue). - L'étape de classement garde son critère ; sa carte (#430) guide vers « Ajouter comme mot-clé ». ## Conventions - Toute chaîne en FR et en EN (`src/i18n/locales/fr.json`, `en.json`) ; les textes de ce corps s'écrivent mot pour mot (FR validé par Max le 2026-10-12, EN rédigé sur le même contenu). - CHANGELOG : une entrée sous `## [Unreleased]` dans `CHANGELOG.md` et `CHANGELOG.fr.md`. - Tests de rendu : `renderToStaticMarkup` (pas de jsdom) et le faux `t` partagé livré par #389. - Aucune migration : tout l'état vit dans `user_preferences` (ADR 0016). `npm run build` (il vérifie aussi les types des fichiers de test) et `npm test` verts. - Guide Markdown (`docs/guide-utilisateur.md`) : repérer une ligne par son texte cité, pas par son numéro. ## CHANGELOG Added / Ajouté : FR « Parcours de démarrage : deux étapes de visite, « Parcourir les catégories et les mots-clés » (avant le classement) et « Parcourir les rapports » (en dernier), cochées par « J'ai compris » ; un profil qui avait terminé le parcours les trouve déjà faites. » EN "Getting started: two visit steps, “Browse categories and keywords” (before categorizing) and “Browse the reports” (last), checked with “Got it”; a profile that had finished the path finds them already done." (#432 complète cette entrée.) ## Spec source `spec-plan-retours-onboarding-v0171.md` (local, ignoré par git) ; décisions dans `spec-decisions-retours-onboarding-v0171.md`.
maximus added the
status:ready
type:feature
source:human
labels 2026-10-12 21:07:17 +00:00
Author
Owner

Planification du 2026-10-12 (/plan-run, jalon planned-2026-10-12-retours-onboarding-v0171) : le corps est réécrit pour être autosuffisant (décisions de Max, constats de /review-spec intégrés) ; les cartes des deux pages passent dans #432. Corps précédent ci-dessous.

Corps précédent (titre : Parcours de démarrage : deux étapes de visite, Catégories et mots-clés (avant le classement) puis Rapports (en dernier), cochées par « J'ai compris »)

Contexte

Issu des retours de Max sur la v0.17.1 (#422, analysée le 2026-10-12 sur main à 1954502) : « ajouter une étape pour parcourir la section catégorie et mots clés fait plus tôt, et parcours rapide de la page rapport ».

La spec de la phase 2 excluait de changer les six lignes de la liste (spec-decisions-onboarding-parcours-guide.md, section OUT). Cette issue lève l'exclusion, à la demande de Max.

Aujourd'hui, chaque étape se coche par un compteur SQL (getOnboardingSnapshot, src/services/onboardingService.ts). Aucune ne se coche par une visite, et les deux nouvelles n'ont rien que la base puisse compter.

Décisions (Max, 2026-10-12)

Question Décision
Place de l'étape Catégories et mots-clés 5ᵉ, juste avant « Classer une transaction à la main ». Sa carte annonce qu'un mot-clé sera ajouté à l'étape suivante.
Place de l'étape Rapports Dernière (8ᵉ).
Comment se cochent-elles ? Un bouton « J'ai compris » sur leur carte coche l'étape « faite ». Une préférence par profil dans user_preferences, comme les étapes passées : aucune migration. Une visite sans clic ne coche rien.
L'étape de classement exige-t-elle un mot-clé ? Non. Son critère ne change pas ; sa carte guide vers « Ajouter comme mot-clé » (#422).

Nouvel ordre :

  1. Créer un profil
  2. Choisir un dossier d'import
  3. Configurer une source d'import
  4. Importer un premier fichier
  5. Parcourir les catégories et les mots-clés (nouveau, /categories)
  6. Classer une transaction à la main
  7. Saisir un premier budget (verrouillé hors Base+)
  8. Parcourir les rapports (nouveau, /reports)

Défauts retenus par l'analyse

  • Éditions. Les deux étapes comptent dans toutes les éditions : /categories et le hub /reports ne sont derrière aucun RequireFeature (src/App.tsx). Total : 8 en Base+, 7 en Gratuite, où Budget reste verrouillé.
  • Boutons. Leur carte garde « Passer cette étape » à côté de « J'ai compris », comme toutes les cartes (D3). « Passée » et « faite » restent distinctes dans la liste ; une étape faite n'y a plus de lien.
  • Préférence. onboarding_acknowledged_<clé> = « 1 », sur le modèle de onboarding_skipped_<clé> (onboardingService.ts:35-37), lue dans getOnboardingSnapshot et filtrée sur les clés valides.
  • Carte Catégories.
    • 2 à 3 phrases (D2) : un mot-clé classe d'office, dès l'import, les transactions dont la description le contient, et le plus prioritaire l'emporte ; « Tous les mots-clés » les liste ; à l'étape suivante, vous ajouterez un mot-clé.
    • Cible : le bouton « Tous les mots-clés » (categories.allKeywords, src/pages/CategoriesPage.tsx:47-57), présent sur tout profil.
    • Jamais « Réinitialiser » : il supprime les mots-clés, déclasse toutes les transactions et recrée l'ancienne taxonomie (reinitializeCategories, src/services/categoryService.ts:215).
  • Carte Rapports.
    • Le sélecteur de période, le panneau de faits saillants et les cartes de rapports. En Gratuite, quatre cartes sur cinq portent un cadenas (Base et plus) et seule Tendances s'ouvre (src/pages/ReportsPage.tsx, src/shared/entitlements.ts:26).
    • Cible : la carte Tendances, ouverte dans toutes les éditions.
  • Profils existants.
    • Un profil dont le parcours est masqué (« Masquer », « Fermer » en fin de parcours, règle D9) ne voit rien de nouveau.
    • Un profil qui affiche « Démarrage terminé » sans l'avoir fermé repasse à 6/8 et revoit le bandeau avec les deux nouvelles étapes. Défaut accepté tant qu'il n'y a pas d'autres utilisateurs que les testeurs (constat de Max du 2026-10-03) ; à revoir sinon.

Travail à faire

  • Types : ChecklistItemKey et CHECKLIST_ITEM_KEYS (src/shared/types/index.ts:970-986) avec categories et reports, dans l'ordre ci-dessus.
  • computeChecklist (src/utils/onboardingChecklist.ts:35-69) : huit lignes, et une option acknowledged (étapes cochées par « J'ai compris ») qui fait le done des deux étapes de visite.
  • onboardingService.ts : acknowledgeStep(clé), et lecture des préférences onboarding_acknowledged_<clé> dans getOnboardingSnapshot.
  • Fournisseur (useOnboardingChecklist, OnboardingContext) : action acknowledge(clé), qui prime comme SKIP sur le snapshot d'un chargement parti avant elle.
  • onboardingPath.ts : /categories et /reports dans CARD_PAGES et PAGE_STEPS ; modèles categoriesCardModel et reportsCardModel.
  • StepCard : « J'ai compris » pour une étape de visite (nouvelle prop) ; après le clic, « Fait. » puis l'étape suivante, comme les autres cartes.
  • CategoriesPage et ReportsPage : la carte connectée, et la mise en évidence de la cible par onboardingTargetAttributes.
  • i18n FR et EN : onboarding.checklist.items.categories et .reports, phrases des cartes, libellé « J'ai compris ».
  • Docs :
    • guide §1 (« Démarrage rapide » et « Le parcours de démarrage ») : huit étapes, et 7/7 au lieu de 5/5 en Gratuite ;
    • docs.gettingStarted FR et EN ;
    • docs/architecture.md, section Onboarding : huit lignes, préférence onboarding_acknowledged_<clé>, ligne user_preferences du tableau des tables ;
    • liste QA docs/qa-onboarding.html ;
    • CHANGELOG FR et EN (« Added » / « Ajouté »).

Fichiers concernés

  • src/shared/types/index.ts, src/utils/onboardingChecklist.ts, src/utils/onboardingPath.ts
  • src/services/onboardingService.ts, src/hooks/useOnboardingChecklist.ts, src/contexts/OnboardingContext.tsx
  • src/components/onboarding/StepCard.tsx, src/components/onboarding/OnboardingStepCard.tsx, src/components/dashboard/OnboardingChecklist.tsx
  • src/pages/CategoriesPage.tsx, src/pages/ReportsPage.tsx (et le composant qui porte la carte Tendances)
  • src/i18n/locales/fr.json, src/i18n/locales/en.json
  • docs/guide-utilisateur.md, docs/architecture.md, docs/qa-onboarding.html, CHANGELOG.md, CHANGELOG.fr.md

Surface de test

  • Tests existants : src/utils/onboardingChecklist.test.ts, src/utils/onboardingPath.test.ts, src/services/onboardingService.test.ts, src/hooks/useOnboardingChecklist.test.ts et .wiring.test.ts, src/contexts/OnboardingContext.render.test.tsx, src/components/onboarding/StepCard.render.test.tsx, src/components/onboarding/OnboardingStepCard.test.tsx, src/components/dashboard/OnboardingChecklist.test.tsx.
  • Tests à ajouter :
    • huit lignes dans l'ordre ; totaux 8 et 7 ; une étape reconnue est faite, pas passée ;
    • acknowledgeStep écrit la bonne clé, et getOnboardingSnapshot ne garde que les clés valides à « 1 » ;
    • reducer : ACKNOWLEDGE prime sur un chargement parti avant lui ;
    • cardStep et cardNext sur /categories et /reports : la carte Catégories mène à « Classer une transaction à la main », la carte Rapports à la fin ;
    • « J'ai compris » n'apparaît que sur une étape de visite.
  • Rappel #389 : le faux t des tests de rendu rend la clé brute, un t oublié passe inaperçu.
  • Test de régression : non (fonctionnalité).

Critères d'acceptation

  • Un profil neuf voit « Démarrage n/8 » en Base+, « n/7 » en Gratuite.
  • Après l'import, l'étape suivante mène à /categories ; la carte explique les mots-clés, entoure « Tous les mots-clés » et annonce l'ajout d'un mot-clé à l'étape suivante.
  • « J'ai compris » coche l'étape ; la carte annonce « Fait. » et mène à « Classer une transaction à la main ».
  • La dernière étape mène à /reports ; « J'ai compris » y termine le parcours (« Démarrage terminé »).
  • Ouvrir /categories ou /reports sans cliquer ne coche rien.
  • Un profil masqué ne voit rien de nouveau.
  • FR et EN complets ; npm test et npm run build verts.

Complexité estimée

Moyenne à complexe : une nouvelle sorte d'étape, de visite, à travers le service, le reducer, le modèle pur, la carte et deux pages, plus les docs et la liste QA.

Dépendances

Après #422 : mêmes fichiers (fr.json, en.json, onboardingPath.ts, guide, CHANGELOG, liste QA), et la carte Catégories annonce ce que la carte Transactions de #422 explique. À enchaîner, pas en parallèle.

Questions ouvertes

Aucune ; les défauts ci-dessus sont tranchés pour l'implémentation.

Planification du 2026-10-12 (`/plan-run`, jalon `planned-2026-10-12-retours-onboarding-v0171`) : le corps est réécrit pour être autosuffisant (décisions de Max, constats de `/review-spec` intégrés) ; les cartes des deux pages passent dans #432. Corps précédent ci-dessous. <details><summary>Corps précédent (titre : Parcours de démarrage : deux étapes de visite, Catégories et mots-clés (avant le classement) puis Rapports (en dernier), cochées par « J'ai compris »)</summary> ## Contexte Issu des retours de Max sur la v0.17.1 (#422, analysée le 2026-10-12 sur `main` à `1954502`) : « ajouter une étape pour parcourir la section catégorie et mots clés fait plus tôt, et parcours rapide de la page rapport ». La spec de la phase 2 excluait de changer les six lignes de la liste (`spec-decisions-onboarding-parcours-guide.md`, section OUT). Cette issue lève l'exclusion, à la demande de Max. Aujourd'hui, chaque étape se coche par un compteur SQL (`getOnboardingSnapshot`, `src/services/onboardingService.ts`). Aucune ne se coche par une visite, et les deux nouvelles n'ont rien que la base puisse compter. ## Décisions (Max, 2026-10-12) | Question | Décision | |---|---| | Place de l'étape Catégories et mots-clés | 5ᵉ, juste avant « Classer une transaction à la main ». Sa carte annonce qu'un mot-clé sera ajouté à l'étape suivante. | | Place de l'étape Rapports | Dernière (8ᵉ). | | Comment se cochent-elles ? | Un bouton « J'ai compris » sur leur carte coche l'étape « faite ». Une préférence par profil dans `user_preferences`, comme les étapes passées : aucune migration. Une visite sans clic ne coche rien. | | L'étape de classement exige-t-elle un mot-clé ? | Non. Son critère ne change pas ; sa carte guide vers « Ajouter comme mot-clé » (#422). | Nouvel ordre : 1. Créer un profil 2. Choisir un dossier d'import 3. Configurer une source d'import 4. Importer un premier fichier 5. **Parcourir les catégories et les mots-clés** (nouveau, `/categories`) 6. Classer une transaction à la main 7. Saisir un premier budget (verrouillé hors Base+) 8. **Parcourir les rapports** (nouveau, `/reports`) ## Défauts retenus par l'analyse - **Éditions.** Les deux étapes comptent dans toutes les éditions : `/categories` et le hub `/reports` ne sont derrière aucun `RequireFeature` (`src/App.tsx`). Total : 8 en Base+, 7 en Gratuite, où Budget reste verrouillé. - **Boutons.** Leur carte garde « Passer cette étape » à côté de « J'ai compris », comme toutes les cartes (D3). « Passée » et « faite » restent distinctes dans la liste ; une étape faite n'y a plus de lien. - **Préférence.** `onboarding_acknowledged_<clé>` = « 1 », sur le modèle de `onboarding_skipped_<clé>` (`onboardingService.ts:35-37`), lue dans `getOnboardingSnapshot` et filtrée sur les clés valides. - **Carte Catégories.** - 2 à 3 phrases (D2) : un mot-clé classe d'office, dès l'import, les transactions dont la description le contient, et le plus prioritaire l'emporte ; « Tous les mots-clés » les liste ; à l'étape suivante, vous ajouterez un mot-clé. - Cible : le bouton « Tous les mots-clés » (`categories.allKeywords`, `src/pages/CategoriesPage.tsx:47-57`), présent sur tout profil. - Jamais « Réinitialiser » : il supprime les mots-clés, déclasse toutes les transactions et recrée l'ancienne taxonomie (`reinitializeCategories`, `src/services/categoryService.ts:215`). - **Carte Rapports.** - Le sélecteur de période, le panneau de faits saillants et les cartes de rapports. En Gratuite, quatre cartes sur cinq portent un cadenas (Base et plus) et seule Tendances s'ouvre (`src/pages/ReportsPage.tsx`, `src/shared/entitlements.ts:26`). - Cible : la carte Tendances, ouverte dans toutes les éditions. - **Profils existants.** - Un profil dont le parcours est masqué (« Masquer », « Fermer » en fin de parcours, règle D9) ne voit rien de nouveau. - Un profil qui affiche « Démarrage terminé » sans l'avoir fermé repasse à 6/8 et revoit le bandeau avec les deux nouvelles étapes. Défaut accepté tant qu'il n'y a pas d'autres utilisateurs que les testeurs (constat de Max du 2026-10-03) ; à revoir sinon. ## Travail à faire - [ ] Types : `ChecklistItemKey` et `CHECKLIST_ITEM_KEYS` (`src/shared/types/index.ts:970-986`) avec `categories` et `reports`, dans l'ordre ci-dessus. - [ ] `computeChecklist` (`src/utils/onboardingChecklist.ts:35-69`) : huit lignes, et une option `acknowledged` (étapes cochées par « J'ai compris ») qui fait le `done` des deux étapes de visite. - [ ] `onboardingService.ts` : `acknowledgeStep(clé)`, et lecture des préférences `onboarding_acknowledged_<clé>` dans `getOnboardingSnapshot`. - [ ] Fournisseur (`useOnboardingChecklist`, `OnboardingContext`) : action `acknowledge(clé)`, qui prime comme `SKIP` sur le snapshot d'un chargement parti avant elle. - [ ] `onboardingPath.ts` : `/categories` et `/reports` dans `CARD_PAGES` et `PAGE_STEPS` ; modèles `categoriesCardModel` et `reportsCardModel`. - [ ] `StepCard` : « J'ai compris » pour une étape de visite (nouvelle prop) ; après le clic, « Fait. » puis l'étape suivante, comme les autres cartes. - [ ] `CategoriesPage` et `ReportsPage` : la carte connectée, et la mise en évidence de la cible par `onboardingTargetAttributes`. - [ ] i18n FR et EN : `onboarding.checklist.items.categories` et `.reports`, phrases des cartes, libellé « J'ai compris ». - [ ] Docs : - guide §1 (« Démarrage rapide » et « Le parcours de démarrage ») : huit étapes, et 7/7 au lieu de 5/5 en Gratuite ; - `docs.gettingStarted` FR et EN ; - `docs/architecture.md`, section Onboarding : huit lignes, préférence `onboarding_acknowledged_<clé>`, ligne `user_preferences` du tableau des tables ; - liste QA `docs/qa-onboarding.html` ; - CHANGELOG FR et EN (« Added » / « Ajouté »). ## Fichiers concernés - `src/shared/types/index.ts`, `src/utils/onboardingChecklist.ts`, `src/utils/onboardingPath.ts` - `src/services/onboardingService.ts`, `src/hooks/useOnboardingChecklist.ts`, `src/contexts/OnboardingContext.tsx` - `src/components/onboarding/StepCard.tsx`, `src/components/onboarding/OnboardingStepCard.tsx`, `src/components/dashboard/OnboardingChecklist.tsx` - `src/pages/CategoriesPage.tsx`, `src/pages/ReportsPage.tsx` (et le composant qui porte la carte Tendances) - `src/i18n/locales/fr.json`, `src/i18n/locales/en.json` - `docs/guide-utilisateur.md`, `docs/architecture.md`, `docs/qa-onboarding.html`, `CHANGELOG.md`, `CHANGELOG.fr.md` ## Surface de test - Tests existants : `src/utils/onboardingChecklist.test.ts`, `src/utils/onboardingPath.test.ts`, `src/services/onboardingService.test.ts`, `src/hooks/useOnboardingChecklist.test.ts` et `.wiring.test.ts`, `src/contexts/OnboardingContext.render.test.tsx`, `src/components/onboarding/StepCard.render.test.tsx`, `src/components/onboarding/OnboardingStepCard.test.tsx`, `src/components/dashboard/OnboardingChecklist.test.tsx`. - Tests à ajouter : - huit lignes dans l'ordre ; totaux 8 et 7 ; une étape reconnue est faite, pas passée ; - `acknowledgeStep` écrit la bonne clé, et `getOnboardingSnapshot` ne garde que les clés valides à « 1 » ; - reducer : `ACKNOWLEDGE` prime sur un chargement parti avant lui ; - `cardStep` et `cardNext` sur `/categories` et `/reports` : la carte Catégories mène à « Classer une transaction à la main », la carte Rapports à la fin ; - « J'ai compris » n'apparaît que sur une étape de visite. - Rappel #389 : le faux `t` des tests de rendu rend la clé brute, un `t` oublié passe inaperçu. - Test de régression : non (fonctionnalité). ## Critères d'acceptation - [ ] Un profil neuf voit « Démarrage n/8 » en Base+, « n/7 » en Gratuite. - [ ] Après l'import, l'étape suivante mène à `/categories` ; la carte explique les mots-clés, entoure « Tous les mots-clés » et annonce l'ajout d'un mot-clé à l'étape suivante. - [ ] « J'ai compris » coche l'étape ; la carte annonce « Fait. » et mène à « Classer une transaction à la main ». - [ ] La dernière étape mène à `/reports` ; « J'ai compris » y termine le parcours (« Démarrage terminé »). - [ ] Ouvrir `/categories` ou `/reports` sans cliquer ne coche rien. - [ ] Un profil masqué ne voit rien de nouveau. - [ ] FR et EN complets ; `npm test` et `npm run build` verts. ## Complexité estimée Moyenne à complexe : une nouvelle sorte d'étape, de visite, à travers le service, le reducer, le modèle pur, la carte et deux pages, plus les docs et la liste QA. ## Dépendances Après #422 : mêmes fichiers (`fr.json`, `en.json`, `onboardingPath.ts`, guide, CHANGELOG, liste QA), et la carte Catégories annonce ce que la carte Transactions de #422 explique. À enchaîner, pas en parallèle. ## Questions ouvertes Aucune ; les défauts ci-dessus sont tranchés pour l'implémentation. </details>
maximus changed title from Parcours de démarrage : deux étapes de visite, Catégories et mots-clés (avant le classement) puis Rapports (en dernier), cochées par « J'ai compris » to Parcours de démarrage : socle des étapes de visite (huit lignes, « J'ai compris », cochage d'office) 2026-10-12 23:26:22 +00:00
maximus added this to the planned-2026-10-12-retours-onboarding-v0171 milestone 2026-10-12 23:26:22 +00:00
maximus added
status:in-progress
and removed
status:ready
labels 2026-10-14 01:20:55 +00:00
maximus added
status:review
and removed
status:in-progress
labels 2026-10-14 01:38:39 +00:00
maximus added
status:approved
and removed
status:review
labels 2026-10-14 23:59:52 +00:00
maximus removed the
status:approved
label 2026-10-16 00:38:16 +00:00
Sign in to join this conversation.
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: maximus/Simpl-Resultat#425
No description provided.