feat(onboarding): step cards of the Categories and Reports pages (#432) #445
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#445
Loading…
Reference in a new issue
No description provided.
Delete branch "issue-432-cards-categories-reports"
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?
Generated autonomously by /autopilot run of 2026-10-13
Link 8 of 8 (the last) of the milestone
planned-2026-10-12-retours-onboarding-v0171(task T8). Stacked on #444 (issue-425-visit-steps).What it does
The two visit steps added by #425 get their card. With this link the path no longer stops at step 5.
/categories: card "Step 5 of 8 · Browse categories and keywords" (the issue's text). It explains keywords and names "All keywords" by its own label (StepCardText.labels). The outline goes on "All keywords", never on "Reset", which is destructive. "Got it" leads to "Done." and "Next step: Categorize a transaction by hand →"./reports: card "Step 8 of 8" (7 of 7 in Free). It covers the hub and names "Trends" by its label. Thelockedvariant, which mentions the padlock, is used when the page'sadvancedLockedholds (license read and not entitled). The outline goes on the Trends card. "Got it" leads to "Done." and the end message.onNavigate={() => acknowledge("reports")}, called on click before the navigation. Following the ring leaves the page, which releases the card latch, so the click checks the step. The localACKNOWLEDGEwins over the re-read the route change starts (ADR 0022 §4, unchanged).Changes
src/utils/onboardingPath.ts:CARD_PAGESandPAGE_STEPSgain/categoriesand/reports. NewcategoriesCardModel(checklist)andreportsCardModel(checklist, advancedLocked), with their target types.src/pages/CategoriesPage.tsx:<OnboardingStepCard>first, andonboardingTargetAttributes(CATEGORIES_ALL_KEYWORDS_TARGET, …)on "All keywords" while the card shows.src/pages/ReportsPage.tsx: the card first. Only the Trends card getsonboardingTarget+onNavigate.src/components/reports/HubReportNavCard.tsx: optionalonboardingTarget(highlight attributes on itsLink,REPORTS_TRENDS_TARGET) andonNavigate(theLink'sonClick).onboarding.card.categoriesandonboarding.card.reports.{all,locked}, FR and EN word for word.docs.gettingStarted.subsections[0].steps[2]names the five card pages, "Got it" and the Trends card.architecture.md: card pages, the two models, the two targets,onNavigate/ D17. QA list (docs/qa-onboarding.html): steps 5 and 8 of the guided walk (guided-categories,guided-reports),v0171-reports-free-padlockandv0171-reports-trends-click. Theguided-listcase no longer calls Categories a page without a card.acknowledge, and so through theACKNOWLEDGEthat #425 already wrote into §2, §4 and §5.Tests
onboardingPath.test.ts:stepsOfPage,CARD_PAGES(/reports/trendsis not a card page);cardStep:/categories5/8,/reports8/8 and 7/7 in Free, null before the visit steps' initialization;cardNext: after Categories the next step ismanualCategory, after Reports the end;all,locked, skipped is not done, targets, FR/EN sentences through the real i18n.HubReportNavCard.render.test.tsx(new): highlight only withonboardingTarget. Called as a function, itsLink'sonClickcallsonNavigate.CategoriesPage.render.test.tsx(new):ReportsPage.render.test.tsx(new):all/locked(7/7), and no padlock sentence before the license is read;onNavigateacknowledgesreports;OnboardingStepCard.test.tsx: the/stand-in-categoriesmock is removed. "Got it" is tested on the real/categories(5/8) and/reports(8/8) routes.Decisions (details in the run's decisions log)
TRANSACTION_CATEGORY_TARGET.guided-listmoved from Categories to Settings as its "page without a card". Four cases added./reportsrow ofarchitecture.mdsays "4 cartes" (there are 5).showsStepCardholds and the step is not done. CHANGELOG clause word for word.Proof table (mutations, one at a time, restored by
git checkout, on the committed implementation00be287)/categoriesremoved fromCARD_PAGES/reportsremoved fromPAGE_STEPScategoriesCardModelignores the done stepcategoriesCardModelchecksmanualCategoryreportsCardModellocked variant invertedreportsCardModelignores the done steptrendslabel droppedcategoriesadvancedLocked = falseHubReportNavCarddropsonNavigateHubReportNavCardalways highlightedValidation
npm run buildgreen (tsc covers the test files).npm test: 130 files, 2222 tests, all green.🤖 Generated with Claude Code
Self-review (autopilot worker, not independent): APPROVE
Generated autonomously by /autopilot run of 2026-10-13. I read the full diff of PR #445 against
issue-425-visit-steps, 16 files.Acceptance criteria of #432
/categories. The import card'scardNextgives the categories step (to: "/categories"), and/categoriesis now inCARD_PAGES, so the card latches there. The card explains keywords, outlines "All keywords" and announces the keyword added at the next step. Pinned byCategoriesPage.render.test.tsxand by M1, M8, M9 and M10.acknowledge("categories")on the real/categoriesroute (OnboardingStepCard.test.tsx), andcardNextgivesmanualCategory(path test). Render after acknowledgement: "Done.", the manual-category link, no ring./reports, the card outlines the Trends card, the only ring (M11, M12, M16). In Free it mentions the padlock (M5, M14). "Got it" or opening Trends checks the step (M13, M15). When it was the last step, the card shows the end message (render test), and the banner says "Getting started complete" on the page you land on, through the existingbannerModeand the QA casev0171-reports-trends-click.acknowledgeandskipare not called).Other checks
onNavigatecalls only the provider'sacknowledge, which writes a fixed preference. No Journal line, no network call, no destructive control targeted: "Reset" is never outlined, see M9.HubReportNavCardwithout the new props renders as before: noonClick, no attributes, lock badge unchanged.ACKNOWLEDGEtakesacknowledgedSetAt = loadSeq, so the older snapshot cannot undo it (ADR 0022 §4, unchanged).[Unreleased]. Docs rule followed: guide plusdocs.*,architecture.md, QA list. No new ADR needed: no new pattern, D17 was already noted inarchitecture.mdby #425.For the reviewer to judge
readyfalse), the Reports card shows theallsentence, then switches tolocked. This follows the page's ownadvancedLockedand the padlocks, which wait for the license in the same way. The switch is short and the test pins it.CI lue par l'orchestrateur sur la tête
934bcbf: PR Check — Frontend run 551 vert (build OK, vitest 130 fichiers / 2222 tests, comptes égaux à ceux du worker). Pas de job Rust attendu.Generated autonomously by /autopilot run of 2026-10-13
Verdict : APPROVE
Résumé : les cartes d'étape de Catégories et de Rapports sont branchées comme celles d'Import, de Transactions et de Budget. Le contour suit
showsStepCardet l'état de l'étape. Le clic sur Tendances (D17) passe par le mêmeacknowledgeque « J'ai compris ». Les textes FR/EN correspondent au code : triORDER BY priority DESCdanscategorizationService, panneau des faits saillants (solde courant, solde cumulatif, plus gros mouvements), Tendances jamais verrouillée.Preuves rejouées par le relecteur (tête
934bcbf, worktree détaché,npm cipropre)npm run buildvert ;vitest run: 130 fichiers, 2222 tests verts.success(statut agrégé).git checkout:categoriesCardModelgarde la cible une fois l'étape faiteadvancedLocked = !advancedAllowed(cadenas avant la lecture de la licence)onClick={onNavigate}retiré duLinkshowsStepCardshowsStepCardtrendspointé surreports.hub.comparereportsCardModelignore l'étape faiteallKeywordspointé surcategories.reinitializeSuggestions (non bloquantes)
ref_action: none. Le seulResolves #432est dans le message du commit934bcbf. Il fermera l'issue avec un merge ff (/merge-stack), qui lit les messages de commit, mais pas avec un merge par commit de merge, qui lit le corps. AjouterResolves #432au corps pour ne pas dépendre du chemin de merge.onNavigatepart aussi sur un clic du milieu ou un Ctrl+clic. Dans le webview Tauri, ces clics n'ouvrent pas d'onglet, donc l'étape cochée sans navigation reste théorique./reportsdedocs/architecture.md, signalée dans le corps, reste à corriger dans un suivi.Actions faites
status:review→status:approved.