v0.2.9-pre.005-fix.001

This commit is contained in:
2026-08-24 12:53:15 +02:00
parent dca0a4b809
commit 15e3402e1c
5 changed files with 151 additions and 47 deletions

View File

@@ -1,9 +1,9 @@
<!-- file: docs/plans/016-V0_2_9_YELLOWSTONE_GRPC_PLAN.md -->
<!-- version: 12 -->
<!-- version: 13 -->
# Plan `0.2.9` — moteur Yellowstone gRPC + standard Solana + PublicNode
> **Statut : `0.2.9-pre.004-fix.001` est fermée sur gate opérateur sans warning : fmt/audit/check/Clippy/workspace PASS, Transport 359 unit + 44 public API + 37 completeness + 4 doctests. `0.2.9-pre.005` est candidate et complète uniquement les familles Yellowstone standard Accounts + Slots : filtres request complets, Cuckoo standard, memcmp bytes/base58/base64, predicates datasize/token-state/lamports, options Slots et DTOs/decode Account/Slot. Les conversions wire/decode restent test-only tant que le stream bidi n'est pas ouvert en `pre.008`. Transactions/Blocks, PublicNode et Config V3 restent hors tranche. `0.2.9` reste bornée à un moteur client Yellowstone partagé, une façade Solana Yellowstone standard et une première intégration concrète PublicNode. Seuls OrbitFlare puis Helius LaserStream gRPC sont actuellement planifiés comme releases provider suivantes ; les autres providers restent en TODO/IDEAS sans numéro réservé. Chaque prerelease vise 1520 minutes de travail effectif et la release complète doit rester clôturable dans une seule session de chat.**
> **Statut : `0.2.9-pre.004-fix.001` est fermée sur gate opérateur sans warning : fmt/audit/check/Clippy/workspace PASS, Transport 359 unit + 44 public API + 37 completeness + 4 doctests. `0.2.9-pre.005` est fonctionnellement verte sur le gate opérateur (364 unit + 45 public API + 38 completeness + workspace PASS) mais nécessite `pre.005-fix.001` pour supprimer quatre warnings `dead_code` test-only et deux diagnostics Clippy de forme dans `grpc_subscribe.rs`. Le fix ne change ni le contrat Accounts/Slots ni le wire. Transactions/Blocks, PublicNode et Config V3 restent hors tranche. `0.2.9` reste bornée à un moteur client Yellowstone partagé, une façade Solana Yellowstone standard et une première intégration concrète PublicNode. Seuls OrbitFlare puis Helius LaserStream gRPC sont actuellement planifiés comme releases provider suivantes ; les autres providers restent en TODO/IDEAS sans numéro réservé. Chaque prerelease vise 1520 minutes de travail effectif et la release complète doit rester clôturable dans une seule session de chat.**
## 1. Objet, base et état d'ouverture
@@ -1170,3 +1170,19 @@ Le gate `pre.001-fix.002` reprend la logique WebSocket : moteur/standard d'abord
Les autres providers Yellowstone — eRPC, Triton, Alchemy, QuickNode, Chainstack, Tatum, Shyft, Solinfra, NodeFlare et autres — restent en **TODO/IDEAS non numérotés**. Ils ne doivent pas déplacer la séquence active tant qu'une décision explicite d'implémentation n'est pas prise.
Pour toute intégration provider future, la règle reste : N1 n'est jamais dupliqué ; N2 est réutilisé seulement là où le provider est réellement compatible ; N3 exprime explicitement les restrictions, overrides et extensions.
### 19.5 `pre.005-fix.001` — hygiène warning/Clippy et format documentaire
Le premier gate opérateur de `pre.005` confirme la surface fonctionnelle : 364/364 unit, 45/45 public API, 38/38 release-completeness et workspace complet PASS. Les seuls écarts sont quatre constantes utilisées uniquement par les décodeurs `#[cfg(test)]`, une convention `to_wire(&self)` sur un type `Copy`, et une closure `is_some_and` soumise à `-D clippy::implicit-return`.
| Correction | Traitement | Impact runtime |
|-------------------------------------------|-------------------------------------------------|-------------------------|
| quatre constantes de bounds update | `#[cfg(test)]` | aucun avant `pre.008` |
| `YellowstoneSubscribeSlotFilter::to_wire` | receiver `self` | aucun, helper test-only |
| closure `dead_error.is_some_and` | `return` explicite | aucun |
| tableaux `016` et `012` | réalignement systématique des colonnes Markdown | documentaire uniquement |
Le réalignement documentaire conserve le contenu des cellules et ne modifie que les espaces de padding et les séparateurs de tableaux.
**Verdict `pre.005-fix.001` : correctif minimal prêt ; `pre.005` reste ouverte jusqu'à réexécution sans warning de check/Clippy/workspace.**

