# `0.1.4-pre.006` — Bootstrap backend, `AppState` et runtime Logging initial ## 1. Objectif Cette tranche raccorde pour la première fois `ksp-app-config-desk` aux fondations Config et Logging qu'elle doit valider. Elle reste volontairement bornée au bootstrap backend et au premier contrat Tauri/TS-RS ; les services Documents/Environment/Logging éditable et le bridge frontend logging restent dans les tranches suivantes. La base `0.1.4-pre.5.fix.1` a été validée localement avec installation npm, `cargo fmt`, check workspace, Clippy, tests de l'application, tests Config, `cargo tree` et lancement réel : ```bash cargo tauri dev -c crates/ksp-app-config-desk/tauri.conf.json ``` Vite a démarré sur `1430` et le binaire Tauri a été lancé depuis le target externe du workspace. ## 2. Version technique La tranche modifie le runtime Rust et les dépendances de la crate : ```text workspace.package.version = "0.1.4-pre.6" ``` Les versions frontend/Tauri applicatives restent `0.1.4` selon la politique courante. ## 3. Bootstrap Config `src/bootstrap.rs` construit exclusivement à travers `ksp-config-lib` : ```text argv complet -> ConfigBootstrapOptions::from_args(...) -> ConfigFileRegistry::from_args(...) -> ConfigDocumentEngine -> ConfigManagement ``` L'application ne parse donc pas elle-même `--cfgpath`, `--schemapath` ou `--filemap`, ne lit aucun `KSP_*` directement et ne résout aucun chemin physique Config en dehors de la façade Config. `ConfigManagement` est conservé durablement dans `AppState` pour les services des tranches suivantes. ## 4. Bootstrap Logging et fallback de réparation Le chemin nominal est : ```text ConfigEnvironment::load() -> load_resolved_logging_config(None, env) -> ResolvedLoggingConfig::into_settings() -> ksp_logging_lib::initialize(...) -> LoggingGuard ``` `None` sélectionne le `default_profile` du document `std.logging.json`. Pour respecter l'exigence de réparation de Config Desk, une erreur lors du chargement/résolution Logging ou de la préparation du runtime configuré ne condamne pas automatiquement l'application. Tant qu'aucun subscriber global n'a pu être installé, Config Desk tente un fallback transitoire en mémoire : ```text default_filter : Info span_events : Off console : stderr / Human files : aucun persistence : aucune ``` Le fallback : - n'est jamais écrit dans `std.logging.json` ; - ne modifie aucun profil utilisateur ; - conserve un diagnostic frontend borné ; - permet à l'application de rester utilisable pour réparer la configuration ; - installe toujours le subscriber via `ksp-logging-lib`, jamais via l'application ou `tauri-plugin-tracing`. Si le fallback lui-même ne peut pas installer le runtime global, le bootstrap échoue explicitement avec `config_desk.logging_bootstrap_failed`. ## 5. Ownership `AppState` L'état backend devient : ```text AppState ├── ConfigManagement └── Mutex ├── LoggingGuard ├── active_profile_id ├── generation = 1 ├── fallback_active └── startup_diagnostic ``` Le `LoggingGuard` vit donc avec l'application et prépare le futur `reinitialize()` transactionnel. Le guard et les métadonnées runtime sont regroupés sous le même mutex afin que les futures mutations restent atomiques au niveau applicatif. ## 6. Premier contrat Tauri + TS-RS La crate introduit `ts-rs = "^12.0"` au niveau workspace et les premiers DTO applicatifs : ```text CommandErrorDto AppSnapshotDto ``` Les exports sont générés sous : ```text frontend/ts/bindings/ksp_app_config_desk/dto_common/ ``` `CommandErrorDto` projette uniquement : ```text domain code message ``` Il ne sérialise jamais automatiquement `Error::context()` ni la chaîne des sources. La première commande réelle est : ```text get_app_snapshot ``` Elle retourne notamment la version applicative, le nombre de descripteurs Config, le profil Logging actif éventuel, la génération runtime, l'état fallback et le diagnostic de bootstrap sûr. Toutes les annotations `#[tauri::command]` restent centralisées dans `tauri.rs`. ## 7. Builder Tauri Le builder reste volontairement découpé : ```text configure_state configure_plugins configure_commands configure_setup ``` Le plugin tracing conserve `Builder::new()` sans `with_default_subscriber()`. `ksp-logging-lib::initialize()` reste le seul propriétaire de l'installation du subscriber global KSP. ## 8. Police du splash bot3 L'audit du gabarit bot3 confirme une seule police locale spécifique au splash : ```text DOS_Amazigh.ttf font-family: Dos Amazigh ``` Source auditée : ```text kb-app-demo-desktop/frontend/fonts/DOS_Amazigh.ttf ``` Destination KSP : ```text crates/ksp-app-config-desk/frontend/fonts/DOS_Amazigh.ttf ``` Empreinte de la copie bot3 auditée : ```text SHA-256 a01ff4b5a0d699db7cefcf5336bf0e379ff6fbf0d096087571a13c8782f9aa02 ``` Le répertoire `frontend/fonts/` et son manifeste sont ajoutés dès cette tranche. Le style `@font-face` et l'animation/lifecycle final restent associés à `pre.008`, afin de ne pas coupler le bootstrap backend à la finition du splash. ## 9. Tests ajoutés Tests unitaires hors `src/` : - le fallback Logging est console-only, stderr, `Info`, sans fichier et sans span lifecycle ; - le DTO d'erreur commun ne reprend pas les champs de contexte KSP arbitraires. Les dérives `#[ts(export)]` ajoutent également les tests d'export TS-RS au package. ## 10. Dépendances Nouvelles dépendances directes de `ksp-app-config-desk` : ```text ksp-config-lib ksp-logging-lib serde ts-rs ``` `ts-rs` est centralisé dans `[workspace.dependencies]` avec une contrainte `^12.0`. Aucune dépendance Solana/protocole supplémentaire n'est introduite. ## 11. Fichiers | Fichier | Action | | ----------------------------------------------------------- | ------: | | `Cargo.toml` | modifié | | `crates/ksp-app-config-desk/Cargo.toml` | modifié | | `crates/ksp-app-config-desk/src/app_state.rs` | ajouté | | `crates/ksp-app-config-desk/src/bootstrap.rs` | ajouté | | `crates/ksp-app-config-desk/src/constants.rs` | ajouté | | `crates/ksp-app-config-desk/src/dto_common.rs` | ajouté | | `crates/ksp-app-config-desk/src/errors.rs` | modifié | | `crates/ksp-app-config-desk/src/lib.rs` | modifié | | `crates/ksp-app-config-desk/src/tauri.rs` | modifié | | `crates/ksp-app-config-desk/unit_tests/bootstrap.rs` | ajouté | | `crates/ksp-app-config-desk/unit_tests/dto_common.rs` | ajouté | | `crates/ksp-app-config-desk/frontend/fonts/README.md` | ajouté | | `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/plans/006-V0_1_4_CONFIG_DESKTOP_PLAN.md` | modifié | | `deltas/0.1.4/pre.006.md` | ajouté | ## 12. Validations à exécuter 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 ``` Après `cargo test -p ksp-app-config-desk`, vérifier également que les bindings ont été générés sous : ```text crates/ksp-app-config-desk/frontend/ts/bindings/ksp_app_config_desk/dto_common/ ``` Le lancement desktop nominal doit utiliser le profil Logging par défaut de `config/std.logging.json`. Le diagnostic de fallback sera validé plus profondément avec les écrans Documents/Logging des tranches suivantes. ## 13. Suite Après validation, `pre.007` reprend/refond le bridge `frontend_log.ts` de bot3 : targets KSP whitelistés, commande `emit_frontend_log` centralisée dans `tauri.rs` et émission finale exclusivement via `ksp-logging-lib`.