# Delta `0.2.6-pre.018` — candidate finale Wallet Desk, runtime packagé et documentation ## Base requise ```text 0.2.6-pre.017 appliquée workspace.package.version = 0.2.6-pre.17 ``` Le checkpoint opérateur du 22 août 2026 est intégralement vert : ```text cargo fmt --all OK python3 scripts/audit_rust_workspace_rules.py clean cargo check --workspace OK cargo clippy --workspace --all-targets OK cargo test --workspace OK ksp-wallet-lib 84 passed / 1 ignored Wallet Desk desktop_contract 17/17 OK Wallet Desk desktop_security 12/12 OK Wallet Desk release_compliance 4/4 OK smokes réseau / benchmark ignored comme prévu ``` Le parcours manuel Tauri crate-local est également acquis : avec un `KSP_WALLETS_DIRECTORY` isolé, Wallet Desk importe une keypair Solana CLI JSON, `ksp-wallet-lib` journalise la création native `format_version=2`, la session OWNER s'ouvre, l'inventory retrouve le V2 et `getBalance` Devnet réussit avec un slot non nul. `pre.017` est donc accepté comme base de la candidate finale. ## Signal technique Cette tranche modifie le bootstrap release, les resources Tauri, Config et la documentation : ```text workspace.package.version = 0.2.6-pre.18 package.json Config Desk = 0.2.6-pre.18 package.json Wallet Desk = 0.2.6-pre.18 tauri.conf Config Desk = 0.2.6-pre.18 tauri.conf Wallet Desk = 0.2.6-pre.18 commit = v0.2.6-pre.018 ``` Aucun tag prerelease. ## Objectifs de la candidate `pre.018` n'ajoute aucune nouvelle capacité Wallet métier. La tranche ferme : ```text runtime distribué indépendant du checkout source resources Config/Schemas packagées racine runtime KSP user-writable commune aux Desks README/USAGE Wallet Desk synchronisation docs/règles/compliance/prompt 0.2.7 versions applicatives finales de prerelease canaris packaging/resources ordre du gate final et build Tauri absolu dernier ``` ## Runtime packagé : ownership Config Le parcours debug existant reste inchangé : Tauri est lancé crate-local, puis `main.rs` normalise le CWD Rust vers la racine du workspace avant Config. Le parcours release ne dépend plus de ce checkout. Les deux `tauri.conf.json` embarquent exactement les huit resources actuellement connues du `ConfigFileRegistry` : ```text config/composite.ksp-app-wallet-desk.json config/std.logging.json config/std.transport.json config/std.wallet.json config/schemas/composite.schema.json config/schemas/std.logging.schema.json config/schemas/std.transport.schema.json config/schemas/std.wallet.schema.json ``` Ne sont jamais embarqués : ```text .env logs/ wallets/ secrets runtime ``` `ksp-config-lib` reçoit la dépendance `directories ^6.0` et expose : ```rust prepare_packaged_runtime(resource_root) PackagedRuntimeLayout ERROR_CODE_PACKAGED_RUNTIME_PREPARATION_FAILED ``` La racine writable commune est résolue par `directories::ProjectDirs` avec l'identité projet KSP, sans path user codé en dur dans les applications. Politique de préparation : ```text Config documents package-owned defaults -> seed uniquement si la destination utilisateur est absente -> une Config existante n'est jamais écrasée silencieusement JSON Schemas -> package-owned current authority -> synchronisés depuis les resources à chaque lancement .env -> jamais packagé / jamais seedé -> reste possédé et géré par Config dans la racine runtime writable ``` La persistence réutilise la primitive atomique Config existante et rejette les destinations symlink/non-file. ## Bootstrap Tauri release `src/tauri.rs` des deux applications suit désormais : ```text generate_context -> configure_packaged_runtime(context) -> AppState::initialize(arguments) -> Builder/run ``` `configure_packaged_runtime` compile dans tous les profils afin que `cargo check`/Clippy debug vérifient également les APIs Tauri utilisées par le parcours release. En debug, il retourne immédiatement sans modifier le comportement acquis. En release : ```text tauri::utils::platform::resource_dir -> ksp_config_lib::prepare_packaged_runtime -> std::env::set_current_dir(runtime_root) -> AppState::initialize ``` Le guest frontend ne reçoit aucune capability filesystem supplémentaire. ## Canaris Config / desktop `ksp-config-lib` ajoute des tests déterministes qui prouvent : - premier seed des Config packagées ; - conservation d'une Config utilisateur déjà modifiée ; - resynchronisation d'un schema mis à jour dans le package ; - layout runtime/cfg/schema cohérent ; - rejet d'une destination symlink sous Unix ; - exposition du contrat public depuis la racine de crate. Les deux `desktop_contract.rs` vérifient les mappings `bundle.resources` et l'appel de préparation du runtime packagé. `release_compliance.rs` Wallet Desk vérifie en plus qu'aucune resource `.env`, `logs`, `wallets`, `secret` ou `private` n'entre dans le bundle. ## Documentation candidate Créés : ```text crates/ksp-app-wallet-desk/README.md crates/ksp-app-wallet-desk/USAGE.md ``` Synchronisés : ```text crates/ksp-app-config-desk/README.md crates/ksp-app-config-desk/USAGE.md docs/rules/RULES_KSP.md docs/architecture/010-APPS_SERVICES_SCENARIOS_AND_CONTROL.md docs/validation/009-V0_2_6_WALLET_DESK_COMPLIANCE.md docs/validation/000-README.md docs/formats/000-README.md docs/plans/013-V0_2_6_WALLET_DESK_PLAN.md docs/plans/002-FUNCTIONAL_RELEASE_SEQUENCE.md docs/plans/000-README.md docs/000-README.md docs/IDEAS.md ROADMAP.md état global uniquement prompts/011-V0_2_6_START_PROMPT.md prompts/012-V0_2_7_START_PROMPT.md ``` `prompts/012-V0_2_7_START_PROMPT.md` reste dédié à `0.2.7 — WebSocket Solana standard` sur base stable `v0.2.6`. `CHANGELOG.md` est audité mais **volontairement inchangé** dans la prerelease. L'entrée stable `0.2.6` appartient à `rel.001` après validation du build final. ## Dépendances Nouvelle dépendance externe : ```text directories = ^6.0 ``` Elle est déclarée uniquement sous `[workspace.dependencies]` et consommée par `ksp-config-lib` via `directories.workspace = true`. `tempfile`, déjà possédé par le workspace, est ajouté aux dev-dependencies de Config pour les fixtures packaging isolées. Aucune dépendance Solana, réseau, filesystem Tauri guest ou cryptographique supplémentaire n'est ajoutée. ## Validation opérateur candidate Après application du delta : ```bash cargo fmt --all python3 scripts/audit_rust_workspace_rules.py cargo check --workspace cargo clippy --workspace --all-targets cargo test -p ksp-config-lib cargo test -p ksp-wallet-lib cargo test -p ksp-app-config-desk cargo test -p ksp-app-wallet-desk cargo test --workspace ``` Puis réaudit de dépendances si nécessaire : ```bash cargo tree -p ksp-config-lib --depth 1 cargo tree -p ksp-app-wallet-desk --depth 1 cargo tree -p ksp-app-wallet-desk -d ``` Le parcours fonctionnel final et les smokes live retenus sont exécutés avant le build. Exemple : ```bash KSP_WALLETS_DIRECTORY=var/wallet-desk-pre018 \ bash -lc 'cd crates/ksp-app-wallet-desk && cargo tauri dev' ``` Le smoke Devnet opt-in peut être rejoué avant le build si souhaité. ## Build final L'absolue dernière opération de validation est : ```bash (cd crates/ksp-app-wallet-desk && cargo tauri build) ``` Ne lancer ensuite ni fmt, ni check, ni test, ni autre build avant d'enregistrer le résultat du gate. Si une correction est requise, produire `pre.018-fix.NNN`, rejouer les validations depuis le début, puis refaire le build en dernière opération. Si le gate complet est vert, la prochaine étape est uniquement : ```text 0.2.6-rel.001 workspace.package.version -> 0.2.6 CHANGELOG stable -> 0.2.6 tag final -> v0.2.6 ``` `rel.001` n'introduit aucune nouvelle fonctionnalité.