Suivis des revues de la pile #438 à #445 (retours onboarding v0.17.1) : garde i18n FR/EN, épingles, textes #446

Open
opened 2026-10-16 00:38:40 +00:00 by maximus · 0 comments
Owner

Contexte

Suivis non bloquants des huit /pr-review APPROVE de la pile #438 → #445 (milestone planned-2026-10-12-retours-onboarding-v0171, mergée en avance rapide le 2026-10-15, main 934bcbf). Rien de bloquant : épingles manquantes, textes à reprendre, dérives de doc. Chaque point cite la revue qui l'a relevé.

Analyse (2026-10-16, main d8037be)

Points du corps d'origine retirés après lecture du code :

  • « Étape suivante » avant l'initialisation des visites (#444) : pas de défaut. nextStep (src/utils/onboardingPath.ts:24-26) prend la première ligne ni locked, ni done, ni skipped, et les deux étapes de visite sont locked tant que visitStepsInitialized est faux (src/utils/onboardingChecklist.ts:55,72,80).
  • « deux comptes fictifs » (#439) : un dossier d'exemple = un compte, le texte validé dans #422 reste exact. Décision de Max (2026-10-16) : garder tel quel.
  • Process (Resolves #N en tête du corps de PR, commit avant la première mutation) : les deux règles sont déjà dans le gabarit worker de /autopilot (SKILL.md l. 148-159 et 181).
  • Catégorie de niveau 1 dont tous les enfants sont non saisissables (#438) : aucune reproduction trouvée dans src/services/budgetService.ts (buildSubGroup, l. 375-405 : un sous-groupe sans descendant saisissable est retiré, pas affiché). Hors périmètre tant qu'un cas concret n'est pas fourni ; à rouvrir avec un arbre reproductible.

Points confirmés, avec l'état exact du code :

  • Garde i18n : aucun test ne compare les arbres de clés de fr.json et en.json. DocsContent.locales.test.ts ne couvre que docs.* (longueurs et ids), onboardingPath.locales.test.ts les interpolations de trois phrases, entitlements.test.ts:134-153 les clés upsell.features, i18n-mock-guard.test.ts les faux t. Les deux arbres ont 1412 feuilles identiques aujourd'hui, sans garde.
  • reorderRows : les cinq tests de src/utils/reorderRows.test.ts couvrent une feuille après un sous-groupe déplié ; aucun sous-groupe replié (ligne is_parent sans ligne enfant) suivi d'une feuille sœur.
  • Point du bandeau : OnboardingBanner.tsx:104-106 n'affiche le point (span aria-hidden h-1 w-1) que si totalKnown && nextStep, avec totalKnown = budgetReady && visitStepsInitialized (l. 73). Le cas visitStepsInitialized=false existe (OnboardingBanner.render.test.tsx:127) mais n'asserte que l'absence du compteur.
  • Scan après un changement de dossier : SET_IMPORT_FOLDER (src/hooks/useImportWizard.ts:219-221) ne vide ni rootFiles ni scannedSources ; seul SET_SCANNED_SOURCES les remplace. Entre le changement de dossier et la fin du nouveau scan, ImportPage (l. 62-63) affiche l'avertissement des fichiers à la racine de l'ancien dossier sous le nom du nouveau. Aucun test ne fige ce comportement.
  • Ctrl+clic sur Tendances (#445) : HubReportNavCard passe onNavigate au onClick du Link ; React tire onClick sur Ctrl+clic, pas sur le clic du milieu (onAuxClick). Sans onglets dans le webview Tauri, le risque reste théorique : à documenter, pas à corriger.
  • Textes : docs.dashboard.features[6] (FR l. 981) dit « huit étapes qui se cochent d'elles-mêmes » ; reports.help.tips[2] et [3] nomment « Tendances mensuelles » et « Catégories dans le temps », noms d'onglets disparus, alors que les cartes s'appellent reports.hub.trends (« Tendances ») et reports.hub.categoryZoom (« Analyse par catégorie »). La puce [0] nomme déjà les cinq rapports.
  • Docs : 135 composants .tsx hors tests sous src/components (balance 12, import 18, reports 35, settings 17, shared 13…) ; docs/architecture.md:29 dit 61, CLAUDE.md:41 dit 53 ; architecture.md:567 dit « 4 cartes de navigation » pour /reports, il y en a 5.

Travail à faire

Tests et épingles

  • Garde des clés i18n : un test qui aplatit les feuilles de fr.json et en.json (import JSON statique, comme DocsContent.locales.test.ts:13-14) et compare les deux ensembles de clés triés, avec les clés manquantes dans le message d'échec. Mutation : retirer import.config.sourceNameHint de en.json doit rougir. Emplacement proposé : src/i18n/locales.keys.test.ts.
  • reorderRows : un test « sous-groupe replié suivi d'une feuille sœur », par exemple [sub("A",0), sub("Vide",1), leaf("z",1)] avec subtotalsOnTop=false ; ordre attendu à établir en l'exécutant (présumé Vide, z, A), puis une variante suivie d'une racine sœur.
  • Point du bandeau : dans le cas visitStepsInitialized=false de OnboardingBanner.render.test.tsx:127, asserter l'absence du span h-1 w-1, et sa présence dans un cas totalKnown avec nextStep. Mutation : totalKnown = budgetReady seul doit rougir.
  • Avertissement des fichiers à la racine après un changement de dossier : SET_IMPORT_FOLDER vide rootFiles (hypothèse retenue par l'analyse, le point ne dépendant d'aucune décision produit) ; test du reducer dans useImportWizard.test.ts à côté de « a scan error leaves the root files of the last scan in place » (l. 216). Vider aussi scannedSources seulement si l'état vide de ImportPage ne clignote pas pendant le scan, sinon le documenter comme comportement antérieur.

Textes (validés par Max le 2026-10-16)

  • docs.dashboard.features[6] FR : « Carte d'accueil d'un profil sans transaction, avec la liste de démarrage : huit étapes, cochées selon vos données ou par « J'ai compris » pour les visites, et un bouton « Masquer » ». EN aligné.
  • reports.help.tips[2] FR : « Tendances montre vos revenus et dépenses mois par mois sur 12 mois » ; EN : « Trends shows your income and expenses month by month over 12 months ».
  • reports.help.tips[3] FR : « Analyse par catégorie suit l'évolution d'une catégorie dans le temps » ; EN : « Category Analysis tracks how a single category evolves over time ».
  • Ces trois clés sont dans docs.* ou dans l'aide de page : vérifier que DocsContent.locales.test.ts et PageHelp restent verts.

Documentation

  • docs/architecture.md:567 : « 5 cartes de navigation » (Faits saillants, Tendances, Comparables, Analyse par catégorie, Cartes).
  • docs/architecture.md:29 et CLAUDE.md:41 : compte des composants recalculé (135 au 2026-10-16) et par domaine à la ligne 30 (balance 12, pas 8).
  • Note dans docs/architecture.md (section onboarding ou Rapports) : Ctrl+clic sur la carte Tendances coche l'étape « Parcourir les rapports » ; sans onglets dans le webview, sans effet visible.

Fichiers concernés

  • src/i18n/locales/fr.json, src/i18n/locales/en.json : textes ; nouveau test src/i18n/locales.keys.test.ts
  • src/utils/reorderRows.test.ts
  • src/components/onboarding/OnboardingBanner.render.test.tsx
  • src/hooks/useImportWizard.ts (l. 219-221), src/hooks/useImportWizard.test.ts
  • docs/architecture.md, CLAUDE.md

Surface de test

  • Tests existants : DocsContent.locales.test.ts, onboardingPath.locales.test.ts, reorderRows.test.ts, OnboardingBanner.render.test.tsx, useImportWizard.test.ts, ImportPage.render.test.tsx:307-367.
  • Test de régression requis : oui pour le changement de dossier (reducer) ; les autres sont des épingles.

Critères d'acceptation

  • Une clé présente dans une seule langue fait échouer npm test, mutation citée dans la PR.
  • reorderRows : sous-groupe replié suivi d'une feuille sœur épinglé.
  • Point du bandeau : mutation totalKnown = budgetReady rouge.
  • Après SET_IMPORT_FOLDER, rootFiles est vide jusqu'au prochain scan, test du reducer.
  • Les trois textes ci-dessus en FR et EN ; CHANGELOG (Modifié / Changed) dans les deux fichiers.
  • architecture.md et CLAUDE.md à jour (5 cartes, compte des composants).

Vérifications manuelles dues (dans l'app, avant la prochaine release)

Cas de la section « Retours de la v0.17.1 » de docs/qa-onboarding.html et parcours guidé à huit étapes, en particulier v0171-import-source-reopen, v0171-budget-card-leaves, l'encadré « Structure attendue » dans les deux thèmes, et la première ouverture d'un profil qui avait fini le parcours. Hors de cette issue, suivies dans STATE.md (Blockers).

Complexité

Medium (volume, pas de difficulté).


Plan d'exécution — milestone lot-v018 (planifié le 2026-10-16)

Les sections ci-dessous viennent de la séance /plan-run du 2026-10-16 (revue /review-spec Sécurité, Architecture, Technique comprise). En cas de conflit avec le corps au-dessus, elles priment.

Consignes communes

  • Préflight : #369, #419 et #421 sont fermées et le tag v0.17.2 existe (git ls-remote --tags origin v0.17.2). Sinon, arrêt sans rien écrire.
  • Les numéros de ligne du corps ont été lus sur main 065f580 ; #369, #419 et #421 les ont déplacés depuis. Repérer chaque site par son contenu (symbole, chaîne), jamais par son numéro.
  • Toute clé i18n ajoutée l'est en FR et en EN (garde de #453, en tête de pile).
  • Les vérifications manuelles (app lancée) vont dans le corps de la PR et le DAILY-REPORT, pas dans STATE.md : le report dans STATE.md se fait au /merge-stack.

Depends on

Note : dépendance de contenu. Le compte des composants doit inclure ceux ajoutés par les maillons précédents.

Décisions prises en planification

  • La case « Garde des clés i18n » est sortie dans #453 (Max), en tête de pile. Elle est hors portée ici. Les critères « Une clé présente dans une seule langue fait échouer npm test » et la mutation import.config.sourceNameHint sont portés par #453.
  • Avertissement des fichiers à la racine : SET_IMPORT_FOLDER vide rootFiles seulement. scannedSources n'est pas touché : son effet visuel (clignotement de l'état vide) n'est pas observable par un worker sans écran. La PR le documente comme comportement antérieur et l'ajoute aux vérifications manuelles.
  • reorderRows : épingler l'ordre obtenu en exécutant le cas. Si cet ordre n'est pas Vide, z, A (ordre présumé), arrêter : décision HIGH, à consigner dans le DAILY-REPORT sans épingler un ordre peut-être faux.
  • Compte des composants : pas de chiffre recopié (« 135 » est périmé, #369 et #393 en ajoutent). Le recalculer sur le tip du maillon avec une commande citée dans la PR, par exemple find src/components -name '*.tsx' ! -name '*.test.tsx' | wc -l, par domaine aussi. Inclure dans la même passe la ligne « import (14 composants) » de l'arborescence de CLAUDE.md.

Spec source

spec-plan-lot-v018.md

## Contexte Suivis non bloquants des huit `/pr-review` APPROVE de la pile #438 → #445 (milestone `planned-2026-10-12-retours-onboarding-v0171`, mergée en avance rapide le 2026-10-15, `main` `934bcbf`). Rien de bloquant : épingles manquantes, textes à reprendre, dérives de doc. Chaque point cite la revue qui l'a relevé. ## Analyse (2026-10-16, `main` `d8037be`) Points du corps d'origine retirés après lecture du code : - **« Étape suivante » avant l'initialisation des visites** (#444) : pas de défaut. `nextStep` (`src/utils/onboardingPath.ts:24-26`) prend la première ligne ni `locked`, ni `done`, ni `skipped`, et les deux étapes de visite sont `locked` tant que `visitStepsInitialized` est faux (`src/utils/onboardingChecklist.ts:55,72,80`). - **« deux comptes fictifs »** (#439) : un dossier d'exemple = un compte, le texte validé dans #422 reste exact. **Décision de Max (2026-10-16)** : garder tel quel. - **Process** (`Resolves #N` en tête du corps de PR, commit avant la première mutation) : les deux règles sont déjà dans le gabarit worker de `/autopilot` (`SKILL.md` l. 148-159 et 181). - **Catégorie de niveau 1 dont tous les enfants sont non saisissables** (#438) : aucune reproduction trouvée dans `src/services/budgetService.ts` (`buildSubGroup`, l. 375-405 : un sous-groupe sans descendant saisissable est retiré, pas affiché). Hors périmètre tant qu'un cas concret n'est pas fourni ; à rouvrir avec un arbre reproductible. Points confirmés, avec l'état exact du code : - **Garde i18n** : aucun test ne compare les arbres de clés de `fr.json` et `en.json`. `DocsContent.locales.test.ts` ne couvre que `docs.*` (longueurs et ids), `onboardingPath.locales.test.ts` les interpolations de trois phrases, `entitlements.test.ts:134-153` les clés `upsell.features`, `i18n-mock-guard.test.ts` les faux `t`. Les deux arbres ont 1412 feuilles identiques aujourd'hui, sans garde. - **`reorderRows`** : les cinq tests de `src/utils/reorderRows.test.ts` couvrent une feuille après un sous-groupe déplié ; aucun sous-groupe replié (ligne `is_parent` sans ligne enfant) suivi d'une feuille sœur. - **Point du bandeau** : `OnboardingBanner.tsx:104-106` n'affiche le point (`span` `aria-hidden` `h-1 w-1`) que si `totalKnown && nextStep`, avec `totalKnown = budgetReady && visitStepsInitialized` (l. 73). Le cas `visitStepsInitialized=false` existe (`OnboardingBanner.render.test.tsx:127`) mais n'asserte que l'absence du compteur. - **Scan après un changement de dossier** : `SET_IMPORT_FOLDER` (`src/hooks/useImportWizard.ts:219-221`) ne vide ni `rootFiles` ni `scannedSources` ; seul `SET_SCANNED_SOURCES` les remplace. Entre le changement de dossier et la fin du nouveau scan, `ImportPage` (l. 62-63) affiche l'avertissement des fichiers à la racine de l'ancien dossier sous le nom du nouveau. Aucun test ne fige ce comportement. - **Ctrl+clic sur Tendances** (#445) : `HubReportNavCard` passe `onNavigate` au `onClick` du `Link` ; React tire `onClick` sur Ctrl+clic, pas sur le clic du milieu (`onAuxClick`). Sans onglets dans le webview Tauri, le risque reste théorique : à documenter, pas à corriger. - **Textes** : `docs.dashboard.features[6]` (FR l. 981) dit « huit étapes qui se cochent d'elles-mêmes » ; `reports.help.tips[2]` et `[3]` nomment « Tendances mensuelles » et « Catégories dans le temps », noms d'onglets disparus, alors que les cartes s'appellent `reports.hub.trends` (« Tendances ») et `reports.hub.categoryZoom` (« Analyse par catégorie »). La puce `[0]` nomme déjà les cinq rapports. - **Docs** : 135 composants `.tsx` hors tests sous `src/components` (balance 12, import 18, reports 35, settings 17, shared 13…) ; `docs/architecture.md:29` dit 61, `CLAUDE.md:41` dit 53 ; `architecture.md:567` dit « 4 cartes de navigation » pour `/reports`, il y en a 5. ## Travail à faire ### Tests et épingles - [ ] **Garde des clés i18n** : un test qui aplatit les feuilles de `fr.json` et `en.json` (import JSON statique, comme `DocsContent.locales.test.ts:13-14`) et compare les deux ensembles de clés triés, avec les clés manquantes dans le message d'échec. Mutation : retirer `import.config.sourceNameHint` de `en.json` doit rougir. Emplacement proposé : `src/i18n/locales.keys.test.ts`. - [ ] **`reorderRows`** : un test « sous-groupe replié suivi d'une feuille sœur », par exemple `[sub("A",0), sub("Vide",1), leaf("z",1)]` avec `subtotalsOnTop=false` ; ordre attendu à établir en l'exécutant (présumé `Vide, z, A`), puis une variante suivie d'une racine sœur. - [ ] **Point du bandeau** : dans le cas `visitStepsInitialized=false` de `OnboardingBanner.render.test.tsx:127`, asserter l'absence du `span` `h-1 w-1`, et sa présence dans un cas `totalKnown` avec `nextStep`. Mutation : `totalKnown = budgetReady` seul doit rougir. - [ ] **Avertissement des fichiers à la racine après un changement de dossier** : `SET_IMPORT_FOLDER` vide `rootFiles` (hypothèse retenue par l'analyse, le point ne dépendant d'aucune décision produit) ; test du reducer dans `useImportWizard.test.ts` à côté de « a scan error leaves the root files of the last scan in place » (l. 216). Vider aussi `scannedSources` seulement si l'état vide de `ImportPage` ne clignote pas pendant le scan, sinon le documenter comme comportement antérieur. ### Textes (validés par Max le 2026-10-16) - [ ] `docs.dashboard.features[6]` FR : « Carte d'accueil d'un profil sans transaction, avec la liste de démarrage : huit étapes, cochées selon vos données ou par « J'ai compris » pour les visites, et un bouton « Masquer » ». EN aligné. - [ ] `reports.help.tips[2]` FR : « Tendances montre vos revenus et dépenses mois par mois sur 12 mois » ; EN : « Trends shows your income and expenses month by month over 12 months ». - [ ] `reports.help.tips[3]` FR : « Analyse par catégorie suit l'évolution d'une catégorie dans le temps » ; EN : « Category Analysis tracks how a single category evolves over time ». - [ ] Ces trois clés sont dans `docs.*` ou dans l'aide de page : vérifier que `DocsContent.locales.test.ts` et `PageHelp` restent verts. ### Documentation - [ ] `docs/architecture.md:567` : « 5 cartes de navigation » (Faits saillants, Tendances, Comparables, Analyse par catégorie, Cartes). - [ ] `docs/architecture.md:29` et `CLAUDE.md:41` : compte des composants recalculé (135 au 2026-10-16) et par domaine à la ligne 30 (balance 12, pas 8). - [ ] Note dans `docs/architecture.md` (section onboarding ou Rapports) : Ctrl+clic sur la carte Tendances coche l'étape « Parcourir les rapports » ; sans onglets dans le webview, sans effet visible. ## Fichiers concernés - `src/i18n/locales/fr.json`, `src/i18n/locales/en.json` : textes ; nouveau test `src/i18n/locales.keys.test.ts` - `src/utils/reorderRows.test.ts` - `src/components/onboarding/OnboardingBanner.render.test.tsx` - `src/hooks/useImportWizard.ts` (l. 219-221), `src/hooks/useImportWizard.test.ts` - `docs/architecture.md`, `CLAUDE.md` ## Surface de test - Tests existants : `DocsContent.locales.test.ts`, `onboardingPath.locales.test.ts`, `reorderRows.test.ts`, `OnboardingBanner.render.test.tsx`, `useImportWizard.test.ts`, `ImportPage.render.test.tsx:307-367`. - Test de régression requis : oui pour le changement de dossier (reducer) ; les autres sont des épingles. ## Critères d'acceptation - [ ] Une clé présente dans une seule langue fait échouer `npm test`, mutation citée dans la PR. - [ ] `reorderRows` : sous-groupe replié suivi d'une feuille sœur épinglé. - [ ] Point du bandeau : mutation `totalKnown = budgetReady` rouge. - [ ] Après `SET_IMPORT_FOLDER`, `rootFiles` est vide jusqu'au prochain scan, test du reducer. - [ ] Les trois textes ci-dessus en FR et EN ; CHANGELOG (Modifié / Changed) dans les deux fichiers. - [ ] `architecture.md` et `CLAUDE.md` à jour (5 cartes, compte des composants). ## Vérifications manuelles dues (dans l'app, avant la prochaine release) Cas de la section « Retours de la v0.17.1 » de `docs/qa-onboarding.html` et parcours guidé à huit étapes, en particulier `v0171-import-source-reopen`, `v0171-budget-card-leaves`, l'encadré « Structure attendue » dans les deux thèmes, et la première ouverture d'un profil qui avait fini le parcours. Hors de cette issue, suivies dans `STATE.md` (Blockers). ## Complexité Medium (volume, pas de difficulté). --- # Plan d'exécution — milestone lot-v018 (planifié le 2026-10-16) Les sections ci-dessous viennent de la séance `/plan-run` du 2026-10-16 (revue `/review-spec` Sécurité, Architecture, Technique comprise). **En cas de conflit avec le corps au-dessus, elles priment.** ## Consignes communes - Préflight : #369, #419 et #421 sont fermées et le tag `v0.17.2` existe (`git ls-remote --tags origin v0.17.2`). Sinon, arrêt sans rien écrire. - Les numéros de ligne du corps ont été lus sur `main` `065f580` ; #369, #419 et #421 les ont déplacés depuis. Repérer chaque site par son contenu (symbole, chaîne), jamais par son numéro. - Toute clé i18n ajoutée l'est en FR et en EN (garde de #453, en tête de pile). - Les vérifications manuelles (app lancée) vont dans le corps de la PR et le DAILY-REPORT, pas dans `STATE.md` : le report dans `STATE.md` se fait au `/merge-stack`. ## Depends on - #384 Note : dépendance de contenu. Le compte des composants doit inclure ceux ajoutés par les maillons précédents. ## Décisions prises en planification - **La case « Garde des clés i18n » est sortie dans #453** (Max), en tête de pile. Elle est hors portée ici. Les critères « Une clé présente dans une seule langue fait échouer `npm test` » et la mutation `import.config.sourceNameHint` sont portés par #453. - **Avertissement des fichiers à la racine** : `SET_IMPORT_FOLDER` vide `rootFiles` seulement. `scannedSources` n'est pas touché : son effet visuel (clignotement de l'état vide) n'est pas observable par un worker sans écran. La PR le documente comme comportement antérieur et l'ajoute aux vérifications manuelles. - **`reorderRows`** : épingler l'ordre obtenu en exécutant le cas. Si cet ordre n'est pas `Vide, z, A` (ordre présumé), arrêter : décision HIGH, à consigner dans le DAILY-REPORT sans épingler un ordre peut-être faux. - **Compte des composants** : pas de chiffre recopié (« 135 » est périmé, #369 et #393 en ajoutent). Le recalculer sur le tip du maillon avec une commande citée dans la PR, par exemple `find src/components -name '*.tsx' ! -name '*.test.tsx' | wc -l`, par domaine aussi. Inclure dans la même passe la ligne « import (14 composants) » de l'arborescence de `CLAUDE.md`. ## Spec source spec-plan-lot-v018.md
maximus added the
status:triage
type:refactor
source:human
labels 2026-10-16 00:38:46 +00:00
maximus added
status:ready
and removed
status:triage
labels 2026-10-16 23:40:14 +00:00
maximus added this to the planned-2026-10-16-lot-v018 milestone 2026-10-17 00:14:26 +00:00
maximus added
status:in-progress
and removed
status:ready
labels 2026-10-19 00:52:23 +00:00
maximus added
status:review
and removed
status:in-progress
labels 2026-10-19 01:06:48 +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#446
No description provided.