Journal : un nom de dossier contenant « ) » suivi d'un mot, un accent grave, « ; » ou « | » reste en partie dans les lignes du rattrapage des profils #478

Open
opened 2026-10-20 00:32:07 +00:00 by maximus · 0 comments
Owner

Contexte

Relevé par la revue indépendante de la PR #473 (#437, commentaire 25443), en relisant le commit 86eff9b de #395. Décision de Max (2026-10-19) : issue de suivi, priorité basse.

Constat

withoutFolders (src/services/db.ts) retire les dossiers d'un chemin avant d'écrire une ligne au Journal. Un caractère d'arrêt à l'intérieur d'un nom de dossier (accent grave, ;, |, ou ) non suivi d'un séparateur) termine le chemin à cet endroit : le nom de ce dossier, ou son début, reste dans la ligne. Sondes de la revue sur la tête de #473 :

  • C:\Users\Jean (Work) Smith\AppData\x.db → Jean (Work) x.db
  • C:\Users\jean\My;Docs\x.db → My;Docs-x.db

Le Journal part avec une rétroaction si l'utilisateur coche l'envoi des journaux. Le cas est documenté comme seconde limite dans l'ADR 0021 §7 par la PR #473, sans correction : #437 excluait tout changement de comportement.

Pourquoi priorité basse

withoutFolders est la seconde barrière : scrub, côté Rust, remplace déjà le dossier des profils par <profile folder>. Un nom de compte local Windows ne peut contenir ni ;, ni |, ni ,, ni :. Le cas réaliste est un nom de compte avec des parenthèses suivies d'un autre mot, dans un chemin que scrub n'a pas remplacé.

Piste, à trancher par /analyze

Distinguer une parenthèse qui ferme une phrase (« (see /x/y.db) and ») d'une parenthèse dans un nom de dossier (Jean (Work) Smith\) demande une autre heuristique. Autre voie : ne garder que le dernier segment quand un séparateur suit le caractère d'arrêt.

Critères d'acceptation

  • Les deux exemples ci-dessus ne laissent aucun nom de dossier dans la ligne.
  • Les cas existants de db.test.ts restent verts (arrêts de chemin, chemins avec espaces).
  • L'ADR 0021 §7 ne décrit plus cette limite, ou la décrit telle qu'elle reste.

Liens : #395, #437, PR #473 (commentaire 25443), ADR 0021 §7.

Analyse (/analyze, 2026-10-20, main 45d8493)

Prémisse confirmée par une sonde sur le code de main (helpers de withoutFolders rejoués tels quels) :

Entrée Sortie actuelle
C:\Users\Jean (Work) Smith\AppData\x.db Jean (Work) x.db
C:\Users\jean\My;Docs\x.db My;Docs-x.db
C:\Users\jean\My|Docs\x.db My|Docs-x.db
C:\Users\jean\My`Docs\x.db My`Docs-x.db
unable to open C:\Users\Jean (Work) Smith\AppData\x.db: disk I/O error unable to open Jean (Work) x.db: disk I-O error
C:\Program Files (x86)\App\x.db, /home/jean (work)/x.db x.db (déjà juste : ) suivi d'un séparateur)

Les arrêts de lastSeparator (src/services/db.ts) sont de deux natures. Les arrêts durs ne peuvent pas être dans un nom de dossier Windows ou n'y sont jamais : saut de ligne, ", , ou : suivis d'un blanc, blanc suivi d'un autre chemin. Les arrêts mous le peuvent : ;, |, accent grave, ) suivi d'autre chose qu'un séparateur. Quand rien n'arrête le chemin, la règle actuelle est déjà prudente : la coupe va au dernier séparateur de la ligne.

