# `0.1.4-pre.008-fix.002` — Clippy Tauri, racine Config, timings splash et header principal ## 1. Motif du fix La validation locale de `0.1.4-pre.8.fix.1` confirme que `cargo check`, les tests de l'application et les tests Config passent, mais `cargo clippy --workspace --all-targets` révèle encore trois erreurs : - deux closures de test violent `clippy::implicit_return` ; - l'expansion générée par Tauri pour la commande async `splash_frontend_ready` utilise l'opérateur `?`, alors que le workspace refuse `clippy::question_mark_used`. Le test desktop révèle en parallèle un point runtime plus important : le démarrage utilise toujours le fallback Logging avec `json_file_read_failed`, alors que `config/std.logging.json` existe à la racine du workspace. Le même bootstrap résout les timings du splash via `ConfigEnvironment`; le `.env` racine peut donc être manqué pour la même raison lorsque Tauri lance `cargo run` depuis la crate applicative. Le correctif traite également les remarques UI liées à la tranche `pre.008` : identité du header et traçage fin des changements de tabs. ## 2. Version technique Le fix touche Rust, TypeScript, HTML et documentation : ```text workspace.package.version = "0.1.4-pre.8.fix.2" ``` La version applicative frontend/Tauri reste `0.1.4` selon la politique KSP courante. ## 3. Clippy sur les closures de test Les predicates passés à `Iterator::any()` sont écrits avec le `return` explicite requis par le workspace : ```rust .any(|field| return field.key() == "maximum_ms" && field.value() == "60000") ``` et : ```rust .any(|field| return field.key() == "maximum_ms" && field.value() == "10000") ``` Le test du fallback est en plus renforcé pour verrouiller : ```text minimum_source = fallback fade_source = fallback expected_backend_lifecycle_ms = 1500 ``` ## 4. Exception Clippy strictement bornée au code généré Tauri Le code source KSP de `splash_frontend_ready` n'utilise toujours aucun `?`. La violation provient de l'expansion de `tauri::generate_handler!` pour une commande async. L'exception est donc placée uniquement sur le helper d'assemblage qui invoque ce macro : ```rust #[allow(clippy::question_mark_used)] // Tauri generates `?` internally for async command dispatch. fn configure_commands(...) ``` Aucun `allow` global et aucune détente de `clippy::question_mark` / `clippy::question_mark_used` au niveau workspace ne sont introduits. ## 5. Current working directory du runtime debug Le workflow KSP lance l'application depuis la racine avec : ```bash cargo tauri dev -c crates/ksp-app-config-desk/tauri.conf.json ``` Tauri peut néanmoins exécuter le `cargo run` applicatif depuis la crate Tauri. Les defaults de `ksp-config-lib` restent volontairement : ```text config/ config/schemas/ ./.env ``` Afin de conserver ces ressources enracinées au projet sans transférer leur ownership à l'application, `main.rs` normalise en build debug le current working directory Rust vers : ```text env!("CARGO_MANIFEST_DIR")/../.. ``` avant d'appeler le bootstrap Config. Cette adaptation : - ne lit pas `.env` ; - ne parse aucune variable `KSP_*` / `KSPB_*` ; - ne lit aucun JSON Config ; - laisse `ConfigBootstrapOptions`, `ConfigFileRegistry`, `ConfigManagement` et `ConfigEnvironment` effectuer toutes les lectures ; - ne s'applique pas au build release, dont le modèle de ressources distribuées sera traité séparément. Le test desktop doit confirmer que le warning `json_file_read_failed` disparaît lorsque `config/std.logging.json` racine est valide. ## 6. Instrumentation Rust du lifecycle splash `SplashSettings` conserve désormais la provenance sûre de chaque valeur : ```text process dotenv fallback ``` Le runtime journalise en `debug` : 1. les valeurs résolues et leur provenance ; 2. la readiness acceptée ; 3. la fin de l'attente minimale avec durée configurée et durée réelle ; 4. la fin de l'attente du fade-out avec durée configurée et durée réelle ; 5. la destruction du splash après activation de `main`, avec durée totale attendue/réelle. Le contrat temporel KSP reste celui fixé par `pre.008` : ```text readiness -> emit fade_in -> wait minimum -> emit fade_out -> wait fade -> show/focus main -> destroy splash ``` Il n'est pas remplacé par les trois temporisations historiques de bot3. Avec : ```text KSP_DESK_SPLASH_MINIMUM_MS=12000 KSP_DESK_SPLASH_FADE_MS=3000 ``` le lifecycle backend attendu de readiness à activation de `main` est donc approximativement : ```text 15000 ms ``` Les nouveaux logs permettent de distinguer immédiatement un défaut de résolution `.env` d'un défaut d'attente async. ## 7. Header principal et tabs Le logo contenant déjà l'identité visuelle KSP, le header n'affiche plus `KSP — Config Desk`. La convention devient : ```text [logo K] Config Desk — ``` Par exemple : ```text Config Desk — Vue d'ensemble Config Desk — Documents Config Desk — Logging ``` Le `` WebView suit la même vue active. Les cinq commandes principales restent sous forme de pills/tabs alignées à droite, adaptée à cette application monofenêtre compacte. La règle de gabarit prévoit un dropdown lorsque le nombre de commandes devient trop important. Le frontend trace désormais : - chaque clic de tab en `trace` ; - l'état de tab actif après changement en `trace` ; - l'activation utilisateur significative de la vue en `debug` ; - les remplacements de contenu restent en `trace`. ## 8. `@fltsci/tauri-plugin-tracing` et console WebKit Le plugin Rust `tauri-plugin-tracing` reste réellement installé ; ce qui n'est pas encore utilisé est la façade JS officielle pour le routing applicatif. Le bridge KSP actuel fournit : ```text console/WebView JS -> affichage dans la console WebKit originale -> emit_frontend_log -> ksp-logging-lib -> runtime Rust ``` Il **ne fournit pas encore** le trajet général inverse : ```text événement tracing Rust -> console WebKit ``` Le package officiel expose `attachConsole()`, `interceptConsole()` et `takeoverConsole()`, mais avec le subscriber custom possédé par KSP, le retour Rust -> WebView nécessite que ce subscriber intègre `tauri_plugin_tracing::WebviewLayer`. Décision : ne pas appeler artificiellement `takeoverConsole()` dans ce fix. Une future tranche raccordera éventuellement `WebviewLayer` à `ksp-logging-lib`, de façon à pouvoir utiliser `attachConsole()` sans second subscriber, sans double émission JS -> Rust et sans boucle avec `frontend_log.ts`. ## 9. Règles et plan `RULES_KSP.md` ajoute : - `KSP-APP-028` pour l'identité de header et le choix tabs/pills vs dropdown ; - `KSP-APP-029` pour la normalisation du CWD debug avant bootstrap Config dans un workspace Tauri multi-app. Le plan `0.1.4` passe en version 9 et documente : - la sémantique temporelle exacte du splash ; - les métriques `debug` ; - le CWD runtime debug ; - la convention du header ; - l'état réel du bridge console et le besoin futur de `WebviewLayer`. ## 10. Fichiers modifiés | Fichier | Action | |---------------------------------------------------|--------:| | `Cargo.toml` | modifié | | `crates/ksp-app-config-desk/src/main.rs` | modifié | | `crates/ksp-app-config-desk/src/tauri.rs` | modifié | | `crates/ksp-app-config-desk/src/splash.rs` | modifié | | `crates/ksp-app-config-desk/src/app_state.rs` | modifié | | `crates/ksp-app-config-desk/src/tw_splash.rs` | modifié | | `crates/ksp-app-config-desk/unit_tests/splash.rs` | modifié | | `crates/ksp-app-config-desk/frontend/main.html` | modifié | | `crates/ksp-app-config-desk/frontend/ts/main.ts` | modifié | | `crates/ksp-app-config-desk/README.md` | modifié | | `crates/ksp-app-config-desk/USAGE.md` | modifié | | `crates/ksp-app-config-desk/TODO.md` | modifié | | `docs/rules/RULES_KSP.md` | modifié | | `docs/plans/006-V0_1_4_CONFIG_DESKTOP_PLAN.md` | modifié | | `deltas/0.1.4/pre.008-fix.002.md` | ajouté | Aucune dépendance n'est ajoutée et aucun asset binaire n'est modifié. ## 11. Validations demandées Depuis la racine du workspace : ```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 tree -p ksp-app-config-desk cargo tauri dev -c crates/ksp-app-config-desk/tauri.conf.json ``` Avec le `.env` utilisateur : ```text KSP_DESK_SPLASH_MINIMUM_MS=12000 KSP_DESK_SPLASH_FADE_MS=3000 ``` le lancement doit notamment montrer en `debug` : ```text minimum_ms=12000 minimum_source="dotenv" fade_ms=3000 fade_source="dotenv" expected_backend_lifecycle_ms=15000 ``` puis deux attentes proches de `12000 ms` et `3000 ms`, et une durée backend totale proche de `15000 ms` avant activation de `main`. Le lancement doit également confirmer : - disparition de `json_file_read_failed` si le document Logging racine est valide ; - chargement du profil Logging `local_dev` au lieu du fallback startup ; - header `Config Desk — Vue d'ensemble` puis mise à jour du titre lors des changements de tabs ; - logs `trace` sur les clics/changements de tabs lorsque le filtre runtime laisse passer `trace`. ## 12. Suite Après validation de ce fix, `pre.008` peut être considérée fermée et `pre.009` peut commencer la surface Documents + diagnostics.