docs(onboarding): changelog, architecture, user guide and interactive QA checklist (#357) #383
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#383
Loading…
Reference in a new issue
No description provided.
Delete branch "issue-357-onboarding-docs"
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?
Fixes #357
Stacked on PR #382 (
issue-356-import-empty-state). Last link of the 7-link onboarding chain #377 → #378 → #379 → #380 → #381 → #382 → this PR; it closes the chain on the documentation side. Review this diff only; the previous links carry the code.What
[Unreleased]/[Non publié]:### Added/### Ajouté(guided empty states on Dashboard, Import, Transactions, Budget; getting-started checklist computed from the data, dismissable per profile; "Créer un dossier d'exemple"; guide sub-section "Exporter un CSV depuis votre banque") and### Changed/### Modifié("Afficher la liste de démarrage" in Settings → Users; the Import "?" popover links to the guide).[Unreleased]was empty (0.16.0 shipped today), so nothing to preserve; the same four + two entries in both languages, with the issue numbers.fs_commands.rs6 → 7 with thecreate_sample_import_folderscontract (folder + date → two folder names; both existence checks before the first write, so no overwrite and no half-created pair),## Commandes Tauri (36)→ 37 (36 was the sum of the listed sections);onboardingServicerow (19th service, heading 18 → 19) andgetTransactionCountontransactionService;useOnboardingChecklistrow (heading17+→25+);onboarding_checklist_hiddenin theuser_preferencesrow;src/__fixtures__/samples/sub-section next to thecsv/corpus; a new Onboarding section with the four empty states and their signal (counters.transactions === 0;showsEmptyState=totalInDb === 0viagetTransactionCount), the source of truth of the six checklist rows (SQL per row, why row 5 isis_manually_categorized = 1), and the sample-folder flow. Structure tree: only the lines the wave touched were re-counted (dashboard 2 → 7, import 14 → 15, settings 5 → 17, shared +EmptyState, hooks 18+ → 29, services 14 → 25 with "19 détaillés"); other pre-existing drifts (e.g.balance/8 vs 12 files) are left alone, out of scope.docs.dashboard.*anddocs.settings.*entries infr.jsonanden.json, same positions in the arrays.docs.gettingStarted.stepsFR + EN rewritten to the six quick-start steps the markdown chapter 1 already had (same order and wording asonboarding.checklist.items.*, 7 → 6 steps), anddocs.import.steps[1]FR + EN gets the "Créer un dossier d'exemple" sentence of markdown chapter 4. The three guide copies now say the same thing.localStorage(keysimpl-resultat.qa-onboarding.v1, every read/write intry/catch, the page renders when storage throws). « Copier le rapport » builds a plain-text report (date, tester/version/OS, ticked count,[x]/[ ]rows, notes) and usesnavigator.clipboard.writeText, falling back to a visible pre-selected textarea when the API is absent or refuses. « Réinitialiser » asks for confirmation then clears storage. Light/dark viaprefers-color-scheme.How tested
npm run build— OK (tsc + vite).npm test— 79 files, 1440 passed.cargo test(warm cache) — 192 passed.docs.*key sets identical; array lengths identical forgettingStarted,dashboard,settings,import(features/steps/tips). JSON round-trip of both locale files is byte-identical before the edit, so the diff is the content only.EmptyState,OnboardingChecklist,DashboardEmptyState,ImportEmptyState,DocsSubsections): the only hits are Tailwind class constants, TypeScript union literals ("expanded" | "compact","done" | "todo" | …) and one JSDoc comment (<Link>/useNavigateinEmptyState.tsx). No user-facing literal outsidet().docs/qa-onboarding.html:grep -E "https?://"returns nothing; no<link>,<script src>,@importorurl(. Smoke-tested in jsdom (scratchpad, not in the repo): 16 rows render, a ticked box, a note and the tester name survive a reload, the copy button shows the fallback textarea with the report when the clipboard API is absent, reset clears storage, and the page renders whenlocalStoragethrows.Self-review
Posted as a comment below.
Generated autonomously by /autopilot run of 2026-10-03
🤖 Generated with Claude Code
Self-review (autopilot, 2026-10-03) — Verdict: APPROVE
Inline review of the full
GET /pulls/383.diff(773 lines, 7 files, baseissue-356-import-empty-state). Docs-only PR: no component, hook, service, Rust or migration change; the onlysrc/files are the two locale JSONs,docs.*keys only, as the issue scopes.Summary
The diff does what #357 asks and nothing else: both changelogs gain the same Added ×4 / Changed ×2 under
[Unreleased]/[Non publié];architecture.mdgets the seventhfs_commandscommand with its refuse-to-overwrite contract, the service, the hook, the preference key, the samples corpus and an Onboarding section; the user guide and its JSON copies describe the checklist (chapter 3) and the re-show button (chapter 11); the #355 hand-off aligns the three guide copies;docs/qa-onboarding.htmlis a self-contained French checklist. Every behavioural claim in the prose was re-traced to the code of links 1-6 before writing (DashboardPagebranching oncounters.transactions === 0,showsEmptyStateontotalInDb,computeChecklistrows and SQL,create_sample_import_foldersdouble existence check before any write,ImportPagepassinglinkTo={CSV_EXPORT_GUIDE_PATH}toPageHelp,UsersSettingsPagedismissed→ button /restored→ confirmation).Criteria
[Unreleased], FR and EN[Unreleased]was empty (0.16.0 shipped today), so no existing entry to preserve; Keep a Changelog order respected (Added before Changed, nothing else in the block)architecture.md: Tauri commands section listscreate_sample_import_folders;fs_commands.rscount coherent between heading and list(7), seven bullets; total(36)→(37)matches the sum of sections. Services heading 18 → 19 = 19 table rows; Hooks17+→25+with 25 rowsqa-onboarding.htmlopens offline, keeps its state across reload, "Copier le rapport" yields readable plain texthttp(s)://,<link>,<script src>,@importorurl(in the file; jsdom smoke test: 16 rows, tick + note + tester survive a reload, fallback textarea shows the report when the clipboard API is absent, reset clears storage, page renders whenlocalStoragethrows. French only. 16 KBnpm run build,npm test,cargo testgreen; no hard-coded stringdocs.*key sets identical; array lengths identical per section (gettingStarted 8/6/4, dashboard 7/9/5, settings 9/8/7, import 9/8/9); byte-identical JSON round-trip before edit, so the diff is content only.claude/rules/i18n.mdrespected (both languages)Concerns (none blocking)
__fixtures__/line).balance/still says 8 while 12 files exist,pages/says 14, etc. Fixing those is outside #357 and would blur the diff; noted in the decisions log for a later housekeeping pass.docs.gettingStarted.stepsnow has 6 steps instead of 7: the old "Categories → keyword rules" and "Auto-categorize in bulk" steps are gone, replaced by "Classer une transaction à la main", because the seed and the import wizard already categorise (decision recorded on the issue). Intentional, matches the markdown and the checklist.Attempt 1 of 3 — no change requested.
Revue adversariale — PR #383 (
/pr-review, passe indépendante)Verdict : APPROVE
Résumé
PR documentaire pure (7 fichiers, 1 commit
docs(onboarding): …) qui fait ce que #357 demande et rien d'autre. Chaque affirmation dearchitecture.md, des deux CHANGELOG, du guide et du HTML QA a été retracée contre le code du tipd11337c(lecturegit show, sans checkout) : aucune réfutée. CI frontend verte sur la tête (1m54s),check-rustcorrectement sauté (aucun cheminsrc-tauri/**), la timeline de #357 porteclosesdepuis cette PR.Re-prouvé à la source
dashboard/7,import/15,settings/17,shared/12 (dontEmptyState), hooks 29, services 25 ; table Services 19 lignes, table Hooks 25 lignes ;fs_commands.rs7pub fn.create_sample_import_folders(fs_commands.rs:207-258) : date%Y-%m-%d, les deuxexists()avant le premiercreate_dir,releve-%Y-%m.csv, jetons{{M1}}/{{M2}}rendus en%m/%Y,include_str!sursrc/__fixtures__/samples/, retour des noms. Gabarits à 41 lignes chacun.onboardingService: les 5 compteurs SQL,imported_files WHERE status = 'completed',is_manually_categorized = 1, cléonboarding_checklist_hidden.computeChecklist: total 5 quand Budget verrouillé,to: "/settings/users".useOnboardingChecklistgardehiddensur erreur ;DashboardPage.tsx:54-57, 96-112journalise et rend sans liste, compact caché quandcomplete.UsersSettingsPage.tsx) : rendu seulement endismissed, confirmationrole="status"à sa place enrestored— le guide (« visible seulement si masquée ») et l'architecture (« confirmation en place du bouton ») sont exacts. Popover « ? » :ImportPage.tsx:57<PageHelp linkTo={CSV_EXPORT_GUIDE_PATH}>.docs.*touchés ;gettingStarted.steps(6) =onboarding.checklist.items= chapitre 1 du guide (guide-utilisateur.md:24-29), mot pour mot.DocsContent.tsx:167rend par.map, aucun accès par index aux 7 anciennes étapes.node --checkdu script inline OK ; 0 occurrence dehttps?://,<link,<script src,@import,url(; tout rendu viatextContent/.value(pas d'innerHTML, donc pas d'XSS par les notes) ;localStoragesoustry/catchaux trois sites. Les 16 observations attendues sont cohérentes avec le code : « 1 / 5 sans clé », second profil « clé Base ou plus » (multi-profile: ["base","premium"]), « GARDERIE LES PETITS PAS » bien dansOFF_SEEDdu test d'intégration, l'étape 11 tient caruseTransactions.ts:135poseis_manually_categorized: true.Suggestions (non bloquantes)
## Commandes Tauri (37)est la somme des sections, maisgenerate_handlerdu tip en enregistre 43. Sept noms n'apparaissent dans aucune section :send_feedback,get_feedback_user_agent,ensure_backup_dir,get_file_size,file_exists,compute_account_return,fetch_price. Dérive préexistante, hors du périmètre annoncé par la PR — à porter dans le suivi des comptes deCLAUDE.md/architecture.mddéjà noté en STATE, ou titrer « 37 documentées sur 43 ».hooks/ # 29et le titre## Hooks (25+): ajouter « (25 détaillés) » comme pour les services, pour que les deux chiffres ne se lisent pas comme une contradiction.status:approveda été posé sur #357 à 00:28:29Z par le self-review de l'autopilot, avant son propre commentaire — et c'est systématique sur les sept maillons (#351 → #357, tous passésapprovedpar l'auteur avant toute passe indépendante). Le label ne signifie donc plus « revu indépendamment ». À corriger dansautopilot/sprint: laisserstatus:review, le relecteur poseapproved.Exécution
Revue en lecture seule côté exécution : suite et mutations non rejouées localement — aucun code exécutable modifié hors JSON de locale, CI frontend verte sur
d11337c. Label de #357 inchangé (déjàstatus:approved, cohérent avec ce verdict).Commit
667e058ajouté en tête de pile : les trois suivis des revues indépendantes (#381 statut BMO sans provenance interne, #378 gardebudgetReadysur la liste compacte, #382 testformatLocalDateépinglé en TZ non-UTC avec mutation vérifiée). tsc, 1440 vitest, build et JSON verts sur667e058.