Options examinées

  • A, lookahead (piste du corps) : à un arrêt mou, continuer si un séparateur suit avant un arrêt dur. Contre-exemple déjà dans db.test.ts : (see /x/y.db) and I/O porte un séparateur après ), dans I/O ; distinguer I/O de Smith\AppData\x.db demande une heuristique qu'aucune règle propre ne fournit.
  • B, retirer les arrêts mous et laisser la règle prudente faire. Les deux exemples donnent x.db ; path=/a/x.db;next reste path=x.db;next (aucun séparateur après) ; (see /x/y.db) and C:\Users\Bob\z.db reste (see y.db) and z.db (le blanc suivi d'un chemin arrête toujours). Coût : /a/x.db; I/O devient O et (see /a/x.db) and I/O devient (see O ; ce motif n'est pas un message SQLite réel (: disk I/O error passe par l'arrêt dur : + blanc).
  • C, limite acceptée : scrub côté Rust remplace déjà le dossier des profils, seul chemin qui atteint le Journal aujourd'hui.

Décision de Max (2026-10-20, réponse à /analyze) : option B. Une ligne d'erreur moins lisible dans un cas théorique vaut mieux qu'un nom d'utilisateur dans une rétroaction (Loi 25).

Travail à faire

  • src/services/db.ts : PATH_STOP réduit à /[\n\r"]/ et la branche ) de lastSeparator retirée ; BEFORE_START, LAST_SEGMENT, PATH_RUN et newPathAfter inchangés. Docblock de withoutFolders mis à jour (liste des arrêts, coût de la règle prudente).
  • src/services/db.test.ts : les deux exemples du corps, plus | et l'accent grave, attendus à x.db sans aucun mot du dossier (même not.toMatch que la table existante) ; path=/home/marie claire/x.db;next toujours path=x.db;next ; le it.each « ends the folders at %j » perd ;, | et l'accent grave (ils donnent désormais O, à épingler dans un test nommé « drops more text rather than a folder ») ; la ligne (see /home/marie claire/x.db) and I/O de la table passe à (see O.
  • Mutation : remettre ; dans PATH_STOP fait rougir le cas My;Docs ; remettre la branche ) fait rougir le cas Jean (Work) Smith.
  • ADR 0021 §7 : la liste des arrêts et la phrase « Deux limites (précisées par #437) » réécrites : une limite reste (chemin relatif sans début reconnu), la seconde disparaît, et le coût de la règle prudente est dit (; I/O après un chemin perd son suffixe).
  • CHANGELOG (Fixed / Corrigé) : une ligne, le Journal ne garde plus le nom d'un dossier qui contient ;, |, un accent grave ou une parenthèse fermante.

Fichiers concernés

  • src/services/db.ts — PATH_STOP, lastSeparator, docblock.
  • src/services/db.test.ts — cas de régression et deux attentes réécrites.
  • docs/adr/0021-migrations-profils-secondaires.md §7.
  • CHANGELOG.md, CHANGELOG.fr.md.

Surface de test

  • Existants : src/services/db.test.ts (lignes ~700-760, withoutFolders), describePreparation dans le même fichier.
  • Régression : oui (type:bug), les quatre entrées du tableau ci-dessus.
  • Niveau de revue : normal (db.ts reste normal même sur le verrou, décision de Max du 2026-10-18).

Complexité

Simple. Prochaine étape : /fix-issue 478.

## Contexte Relevé par la revue indépendante de la PR #473 (#437, commentaire 25443), en relisant le commit `86eff9b` de #395. **Décision de Max (2026-10-19)** : issue de suivi, **priorité basse**. ## Constat `withoutFolders` (`src/services/db.ts`) retire les dossiers d'un chemin avant d'écrire une ligne au Journal. Un caractère d'arrêt à l'intérieur d'un nom de dossier (accent grave, `;`, `|`, ou `)` non suivi d'un séparateur) termine le chemin à cet endroit : le nom de ce dossier, ou son début, reste dans la ligne. Sondes de la revue sur la tête de #473 : - `C:\Users\Jean (Work) Smith\AppData\x.db` → `Jean (Work) x.db` - `C:\Users\jean\My;Docs\x.db` → `My;Docs-x.db` Le Journal part avec une rétroaction si l'utilisateur coche l'envoi des journaux. Le cas est documenté comme seconde limite dans l'ADR 0021 §7 par la PR #473, sans correction : #437 excluait tout changement de comportement. ## Pourquoi priorité basse `withoutFolders` est la seconde barrière : `scrub`, côté Rust, remplace déjà le dossier des profils par `<profile folder>`. Un nom de compte local Windows ne peut contenir ni `;`, ni `|`, ni `,`, ni `:`. Le cas réaliste est un nom de compte avec des parenthèses suivies d'un autre mot, dans un chemin que `scrub` n'a pas remplacé. ## Piste, à trancher par `/analyze` Distinguer une parenthèse qui ferme une phrase (« (see /x/y.db) and ») d'une parenthèse dans un nom de dossier (`Jean (Work) Smith\`) demande une autre heuristique. Autre voie : ne garder que le dernier segment quand un séparateur suit le caractère d'arrêt. ## Critères d'acceptation - [ ] Les deux exemples ci-dessus ne laissent aucun nom de dossier dans la ligne. - [ ] Les cas existants de `db.test.ts` restent verts (arrêts de chemin, chemins avec espaces). - [ ] L'ADR 0021 §7 ne décrit plus cette limite, ou la décrit telle qu'elle reste. Liens : #395, #437, PR #473 (commentaire 25443), ADR 0021 §7. ## Analyse (`/analyze`, 2026-10-20, `main` `45d8493`) Prémisse confirmée par une sonde sur le code de `main` (helpers de `withoutFolders` rejoués tels quels) : | Entrée | Sortie actuelle | |---|---| | `C:\Users\Jean (Work) Smith\AppData\x.db` | `Jean (Work) x.db` | | `C:\Users\jean\My;Docs\x.db` | `My;Docs-x.db` | | `C:\Users\jean\My\|Docs\x.db` | `My\|Docs-x.db` | | ``C:\Users\jean\My`Docs\x.db`` | ``My`Docs-x.db`` | | `unable to open C:\Users\Jean (Work) Smith\AppData\x.db: disk I/O error` | `unable to open Jean (Work) x.db: disk I-O error` | | `C:\Program Files (x86)\App\x.db`, `/home/jean (work)/x.db` | `x.db` (déjà juste : `)` suivi d'un séparateur) | Les arrêts de `lastSeparator` (`src/services/db.ts`) sont de deux natures. Les arrêts durs ne peuvent pas être dans un nom de dossier Windows ou n'y sont jamais : saut de ligne, `"`, `,` ou `:` suivis d'un blanc, blanc suivi d'un autre chemin. Les arrêts mous le peuvent : `;`, `|`, accent grave, `)` suivi d'autre chose qu'un séparateur. Quand rien n'arrête le chemin, la règle actuelle est déjà prudente : la coupe va au dernier séparateur de la ligne. ### Options examinées - **A, lookahead** (piste du corps) : à un arrêt mou, continuer si un séparateur suit avant un arrêt dur. Contre-exemple déjà dans `db.test.ts` : `(see /x/y.db) and I/O` porte un séparateur après `)`, dans `I/O` ; distinguer `I/O` de `Smith\AppData\x.db` demande une heuristique qu'aucune règle propre ne fournit. - **B, retirer les arrêts mous** et laisser la règle prudente faire. Les deux exemples donnent `x.db` ; `path=/a/x.db;next` reste `path=x.db;next` (aucun séparateur après) ; `(see /x/y.db) and C:\Users\Bob\z.db` reste `(see y.db) and z.db` (le blanc suivi d'un chemin arrête toujours). Coût : `/a/x.db; I/O` devient `O` et `(see /a/x.db) and I/O` devient `(see O` ; ce motif n'est pas un message SQLite réel (`: disk I/O error` passe par l'arrêt dur `:` + blanc). - **C, limite acceptée** : `scrub` côté Rust remplace déjà le dossier des profils, seul chemin qui atteint le Journal aujourd'hui. **Décision de Max (2026-10-20, réponse à `/analyze`) : option B.** Une ligne d'erreur moins lisible dans un cas théorique vaut mieux qu'un nom d'utilisateur dans une rétroaction (Loi 25). ### Travail à faire - [ ] `src/services/db.ts` : `PATH_STOP` réduit à `/[\n\r"]/` et la branche `)` de `lastSeparator` retirée ; `BEFORE_START`, `LAST_SEGMENT`, `PATH_RUN` et `newPathAfter` inchangés. Docblock de `withoutFolders` mis à jour (liste des arrêts, coût de la règle prudente). - [ ] `src/services/db.test.ts` : les deux exemples du corps, plus `|` et l'accent grave, attendus à `x.db` sans aucun mot du dossier (même `not.toMatch` que la table existante) ; `path=/home/marie claire/x.db;next` toujours `path=x.db;next` ; le `it.each` « ends the folders at %j » perd `;`, `|` et l'accent grave (ils donnent désormais `O`, à épingler dans un test nommé « drops more text rather than a folder ») ; la ligne `(see /home/marie claire/x.db) and I/O` de la table passe à `(see O`. - [ ] Mutation : remettre `;` dans `PATH_STOP` fait rougir le cas `My;Docs` ; remettre la branche `)` fait rougir le cas `Jean (Work) Smith`. - [ ] ADR 0021 §7 : la liste des arrêts et la phrase « Deux limites (précisées par #437) » réécrites : une limite reste (chemin relatif sans début reconnu), la seconde disparaît, et le coût de la règle prudente est dit (`; I/O` après un chemin perd son suffixe). - [ ] CHANGELOG (Fixed / Corrigé) : une ligne, le Journal ne garde plus le nom d'un dossier qui contient `;`, `|`, un accent grave ou une parenthèse fermante. ### Fichiers concernés - `src/services/db.ts` — `PATH_STOP`, `lastSeparator`, docblock. - `src/services/db.test.ts` — cas de régression et deux attentes réécrites. - `docs/adr/0021-migrations-profils-secondaires.md` §7. - `CHANGELOG.md`, `CHANGELOG.fr.md`. ### Surface de test - Existants : `src/services/db.test.ts` (lignes ~700-760, `withoutFolders`), `describePreparation` dans le même fichier. - Régression : oui (`type:bug`), les quatre entrées du tableau ci-dessus. - Niveau de revue : normal (`db.ts` reste normal même sur le verrou, décision de Max du 2026-10-18). ### Complexité Simple. Prochaine étape : `/fix-issue 478`.
maximus added the
status:triage
type:bug
source:human
labels 2026-10-20 00:32:07 +00:00
maximus added
status:ready
and removed
status:triage
labels 2026-10-21 01:04:29 +00:00
Sign in to join this conversation.
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#478
No description provided.