Files
khadhroony-solana-project/deltas/0.2.9/pre.002-fix.001.md

106 lines
3.6 KiB
Markdown

<!-- file: deltas/0.2.9/pre.002-fix.001.md -->
<!-- version: 1 -->
# 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.