143 lines
6.5 KiB
Markdown
143 lines
6.5 KiB
Markdown
<!-- file: deltas/0.1.4/pre.015-fix.002.md -->
|
|
<!-- version: 1 -->
|
|
|
|
# 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.
|
|
|