# Delta `0.1.4-pre.015-fix.002` — hot reload immédiat Logging et tests indépendants de la Config éditable ## Statut Correctif de `0.1.4-pre.015-fix.001` livré pour validation locale. Le correctif précédent a clarifié la différence entre rechargement du document et runtime actif, mais cette clarification ne satisfait pas le contrat fonctionnel de Config Desk : `KSP-APP-020` exige que le routage Logging soit réellement rechargeable à chaud sans redémarrage. Une sauvegarde Logging doit donc pouvoir être appliquée au subscriber déjà installé. La validation locale a également révélé que plusieurs tests considéraient les valeurs historiques de `config/std.logging.json` (`warn`, `new_and_close`, etc.) comme une fixture immuable. Après une édition légitime depuis Config Desk vers `info` / `off`, ces tests échouaient alors que la configuration restait valide. ## Défaut 1 — persistence sans application runtime Avant ce correctif : ```text éditeur -> save_logging_document -> std.logging.json X-> runtime tracing déjà actif ``` Ainsi, `console.enabled=false` était bien persisté mais les événements KSP continuaient d'être routés vers la console jusqu'au redémarrage du processus. Ce comportement contredit l'objectif du manager Logging et `KSP-APP-020`. ## Correction runtime `save_logging_document` devient une opération **Sauvegarder et appliquer** : 1. lecture de la source Logging précédente via `ConfigManagement::read_source()` ; 2. reconstruction du candidat typé ; 3. validation et persistence atomique via `ConfigManagement::save_logging_document()` ; 4. chargement d'un `ConfigEnvironment` frais ; 5. résolution du `default_profile` avec `load_resolved_logging_config()` ; 6. préparation/application du runtime via `ksp_logging_lib::reinitialize()` sur le `LoggingGuard` conservé dans `AppState` ; 7. mise à jour de `active_logging_profile`, `logging_generation`, `fallback_logging_active` et du diagnostic startup seulement après succès. Le résultat Tauri expose désormais : - `source_changed` ; - `reload_required` ; - `runtime_applied` ; - `logging_generation` ; - `active_profile` ; - le document typé relu. ### Transaction/rollback `ksp-logging-lib::reinitialize()` prépare les nouveaux outputs avant le swap et conserve déjà l'ancien runtime si la préparation/reload échoue. Config Desk complète cette garantie au niveau persistence : si la résolution effective ou le hot reload échoue après modification de `std.logging.json`, la source brute précédente est restaurée via `ConfigManagement::save_source_candidate()`. Ainsi, l'échec ne doit pas laisser : ```text source nouvelle + runtime ancien ``` Un test applicatif spécifique vérifie la restauration de la source précédente après une erreur runtime synthétique. ## Défaut 2 — tests dépendants d'un fichier utilisateur mutable La validation locale a produit notamment : ```text left: "info" right: "warn" ``` et : ```text raw source candidate fixture must change the persisted bytes ``` Ces échecs ne signalaient pas une Config invalide : ils provenaient de tests qui supposaient que `std.logging.json` conserverait éternellement ses valeurs historiques ou une indentation particulière. Le correctif : - compare la projection Logging editor avec la source typée réellement chargée ; - compare la résolution de profil avec le `default_profile` réellement présent ; - compare l'adapter runtime avec l'effective réellement résolue au lieu d'imposer `warn/new_and_close` ; - construit les candidats invalides par modification JSON structurée et non par remplacement du texte `local_dev` ; - garantit une différence de bytes pour le test raw par ajout de whitespace JSON valide, indépendamment de l'indentation source ; - réduit les assertions exactes sur la Config workspace aux invariants réellement normatifs ; - ajoute `crates/ksp-config-lib/unit_tests/fixtures/std.logging.json` et `unit_tests/fixtures/examples/composite.example.json` pour les tests comportementaux qui ont besoin de valeurs exactes stables. La nouvelle règle **KSP-APP-033** formalise cette frontière : un document Config éditable par Config Desk n'est jamais une fixture immuable pour les tests. ## Interface - le bouton devient **Sauvegarder et appliquer** ; - le statut affiche `runtime_applied`, `logging_generation` et `active_profile` ; - **Recharger le document** reste une resynchronisation du brouillon uniquement ; - l'avertissement UI explique le rollback source/runtime ; - désactiver `console.enabled` puis **Sauvegarder et appliquer** doit couper immédiatement les événements KSP dans la console du processus courant ; - la ligne de debug annonçant la demande de sauvegarde peut encore apparaître juste avant le swap, puisqu'elle est émise avec l'ancien runtime ; les événements frontend/backend suivants ne doivent plus apparaître sur ce sink si la console est désactivée. Les messages Cargo/Tauri/Vite restent externes au runtime KSP. ## Planification Le hot reload de base est absorbé par ce fix de `pre.015` puisqu'il est requis pour corriger le comportement livré. `pre.016` conserve les compléments runtime : - fichiers applicatifs uniques par lancement ; - sélection explicite du profil runtime indépendamment du `default_profile` ; - observabilité renforcée de la génération/runtime ; - consolidation des scénarios transactionnels. ## Version technique ```text 0.1.4-pre.15.fix.2 ``` ## Validation attendue ```bash cargo fmt --all cargo check --workspace cargo clippy --workspace --all-targets cargo test -p ksp-app-config-desk cargo test -p ksp-config-lib cargo tauri dev -c crates/ksp-app-config-desk/tauri.conf.json ``` La Config workspace peut conserver les valeurs modifiées pendant les essais, par exemple `default_filter=info` ou `span_events=off` : les tests ne doivent plus échouer uniquement pour cette raison. ### Test hot reload console 1. démarrer avec la console Logging activée ; 2. ouvrir Logging et décocher `Console / Enabled` sur le `default_profile` ; 3. cliquer **Sauvegarder et appliquer** ; 4. vérifier le résultat `runtime_applied=true` et l'incrément de `logging_generation` ; 5. sans arrêter l'application, cliquer dans plusieurs vues ; 6. aucun nouvel événement KSP horodaté issu de ces clics ne doit apparaître dans le terminal ; 7. réactiver `Console / Enabled`, **Sauvegarder et appliquer** ; 8. les événements KSP doivent réapparaître immédiatement, toujours sans redémarrage.