Suivis de la revue de #394 : copie nommée sur un rattrapage arrêté, violations préexistantes épinglées, délai de démarrage, rétention des copies #395
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#395
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
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?
Suggestions non bloquantes de la revue de la PR #394 (#390), restées hors de la PR : voir le commentaire de revue. Les suggestions 1, 3, 4 et 8 ont été appliquées en tête de la PR (commit
5910387).1. Le Journal ne nomme pas la copie quand le rattrapage s'arrête (suggestion 2)
Sur une erreur de l'écriture de l'historique ou de
apply_pending,catch_uprendErr(String)etreport.backup_fileest perdu. La ligne d'erreur ditapplied before stopping: [...]sans le nom de la copie, alors que c'est le cas où on en a besoin.src-tauri/src/database/profile_db.rs(catch_up,prepare_at),src/services/db.ts(describePreparation),src/services/db.test.ts2. Deux comportements de la reprise sans clés étrangères ne sont épinglés nulle part (suggestion 5)
fk_violationstoujours vide) et RT2 côté Journal (la lignepoint to a missing rowdisparaît). Les deux restent vertes.beforevide), restée verte. Elle remettrait à NULL des lignes sans rapport avec la migration.src-tauri/src/database/profile_db.rs(tests deretry_without_foreign_keys,repair_new_violations),src/services/db.test.tspoint to a missing rowcouvre RT2.3. Le délai de démarrage couvre maintenant le rattrapage (suggestion 6)
App.tsxarme un délai de 10 s (STARTUP_TIMEOUT_MS) autour deconnectActiveProfile. Ce délai couvre désormais le rattrapage du profil actif. Au-delà,startupErrorreste posé et la page d'erreur s'affiche alors que le rattrapage aboutit. Ce cas est peu probable avec des bases de taille courante.src/App.tsx,docs/adr/0021-migrations-profils-secondaires.md(points de vigilance)4. Les copies s'accumulent (suggestion 7)
Chaque lot de versions futures ajoute un
-before-vN.dben clair par profil secondaire, que seule la suppression du profil retire. Une copie existante est aussi gardée telle quelle : après un rattrapage qui a échoué puis abouti plus tard à partir de la même version, elle précède les données saisies entre-temps.src-tauri/src/database/profile_db.rs(backup_to,remove_backups),docs/guide-utilisateur.mdet les clésdocs.profiles.tipsdesrc/i18n/locales/fr.jsoneten.jsonCritères
Depends on
Fichiers concernés (complet)
src-tauri/src/database/profile_db.rs(catch_up,prepare_at,backup_to,remove_backups,ProfilePreparation, tests)src/services/db.ts(ProfilePreparation,describePreparation, message de repli:185-189),src/services/db.test.tssrc/App.tsx(STARTUP_TIMEOUT_MS, succès tardif) et son test s'il existe, sinon un test de la logique extraitedocs/adr/0021-migrations-profils-secondaires.md(mesure, risque, rétention)docs/guide-utilisateur.md:79, clésdocs.profiles.tipsdesrc/i18n/locales/fr.jsoneten.jsonCHANGELOG.md,CHANGELOG.fr.mdCritères d'acceptation (planification)
1. Copie nommée sur un rattrapage arrêté
catch_up_backup: Option<String>deProfilePreparation(Rust et interface TS), rempli dès que la copie est prise, même si le rattrapage échoue ensuite. La ligne d'erreur du Journal (describePreparation) le nomme.history_write_failed,pragma_failed,apply_pending.backup_to, jamais un chemin ; test : aucune ligne d'erreur du Journal ne contient/ni\. Le message de repli JS (db.ts:185-189) passe aussi sans chemin (dossier remplacé ou message tronqué).2. Épingles : RV4, RV7 et RT2 rougissent chacune au moins un test (corps d'origine).
3. Délai de démarrage
connectActiveProfilequi réussit après le délai garde la page d'erreur (App.tsx:56-58ne remet passtartupErrorànull). Corriger (succès =setStartupError(null)) et l'épingler par un test.#[ignore]qui construit un profil synthétique au plancher le plus bas reconnu parinfer_floor(partir des fixtures des états publiés), avec 100 000 transactions, et mesureprepare_at(copieVACUUM INTO,foreign_key_check, réparation des drapeaux comprises) ; il affiche la durée sans l'asserter. Lancé une fois en local (cargo test -- --ignored), durée collée dans la PR.STARTUP_TIMEOUT_MS= 30 000 ; sinon 10 000 inchangé. Mesure, machine, règle appliquée et risque résiduel écrits dans les points de vigilance de l'ADR 0021.4. Rétention des copies
.tmp, synchronisée, puis renommée par-dessus une copie de même nom (jamais supprimer d'abord).<profil>-before-v*.db(et.db.tmp) de ce profil sont supprimés :remove_backups(dir, stem, keep: Option<&str>). Rien n'est supprimé quand le rattrapage s'arrête sur une erreur ou quand la copie échoue.guide-utilisateur.md:79,docs.profiles.tips) : une seule copie par profil, la plus récente, refaite à chaque mise à jour de la base, supprimée avec le profil.Review caveats
prepare_profile_dbest synchrone, que Tauri exécute sur le thread principal (profile_commands.rs:184-191), donc les appels se suivent.VACUUM INTO,PRAGMA foreign_key_checket la réparation des drapeaux, proportionnels à la taille de la base. Le délai couvre aussirepair_migrationsetDatabase.load.VACUUM INTOà chaque ouverture tant que le rattrapage échoue : accepté.connectToProfilecouvre le rattrapage : une durée > 15 s produit l'alerte « ouverture de profil » de #408 (attendu).Décisions prises en planification
catch_up_backup(décision de planification).docs/architecture.mdfixées pour toute la milestone :### Accès DB et transactions(sous la section Base de données) et## Tests (vitest sans jsdom)(juste avant CI/CD). La première issue de la pile qui en a besoin crée la section ; les suivantes y ajoutent.db.ts) et de #389 pour l'ordre de pile.Spec source
spec-plan-fiabilite-tests.md(local, ignoré par git)