feat: Journal before the version history in Settings → System, history folded by version (#372) #470
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#470
Loading…
Reference in a new issue
No description provided.
Delete branch "issue-372-systems-journal-first"
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 #372
Generated autonomously by /autopilot run of 2026-10-18
Résumé
Maillon 3 sur 8 de la pile
planned-2026-10-16-lot-v018, basé surissue-449-cargo-locked(PR #469).Paramètres → Système empilait Version, Mise à jour, Historique des versions (une cinquantaine de cartes dépliées), puis Journaux : pour lire le Journal, il fallait descendre sous toute la liste des versions. Désormais :
SystemsSettingsPage.tsx: ordre Version, Mise à jour, Journaux et commentaires, Historique des versions, mention de sécurité des données.ChangelogContentn'est monté qu'une foisgetVersion()résolu. Un rejet, jusqu'ici non géré, laisse la version inconnue : l'historique s'ouvre alors sur la première version publiée, et une lignelogWarnle dit au Journal.ChangelogContent.tsx: la version installée est dépliée, les autres sont repliées derrière leur titre (un bouton dans leh3, avecaria-expanded, un chevron,aria-controlsvers un conteneur toujours présent et untitletraduit « Afficher / Masquer les notes de cette version ») ; un bouton « Tout déplier / Tout replier » ; « Unreleased » / « Non publié » est masqué quand il n'a aucun élément, gardé (replié) quand il a du contenu (build de dev). L'état est unSetlocal, en mémoire, amorcé par la règle pure à chaque lecture du fichier, donc aussi au changement de langue ; une réponse tardive de l'ancienne langue est ignorée.src/utils/changelog.ts(nouveau, pur) :parseChangelogdéplacé sans changement,isPublishedVersion,visibleChangelogEntries,initiallyExpandedVersions(la version installée, sinon la première version publiée quand elle est inconnue ou absente du fichier),toggleVersion,allVersionsExpanded,toggleAllVersions.UpdateCardgarde sa propre lecture (pas d'unification, décision de planification).SettingsHomePage.tsx: la carte Système du hub des paramètres liste les sections de la page dans le nouvel ordre (Version, Mise à jour, Journaux et commentaires, Historique des versions) ;SECTIONSest exporté pour un test qui compare l'ordre des titres de la page à celui de la carte (constat de l'auto-revue, commit5decb98).changelog.expandAll,changelog.collapseAll,changelog.showNotes,changelog.hideNotes;docs.settings(une fonctionnalité, une étape).docs/architecture.md(ligne/settings/systems, pourquoi unSetlocal plutôt queuseCollapsibleGroups, compte des utilitaires),CLAUDE.md(la ligne « Changelog bilingue » décrivait/changelogcomme une page d'historique complet, alors qu'elle redirige vers Paramètres → Système depuis #190), une entrée Modifié / Changed dans les deux CHANGELOG.Critères de l'issue : le Journal est atteignable sans faire défiler l'historique ; les notes de la version installée se lisent sans clic ; l'historique complet reste accessible (titre par titre ou « Tout déplier ») ; la page ne grandit plus d'une carte dépliée par release (une ligne repliée de plus).
Fichiers
src/pages/settings/SystemsSettingsPage.tsxgetVersion(), rejet géré et écrit au Journalsrc/components/settings/ChangelogContent.tsxinstalledVersion, annulation d'une réponse tardivesrc/utils/changelog.tssrc/utils/changelog.test.tssrc/components/settings/ChangelogContent.test.tsxhookHarness: chargement, dépliage, clics, accessibilité, langue)src/pages/settings/SystemsSettingsPage.test.tsxrenderToStaticMarkup, même ordre que la carte Système du hub, montage aprèsgetVersion(), échec)src/pages/settings/SettingsHomePage.tsxSECTIONSexportésrc/i18n/locales/fr.json,en.jsonchangelog.*, un élément dedocs.settings.featureset dedocs.settings.stepsdocs/guide-utilisateur.mddocs/architecture.md/settings/systems(ordre, montage, repli, carte du hub), note soususeCollapsibleGroups,utils/(19)CLAUDE.mdCHANGELOG.md,CHANGELOG.fr.mdDécisions
Toutes consignées dans
reports/run-2026-10-18-lot-v018/decisions-log.md: 4 HIGH, 9 MEDIUM, 0 LOW.HIGH — « Plan d'exécution » appliqué contre le corps : pas de
useCollapsibleGroups,Setlocal amorcé par la règle pure, montage aprèsgetVersion(),parseChangelogdanssrc/utils/changelog.ts,UpdateCardintact.MEDIUM — L'en-tête non publié se reconnaît à sa forme, pas à son libellé : une version publiée correspond à
/^\d+\.\d+/. Le fichier français dit[Non publié], l'anglais[Unreleased]; une liste de libellés casserait en silence à un renommage.MEDIUM — « Vide » = aucun élément sous aucune section (couvre « aucune section » de l'issue et un
### Addedlaissé sans élément). Une version publiée reste toujours affichée, même sans élément.MEDIUM — Accessibilité : motif accordéon (
h3 > button), nom accessible = le numéro visible (Label in Name),aria-expanded, chevronaria-hidden,aria-controlsvers un conteneur toujours présent (motif d'OnboardingBanner, identifiants par index car un libellé peut contenir une espace),titletraduit selon l'état comme description et infobulle. Écarté : unaria-label« Notes de version : X », qui remplace le texte visible et se lit mal sur « Non publié ».MEDIUM — Un seul bouton bascule (motif de
BudgetTable) : « Tout déplier » tant qu'une version est repliée, « Tout replier » quand toutes sont dépliées, à la main comprise ; clés propres souschangelog.*plutôt quereports.collapse.*.MEDIUM — Changement de langue : rechargement du fichier et nouvel amorçage (la version installée est de nouveau dépliée) ; drapeau d'annulation pour qu'une réponse tardive de l'ancienne langue ne remplace pas la nouvelle.
MEDIUM — Rejet de
getVersion():catchajouté, versionnull, lignelogWarn(texte fixe plus l'erreur IPC, aucun chemin) ; la ligne de version reste vide, comme avant.MEDIUM — Canari sur les vrais fichiers : les deux CHANGELOG se lisent en un en-tête non publié puis des numéros seulement (avec et sans crochets), la même liste de versions publiées en FR et en EN, et la règle ouvre exactement la version de
tauri.conf.json(celle que rendgetVersion()). Tient parce que/releasemonte la version et ajoute les deux en-têtes dans le même commit.MEDIUM — Docs : deux corrections d'exactitude hors de la liste de l'issue, sur la fonction touchée, la ligne « Changelog bilingue » de
CLAUDE.md(prémisse fausse qui avait égaré le corps d'origine de l'issue) et le compte deutils/dansdocs/architecture.md(16 → 19 :startupConnectionetrootFilesn'avaient pas été comptés, pluschangelog) ; dans le guide etdocs.settings, l'étape et la fonctionnalité sont insérées juste après celles des Journaux (étapes suivantes du guide renumérotées), à l'identique en FR et en EN.MEDIUM — Constat de l'auto-revue, corrigé dans
5decb98: la carte Système du hub des paramètres listait encore l'historique avant les journaux. Puces remises dans l'ordre de la page, et un test compare l'ordre des titres de la page à celui de la carte. Écarté : un rendu séparé deSettingsHomePage(il faudraitPageHelpet un routeur, sans lier les deux ordres).Preuves
src/zz_tmp_probe.test.tsavec unexpect(1).toBe(2)→npx vitest run src/zz_tmp_probe.test.tssonde rc=1, fichier supprimé.npm run buildvert (tsc + vite).npm testsur la tête5decb98: 141 fichiers / 2348 tests verts dans le worktree, soit 3 fichiers et 43 tests de plus que la base. Aucun fichier Rust touché.92b3e54, puis5decb98pour H1 et la reprise de P1) ; une à la fois, restauration pargit checkout --,git status --shortvide après chacune.src/utils/changelog.tsinstalled = undefined)src/utils/changelog.tssrc/utils/changelog.tssrc/utils/changelog.tsfilter(() => true))src/utils/changelog.tssrc/utils/changelog.tssrc/utils/changelog.tsUnreleased(le français échappe)src/utils/changelog.tssrc/utils/changelog.tssrc/utils/changelog.tssome)src/utils/changelog.tsChangelogContent.tsxChangelogContent.tsxaria-expandedinverséChangelogContent.tsxChangelogContent.tsx[](pas de rechargement au changement de langue)ChangelogContent.tsxChangelogContent.tsxChangelogContent.tsxChangelogContent.tsxid(aria-controlsorphelin)ChangelogContent.tsxtitleAfficher / Masquer inversésSystemsSettingsPage.tsx5decb98)SystemsSettingsPage.tsxgetVersion()SystemsSettingsPage.tsxsetVersion(null)(historique jamais monté)SystemsSettingsPage.tsxSettingsHomePage.tsxsrc/i18n/locales/en.jsonchangelog.hideNotesretiré de l'anglais seulementLes mutations R* ont tourné sur
changelog.test.tsetChangelogContent.test.tsx(38 tests), C* surChangelogContent.test.tsx, P* et H1 surSystemsSettingsPage.test.tsx, I1 sursrc/i18n/locales.keys.test.ts.Vérifications manuelles dues (prochaine release)
[Unreleased]est vidé au tag). Dansnpm run tauri dev, avec du contenu sous[Unreleased], la carte « Non publié » apparaît en tête, repliée.À regarder
isPublishedVersionreconnaît une version à sa forme (/^\d+\.\d+/) : un en-tête qui ne commencerait pas par un chiffre serait traité comme non publié (masqué s'il est vide, jamais pris pour « la première version publiée »). Le canari sur les vrais fichiers le vérifie pour les 51 en-têtes de version actuels, avec et sans crochets.logWarnd'un rejet degetVersion()est de niveau warn : elle peut partir avec une rétroaction si l'utilisateur coche « Inclure les derniers logs d'erreur » (getRecentErrorLogsprend warn et error). Elle ne contient qu'un texte fixe et l'erreur IPC, aucun chemin ni donnée de l'utilisateur.changelog.test.tslie la suite à la règle de/release(version et en-têtes dans le même commit) : un tag dont l'en-tête manquerait dans un des fichiers ferait rougirnpm test.fetchlocal du CHANGELOG embarqué garde son URL ;CLAUDE.mdetdocs/architecture.mdau moins normaux).🤖 Generated with Claude Code
Niveau : normal
Verdict : APPROVE
Auto-revue de l'auteur (worker /autopilot), pas une revue indépendante. Le label
status:approvedn'est pas posé ; l'issue reste enstatus:reviewjusqu'à un/pr-reviewindépendant.Niveau (Step 0bis,
REVIEW.mddemain)14 fichiers. Aucune ligne Haut remplie : pas d'appel réseau ajouté ni modifié (le
fetchlocal du CHANGELOG embarqué garde son URL,getVersion()est l'appel IPC existant), aucun consentement touché, aucun manifeste, lock, workflow ni fichier de la racine ajouté.CLAUDE.mdetdocs/architecture.mdrestent au moins normaux ; le code desrc/**, les tests et les deux locales sont normaux ; les CHANGELOG et le guide sont bas. Cas examiné : la nouvelle lignelogWarnpeut partir avec une rétroaction si l'utilisateur coche l'envoi des derniers logs (getRecentErrorLogsprend warn et error) ; elle ne porte qu'un texte fixe et l'erreur IPC, aucun chemin ni donnée de l'utilisateur, et ne change pas ce que l'appel de rétroaction envoie en nature. PR : normal.Résumé
Paramètres → Système passe à Version, Mise à jour, Journaux et commentaires, Historique des versions ; l'historique s'ouvre sur la version installée, les autres versions repliées derrière un titre-bouton, avec « Tout déplier / Tout replier » ; « Unreleased » vide masqué. Conforme au « Plan d'exécution » de l'issue (pas de
useCollapsibleGroups,Setlocal amorcé par une règle pure, montage aprèsgetVersion(),parseChangelogdéplacé sans changement danssrc/utils/changelog.ts,UpdateCardintact).Checklist
dangerouslySetInnerHTML) ; aucune dépendance ajoutée.getVersion(), jusqu'ici non géré, est attrapé (src/pages/settings/SystemsSettingsPage.tsx:21).hookHarness, fauxtdesrc/test/i18nMock.ts, rendus parrenderToStaticMarkup) ; 26 mutations, toutes rouges (tableau du corps de la PR ; P1 rejouée sur5decb98) ; sonde rc=1 ;npm run buildetnpm testverts (141 fichiers / 2348 tests) sur5decb98. Niskipnionly.docs.settings,docs/architecture.mdetCLAUDE.mdà jour. Aucune migration, aucun SQL.pull_refde cette PR, de type fermeture ; aucun autre verbe de fermeture dans le corps ; le mot-clé de fermeture est dans les messages de0513d71et5decb98.Constats
5decb98) La carte Système du hub des paramètres listait encore ses puces dans l'ancien ordre (historique avant journaux) :src/pages/settings/SettingsHomePage.tsx:44-47. Puces remises dans l'ordre de la page ; un test desrc/pages/settings/SystemsSettingsPage.test.tsxcompare désormais l'ordre des titres de la page aux puces (mutation H1 rouge, P1 rouge deux fois).Aucun constat ouvert.
Suggestions (non bloquantes)
src/utils/changelog.ts:64-65: une version se reconnaît à sa forme (/^\d+\.\d+/). Un futur en-tête de version qui ne commencerait pas par un chiffre (## v1.0.0) serait pris pour un en-tête non publié ; le canari desrc/utils/changelog.test.tsle signalerait sur les vrais fichiers.src/utils/changelog.test.ts:197-201: le canari lit la version detauri.conf.jsonet exige son en-tête dans les deux CHANGELOG. Il tient tant que/releasemonte la version et ajoute les en-têtes dans le même commit ; un tag incomplet ferait rougirnpm test, ce qui est voulu.src/components/settings/ChangelogContent.tsx:88: l'infobulle (title) change avec l'état, en plus d'aria-expanded. Le nom accessible reste le numéro visible (Label in Name) ; à confirmer au lecteur d'écran lors des vérifications manuelles si Max le souhaite.CI lue par l'orchestrateur du run
/autopilotdu 2026-10-18 :check-frontendvert sur la tête5decb98(run 576).src/utils/changelog.test.ts(22 tests),src/components/settings/ChangelogContent.test.tsx(16) etsrc/pages/settings/SystemsSettingsPage.test.tsx(5). La gardesrc/i18n/locales.keys.test.ts(8) est aussi verte.check-rustne s'applique pas à ce maillon (aucun chemin Rust touché).npm cidu worker est parti du dossierreports/et a réinstallé lesnode_modulesde l'arbre principal à partir de son lock, qui n'a pas changé. L'arbre principal est resté propre (git statusvide).Niveau : normal
Verdict : APPROVE
Résumé
Paramètres → Système passe à Version, Mise à jour, Journaux et commentaires, Historique des versions, et l'historique s'ouvre sur la version installée, les autres versions repliées derrière un titre-bouton. Le code suit le « Plan d'exécution » de #372 et tient ses critères d'acceptation ; neuf mutations du relecteur sur dix rougissent, la survivante est une épingle manquante sur un code correct (suggestion 1).
Niveau (Step 0bis,
REVIEW.mddemain)14 fichiers. Code de
src/**: aucune ligne Haut remplie. LefetchdeChangelogContentgarde ses deux URL locales (/CHANGELOG.fr.md,/CHANGELOG.md, servies depuispublic/), aucun appel réseau n'est ajouté, et la lignelogWarnajoutée ne change pas la forme de ce qu'envoie la rétroaction (texte fixe et erreur IPC, aucun chemin).CLAUDE.mdetdocs/architecture.mdrestent au moins normaux ; les deux CHANGELOG et le guide sont bas. Aucun fichier ajouté, renommé ni supprimé à la racine ou danssrc-tauri/. PR : normal.Ce que j'ai exécuté
Copie hors dépôt (clone local, tête
5decb98détachée),npm ci:expect(1).toBe(2)) : rc=1 ;npm run buildvert (tsc + vite) ;npx vitest run: 141 fichiers, 2348 tests verts, le compte du corps de la PR ; journal du run 576 decheck-frontendlu : tête5decb98, Node v24.22.0, même compte, « Job succeeded » ;git checkout --dans la copie (git status --shortvide avant et après chacune), sur les trois fichiers de test de la PR (43 tests) :ChangelogContent.tsx.catchsans le testcancelled: un échec tardif de l'ancienne langue est appliquéChangelogContent.tsxChangelogContent.tsxvisibleChangelogEntriesChangelogContent.tsxchangelog.tstoggleVersionmodifie l'ensemble reçu au lieu d'en rendre un nouveau (React ignorerait le clic)SystemsSettingsPage.tsxgetVersion(), jamais après un échecchangelog.tssrc-tauri/tauri.conf.jsonCHANGELOG.fr.md[0.17.1]retiré du français seul (canari)ChangelogContent.tsxiddes notes posé seulement quand la version est dépliée (aria-controlsorphelin)Checklist
dangerouslySetInnerHTML) ; aucune dépendance ajoutée (les icônes viennent delucide-react, déjà présent).REVIEW.md) : la lignelogWarndu rejet degetVersion()porte un texte fixe et l'erreur IPC, aucun chemin ; elle peut partir avec une rétroaction si l'utilisateur coche l'envoi des derniers logs, ce que le corps de la PR signale.getVersion()désormais géré. LeSetlocal plutôt queuseCollapsibleGroupssuit la décision de Max : le hook n'a qu'undefaultExpandedglobal (src/hooks/useCollapsibleGroups.ts:52).skipnionly; les tests deChangelogContentrendent de nouveau après chaque clic, comme le harnais l'exige (piège « Tests sans jsdom ») ; le canari sur les vrais fichiers sait échouer (V8, V9).changelog.*en FR et en EN ; l'élément ajouté àdocs.settings.featureset àdocs.settings.stepsest au même rang dans les deux langues (10 et 9 éléments de chaque côté) ; garde de #453 verte dans la suite complète.docs.settingsà jour ;docs/architecture.mdexact (ligne/settings/systems, note soususeCollapsibleGroups,utils/à 19, soit les 18 fichiers de la base pluschangelog.ts) ;CLAUDE.mdexact (src/pages/ChangelogPage.tsxest un<Navigate to="/settings/systems" replace />) ; une entrée Changed / Modifié dans les deux CHANGELOG.pull_refde cette PR, de typecloses; #453 et #190 cités sans fermeture (none).Resolves #372figure aussi dans les messages de0513d71et5decb98: un merge ff ferme l'issue.feat:,docs:,fix:), en anglais.Suggestions (non bloquantes)
src/components/settings/ChangelogContent.tsx:44: leif (!cancelled)du.catchest correct, mais aucun test ne le tient ; sans lui, les 43 tests restent verts. Cas qu'il protège : changement de langue pendant le chargement, le fichier de l'ancienne langue échoue après la réponse du nouveau, et l'historique affiche « Aucune entrée disponible » alors que le bon fichier est lu. Peu probable (fichier embarqué), donc pas de tour de revue de plus : un test calqué sur « never lets a late answer of the previous language replace the current one », avec la réponse française rejetée au lieu de résolue, suffit, dans cette PR ou en suivi.src/utils/changelog.test.ts(« the real changelogs ») ne garde pas le commit de release lui-même :/releaselancenpm testau pré-vol, avant le bump (étape 0), et le commit de release va surmainsans PR ni CI ; une PR qui ne toucherait que les CHANGELOG ousrc-tauri/ne lance pascheck-frontendnon plus. Un en-tête oublié rougira donc la première PR suivante qui touchesrc/, sans lien avec elle (l'app, elle, retombe sur la première version publiée). Pour l'attraper au bon moment :npx vitest run src/utils/changelog.test.tsaprès l'étape 3 de/release..claude/skills/release/**est de niveau haut : issue de suivi, pas dans cette PR.CHANGELOG.md:7(« pushes the Journal to the bottom ») : l'interface anglaise ne dit jamais « Journal » (aucune occurrence dansen.json; carte « Logs », section « Logs and feedback »), et ce texte s'affiche dans l'app. « the logs » se lirait mieux. Même remarque, plus légère, pour « le Journal » deCHANGELOG.fr.md:7(carte « Journaux »). L'entrée anglaise de #395, dans la 0.17.2, emploie déjà ce mot.Vérifications manuelles
Les six points de la section « Vérifications manuelles dues » du corps restent dus dans l'app lancée : cette revue n'a pas lancé l'app (ni thèmes, ni clavier, ni lecteur d'écran).
Actions faites
/tmp/pr470-review/supprimée en fin de revue. Reste dans/tmpunpr470-review.mdqui n'est pas de cette revue : brouillon de l'auto-revue du worker/autopilot(même texte que le commentaire 25221), laissé en place.status:review→status:approved.View command line instructions
Checkout
From your project repository, check out a new branch and test the changes.Merge
Merge the changes and update on Forgejo.