v0.2.4-pre.009

This commit is contained in:
2026-08-18 22:43:09 +02:00
parent 7e84522787
commit e6772c109d
18 changed files with 1891 additions and 49 deletions

View File

@@ -1,5 +1,5 @@
<!-- file: docs/validation/000-README.md -->
<!-- version: 9 -->
<!-- version: 10 -->
# Validations KSP
@@ -16,3 +16,4 @@ Documents :
- [`005-V0_2_3_KSP_TRANSPORT_007_RETRO_AUDIT.md`](005-V0_2_3_KSP_TRANSPORT_007_RETRO_AUDIT.md) — réaudit rétroactif de complétude `KSP-TRANSPORT-007` des 37 wrappers HTTP typés livrés de `0.2.1` à `0.2.3-pre.007`, avec preuves Solana/Agave et verdict méthode par méthode.
- [`006-V0_2_3_HTTP_TRANSACTIONS.md`](006-V0_2_3_HTTP_TRANSACTIONS.md) — matrice finale validée de `0.2.3`, 11 wrappers Transactions, sécurité write/simulation, réaudit 52+14, `KSP-TRANSPORT-007` 37/37, graphes Cargo et deux smokes Devnet passés avant publication stable.
- [`007-V0_2_4_HTTP_FINAL_COMPLIANCE.md`](007-V0_2_4_HTTP_FINAL_COMPLIANCE.md) — matrice candidate de clôture `0.2.4`, inventaire exact 52 current + 14 Deprecated, preuve typed 52/52, audit SIMD final, `KSP-TRANSPORT-007`, smokes et gates de graphes/publication.

View File

