# Delta `0.2.6-pre.001` — audit Wallet Desk, composition, UX, sécurité et sizing ## Base requise Release stable attendue : ```text v0.2.5 ``` L'archive stable fournie confirme `workspace.package.version = 0.2.5` avant ouverture, six crates membres et l'absence de `ksp-app-wallet-desk`/`std.wallet`. ## Type de livraison ```text ksp-general-0.2.6-pre.001.zip ``` L'archive d'échange est un delta applicable depuis la racine de `v0.2.5`. Elle contient uniquement les fichiers ajoutés/modifiés par cette tranche. ## Objet Ouvrir `0.2.6 — Wallet Desk` sans commencer l'implémentation UI lourde. Le gate : - réaudite Config Desk comme template Tauri sans le copier aveuglément ; - réaudite les APIs finales Config, Wallet, Transport et Logging ; - confirme qu'un vrai `std.wallet` exige une extension de `ksp-config-lib` ; - fixe `cfg.std.wallet`, `schema.std.wallet` et `cfg.composite.ksp-app-wallet-desk` ; - fixe `wallets_directory` global avec fallback `${KSP_WALLETS_DIRECTORY:-wallets}` et profil Config minimal `default` pour la composition ; - confirme que `getBalance` stable fournit lamports + contexte RPC sans nouveau wrapper ; - définit runtime state, screen map, command map et DTO map ; - définit inventory/path safety, symlink policy et comportement root absent ; - définit le threat model desktop/password/export/state conflict ; - retient import, metadata OWNER, rotations, disable/recreate VIEW et export fichier dans `0.2.6` ; - exclut un écran de signature arbitraire et tout prix offchain ; - réaudite les dépendances Tauri/frontend actuelles ; - impose une CSP explicite à Wallet Desk au lieu de recopier `csp = null` de Config Desk ; - regranularise le forecast initial jusqu'à `pre.013`. ## Décisions principales ### Config ```text cfg.std.wallet schema.std.wallet cfg.composite.ksp-app-wallet-desk component_id = logging / transport / wallet ``` Shape prévu : ```text wallets_directory global + default_profile = default + profiles = [{ profile_id = default }] ``` Le profil minimal est requis par le moteur composite réel ; aucune donnée Wallet sensible n'entre dans Config. ### Inventory ```text root = ResolvedWalletConfig::wallets_directory non récursif .kspwallet exact regular file only symlink excluded root missing = état explicite, aucune création silencieuse wallet_id = filename validé mono-composant aucun alias dérivé du filename ``` ### Lifecycle ```text NoSelection -> Locked -> ViewOpen/OwnerOpen ``` `WalletView`/`WalletOwner` restent en Rust. Lock/deselect/state conflict drop le handle et purgent les projections protégées frontend. ### Balance ```text authorized Wallet handle -> Pubkey Rust -> HttpTransportPool::get_balance(role=default, config=None) -> lamports + slot + api_version -> safe DTO ``` ### Sécurité Tauri - CSP locale restrictive obligatoire ; - capabilities minimales ; - aucun password dans storage/log/Debug ordinaire ; - aucun export secret IPC/clipboard ; - export fichier OWNER uniquement ; - native Dialog `open/save` ajouté seulement lorsqu'il est consommé ; - Bootstrap modals pour confirmations privilégiées ; - aucun plugin filesystem nécessaire. ## Audit externe au 2026-08-20 Constats courants : ```text @tauri-apps/api 2.11.1 @tauri-apps/plugin-dialog 2.7.2 @fltsci/tauri-plugin-tracing 0.3.4 Bootstrap 5.3.8 ``` Les ranges existants de Config Desk restent cohérents, mais Wallet Desk démarre sans DataTables/SimpleBar/resize polyfill. Le plugin Dialog sera réaudité au moment exact de son ajout. ## Prévision souple révisée ```text pre.001 audit + Config/Wallet/Transport/Tauri + UX + threat model + sizing pre.002 crate Tauri + frontend shell + splash/main + logging bridge + CSP + ports pre.003 cfg.std.wallet + schema + ResolvedWalletConfig + composite Wallet Desk pre.004 runtime state + inventory/path safety + locked inspection + DTO foundation pre.005 create .kspwallet + OWNER session + explicit root-directory flow pre.006 unlock VIEW/OWNER + lock/deselect + authorized details + purge guarantees pre.007 Transport pool from composite + getBalance + diagnostics/refresh pre.008 native Dialog open + inspect/import CLI JSON/Base58 + destination no-clobber pre.009 OWNER metadata administration alias/notes + state_conflict UX pre.010 rotations OWNER/VIEW + disable/recreate VIEW + capability/security UX pre.011 OWNER file export + save picker + privileged confirmation + leak audit pre.012 deterministic integration tests + frontend security checks + Devnet smoke opt-in + compliance pre.013 README/USAGE/docs/graphs + dependency audit + production Tauri build candidate + prompt 0.2.7 rel.001 publication stable stricte ``` Le plan détaillé est `docs/plans/013-V0_2_6_WALLET_DESK_PLAN.md`. ## Fichiers ajoutés ```text docs/plans/013-V0_2_6_WALLET_DESK_PLAN.md deltas/0.2.6/pre.001.md ``` ## Fichiers modifiés ```text Cargo.toml ROADMAP.md docs/000-README.md docs/plans/000-README.md docs/plans/002-FUNCTIONAL_RELEASE_SEQUENCE.md ``` ## Fichiers volontairement inchangés ```text CHANGELOG.md .env.example config/** crates/** docs/architecture/** docs/formats/** docs/validation/** ``` `std.wallet`, le composite et la crate Tauri sont planifiés mais non créés dans le gate documentaire. ## Version technique Conformément à `VERSION_WORKFLOW.md`, le non-fix prerelease ouvre : ```text workspace.package.version = 0.2.6-pre.1 ``` L'identifiant de commit reste : ```text v0.2.6-pre.001 ``` Aucun tag Git n'est créé avant la release stable finale. ## Validations exécutées avant modification - archive stable `v0.2.5` fournie extraite et auditée ; - documents internes obligatoires relus ; - APIs Config/Wallet/Transport/Logging/Config Desk réauditées ; - archive bot3 inspectée uniquement comme référence historique ; - `python3 scripts/audit_rust_workspace_rules.py` exécuté sur la base stable : `General Rust rule audit: clean`, `KSP workspace Rust rule audit: clean` ; - le même audit structurel réexécuté sur l’état candidat `pre.001` après matérialisation : `General Rust rule audit: clean`, `KSP workspace Rust rule audit: clean` ; - audit externe Tauri/frontend actuel réalisé. ## Validations tentées mais impossibles dans le sandbox Le binaire `cargo` n'est pas installé dans le sandbox. Les trois commandes suivantes ont été tentées et ont échoué avec code `127` : ```bash cargo fmt --all cargo check --workspace cargo clippy --workspace --all-targets ``` Aucune de ces commandes n'est déclarée réussie. ## Validation opérateur requise avant commit Après application du delta : ```bash cargo fmt --all python3 scripts/audit_rust_workspace_rules.py cargo check --workspace cargo clippy --workspace --all-targets ``` Comme `pre.001` ne crée aucune crate/frontend, aucun `npm` ni build Tauri n'est requis dans cette tranche. Le gate `pre.001` n'est fermé qu'après réception de ces preuves opérateur vertes. Aucun travail `pre.002` ne doit être engagé avant ce checkpoint.