Files
khadhroony-solana-project/deltas/0.2.9/pre.011.md
2026-08-24 19:53:45 +02:00

285 lines
8.4 KiB
Markdown

<!-- file: deltas/0.2.9/pre.011.md -->
<!-- version: 1 -->
# Delta `0.2.9-pre.011` — Config Transport V3 + PublicNode Mainnet + consolidation documentaire
## 1. Base et version
Base immédiate :
```text
0.2.9-pre.010-fix.001
Cargo workspace = 0.2.9-pre.10.fix.1
```
Version candidate :
```text
0.2.9-pre.011
Cargo workspace = 0.2.9-pre.11
```
Le gate opérateur fourni pour `pre.010-fix.001` est entièrement vert : fmt/audit/check/Clippy sans warning, Transport 383 unit + 49 public API + 43 release-completeness + 4 doctests, dependency canary 3/3 et `cargo test --workspace` PASS.
## 2. Objet
Cette tranche matérialise la frontière Config décidée par `pre.001` puis différée jusqu'après le lifecycle/reconnect Yellowstone :
```text
std.transport V3
Config -> YellowstoneGrpcTransportSettings
provider et protocol distincts
metadata publique et secrète avec provenance contrôlée
premier profil PublicNode Mainnet standard
backward V1/V2 strict
```
Elle profite aussi du changement de phase de la release pour remettre le plan `016` et la validation `012` dans un état maintenable. Les détails historiques ne sont pas supprimés : ils restent dans les deltas immuables `deltas/0.2.9/`.
## 3. Config Transport V3
### 3.1 Schema
`config/schemas/std.transport.schema.json` devient `urn:ksp:schema:std.transport:v3` et conserve trois branches strictes :
```text
V1 = HTTP-only
V2 = HTTP + WebSocket
V3 = HTTP + WebSocket + Yellowstone gRPC optionnel par profil
```
V3 ajoute :
```text
grpc_defaults
grpc_endpoints[]?
```
`grpc_defaults` mappe uniquement des knobs déjà possédés par `YellowstoneGrpcSessionSettings` : timeouts, reconnect, channel capacities et max message sizes. Les bounds des filtres Subscribe restent un contrat Transport et ne sont pas transformés en configuration arbitraire.
Chaque endpoint gRPC contient :
```text
name
enabled
provider
cluster
protocol = solana_yellowstone
url
metadata[]?
secret_metadata[]?
session?
```
### 3.2 Mapping Config -> Transport
`ResolvedTransportConfig` ajoute :
```text
grpc_settings()
into_all_transport_settings()
```
L'accesseur historique suivant est volontairement inchangé :
```text
into_transport_settings() -> (HttpTransportSettings, Option<WsTransportSettings>)
```
Cela évite une rupture source silencieuse des consumers V2.
V1 et V2 retournent toujours `None` pour gRPC. Un profil V3 qui n'a pas de `grpc_endpoints` retourne également `None` au lieu d'inventer un Transport gRPC vide.
### 3.3 Protocol vs provider
Config exige actuellement :
```text
protocol = solana_yellowstone
```
Le champ `provider` reste descriptif et mappe vers `YellowstoneGrpcProviderName`.
Donc :
```text
PublicNode != protocole
PublicNode != nouvelle façade Transport
PublicNode = environnement d'exécution du standard Yellowstone
```
Toute future divergence provider doit rester un delta N3 explicite.
### 3.4 Metadata et provenance
Deux classes sont matérialisées :
```text
metadata
secret_metadata
```
Règles avant mapping :
```text
metadata + provenance KSP_SECRET_*/KSPB_SECRET_* -> reject
secret_metadata sans provenance secret -> reject
secret_metadata + provenance non-secret env -> reject
secret_metadata + provenance secret -> accept
```
Les segments littéraux autour d'un placeholder secret restent permis. Config possède la provenance et la projection sûre ; Transport reçoit ensuite seulement les `YellowstoneGrpcMetadataEntry` déjà classifiées.
Aucun nom d'environnement n'est lu dans Transport.
## 4. Profil PublicNode Mainnet
La surface publique réauditée le 2026-08-24 confirme Yellowstone gRPC Solana Mainnet et affiche :
```text
solana-yellowstone-grpc.publicnode.com:443
```
`YellowstoneGrpcEndpointUrl` exige une URL `http/https`; le document Config représente donc ce même endpoint TLS comme `https://solana-yellowstone-grpc.publicnode.com:443`.
Le document committé ajoute :
```text
profile_id = publicnode_mainnet
provider = publicnode
cluster = mainnet-beta
protocol = solana_yellowstone
metadata = aucune
```
Le profil générique `mainnet_public` reste distinct et ne reçoit pas implicitement un endpoint PublicNode.
PublicNode expose également Solana Testnet gRPC, mais le hostname exact n'a pas été obtenu depuis une source suffisamment autoritative/indexable pendant cette tranche. Aucun endpoint supposé n'est versionné. `pre.012` réaudite cette valeur avant tout profil/smoke Testnet.
## 5. Tests ajoutés/étendus
La fixture V3 couvre :
```text
mapping gRPC valide
merge grpc_defaults + session overrides
metadata publique issue de KSP_PUBLIC_*
secret_metadata issue de KSP_SECRET_*
safe_value avec segment secret redacted
rejet public <- secret
rejet secret <- public
```
Le config committé couvre le profil `publicnode_mainnet` et vérifie la construction d'un `YellowstoneGrpcTransportSettings` valide sans URL dans son `Debug`.
Le canari public API inclut les nouveaux accessors sans supprimer les anciens.
## 6. Consolidation plan/validation
`docs/plans/016-V0_2_9_YELLOWSTONE_GRPC_PLAN.md` et `docs/validation/012-V0_2_9_YELLOWSTONE_GRPC.md` sont réorganisés autour de :
```text
état courant
scope/architecture stabilisés
matrices protocole encore normatives
Config V3
PublicNode
lifecycle/replay
historique compact des gates fermés
forecast restant
critères de clôture
```
Les longues sections append-only propres à chaque prerelease sont remplacées par une table compacte renvoyant aux deltas immuables. Aucun delta historique n'est modifié.
Les tableaux Markdown sont reformattés selon la convention JetBrains RustRover utilisée dans le workspace : largeur calculée sur la cellule la plus large et un espace de padding autour du contenu.
## 7. Documentation Config synchronisée
La README et l'USAGE de `ksp-config-lib`, ainsi que les commentaires du registre, sont mis à jour pour ne plus présenter `std.transport` comme un document uniquement V2 HTTP + WebSocket.
La documentation finale spécifique Transport/Yellowstone reste un gate de `pre.012`.
## 8. Fichiers modifiés/ajoutés
```text
Cargo.toml
config/std.transport.json
config/schemas/std.transport.schema.json
crates/ksp-config-lib/README.md
crates/ksp-config-lib/USAGE.md
crates/ksp-config-lib/src/lib.rs
crates/ksp-config-lib/src/registry.rs
crates/ksp-config-lib/src/transport.rs
crates/ksp-config-lib/tests/public_api.rs
crates/ksp-config-lib/unit_tests/transport.rs
crates/ksp-config-lib/unit_tests/fixtures_v3/std.transport.json
docs/plans/016-V0_2_9_YELLOWSTONE_GRPC_PLAN.md
docs/validation/012-V0_2_9_YELLOWSTONE_GRPC.md
deltas/0.2.9/pre.011.md
```
Aucune dépendance Cargo n'est ajoutée ou modifiée.
## 9. Validation source disponible avant livraison
Exécuté dans l'environnement de préparation :
```text
python3 scripts/audit_rust_workspace_rules.py
General Rust rule audit: clean
Rust export completeness audit: 0 candidate(s)
KSP workspace Rust rule audit: clean
JSON Schema Draft 2020-12 meta-validation: PASS
config/std.transport.json against V3 schema: PASS
fixture V2 against V3 schema: PASS
fixture V1 against V3 schema: PASS
fixture V3 against V3 schema: PASS
```
Cargo/Rustfmt ne sont pas disponibles dans l'environnement de préparation. Aucune compilation ou test Cargo n'est donc déclaré réussi pour `pre.011` avant gate opérateur.
## 10. Gate opérateur requis
```bash
cargo fmt --all
python3 scripts/audit_rust_workspace_rules.py
cargo check --workspace
cargo clippy --workspace --all-targets
cargo test -p ksp-config-lib
cargo test -p ksp-config-lib --test public_api
cargo test -p ksp-config-lib --test ownership
cargo test -p ksp-onchain-transport-lib
cargo test -p ksp-core-lib --test workspace_dependencies
cargo test --workspace
```
Attentes de candidate :
```text
Config unit 113 attendus (110 baseline + 3 V3)
Config public API 15 attendus
Config ownership 5 attendus
Transport unit >= 383
Transport public API >= 49
Transport completeness >= 43
Transport doctests 4
workspace dependencies 3
Clippy aucun warning
workspace PASS
```
Ces valeurs ne deviennent des résultats qu'après exécution opérateur.
## 11. Suite
Après fermeture de `pre.011` :
```text
pre.012 PublicNode live + Testnet endpoint re-audit + compliance finale + cargo graphs + docs/prompt suivant
rel.001 publication stable stricte
```
Si `pre.012` ne peut pas fermer proprement tous les gates dans une seule tranche, continuer avec `pre.013+` plutôt que compacter artificiellement la clôture.