388 lines
12 KiB
Markdown
388 lines
12 KiB
Markdown
<!-- file: deltas/0.2.5/pre.010-fix.001.md -->
|
|
<!-- version: 1 -->
|
|
|
|
# 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
|
|
```
|