docs(onboarding): user guide, architecture and QA checklist for the guided getting-started path #407
No reviewers
Labels
No labels
autopilot:pending-human
source:analyste
source:defenseur
source:human
source:medic
status:approved
status:blocked
status:in-progress
status:needs-clarification
status:needs-fix
status:ready
status:review
status:triage
type:bug
type:feature
type:infra
type:refactor
type:schema
type:security
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: maximus/Simpl-Resultat#407
Loading…
Reference in a new issue
No description provided.
Delete branch "issue-401-onboarding-guide-qa"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Resolves #401
Generated autonomously by /autopilot run of 2026-10-08
Ce qui change pour l'utilisateur
docs/guide-utilisateur.mdporte le même texte. Rien d'autre ne change dans l'application : seul le contenu du guide intégré est nouveau.Technique
src/i18n/locales/fr.jsoneten.json:docs.gettingStarted.subsections: une entrée, idgetting-started-path, neuf points et une note ;docs.gettingStarted.features, une astuce dansdocs.profiles.tips;docs.dashboard, une fonction et une étape dansdocs.settings.C'est la forme de
docs.import.subsections, queDocsSubsectionslit déjà : aucun code d'affichage ne change.src/components/settings/DocsContent.locales.test.ts(nouveau, 6 tests) lit les vrais fichiers de langue, ce que ne faisait aucun test :DocsSubsections.test.tsxtourne sur une fixture etDocsContentn'a pas de test.DocsContent.tsxexporteSECTIONSpour lui.docs/architecture.md: la section « Onboarding — états vides et parcours de démarrage » est réécrite, avec une sous-section « Parcours guidé » :useOnboarding();dataEventset l'ADR 0022 ;onboarding_checklist_hidden,onboarding_skipped_<clé>etonboarding_guided_initialized, et la règle D9 ;onboardingPath.ts, le bandeau, le verrou de carte etCARD_PAGES, les cartes d'étape ;Lignes rendues fausses par la pile et corrigées : le compte de
utils/(14 → 16) et la ligneuser_preferences.docs/qa-onboarding.html: cinq groupes, 41 cas, clé de stockagev2(voir Décisions).CHANGELOG.mdetCHANGELOG.fr.md: entrées de #396 à #400 réorganisées (voir Décisions), et une entrée #401.STATE.md: une puce dans « Blockers actifs ».Aucun changement Rust, aucune migration.
Preuves
npm run buildvert (tsc + vite).npx vitest run: 1885 → 1891 tests verts (108 → 109 fichiers).check-frontend, lue dans les logs : run 505 vert surd6f42db, puis run 506 vert sur la tête5c18fdd(build, 109 fichiers, 1891 tests).git diffnon vide vérifié, suite complète lancée, fichier restauré pargit checkout, arbre propre après chacune. Faite surd6f42db, puis refaite sur la tête5c18fddaprès l'auto-revue, avec les mêmes résultats.fr.json:stepsretiré de la sous-section du parcours (une clé que litDocsSubsections)en.json:docs.dashboard.stepsdevient une chaîneen.json: dernier point dedocs.settings.stepsretiré (FR et EN désynchronisés)fr.json: la sous-section reprend l'ancreimport-export4/4 rouges, toutes dans
DocsContent.locales.test.ts: aucun autre test ne lit ces clés, et les quatre mutations seraient restées vertes sans lui.docs.*des deux langues et dansarchitecture.md. Le seul « compact » restant décrit le panneau du hub Rapports (docs.reports).onboarding.*citée (onboarding.state.*, dansarchitecture.md) existe dans les deux.Décisions
Huit décisions, toutes dans le journal du run. Les principales :
DocsSubsectionslit déjà. Écartés : six astuces mêlées à la langue et au thème ; la section Tableau de bord, où le parcours ne vit plus ; une section de premier niveau, qui demanderait du code.docs.*: les tests du guide intégré tournent sur des fixtures, et la passe de mutations n'aurait rien prouvé. Écarté : livrer une passe verte en le signalant.v2, pour ne pas mêler les réponses de l'ancienne liste. La page renvoie àgit show v0.17.0:docs/qa-onboarding.htmlpour la vérification de la v0.17.0, encore due.architecture.md: seuls les comptes rendus faux par la pile sont corrigés ; les dérives antérieures (pages, sous-dossiers de composants) restent.Pour relire
executeImportécrit la ligneimported_filesencompletedavant d'insérer, et ne la repasse enerrorque si l'insertion lève.completedà 0 ligne, que compteCOUNTERS_SQL.importCardModel, assistant au repos).5c18fdd: le guide et l'entrée #398 disaient que la carte n'annonce jamais « Fait. » pour un import qui n'ajoute rien, alors qu'elle ne le retient que sur le rapport ; le test des clés ne dépend plus de l'ordre des sections dans les fichiers.DocsContent.locales.test.ts, puis la sous-section dansfr.jsoneten.json(texte identique au guide.md), puis la sous-section « Parcours guidé » d'architecture.md.ImportFolderConfig;fr.json,en.jsonet un test, donccheck-frontendtourne.🤖 Generated with Claude Code
Auto-revue (worker autopilot) — verdict : APPROVE, après une correction
Revue du diff de cette PR seule (
d76c387..5c18fdd, 10 fichiers) contre les critères de #401, la parité FR/EN et le code livré par #402 à #406. Cette auto-revue ne remplace pas une revue indépendante : l'issue reste enstatus:review, etstatus:approvedrevient à/pr-review.Critères d'acceptation
docs.*) décrit le parcours livré, en FR et en EN, sans barre compacte : sous-sectiongetting-started-path(neuf points et une note), sections Tableau de bord, Profils et Paramètres mises à jour. Le seul « compact » restant dans les clés est le panneau du hub Rapports (docs.reports).architecture.mddécrit le fournisseur, le canal, les préférences, le verrou de carte et la mise en évidence, et renvoie à l'ADR 0022.qa-onboarding.htmlporte les dix cas de l'issue, plus les vérifications à la main laissées par #402 à #406 (D9 sur un profil réel, coche en direct, bandeau et liste, « Masquer » depuis Paramètres → Utilisateurs, contour dans WebKitGTK et WebView2, focus, annonces d'Orca et de NVDA, micro-flash d'ImportFolderConfig, entrée guidée et repli, lien guidé suivi depuis /transactions, « Tout déplier » puis la cellule, Tab, grille déjà dépliée, cellule hors de vue, 0 $, édition Gratuite à 5/5).npm run buildetnpx vitest runverts (1891 tests).Six affirmations du guide vérifiées dans le code
styles.css,animation-iteration-count: 3, etanimation: nonesousprefers-reduced-motion: reduce.AppShell.tsxmonte<OnboardingBannerSlot key={pathname} />, dont l'étatlistOpenest local.bannerModerendnonequandpathname === "/"etcounters.transactions === 0.computeChecklistcompteitem.done || item.skippedparmi les lignes déverrouillées.initializeGuidedPath, drapeau absent etCOUNT(*) FROM transactions> 0, puis préférence masquée et drapeau dans la même transaction.OnboardingChecklist,Linkversitem.toavecstepNavStateetonClick={() => onResume(item.key)}.Constats
5c18fdd. Le guide et l'entrée #398 disaient que la carte n'annonce pas « Fait. » pour un import qui n'ajoute rien. Elle ne le retient que sur le rapport (importCardModel) : sur la page Import, la carte passe d'une étape à la suivante, et après « Terminé » l'assistant au repos, source et import cochés, donne « Fait. ». Texte précisé en FR et en EN.5c18fdd. Le premier test deDocsContent.locales.test.tsexigeait l'ordre des sections dans les fichiers de langue, queDocsContentignore : comparaison triée.executeImportécrit la ligneimported_filesencompletedavant l'insertion, etCOUNTERS_SQLla compte. Consigné « à juger » dans la liste QA, aucune issue ouverte.docs.*sont désormais gardées par le nouveau test (mutation M3 rouge). Les 65 libellés d'interface cités entre guillemets existent dans la langue correspondante.Preuves sur la tête
5c18fddgit checkout: 4/4 rouges (3, 2, 1 et 3 tests sur 1891), toutes dansDocsContent.locales.test.ts.check-frontend, lue dans les logs : run 505 vert surd6f42db, puis run 506 vert sur5c18fdd(build, 109 fichiers, 1891 tests).Revue adversariale — verdict : APPROVE
Résumé : le guide (FR, EN et
.md),architecture.md, la liste QA et le CHANGELOG décrivent fidèlement le code de la pile au tip5c18fdd. Chaque affirmation vérifiable a été confrontée au code, et le nouveau test rougit sous les neuf mutations structurelles du relecteur. Aucun bloquant sur ce maillon. La condition de merge posée par la revue de #404 le touche : il porte cinq des textes qu'elle ferait réécrire (voir plus bas).Exécuté
git archive 5c18fdd,npm ci) :npx vitest run109 fichiers, 1891 tests verts ;npm run buildvert (tsc + vite).check-frontend, run 506, lue dans le journal du job : checkout de5c18fdd, build, 109 fichiers et 1891 tests, « Job succeeded ».simpl-resultat.qa-onboarding.v2.docs.*. Toutes se retrouvent dans l'interface, sauf des noms de sections (guide, architecture, liste QA), le bouton de la page QA, des noms du dossier d'exemple, une citation abrégée par « … » et la ligne de Journal de D9, présente mot pour mot àonboardingService.ts:161.settings.systems.titleet àfeedback.button.Mutations du relecteur
Distinctes des M1 à M4 de l'auteur, appliquées une à la fois. Après chacune, les fichiers sont restaurés et comparés à l'octet avec
5c18fdd.en.json: sous-section du parcours retirée en entier, FR la gardefr.json:notede la sous-section videGETTING_STARTED_GUIDEpointé sur#profilesOnboardingBanner.render.test.tsxSECTIONSsanseditionsstatusajouté à la seule sous-section FRreadSubsectionsgardedocs.tipsHeaderretiré deen.jsoniden ENdocs.dashboard.tipsvide en ENR10 borne ce que prouve le test : il garde la forme, pas le sens. La justesse du texte repose sur la relecture, d'où la confrontation au code qui suit.
Vérifié contre le code du tip
bannerMode(nonesur le tableau de bord vide,cardsur la page du verrou,completequand tout est fait ou passé etbudgetReady) ;key={pathname}sur le slot dansAppShell, d'où la liste repliée à chaque page ; « Masquer » dans le bandeau et dans la liste dépliée.cardStep,cardNextetStepCard(zonerole="status", « Passer » tant que l'étape n'est pas faite, fin avec « Ouvrir le guide » et « Fermer ») ; focus gardé surlocation.key; « Reprendre » est un lien vers la page de l'étape qui appelleresume.importCardModeldit « Fait. » sur le rapport seulement siimportedCount > 0, puis au repos dès que source et import sont cochés. C'est ce que disent le point 5 du guide et l'entrée #398 depuis5c18fdd.GUIDED_ENTRY_FILTERS(dateFrom: null, non catégorisées) et « Tout » actif dansTransactionFilterBar;budgetOnboardingTarget(première feuille visible, sinon « Tout déplier »).initializeGuidedPath,getOnboardingSnapshot,followDataChangesà 150 ms ; contour de 3 px décalé de 2 px, pulsation de 1,2 s jouée trois fois, retirée sousprefers-reduced-motion.architecture.md: 16 modules dansutils/au tip (15.tsetchartPatterns.tsx), 26 services, 29 hooks.pull_refde #407 encloses, etResolves #401figure dansd6f42dbet5c18fdd, donc un merge ff local la ferme aussi. Aucune autre issue n'est fermée.Condition de pile, posée par la revue de #404 : à trancher avant
/merge-stackLa revue de #404 recommande la voie A : ne compter une ligne
imported_filesque si elle a des transactions, dans un commit en tête de pile. #407 est cette tête, et son texte décrit le comportement actuel. Si la voie A est retenue, le même commit doit réécrire dans ce maillon :docs/guide-utilisateur.md:38, et le point 5 de la sous-section (fr.json:903,en.json:903) : « sur le rapport d'un import qui n'a ajouté aucune transaction, elle ne l'annonce pas » devient « jamais pour un import qui n'a ajouté aucune transaction » ;CHANGELOG.md:9etCHANGELOG.fr.md:9, avec une entrée Fixed / Corrigé, puisque la v0.17.0 coche déjà l'étape après un import sans ligne valide ;docs/qa-onboarding.html:256-257(guided-noop-import) : retirer « À juger », et attendre au repos « Étape 4 sur 6 » avec la première source entourée ;docs/architecture.md:329(ligne « Importer un premier fichier ») et:361(importCardModel).Avec la voie B, le texte de ce maillon est exact. Reste alors à décider si le guide nomme la case cochée après « Terminé » ; la liste QA la porte déjà.
Suggestions (non bloquantes)
CHANGELOG.md:10,CHANGELOG.fr.md:10) : « which has no Budget step » / « qui n'a pas d'étape Budget ». En Gratuite, la liste montre une ligne Budget verrouillée « Base et plus ». La note du guide est exacte (« l'étape Budget est verrouillée et ne compte pas ») : reprendre « where the Budget step is locked » / « où l'étape Budget est verrouillée ». Ces notes s'affichent dans l'app.outlinedestyles.css:158l'emporte sur l'anneau du navigateur).guided-keyboard(qa-onboarding.html:285-286) demande un focus visible en général : nommer le contrôle entouré, ou ajuster le cas si le correctif part en tête de pile ;cardStepetimportCardModel.qa-onboarding.html:265, « octobre est vers la droite » ne tiendra plus au moment de la QA (« les derniers mois de l'année sont à droite ») ;architecture.md:351, la ligne au Journal de D9 s'écrit après leCOMMIT, et seulement quand le masquage est validé, pas entre les deux écritures.Actions faites
status:review→status:approved./tmp/pr407-copyet fichiers/tmp/pr407-*supprimés ; arbre du dépôt intact.maximus referenced this pull request2026-10-09 01:12:03 +00:00
Merge de la pile — commits ajoutés après la revue, non relus par une revue indépendante
Pile #402 → #407 mergée le 2026-10-08 par
/merge-stack, en avance rapide par l'API, chaque tête épinglée (mainee17f31). Sur décision de Max (« option A, corrige la tête et merge »), sept commits ont été posés sur cette branche, en tête de pile, après les six APPROVE : les têtes revues de #402 à #406 n'ont pas bougé.a58f8b9completedqu'avec une transaction (EXISTSsurtransactions.file_id) : voie A696b83fec3b5d574a6572:focus-visible { outline: revert }sur le contrôle entouré (WCAG 2.4.7)ba71a64abc9076ee17f31architecture.md, ADR 0022, liste QA (44 cas)Aucun ne touche un chemin de sécurité. Les trois correctifs de code (compteur, D9, cible Budget) changent une règle de production : relecture possible par
/pr-reviewsurmainsi voulue.Preuves
SET_ERROR,SET_LOADINGouSET_TOTAL_IN_DBqui désarment le repli guidé.consolidated_schema.sql: 0 après un import sans ligne valide, 0 avant la première insertion d'un import réussi et 1 après, 0 une fois le fichier passé enerror. Plan d'exécution :SEARCH t USING COVERING INDEX idx_transactions_file.ee17f31éprouvé dans un worktree jetable (npm ci) : sonde rouge rc=1, build vert, 109 fichiers et 1904 tests verts (1891 + 13). CIcheck-frontendrun 507 verte, journal lu : checkout deee17f31, mêmes chiffres.main(src-tauri,.cargo,.forgejo,package*.json: diff vide).Suites : #408 (
db.tslaisse passer hors verrou toute requête pendant une transaction) et #409 (angles morts des harnais React des tests). Les autres constats non bloquants des revues sont devenus des cas dedocs/qa-onboarding.html: focus après « Masquer » et « Fermer », compteur doublé de la liste dépliée, « Passer » sur l'étape du dossier sans dossier, cartes Transactions et Budget sur un profil sans transaction, cellule du mois hors champ.