v0.2.1-pre.001-fix.001

This commit is contained in:
2026-08-17 17:36:35 +02:00
parent 624202c363
commit d98d152f08
9 changed files with 295 additions and 127 deletions

View File

@@ -1,11 +1,11 @@
<!-- file: docs/plans/008-V0_2_1_ONCHAIN_HTTP_PLAN.md -->
<!-- version: 1 -->
<!-- version: 2 -->
# `0.2.1-pre.001` — plan `ksp-onchain-transport-lib` HTTP Solana foundation
## 1. Statut et conclusion exécutive
Ce document ouvre `0.2.1` à partir de la base stable fournie `0.2.0` et exécute le gate de sizing imposé par le prompt `006` avant toute grosse implémentation.
Ce document ouvre `0.2.1` à partir de la base stable fournie `0.2.0` et exécute le gate de sizing imposé par le prompt `006` avant toute grosse implémentation. Sa version initiale appartient à `0.2.1-pre.001`; le split de releases présenté dans cette version du plan est le recalibrage documentaire de `0.2.1-pre.001-fix.001`.
Conclusion du gate :
@@ -260,26 +260,26 @@ Colonnes : nom, catégorie, paramètres/config à préserver, forme de résultat
| `getFirstAvailableBlock` | Blocks | aucun | u64 | Stable | Supporté | typed_adapter | `0.2.4` | empty params ; u64 | [Solana](https://solana.com/docs/rpc/http/getfirstavailableblock) |
| `getRecentPerformanceSamples` | Blocks | limit? <= 720 | [PerformanceSample] | Stable | Supporté | typed_adapter | `0.2.4` | no params/limit ; nullable numNonVoteTransactions | [Solana](https://solana.com/docs/rpc/http/getrecentperformancesamples) |
| `minimumLedgerSlot` | Blocks | aucun | u64 | Stable | Supporté | typed_adapter | `0.2.4` | empty params ; u64 | [Solana](https://solana.com/docs/rpc/http/minimumledgerslot) |
| `getClusterNodes` | Cluster | aucun | [ClusterNode] | Stable | Supporté | typed_adapter | `0.2.5` | nullable endpoints/features ; array | [Solana](https://solana.com/docs/rpc/http/getclusternodes) |
| `getEpochInfo` | Cluster | config? {commitment,minContextSlot} | EpochInfo | Stable | Supporté | typed_adapter | `0.2.5` | config ; transactionCount null | [Solana](https://solana.com/docs/rpc/http/getepochinfo) |
| `getEpochSchedule` | Cluster | aucun | EpochSchedule | Stable | Supporté | typed_adapter | `0.2.5` | empty params ; object | [Solana](https://solana.com/docs/rpc/http/getepochschedule) |
| `getClusterNodes` | Cluster | aucun | [ClusterNode] | Stable | Supporté | typed_adapter | `0.2.2` | nullable endpoints/features ; array | [Solana](https://solana.com/docs/rpc/http/getclusternodes) |
| `getEpochInfo` | Cluster | config? {commitment,minContextSlot} | EpochInfo | Stable | Supporté | typed_adapter | `0.2.2` | config ; transactionCount null | [Solana](https://solana.com/docs/rpc/http/getepochinfo) |
| `getEpochSchedule` | Cluster | aucun | EpochSchedule | Stable | Supporté | typed_adapter | `0.2.2` | empty params ; object | [Solana](https://solana.com/docs/rpc/http/getepochschedule) |
| `getGenesisHash` | Cluster | aucun | string base58 | Stable | Supporté | typed_adapter | `0.2.1` | empty params ; hash string ; error | [Solana](https://solana.com/docs/rpc/http/getgenesishash) |
| `getHealth` | Cluster | aucun | "ok" ou RPC unhealthy error | Stable | Supporté | typed_adapter | `0.2.1` | healthy ; unhealthy RPC error | [Solana](https://solana.com/docs/rpc/http/gethealth) |
| `getHighestSnapshotSlot` | Cluster | aucun | {full:u64,incremental:u64\|null} | Stable | Supporté | typed_adapter | `0.2.5` | incremental null ; no snapshot/error | [Solana](https://solana.com/docs/rpc/http/gethighestsnapshotslot) |
| `getIdentity` | Cluster | aucun | {identity:string} | Stable | Supporté | typed_adapter | `0.2.5` | empty params ; identity | [Solana](https://solana.com/docs/rpc/http/getidentity) |
| `getLeaderSchedule` | Cluster | slot? \| config? \| null ; config? {commitment,identity} | map identity->[slot_index] \| null | Stable | Supporté | typed_adapter | `0.2.5` | all overloads ; filter ; null | [Solana](https://solana.com/docs/rpc/http/getleaderschedule) |
| `getMaxRetransmitSlot` | Cluster | aucun | u64 | Stable | Supporté | typed_adapter | `0.2.5` | empty params ; u64 | [Solana](https://solana.com/docs/rpc/http/getmaxretransmitslot) |
| `getMaxShredInsertSlot` | Cluster | aucun | u64 | Stable | Supporté | typed_adapter | `0.2.5` | empty params ; u64 | [Solana](https://solana.com/docs/rpc/http/getmaxshredinsertslot) |
| `getSlot` | Cluster | config? {commitment,minContextSlot} | u64 | Stable | Supporté | typed_adapter | `0.2.5` | config ; u64 | [Solana](https://solana.com/docs/rpc/http/getslot) |
| `getSlotLeader` | Cluster | config? {commitment,minContextSlot} | string pubkey | Stable | Supporté | typed_adapter | `0.2.5` | config ; pubkey | [Solana](https://solana.com/docs/rpc/http/getslotleader) |
| `getSlotLeaders` | Cluster | startSlot ; limit 1..5000 | [string pubkey] | Stable | Supporté | typed_adapter | `0.2.5` | limit boundaries ; array | [Solana](https://solana.com/docs/rpc/http/getslotleaders) |
| `getHighestSnapshotSlot` | Cluster | aucun | {full:u64,incremental:u64\|null} | Stable | Supporté | typed_adapter | `0.2.2` | incremental null ; no snapshot/error | [Solana](https://solana.com/docs/rpc/http/gethighestsnapshotslot) |
| `getIdentity` | Cluster | aucun | {identity:string} | Stable | Supporté | typed_adapter | `0.2.2` | empty params ; identity | [Solana](https://solana.com/docs/rpc/http/getidentity) |
| `getLeaderSchedule` | Cluster | slot? \| config? \| null ; config? {commitment,identity} | map identity->[slot_index] \| null | Stable | Supporté | typed_adapter | `0.2.2` | all overloads ; filter ; null | [Solana](https://solana.com/docs/rpc/http/getleaderschedule) |
| `getMaxRetransmitSlot` | Cluster | aucun | u64 | Stable | Supporté | typed_adapter | `0.2.2` | empty params ; u64 | [Solana](https://solana.com/docs/rpc/http/getmaxretransmitslot) |
| `getMaxShredInsertSlot` | Cluster | aucun | u64 | Stable | Supporté | typed_adapter | `0.2.2` | empty params ; u64 | [Solana](https://solana.com/docs/rpc/http/getmaxshredinsertslot) |
| `getSlot` | Cluster | config? {commitment,minContextSlot} | u64 | Stable | Supporté | typed_adapter | `0.2.2` | config ; u64 | [Solana](https://solana.com/docs/rpc/http/getslot) |
| `getSlotLeader` | Cluster | config? {commitment,minContextSlot} | string pubkey | Stable | Supporté | typed_adapter | `0.2.2` | config ; pubkey | [Solana](https://solana.com/docs/rpc/http/getslotleader) |
| `getSlotLeaders` | Cluster | startSlot ; limit 1..5000 | [string pubkey] | Stable | Supporté | typed_adapter | `0.2.2` | limit boundaries ; array | [Solana](https://solana.com/docs/rpc/http/getslotleaders) |
| `getVersion` | Cluster | aucun | {solana-core:string,feature-set:u32\|null} | Stable | Supporté | typed_adapter | `0.2.1` | empty params ; feature-set present/null | [Solana](https://solana.com/docs/rpc/http/getversion) |
| `getVoteAccounts` | Cluster | config? {commitment,votePubkey,keepUnstakedDelinquents,delinquentSlotDistance} | {current:[VoteAccount],delinquent:[VoteAccount]} | Stable | Supporté | typed_adapter | `0.2.5` | filters/config ; both sets | [Solana](https://solana.com/docs/rpc/http/getvoteaccounts) |
| `getInflationGovernor` | Economics | config? {commitment} | InflationGovernor | Stable | Supporté | typed_adapter | `0.2.6` | config ; f64 fields | [Solana](https://solana.com/docs/rpc/http/getinflationgovernor) |
| `getInflationRate` | Economics | aucun | {total,validator,foundation:f64,epoch:u64} | Stable | Supporté | typed_adapter | `0.2.6` | empty params ; object | [Solana](https://solana.com/docs/rpc/http/getinflationrate) |
| `getInflationReward` | Economics | addresses ; config? {commitment,epoch,minContextSlot} | [InflationReward\|null] | Stable | Supporté | typed_adapter | `0.2.6` | addresses/config ; reward/null ; commission null | [Solana](https://solana.com/docs/rpc/http/getinflationreward) |
| `getStakeMinimumDelegation` | Economics | config? {commitment,minContextSlot} | RpcResponse<u64> | Stable | Supporté | typed_adapter | `0.2.6` | config ; value | [Solana](https://solana.com/docs/rpc/http/getstakeminimumdelegation) |
| `getSupply` | Economics | config? {commitment,excludeNonCirculatingAccountsList} | RpcResponse<Supply> | Stable | Supporté | typed_adapter | `0.2.6` | config true/false ; list semantics | [Solana](https://solana.com/docs/rpc/http/getsupply) |
| `getVoteAccounts` | Cluster | config? {commitment,votePubkey,keepUnstakedDelinquents,delinquentSlotDistance} | {current:[VoteAccount],delinquent:[VoteAccount]} | Stable | Supporté | typed_adapter | `0.2.2` | filters/config ; both sets | [Solana](https://solana.com/docs/rpc/http/getvoteaccounts) |
| `getInflationGovernor` | Economics | config? {commitment} | InflationGovernor | Stable | Supporté | typed_adapter | `0.2.4` | config ; f64 fields | [Solana](https://solana.com/docs/rpc/http/getinflationgovernor) |
| `getInflationRate` | Economics | aucun | {total,validator,foundation:f64,epoch:u64} | Stable | Supporté | typed_adapter | `0.2.4` | empty params ; object | [Solana](https://solana.com/docs/rpc/http/getinflationrate) |
| `getInflationReward` | Economics | addresses ; config? {commitment,epoch,minContextSlot} | [InflationReward\|null] | Stable | Supporté | typed_adapter | `0.2.4` | addresses/config ; reward/null ; commission null | [Solana](https://solana.com/docs/rpc/http/getinflationreward) |
| `getStakeMinimumDelegation` | Economics | config? {commitment,minContextSlot} | RpcResponse<u64> | Stable | Supporté | typed_adapter | `0.2.4` | config ; value | [Solana](https://solana.com/docs/rpc/http/getstakeminimumdelegation) |
| `getSupply` | Economics | config? {commitment,excludeNonCirculatingAccountsList} | RpcResponse<Supply> | Stable | Supporté | typed_adapter | `0.2.4` | config true/false ; list semantics | [Solana](https://solana.com/docs/rpc/http/getsupply) |
## 6. Matrice exhaustive — 14 méthodes Deprecated historiques
@@ -315,18 +315,18 @@ Résumé nom par nom :
Le split retenu est :
| Release | Mission | Surface courante assignée |
|---------|------------------------------------|-----------------------------------------------------------------------------------------------------------------------------|
| `0.2.1` | **HTTP transport foundation** | 4 canaris : `getBalance`, `getGenesisHash`, `getHealth`, `getVersion` + registre 52/14 + infrastructure complète foundation |
| `0.2.2` | HTTP Accounts + Tokens | 5 Accounts restants + 5 Tokens = 10 |
| `0.2.3` | HTTP Transactions | 11 |
| `0.2.4` | HTTP Blocks | 10 |
| `0.2.5` | HTTP Cluster | 12 Cluster restants |
| `0.2.6` | HTTP Economics + compliance finale | 5 + gate exhaustif 52 courantes / 14 historiques |
| Release | Mission | Surface courante assignée |
|---------|---------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------|
| `0.2.1` | **HTTP transport foundation** | 4 canaris : `getBalance`, `getGenesisHash`, `getHealth`, `getVersion` + registre 52/14 + infrastructure complète foundation |
| `0.2.2` | HTTP Accounts + Tokens + Cluster | 5 Accounts restants + 5 Tokens + 12 Cluster restants = 22 |
| `0.2.3` | HTTP Transactions | 11 |
| `0.2.4` | HTTP Blocks + Economics + compliance finale | 10 Blocks + 5 Economics = 15 + gate exhaustif 52 courantes / 14 historiques |
La présence d'un appel JSON-RPC raw/générique dans `0.2.1` **ne comptera pas** comme couverture typée des méthodes affectées à `0.2.2``0.2.6`.
La présence d'un appel JSON-RPC raw/générique dans `0.2.1` **ne comptera pas** comme couverture typée des méthodes affectées à `0.2.2``0.2.4`.
Wallet est décalé à `0.2.7` et Wallet Desk à `0.2.8`. Le premier `getBalance` reste volontairement dans `0.2.1`, donc ce split ne retire pas la capacité réseau minimale dont Wallet Desk aura besoin.
Ces trois releases HTTP complémentaires représentent **trois sessions nominales au maximum**, pas trois chats obligatoires. Si une release est entièrement clôturée plus vite que prévu, la même session peut ouvrir puis clôturer la suivante après un nouveau gate de sizing positif. Les frontières restent strictement séparées : numéro de release, prereleases, version, delta, validations et clôture stable.
Wallet est décalé à `0.2.5` et Wallet Desk à `0.2.6`. Le premier `getBalance` reste volontairement dans `0.2.1`, donc ce split ne retire pas la capacité réseau minimale dont Wallet Desk aura besoin.
## 8. Périmètre exact de la `0.2.1` réduite
@@ -488,7 +488,7 @@ Invariants :
- une réponse invalide devient `invalid_response`/`json_rpc_protocol`, jamais un faux résultat ;
- le `data` d'une erreur RPC peut être préservé comme `serde_json::Value`, mais n'est pas loggué massivement par défaut.
Une API raw/générique peut exister pour l'extensibilité/provider interop. Elle ne remplace pas la surface typée normative et n'est pas une preuve de couverture des releases `0.2.2``0.2.6`.
Une API raw/générique peut exister pour l'extensibilité/provider interop. Elle ne remplace pas la surface typée normative et n'est pas une preuve de couverture des releases `0.2.2``0.2.4`.
Pour la surface standard connue, l'exécuteur consulte le registry. Une méthode `runtime = Removed` est refusée comme méthode standard au lieu d'être envoyée en prétendant qu'elle est supportée.
@@ -820,7 +820,7 @@ La canary de méthode utilise un inventaire statique versionné/audité ; elle n
Explicitement reportés :
- les 48 méthodes courantes non canari selon la matrice `0.2.2``0.2.6` ;
- les 48 méthodes courantes non canari selon la matrice `0.2.2``0.2.4` ;
- WebSocket Solana ;
- LaserStream ;
- Yellowstone gRPC ;
@@ -851,7 +851,7 @@ La release peut devenir stable seulement si :
- Config standard + schema + example + adapter fonctionnent dans le bon sens ;
- README/USAGE expliquent API raw vs typed et limites de couverture de `0.2.1` ;
- tests ciblés/workspace et cargo tree passent sur le poste de développement ;
- prompt `0.2.2 — HTTP Accounts + Tokens` prêt dans la dernière prerelease ;
- prompt `0.2.2 — HTTP Accounts + Tokens + Cluster` prêt dans la dernière prerelease ;
- aucune méthode de la matrice n'est perdue du planning HTTP global.
## 22. Prévision souple des prereleases de la `0.2.1` réduite
@@ -872,23 +872,23 @@ Ce découpage est révisable si une tranche dépasse le budget ; la release réd
```text
0.2.1 HTTP transport foundation + 4 canaris
0.2.2 HTTP Accounts + Tokens
0.2.2 HTTP Accounts + Tokens + Cluster
0.2.3 HTTP Transactions
0.2.4 HTTP Blocks
0.2.5 HTTP Cluster
0.2.6 HTTP Economics + compliance HTTP finale
0.2.7 wallet foundation (.kspwallet)
0.2.8 Wallet Desk
0.2.9 standard Solana WebSocket
0.2.10 Helius LaserStream WebSocket
0.2.11 Yellowstone gRPC standard foundation
0.2.12 off-chain price transport
0.2.13 price visualization desk
0.2.14 interface/wire foundation
0.2.15 program-api foundation
0.2.4 HTTP Blocks + Economics + compliance HTTP finale
0.2.5 wallet foundation (.kspwallet)
0.2.6 Wallet Desk
0.2.7 standard Solana WebSocket
0.2.8 Helius LaserStream WebSocket
0.2.9 Yellowstone gRPC standard foundation
0.2.10 off-chain price transport
0.2.11 price visualization desk
0.2.12 interface/wire foundation
0.2.13 program-api foundation
```
Chaque release HTTP `0.2.2``0.2.6` commence par une **revérification officielle temporelle** de sa famille et de l'index global. Si Solana ajoute/supprime/change une méthode entre-temps, la matrice est mise à jour explicitement plutôt que de conserver aveuglément l'état du 2026-08-17.
Le découpage `0.2.2``0.2.4` est un **maximum nominal de trois sessions**. Une session peut clôturer plusieurs releases successives si, après la clôture complète de chacune, le sizing de la suivante reste positif. Cette optimisation de session ne fusionne jamais les releases elles-mêmes.
Chaque release HTTP `0.2.2``0.2.4` commence par une **revérification officielle temporelle** de sa famille et de l'index global. Si Solana ajoute/supprime/change une méthode entre-temps, la matrice est mise à jour explicitement plutôt que de conserver aveuglément l'état du 2026-08-17.
## 24. Gate de sizing — réponse obligatoire