@@ -0,0 +1,429 @@
<!-- file: docs/validation/007-V0_2_4_HTTP_FINAL_COMPLIANCE.md -->
<!-- version: 1 -->
# Validation candidate `0.2.4` — HTTP Blocks + Economics + compliance finale
## Objet
Cette matrice porte la preuve de clôture candidate de `0.2.4 — HTTP Blocks + Economics + compliance HTTP finale`.
Elle complète les validations historiques :
- [`003-V0_2_1_ONCHAIN_HTTP.md`](003-V0_2_1_ONCHAIN_HTTP.md) — foundation HTTP et registre initial ;
- [`004-V0_2_2_HTTP_ACCOUNTS_TOKENS_CLUSTER.md`](004-V0_2_2_HTTP_ACCOUNTS_TOKENS_CLUSTER.md) — 22 wrappers Accounts/Tokens/Cluster ;
- [`005-V0_2_3_KSP_TRANSPORT_007_RETRO_AUDIT.md`](005-V0_2_3_KSP_TRANSPORT_007_RETRO_AUDIT.md) — réaudit `KSP-TRANSPORT-007` des 37 wrappers acquis avant `0.2.4` ;
- [`006-V0_2_3_HTTP_TRANSACTIONS.md`](006-V0_2_3_HTTP_TRANSACTIONS.md) — 11 wrappers Transactions et clôture stable `0.2.3`.
`0.2.4-pre.009` n'ajoute pas de nouvelle méthode RPC métier. Il agrège les preuves de complétude, étend le smoke live aux familles nouvellement livrées, synchronise la documentation et prépare `0.2.5`.
`0.2.4-rel.001` reste strictement publicationnelle après validation opérateur complète de cette candidate.
## Base opérateur validée
La base `0.2.4-pre.008-fix.001` a été validée le **18 août 2026** avec :
```text
cargo fmt --all OK
cargo check --workspace OK
cargo clippy --workspace --all-targets OK
Transport
240 unit passed
26 public API passed
21 release completeness passed
1 smoke live ignored par défaut
0 failure
```
Le fix ne modifie pas le contrat `getInflationReward`; il ajoute uniquement le `return` explicite exigé par la policy Clippy workspace.
## Réaudit officiel final — inventaire HTTP
Dernier contrôle effectué le **18 août 2026** contre l'index HTTP Solana courant :
```text
https://solana.com/docs/rpc/http
```
L'index contient toujours exactement **52 méthodes HTTP courantes**.
La navigation Deprecated officielle, visible depuis les pages sous :
```text
https://solana.com/docs/rpc/deprecated/
```
contient toujours exactement **14 méthodes historiques**.
Le rapprochement a été réalisé sur les **noms exacts**, pas uniquement sur les compteurs :
```text
official current names == KSP current registry names == 52/52
official deprecated names == KSP historical registry names == 14/14
missing == 0
extra == 0
```
Aucun nouvel endpoint HTTP issu de SIMD-0180 ou d'une autre évolution d'interface n'apparaît dans l'index officiel actuel.
## Baseline Agave et audit SIMD final
La baseline runtime conservée pour le contrat de cette release reste **Agave `v4.2.1`**, déjà auditée depuis `pre.001`.
Le calendrier public Agave v4.2 observé le 18 août 2026 montre que le rollout v4.2 est encore en cours : Devnet a été livré en juillet/août et les étapes Mainnet-beta d'adoption générale/activation sont positionnées en août. Cette situation ne justifie pas de remplacer rétroactivement la baseline wire de la release sans différence stable démontrée.
Audit final minimal imposé par le plan :
| SIMD | Statut observé le 2026-08-18 | Conséquence HTTP KSP |
|---------------------------------------------------|------------------------------|-------------------------------------------------------------------------------------------------------------------|
| `0180` Vote Account Address Keyed Leader Schedule | Review | aucune nouvelle méthode HTTP officielle ; ne pas changer `getLeaderSchedule` par anticipation |
| `0298` Bank Hash in Block Footer | Idea | aucun `bankHash` ajouté au wire stable `getBlock` |
| `0301` parent bank hash | PR fermé, non mergé | aucun `parentBankHash` spéculatif |
| `0307` Add Block Footer | Review | aucun `footer` ajouté à `SolanaGetBlockConfig`/`SolanaConfirmedBlock` tant que la baseline stable ne l'expose pas |
| `0385` Transaction V1 | Review | conserver `SolanaTransactionVersion::Number(u8)` générique et la canary version `1` |
| `0490` Stake v5 | Review | `getStakeMinimumDelegation` reflète uniquement la valeur runtime ; aucun minimum local codé en dur |
| `0550` Double Disinflation Rate | Review | `getInflationGovernor`/`getInflationRate` reflètent les valeurs runtime ; aucune formule locale |
| `0553` Base Inclusion and Resource-based Fee | Draft | changement économique/consensus à surveiller ; aucun nouveau wrapper ou champ HTTP stable ajouté |
Extensions wire déjà acquises et réauditées explicitement : **SIMD-0118** et **SIMD-0291**.
| SIMD | Statut observé le 2026-08-18 | Contrat déjà matérialisé dans KSP |
|-----------------------------------------------|------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------|
| `0118` Partitioned Epoch Rewards Distribution | Activated | `getBlock.numRewardPartitions` reste lossless : omission, `null` et valeur sont distincts ; KSP ne synthétise jamais `0` |
| `0291` Commission Rate in Basis Points | Review | `commission` et `commissionBps` restent indépendants dans les rewards de bloc et d'inflation ; les sous-arbres transaction restent lossless |
Le statut documentaire `Review` de SIMD-0291 ne justifie pas de supprimer un champ déjà livré par Agave `v4.2.1`. Inversement, KSP ne déduit jamais `commissionBps` depuis `commission`, ni l'inverse.
Sources SIMD :
```text
https://github.com/solana-foundation/solana-improvement-documents/blob/main/proposals/0118-partitioned-epoch-reward-distribution.md
https://github.com/solana-foundation/solana-improvement-documents/blob/main/proposals/0180-vote-account-leader-schedule.md
https://github.com/solana-foundation/solana-improvement-documents/blob/main/proposals/0291-commission-rate-in-basis-points.md
https://github.com/solana-foundation/solana-improvement-documents/blob/main/proposals/0298-bank-hash-in-block-footer.md
https://github.com/solana-foundation/solana-improvement-documents/pull/301
https://github.com/solana-foundation/solana-improvement-documents/blob/main/proposals/0307-add-block-footer.md
https://github.com/solana-foundation/solana-improvement-documents/blob/main/proposals/0385-transaction-v1.md
https://github.com/solana-foundation/solana-improvement-documents/blob/main/proposals/0490-upgrade-stake-to-v5.md
https://github.com/solana-foundation/solana-improvement-documents/blob/main/proposals/0550-double-disinflation.md
https://github.com/solana-foundation/solana-improvement-documents/blob/main/proposals/0553-resource-fee-burn.md
```
## Compliance des 52 méthodes courantes
La canary `public_v0_2_4_pre_009_all_52_current_typed_wrappers_and_legacy_forms_are_available_from_crate_root` référence directement chaque méthode Rust publique ci-dessous. Une méthode ne compte donc pas comme typed-complete uniquement parce qu'un descriptor ou l'exécuteur raw existe.
| Méthode RPC | Catégorie | Release typed | Classe | Wrapper public |
|-------------------------------------|--------------|---------------|--------------------------------------|------------------------------------------|
| `getAccountInfo` | Accounts | `0.2.2` | Read / RetrySafe | `get_account_info` |
| `getBalance` | Accounts | `0.2.1` | Read / RetrySafe | `get_balance` |
| `getLargestAccounts` | Accounts | `0.2.2` | Read / RetrySafe | `get_largest_accounts` |
| `getMinimumBalanceForRentExemption` | Accounts | `0.2.2` | Read / RetrySafe | `get_minimum_balance_for_rent_exemption` |
| `getMultipleAccounts` | Accounts | `0.2.2` | Read / RetrySafe | `get_multiple_accounts` |
| `getProgramAccounts` | Accounts | `0.2.2` | Read / RetrySafe | `get_program_accounts` |
| `getTokenAccountBalance` | Tokens | `0.2.2` | Read / RetrySafe | `get_token_account_balance` |
| `getTokenAccountsByDelegate` | Tokens | `0.2.2` | Read / RetrySafe | `get_token_accounts_by_delegate` |
| `getTokenAccountsByOwner` | Tokens | `0.2.2` | Read / RetrySafe | `get_token_accounts_by_owner` |
| `getTokenLargestAccounts` | Tokens | `0.2.2` | Read / RetrySafe | `get_token_largest_accounts` |
| `getTokenSupply` | Tokens | `0.2.2` | Read / RetrySafe | `get_token_supply` |
| `getFeeForMessage` | Transactions | `0.2.3` | Read / RetrySafe | `get_fee_for_message` |
| `getLatestBlockhash` | Transactions | `0.2.3` | Read / RetrySafe | `get_latest_blockhash` |
| `getRecentPrioritizationFees` | Transactions | `0.2.3` | Read / RetrySafe | `get_recent_prioritization_fees` |
| `getSignaturesForAddress` | Transactions | `0.2.3` | Read / RetrySafe | `get_signatures_for_address` |
| `getSignatureStatuses` | Transactions | `0.2.3` | Read / RetrySafe | `get_signature_statuses` |
| `getTransaction` | Transactions | `0.2.3` | Read / RetrySafe | `get_transaction` + legacy |
| `getTransactionCount` | Transactions | `0.2.3` | Read / RetrySafe | `get_transaction_count` |
| `isBlockhashValid` | Transactions | `0.2.3` | Read / RetrySafe | `is_blockhash_valid` |
| `requestAirdrop` | Transactions | `0.2.3` | WriteSubmission / NeverAfterDispatch | `request_airdrop` |
| `sendTransaction` | Transactions | `0.2.3` | WriteSubmission / NeverAfterDispatch | `send_transaction` |
| `simulateTransaction` | Transactions | `0.2.3` | Simulation / RetrySafe | `simulate_transaction` |
| `getBlock` | Blocks | `0.2.4` | Read / RetrySafe | `get_block` + legacy |
| `getBlockCommitment` | Blocks | `0.2.4` | Read / RetrySafe | `get_block_commitment` |
| `getBlockHeight` | Blocks | `0.2.4` | Read / RetrySafe | `get_block_height` |
| `getBlockProduction` | Blocks | `0.2.4` | Read / RetrySafe | `get_block_production` |
| `getBlocks` | Blocks | `0.2.4` | Read / RetrySafe | `get_blocks` |
| `getBlocksWithLimit` | Blocks | `0.2.4` | Read / RetrySafe | `get_blocks_with_limit` |
| `getBlockTime` | Blocks | `0.2.4` | Read / RetrySafe | `get_block_time` |
| `getFirstAvailableBlock` | Blocks | `0.2.4` | Read / RetrySafe | `get_first_available_block` |
| `getRecentPerformanceSamples` | Blocks | `0.2.4` | Read / RetrySafe | `get_recent_performance_samples` |
| `minimumLedgerSlot` | Blocks | `0.2.4` | Read / RetrySafe | `minimum_ledger_slot` |
| `getClusterNodes` | Cluster | `0.2.2` | Read / RetrySafe | `get_cluster_nodes` |
| `getEpochInfo` | Cluster | `0.2.2` | Read / RetrySafe | `get_epoch_info` |
| `getEpochSchedule` | Cluster | `0.2.2` | Read / RetrySafe | `get_epoch_schedule` |
| `getGenesisHash` | Cluster | `0.2.1` | Read / RetrySafe | `get_genesis_hash` |
| `getHealth` | Cluster | `0.2.1` | Read / RetrySafe | `get_health` |
| `getHighestSnapshotSlot` | Cluster | `0.2.2` | Read / RetrySafe | `get_highest_snapshot_slot` |
| `getIdentity` | Cluster | `0.2.2` | Read / RetrySafe | `get_identity` |
| `getLeaderSchedule` | Cluster | `0.2.2` | Read / RetrySafe | `get_leader_schedule` |
| `getMaxRetransmitSlot` | Cluster | `0.2.2` | Read / RetrySafe | `get_max_retransmit_slot` |
| `getMaxShredInsertSlot` | Cluster | `0.2.2` | Read / RetrySafe | `get_max_shred_insert_slot` |
| `getSlot` | Cluster | `0.2.2` | Read / RetrySafe | `get_slot` |
| `getSlotLeader` | Cluster | `0.2.2` | Read / RetrySafe | `get_slot_leader` |
| `getSlotLeaders` | Cluster | `0.2.2` | Read / RetrySafe | `get_slot_leaders` |
| `getVersion` | Cluster | `0.2.1` | Read / RetrySafe | `get_version` |
| `getVoteAccounts` | Cluster | `0.2.2` | Read / RetrySafe | `get_vote_accounts` |
| `getInflationGovernor` | Economics | `0.2.4` | Read / RetrySafe | `get_inflation_governor` |
| `getInflationRate` | Economics | `0.2.4` | Read / RetrySafe | `get_inflation_rate` |
| `getInflationReward` | Economics | `0.2.4` | Read / RetrySafe | `get_inflation_reward` |
| `getStakeMinimumDelegation` | Economics | `0.2.4` | Read / RetrySafe | `get_stake_minimum_delegation` |
| `getSupply` | Economics | `0.2.4` | Read / RetrySafe | `get_supply` |
Les deux formes legacy encore supportées sont couvertes séparément et marquées deprecated :
```text
getTransaction -> HttpTransportPool::get_transaction_legacy
getBlock -> HttpTransportPool::get_block_legacy
```
Partition exacte :
```text
0.2.1 foundation 4
0.2.2 Accounts/Tokens/Cluster 22
0.2.3 Transactions 11
0.2.4 Blocks/Economics 15
--------------------------------
total 52
```
Classification globale attendue :
```text
Read / RetrySafe
Simulation / RetrySafe
WriteSubmission / NeverAfterDispatch
```
Les seules write submissions actuelles restent `requestAirdrop` et `sendTransaction`; aucune classe `NeverAfterDispatch` n'est affaiblie par `0.2.4`.
## Compliance des 14 historiques
Les 14 entrées restent découvrables pour audit/compliance mais sont `Deprecated / Removed / NotApplicable` et ne sont pas envoyées au réseau :
| Méthode historique | Documentation | Runtime KSP | Remplacement/aide |
|-------------------------------------|---------------|-------------|-------------------------------------|
| `confirmTransaction` | Deprecated | Removed | getSignatureStatuses |
| `getConfirmedBlock` | Deprecated | Removed | getBlock |
| `getConfirmedBlocks` | Deprecated | Removed | getBlocks |
| `getConfirmedBlocksWithLimit` | Deprecated | Removed | getBlocksWithLimit |
| `getConfirmedSignaturesForAddress2` | Deprecated | Removed | getSignaturesForAddress |
| `getConfirmedTransaction` | Deprecated | Removed | getTransaction |
| `getFeeCalculatorForBlockhash` | Deprecated | Removed | isBlockhashValid / getFeeForMessage |
| `getFeeRateGovernor` | Deprecated | Removed | getFeeForMessage |
| `getFees` | Deprecated | Removed | getFeeForMessage |
| `getRecentBlockhash` | Deprecated | Removed | getLatestBlockhash |
| `getSignatureConfirmation` | Deprecated | Removed | getSignatureStatuses |
| `getSignatureStatus` | Deprecated | Removed | getSignatureStatuses |
| `getSnapshotSlot` | Deprecated | Removed | getHighestSnapshotSlot |
| `getStakeActivation` | Deprecated | Removed | aucun remplacement direct |
La canary `release_v0_2_4_pre_009_final_http_inventory_and_coverage_partition_are_exact` fige simultanément :
```text
52 noms current exacts
14 noms historiques exacts
4 / 22 / 11 / 15 par HttpRpcCoverageRelease
Supported pour les 52 current
Deprecated + Removed + NotApplicable pour les 14 historiques
RetrySafe pour Read/Simulation current
NeverAfterDispatch pour WriteSubmission current
```
## `KSP-TRANSPORT-007` — preuve globale 52/52
Le réaudit `0.2.3` a déjà conclu **37/37 conformes** avant l'ouverture de `0.2.4`.
Les 15 nouveaux wrappers appliquent la même règle sans réduction de contrat.
### Blocks — 10/10
Points de sensibilité couverts :
- `getBlock` moderne + bare encoding legacy deprecated ;
- encodings `binary/base58/base64/json/jsonParsed` réellement supportés par la baseline ;
- `transactionDetails = full/signatures/none/accounts` ;
- `maxSupportedTransactionVersion` et version numérique générique, y compris canary `1` ;
- distinction résultat `null` / erreurs RPC ;
- `transactions`, `signatures`, `rewards`, `numRewardPartitions` avec préservation des états wire pertinents ;
- `commission` nullable + `commissionBps` indépendant ;
- `getBlocks` avec ses quatre overloads exacts et `RpcContextConfig` complet ;
- `getBlocksWithLimit(0)` valide et plafond 500000 ;
- `getRecentPerformanceSamples <= 720` et ancien wire sans `numNonVoteTransactions` ;
- `getBlockProduction` identity/range/context sans restriction de commitment inventée ;
- wrappers sans config exactement en `params: []`.
### Economics — 5/5
Points de sensibilité couverts :
- aucune formule d'inflation locale ;
- aucun minimum de délégation codé en dur ;
- `getSupply` conserve `excludeNonCirculatingAccountsList` omis/false/true ;
- `getInflationReward` conserve ordre, doublons, `null` positionnels et cardinalité ;
- aucun plafond d'adresses inventé pour `getInflationReward` ;
- `epoch`, `commitment`, `minContextSlot` transmis ;
- `getInflationReward` rejette `processed` avant I/O car la voie runtime exige au moins `confirmed` ;
- `commission` nullable et `commissionBps` présent/omis/null indépendants ;
- erreurs RPC de contexte/rewards period conservées comme erreurs applicatives distantes.
Verdict candidate :
```text
KSP-TRANSPORT-007 current wrappers == 52/52
remédiation fonctionnelle finale == aucune
```
## Smoke Devnet Transport pur
Le smoke Transport reste opt-in, programmatique et read-only :
```text
settings programmatiques
-> getAccountInfo
-> getTokenAccountsByOwner
-> getEpochInfo
-> getVoteAccounts
-> getLatestBlockhash
-> isBlockhashValid
-> getTransactionCount
-> getBlockHeight
-> getInflationRate
-> getStakeMinimumDelegation
```
Les trois derniers appels ajoutent une traversée live représentative des familles Blocks/Economics sans dépendre d'un slot historique particulier, d'un compte reward spécifique ou d'une valeur économique codée en dur.
Commande :
```bash
cargo test -p ksp-onchain-transport-lib --test transport_devnet_smoke -- --ignored --nocapture
```
Le smoke historique de composition reste séparé et transitoire :
```bash
cargo test -p ksp-config-lib --test transport_devnet_smoke -- --ignored --nocapture
```
Il ne devient pas un modèle de placement des futurs smokes cross-crates.
## Frontières et graphes Cargo
Frontière attendue :
```text
ksp-config-lib -> ksp-onchain-transport-lib
ksp-onchain-transport-lib -> ksp-core-lib
ksp-onchain-transport-lib -> ksp-logging-lib
ksp-onchain-transport-lib -X-> ksp-config-lib
ksp-onchain-transport-lib -X-> Store
ksp-onchain-transport-lib -X-> Program
ksp-onchain-transport-lib -X-> tracing direct
```
`0.2.4` n'ajoute aucune dépendance externe au `Cargo.toml` de Transport.
Graphes à inspecter sur la candidate :
```bash
cargo tree -p ksp-onchain-transport-lib
cargo tree -p ksp-onchain-transport-lib -d
cargo tree -p ksp-onchain-transport-lib -e features
cargo tree -p ksp-onchain-transport-lib -e normal
cargo tree -p ksp-config-lib
cargo tree -p ksp-config-lib -d
cargo tree -p ksp-config-lib -e features
cargo tree -p ksp-config-lib -e normal
```
Interprétation importante : `tracing` peut apparaître **transitivement** sous `ksp-logging-lib`, ce qui est conforme à l'architecture. L'interdit porte sur une dépendance **directe** de `ksp-onchain-transport-lib` vers `tracing`. Les graphes doivent donc être lus par chaîne de dépendances et non validés par la simple présence/absence du nom `tracing` dans l'arbre complet.
Les canaries workspace de dépendances restent des règles globales et ne sont pas déplacées dans Transport.
## Gate candidate `0.2.4-pre.009`
Validation déterministe immédiate attendue :
```bash
cargo fmt --all
cargo check --workspace
cargo clippy --workspace --all-targets
cargo test -p ksp-onchain-transport-lib
```
Compteurs Transport attendus après les deux nouvelles canaries finales :
```text
240 unit
27 public API
22 release completeness
1 smoke live ignored par défaut
```
Gate de clôture avant `rel.001` :
```bash
cargo test -p ksp-config-lib
cargo test -p ksp-core-lib
cargo test -p ksp-app-config-desk
cargo test --workspace
```
Puis inspection des huit graphes Cargo ci-dessus et exécution explicite des deux smokes Devnet.
Les résultats opérateur de `pre.009` seront enregistrés ici pendant `rel.001`; ils ne sont pas anticipés dans la candidate.
## Documentation et prochaine release
La candidate synchronise :
```text
ROADMAP.md
README/USAGE Transport
inventaire composant
séquence fonctionnelle
plan 011
index docs/plans/validation/prompts
```
Le prompt suivant est :
```text
prompts/010-V0_2_5_START_PROMPT.md
0.2.5 — Wallet foundation
```
Il conserve notamment les frontières déjà décidées :
```text
ksp-wallet-lib
.kspwallet
protection des secrets
signature
import/export extensible
changement de mot de passe
atomicité/no-clobber
Wallet -X-> Config
Wallet -X-> Transport
Wallet -X-> execution policy
WalletPolicy hors Wallet
```
## Publication `rel.001`
Après validation opérateur complète :
```text
workspace.package.version -> 0.2.4
ROADMAP : 0.2.4 -> [X]
CHANGELOG : synthèse stable 0.2.4
plan 011 / validation 007 : preuves finales opérateur + statut stable
README/USAGE/inventaires : candidate -> stable
deltas/0.2.4/rel.001.md
commit : v0.2.4-rel.001
tag stable : v0.2.4
```
Aucun wrapper, DTO, comportement runtime, dependency ou feature Cargo ne doit être ajouté pendant `rel.001`.