Files
khadhroony-solana-project/deltas/0.2.6/pre.009.md
2026-08-21 12:35:01 +02:00

7.3 KiB

Delta 0.2.6-pre.009 — administration metadata OWNER + recovery wallet.state_conflict

Base requise

0.2.6-pre.008-fix.001 appliquée
workspace.package.version = 0.2.6-pre.8.fix.1

La base opérateur est propre : fmt, audit, check, Clippy sans warning, tests Wallet Desk et workspace complet sont verts. Le runtime d'import natif a déjà été validé sur la tranche précédente.

Type de livraison

ksp-general-0.2.6-pre.009.zip

Le signal technique devient :

workspace.package.version = 0.2.6-pre.9
commit = v0.2.6-pre.009

ksp-app-wallet-desk/package.json et tauri.conf.json suivent 0.2.6-pre.9.

Objectif

Cette tranche ouvre l'administration des metadata protégées du wallet exclusivement pour une session OWNER :

alias update / clear
note add
note update
note delete
projection autorisée rafraîchie après succès
wallet.state_conflict => purge du handle stale + réinspection Locked + réautorisation obligatoire

VIEW continue d'exposer Pubkey/alias/notes en lecture seule. Locked ne reçoit toujours aucune identité protégée.

Contrats frontend -> Rust

Nouveaux DTOs request-only :

WalletAliasUpdateRequestDto
WalletNoteAddRequestDto
WalletNoteUpdateRequestDto
WalletNoteDeleteRequestDto

Ils transportent alias, texte ou identifiant de note uniquement pendant la commande explicite. Ils ne dérivent ni Debug ni Clone et aucune valeur de metadata n'est journalisée.

Délégation Wallet

Wallet Desk ne réimplémente aucune mutation. Les commandes appellent directement :

WalletOwner::update_alias
WalletOwner::add_note
WalletOwner::update_note
WalletOwner::delete_note

Les bornes V1 restent autoritativement validées dans ksp-wallet-lib : alias 256 octets UTF-8, 64 notes maximum, 8 KiB par texte de note.

Lifecycle OWNER async

Pendant une mutation persistante, le WalletOwner est déplacé hors du mutex de session avant l'await et remplacé par une réservation Rust-only :

Owner
  -> OwnerOperation
  -> Owner          succès ou erreur non conflictuelle encore compatible
  -> Locked         wallet.state_conflict + réinspection valide
  -> NoSelection    conflit + réinspection impossible

La réservation conserve uniquement wallet_id, chemin Rust-only, Pubkey et état VIEW afin de détecter une complétion stale. Une sélection/désélection concurrente empêche la réinstallation de l'ancien handle.

Recovery wallet.state_conflict

Un conflit d'état ne déclenche jamais de retry aveugle avec l'OWNER authentifié sur une version devenue ancienne.

Le backend :

reçoit wallet.state_conflict
-> détruit WalletOwner stale
-> inspect_locked_wallet_file_v1 sur le fichier courant
-> revient au plus à Locked

Le frontend :

purge Pubkey / alias / notes / balance
-> réinspecte explicitement le wallet sélectionné
-> revient à Locked
-> ouvre la vue Security
-> impose un nouvel unlock OWNER

UI

La vue Details reçoit une carte Administration metadata OWNER :

alias Save / Clear
nouvelle note / Add note
édition Save note
Delete note

Les contrôles sont désactivés hors OWNER. La suppression utilise un modal Bootstrap intégré ; aucun window.confirm, window.alert ou window.prompt n'est introduit. Le contenu de la note n'est pas recopié dans le modal de confirmation.

Correction du workflow documentaire

Cette tranche applique également la séparation documentaire demandée :

  • ROADMAP.md est ramené à une ligne synthétique globale pour 0.2.6 et ne sera plus modifié à chaque prerelease ;
  • CHANGELOG.md reste inchangé et réservé à la clôture ;
  • docs/plans/002-FUNCTIONAL_RELEASE_SEQUENCE.md est restructuré : état acquis condensé + trajectoire restante lisible, au lieu d'une accumulation sur une seule ligne ;
  • docs/plans/013-V0_2_6_WALLET_DESK_PLAN.md reste le plan détaillé de la série.

La trajectoire est étendue ainsi :

pre.013 intégration / compliance / sécurité / smoke
pre.014 polish Bootstrap + splashscreen, détails opérateur à préciser
pre.015 documentation finale / prompt 0.2.7 / cargo tauri build en dernière opération
rel.001

pre.014 inclura notamment le défaut de scrollbars occasionnelles du splashscreen, sans préjuger des autres corrections visuelles qui seront précisées au moment de l'ouverture de la tranche.

Fichiers ajoutés

crates/ksp-app-wallet-desk/src/wallet_metadata.rs
crates/ksp-app-wallet-desk/unit_tests/wallet_metadata.rs
deltas/0.2.6/pre.009.md

Fichiers modifiés

Cargo.toml
ROADMAP.md
crates/ksp-app-wallet-desk/frontend/main.html
crates/ksp-app-wallet-desk/frontend/ts/main.ts
crates/ksp-app-wallet-desk/package.json
crates/ksp-app-wallet-desk/src/app_state.rs
crates/ksp-app-wallet-desk/src/lib.rs
crates/ksp-app-wallet-desk/src/tauri.rs
crates/ksp-app-wallet-desk/src/wallet_session.rs
crates/ksp-app-wallet-desk/tauri.conf.json
crates/ksp-app-wallet-desk/tests/desktop_contract.rs
crates/ksp-app-wallet-desk/tests/desktop_security.rs
docs/plans/002-FUNCTIONAL_RELEASE_SEQUENCE.md
docs/plans/013-V0_2_6_WALLET_DESK_PLAN.md

Fichiers supprimés

aucun

Hors scope

Cette tranche ne réalise pas encore :

rotation OWNER / VIEW                         pre.010
disable/recreate VIEW fort                   pre.011
export OWNER fichier                         pre.012
polish final Bootstrap / splash              pre.014
build Tauri final                            pre.015, dernière opération

Aucune nouvelle dépendance Cargo ou npm n'est ajoutée.

Contrôles assistant

General Rust rule audit                        clean
Rust export completeness audit                 clean
KSP workspace Rust rule audit                  clean
headers de fichiers modifiés                   +1 exact
TOML / JSON                                    parse clean
CHANGELOG / README / RULES                      inchangés
frontend : aucun dialogue navigateur natif     clean
frontend : diagnostics TypeScript locaux       aucun diagnostic hors résolution de modules sans node_modules

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

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

KSP_WALLETS_DIRECTORY=var/wallet-desk-pre009 \
  cargo tauri dev -c crates/ksp-app-wallet-desk/tauri.conf.json

Parcours runtime conseillé :

OWNER ouvert -> Details
alias Save puis Clear
Add note
Save note
Delete note via modal Bootstrap
Lock puis VIEW unlock -> metadata visible mais contrôles OWNER désactivés
Deselect/Lock -> projection protégée purgée

Canari de conflit recommandé : ouvrir OWNER, modifier/remplacer le fichier wallet par un état authentifié plus récent hors de ce handle, puis tenter une mutation. Le résultat attendu est wallet.state_conflict, purge de l'OWNER stale, retour Locked et nouvel unlock OWNER obligatoire.

Aucune commande npm directe n'est nécessaire. cargo tauri build -c crates/ksp-app-wallet-desk/tauri.conf.json reste réservé à pre.015 et doit rester la toute dernière opération de validation de la release.