v0.2.8-pre.009

This commit is contained in:
2026-08-23 18:16:03 +02:00
parent 7c12ec886b
commit 9c0d4fc197
10 changed files with 579 additions and 59 deletions

View File

@@ -1,9 +1,9 @@
<!-- file: docs/plans/015-V0_2_8_HELIUS_LASERSTREAM_WEBSOCKET_PLAN.md -->
<!-- version: 22 -->
<!-- version: 23 -->
# Plan `0.2.8` — Helius LaserStream WebSocket
> **Statut : `0.2.8-pre.007-fix.004` est validé intégralement par lopérateur : fmt/audit/check/Clippy, 331 unit Transport, 40 API, 29 completeness, 4 doctests et workspace complet verts. `0.2.8-pre.008` est préparé pour les guards adversariaux provider, limites/payload, isolation de session et redaction des diagnostics Helius.**
> **Statut : `0.2.8-pre.008` est validé intégralement par lopérateur : fmt/audit/check/Clippy, 335 unit Transport, 40 API, 30 completeness, 5 doctests et workspace complet verts. `0.2.8-pre.009` réconcilie la documentation Helius courante, ajoute `slotsUpdates` à la façade Helius et ferme les canaris de compliance HTTP/WS/Config/dependencies.**
## 1. Objet, base et état courant
@@ -77,9 +77,9 @@ pre.007 DONE — heartbeat Helius WebSocket/idle + timers + interaction reconne
fix.002 DONE — diagnostic de propagation scheduler établi
fix.003 DONE — canari heartbeat périodique stabilisé sans changer le runtime
fix.004 DONE — dependency-firewall aligné sur `io-util, net, rt, test-util`
pre.008 PREPARED — provider adversarial lifecycle + capability guards + payload/backpressure + security/redaction
pre.009 compliance Helius WebSocket + non-régressions Solana standard 18/18 + HTTP 52/14
+ Config/API/dependency-firewall canaries
pre.008 DONE — provider adversarial lifecycle + capability guards + payload/backpressure + security/redaction
pre.009 PREPARED — compliance Helius WebSocket + réconciliation documentaire `slotsUpdates`
+ non-régressions Solana standard 18/18 + HTTP 52/14 + Config/API/dependency-firewall canaries
pre.010 smoke Helius WebSocket live opt-in si stratégie sûre + README/USAGE
+ cargo tree direct/duplicates final
pre.011 validation workspace finale + fermeture plan/matrice/indexes + prompt 0.2.9
@@ -307,9 +307,9 @@ LaserStream gRPC = distinct, hors 0.2.8
### 5.3 Inventaire provider retenu
```text
standard supporté : account, logs, program, root, signature, slot
standard supporté : account, logs, program, root, signature, slot, slotsUpdates
Helius extension : transactionSubscribe / transactionUnsubscribe
non supporté : block, slotsUpdates, vote
non supporté : block, vote
```
`transactionUnsubscribe` est documenté dans la référence `transactionSubscribe` avec :
@@ -322,21 +322,24 @@ result = true
La référence précise que quelques notifications in-flight peuvent encore arriver après l'unsubscribe.
### 5.4 Divergence `slotsUpdatesSubscribe`
### 5.4 Réconciliation `slotsUpdatesSubscribe` au réaudit `pre.009`
Les sources Helius se contredisent :
La documentation Helius courante a évolué depuis `pre.001` :
- `websocket-methods` classe `slotsUpdatesSubscribe`/`slotsUpdatesUnsubscribe` parmi les méthodes unstable non supportées ;
- la page individuelle indique que la méthode est unstable et peut ne pas être supportée ;
- `websocket/llms.txt` la place aussi dans une section « Stable, Helius-supported ».
- l'overview LaserStream WebSocket affirme désormais supporter le jeu complet des méthodes standard et énumère explicitement `slotsUpdatesSubscribe` avec son unsubscribe ;
- la page spécifique `slotsUpdatesSubscribe` la documente comme unstable, avec endpoints mainnet/devnet, request, notification et subscription ID, sans mention « Helius does not support » ;
- la page spécifique `slotsUpdatesUnsubscribe` documente l'ID numérique et la réponse booléenne ;
- à l'inverse, les pages spécifiques `blockSubscribe` et `voteSubscribe` gardent explicitement « Helius does not support ».
Décision KSP :
Arbitrage KSP `pre.009` : la page spécifique de chaque méthode prévaut sur une formule globale lorsqu'elles divergent.
```text
HeliusLaserStreamWsSession n'expose pas SlotsUpdates
slotsUpdatesSubscribe / slotsUpdatesUnsubscribe = support Helius retenu, unstable
blockSubscribe / blockUnsubscribe = non supporté Helius
voteSubscribe / voteUnsubscribe = non supporté Helius
```
Une validation interne garde aussi un rejet avant I/O si un descriptor incompatible atteint le moteur par un chemin interne ou de compatibilité.
`HeliusLaserStreamWsSession` expose donc `slots_updates_subscribe()` à partir de `pre.009`, en réutilisant exactement le DTO, le wire, l'unsubscribe par handle, le warning unstable et l'actor standard existants. Aucun type provider-specific n'est créé pour cette famille.
### 5.5 `transactionSubscribe`
@@ -388,24 +391,24 @@ Les pages continuent à employer « enhanced/filtered accountSubscribe » sans p
## 6. Matrice normative Helius WebSocket
| Famille | Paire | Classe | Support Helius retenu | Surface publique Helius | Paramètres/options utiles | Notification | Stratégie KSP/test |
|---------------------|-----------------------------------------------------|------------------|-----------------------|-------------------------|------------------------------------|---------------------------|----------------------------------------------------|
| `account` | `accountSubscribe` / `accountUnsubscribe` | Solana standard | Oui | présente | contrat standard ; `notifyOn` omis | `accountNotification` | DTO/wire standard partagé |
| `block` | `blockSubscribe` / `blockUnsubscribe` | Solana unstable | **Non** | **absente** | aucune émission provider | théorique | façade Helius sans méthode + guard interne |
| `logs` | `logsSubscribe` / `logsUnsubscribe` | Solana standard | Oui | présente | contrat standard | `logsNotification` | DTO/wire standard partagé |
| `program` | `programSubscribe` / `programUnsubscribe` | Solana standard | Oui | présente | contrat standard ; `notifyOn` omis | `programNotification` | DTO/wire standard partagé |
| `root` | `rootSubscribe` / `rootUnsubscribe` | Solana standard | Oui | présente | aucun paramètre | `rootNotification` | wrapper partagé |
| `signature` | `signatureSubscribe` / `signatureUnsubscribe` | Solana standard | Oui | présente | one-shot conservé | `signatureNotification` | wrapper partagé + terminal close |
| `slot` | `slotSubscribe` / `slotUnsubscribe` | Solana standard | Oui | présente | aucun paramètre | `slotNotification` | wrapper partagé |
| `slotsUpdates` | `slotsUpdatesSubscribe` / `slotsUpdatesUnsubscribe` | Solana unstable | **Non** | **absente** | aucune émission provider | théorique | façade Helius sans méthode + divergence documentée |
| `vote` | `voteSubscribe` / `voteUnsubscribe` | Solana unstable | **Non** | **absente** | aucune émission provider | théorique | façade Helius sans méthode + guard interne |
| `heliusTransaction` | `transactionSubscribe` / `transactionUnsubscribe` | Helius extension | Oui | présente | filtres/options/`tokenAccounts` | `transactionNotification` | DTOs Helius + actor partagé |
| Famille | Paire | Classe | Support Helius retenu | Surface publique Helius | Paramètres/options utiles | Notification | Stratégie KSP/test |
|---------------------|-----------------------------------------------------|------------------|-----------------------|-------------------------|------------------------------------|----------------------------|----------------------------------------------|
| `account` | `accountSubscribe` / `accountUnsubscribe` | Solana standard | Oui | présente | contrat standard ; `notifyOn` omis | `accountNotification` | DTO/wire standard partagé |
| `block` | `blockSubscribe` / `blockUnsubscribe` | Solana unstable | **Non** | **absente** | aucune émission provider | théorique | façade Helius sans méthode + guard interne |
| `logs` | `logsSubscribe` / `logsUnsubscribe` | Solana standard | Oui | présente | contrat standard | `logsNotification` | DTO/wire standard partagé |
| `program` | `programSubscribe` / `programUnsubscribe` | Solana standard | Oui | présente | contrat standard ; `notifyOn` omis | `programNotification` | DTO/wire standard partagé |
| `root` | `rootSubscribe` / `rootUnsubscribe` | Solana standard | Oui | présente | aucun paramètre | `rootNotification` | wrapper partagé |
| `signature` | `signatureSubscribe` / `signatureUnsubscribe` | Solana standard | Oui | présente | one-shot conservé | `signatureNotification` | wrapper partagé + terminal close |
| `slot` | `slotSubscribe` / `slotUnsubscribe` | Solana standard | Oui | présente | aucun paramètre | `slotNotification` | wrapper partagé |
| `slotsUpdates` | `slotsUpdatesSubscribe` / `slotsUpdatesUnsubscribe` | Solana unstable | Oui | présente | aucun paramètre | `slotsUpdatesNotification` | DTO/wire standard partagé + warning unstable |
| `vote` | `voteSubscribe` / `voteUnsubscribe` | Solana unstable | **Non** | **absente** | aucune émission provider | théorique | façade Helius sans méthode + guard interne |
| `heliusTransaction` | `transactionSubscribe` / `transactionUnsubscribe` | Helius extension | Oui | présente | filtres/options/`tokenAccounts` | `transactionNotification` | DTOs Helius + actor partagé |
Statut :
```text
SolanaStandardWsSession : 9 familles / 18 opérations standard
HeliusLaserStreamWsSession : 6 familles standard supportées + 1 famille Helius
HeliusLaserStreamWsSession : 7 familles standard supportées + 1 famille Helius
```
La compliance standard KSP reste **18/18** pour `SolanaStandard`.
@@ -488,16 +491,16 @@ program
root
signature
slot
slotsUpdates
transaction
```
`pre.003` matérialise exactement les six familles standard ; `transaction` reste réservé aux tranches provider-specific ultérieures du forecast.
`pre.003` matérialisait les six familles standard alors retenues ; `pre.009` ajoute `slotsUpdates` après évolution de la documentation Helius, tandis que `transaction` reste la famille provider-specific.
La façade Helius **n'expose jamais dans le scope courant** :
La façade Helius **n'expose pas dans le scope courant** les deux familles dont les pages spécifiques Helius restent explicitement non supportées :
```text
block
slotsUpdates
vote
```
@@ -813,7 +816,7 @@ Prévoir :
```text
public API canary SolanaStandardWsSession
public API canary HeliusLaserStreamWsSession
Helius facade sans block/slotsUpdates/vote
Helius facade sans block/vote ; slotsUpdates présent et unstable
Solana facade sans transactionSubscribe
Helius facade sans escape hatch vers WsSession générique
WsSession historique standard toujours disponible
@@ -1396,3 +1399,65 @@ warnings 0
`pre.009` reste bloqué jusqu'au replay intégralement vert de `pre.008`.
## 21. Fermeture `pre.008` et préparation `pre.009`
Checkpoint opérateur `0.2.8-pre.8` reçu le 2026-08-23 :
```text
[x] cargo fmt --all
[x] python3 scripts/audit_rust_workspace_rules.py = clean / 0 candidate
[x] cargo check --workspace = vert, sans warning
[x] cargo clippy --workspace --all-targets = vert, sans warning
[x] Transport unit = 335/335
[x] Transport public API = 40/40
[x] release completeness = 30/30
[x] Transport doctests = 5/5
[x] cargo test --workspace = vert
```
Verdict : **`pre.008` DONE.**
Le réaudit final de conformité Helius révèle une évolution normative depuis `pre.001`. L'overview LaserStream WebSocket courant affirme désormais le support du jeu complet des méthodes standard. Les pages spécifiques permettent de résoudre la divergence sans extrapolation :
```text
blockSubscribe page spécifique = explicitement non supporté Helius
voteSubscribe page spécifique = explicitement non supporté Helius
slotsUpdatesSubscribe page spécifique = unstable, documenté sur endpoints Helius, sans interdiction provider
slotsUpdatesUnsubscribe = documenté avec subscriptionId + bool
```
Décision `pre.009` :
```text
Helius standard actuel retenu = account/logs/program/root/signature/slot/slotsUpdates
Helius extension = transaction
Helius absent = block/vote
SolanaStandard = 9 familles / 18 opérations inchangées
HTTP = 52 current + 14 historical inchangés
```
La tranche ajoute uniquement la façade Helius `slots_updates_subscribe()` en réutilisant `WsSubscriptionKind::SlotsUpdates`, `SolanaSlotUpdate`, le triplet wire standard et le lifecycle actor déjà existant. Elle retire le compile-fail Helius correspondant, conserve ceux de block/vote et garde le compile-fail inverse `SolanaStandard -X-> transactionSubscribe`.
Canaris de fermeture prévus :
```text
Transport unit 335
Transport public API 41
release completeness 33
Transport doctests 4
workspace vert
warnings 0
```
Les trois nouveaux canaris `release_completeness` verrouillent :
```text
1. HTTP 52/14 + Standard WebSocket 9 familles / 18 méthodes ;
2. Helius = 7 familles standard + transaction, avec block/vote toujours absents ;
3. Config -> Transport, KSP_SECRET_HELIUS_API_KEY et dependency firewall sans reverse dependency.
```
Aucune nouvelle dépendance, aucun nouveau DTO Helius pour `slotsUpdates`, aucun second socket/actor et aucune modification Config ne sont nécessaires. Le point « enhanced accountSubscribe » reste reporté : l'overview parle de filtres avancés, mais la page API spécifique ne publie toujours pas de wire provider-specific supplémentaire assez précis pour une API typed ; KSP ne devine donc aucun champ.
`pre.010` reste réservé au smoke Helius live opt-in si une stratégie credential-safe est disponible, à README/USAGE et au `cargo tree` final.