# Delta `0.2.12-pre.008` — intégration Wallet minimale et recalibrage de clôture ## Base ```text 0.2.12-pre.007 ``` Le gate opérateur de `pre.007` est intégralement propre : audits Rust/Markdown, `cargo check --workspace`, Clippy workspace, test ciblé SOL Prices Desk, `cargo test --workspace` et `cargo tauri dev` passent. Le parcours visuel confirme la table provider-neutral et les refresh manuel/selected/all. ## Décision opérateur Le périmètre Wallet Desk est réduit : les fonctionnalités avancées de marché restent dans `ksp-offchain-transport-lib` et `ksp-app-solprices-desk`. Wallet Desk n'a besoin que d'une information auxiliaire SOL/USD lors du refresh de balance. Contrat retenu : ```text Refresh balance existant -> getBalance On-chain -> refresh_all Off-chain des providers actuellement éligibles -> ne garder que les observations réussies du refresh courant -> calculer une moyenne SOL/USD backend -> afficher une seule case SOL/USD moyen -> N.A. si aucune observation n'est disponible ``` Aucune valorisation USD du solde, aucun provider canonique, aucun panneau provider détaillé et aucune nouvelle command prix Wallet ne sont introduits. ## Implémentation - version workspace : `0.2.12-pre.8` ; - `ksp-app-wallet-desk` dépend désormais directement de `ksp-offchain-transport-lib` ; - les trois profils du composite Wallet Desk ajoutent `offchain_transport -> cfg.std.offchain_transport/public_keyless` ; - la fixture Config et l'exemple du composite Wallet sont synchronisés ; - ajout d'un `OffchainTransportRuntime` Wallet résolu exclusivement via Config ; - l'initialisation prix est auxiliaire : un échec Config/Off-chain est journalisé par domain/code sûrs et dégrade la projection vers `N.A.` sans empêcher le Desk de démarrer ; - `refresh_wallet_balance` conserve son input vide et orchestre `getBalance` et `MarketPriceService::refresh_all` dans la même opération backend ; - la moyenne utilise uniquement les observations réellement produites par le refresh courant ; - le calcul n'utilise aucun `f64` et arrondit half-up à huit décimales maximum avant suppression des zéros terminaux ; - `WalletBalanceDto` gagne uniquement `sol_usd_average: Option` ; - le frontend Wallet affiche une seule case `SOL/USD moyen`, avec `N.A.` en absence de valeur ; - aucun `provider_id`, URL, endpoint, credential, payload provider ou command prix ne traverse le frontend Wallet ; - le lifecycle WalletSession, VIEW/OWNER, secrets, import/export et la logique `getBalance` existante restent inchangés. ## Tests/canaris - moyenne déterministe sur valeurs réalistes ; - moyenne entière fractionnaire (`1`, `2` -> `1.5`) sans IEEE-754 ; - composite Wallet vérifie le composant Off-chain et sa provenance Composite ; - service `public_keyless` construit avec huit entrées provider-neutral ; - canari desktop exige exactement une case `currentWalletSolUsdAverage` et aucune surface prix avancée ; - sécurité : `refresh_wallet_balance` ne reçoit toujours ni Pubkey, ni endpoint, ni provider ID depuis le frontend ; - release compliance reconnaît explicitement `ksp-offchain-transport-lib` comme boundary KSP autorisée. ## Recalibrage du forecast Les anciennes tranches Wallet riches et les hardenings séparés ne sont plus justifiés. Le forecast restant devient : ```text pre.008 intégration Wallet minimale + recalibrage pre.009 hardening transversal + gate technique/live + builds finaux pre.010 réconciliation documentaire + prompt suivant + CHANGELOG + ROADMAP rel.001 publication stable ``` Les responsabilités finales restent présentes ; elles sont fusionnées pour éviter des prereleases artificielles. ## Fichiers ajoutés/modifiés ```text Cargo.toml config/composite.ksp-app-wallet-desk.json config/examples/composite.ksp-app-wallet-desk.example.json crates/ksp-config-lib/unit_tests/fixtures/composite.ksp-app-wallet-desk.json crates/ksp-app-wallet-desk/Cargo.toml crates/ksp-app-wallet-desk/package.json crates/ksp-app-wallet-desk/tauri.conf.json crates/ksp-app-wallet-desk/src/app_state.rs crates/ksp-app-wallet-desk/src/constants.rs crates/ksp-app-wallet-desk/src/lib.rs crates/ksp-app-wallet-desk/src/offchain_runtime.rs crates/ksp-app-wallet-desk/src/wallet_balance.rs crates/ksp-app-wallet-desk/frontend/main.html crates/ksp-app-wallet-desk/frontend/ts/main.ts crates/ksp-app-wallet-desk/unit_tests/wallet_balance.rs crates/ksp-app-wallet-desk/tests/config_composition.rs crates/ksp-app-wallet-desk/tests/desktop_contract.rs crates/ksp-app-wallet-desk/tests/desktop_security.rs crates/ksp-app-wallet-desk/tests/release_compliance.rs docs/plans/019-V0_2_12_SOL_PRICES_DESK_PLAN.md docs/validation/015-V0_2_12_SOL_PRICES_DESK.md deltas/0.2.12/pre.008.md ``` ## 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-app-wallet-desk cargo test --workspace (cd crates/ksp-app-wallet-desk && cargo tauri dev) ``` Contrôle manuel : ouvrir un Wallet VIEW/OWNER, lancer `Refresh balance`, vérifier que la balance SOL reste correcte et que `SOL/USD moyen` affiche une valeur si au moins un provider keyless répond, sinon `N.A.`.