Files
khadhroony-solana-project/deltas/0.2.5/pre.010-fix.001.md

12 KiB

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 :

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 :

workspace.package.version = 0.2.5-pre.10.fix.1

Identifiant de livraison :

0.2.5-pre.010-fix.001

Commit attendu après validation :

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 :

ed25519-dalek = { version = "^3.0", default-features = false }

Le manifest Wallet conserve les features locales réellement consommées :

ed25519-dalek = { workspace = true, features = ["signature", "zeroize"] }

Le réaudit primaire effectué pendant la préparation confirme pour ed25519-dalek 3.0.0 :

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 :

ed25519-dalek ^2.1.1

Le tree attendu après ce fix comporte donc deux générations Dalek légitimes :

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 :

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 :

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 :

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 :

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 :

python3 scripts/audit_rust_workspace_rules.py

Le wrapper exécute :

general Rust structural audit
crate-root/export completeness audit
KSP workspace boundary audit

Le mode diagnostic existe également :

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é :

pub extern crate tracing as __private_tracing

est remplacé par un bridge macro caché sous son nom canonique :

#[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 :

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 :

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 :

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 :

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

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 :

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 :

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 :

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 :

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