# Delta `0.2.5-pre.010-fix.001` — Dalek 3 + normalisation Rust workspace + prompt `0.2.6` ## 1. Base et statut Base opérateur autoritaire : ```text 0.2.5-pre.010 archive complète modifiée fournie par l'opérateur le 2026-08-20 workspace.package.version = 0.2.5-pre.9 ``` `pre.010` n'est **pas** suivi directement de `rel.001`. Ce fix rouvre volontairement le gate technique avant toute publication stable. Version technique cible : ```text workspace.package.version = 0.2.5-pre.10.fix.1 ``` Identifiant de livraison : ```text 0.2.5-pre.010-fix.001 ``` Commit attendu après validation : ```text v0.2.5-pre.010-fix.001 ``` Aucun tag stable n'est créé par ce fix. ## 2. Objectifs Ce fix corrige trois écarts distincts avant la stable : 1. mettre la dépendance KSP directe `ed25519-dalek` sur la génération stable `3.0` ; 2. normaliser **tout le workspace Rust actuel**, pas seulement `ksp-wallet-lib`, selon les conventions KSP qui ne sont pas couvertes par `rustfmt`/Clippy ; 3. renforcer le prompt d'ouverture `0.2.6` afin qu'une nouvelle session récupère de manière autonome les règles, le gate `pre.001`, le forecast souple et le workflow de validation sans dépendre d'une mémoire implicite. Ce fix ne modifie pas le wire `.kspwallet` V1, les algorithmes cryptographiques retenus, les tailles/paramètres sérialisés ni le threat model Wallet. ## 3. `ed25519-dalek 3.0.0` La dépendance workspace KSP devient : ```toml ed25519-dalek = { version = "^3.0", default-features = false } ``` Le manifest Wallet conserve les features locales réellement consommées : ```toml ed25519-dalek = { workspace = true, features = ["signature", "zeroize"] } ``` Le réaudit primaire effectué pendant la préparation confirme pour `ed25519-dalek 3.0.0` : ```text release 2026-07-06 Rust edition 2024 MSRV 1.85 signature feature explicite disponible zeroize feature explicite disponible SigningKey API actuelle VerifyingKey API actuelle Signer trait actuel Signature API actuelle ``` `ksp-wallet-lib` n'utilise pas les features par défaut ; il conserve donc uniquement `signature` + `zeroize`, sans activer `fast` implicitement. ### Coexistence Dalek 3.x / 2.x `solana-keypair 3.1.2` dépend encore officiellement de : ```text ed25519-dalek ^2.1.1 ``` Le tree attendu après ce fix comporte donc **deux générations Dalek légitimes** : ```text ed25519-dalek 3.0.0 <- dépendance KSP directe de ksp-wallet-lib ed25519-dalek 2.2.x <- solana-keypair 3.1.2 <- ksp-wallet-lib ``` Il ne faut pas forcer leur unification en contournant les contraintes upstream. La convergence `solana-address` reste à confirmer par le tree opérateur. ## 4. Normalisation Rust workspace-wide La base opérateur a été auditée avec le nouvel outil en mode report-only avant normalisation. Résultat initial : ```text General Rust rule audit: 552 violation(s) RUST-DOC-101: 130 RUST-DOC-102: 79 RUST-FMT-101: 150 RUST-FMT-102: 8 RUST-FMT-104: 58 RUST-FMT-105: 49 RUST-FMT-106: 1 RUST-FMT-107: 47 RUST-IMPORT-101: 29 RUST-IMPORT-104: 1 Rust export completeness audit: 50 candidate(s) RUST-API-201: 38 RUST-IMPORT-201: 12 KSP workspace Rust rule audit: clean ``` Après normalisation de l'arbre cible : ```text General Rust rule audit: clean Rust export completeness audit: 0 candidate(s) KSP workspace Rust rule audit: clean ``` ### Conventions désormais normalisées Le fix applique notamment : ```text use uniquement pour traits réellement nécessaires marqueur canonique : // rust-rules: trait-import aucun grouped import aucun glob import aucun alias use ... as ... aucun extern crate ... as ... use uniquement en tête de module, jamais dans une fonction/test pub/pub(crate) partagé -> réexport crate-root usage interne partagé -> crate::Item super::Item réservé à un item strictement privé du parent dans un test séparé pas de crate::module::Item pour un item visible et réexporté rustdoc utile sur pub et pub(crate), champs/méthodes/reexports compris pas de ligne vide à l'intérieur d'un corps fonction/méthode/struct/enum blocs const ordonnés par visibilité puis nom lorsque l'ordre n'est pas sémantique reexports pub puis pub(crate), ordonnés avec leur rustdoc/attributs modules production avant modules test et ordre alphabétique lorsque possible ``` Les règles contextuelles qui ne peuvent pas être prouvées mécaniquement sans parser sémantique restent une responsabilité de revue humaine ; le script ne prétend pas remplacer `rustfmt`, Clippy, le compilateur ou les tests. ## 5. Nouveaux audits Python Ajouts stdlib-only : ```text scripts/audit_rust_general_rules.py scripts/audit_rust_export_completeness.py scripts/audit_ksp_workspace_rules.py scripts/audit_rust_workspace_rules.py ``` Commande canonique : ```bash python3 scripts/audit_rust_workspace_rules.py ``` Le wrapper exécute : ```text general Rust structural audit crate-root/export completeness audit KSP workspace boundary audit ``` Le mode diagnostic existe également : ```bash python3 scripts/audit_rust_workspace_rules.py --report-only ``` L'outil est volontairement un **audit**, pas un auto-formatter : les corrections restent explicites et reviewables. ## 6. Règles versionnées renforcées ### `docs/rules/RULES_RUST.md` Formalise désormais les conventions qui étaient encore implicites ou incomplètement contrôlées : - imports de traits seulement et marqueur canonique ; - interdiction grouped/glob/alias et `extern crate ... as ...` ; - imports au niveau module ; - chemins internes les plus courts via crate-root ; - `super::` seulement pour les privés ; - complétude des réexports `pub(crate)` ; - rustdoc sur toute visibilité KSP ; - ordre/espacement des blocs ; - validation Python obligatoire. ### `docs/rules/RULES_KSP.md` Le workflow technique standard intègre l'audit Rust structurel après `cargo fmt` et avant compilation/Clippy. ### `docs/rules/PROMPT_STRUCTURE.md` Un prompt de démarrage devient explicitement un **contrat opératoire autonome** avec : - base exacte ; - ordre de lecture obligatoire ; - sources externes fraîches lorsque nécessaire ; - première mission `pre.001` ; - forecast souple visible ; - version/delta/validation ; - instruction d'ouverture ; - interdiction de déclarer réussie une commande non exécutée. ## 7. Normalisation des façades et chemins internes ### `ksp-logging-lib` L'ancien alias caché : ```text pub extern crate tracing as __private_tracing ``` est remplacé par un bridge macro caché sous son nom canonique : ```text #[doc(hidden)] pub extern crate tracing ``` Les macros utilisent `$crate::tracing`. Le bridge reste réservé à l'hygiène des macros KSP et n'est pas une API autorisée aux autres crates ; l'audit KSP interdit `ksp_logging_lib::tracing::` côté consumer. ### `ksp-app-config-desk` Les collisions de noms de réexports crate-root ont été résolues en renommant les **déclarations propriétaires**, pas par des alias de façade. Exemples : ```text documents::inventory -> document_inventory documents::detail -> document_detail environment::report -> environment_report logging_editor::document -> logging_document logging_runtime::status -> logging_runtime_status profiles::inventory -> profile_inventory profiles::detail -> profile_detail secrets::reveal -> reveal_secret ``` Les wrappers `#[tauri::command]` gardent leurs noms externes ; le contrat frontend Tauri n'est donc pas volontairement renommé. ### Autres crates Les items `pub(crate)` réellement partagés sont réexportés par la racine de leur crate et leurs consumers utilisent `crate::Item`. Les tests séparés n'emploient plus `super::` pour des items visibles. ## 8. Prompt `0.2.6` renforcé `prompts/011-V0_2_6_START_PROMPT.md` est réécrit comme prompt autonome de nouvelle session en reprenant les points qui étaient plus robustes dans les premiers prompts KSP et les workflows bot3 : ```text base stable et priorité des sources de vérité ordre de lecture obligatoire première mission pre.001 audit/brainstorming/sizing avant UI lourde baseline Rust + audit Python avant modification forecast souple explicite et non contraignant frontières Config/Wallet/Transport/Logging/Tauri sécurité passwords/secrets/frontend workflow Cargo/delta/fix/commit/tag validation Tauri finale seulement en dernier instruction d'ouverture explicite ``` Forecast initial exposé dès l'ouverture : ```text pre.001 audit/sizing/UX/Config/bridge/security pre.002 crate Tauri + frontend shell + logging + splash/main pre.003 std.wallet + composite Wallet Desk + adapters Config pre.004 inventory/selection + locked inspection + DTOs pre.005 create/import + unlock VIEW/OWNER + lifecycle pre.006 wallet details + balance HTTP + refresh/diagnostics pre.007 metadata administration + rotations VIEW/OWNER pre.008 strong VIEW disable/recreate + export OWNER + security UX pre.009 integration tests + Devnet smoke + compliance/security review pre.010 README/USAGE/build final + prompt suivant si nécessaire rel.001 publication stable ``` Le prompt précise que ce forecast est ajustable et que la complétude prime toujours sur le numéro de prerelease. ## 9. Portée des fichiers Rust La normalisation touche **83 fichiers Rust** dans les six crates actuelles : ```text ksp-app-config-desk 19 fichiers ksp-config-lib 11 fichiers ksp-core-lib 2 fichiers ksp-logging-lib 9 fichiers ksp-onchain-transport-lib 18 fichiers ksp-wallet-lib 24 fichiers ``` Chaque fichier Rust existant modifié consomme exactement une nouvelle version de fichier par rapport à la base opérateur fournie. ## 10. Documentation durable modifiée ```text ROADMAP.md docs/formats/KSPWALLET_V1.md docs/plans/012-V0_2_5_WALLET_FOUNDATION_PLAN.md docs/rules/PROMPT_STRUCTURE.md docs/rules/RULES_KSP.md docs/rules/RULES_RUST.md docs/validation/008-V0_2_5_WALLET_SECURITY_COMPLIANCE.md prompts/011-V0_2_6_START_PROMPT.md ``` Le plan et la matrice de validation enregistrent explicitement que `pre.010-fix.001` bloque `rel.001` tant que la validation opérateur n'est pas propre. ## 11. Contrôles réellement exécutés dans l'environnement de préparation L'environnement de préparation ne possède ni `cargo` ni `rustc`. Aucune compilation Rust n'est donc revendiquée. Contrôles réellement exécutés : ```text nouvel audit sur base opérateur en report-only -> 552 violations / 50 candidates nouvel audit sur arbre cible -> clean / 0 candidate / clean versions des 83 fichiers Rust modifiés -> +1 exact réaudit primaire ed25519-dalek 3.0.0 -> effectué réaudit primaire solana-keypair 3.1.2 -> effectué ``` Les APIs Dalek employées par Wallet (`SigningKey`, `VerifyingKey`, `Signer`, `Signature`) existent dans la documentation `3.0.0`, mais seule la compilation opérateur peut valider définitivement l'intégration du workspace réel. ## 12. Validation opérateur obligatoire Après overlay : ```bash cargo fmt --all python3 scripts/audit_rust_workspace_rules.py cargo check --workspace cargo clippy --workspace --all-targets cargo test -p ksp-wallet-lib cargo test --workspace cargo tree -p ksp-wallet-lib cargo tree -p ksp-wallet-lib -d cargo tree -i ed25519-dalek@3.0.0 cargo tree -i ed25519-dalek@2.2.0 cargo tree -i solana-keypair@3.1.2 cargo tree -i solana-address@2.7.0 ``` Critères : ```text aucun warning KSP nouvel audit Python clean aucune régression tests Dalek 3.0.0 direct depuis Wallet Dalek 2.2.x uniquement via solana-keypair 3.1.2 si l'upstream reste inchangé solana-keypair parent KSP direct = Wallet frontières Config/Transport/Logging/Solana inchangées ``` Si une validation échoue, produire `pre.010-fix.002` au lieu de passer à `rel.001`. ## 13. Suite `rel.001` reste **bloqué** jusqu'à validation complète de ce fix. Après validation seulement : ```text 0.2.5-rel.001 -> workspace.package.version = 0.2.5 -> validation finale -> tag stable v0.2.5 -> ouverture 0.2.6 via prompts/011-V0_2_6_START_PROMPT.md ```