Files
khadhroony-solana-project/deltas/0.2.7/pre.006-fix.001.md

4.0 KiB

Delta 0.2.7-pre.006-fix.001 — synchronisation des canaris d'isolation WS + warning watch

1. Base requise

0.2.7-pre.006 appliqué
workspace.package.version = 0.2.7-pre.6

Le checkpoint opérateur de pre.006 a établi :

cargo fmt --all                         exécuté
python3 scripts/audit_rust_workspace_rules.py   clean
cargo check --workspace                réussi avec 1 warning
cargo clippy --workspace --all-targets réussi avec le même warning
cargo test -p ksp-onchain-transport-lib 273 réussis, 2 échoués

Les deux échecs concernent les canaris :

unknown remote subscription id -> session attendue Active
typed notification decode failure -> session attendue Active

2. Diagnostic

Les chemins runtime concernés dans handle_subscription_notification renvoient déjà WsActorIoOutcome::Continue :

  • un remote subscription ID inconnu ou stale est ignoré sans modifier la session ;
  • une erreur du decoder typed ferme uniquement la subscription locale en Failed.

Le Failed observé par les deux tests provenait ensuite du fixture serveur local : après l'envoi des notifications, la tâche serveur se terminait immédiatement et abandonnait le socket sans Close frame. Le contrat de session acquis classe correctement cette fin physique sans Close comme une défaillance de connexion.

Le test mélangeait donc deux événements distincts : l'anomalie logique à isoler et une déconnexion physique ultérieure.

3. Correctif des canaris

Les deux fixtures maintiennent désormais le peer local ouvert après l'anomalie et attendent une requête JSON-RPC témoin :

afterUnknownRemote
afterDecodeFailure

Le caller vérifie successivement :

  1. le résultat attendu de la notification ou de l'erreur typed ;
  2. l'état logique attendu de la subscription ;
  3. WsSessionState::Active ;
  4. la réussite d'une nouvelle requête JSON-RPC sur la même session physique.

Le serveur peut seulement terminer ensuite.

Cette synchronisation supprime la course du fixture et prouve plus fortement la propriété recherchée : la session reste réellement utilisable après une anomalie locale de subscription.

4. Warning state_rx

Le receiver initial créé uniquement pour construire le watch::Sender n'est pas consommé par l'actor. Le binding inutile :

state_rx

est supprimé. Le handle public continue à recevoir son propre watch::Receiver lors de l'ACK subscribe via state_tx.subscribe().

Aucune lifecycle state, API ou politique de notification n'est modifiée.

5. Signal technique

Le fix modifie du Rust et des tests. Conformément aux règles de version KSP :

livraison                 = 0.2.7-pre.006-fix.001
workspace.package.version = 0.2.7-pre.6.fix.1
commit                    = v0.2.7-pre.006-fix.001

Aucun tag prerelease.

6. Fichiers modifiés

Cargo.toml
crates/ksp-onchain-transport-lib/src/ws_session.rs
crates/ksp-onchain-transport-lib/unit_tests/ws_session.rs

7. Fichier ajouté

deltas/0.2.7/pre.006-fix.001.md

8. Fichiers supprimés

Aucun.

9. Invariants préservés

Le fix ne change pas :

  • WsSession ou WsSubscription<T> publics ;
  • les IDs locaux ou remote ;
  • le mapping remote vers local ;
  • les neuf familles standard ;
  • la capacité des channels ;
  • les règles unsubscribe ;
  • la classification d'une vraie perte physique comme Failed ;
  • les frontières de dépendances ;
  • la façade de logging KSP ;
  • le scope reconnect/resubscribe réservé à pre.007.

10. Validation sandbox

Le sandbox ne permet pas de revendiquer les gates Cargo opérateur. Les validations statiques disponibles sont exécutées sur le workspace reconstruit avec ce fix.

11. Validation opérateur attendue

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