View File

@@ -1,9 +1,9 @@
<!-- file: docs/validation/012-V0_2_9_YELLOWSTONE_GRPC.md -->
<!-- version: 14 -->
<!-- version: 15 -->
# Validation `0.2.9` — moteur Yellowstone + standard Solana + PublicNode
> **Statut : `pre.004-fix.001` est fermé sur gate opérateur intégralement vert et sans les 10 warnings `dead_code` précédents : fmt/audit/check/Clippy/workspace PASS, Transport 359 unit + 44 public API + 37 completeness + 4 doctests. `0.2.9-pre.005` est candidate et complète uniquement Accounts + Slots du `Subscribe` standard : filtres request courants complets, Cuckoo standard, memcmp/predicates, options Slots, DTOs Account/Slot et décodage exact/malformed sous fixture. Aucun stream bidi n'est encore ouvert ; Transactions/Blocks restent `pre.006007`, puis lifecycle en `pre.008`. PublicNode et Config V3 restent hors tranche. OrbitFlare et Helius sont les seules releases provider suivantes planifiées ; les autres providers restent en TODO/IDEAS sans numéro réservé.**
> **Statut : `pre.004-fix.001` est fermé sur gate opérateur intégralement vert et sans les 10 warnings `dead_code` précédents : fmt/audit/check/Clippy/workspace PASS, Transport 359 unit + 44 public API + 37 completeness + 4 doctests. `0.2.9-pre.005` est fonctionnellement verte (364 unit + 45 public API + 38 completeness + workspace PASS) mais nécessite `pre.005-fix.001` : quatre warnings `dead_code` provenant de constantes utilisées seulement par les décodeurs test-only, un warning `wrong_self_convention` et un `implicit_return` Clippy. Aucun stream bidi n'est encore ouvert ; Transactions/Blocks restent `pre.006007`, puis lifecycle en `pre.008`. PublicNode et Config V3 restent hors tranche. OrbitFlare et Helius sont les seules releases provider suivantes planifiées ; les autres providers restent en TODO/IDEAS sans numéro réservé.**
## 1. Autorités du gate
@@ -196,7 +196,7 @@ Preuve cible : fixtures issues du wire Protobuf + cas old/current + malformed/ov
## 7. Unary RPC matrix
| RPC | Request exact | Response exact | État |
| ---------------- | ------------------------- | --------------------------- | --------- |
|------------------|---------------------------|-----------------------------|-----------|
| ReplayInfo | empty | `first_available?` | CANDIDATE |
| Ping | `count` | `count` | CANDIDATE |
| LatestBlockhash | `commitment?` | slot/hash/last_valid_height | CANDIDATE |
@@ -208,7 +208,7 @@ Preuve cible : fixtures issues du wire Protobuf + cas old/current + malformed/ov
## 8. Dépendances / licence
| Gate | Décision / matérialisation `pre.003` | Preuve / état |
| ------------------------------ | ------------------------------------------------------------------- | ------------------------------- |
|--------------------------------|---------------------------------------------------------------------|---------------------------------|
| repository default | AGPL-3.0-only | `LICENSING.md` |
| client subtree | Apache-2.0 | `LICENSING.md` |
| proto subtree | Apache-2.0 | `LICENSING.md` |
@@ -236,7 +236,7 @@ prost/prost-types 0.14.x (0.14.4 latest observé)
## 9. Architecture / ownership
| Invariant | Preuve cible | État `pre.003` |
| ------------------------------------------------------------------------------ | ------------------------------ | ------------------------------------- |
|--------------------------------------------------------------------------------|--------------------------------|---------------------------------------|
| backend gRPC distinct HTTP/WS | source/API canary | IMPLEMENTED / Cargo pending |
| aucun `WsProtocolKind` gRPC | source scan | SOURCE PASS |
| Transport owns gRPC | dependency graph | IMPLEMENTED / tree pending |
@@ -514,7 +514,7 @@ Le second échec ne révèle aucune nouvelle faiblesse du moteur N1 : il confirm
### Gate final opérateur `pre.002-fix.002`
| Gate | Résultat final |
| ---------------------------------------- | -------------- |
|------------------------------------------|----------------|
| `cargo fmt --all` | PASS |
| audit Rust workspace | PASS / clean |
| `cargo check --workspace` | PASS |
@@ -531,7 +531,7 @@ Le second échec ne révèle aucune nouvelle faiblesse du moteur N1 : il confirm
## 18. Gate `pre.003` — candidate
| Gate / surface | État candidate |
| ------------------------------------------- | -------------- |
|---------------------------------------------|----------------|
| workspace version | `0.2.9-pre.3` |
| runtime proto sans feature `tonic` | SOURCE PASS |
| Tonic runtime channel + AWS-LC + WebPKI TLS | SOURCE PASS |
@@ -586,21 +586,21 @@ aucun Subscribe/PublicNode/Config V3 anticipé
### 18.2 Gate final opérateur `pre.003-fix.001`
| Gate | Résultat final |
|-------------------------------------------|----------------|
| `cargo fmt --all` | PASS |
| audit Rust workspace | PASS / clean |
| `cargo check --workspace` | PASS |
| `cargo clippy --workspace --all-targets` | PASS |
| Transport unit | 354/354 PASS |
| Transport `public_api` | 43/43 PASS |
| Transport `release_completeness` | 36/36 PASS |
| Transport doctests | 4/4 PASS |
| `cargo test --workspace` | PASS |
| `cargo tree -p ...` | fourni/relu |
| `cargo tree -p ... -e features` | fourni/relu |
| `cargo tree -p ... --duplicates` | fourni/relu |
| `cargo tree --duplicates` | fourni/relu |
| Gate | Résultat final |
|------------------------------------------|----------------|
| `cargo fmt --all` | PASS |
| audit Rust workspace | PASS / clean |
| `cargo check --workspace` | PASS |
| `cargo clippy --workspace --all-targets` | PASS |
| Transport unit | 354/354 PASS |
| Transport `public_api` | 43/43 PASS |
| Transport `release_completeness` | 36/36 PASS |
| Transport doctests | 4/4 PASS |
| `cargo test --workspace` | PASS |
| `cargo tree -p ...` | fourni/relu |
| `cargo tree -p ... -e features` | fourni/relu |
| `cargo tree -p ... --duplicates` | fourni/relu |
| `cargo tree --duplicates` | fourni/relu |
Graphe pertinent confirmé : `tonic 0.14.6`, `tonic-prost 0.14.6`, `prost/prost-types 0.14.4`, `yellowstone-grpc-proto 12.6.0`, `solana-pubkey 4.3.0`. Les features serveur/codegen et `yellowstone-grpc-proto/tonic` restent liées à la fixture dev/test ; aucune seconde version Tonic/Prost/Solana n'est introduite par la tranche.
@@ -608,25 +608,25 @@ Graphe pertinent confirmé : `tonic 0.14.6`, `tonic-prost 0.14.6`, `prost/prost-
## 19. Gate `pre.004` — candidate
| Surface | État candidate |
|-----------------------------------------------------|----------------|
| workspace version | `0.2.9-pre.4` |
| sept maps `SubscribeRequest` | SOURCE PASS |
| map vide / entrée nommée vide | SOURCE+TEST |
| commitment optional exact | SOURCE+TEST |
| account-data slices ordonnées | SOURCE+TEST |
| ping optional exact | SOURCE+TEST |
| `from_slot` optional exact | SOURCE+TEST |
| filter names <=128 octets / unicité globale | SOURCE+TEST |
| filter groups <=1024 total | SOURCE+TEST |
| slices <=128 / length <=64 MiB / overflow rejeté | SOURCE+TEST |
| request Debug sans noms/payloads de filtres | SOURCE+TEST |
| filtres Accounts/Slots détaillés | OUT pre.004 |
| filtres Transactions/Blocks détaillés | OUT pre.004 |
| stream bidi / lifecycle / updates | OUT pre.004 |
| PublicNode / Config V3 | OUT pre.004 |
| audit Rust workspace local | PASS / clean |
| fmt/check/Clippy/tests | opérateur TODO |
| Surface | État candidate |
|--------------------------------------------------|----------------|
| workspace version | `0.2.9-pre.4` |
| sept maps `SubscribeRequest` | SOURCE PASS |
| map vide / entrée nommée vide | SOURCE+TEST |
| commitment optional exact | SOURCE+TEST |
| account-data slices ordonnées | SOURCE+TEST |
| ping optional exact | SOURCE+TEST |
| `from_slot` optional exact | SOURCE+TEST |
| filter names <=128 octets / unicité globale | SOURCE+TEST |
| filter groups <=1024 total | SOURCE+TEST |
| slices <=128 / length <=64 MiB / overflow rejeté | SOURCE+TEST |
| request Debug sans noms/payloads de filtres | SOURCE+TEST |
| filtres Accounts/Slots détaillés | OUT pre.004 |
| filtres Transactions/Blocks détaillés | OUT pre.004 |
| stream bidi / lifecycle / updates | OUT pre.004 |
| PublicNode / Config V3 | OUT pre.004 |
| audit Rust workspace local | PASS / clean |
| fmt/check/Clippy/tests | opérateur TODO |
Le proto publié `yellowstone-grpc-proto 12.6.0` a été recontrôlé avant implémentation : les onze champs top-level retenus restent `accounts`, `slots`, `transactions`, `transactions_status`, `blocks`, `blocks_meta`, `entry`, `commitment`, `accounts_data_slice`, `ping`, `from_slot`. Aucun `SubscribeDeshred` n'entre dans la surface KSP.
@@ -696,3 +696,26 @@ Les dix symboles concernés (`to_wire` et `commitment_to_wire`) servent uniqueme
Les conversions request protobuf et les décodeurs Account/Slot sont test-only jusqu'à `pre.008`, faute de consommateur runtime avant l'ouverture du stream. Le contrat public reste entièrement KSP-owned.
**Verdict `pre.005` : candidate source prête ; fermeture après gate Cargo opérateur.**
### 20.1 Premier gate opérateur `pre.005` et `pre.005-fix.001`
| Gate / observation | Résultat `pre.005` | État `fix.001` |
|------------------------------------------|---------------------------------------------------------------------------|------------------------------------------|
| workspace version | `0.2.9-pre.5` | `0.2.9-pre.5.fix.1` |
| `cargo fmt --all` | PASS | à réexécuter |
| audit Rust workspace | PASS / clean | audit local à revalider |
| `cargo check --workspace` | PASS + 4 warnings `dead_code` | constantes test-only sous `#[cfg(test)]` |
| `cargo clippy --workspace --all-targets` | FAIL : 1 `implicit_return` + 1 `wrong_self_convention` ; mêmes 4 warnings | corrigé |
| Transport unit | 364/364 PASS | inchangé |
| Transport `public_api` | 45/45 PASS | inchangé |
| Transport `release_completeness` | 38/38 PASS | inchangé |
| Transport doctests | 4/4 PASS | inchangé |
| Core dependency canary | 3/3 PASS | inchangé |
| `cargo test --workspace` | PASS + 4 warnings à la compilation | à réexécuter sans warning |
Les quatre constantes concernées sont exclusivement consommées par les décodeurs Account/Slot eux-mêmes sous `#[cfg(test)]` jusqu'à l'ouverture du stream en `pre.008`. Elles passent donc sous le même `cfg(test)` plutôt que d'introduire un `allow(dead_code)`. Le receiver du helper Slot devient `self` car le type est `Copy`; la closure `is_some_and` reçoit un `return` explicite conformément à la politique Clippy KSP.
Le même fix réaligne tous les tableaux Markdown de `016` et `012` sans modifier leur contenu sémantique.
**Verdict `pre.005-fix.001` : correctif source/documentaire prêt ; fermeture de `pre.005` après gate opérateur sans warning.**