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 @@
-
Des modifications non sauvegardées existent. Recharger la source les abandonnera.
+
Des modifications non sauvegardées existent. Recharger le document depuis la source persistée les abandonnera. Cette action ne recharge pas le runtime Logging.
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