feat(onboarding): Transactions card suggests Add as keyword, Budget card names leaves and the Annual column (#430) #442

Merged
maximus merged 2 commits from issue-430-cards-transactions-budget into main 2026-10-16 00:37:30 +00:00
Owner

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

Link 5 of 8 of milestone planned-2026-10-12-retours-onboarding-v0171, stacked on #441 (issue-426-source-name-folder).

What

  • Transactions card: both sentences (uncategorized, all) name the context menu's “Add as keyword” through StepCardText.labels (addKeyword: "reports.keyword.addFromTransaction"), explain what the keyword does, and carry the advice of D18 (keep a merchant-specific word, not “PAYMENT”; uncheck the transactions already correctly categorized). The keyword dialog is unchanged.
  • Budget card: both sentences (collapsed, flat) say only last-level rows (without a chevron) take an amount and what the “Annual” column does, through annual: "budget.annual". “Expand all” is now quoted (D11).
  • Highlight targets unchanged (first row's category, “Expand all” or the month cell).
  • Getting-started guide step (i18n docs.gettingStarted.subsections[0].steps[3] FR/EN and docs/guide-utilisateur.md) gets the sentence of the issue.
  • CHANGELOG (both files): one Changed entry.
  • QA list: three new cases under « Retours de la v0.17.1 », and two older cases that quoted the previous sentences updated.

Files

  • src/utils/onboardingPath.ts (labels + doc comments)
  • src/utils/onboardingPath.test.ts, src/utils/onboardingPath.locales.test.ts (extended to the Transactions and Budget cards: quotes around each control interpolation, model labels = interpolations of the real sentence)
  • src/pages/TransactionsPage.render.test.tsx
  • src/services/categorizationService.test.ts (pins is_manually_categorized = 1 for the keyword dialog)
  • src/i18n/locales/fr.json, src/i18n/locales/en.json
  • docs/guide-utilisateur.md, docs/qa-onboarding.html
  • CHANGELOG.md, CHANGELOG.fr.md

No migration, no Rust, no network call.

Decisions

  • [MEDIUM] The sentence appended to the guide step is joined with “. ” and keeps the list's convention of no final period.
  • [MEDIUM] A test added in categorizationService.test.ts (outside the issue's file list) to prove the criterion “the step still checks off through the keyword dialog”.
  • [MEDIUM] Two older QA cases (guided-empty-profile, guided-fallback) quoted the previous card sentences: their quotes updated.
  • [HIGH] Texts written word for word; docs/architecture.md unchanged (still accurate).

Mutation proofs

Targeted tests: src/utils/onboardingPath*, TransactionsPage.render.test.tsx, categorizationService.test.ts (116 tests). Each mutation applied alone after the implementation commit, restored with git checkout --.

# Mutation Result
M1 addKeyword removed from the uncategorized labels rc=1, 7 failed
M2 addKeyword removed from the all labels rc=1, 8 failed
M3 annual removed from the collapsed labels rc=1, 6 failed
M4 annual removed from the flat labels rc=1, 7 failed
M5 FR flat: quotes around {{annual}} removed rc=1, 2 failed
M6 EN flat: previous sentence restored (no leaves, no Annual) rc=1, 4 failed
M7 keyword dialog writes is_manually_categorized = 0 rc=1, 1 failed
M8 FR all: advice on the word and the boxes dropped rc=1, 1 failed
M9 EN uncategorized: quotes around {{addKeyword}} removed rc=1, 2 failed

Validation

npm run build green; npm test 127 files / 2126 tests green.

🤖 Generated with Claude Code

Generated autonomously by /autopilot run of 2026-10-13 Link 5 of 8 of milestone `planned-2026-10-12-retours-onboarding-v0171`, stacked on #441 (`issue-426-source-name-folder`). ## What - **Transactions card**: both sentences (`uncategorized`, `all`) name the context menu's “Add as keyword” through `StepCardText.labels` (`addKeyword: "reports.keyword.addFromTransaction"`), explain what the keyword does, and carry the advice of D18 (keep a merchant-specific word, not “PAYMENT”; uncheck the transactions already correctly categorized). The keyword dialog is unchanged. - **Budget card**: both sentences (`collapsed`, `flat`) say only last-level rows (without a chevron) take an amount and what the “Annual” column does, through `annual: "budget.annual"`. “Expand all” is now quoted (D11). - Highlight targets unchanged (first row's category, “Expand all” or the month cell). - Getting-started guide step (i18n `docs.gettingStarted.subsections[0].steps[3]` FR/EN and `docs/guide-utilisateur.md`) gets the sentence of the issue. - CHANGELOG (both files): one Changed entry. - QA list: three new cases under « Retours de la v0.17.1 », and two older cases that quoted the previous sentences updated. ## Files - `src/utils/onboardingPath.ts` (labels + doc comments) - `src/utils/onboardingPath.test.ts`, `src/utils/onboardingPath.locales.test.ts` (extended to the Transactions and Budget cards: quotes around each control interpolation, model labels = interpolations of the real sentence) - `src/pages/TransactionsPage.render.test.tsx` - `src/services/categorizationService.test.ts` (pins `is_manually_categorized = 1` for the keyword dialog) - `src/i18n/locales/fr.json`, `src/i18n/locales/en.json` - `docs/guide-utilisateur.md`, `docs/qa-onboarding.html` - `CHANGELOG.md`, `CHANGELOG.fr.md` No migration, no Rust, no network call. ## Decisions - [MEDIUM] The sentence appended to the guide step is joined with “. ” and keeps the list's convention of no final period. - [MEDIUM] A test added in `categorizationService.test.ts` (outside the issue's file list) to prove the criterion “the step still checks off through the keyword dialog”. - [MEDIUM] Two older QA cases (`guided-empty-profile`, `guided-fallback`) quoted the previous card sentences: their quotes updated. - [HIGH] Texts written word for word; `docs/architecture.md` unchanged (still accurate). ## Mutation proofs Targeted tests: `src/utils/onboardingPath*`, `TransactionsPage.render.test.tsx`, `categorizationService.test.ts` (116 tests). Each mutation applied alone after the implementation commit, restored with `git checkout --`. | # | Mutation | Result | |---|---|---| | M1 | `addKeyword` removed from the `uncategorized` labels | rc=1, 7 failed | | M2 | `addKeyword` removed from the `all` labels | rc=1, 8 failed | | M3 | `annual` removed from the `collapsed` labels | rc=1, 6 failed | | M4 | `annual` removed from the `flat` labels | rc=1, 7 failed | | M5 | FR `flat`: quotes around `{{annual}}` removed | rc=1, 2 failed | | M6 | EN `flat`: previous sentence restored (no leaves, no Annual) | rc=1, 4 failed | | M7 | keyword dialog writes `is_manually_categorized = 0` | rc=1, 1 failed | | M8 | FR `all`: advice on the word and the boxes dropped | rc=1, 1 failed | | M9 | EN `uncategorized`: quotes around `{{addKeyword}}` removed | rc=1, 2 failed | ## Validation `npm run build` green; `npm test` 127 files / 2126 tests green. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
maximus added 2 commits 2026-10-14 01:14:51 +00:00
Both Transactions sentences name the context menu's "Add as keyword" and
carry the advice on the word and the boxes (D18); both Budget sentences say
only last-level rows take an amount and what the Annual column does. The
labels go through StepCardText.labels, quoted in the locale files (D11).
The keyword dialog is unchanged; a test pins that it marks the transactions
as categorized by hand, so the step still checks off through it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
docs(onboarding): changelog and QA cases of the Transactions and Budget cards
All checks were successful
PR Check — Frontend / frontend (pull_request) Successful in 1m58s
6b913709af
The two older QA cases that quoted the previous card sentences now quote
the new ones.

Resolves #430

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
maximus added the
autopilot:pending-human
label 2026-10-14 01:14:59 +00:00
Author
Owner

Self-review (autopilot worker, not an independent review) — verdict: APPROVE

Diff read in full against issue-426-source-name-folder (11 files, head 6b91370).

Acceptance criteria

  • Transactions card names “Add as keyword” between quotes (« » / “ ”) in both sentences, through StepCardText.labels, and carries the advice on the word and the boxes (D18). The step still checks off through the dialog: applyKeywordWithReassignment writes is_manually_categorized = 1, now pinned by a test (M7 red). The dialog is untouched.
  • Budget card says only last-level rows take an amount and what the Annual column does, in collapsed and flat (M3, M4, M6 red).
  • FR and EN complete, texts word for word from the issue; build green, 127 files / 2126 tests green.

Checks

  • Security: text and tests only; no SQL, no network, no Journal line, no path.
  • Regressions: highlight targets and "done" states unchanged (existing tests still assert them); filter stays unquoted ({{filter, lowercase}}), as the convention says.
  • i18n: no hard-coded UI text; the locales test now holds the Transactions and Budget cards to the quoting rule and checks the model's label names equal the sentence's interpolations.
  • CHANGELOG: one Changed entry in both files. No migration touched. Docs: guide step (i18n + Markdown) updated, QA list extended, two stale QA quotes fixed; architecture.md still accurate.

For the reviewer

  • The appended guide sentence keeps the list's no-final-period convention.
  • categorizationService.test.ts is outside the issue's file list (added to prove the second half of criterion 1).
## Self-review (autopilot worker, not an independent review) — verdict: APPROVE Diff read in full against `issue-426-source-name-folder` (11 files, head `6b91370`). **Acceptance criteria** - [x] Transactions card names “Add as keyword” between quotes (« » / “ ”) in both sentences, through `StepCardText.labels`, and carries the advice on the word and the boxes (D18). The step still checks off through the dialog: `applyKeywordWithReassignment` writes `is_manually_categorized = 1`, now pinned by a test (M7 red). The dialog is untouched. - [x] Budget card says only last-level rows take an amount and what the Annual column does, in `collapsed` and `flat` (M3, M4, M6 red). - [x] FR and EN complete, texts word for word from the issue; build green, 127 files / 2126 tests green. **Checks** - Security: text and tests only; no SQL, no network, no Journal line, no path. - Regressions: highlight targets and "done" states unchanged (existing tests still assert them); `filter` stays unquoted (`{{filter, lowercase}}`), as the convention says. - i18n: no hard-coded UI text; the locales test now holds the Transactions and Budget cards to the quoting rule and checks the model's label names equal the sentence's interpolations. - CHANGELOG: one Changed entry in both files. No migration touched. Docs: guide step (i18n + Markdown) updated, QA list extended, two stale QA quotes fixed; `architecture.md` still accurate. **For the reviewer** - The appended guide sentence keeps the list's no-final-period convention. - `categorizationService.test.ts` is outside the issue's file list (added to prove the second half of criterion 1).
Author
Owner

CI lue par l'orchestrateur sur la tête 6b91370 : PR Check — Frontend run 548 vert (build OK, vitest 127 fichiers / 2126 tests, comptes égaux à ceux du worker). Pas de job Rust attendu.

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

CI lue par l'orchestrateur sur la tête `6b91370` : **PR Check — Frontend** run 548 vert (build OK, vitest 127 fichiers / 2126 tests, comptes égaux à ceux du worker). Pas de job Rust attendu. Generated autonomously by /autopilot run of 2026-10-13
Author
Owner

Revue /pr-review — PR #442 (#430), tête 6b91370 contre issue-426-source-name-folder

Verdict : APPROVE

Résumé. Les quatre phrases des cartes Transactions et Budget et la phrase du guide sont celles de l'issue mot pour mot, en FR et en EN (comparaison programmatique du tableau du corps de #430 contre fr.json/en.json : 10/10 identiques). Les contrôles cités passent par StepCardText.labels vers des clés qui existent (reports.keyword.addFromTransaction = « Ajouter comme mot-clé » / “Add as keyword”, budget.annual = « Annuel » / “Annual”, celle-ci étant bien l'en-tête de la colonne dans BudgetTable.tsx), les cibles de mise en évidence sont inchangées et la boîte du mot-clé n'est pas touchée.

Vérifications rejouées par le relecteur

Worktree détaché sur 6b91370, npm ci propre :

  • npm run build vert ; vitest run : 127 fichiers, 2126 tests verts.
  • CI de la tête : PR Check — Frontend en success (statut agrégé).

Mutations du relecteur (une à la fois, restaurées par git checkout --, arbre propre vérifié à la fin) :

# Mutation Résultat
R1 EN all : guillemets droits \"{{addKeyword}}\" au lieu de “ ” 2 rouges (garde des guillemets EN, rendu EN exact)
R2 FR collapsed : guillemets retirés autour de {{expand}} (D11) 2 rouges
R3 FR flat : « Annuel » recopié en dur à la place de {{annual}} 3 rouges (le modèle étiquette une interpolation absente)
R4 uncategorized : addKeyword pointé vers une clé erronée (reports.keyword.add) 5 rouges
R5 cible de mise en évidence de la carte Transactions modifiée 5 rouges

Une première tentative de R1 avait cassé le JSON (guillemet non échappé) : le fichier ne se chargeait plus, ce n'était pas une preuve ; refaite avec un échappement valide, elle rougit.

Le test ajouté dans categorizationService.test.ts épingle is_manually_categorized = 1 sur les UPDATE de applyKeywordWithReassignment, ce qui porte le critère « l'étape se coche toujours par la boîte du mot-clé » (M7 de l'auteur le confirme).

Suggestions (non bloquantes)

  1. Lien de fermeture : le corps de la PR ne porte ni Resolves ni Fixes ; la timeline de #430 montre un pull_ref de #442 en ref_action: none. Seul le message du commit 63d8ba7 contient Resolves #430. Un merge ff de la pile (/merge-stack) fermera bien l'issue par le commit ; un merge par l'interface qui ne lit que le corps ne la fermerait pas. Même forme sur #439 et #441, donc cohérent dans la pile, à garder en tête au merge.
  2. Corps de la PR : il annonce deux anciens cas QA mis à jour ; le diff en touche trois (le troisième, un cas d'import, citait aussi « Cliquez sur la catégorie d'une transaction… »). Le changement est juste, seul le décompte du corps est faux.
  3. Cohérence avec la carte Catégories (décision de planification : « garder les deux textes cohérents ») : cette carte n'existe pas encore sur cette base, elle arrive avec #432 (PR #445). À vérifier dans la revue de #445, contre le tip cumulé.
  4. La phrase ajoutée au guide (docs.gettingStarted…steps[3] et guide-utilisateur.md) n'a pas de test ; pour un texte de documentation, c'est acceptable.

Actions faites

  • Commentaire de verdict posté, label de #430 : status:review → status:approved.
  • Worktree de revue supprimé (git worktree remove), script de mutation et journal de build effacés du scratchpad.
## Revue `/pr-review` — PR #442 (#430), tête `6b91370` contre `issue-426-source-name-folder` **Verdict : APPROVE** **Résumé.** Les quatre phrases des cartes Transactions et Budget et la phrase du guide sont celles de l'issue mot pour mot, en FR et en EN (comparaison programmatique du tableau du corps de #430 contre `fr.json`/`en.json` : 10/10 identiques). Les contrôles cités passent par `StepCardText.labels` vers des clés qui existent (`reports.keyword.addFromTransaction` = « Ajouter comme mot-clé » / “Add as keyword”, `budget.annual` = « Annuel » / “Annual”, celle-ci étant bien l'en-tête de la colonne dans `BudgetTable.tsx`), les cibles de mise en évidence sont inchangées et la boîte du mot-clé n'est pas touchée. ### Vérifications rejouées par le relecteur Worktree détaché sur `6b91370`, `npm ci` propre : - `npm run build` vert ; `vitest run` : 127 fichiers, 2126 tests verts. - CI de la tête : `PR Check — Frontend` en `success` (statut agrégé). Mutations du relecteur (une à la fois, restaurées par `git checkout --`, arbre propre vérifié à la fin) : | # | Mutation | Résultat | |---|---|---| | R1 | EN `all` : guillemets droits `\"{{addKeyword}}\"` au lieu de “ ” | 2 rouges (garde des guillemets EN, rendu EN exact) | | R2 | FR `collapsed` : guillemets retirés autour de `{{expand}}` (D11) | 2 rouges | | R3 | FR `flat` : « Annuel » recopié en dur à la place de `{{annual}}` | 3 rouges (le modèle étiquette une interpolation absente) | | R4 | `uncategorized` : `addKeyword` pointé vers une clé erronée (`reports.keyword.add`) | 5 rouges | | R5 | cible de mise en évidence de la carte Transactions modifiée | 5 rouges | Une première tentative de R1 avait cassé le JSON (guillemet non échappé) : le fichier ne se chargeait plus, ce n'était pas une preuve ; refaite avec un échappement valide, elle rougit. Le test ajouté dans `categorizationService.test.ts` épingle `is_manually_categorized = 1` sur les `UPDATE` de `applyKeywordWithReassignment`, ce qui porte le critère « l'étape se coche toujours par la boîte du mot-clé » (M7 de l'auteur le confirme). ### Suggestions (non bloquantes) 1. **Lien de fermeture** : le corps de la PR ne porte ni `Resolves` ni `Fixes` ; la timeline de #430 montre un `pull_ref` de #442 en `ref_action: none`. Seul le message du commit `63d8ba7` contient `Resolves #430`. Un merge ff de la pile (`/merge-stack`) fermera bien l'issue par le commit ; un merge par l'interface qui ne lit que le corps ne la fermerait pas. Même forme sur #439 et #441, donc cohérent dans la pile, à garder en tête au merge. 2. **Corps de la PR** : il annonce deux anciens cas QA mis à jour ; le diff en touche trois (le troisième, un cas d'import, citait aussi « Cliquez sur la catégorie d'une transaction… »). Le changement est juste, seul le décompte du corps est faux. 3. **Cohérence avec la carte Catégories** (décision de planification : « garder les deux textes cohérents ») : cette carte n'existe pas encore sur cette base, elle arrive avec #432 (PR #445). À vérifier dans la revue de #445, contre le tip cumulé. 4. La phrase ajoutée au guide (`docs.gettingStarted…steps[3]` et `guide-utilisateur.md`) n'a pas de test ; pour un texte de documentation, c'est acceptable. ### Actions faites - Commentaire de verdict posté, label de #430 : `status:review` → `status:approved`. - Worktree de revue supprimé (`git worktree remove`), script de mutation et journal de build effacés du scratchpad.
maximus changed target branch from issue-426-source-name-folder to main 2026-10-16 00:37:21 +00:00
maximus merged commit 6b913709af into main 2026-10-16 00:37:30 +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#442
No description provided.