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.mdest ramené à une ligne synthétique globale pour0.2.6et ne sera plus modifié à chaque prerelease ;CHANGELOG.mdreste inchangé et réservé à la clôture ;docs/plans/002-FUNCTIONAL_RELEASE_SEQUENCE.mdest 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.mdreste 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.