# Validation `0.2.6` — Wallet Desk integration / compliance / security ## 1. Objet Cette matrice a été ouverte par `0.2.6-pre.013` et est désormais **clôturée positivement par `0.2.6-rel.001`** comme preuve durable de composition et de conformité de `ksp-app-wallet-desk`. Le calendrier a été étendu après `pre.014` : `pre.015` introduit le wire V2, `pre.016` les APIs génériques/versionnées, `pre.017` migration/régression, puis `pre.018` porte la clôture documentaire et le dernier build Tauri. Elle ne remplace ni le plan [`../plans/013-V0_2_6_WALLET_DESK_PLAN.md`](../plans/013-V0_2_6_WALLET_DESK_PLAN.md), ni la matrice Wallet V1 [`008-V0_2_5_WALLET_SECURITY_COMPLIANCE.md`](008-V0_2_5_WALLET_SECURITY_COMPLIANCE.md), ni les deltas `0.2.6`. Le gate `pre.013` porte sur : ```text composition Config -> Wallet -> Transport inventory/path adversarial DTO / IPC / frontend secret boundaries capabilities Tauri KSP dependency ownership smoke Devnet opt-in Wallet Desk Cargo tree / inverse tree workspace checkpoint complet ``` ### Checkpoint `pre.013-fix.001` Le premier run opérateur de `pre.013` du 21 août 2026 a validé `cargo fmt`, l'audit Python, `cargo check` et Clippy. Les tests ont ensuite révélé un défaut du **canari**, pas du DTO : `WalletAuthorizedDto` documente `configured_secret_candidate_count` avec les mots `Wallet password candidates`, et le scanner de `release_compliance` inspectait commentaires et champs ensemble. Le correctif restreint désormais l'analyse aux lignes de champs `pub(crate)`, comme le canari éprouvé depuis `pre.006-fix.001`. Les frontières IPC ne changent pas. ## 2. Surface intégrée auditée Au démarrage de `pre.013`, Wallet Desk a déjà validé en runtime : ```text Config composite logging + wallet + transport répertoire Wallet effectif Config-owned inventory locked .kspwallet create import Solana CLI JSON / Base58 unlock manuel et Config-owned VIEW / OWNER getBalance via Transport alias / notes OWNER rotation OWNER rotation VIEW par OWNER self-rotation VIEW strong disable/recreate VIEW export OWNER Solana CLI JSON / Base58 no-clobber export ``` Le checkpoint opérateur `pre.012` du 21 août 2026 est vert : `cargo fmt`, audit Python, `cargo check`, Clippy sans warning, tests Wallet Desk, tests workspace complets et parcours `cargo tauri dev`. Le runtime confirme aussi l'export des deux formats, le refus `wallet.destination_exists` sans invalidation de la session OWNER et l'annulation du save picker sans effet. ## 3. Matrice de frontières | Frontière | Contrat `0.2.6` | Preuve durable | |------------------------------|--------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------| | Frontend -> Config | aucun accès direct env/.env | `release_compliance::backend_keeps_config_wallet_transport_and_logging_ownership_boundaries` + ownership Config | | Frontend -> Wallet secret | passwords uniquement request-only ; jamais de keypair en IPC | `desktop_security` + `release_compliance::response_dtos_keep_secret_key_material_out_of_ipc` | | Frontend -> filesystem | aucun path arbitraire ; picker natif Rust | tests import/export + capability audit | | Frontend -> réseau Solana | aucun `fetch`/WebSocket/RPC direct | `release_compliance::frontend_has_no_direct_filesystem_network_or_secret_persistence_surface` | | Wallet Desk -> Solana crates | aucune dépendance protocole directe | `release_compliance::wallet_desk_dependency_firewall_and_tauri_capabilities_are_minimal` | | Wallet Desk -> HTTP | `ksp-onchain-transport-lib` uniquement | manifest + smoke Devnet | | Wallet Desk -> Wallet crypto | `ksp-wallet-lib` uniquement | manifest + feature canaries | | Wallet Desk -> logging | façade `ksp-logging-lib` + adapter `tauri-plugin-tracing` | source audit + workspace logging canary | | locked -> frontend | format/version/VIEW enabled seulement | `desktop_security` | | VIEW/OWNER handles | Rust-only `AppState` | session/security tests | | export | OWNER-only, file direct, no-clobber | `desktop_security` + runtime `pre.012` | ## 4. Inventory / path adversarial `pre.013` renforce le canari déterministe d'inventory : ```text seuls les fichiers réguliers directs *.kspwallet sont candidats suffixe exact et sensible à la casse backup.kspwallet.bak ignoré upper.KSPWALLET ignoré nested/hidden.kspwallet ignoré répertoire nommé *.kspwallet ignoré symlink *.kspwallet ignoré sélection ../... rejetée sélection ..\... rejetée sélection absolue rejetée sélection nested/... rejetée sélection suffixe non exact rejetée sélection vide rejetée ``` La sélection continue de réinspecter le fichier verrouillé au moment de l'ouverture de session ; l'inventory n'est jamais utilisé comme autorité de sécurité durable. ## 5. DTO / IPC / frontend audit Les réponses IPC auditées ne doivent jamais contenir : ```text password secret_key private_key keypair_bytes ciphertext ``` Les projections import/export ne contiennent aucun path complet. `WalletAuthorizedDto` peut exposer Pubkey/alias/notes uniquement après VIEW/OWNER ; le locked inventory ne peut jamais les exposer. Le frontend doit rester sans : ```text @tauri-apps/plugin-dialog @tauri-apps/plugin-fs window.alert / confirm / prompt localStorage / sessionStorage navigator.clipboard pour secret fetch / XMLHttpRequest / WebSocket / EventSource KSP_SECRET_WALLET_PASS_* concret sourcePath / destinationPath ``` Les opérations natives import/export utilisent le plugin Dialog côté Rust, sans permission Dialog/FS accordée au guest frontend. ## 6. Capabilities Tauri La capability Wallet Desk doit rester exactement : ```text core:default tracing:default ``` Aucune permission `dialog:*` ou `fs:*` n'est accordée au frontend. La CSP reste `null` tant qu'un besoin concret n'impose pas une politique spécifique ; `pre.013` n'ajoute aucune ressource réseau frontend. ## 7. Dependency firewall Dépendances KSP directes attendues de Wallet Desk : ```text ksp-config-lib ksp-core-lib ksp-logging-lib ksp-onchain-transport-lib ksp-wallet-lib ``` Aucune dépendance directe `solana-*`, `reqwest` ou `tracing` n'est admise dans le manifest Wallet Desk. `tauri-plugin-tracing` reste l'adapter Tauri justifié ; l'émission applicative reste via `ksp-logging-lib`. Commandes opérateur `pre.013` : ```bash cargo tree -p ksp-app-wallet-desk --depth 1 cargo tree -p ksp-app-wallet-desk -d cargo tree -i ksp-wallet-lib cargo tree -i ksp-onchain-transport-lib cargo tree -i tauri-plugin-dialog ``` Le résultat attendu est qu'aucune nouvelle dépendance Solana/protocole directe ne soit introduite par `pre.013`; le seul changement de feature est `tokio/macros` requis pour le smoke opt-in de la crate application. ## 8. Smoke Devnet Wallet Desk Le smoke live est : ```text Config composite devnet -> resolve Wallet profile Composite -> ConfigEnvironment -> répertoire Wallet effectif -> create .kspwallet réel VIEW+OWNER -> inspect locked -> open VIEW -> resolve Transport profile Composite -> HttpTransportPool -> getBalance(confirmed) sur la Pubkey du wallet créé -> suppression du .kspwallet canari ``` Il est volontairement `ignored` dans la suite déterministe afin d'éviter une dépendance réseau lors de `cargo test --workspace`. Commande recommandée : ```bash KSP_WALLETS_DIRECTORY=var/wallet-desk-pre013-smoke \ cargo test -p ksp-app-wallet-desk \ --test wallet_desk_devnet_smoke \ -- --ignored --nocapture ``` Ce placement est intentionnel : le smoke cross-crates `Config -> Wallet -> Transport -> Devnet getBalance` appartient à la surface d'orchestration Wallet Desk. Il ne doit pas migrer dans `ksp-config-lib` ou `ksp-onchain-transport-lib`. Un solde `0` est un succès valide ; le gate vérifie l'exécution RPC et un contexte de slot non nul, pas un montant particulier. ## 9. Gate déterministe `pre.013` ```bash cargo fmt --all python3 scripts/audit_rust_workspace_rules.py cargo check --workspace cargo clippy --workspace --all-targets cargo test -p ksp-app-wallet-desk cargo test --workspace ``` Attendus : ```text audit structurel clean aucun warning check/Clippy release_compliance vert wallet_desk_devnet_smoke présent mais ignored dans workspace inventory adversarial renforcé vert aucune régression Config/Core/Logging/Transport/Wallet ``` ## 10. Checkpoint runtime `pre.012` déjà acquis Le runtime communiqué avant ouverture de `pre.013` confirme notamment : ```text export Base58 OWNER : OK export Solana CLI JSON OWNER : OK destination existante : wallet.destination_exists, session OWNER conservée annulation save picker : aucun export, session conservée VIEW : export indisponible aucun secret/path complet observé dans les logs frontend/backend fournis ``` Ce checkpoint n'est pas rejoué automatiquement par `pre.013`; la tranche ajoute les canaries transversaux qui rendent ces frontières durables. ## 11. Résultats `pre.013` Checkpoint opérateur après `pre.013-fix.001` : ```text fmt / audit / check / clippy : PASS cargo test -p ksp-app-wallet-desk : PASS release_compliance : PASS (4/4) smoke Devnet Wallet Desk opt-in : PASS cargo tree / inverse tree : exécutés ; tauri-plugin-fs observé uniquement transitivement via tauri-plugin-dialog cargo test --workspace : BLOCKED par un faux positif du canari Logging global ``` Le blocage workspace est limité à `ksp-logging-lib/tests/ownership.rs::workspace_crates_do_not_bypass_ksp_logging_facade` : le scanner voit le littéral `tracing::` dans `release_compliance.rs`, alors que ce littéral est la chaîne recherchée par le canari et non un usage de `tracing`. `pre.013-fix.002` supprime ce littéral statique en construisant le motif à l'exécution, sans modifier le scanner global ni relâcher la politique Logging. La matrice est fermée : les tranches V2 `pre.015`–`pre.017` sont acquises et `pre.018-fix.001` a fourni la preuve opérateur finale du runtime packagé, du workspace et du build Tauri. `pre.018-fix.002` est documentaire uniquement. ## 12. Intercalation V2 à partir de `pre.015` `pre.015` ne modifie pas encore Wallet Desk : il ajoute dans `ksp-wallet-lib` un codec binaire V2 strict et une fixture canonique. Les gates Desk `pre.013`/`pre.014` restent donc applicables sans changement. `pre.016` matérialise ensuite la façade version-neutral et fait migrer Wallet Desk vers elle : ```text create/import Desk API générique -> default V2 open VIEW/OWNER Desk API générique -> détection V1/V2 inventory/selection Desk inspect générique -> détection V1/V2 aucun appel Desk à *_v1 ou *_v2 gate durable V1 existant reste ouvrable sans migration V2 nouvellement créé/importé administration complète conservée en V2 ``` Les canaris `pre.016` couvrent également le refus croisé des lecteurs explicitement versionnés et le maintien du format V2 après metadata/rotations/disable/recreate/self-rotation VIEW. `pre.017` matérialise ensuite la migration V1 -> V2 explicite : mémoire, copie no-clobber et remplacement in-place stale-protected, avec conservation identité/metadata/note IDs et canaris tampering/state-conflict. Wallet Desk reste non-migrant et continue à ouvrir/inspecter via les APIs génériques. ## 13. Checkpoint opérateur `pre.017` Le checkpoint communiqué le 22 août 2026 ferme les tranches fonctionnelles V2 avant candidate : ```text cargo fmt --all PASS audit Rust workspace PASS cargo check --workspace PASS cargo clippy --workspace --all-targets PASS, sans warning cargo test --workspace PASS ksp-wallet-lib 84 passés / 1 benchmark ignored Wallet Desk desktop_contract 17/17 Wallet Desk desktop_security 12/12 Wallet Desk release_compliance 4/4 ``` Le parcours Tauri crate-local avec un `KSP_WALLETS_DIRECTORY` isolé confirme ensuite : création du répertoire effectif Config-owned, import Solana CLI JSON, création native `format_version=2`, ouverture d'une session OWNER, inventory du nouveau wallet et `getBalance` Devnet réussi avec un slot non nul. Aucun build production n'est exécuté à ce checkpoint. ## 14. Candidate `pre.018` — runtime packagé et resources `pre.018` ferme le point CWD/resources laissé ouvert par `pre.014-fix.001`. Le runtime release ne dépend plus du checkout source : ```text Tauri bundle.resources -> documents Config enregistrés + JSON Schemas uniquement -> aucun .env / logs / wallets / secret Tauri resource_dir -> ksp-config-lib::prepare_packaged_runtime -> racine KSP user-writable résolue par ProjectDirs -> Config documents seed-only-if-absent -> Schemas package-owned synchronisés à chaque lancement -> set_current_dir(runtime_root) avant AppState::initialize ``` Config Desk et Wallet Desk embarquent le même ensemble de huit resources du registre courant. Le guest frontend ne reçoit aucune permission filesystem supplémentaire. Les Config déjà modifiées restent inchangées lors d'un nouveau lancement packagé ; `.env` n'est jamais embarqué ni seedé. Les chemins relatifs Logging/Wallet restent ancrés sur la racine runtime writable sauf override explicite par Config. Les canaris déterministes de la candidate couvrent le seed Config non destructif, la synchronisation des schemas, le rejet d'une destination symlink sur Unix, l'exposition publique du layout packagé, les mappings Tauri des deux Desks et l'absence de ressources mutables/secrètes dans le bundle Wallet Desk. ## 15. Gate final opérateur `pre.018` — preuve acquise Le premier passage `pre.018` a validé `fmt`, audit, `check` et Clippy, mais `cargo test -p ksp-config-lib` a révélé un faux positif du canari d’ownership : le test Wallet Desk recopiait littéralement le nom physique de la ressource dotenv qu’il cherchait à interdire. `pre.018-fix.001` a remplacé ce littéral par `ksp_config_lib::DEFAULT_DOTENV_PATH`, sans affaiblir le scanner Config, et a aligné les canaris de version sur `env!("CARGO_PKG_VERSION")`. Le checkpoint opérateur du 22 août 2026 après `pre.018-fix.001` est intégralement vert : ```text cargo fmt --all PASS audit Rust workspace PASS cargo check --workspace PASS cargo clippy --workspace --all-targets PASS, sans warning cargo test -p ksp-config-lib PASS ; ownership 5/5 ; public API 15/15 cargo test -p ksp-wallet-lib PASS ; 84 passés / 1 benchmark ignored cargo test -p ksp-app-config-desk PASS ; desktop contract 4/4 ; security 2/2 cargo test --workspace PASS Wallet Desk desktop_contract 18/18 Wallet Desk desktop_security 12/12 Wallet Desk release_compliance 5/5 ``` Le build de production a ensuite été exécuté comme **dernière opération de validation** : ```bash (cd crates/ksp-app-wallet-desk && cargo tauri build) ``` Résultat : PASS, avec production des trois bundles Linux de candidate `0.2.6-pre.18.fix.1` : `.deb`, `.rpm` et `.AppImage`. `pre.018-fix.002` a ensuite modifié uniquement les documents pour renforcer le contrat de reprise `0.2.7` ; aucun artefact technique ni contrat runtime n’a été changé. ### Verdict avant publication stable ```text composition Config + Wallet + HTTP Transport + Logging PASS frontières IPC/secrets PASS Wallet V1 lecture + V2 default/runtime/migration PASS packaging Config/resources user-writable PASS workspace Rust/Clippy/tests PASS build Tauri Linux PASS ``` Le verdict de compliance `0.2.6` est donc **positif**. `rel.001` ne doit ajouter aucune capacité ; il aligne les signaux de version sur `0.2.6`, synchronise les documents stables et rejoue le gate stable. Le build stable Wallet Desk doit de nouveau rester l’absolue dernière opération avant commit/tag `v0.2.6`.