docs(onboarding): changelog, architecture, user guide and interactive QA checklist (#357) #383

Merged
maximus merged 2 commits from issue-357-onboarding-docs into main 2026-10-04 12:52:01 +00:00
Owner

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

  • CHANGELOG.md / CHANGELOG.fr.md — under [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.
  • docs/architecture.md — fs_commands.rs 6 → 7 with the create_sample_import_folders contract (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); onboardingService row (19th service, heading 18 → 19) and getTransactionCount on transactionService; useOnboardingChecklist row (heading 17+ → 25+); onboarding_checklist_hidden in the user_preferences row; src/__fixtures__/samples/ sub-section next to the csv/ corpus; a new Onboarding section with the four empty states and their signal (counters.transactions === 0; showsEmptyState = totalInDb === 0 via getTransactionCount), the source of truth of the six checklist rows (SQL per row, why row 5 is is_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/guide-utilisateur.md — chapter 3 (feature, three "Comment faire" steps on the checklist, its six rows, the compact bar, "Masquer"; a tip on what ticks row 5), chapter 11 (feature + step for the re-show button in Paramètres → Utilisateurs). Matching docs.dashboard.* and docs.settings.* entries in fr.json and en.json, same positions in the arrays.
  • Hand-off from #355 (MEDIUM, logged) — docs.gettingStarted.steps FR + EN rewritten to the six quick-start steps the markdown chapter 1 already had (same order and wording as onboarding.checklist.items.*, 7 → 6 steps), and docs.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.
  • docs/qa-onboarding.html (new, 16 KB) — interactive manual-test checklist for the two testers. French only, static, inline CSS + JS, no font, no CDN, no URL at all. 16 rows (the issue's path, with "→ 5/6" and "→ 6/6, liste disparue" as rows of their own), each with a checkbox, the expected observation and a text field « Où as-tu hésité ? ». State in localStorage (key simpl-resultat.qa-onboarding.v1, every read/write in try/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 uses navigator.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 via prefers-color-scheme.

How tested

  • npm run build — OK (tsc + vite).
  • npm test — 79 files, 1440 passed.
  • cargo test (warm cache) — 192 passed.
  • FR/EN parity: docs.* key sets identical; array lengths identical for gettingStarted, 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.
  • Hard-coded string grep on the five components created by the wave (EmptyState, OnboardingChecklist, DashboardEmptyState, ImportEmptyState, DocsSubsections): the only hits are Tailwind class constants, TypeScript union literals ("expanded" | "compact", "done" | "todo" | …) and one JSDoc comment (<Link> / useNavigate in EmptyState.tsx). No user-facing literal outside t().
  • docs/qa-onboarding.html: grep -E "https?://" returns nothing; no <link>, <script src>, @import or url(. 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 when localStorage throws.

Self-review

Posted as a comment below.

Generated autonomously by /autopilot run of 2026-10-03

🤖 Generated with Claude Code

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 - **CHANGELOG.md / CHANGELOG.fr.md** — under `[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. - **docs/architecture.md** — `fs_commands.rs` 6 → 7 with the `create_sample_import_folders` contract (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); `onboardingService` row (19th service, heading 18 → 19) and `getTransactionCount` on `transactionService`; `useOnboardingChecklist` row (heading `17+` → `25+`); `onboarding_checklist_hidden` in the `user_preferences` row; `src/__fixtures__/samples/` sub-section next to the `csv/` corpus; a new **Onboarding** section with the four empty states and their signal (`counters.transactions === 0`; `showsEmptyState` = `totalInDb === 0` via `getTransactionCount`), the source of truth of the six checklist rows (SQL per row, why row 5 is `is_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/guide-utilisateur.md** — chapter 3 (feature, three "Comment faire" steps on the checklist, its six rows, the compact bar, "Masquer"; a tip on what ticks row 5), chapter 11 (feature + step for the re-show button in Paramètres → Utilisateurs). Matching `docs.dashboard.*` and `docs.settings.*` entries in `fr.json` and `en.json`, same positions in the arrays. - **Hand-off from #355 (MEDIUM, logged)** — `docs.gettingStarted.steps` FR + EN rewritten to the six quick-start steps the markdown chapter 1 already had (same order and wording as `onboarding.checklist.items.*`, 7 → 6 steps), and `docs.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. - **docs/qa-onboarding.html** (new, 16 KB) — interactive manual-test checklist for the two testers. French only, static, inline CSS + JS, no font, no CDN, no URL at all. 16 rows (the issue's path, with "→ 5/6" and "→ 6/6, liste disparue" as rows of their own), each with a checkbox, the expected observation and a text field « Où as-tu hésité ? ». State in `localStorage` (key `simpl-resultat.qa-onboarding.v1`, every read/write in `try/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 uses `navigator.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 via `prefers-color-scheme`. ## How tested - `npm run build` — OK (tsc + vite). - `npm test` — 79 files, **1440 passed**. - `cargo test` (warm cache) — **192 passed**. - FR/EN parity: `docs.*` key sets identical; array lengths identical for `gettingStarted`, `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. - Hard-coded string grep on the five components created by the wave (`EmptyState`, `OnboardingChecklist`, `DashboardEmptyState`, `ImportEmptyState`, `DocsSubsections`): the only hits are Tailwind class constants, TypeScript union literals (`"expanded" | "compact"`, `"done" | "todo" | …`) and one JSDoc comment (`<Link>` / `useNavigate` in `EmptyState.tsx`). **No user-facing literal outside `t()`.** - `docs/qa-onboarding.html`: `grep -E "https?://"` returns nothing; no `<link>`, `<script src>`, `@import` or `url(`. 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 when `localStorage` throws. ## Self-review Posted as a comment below. Generated autonomously by /autopilot run of 2026-10-03 🤖 Generated with [Claude Code](https://claude.com/claude-code)
maximus added 1 commit 2026-10-04 00:27:00 +00:00
docs(onboarding): changelog, architecture, user guide and interactive QA checklist (#357)
All checks were successful
PR Check — Frontend / frontend (pull_request) Successful in 1m54s
d11337ccf6
Closes phase 1 of the onboarding wave (#351-#356) on the documentation side.

- CHANGELOG.md / CHANGELOG.fr.md: Added (guided empty states, getting-started
  checklist, sample folder, bank CSV export guide) and Changed (re-show button
  in Settings > Users, Import "?" popover linking to the guide) under
  [Unreleased] / [Non publié], same entries in both languages.
- docs/architecture.md: create_sample_import_folders (fs_commands 6 -> 7,
  total 36 -> 37) with its contract, onboardingService, useOnboardingChecklist,
  the onboarding_checklist_hidden preference, the samples/ corpus next to csv/,
  and an "Onboarding" section (four empty states and their signal, source of
  truth of the six checklist rows, sample-folder flow). Tree counts measured
  for the directories the wave touched.
- docs/guide-utilisateur.md chapters 3 and 11 + docs.dashboard.* and
  docs.settings.* keys (FR/EN). Hand-off from #355: docs.gettingStarted.steps
  aligned with the six-step quick start of the markdown, docs.import.steps
  mentions the sample folder, so the three guide copies agree.
- docs/qa-onboarding.html: interactive manual-test checklist, French only,
  static, no network dependency, state in localStorage, plain-text report to
  the clipboard with a visible fallback, reset button.

Resolves #357

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
maximus added the
autopilot:pending-human
label 2026-10-04 00:27:12 +00:00
Author
Owner

Self-review (autopilot, 2026-10-03) — Verdict: APPROVE

Inline review of the full GET /pulls/383.diff (773 lines, 7 files, base issue-356-import-empty-state). Docs-only PR: no component, hook, service, Rust or migration change; the only src/ 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.md gets the seventh fs_commands command 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.html is a self-contained French checklist. Every behavioural claim in the prose was re-traced to the code of links 1-6 before writing (DashboardPage branching on counters.transactions === 0, showsEmptyState on totalInDb, computeChecklist rows and SQL, create_sample_import_folders double existence check before any write, ImportPage passing linkTo={CSV_EXPORT_GUIDE_PATH} to PageHelp, UsersSettingsPage dismissed → button / restored → confirmation).

Criteria

Criterion Result
Both CHANGELOGs carry the same entries under [Unreleased], FR and EN Yes — 4 Added / 4 Ajouté, 2 Changed / 2 Modifié, same order, same issue refs (#351-#356). [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 lists create_sample_import_folders; fs_commands.rs count coherent between heading and list Yes — heading (7), seven bullets; total (36) → (37) matches the sum of sections. Services heading 18 → 19 = 19 table rows; Hooks 17+ → 25+ with 25 rows
qa-onboarding.html opens offline, keeps its state across reload, "Copier le rapport" yields readable plain text Yes — no http(s)://, <link>, <script src>, @import or url( 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 when localStorage throws. French only. 16 KB
npm run build, npm test, cargo test green; no hard-coded string Yes — build OK, 1440 vitest, 192 cargo; grep on the five wave components finds only class constants, union literals and one JSDoc comment
FR/EN JSON parity Yes — docs.* 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
Scope / rules of the wave Yes — CHANGELOG touched only here as the wave required; no DB migration; no string in a component; .claude/rules/i18n.md respected (both languages)

Concerns (none blocking)

  1. Pre-existing count drift left in place. The structure tree was re-counted only on the lines the wave touched (dashboard, import, settings, shared, hooks, services, plus a new __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.
  2. Ordering between markdown and JSON in chapter 11. The markdown lists the feedback feature before the export items, the JSON lists it last; the new feature/step were appended at the end of both. Pre-existing divergence, content identical.
  3. Hand-off wording. docs.gettingStarted.steps now 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.
  4. QA page row count. The issue's arrow path was decomposed into 16 rows ("→ 5/6" and "→ 6/6, liste disparue" are observations of their own); one row more than a literal count of the arrows, so each tester observation gets its own checkbox and comment.

Attempt 1 of 3 — no change requested.

## Self-review (autopilot, 2026-10-03) — Verdict: **APPROVE** Inline review of the full `GET /pulls/383.diff` (773 lines, 7 files, base `issue-356-import-empty-state`). Docs-only PR: no component, hook, service, Rust or migration change; the only `src/` 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.md` gets the seventh `fs_commands` command 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.html` is a self-contained French checklist. Every behavioural claim in the prose was re-traced to the code of links 1-6 before writing (`DashboardPage` branching on `counters.transactions === 0`, `showsEmptyState` on `totalInDb`, `computeChecklist` rows and SQL, `create_sample_import_folders` double existence check before any write, `ImportPage` passing `linkTo={CSV_EXPORT_GUIDE_PATH}` to `PageHelp`, `UsersSettingsPage` `dismissed` → button / `restored` → confirmation). ### Criteria | Criterion | Result | |---|---| | Both CHANGELOGs carry the same entries under `[Unreleased]`, FR and EN | Yes — 4 Added / 4 Ajouté, 2 Changed / 2 Modifié, same order, same issue refs (#351-#356). `[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 lists `create_sample_import_folders`; `fs_commands.rs` count coherent between heading and list | Yes — heading `(7)`, seven bullets; total `(36)` → `(37)` matches the sum of sections. Services heading 18 → 19 = 19 table rows; Hooks `17+` → `25+` with 25 rows | | `qa-onboarding.html` opens offline, keeps its state across reload, "Copier le rapport" yields readable plain text | Yes — no `http(s)://`, `<link>`, `<script src>`, `@import` or `url(` 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 when `localStorage` throws. French only. 16 KB | | `npm run build`, `npm test`, `cargo test` green; no hard-coded string | Yes — build OK, 1440 vitest, 192 cargo; grep on the five wave components finds only class constants, union literals and one JSDoc comment | | FR/EN JSON parity | Yes — `docs.*` 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 | | Scope / rules of the wave | Yes — CHANGELOG touched only here as the wave required; no DB migration; no string in a component; `.claude/rules/i18n.md` respected (both languages) | ### Concerns (none blocking) 1. **Pre-existing count drift left in place.** The structure tree was re-counted only on the lines the wave touched (dashboard, import, settings, shared, hooks, services, plus a new `__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. 2. **Ordering between markdown and JSON in chapter 11.** The markdown lists the feedback feature before the export items, the JSON lists it last; the new feature/step were appended at the end of both. Pre-existing divergence, content identical. 3. **Hand-off wording.** `docs.gettingStarted.steps` now 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. 4. **QA page row count.** The issue's arrow path was decomposed into 16 rows ("→ 5/6" and "→ 6/6, liste disparue" are observations of their own); one row more than a literal count of the arrows, so each tester observation gets its own checkbox and comment. Attempt 1 of 3 — no change requested.
Author
Owner

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 de architecture.md, des deux CHANGELOG, du guide et du HTML QA a été retracée contre le code du tip d11337c (lecture git show, sans checkout) : aucune réfutée. CI frontend verte sur la tête (1m54s), check-rust correctement sauté (aucun chemin src-tauri/**), la timeline de #357 porte closes depuis cette PR.

Re-prouvé à la source

  • Comptes de l'arbre : dashboard/ 7, import/ 15, settings/ 17, shared/ 12 (dont EmptyState), hooks 29, services 25 ; table Services 19 lignes, table Hooks 25 lignes ; fs_commands.rs 7 pub fn.
  • create_sample_import_folders (fs_commands.rs:207-258) : date %Y-%m-%d, les deux exists() avant le premier create_dir, releve-%Y-%m.csv, jetons {{M1}}/{{M2}} rendus en %m/%Y, include_str! sur src/__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". useOnboardingChecklist garde hidden sur erreur ; DashboardPage.tsx:54-57, 96-112 journalise et rend sans liste, compact caché quand complete.
  • Bouton de réaffichage (UsersSettingsPage.tsx) : rendu seulement en dismissed, confirmation role="status" à sa place en restored — 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}>.
  • i18n : jeux de clés FR/EN identiques, longueurs identiques sur les 12 tableaux docs.* touchés ; gettingStarted.steps (6) = onboarding.checklist.items = chapitre 1 du guide (guide-utilisateur.md:24-29), mot pour mot. DocsContent.tsx:167 rend par .map, aucun accès par index aux 7 anciennes étapes.
  • HTML QA : node --check du script inline OK ; 0 occurrence de https?://, <link, <script src, @import, url( ; tout rendu via textContent/.value (pas d'innerHTML, donc pas d'XSS par les notes) ; localStorage sous try/catch aux 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 dans OFF_SEED du test d'intégration, l'étape 11 tient car useTransactions.ts:135 pose is_manually_categorized: true.

Suggestions (non bloquantes)

  1. ## Commandes Tauri (37) est la somme des sections, mais generate_handler du 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 de CLAUDE.md/architecture.md déjà noté en STATE, ou titrer « 37 documentées sur 43 ».
  2. L'arbre dit hooks/ # 29 et 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.
  3. Process, pas ce diff : status:approved a é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és approved par l'auteur avant toute passe indépendante). Le label ne signifie donc plus « revu indépendamment ». À corriger dans autopilot/sprint : laisser status:review, le relecteur pose approved.

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).

## 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 de `architecture.md`, des deux CHANGELOG, du guide et du HTML QA a été retracée contre le code du tip `d11337c` (lecture `git show`, sans checkout) : aucune réfutée. CI frontend verte sur la tête (1m54s), `check-rust` correctement sauté (aucun chemin `src-tauri/**`), la timeline de #357 porte `closes` depuis cette PR. ### Re-prouvé à la source - **Comptes de l'arbre** : `dashboard/` 7, `import/` 15, `settings/` 17, `shared/` 12 (dont `EmptyState`), hooks 29, services 25 ; table Services 19 lignes, table Hooks 25 lignes ; `fs_commands.rs` 7 `pub fn`. - **`create_sample_import_folders`** (`fs_commands.rs:207-258`) : date `%Y-%m-%d`, les deux `exists()` **avant** le premier `create_dir`, `releve-%Y-%m.csv`, jetons `{{M1}}`/`{{M2}}` rendus en `%m/%Y`, `include_str!` sur `src/__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"`. `useOnboardingChecklist` garde `hidden` sur erreur ; `DashboardPage.tsx:54-57, 96-112` journalise et rend sans liste, compact caché quand `complete`. - **Bouton de réaffichage** (`UsersSettingsPage.tsx`) : rendu seulement en `dismissed`, confirmation `role="status"` à sa place en `restored` — 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}>`. - **i18n** : jeux de clés FR/EN identiques, longueurs identiques sur les 12 tableaux `docs.*` touchés ; `gettingStarted.steps` (6) = `onboarding.checklist.items` = chapitre 1 du guide (`guide-utilisateur.md:24-29`), mot pour mot. `DocsContent.tsx:167` rend par `.map`, aucun accès par index aux 7 anciennes étapes. - **HTML QA** : `node --check` du script inline OK ; 0 occurrence de `https?://`, `<link`, `<script src`, `@import`, `url(` ; tout rendu via `textContent`/`.value` (pas d'`innerHTML`, donc pas d'XSS par les notes) ; `localStorage` sous `try/catch` aux 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 dans `OFF_SEED` du test d'intégration, l'étape 11 tient car `useTransactions.ts:135` pose `is_manually_categorized: true`. ### Suggestions (non bloquantes) 1. `## Commandes Tauri (37)` est la somme des sections, mais `generate_handler` du 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 de `CLAUDE.md`/`architecture.md` déjà noté en STATE, ou titrer « 37 documentées sur 43 ». 2. L'arbre dit `hooks/ # 29` et 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. 3. **Process, pas ce diff** : `status:approved` a é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és `approved` par l'auteur avant toute passe indépendante). Le label ne signifie donc plus « revu indépendamment ». À corriger dans `autopilot`/`sprint` : laisser `status:review`, le relecteur pose `approved`. ### 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).
Author
Owner

Commit 667e058 ajouté en tête de pile : les trois suivis des revues indépendantes (#381 statut BMO sans provenance interne, #378 garde budgetReady sur la liste compacte, #382 test formatLocalDate épinglé en TZ non-UTC avec mutation vérifiée). tsc, 1440 vitest, build et JSON verts sur 667e058.

Commit `667e058` ajouté en tête de pile : les trois suivis des revues indépendantes (#381 statut BMO sans provenance interne, #378 garde `budgetReady` sur la liste compacte, #382 test `formatLocalDate` épinglé en TZ non-UTC avec mutation vérifiée). tsc, 1440 vitest, build et JSON verts sur `667e058`.
maximus added 1 commit 2026-10-04 12:47:34 +00:00
fix(onboarding): apply the three review follow-ups on the stack head
All checks were successful
PR Check — Frontend / frontend (pull_request) Successful in 1m47s
667e058a77
- Guide: drop the internal provenance (author, date, issue number) from the
  BMO status line in the three copies (fr.json, en.json, guide-utilisateur.md).
  The status now only says the procedure is reconstructed and unconfirmed.
- Dashboard: gate `showCompactChecklist` on `budgetReady` so a Base+ profile
  with the five other items done no longer sees the compact list vanish (5/5
  under the fail-closed entitlement) and reappear (5/6) once the licence
  resolves.
- Test: pin TZ=America/Toronto around the `formatLocalDate` tests and assert
  that `toISOString()` disagrees, so a UTC regression is caught on the UTC CI
  runner too (measured: the mutation passed 7/7 under TZ=UTC before, fails now).

Follow-ups raised by the independent reviews of PRs #381, #378 and #382.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
maximus changed target branch from issue-356-import-empty-state to main 2026-10-04 12:51:56 +00:00
maximus merged commit 667e058a77 into main 2026-10-04 12:52:01 +00:00
Sign in to join this conversation.
No reviewers
No milestone
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#383
No description provided.