# Delta `0.2.9-pre.002-fix.001` — Clippy + runtime Tokio du channel lazy ## 1. Déclencheur Le premier gate opérateur de `pre.002` a fourni les preuves suivantes : ```text cargo fmt --all PASS audit_rust_workspace_rules.py PASS / clean cargo check --workspace PASS avec warning channel dead_code cargo clippy --workspace --all-targets FAIL implicit_return dans grpc_settings test cargo test -p ksp-onchain-transport-lib FAIL 344/345 : connect_lazy hors runtime Tokio cargo test -p ksp-core-lib --test workspace_dependencies PASS 3/3 cargo tree Transport / duplicates fournis et inspectés ``` Le test gRPC a révélé que `tonic::transport::Endpoint::connect_lazy()` nécessite un reactor Tokio actif et peut paniquer s'il est appelé depuis un contexte synchrone sans runtime. Ce comportement doit être borné dans la surface KSP au lieu d'être laissé comme précondition implicite Tonic. ## 2. Corrections ### Clippy La closure qui génère l'inventaire d'endpoints excessif dans `unit_tests/grpc_settings.rs` utilise désormais un `return` explicite, conformément à `clippy::implicit_return = deny`. ### Runtime Tokio `YellowstoneGrpcChannel::prepare()` vérifie maintenant : ```text tokio::runtime::Handle::try_current() ``` avant l'appel à `connect_lazy()`. En l'absence de runtime actif, KSP retourne : ```text onchain_transport/grpc_channel_failed ``` avec uniquement `endpoint_name` comme contexte sûr. L'URL et le message interne Tonic ne sont pas réémis. Le test positif devient un `#[tokio::test(flavor = "current_thread")]`. Un nouveau test synchrone prouve que l'absence de runtime est retournée comme erreur sans exposer l'URL canari. ### Champ Tonic Le channel **reste un champ de production**. Il n'est pas placé sous `#[cfg(test)]`, car `pre.002` matérialise réellement la ressource physique N1 qui sera consommée en `pre.003`. Le champ privé est temporairement nommé : ```text _channel: tonic::transport::Channel ``` pour exprimer qu'il est intentionnellement conservé mais pas encore consommé par une opération de production dans cette tranche. Cela supprime le warning `dead_code` sans modifier la shape production/test. ## 3. Graphe Cargo observé Le gate opérateur confirme : ```text tonic 0.14.6 yellowstone-grpc-proto 12.6.0 prost/prost-types 0.14.4 solana-pubkey 4.3.0 unifié http 1.5.0 hyper 1.11.0 hyper-util 0.1.20 tower 0.5.3 bytes 1.12.1 ``` Les occurrences Prost 0.14.4 dans `--duplicates` viennent des unités runtime/build (`prost-build`, `tonic-prost-build`) de la même version ; aucune seconde version concurrente n'est introduite. ## 4. Version Le fix touche le code/runtime ; la version workspace devient : ```text 0.2.9-pre.2.fix.1 ``` Commit attendu après validation : ```text v0.2.9-pre.002-fix.001 ``` ## 5. Validation requise ```bash cargo fmt --all python3 scripts/audit_rust_workspace_rules.py cargo check --workspace cargo clippy --workspace --all-targets cargo test -p ksp-onchain-transport-lib cargo test -p ksp-core-lib --test workspace_dependencies cargo test --workspace cargo tree -p ksp-onchain-transport-lib cargo tree -p ksp-onchain-transport-lib --duplicates cargo tree --duplicates ``` Le passage à `pre.003` est interdit tant que ces gates ne sont pas verts ou qu'un nouvel écart n'est pas traité par un fix supplémentaire.