7.3 KiB
Delta v0.2.1-pre.004-fix.001
Base
Base attendue :
v0.2.1-pre.004
Version Cargo cible :
0.2.1-pre.4.fix.1
Objectif
Corriger la responsabilité Cargo des features externes révélée pendant l'audit de pre.004, sans modifier le comportement fonctionnel de la résilience HTTP :
- conserver au
Cargo.tomlracine la version et les options communes de résolution (default-features, etc.) ; - retirer les activations
features = [...]de[workspace.dependencies]; - activer chaque feature dans le manifeste de la crate KSP qui utilise réellement l'API correspondante ;
- distinguer lorsque c'est utile les features de production et celles requises uniquement par les tests ;
- formaliser explicitement cette règle sous
DEP-CARGO-*; - ajouter une canarie empêchant le retour d'une activation de feature consumer dans
[workspace.dependencies].
Ce fix ne modifie pas ROADMAP.md : il corrige un contrat Cargo et sa règle normative, pas la roadmap de 0.2.1.
Validation de pre.004 ayant précédé le fix
Après application de pre.004, le user a exécuté :
cargo fmt --all : exécuté
cargo check --workspace : OK
cargo clippy --workspace --all-targets : OK
cargo test -p ksp-onchain-transport-lib : OK, 72 tests Transport au total
cargo test --workspace : OK ; 1 test diagnostic ignoré comme prévu
cargo tree -p ksp-onchain-transport-lib -e features : exécuté
cargo tree -p ksp-onchain-transport-lib -e normal : exécuté
Le problème n'est donc pas un échec fonctionnel de pre.004. L'audit cargo tree -e features a cependant rendu visible que les features Tokio déclarées au niveau workspace s'appliquaient au graphe Transport en plus de sa feature locale sync, ce qui rendait l'ownership des besoins réels trop global.
Décision normative
La politique KSP retenue est désormais explicite :
[workspace.dependencies]
-> version
-> default-features et autres options communes de résolution
-> aucune activation features = [...]
crates/<consumer>/Cargo.toml
-> dependency.workspace = true
-> features = [...] nécessaires à ce consumer
Lorsqu'une feature n'est nécessaire qu'aux tests/benchmarks/examples, son activation appartient à la section de dépendances de développement correspondante.
Cette politique conserve la centralisation des versions sans transformer le feature-set d'une crate en politique implicite pour tous les autres consumers du workspace.
Répartition des features
serde
Le root conserve uniquement :
serde = { version = "^1.0" }
La feature derive est activée dans les trois crates qui utilisent réellement serde::Serialize / serde::Deserialize dérivés :
ksp-app-config-desk
ksp-config-lib
ksp-onchain-transport-lib
reqwest
Le root conserve :
reqwest = { version = "^0.13", default-features = false }
ksp-onchain-transport-lib active localement :
rustls
tracing / tracing-subscriber
Le root conserve les versions avec default-features = false.
Seul ksp-logging-lib, propriétaire KSP de ces dépendances, active :
tracing : std
tracing-subscriber : fmt, json, ansi
tracing-appender ne possédait aucune feature explicite à déplacer.
chrono
Le root conserve uniquement la version avec default-features = false.
ksp-app-config-desk, seul consumer direct actuel de chrono::Utc::now, active localement :
std, now
tokio
Le root devient :
tokio = { version = "^1.53", default-features = false }
Les activations sont réparties selon l'usage réel :
ksp-app-config-desk
dependencies : time
ksp-logging-lib
dev-dependencies : macros, rt, rt-multi-thread
ksp-onchain-transport-lib
dependencies : macros, sync, time
dev-dependencies : rt
Pour Transport :
synccouvreNotify,SemaphoreetOwnedSemaphorePermit;timecouvresleep_until/Instant;macrosest une dépendance de production carpool.rsutilisetokio::select!;rtest requis par#[tokio::test]et reste donc activé uniquement côté développement ;- aucun besoin Transport actuel ne justifie
rt-multi-thread.
Règles KSP
docs/rules/RULES_DEPENDENCIES.md passe de la version 11 à 12.
DEP-CARGO-003 précise maintenant que les features d'usage ne sont pas activées sous [workspace.dependencies] et appartiennent aux manifests consumers.
Nouvelle règle DEP-CARGO-006 : une feature requise uniquement par tests/benchmarks/examples doit être activée dans la section de dépendances de développement appropriée ; l'unification Cargo ne transfère pas cet ownership au root.
Canarie Cargo
crates/ksp-onchain-transport-lib/tests/dependency_boundary.rs vérifie désormais aussi :
- le feature-set direct attendu de
reqwestettokiopour Transport ; - la séparation du
tokio/rtde test sous[dev-dependencies]; - l'absence de toute chaîne
features =dans la section[workspace.dependencies]du manifeste racine.
Cette canarie complète le firewall Transport existant sans introduire de nouvelle dépendance d'audit.
Version Cargo
Le fix modifie plusieurs manifests et donc le contrat de build :
0.2.1-pre.4 -> 0.2.1-pre.4.fix.1
Toutes les crates KSP continuent d'hériter version.workspace = true.
Fichiers ajoutés
deltas/0.2.1/pre.004-fix.001.md
Fichiers modifiés
Cargo.toml
crates/ksp-app-config-desk/Cargo.toml
crates/ksp-config-lib/Cargo.toml
crates/ksp-logging-lib/Cargo.toml
crates/ksp-onchain-transport-lib/Cargo.toml
crates/ksp-onchain-transport-lib/tests/dependency_boundary.rs
docs/rules/RULES_DEPENDENCIES.md
Fichiers supprimés
Aucun.
Graphe de dépendances
Aucune crate externe n'est ajoutée ou retirée. Le fix modifie en revanche volontairement les feature-sets directs par consumer ; les audits Cargo doivent donc être rejoués après application.
Pour Transport, vérifier au minimum :
cargo tree -p ksp-onchain-transport-lib
cargo tree -p ksp-onchain-transport-lib -d
cargo tree -p ksp-onchain-transport-lib -e features
cargo tree -p ksp-onchain-transport-lib -e normal
Il est également utile de vérifier les consumers dont les features ont été relocalisées :
cargo tree -p ksp-app-config-desk -e features
cargo tree -p ksp-config-lib -e features
cargo tree -p ksp-logging-lib -e features
Validation du fix
Le sandbox de préparation ne dispose pas de cargo/rustc. Les validations Rust du correctif ne sont donc pas déclarées réussies ici.
Après application :
cargo fmt --all
cargo check --workspace
cargo clippy --workspace --all-targets
cargo test -p ksp-onchain-transport-lib
cargo test --workspace
Puis exécuter les cargo tree indiqués ci-dessus afin de confirmer que chaque crate expose uniquement les features directes qu'elle possède, sous réserve de l'unification transitive normale de Cargo au niveau du build effectif.
Suite
Après validation et commit de ce fix, 0.2.1 reprend avec :
v0.2.1-pre.005
Le périmètre fonctionnel prévu de pre.005 reste inchangé : exécuteur HTTP JSON-RPC réel et quatre méthodes canari typées.