# Delta `0.2.12-pre.003` — composite Config et bootstrap Off-chain ## 1. Base requise Cette tranche s'applique exclusivement après : ```text v0.2.11 + 0.2.12-pre.001 + 0.2.12-pre.001-fix.001 + 0.2.12-pre.002 + 0.2.12-pre.002-fix.001 ``` Le retour opérateur du `27 août 2026` clôt proprement `pre.002-fix.001` : `cargo fmt`, installation npm, audits Rust/Markdown, `cargo check --workspace`, Clippy workspace, `cargo test -p ksp-app-solprices-desk` et `cargo tauri dev` passent sans warning Rust. `cargo test --workspace` n'a pas été rejoué dans ce retour précis et n'est pas revendiqué comme tel. La version workspace passe à : ```text 0.2.12-pre.3 ``` ## 2. Responsabilité de la tranche `pre.003` matérialise uniquement la composition Config du nouveau Desk et son bootstrap Off-chain provider-neutral : ```text nouveau composite SOL Prices Desk nouveau descriptor Config registry Config 10 -> 11 descriptors resources Config packagées 10 -> 11 dans les trois Desks Logging du SOL Prices Desk sélectionné par composite ResolvedOffchainTransportConfig construit au bootstrap MarketPriceService détenu indirectement par Config provenance Composite conservée Diagnostics bootstrap sûrs instrumentation frontend durable pour les contrôles existants ``` La tranche n'introduit encore aucun `MarketPriceRuntime`, row provider, observation affichée ni commande de refresh. ## 3. Composite SOL Prices Desk Le document ajouté est : ```text config/composite.ksp-app-solprices-desk.json file_id = cfg.composite.ksp-app-solprices-desk schema = schema.composite ``` Il contient exactement les profils prévus : ```text public_keyless (default) logging -> cfg.std.logging / console_info offchain_transport -> cfg.std.offchain_transport / public_keyless all_free logging -> cfg.std.logging / console_info offchain_transport -> cfg.std.offchain_transport / all_free tests logging -> cfg.std.logging / console_info offchain_transport -> cfg.std.offchain_transport / public_keyless ``` Les composants sont résolus par `file_id`; aucun filename physique n'est connu du code applicatif. ## 4. Registry et packaging atomiques `ksp-config-lib` enregistre le nouveau descriptor avec le schema composite existant. L'inventaire passe à **11 descriptors** : 6 documents Config et 5 schemas. Comme `prepare_packaged_runtime` travaille sur le registry logique complet, la même tranche ajoute le nouveau resource mapping aux trois applications packagées : ```text ksp-app-config-desk 11 resources ksp-app-wallet-desk 11 resources ksp-app-solprices-desk 11 resources ``` Les canaris historiques de Config Desk et Wallet Desk sont mis à jour pour rendre cette atomicité durable. ## 5. Bootstrap Config -> Off-chain SOL Prices Desk charge son composite via `FILE_ID_COMPOSITE_KSP_APP_SOLPRICES_DESK` puis vérifie explicitement les composants obligatoires : ```text logging -> FILE_ID_STD_LOGGING offchain_transport -> FILE_ID_STD_OFFCHAIN_TRANSPORT ``` Le profil Logging du composite alimente le runtime Logging existant. Le profil Off-chain sélectionné est ensuite transmis à : ```text ConfigDocumentEngine::resolve_offchain_transport_config_profile ``` Le résultat `ResolvedOffchainTransportConfig` reste détenu par l'état backend. Pour le profil default `public_keyless`, le service construit par Config expose les huit entrées provider-neutral déjà définies par `0.2.11`. Aucune dépendance provider, URL, API key, rate limit ou logique HTTP n'est recréée dans la crate applicative. ## 6. État runtime exposé `get_runtime_status` reste une commande de diagnostic et expose uniquement des projections sûres supplémentaires : ```text active_composite_profile active_logging_profile active_offchain_profile config_document_count application_version fallback_logging_active shell_phase startup_diagnostic sûr ``` Aucun provider individuel, prix, credential, endpoint ou payload Off-chain n'est projeté dans cette tranche. ## 7. Logging frontend durable Conformément à `KSP-APP-027`, les contrôles frontend existants sont instrumentés via le bridge commun : ```text clic / action utilisateur debug transition de vue debug demande IPC debug fin technique IPC trace échec contrôlé error/warn selon le chemin existant ``` Les logs ne sérialisent pas de valeurs métier ou secrètes. Le canari ajouté impose ce comportement avant l'arrivée des boutons prix : les futurs refresh row/many/all devront journaliser l'action, l'ID opaque/count/code sûr lorsque nécessaire, jamais prix brut, API key, header ou payload provider. ## 8. Tests et canaris ajoutés/étendus `ksp-config-lib` couvre désormais : ```text inventaire exact des 11 descriptors public constants du nouveau composite provenance Composite du profil Off-chain construction du service public_keyless depuis le composite interdiction de hardcoder le nouveau filename hors Config ``` SOL Prices Desk couvre : ```text profils composite public_keyless / all_free / tests mapping logging + offchain_transport exact provenance Composite service provider-neutral à huit entrées pour public_keyless 11 resources packagées absence de MarketPriceRuntime avant pre.004 absence de refresh avant pre.005 logging debug des contrôles/navigation logging debug/trace du wrapper IPC ``` ## 9. Fichiers ajoutés ```text config/composite.ksp-app-solprices-desk.json crates/ksp-app-solprices-desk/src/offchain_runtime.rs crates/ksp-app-solprices-desk/tests/config_composition.rs deltas/0.2.12/pre.003.md ``` ## 10. Fichiers modifiés ```text Cargo.toml crates/ksp-app-config-desk/tauri.conf.json crates/ksp-app-config-desk/tests/desktop_contract.rs crates/ksp-app-solprices-desk/package.json crates/ksp-app-solprices-desk/tauri.conf.json crates/ksp-app-solprices-desk/frontend/main.html crates/ksp-app-solprices-desk/frontend/ts/main.ts crates/ksp-app-solprices-desk/src/app_state.rs crates/ksp-app-solprices-desk/src/bootstrap.rs crates/ksp-app-solprices-desk/src/constants.rs crates/ksp-app-solprices-desk/src/dto_common.rs crates/ksp-app-solprices-desk/src/errors.rs crates/ksp-app-solprices-desk/src/lib.rs crates/ksp-app-solprices-desk/tests/desktop_contract.rs crates/ksp-app-solprices-desk/tests/desktop_security.rs crates/ksp-app-wallet-desk/tauri.conf.json crates/ksp-app-wallet-desk/tests/desktop_contract.rs crates/ksp-app-wallet-desk/tests/release_compliance.rs crates/ksp-config-lib/src/lib.rs crates/ksp-config-lib/src/registry.rs crates/ksp-config-lib/tests/ownership.rs crates/ksp-config-lib/tests/public_api.rs crates/ksp-config-lib/unit_tests/offchain_transport.rs crates/ksp-config-lib/unit_tests/registry.rs docs/plans/019-V0_2_12_SOL_PRICES_DESK_PLAN.md docs/validation/015-V0_2_12_SOL_PRICES_DESK.md ``` ## 11. Fichiers volontairement inchangés ```text crates/ksp-offchain-transport-lib/** crates/ksp-app-wallet-desk/src/** crates/ksp-app-wallet-desk/frontend/** crates/ksp-app-config-desk/src/** crates/ksp-app-config-desk/frontend/** README.md ROADMAP.md CHANGELOG.md prompts/017-V0_2_12_START_PROMPT.md ``` L'intégration Off-chain de Wallet Desk reste propriétaire des tranches ultérieures. Le présent changement Wallet/Config Desk est strictement limité à la cohérence des resources packagées et de leurs canaris. ## 12. Validations exécutées dans le sandbox Après matérialisation de la tranche et du delta : ```text python3 scripts/audit_rust_workspace_rules.py PASS General Rust rule audit clean Rust export completeness audit 0 candidate KSP workspace Rust rule audit clean python3 scripts/audit_markdown_tables.py README.md RULES.md ROADMAP.md CHANGELOG.md docs prompts crates deltas/0.2.12 PASS JSON parse composite/package/tauri.conf modifiés PASS ``` Le sandbox ne possède pas `cargo`; les commandes Cargo ne sont donc pas déclarées PASS localement. ## 13. Gate opérateur attendu ```bash cargo fmt --all python3 scripts/audit_rust_workspace_rules.py python3 scripts/audit_markdown_tables.py README.md RULES.md ROADMAP.md CHANGELOG.md docs prompts crates deltas/0.2.12 cargo check --workspace cargo clippy --workspace --all-targets cargo test -p ksp-config-lib cargo test -p ksp-app-solprices-desk cargo test --workspace (cd crates/ksp-app-solprices-desk && cargo tauri dev) ``` Le `cargo tauri dev` doit confirmer que le Desk démarre avec le composite default `public_keyless`, que Diagnostics affiche les profils composite/Off-chain et `11` documents Config, et qu'aucune table prix ni requête de refresh n'est encore présente.