diff --git a/Cargo.toml b/Cargo.toml index 83308b4..0638db8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,12 +1,12 @@ # file: Cargo.toml -# version: 203 +# version: 204 [workspace] resolver = "3" members = ["crates/ksp-app-config-desk", "crates/ksp-app-wallet-desk", "crates/ksp-config-lib", "crates/ksp-core-lib", "crates/ksp-logging-lib", "crates/ksp-onchain-transport-lib", "crates/ksp-wallet-lib"] [workspace.package] -version = "0.2.7-pre.8" +version = "0.2.7-pre.8.fix.1" edition = "2024" license = "MIT" repository = "https://git.sasedev.com/Sasedev/khadhroony-solana-project" diff --git a/crates/ksp-onchain-transport-lib/src/ws_session.rs b/crates/ksp-onchain-transport-lib/src/ws_session.rs index a221421..3b34b58 100644 --- a/crates/ksp-onchain-transport-lib/src/ws_session.rs +++ b/crates/ksp-onchain-transport-lib/src/ws_session.rs @@ -1,5 +1,5 @@ // file: crates/ksp-onchain-transport-lib/src/ws_session.rs -// version: 8 +// version: 9 use futures_util::SinkExt; // rust-rules: trait-import use futures_util::StreamExt; // rust-rules: trait-import @@ -1048,6 +1048,7 @@ fn prepare_subscriptions_for_reconnect( remote_to_local: &mut std::collections::BTreeMap, failure_code: ksp_core_lib::ErrorCode, ) { + let terminal_failure_code = if policy == crate::WsResubscribePolicy::Never { crate::ERROR_CODE_WS_CONNECTION_FAILED } else { failure_code }; remote_to_local.clear(); let mut failed = std::vec::Vec::new(); let mut already_terminal = std::vec::Vec::new(); @@ -1066,7 +1067,7 @@ fn prepare_subscriptions_for_reconnect( } } for subscription_id in failed { - fail_local_subscription(subscriptions, remote_to_local, subscription_id, failure_code); + fail_local_subscription(subscriptions, remote_to_local, subscription_id, terminal_failure_code); } for subscription_id in already_terminal { subscriptions.remove(&subscription_id.get()); diff --git a/deltas/0.2.7/pre.008-fix.001.md b/deltas/0.2.7/pre.008-fix.001.md new file mode 100644 index 0000000..c5de645 --- /dev/null +++ b/deltas/0.2.7/pre.008-fix.001.md @@ -0,0 +1,63 @@ + + + +# Delta `0.2.7-pre.008-fix.001` — normalisation de la cause terminale avec resubscribe `Never` + +## Base + +Base directe publiée puis validée partiellement par l'opérateur : + +```text +0.2.7-pre.008 +Cargo 0.2.7-pre.8 +``` + +Le checkpoint opérateur a confirmé `cargo fmt --all`, l'audit Python KSP, `cargo check --workspace` et `cargo clippy --workspace --all-targets`. Le test Transport a exécuté 287 tests avec 286 succès et un échec : `websocket_resubscribe_never_keeps_session_but_fails_logical_subscription`. + +## Signal technique + +```text +livraison = 0.2.7-pre.008-fix.001 +workspace.package.version = 0.2.7-pre.8.fix.1 +commit = v0.2.7-pre.008-fix.001 +``` + +Aucun tag Git n'est requis pour ce fix de prerelease. + +## Diagnostic + +`pre.008` a rendu la cause terminale sûre observable sur `WsSubscription`. Le contrat de validation retenu pour `WsResubscribePolicy::Never` est que toute subscription active invalidée par une rupture physique devient terminale avec `ws_connection_failed`, car la policy interdit sa restauration après perte de continuité. + +Le runtime transmettait directement à `prepare_subscriptions_for_reconnect` le code causal de la rupture. Dans le fixture concerné, le serveur abandonne le WebSocket sans Close frame ; Tungstenite classe cette rupture dans le chemin protocolaire, donc `ws_protocol_error` était publié sur le handle alors que la policy `Never` exige `ws_connection_failed`. + +## Correction + +`prepare_subscriptions_for_reconnect` distingue désormais : + +- `ActiveSubscriptions` : conservation du code causal reçu pour les subscriptions non restaurables dans leur état courant ; +- `Never` : normalisation de la cause terminale des subscriptions à `ERROR_CODE_WS_CONNECTION_FAILED`. + +La classification de la rupture physique, le budget de reconnect, les logs de session, `continuity_gap_count`, les remote IDs et le comportement `ActiveSubscriptions` ne sont pas modifiés. + +Le canari existant n'est pas affaibli : il conserve l'attente `ws_connection_failed` et vérifie donc directement la correction runtime. + +## Fichiers + +```text +Cargo.toml +crates/ksp-onchain-transport-lib/src/ws_session.rs +deltas/0.2.7/pre.008-fix.001.md +``` + +## Validation attendue + +```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 --workspace +``` + +Les validations Cargo doivent être exécutées par l'opérateur ; elles ne sont pas revendiquées depuis l'environnement de préparation du delta.