Files
2026-08-18 22:43:09 +02:00

403 lines
14 KiB
Markdown

<!-- file: deltas/0.2.4/pre.009.md -->
<!-- version: 1 -->
# Delta `0.2.4-pre.009` — clôture HTTP finale, compliance `52/52 + 14/14` et préparation Wallet
## Base requise
Livraison précédente validée :
```text
0.2.4-pre.008-fix.001
workspace.package.version = "0.2.4-pre.8.fix.1"
```
La validation locale fournie pour cette base est entièrement propre :
```text
cargo fmt --all -> terminé
cargo check --workspace -> terminé sans warning
cargo clippy --workspace --all-targets -> terminé sans warning
cargo test -p ksp-onchain-transport-lib -> 240 unit tests OK
26 public API tests OK
21 release-completeness tests OK
1 smoke Devnet ignoré comme prévu
0 échec
```
Cette base inclut donc le fix purement Clippy de `pre.008-fix.001` sans modification fonctionnelle de `getInflationReward`.
## Objectif
`pre.009` est la prerelease de clôture de la série HTTP commencée en `0.2.1`.
Elle ne doit ajouter aucun nouveau comportement RPC standard. Elle doit au contraire prouver et documenter que la surface acquise est complète et cohérente :
```text
52 méthodes HTTP courantes officielles
52 wrappers typed KSP correspondants
14 méthodes historiques Deprecated / runtime Removed
14 descriptors historiques KSP correspondants
partition typed : 4 foundation + 22 Accounts/Tokens/Cluster + 11 Transactions + 15 Blocks/Economics
```
Elle doit également :
- réauditer la référence HTTP officielle et les SIMDs susceptibles de modifier cette surface ;
- figer les canaries finales de présence, de classification et de frontières ;
- étendre le smoke Transport pur aux nouvelles familles Blocks/Economics ;
- publier le document de conformité final `0.2.4` ;
- mettre à jour les documents vivants de la série ;
- fournir le prompt de démarrage de `0.2.5 — Wallet foundation` ;
- préparer `rel.001`, qui devra rester strictement publicationnel.
## Version Cargo
Nouvelle prerelease technique :
```text
0.2.4-pre.8.fix.1 -> 0.2.4-pre.9
```
Aucune dépendance, feature Cargo ou frontière de crate n'est modifiée.
## Réaudit officiel final de la surface HTTP
Le réaudit de la référence Solana HTTP courante retrouve exactement les `52` méthodes enregistrées par KSP.
La comparaison est effectuée sur les noms, pas seulement sur un compteur :
```text
officiel courant - registre KSP = {}
registre KSP - officiel courant = {}
```
Les `14` méthodes historiques présentées dans la navigation Deprecated officielle correspondent également exactement au registre historique KSP :
```text
officiel Deprecated - historique KSP = {}
historique KSP - officiel Deprecated = {}
```
Aucun nouveau RPC HTTP standard n'est donc introduit dans la release à cette date.
La baseline runtime de contrat utilisée pendant `0.2.4` reste :
```text
Agave v4.2.1
```
La rollout Agave `v4.2` est en cours pendant cette clôture ; cette prerelease ne transforme pas un calendrier de déploiement en affirmation d'activation cluster-wide.
## Réaudit SIMD final
Les statuts upstream observés pendant la clôture sont :
| SIMD | Sujet lié au HTTP KSP | Statut courant | Conséquence pour `0.2.4` |
|--------|---------------------------------------------|---------------------|---------------------------------------------------------------------------|
| `0180` | leader schedule keyed by vote account | `Review` | aucune nouvelle méthode HTTP officielle ; conserver le wire stable audité |
| `0298` | `bank_hash` dans le block footer | `Idea` | ne pas ajouter `bankHash` spéculativement |
| `0301` | remplacement proposé par `parent_bank_hash` | PR fermé, non mergé | aucune surface KSP |
| `0307` | block footer + extension `getBlock` | `Review` | pas de `footer` dans le contrat stable `v4.2.1` |
| `0385` | transaction V1 | `Review` | conserver `SolanaTransactionVersion::Number(u8)` générique |
| `0490` | Stake Program v5 / minimum delegation | `Review` | valeur fournie par le runtime, jamais codée en dur |
| `0550` | double disinflation | `Review` | valeurs inflation runtime, aucune formule KSP |
| `0553` | base inclusion + resource fee | `Draft` | évolution économique/fee ; aucun nouveau wrapper HTTP stable |
Les extensions wire déjà acquises sont également réauditées pour éviter qu'une clôture centrée sur la watchlist n'en perde une :
| SIMD | Statut courant | Contrat KSP confirmé |
|-----------------------------------------------|----------------|----------------------------------------------------------------------------------------------------------|
| `0118` Partitioned Epoch Rewards Distribution | `Activated` | `numRewardPartitions` reste lossless en omitted/null/value ; aucune synthèse locale |
| `0291` Commission Rate in Basis Points | `Review` | `commission` et `commissionBps` restent indépendants dans les rewards ; aucun calcul de conversion local |
Le statut `Review` de SIMD-0291 ne retire pas le wire déjà livré par Agave `v4.2.1`. Le réaudit ne justifie donc aucune extension wire spéculative dans `pre.009` ni aucune suppression d'un champ stable déjà acquis.
## Canarie public API finale
`tests/public_api.rs` ajoute :
```text
public_v0_2_4_pre_009_all_52_current_typed_wrappers_and_legacy_forms_are_available_from_crate_root
```
Cette canarie référence les `52` wrappers typed des méthodes courantes via `HttpTransportPool`.
Elle référence aussi séparément les deux formes legacy de requête qui ne constituent pas des méthodes RPC supplémentaires :
```text
get_block_legacy
get_transaction_legacy
```
Le but est de détecter immédiatement une suppression ou une invisibilité accidentelle d'un wrapper public pendant les futures refactorisations.
## Canarie release-completeness finale
`tests/release_completeness.rs` ajoute :
```text
release_v0_2_4_pre_009_final_http_inventory_and_coverage_partition_are_exact
```
Elle fige explicitement :
```text
52 noms courants exacts
14 noms historiques exacts
4 méthodes Foundation
22 méthodes V0_2_2
11 méthodes V0_2_3
15 méthodes V0_2_4
```
Elle vérifie également les invariants de classification :
```text
courant -> runtime Supported, documentation non Deprecated
Read -> RetrySafe
Simulation -> RetrySafe
WriteSubmission -> NeverAfterDispatch
historique -> Deprecated + Removed + Historical + NotApplicable
```
Cette preuve complète les canaries `KSP-TRANSPORT-007` déjà acquises ; elle ne les remplace pas.
## Compliance `KSP-TRANSPORT-007`
Le document final :
```text
docs/validation/007-V0_2_4_HTTP_FINAL_COMPLIANCE.md
```
consolide la preuve `52/52` et les points sensibles accumulés depuis `0.2.1` :
- ordre et cardinalité des paramètres/réponses ;
- configs omises versus objets explicitement présents ;
- overloads modernes et historiques ;
- validations déterministes avant I/O ;
- préservation `omitted / null / value` ;
- listes positionnelles et ordre provider ;
- `getBlock` moderne + bare encoding legacy ;
- `transactionDetails` complet ;
- SIMD-0118 `numRewardPartitions` ;
- SIMD-0291 `commissionBps` ;
- version transaction numérique non nulle ;
- Economics runtime sans constantes locales inventées ;
- `getInflationReward` positionnel et cardinalité stricte.
## Smoke Transport pur final
Le smoke opt-in :
```text
crates/ksp-onchain-transport-lib/tests/transport_devnet_smoke.rs
```
reste :
- purement Transport ;
- settings construits programmatiquement ;
- read-only ;
- opt-in / ignoré par défaut ;
- indépendant de Config.
Il conserve les appels déjà présents Accounts/Tokens/Cluster/Transactions et ajoute trois appels peu fragiles :
```text
getBlockHeight(finalized)
getInflationRate()
getStakeMinimumDelegation(finalized)
```
Aucune valeur économique exacte n'est codée en dur. Le smoke vérifie uniquement des invariants de santé de réponse.
Le smoke de composition `Config -> Transport -> Devnet` reste une exception transitoire dans `ksp-config-lib` et doit toujours migrer vers une future surface dédiée d'intégration/orchestration/demo.
## Documentation finale `0.2.4`
Sont mis à jour :
```text
ROADMAP.md
crates/ksp-onchain-transport-lib/README.md
crates/ksp-onchain-transport-lib/USAGE.md
docs/000-README.md
docs/architecture/004-COMPONENT_INVENTORY.md
docs/plans/000-README.md
docs/plans/002-FUNCTIONAL_RELEASE_SEQUENCE.md
docs/plans/011-V0_2_4_HTTP_BLOCKS_ECONOMICS_PLAN.md
docs/validation/000-README.md
prompts/000-README.md
```
Le plan `011` passe en version `6` et enregistre le réaudit final sans modifier les contrats RPC déjà matérialisés.
Le raw RPC est désormais décrit comme une surface d'extension provider/diagnostic hors registre standard ; il ne constitue pas une alternative aux `52` wrappers typed standard.
`CHANGELOG.md` reste volontairement inchangé dans cette prerelease : la publication stable et son entrée finale appartiennent à `rel.001`.
## Document de validation final
Ajout :
```text
docs/validation/007-V0_2_4_HTTP_FINAL_COMPLIANCE.md
```
Ce document sert de point de contrôle avant `rel.001`. Il contient notamment :
- le réaudit officiel `52 + 14` ;
- la matrice des `52` méthodes courantes ;
- la matrice des `14` historiques ;
- la partition `4 / 22 / 11 / 15` ;
- le réaudit SIMD ;
- les contrats sensibles Blocks/Economics ;
- les commandes de validation immédiate et finale ;
- les audits `cargo tree` de frontières ;
- les deux smokes Devnet opt-in ;
- les conditions de passage à `rel.001`.
## Prompt `0.2.5 — Wallet foundation`
Ajout :
```text
prompts/010-V0_2_5_START_PROMPT.md
```
Le prompt impose une `0.2.5-pre.001` d'audit + brainstorming + sizing avant toute implémentation cryptographique lourde.
Il cadre notamment :
```text
ksp-wallet-lib
format natif versionné .kspwallet
Wallet -> Core/Logging + primitives crypto/key low-level seulement
Wallet -X-> Config/Transport/Store/Tauri/ExecutionPolicy
pas de crypto maison
pas de secret dans Config
pas de WalletPolicy dans 0.2.5
pas de Wallet Desk dans 0.2.5
```
La sélection du KDF, de l'AEAD, du CSPRNG et de la stratégie de secret en mémoire n'est pas préjugée : elle doit être auditée contre les primitives actuelles lors de `pre.001`.
Le prompt exige également les invariants de sécurité principaux : mauvais mot de passe, tampering, format inconnu/tronqué, redaction, absence de secret en clair, changement de mot de passe sans changement de keypair, persistence atomique/no-clobber et signature vérifiable.
## Fichiers modifiés
```text
Cargo.toml
ROADMAP.md
crates/ksp-onchain-transport-lib/README.md
crates/ksp-onchain-transport-lib/USAGE.md
crates/ksp-onchain-transport-lib/src/lib.rs
crates/ksp-onchain-transport-lib/tests/public_api.rs
crates/ksp-onchain-transport-lib/tests/release_completeness.rs
crates/ksp-onchain-transport-lib/tests/transport_devnet_smoke.rs
docs/000-README.md
docs/architecture/004-COMPONENT_INVENTORY.md
docs/plans/000-README.md
docs/plans/002-FUNCTIONAL_RELEASE_SEQUENCE.md
docs/plans/011-V0_2_4_HTTP_BLOCKS_ECONOMICS_PLAN.md
docs/validation/000-README.md
prompts/000-README.md
```
## Fichiers ajoutés
```text
docs/validation/007-V0_2_4_HTTP_FINAL_COMPLIANCE.md
prompts/010-V0_2_5_START_PROMPT.md
deltas/0.2.4/pre.009.md
```
Aucun fichier n'est supprimé.
## Validation immédiate attendue
Après application de l'overlay :
```bash
cargo fmt --all
cargo check --workspace
cargo clippy --workspace --all-targets
cargo test -p ksp-onchain-transport-lib
```
Compte attendu pour Transport :
```text
240 unit tests OK
27 public API tests OK
22 release-completeness tests OK
1 smoke Devnet ignoré comme prévu
0 échec
```
Le nombre de unit tests reste volontairement stable : `pre.009` ajoute des canaries d'intégration/public API et non une nouvelle logique RPC.
## Checkpoint final avant `rel.001`
Une fois la validation immédiate propre, exécuter aussi :
```bash
cargo test -p ksp-config-lib
cargo test -p ksp-core-lib
cargo test -p ksp-app-config-desk
cargo test --workspace
```
Audits de graphes :
```bash
cargo tree -p ksp-onchain-transport-lib -i ksp-config-lib
cargo tree -p ksp-onchain-transport-lib -i ksp-store-lib
cargo tree -p ksp-onchain-transport-lib -i ksp-program-lib
cargo tree -p ksp-onchain-transport-lib -i tracing
cargo tree -p ksp-config-lib -i ksp-onchain-transport-lib
cargo tree -p ksp-config-lib -i tracing
cargo tree -p ksp-onchain-transport-lib | grep -E 'solana-(client|rpc-client|rpc-client-api)'
cargo tree -p ksp-onchain-transport-lib | grep -E 'ksp-(config|store|program)'
```
Les commandes `cargo tree -i` qui signalent qu'un package n'existe pas dans le graphe sont acceptables lorsqu'elles démontrent précisément l'absence de dépendance recherchée ; le résultat doit être interprété et consigné, pas masqué. Pour `tracing`, une présence transitive sous `ksp-logging-lib` est conforme : l'interdit architectural porte sur une dépendance **directe** de Transport vers `tracing`, pas sur l'absence totale de `tracing` dans son graphe transitif.
Smokes réseau opt-in :
```bash
cargo test -p ksp-onchain-transport-lib --test transport_devnet_smoke -- --ignored --nocapture
cargo test -p ksp-config-lib --test transport_devnet_smoke -- --ignored --nocapture
```
Le premier est le smoke Transport pur durable. Le second reste la composition transitoire `Config -> Transport` déjà documentée.
## Commit attendu
Après validation immédiate et checkpoint final propres :
```text
v0.2.4-pre.009
```
## Suite — `rel.001`
La livraison suivante doit être :
```text
0.2.4-rel.001
```
Elle doit être strictement publicationnelle :
- finaliser `CHANGELOG.md` et les statuts ROADMAP/documents de publication ;
- produire `deltas/0.2.4/rel.001.md` ;
- passer `workspace.package.version` de la prerelease candidate à `0.2.4` ;
- ne pas ajouter de wrapper, DTO, validation RPC ou comportement réseau ;
- rejouer les contrôles de publication nécessaires ;
- créer le tag stable `v0.2.4` après validation et commit de la release.
`0.2.5` ne commence qu'après cette publication stable.