From 05c65a12f430f97011c75284bc0de33ee0f8d5bd Mon Sep 17 00:00:00 2001 From: SinuS Von SifriduS Date: Sun, 16 Aug 2026 17:46:48 +0200 Subject: [PATCH] v0.1.4-pre.015-fix.001 --- Cargo.toml | 4 +- crates/ksp-app-config-desk/README.md | 4 +- crates/ksp-app-config-desk/USAGE.md | 4 +- crates/ksp-app-config-desk/frontend/main.html | 15 ++-- .../frontend/ts/logging.ts | 16 +++- crates/ksp-config-lib/tests/public_api.rs | 12 +-- deltas/0.1.4/pre.015-fix.001.md | 73 +++++++++++++++++++ docs/plans/006-V0_1_4_CONFIG_DESKTOP_PLAN.md | 4 +- 8 files changed, 109 insertions(+), 23 deletions(-) create mode 100644 deltas/0.1.4/pre.015-fix.001.md diff --git a/Cargo.toml b/Cargo.toml index 01b69db..050ff70 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,12 +1,12 @@ # file: Cargo.toml -# version: 84 +# version: 85 [workspace] resolver = "3" members = ["crates/ksp-app-config-desk", "crates/ksp-config-lib", "crates/ksp-core-lib", "crates/ksp-logging-lib"] [workspace.package] -version = "0.1.4-pre.15" +version = "0.1.4-pre.15.fix.1" edition = "2024" license = "MIT" repository = "https://git.sasedev.com/Sasedev/khadhroony-solana-project" diff --git a/crates/ksp-app-config-desk/README.md b/crates/ksp-app-config-desk/README.md index 9243906..3164ff8 100644 --- a/crates/ksp-app-config-desk/README.md +++ b/crates/ksp-app-config-desk/README.md @@ -1,5 +1,5 @@ - + # `ksp-app-config-desk` @@ -145,7 +145,7 @@ L'inspection expose le profil par défaut ou une sélection explicite, les vues La vue **Logging** charge le document standard exclusivement avec `ConfigManagement::load_logging_document()`. Rust mappe ensuite les types publics `LoggingConfigDocument`, `LoggingProfileConfig`, `LoggingConsoleConfig`, `LoggingFileConfig`, `LoggingOutputFilterConfig` et `LoggingTargetFilterConfig` vers des DTO TS-RS dédiés. Le frontend ne parse donc ni le JSON source ni son schema. -Le panneau expose `format_version`, `logs_directory`, `default_profile`, tous les profils, la console, les fichiers persistants, les filtres locaux, les target overrides et les listes de targets/domains. En `pre.015`, le frontend maintient un brouillon typé : create/clone/rename/delete de profils, 0/1/N file sinks et target filters restent locaux jusqu'à **Sauvegarder**. Le backend reconstruit les types publics Config et appelle `ConfigManagement::save_logging_document()`, qui valide la totalité du candidat avant remplacement atomique. Le runtime actif n'est pas reconfiguré avant `pre.016`. +Le panneau expose `format_version`, `logs_directory`, `default_profile`, tous les profils, la console, les fichiers persistants, les filtres locaux, les target overrides et les listes de targets/domains. En `pre.015`, le frontend maintient un brouillon typé : create/clone/rename/delete de profils, 0/1/N file sinks et target filters restent locaux jusqu'à **Sauvegarder**. Le backend reconstruit les types publics Config et appelle `ConfigManagement::save_logging_document()`, qui valide la totalité du candidat avant remplacement atomique. **Sauvegarder** et **Recharger le document** n'agissent que sur la source persistée : le subscriber `tracing` actif conserve la configuration installée au démarrage. Un redémarrage de l'application applique la source persistée ; le hot reload sans redémarrage est réservé à `pre.016`. ## Traçabilité frontend diff --git a/crates/ksp-app-config-desk/USAGE.md b/crates/ksp-app-config-desk/USAGE.md index 331cdf6..99e8db5 100644 --- a/crates/ksp-app-config-desk/USAGE.md +++ b/crates/ksp-app-config-desk/USAGE.md @@ -1,5 +1,5 @@ - + # Utilisation de `ksp-app-config-desk` @@ -210,5 +210,5 @@ La vue **Logging** appelle `get_logging_document`. Le backend charge le document - tous les fichiers (`output_id`, path, rotation, format, ANSI et filtre) ; - tous les `target_filters` globaux. -Le sélecteur **Profil édité** travaille sur un brouillon local. `logs_directory`, `default_profile`, profils, console, file sinks, filtres et target overrides sont modifiables. **Créer**, **Cloner**, **Renommer** et **Supprimer** agissent d'abord sur le brouillon ; la suppression de profil est confirmée par modal Bootstrap. **Sauvegarder** envoie un candidat typé à `save_logging_document`, qui reconstruit les contrats Config et persiste atomiquement après validation. **Recharger** resynchronise depuis la source et demande confirmation si le brouillon contient des changements non sauvegardés. Le runtime Logging actif ne change pas dans `pre.015`. +Le sélecteur **Profil édité** travaille sur un brouillon local. `logs_directory`, `default_profile`, profils, console, file sinks, filtres et target overrides sont modifiables. **Créer**, **Cloner**, **Renommer** et **Supprimer** agissent d'abord sur le brouillon ; la suppression de profil est confirmée par modal Bootstrap. **Sauvegarder** envoie un candidat typé à `save_logging_document`, qui reconstruit les contrats Config et persiste atomiquement après validation. **Recharger le document** resynchronise le brouillon depuis la source persistée et demande confirmation si des changements non sauvegardés existent. Ni cette action ni **Sauvegarder** ne reconstruisent le subscriber `tracing` actif en `pre.015` : la configuration persistée prend effet après redémarrage de l'application ; le hot reload sans redémarrage est livré en `pre.016`. Les messages Cargo/Tauri/Vite affichés par `cargo tauri dev` sont externes au runtime Logging KSP et ne dépendent pas de `console.enabled`. diff --git a/crates/ksp-app-config-desk/frontend/main.html b/crates/ksp-app-config-desk/frontend/main.html index 859a160..488fd57 100644 --- a/crates/ksp-app-config-desk/frontend/main.html +++ b/crates/ksp-app-config-desk/frontend/main.html @@ -1,5 +1,5 @@ - + @@ -301,12 +301,12 @@

