# Delta `0.2.6-pre.014` — polish desktop partagé, splash kbot3 et lancement Tauri multi-app
## Base requise
```text
0.2.6-pre.013-fix.002 appliquée
workspace.package.version = 0.2.6-pre.13.fix.2
```
La validation opérateur de la base est intégralement verte :
```text
cargo fmt --all OK
python3 scripts/audit_rust_workspace_rules.py clean
cargo check --workspace OK
cargo clippy --workspace --all-targets OK
ksp-logging-lib ownership 2/2 OK
Wallet Desk release_compliance 4/4 OK
cargo test -p ksp-app-wallet-desk OK
cargo test --workspace OK
smoke Wallet Desk Devnet de pre.013 déjà validé sur fix.001
```
## Type de livraison
```text
ksp-general-0.2.6-pre.014.zip
```
Le signal technique devient :
```text
workspace.package.version = 0.2.6-pre.14
commit = v0.2.6-pre.014
```
`ksp-app-config-desk/package.json`, `ksp-app-config-desk/tauri.conf.json`, `ksp-app-wallet-desk/package.json` et `ksp-app-wallet-desk/tauri.conf.json` suivent `0.2.6-pre.14`.
Aucun tag prerelease.
## Objectifs
Cette tranche ne change aucun contrat Wallet métier. Elle ferme les défauts de gabarit desktop remontés avant la documentation finale :
```text
en-têtes HTML Khadhroony normalisés
splash sans scrollbars fenêtre
splash avec fade-in / minimum / fade-out distincts
messages généraux défilants en bas
messages debug défilants en haut
nom/titre central du splash non sélectionnable
navigation Config Desk déplacée du header vers une sidebar
palette Wallet Desk réalignée sur la référence claire Config Desk
lancement Tauri multi-app corrigé et rendu durable
prompt 0.2.7 intercalé pour le conteneur binaire .kspwallet
```
## En-têtes HTML
Les quatre fichiers HTML des deux applications possèdent désormais les deux premières lignes normalisées :
```html
```
Les Wallet HTML, qui n'en possédaient pas, démarrent à `version: 1`.
## Splash partagé
Le comportement reprend les fonctionnalités génériques éprouvées dans kbot3 sans reprendre ses constantes codées en dur.
Les deux Desks utilisent :
```text
KSP_DESK_SPLASH_FADE_IN_MS
KSP_DESK_SPLASH_MINIMUM_MS
KSP_DESK_SPLASH_FADE_OUT_MS
```
Fallbacks :
```text
fade-in = 300 ms
minimum = 1200 ms pleinement visible
fade-out = 300 ms
```
Bornes :
```text
fade-in / fade-out <= 10 000 ms
minimum <= 60 000 ms
```
La provenance continue d'être résolue uniquement par `ksp-config-lib` : process > `.env` > fallback.
Le lifecycle backend devient additif et explicite :
```text
frontend ready
-> fade-in + attente fade-in
-> messages init + minimum pleinement visible
-> fade-out + attente fade-out
-> show/focus main
-> destroy splash
```
`expected_backend_lifecycle_ms` vaut donc :
```text
fade_in + minimum + fade_out
```
## Messages splash
Comme dans kbot3 :
- le bas du splash contient un feed de messages généraux avec statuts `info/warning/error/success` ;
- le haut contient un feed diagnostic uniquement lorsque Rust est compilé avec `debug_assertions` ;
- les deux zones auto-scrollent vers le dernier élément ;
- leurs scrollbars internes sont masquées visuellement.
Le frontend ne reçoit aucun secret dans ces messages.
## Scrollbars et sélection
Wallet Desk chargeait auparavant `splash.scss` depuis le module TypeScript, alors que Config Desk le chargeait directement dans `
`. Le style pouvait donc arriver après le premier rendu WebView et laisser apparaître momentanément les scrollbars natives.
Les deux applications chargent maintenant `sass/splash.scss` directement dans le HTML avant JavaScript.
Le CSS fixe également :
```text
html/body width/height 100%
overflow hidden dès le premier rendu
box-sizing border-box
container max-width/max-height 100%
overflow hidden sur le container
scrolling borné aux feeds internes
```
Le logo/image et le nom central appliquent `user-select: none`, `-webkit-user-select: none`, `-webkit-user-drag: none` et `pointer-events: none`.
## Harmonisation du main
La navigation Config Desk n'est plus placée horizontalement dans le header. Elle reprend le pattern apprécié de Wallet Desk :
```text
header : identité + vue active
main : sidebar pills verticale + contenu scrollable
footer : inchangé
```
Wallet Desk conserve sa sidebar mais son header revient sur la palette claire de référence de Config Desk au lieu du header sombre divergent.
Les `data-view` historiques de Config Desk restent inchangés ; aucune logique d'activation TypeScript n'est réécrite.
## Correction Tauri multi-app
Le défaut suivant a été reproduit conceptuellement à partir de la configuration actuelle :
```text
commande lancée depuis la racine avec -c Config Desk
-> Vite Config Desk démarre sur 1430
-> backend Tauri découvert peut être Wallet Desk
```
La cause est que Tauri v2 traite `-c/--config` comme une configuration **fusionnée avec la configuration par défaut déjà résolue** ; cette option n'est pas un sélecteur de crate/projet.
Le workflow KSP devient donc crate-local :
```bash
(cd crates/ksp-app-config-desk && cargo tauri dev)
(cd crates/ksp-app-wallet-desk && cargo tauri dev)
```
et pour le build :
```bash
(cd crates/ && cargo tauri build)
```
Les hooks Tauri sont aussi explicités sous forme objet :
```json
{
"script": "npm run dev",
"cwd": "."
}
```
et équivalent pour `npm run build`.
Les canaris vérifient maintenant le port, le hook/cwd et le nom du package Rust propre à l'application.
`KSP-APP-026`, `KSP-APP-029` et `KSP-APP-034` sont corrigées. Le lancement racine avec `-c crates//tauri.conf.json` est désormais interdit comme méthode de sélection multi-app.
Config Desk abandonne aussi son script standalone `check` afin d'aligner les deux applications sur la règle actuelle : l'opérateur n'exécute directement npm que pour installer/mettre à jour les dépendances ; Tauri possède les scripts dev/build.
## Intercalation de `0.2.7` — conteneur binaire `.kspwallet`
La question du JSON V1 lisible dans un éditeur est dissociée de `0.2.6` et du futur WebSocket.
Décision de cadrage :
```text
Base64 seul NON
conteneur binaire versionné à auditer/implémenter en 0.2.7
compatibilité lecture JSON V1 obligatoire
Wallet Desk modifié fonctionnellement NON attendu
```
Base64 seul reste textuel, trivialement réversible, sans gain cryptographique et avec surcharge de taille.
`0.2.7` doit séparer :
```text
container_version
!=
format_version logique/cryptographique
```
Ainsi V1 conserve ses semantics VIEW/OWNER et un futur `format_version >= 2` reste disponible pour de vraies évolutions d'autorisation/crypto.
Le prompt ajouté est :
```text
prompts/012-V0_2_7_START_PROMPT.md
```
WebSocket et les releases suivantes sont décalés d'un numéro dans le roadmap/inventaire/séquence fonctionnelle globale.
## Futur second facteur
`docs/IDEAS.md` précise :
- `ksp-wallet-lib` restera propriétaire du format, des challenges et de la vérification ;
- Wallet Desk devra évoluer lorsqu'un facteur est interactif : OTP, enrollment/recovery, hardware/WebAuthn, consentement externe ;
- un seed TOTP stocké uniquement dans le même fichier ne doit pas être assimilé automatiquement à un second facteur indépendant contre un attaquant possédant ce fichier.
Aucun V2/OTP/2FA n'est implémenté dans cette tranche.
## Documentation globale
Exception justifiée à la règle « ROADMAP seulement au début/à la fin » : l'insertion d'une nouvelle release `0.2.7` change réellement la séquence globale. Sont donc mis à jour :
```text
ROADMAP.md
docs/plans/002-FUNCTIONAL_RELEASE_SEQUENCE.md
docs/architecture/004-COMPONENT_INVENTORY.md
```
`CHANGELOG.md` reste inchangé et sera traité à la clôture.
## Fichiers ajoutés
```text
deltas/0.2.6/pre.014.md
prompts/012-V0_2_7_START_PROMPT.md
```
## Fichiers modifiés
```text
.env.example
Cargo.toml
ROADMAP.md
crates/ksp-app-config-desk/README.md
crates/ksp-app-config-desk/USAGE.md
crates/ksp-app-config-desk/frontend/main.html
crates/ksp-app-config-desk/frontend/sass/_app.scss
crates/ksp-app-config-desk/frontend/sass/splash.scss
crates/ksp-app-config-desk/frontend/splash.html
crates/ksp-app-config-desk/frontend/ts/splash.ts
crates/ksp-app-config-desk/package.json
crates/ksp-app-config-desk/src/app_state.rs
crates/ksp-app-config-desk/src/splash.rs
crates/ksp-app-config-desk/src/tw_splash.rs
crates/ksp-app-config-desk/tauri.conf.json
crates/ksp-app-config-desk/tests/desktop_contract.rs
crates/ksp-app-config-desk/unit_tests/splash.rs
crates/ksp-app-wallet-desk/frontend/main.html
crates/ksp-app-wallet-desk/frontend/sass/splash.scss
crates/ksp-app-wallet-desk/frontend/splash.html
crates/ksp-app-wallet-desk/frontend/ts/main.ts
crates/ksp-app-wallet-desk/frontend/ts/splash.ts
crates/ksp-app-wallet-desk/package.json
crates/ksp-app-wallet-desk/src/app_state.rs
crates/ksp-app-wallet-desk/src/splash.rs
crates/ksp-app-wallet-desk/src/tw_splash.rs
crates/ksp-app-wallet-desk/tauri.conf.json
crates/ksp-app-wallet-desk/tests/desktop_contract.rs
crates/ksp-app-wallet-desk/unit_tests/splash.rs
docs/IDEAS.md
docs/architecture/004-COMPONENT_INVENTORY.md
docs/plans/002-FUNCTIONAL_RELEASE_SEQUENCE.md
docs/plans/006-V0_1_4_CONFIG_DESKTOP_PLAN.md
docs/plans/013-V0_2_6_WALLET_DESK_PLAN.md
docs/rules/RULES_KSP.md
prompts/000-README.md
prompts/011-V0_2_6_START_PROMPT.md
```
## Fichiers supprimés
```text
aucun
```
## Contrôles assistant
```text
General Rust rule audit clean
Rust export completeness audit 0 candidate
KSP workspace Rust rule audit clean
TOML / JSON parse clean
HTML parse + IDs uniques
splash TypeScript aucun diagnostic syntaxique local
(imports non résolus attendus sans node_modules/bindings)
CHANGELOG inchangé
```
Cargo n'est pas disponible dans l'environnement de génération ; compilation, Clippy et tests restent autoritatifs côté opérateur.
## Validation opérateur requise
```bash
cargo fmt --all
python3 scripts/audit_rust_workspace_rules.py
cargo check --workspace
cargo clippy --workspace --all-targets
cargo test -p ksp-app-config-desk
cargo test -p ksp-app-wallet-desk
cargo test --workspace
```
Validation visuelle Config Desk :
```bash
KSP_DESK_SPLASH_FADE_IN_MS=1500 \
KSP_DESK_SPLASH_MINIMUM_MS=6000 \
KSP_DESK_SPLASH_FADE_OUT_MS=1500 \
bash -lc 'cd crates/ksp-app-config-desk && cargo tauri dev'
```
Vérifier :
```text
backend = ksp-app-config-desk
Vite = 1430 / HMR = 1431
aucune scrollbar splash fenêtre
fade-in puis minimum puis fade-out observables
messages généraux en bas
diagnostics en haut en debug
titre central non sélectionnable
navigation verticale dans le main
```
Validation visuelle Wallet Desk :
```bash
KSP_DESK_SPLASH_FADE_IN_MS=1500 \
KSP_DESK_SPLASH_MINIMUM_MS=6000 \
KSP_DESK_SPLASH_FADE_OUT_MS=1500 \
KSP_WALLETS_DIRECTORY=var/wallet-desk-pre014 \
bash -lc 'cd crates/ksp-app-wallet-desk && cargo tauri dev'
```
Vérifier :
```text
backend = ksp-app-wallet-desk
Vite = 1432 / HMR = 1433
aucune scrollbar splash fenêtre
mêmes trois phases/messages
titre central non sélectionnable
header clair cohérent avec Config Desk
fonctionnalités Wallet pre.013 non régressées
```
**Ne pas exécuter `cargo tauri build` en `pre.014`.** Le build final reste réservé à `pre.015` et doit rester l'absolue dernière opération de validation de `0.2.6`.