Files
khadhroony-solana-project/deltas/0.1.4/pre.015-fix.002.md

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.