Logging editor — mutations/persistence

-

Brouillon typé de std.logging.json, validé et persisté atomiquement par ksp-config-lib. Le runtime Logging n'est pas rechargé dans cette tranche.

+

Brouillon typé de std.logging.json, validé et persisté atomiquement par ksp-config-lib. Sauvegarder ou recharger le document ne reconfigure pas le runtime Logging déjà actif.

-
Aucune sauvegarde effectuée pendant ce lancement.
+
+ Runtime actif : le subscriber tracing a été construit au démarrage de l'application. Les boutons Sauvegarder et Recharger le document agissent uniquement sur std.logging.json. Pour appliquer la source persistée en pre.015, il faut redémarrer l'application ; le hot reload sans redémarrage arrive en pre.016. +
+
Aucune sauvegarde effectuée pendant ce lancement ; runtime actif inchangé.
Chargement du document Logging typé...
@@ -459,11 +462,11 @@
diff --git a/crates/ksp-app-config-desk/frontend/ts/logging.ts b/crates/ksp-app-config-desk/frontend/ts/logging.ts index 15beefd..f3668ea 100644 --- a/crates/ksp-app-config-desk/frontend/ts/logging.ts +++ b/crates/ksp-app-config-desk/frontend/ts/logging.ts @@ -1,5 +1,5 @@ // file: crates/ksp-app-config-desk/frontend/ts/logging.ts -// version: 2 +// version: 3 //! Typed Logging editor backed exclusively by ConfigManagement validation and persistence. @@ -512,8 +512,13 @@ async function saveLoggingDocument(): Promise { try { const result = await invokeKsp("main", "save_logging_document", { candidate: draft }); renderDocument(result.document); - setText("#loggingSaveReport", `source_changed=${result.sourceChanged} · reload_required=${result.reloadRequired} · runtime Logging inchangé`); - setLoggingStatus(result.sourceChanged ? "Document Logging validé et persisté. Le runtime sera traité en pre.016." : "Document Logging valide mais source inchangée.", "success"); + setText("#loggingSaveReport", `source_changed=${result.sourceChanged} · reload_required=${result.reloadRequired} · document persisté · runtime actif inchangé`); + setLoggingStatus( + result.sourceChanged + ? "Document Logging validé et persisté. Le subscriber actif conserve la configuration du démarrage jusqu'au redémarrage de l'application ou au hot reload de pre.016." + : "Document Logging valide mais source inchangée. Le runtime actif n'a pas été reconfiguré.", + "success", + ); frontendDebug("main", "Typed Logging document persistence completed", { sourceChanged: result.sourceChanged, reloadRequired: result.reloadRequired, @@ -556,7 +561,10 @@ async function refreshLoggingDocument(source: "startup" | "user"): Promise try { const documentDto = await invokeKsp("main", "get_logging_document"); renderDocument(documentDto); - setLoggingStatus(`${documentDto.profiles.length} profil(s) Logging chargé(s). Le brouillon est synchronisé avec la source.`, "success"); + setLoggingStatus( + `${documentDto.profiles.length} profil(s) Logging chargé(s). Le brouillon est synchronisé avec la source persistée ; le runtime actif reste celui du démarrage.`, + "success", + ); frontendDebug("main", "Logging document reload completed", { profileCount: documentDto.profiles.length, defaultProfile: documentDto.defaultProfile, diff --git a/crates/ksp-config-lib/tests/public_api.rs b/crates/ksp-config-lib/tests/public_api.rs index ab831f5..d0f97a9 100644 --- a/crates/ksp-config-lib/tests/public_api.rs +++ b/crates/ksp-config-lib/tests/public_api.rs @@ -1,5 +1,5 @@ // file: crates/ksp-config-lib/tests/public_api.rs -// version: 14 +// version: 15 //! Integration tests for the public `ksp-config-lib` bootstrap, registry, JSON/profile/composite, environment-resolution, sensitivity, Logging-adapter and //! management contracts. @@ -219,11 +219,11 @@ fn management_contracts_are_available_from_crate_root() { assert_eq!(logging.profiles()[0].profile_id(), "local_dev"); assert_eq!(logging.profiles()[0].files().len(), 2); assert!(!logging.profiles()[0].files()[0].ansi()); - if let std::option::Option::Some(profile) = logging.profiles_mut().first_mut() { - if let std::option::Option::Some(file) = profile.files_mut().first_mut() { - file.set_ansi(false); - assert!(!file.ansi()); - } + if let std::option::Option::Some(profile) = logging.profiles_mut().first_mut() + && let std::option::Option::Some(file) = profile.files_mut().first_mut() + { + file.set_ansi(false); + assert!(!file.ansi()); } } } diff --git a/deltas/0.1.4/pre.015-fix.001.md b/deltas/0.1.4/pre.015-fix.001.md new file mode 100644 index 0000000..a672afa --- /dev/null +++ b/deltas/0.1.4/pre.015-fix.001.md @@ -0,0 +1,73 @@ + + + +# Delta `0.1.4-pre.015-fix.001` — clarification document/runtime Logging et Clippy + +## Statut + +Correctif de `0.1.4-pre.015` livré pour validation locale. + +La persistence typée de `pre.015` fonctionne : création/clonage/renommage/suppression de profils, multi-sinks, sauvegarde atomique et refus d'un candidat invalide ont été exercés. Deux points nécessitent néanmoins un correctif avant validation de la tranche : + +- `cargo clippy --workspace --all-targets` signale un `collapsible_if` dans le test public de `ksp-config-lib` ; +- l'interface peut laisser croire que **Recharger** applique au runtime actif une modification persistée, alors que `pre.015` ne fait volontairement aucun hot reload. + +## Cause du comportement console + +`console.enabled=false` est bien persisté dans `std.logging.json`, mais le subscriber `tracing` global a déjà été construit au démarrage du processus. En `pre.015`, ni **Sauvegarder** ni le rechargement du brouillon ne passent par `ksp_logging_lib::reinitialize()`. + +Par conséquent : + +1. la sauvegarde modifie la source persistée ; +2. **Recharger le document** relit cette source et resynchronise le brouillon ; +3. le runtime Logging du processus courant reste inchangé ; +4. un redémarrage de l'application applique la nouvelle source ; +5. le hot reload sans redémarrage reste la responsabilité de `pre.016`. + +Les lignes émises par Cargo, Tauri CLI et Vite avant/pendant `cargo tauri dev` ne sont pas des événements du runtime Logging KSP et ne sont jamais contrôlées par `console.enabled`. + +## Modifications + +### Clippy + +- correction du `collapsible_if` dans `crates/ksp-config-lib/tests/public_api.rs` avec une chaîne `if let ... && let ...` compatible Rust 2024 ; +- aucun affaiblissement du test public `LoggingFileConfig::set_ansi()`. + +### Config Desk + +- renommage du bouton Logging **Recharger** en **Recharger le document** ; +- ajout d'un avertissement permanent distinguant clairement la source persistée du subscriber actif ; +- après sauvegarde, le rapport indique explicitement `document persisté · runtime actif inchangé` ; +- après rechargement, le statut précise que seul le brouillon est resynchronisé avec la source ; +- le modal d'abandon d'un brouillon sale précise lui aussi qu'il ne recharge pas le runtime. + +### Documentation + +- README et USAGE explicitent la frontière `document persisté` / `runtime actif` ; +- USAGE rappelle que les sorties Cargo/Tauri/Vite restent visibles même lorsque la console KSP est désactivée ; +- plan `0.1.4` complète `pre.015` avec cette distinction et conserve `pre.016` comme propriétaire du hot reload. + +## Version technique + +```text +0.1.4-pre.15.fix.1 +``` + +## 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 +``` + +Puis : + +1. dans Logging, décocher **Console / Enabled** pour le profil par défaut ; +2. sauvegarder puis **Recharger le document** : la case doit rester décochée, mais les logs applicatifs du processus courant peuvent continuer car le runtime n'a pas été reconfiguré ; +3. arrêter complètement l'application puis relancer `cargo tauri dev -c crates/ksp-app-config-desk/tauri.conf.json` ; +4. distinguer les messages Cargo/Tauri/Vite des événements KSP : avec `console.enabled=false`, aucune nouvelle ligne applicative horodatée `ksp-app-config-desk...` ne doit être routée vers la console par le runtime KSP ; +5. réactiver ensuite la console dans la source si nécessaire pour poursuivre les validations `pre.015` avant `pre.016`. diff --git a/docs/plans/006-V0_1_4_CONFIG_DESKTOP_PLAN.md b/docs/plans/006-V0_1_4_CONFIG_DESKTOP_PLAN.md index df66379..331f82b 100644 --- a/docs/plans/006-V0_1_4_CONFIG_DESKTOP_PLAN.md +++ b/docs/plans/006-V0_1_4_CONFIG_DESKTOP_PLAN.md @@ -1,5 +1,5 @@ - + # Plan `0.1.4` — `ksp-app-config-desk` @@ -1243,6 +1243,8 @@ pre.015 Logging editor — mutations/persistence [en cours] - default_profile - mono-fichier/multi-fichiers - save_logging_document + - UI explicite : rechargement du document != reconfiguration du runtime actif + - source persistée appliquée au prochain démarrage tant que pre.016 n'est pas livrée pre.016 Logging runtime - fichiers applicatifs uniques par lancement avec timestamp de démarrage