v0.2.9-pre.014
This commit is contained in:
@@ -1,9 +1,9 @@
|
||||
<!-- file: docs/validation/012-V0_2_9_YELLOWSTONE_GRPC.md -->
|
||||
<!-- version: 26 -->
|
||||
<!-- version: 27 -->
|
||||
|
||||
# Validation `0.2.9` — Yellowstone gRPC standard + PublicNode
|
||||
|
||||
**Statut courant : le gate déterministe de `pre.012` est vert sans warning ; le smoke PublicNode live et les graphes Cargo finaux ne figurent pas comme exécutés dans le log opérateur fourni. `pre.012-fix.001` ajoute la règle durable de séparation de fermeture et déplace les gates restants vers `pre.013` technique/live, `pre.014` réconciliation documentaire et `pre.015` publication minimale.**
|
||||
**Statut courant : la validation technique `pre.013-fix.004` est fermée et verte : `clippy --all-targets`, workspace, graphes Cargo, puis smoke PublicNode authentifié Mainnet + Testnet `2/2 PASS`. `pre.014` réconcilie et ferme cette matrice documentaire ; seule la tranche `pre.015` de préparation de publication restera avant `rel.001`.**
|
||||
|
||||
## 1. Autorités et baseline courante
|
||||
|
||||
@@ -40,15 +40,15 @@ Cette baseline est le seuil de non-régression de `pre.012`.
|
||||
|
||||
## 2. Gate dépendances et licence
|
||||
|
||||
| Exigence | Décision / preuve | État |
|
||||
|--------------------------------|------------------------------------------|-------------------|
|
||||
| proto officiel sans vendoring | `yellowstone-grpc-proto ^12.6` | **PASS** |
|
||||
| pas de client upstream runtime | `yellowstone-grpc-client` absent | **PASS** |
|
||||
| runtime Tonic KSP-owned | `tonic ^0.14` + `tonic-prost ^0.14` | **PASS** |
|
||||
| proto subtree compatible | Apache-2.0 selon `LICENSING.md` upstream | **PASS** |
|
||||
| source AGPL copiée | aucune | **PASS** |
|
||||
| raw client Tonic public | aucun | **PASS** |
|
||||
| graph final | réinspection `pre.012` | **PENDING FINAL** |
|
||||
| Exigence | Décision / preuve | État |
|
||||
|--------------------------------|------------------------------------------|----------|
|
||||
| proto officiel sans vendoring | `yellowstone-grpc-proto ^12.6` | **PASS** |
|
||||
| pas de client upstream runtime | `yellowstone-grpc-client` absent | **PASS** |
|
||||
| runtime Tonic KSP-owned | `tonic ^0.14` + `tonic-prost ^0.14` | **PASS** |
|
||||
| proto subtree compatible | Apache-2.0 selon `LICENSING.md` upstream | **PASS** |
|
||||
| source AGPL copiée | aucune | **PASS** |
|
||||
| raw client Tonic public | aucun | **PASS** |
|
||||
| graph final | graphes `pre.013` inspectés | **PASS** |
|
||||
|
||||
Le graphe de dépendances n'est pas modifié par `pre.012`; aucune nouvelle dépendance Cargo n'est introduite dans cette tranche.
|
||||
|
||||
@@ -276,30 +276,33 @@ Les tests V3 démontrent le cas valide et les deux croisements invalides sans ex
|
||||
Profil committé et validé :
|
||||
|
||||
```text
|
||||
profile_id = publicnode_mainnet
|
||||
provider = publicnode
|
||||
cluster = mainnet-beta
|
||||
protocol = solana_yellowstone
|
||||
url = https://solana-yellowstone-grpc.publicnode.com:443 # provider affiche host:port ; KSP ajoute le scheme TLS requis
|
||||
metadata = aucune
|
||||
profile_id = publicnode_mainnet
|
||||
provider = publicnode
|
||||
cluster = mainnet-beta
|
||||
protocol = solana_yellowstone
|
||||
url = https://solana-yellowstone-grpc.publicnode.com:443
|
||||
secret_metadata = x-token <- ${KSP_SECRET_PUBLICNODE_MAINNET_GRPC_X_TOKEN}
|
||||
```
|
||||
|
||||
Le mapping produit un endpoint TLS Yellowstone standard ; le test `committed_v3_publicnode_mainnet_maps_provider_neutral_yellowstone_grpc` passe et `Debug` ne doit pas exposer l'URL.
|
||||
Le mapping produit un endpoint TLS Yellowstone standard et une metadata secrète redacted. Le smoke final ouvre `Subscribe`, reçoit un update `Slot` non nul et ferme de manière bornée : **PASS**.
|
||||
|
||||
### 8.5 PublicNode Testnet
|
||||
|
||||
Verdict final documentaire : **EXTERNAL BLOCK, NOT GUESSED**.
|
||||
|
||||
Le réaudit officiel du 2026-08-24 confirme une capacité Solana Testnet gRPC chez PublicNode, mais l'hostname exact n'a pas été obtenu depuis une source PublicNode suffisamment autoritative. Aucun profil, aucun hostname déduit et aucun smoke Testnet ne sont versionnés.
|
||||
Profil committé et validé :
|
||||
|
||||
```text
|
||||
capacité Testnet gRPC confirmée
|
||||
hostname exact non confirmé
|
||||
profil KSP absent
|
||||
smoke KSP absent
|
||||
raison interdiction d'inventer un endpoint provider
|
||||
profile_id = publicnode_testnet
|
||||
provider = publicnode
|
||||
cluster = testnet
|
||||
protocol = solana_yellowstone
|
||||
url = https://solana-testnet-yellowstone-grpc.publicnode.com:443
|
||||
secret_metadata = x-token <- ${KSP_SECRET_PUBLICNODE_TESTNET_GRPC_X_TOKEN}
|
||||
```
|
||||
|
||||
Le hostname exact a été fourni par l'opérateur puis validé par le smoke live. `Subscribe` reçoit un update `Slot` non nul : **PASS**.
|
||||
|
||||
Le même personal token opérateur a été validé sur les deux réseaux. Les deux variables KSP restent distinctes afin de permettre des valeurs différentes si la policy provider change ; cette modélisation ne constitue pas une preuve que les tokens PublicNode sont network-scoped.
|
||||
|
||||
## 9. Provider-neutrality
|
||||
|
||||
| Point | Verdict |
|
||||
@@ -326,107 +329,96 @@ Transport -> std::env KSP_* interdit
|
||||
tracing direct Transport interdit
|
||||
```
|
||||
|
||||
`pre.012` ne modifie pas le runtime Transport ; elle ajoute uniquement un smoke live ignoré par défaut et de la documentation/audit. Son seuil de non-régression est la baseline `pre.011`.
|
||||
La baseline `pre.011` reste conservée. Les changements `pre.013` ont porté uniquement le gate live, la Config PublicNode/Testnet et le harness de smoke ; le gate final `pre.013-fix.004` confirme les non-régressions workspace.
|
||||
|
||||
## 11. Historique des gates fermé
|
||||
|
||||
Les détails de commandes, warnings corrigés et fichiers exacts restent dans leurs deltas immuables.
|
||||
|
||||
| Tranche | Gate consolidé |
|
||||
|-----------------------------------|--------------------------------------|
|
||||
| `pre.001` + `fix.001` + `fix.002` | audit/sizing/providers/licence fermé |
|
||||
| `pre.002` + `fix.001` + `fix.002` | moteur/settings/channel fermé |
|
||||
| `pre.003` + `fix.001` | TLS/metadata/unary fermé |
|
||||
| `pre.004` + `fix.001` | Subscribe common fermé |
|
||||
| `pre.005` + `fix.001` | Accounts/Slots fermé |
|
||||
| `pre.006` | namespace HTTP fermé |
|
||||
| `pre.007` | Transactions fermé |
|
||||
| `pre.008` + `fix.001` | Blocks fermé |
|
||||
| `pre.009` + `fix.001` | bidi/backpressure fermé |
|
||||
| `pre.010` + `fix.001` | reconnect/replay fermé sans warning |
|
||||
| `pre.011` | Config V3/PublicNode mapping fermé |
|
||||
| Tranche | Gate consolidé |
|
||||
|-----------------------------------|---------------------------------------|
|
||||
| `pre.001` + `fix.001` + `fix.002` | audit/sizing/providers/licence fermé |
|
||||
| `pre.002` + `fix.001` + `fix.002` | moteur/settings/channel fermé |
|
||||
| `pre.003` + `fix.001` | TLS/metadata/unary fermé |
|
||||
| `pre.004` + `fix.001` | Subscribe common fermé |
|
||||
| `pre.005` + `fix.001` | Accounts/Slots fermé |
|
||||
| `pre.006` | namespace HTTP fermé |
|
||||
| `pre.007` | Transactions fermé |
|
||||
| `pre.008` + `fix.001` | Blocks fermé |
|
||||
| `pre.009` + `fix.001` | bidi/backpressure fermé |
|
||||
| `pre.010` + `fix.001` | reconnect/replay fermé sans warning |
|
||||
| `pre.011` | Config V3/PublicNode mapping fermé |
|
||||
| `pre.012` + `fix.001` | réaudit + règles de fermeture |
|
||||
| `pre.013` + `fix.001`–`fix.004` | live PublicNode + graphes fermé |
|
||||
| `pre.014` | réconciliation documentaire candidate |
|
||||
|
||||
Cette table remplace les anciens appendices numérotés successivement `19.x`, `20`, `21`, etc. qui rendaient le document ambigu.
|
||||
|
||||
## 12. Verdict opérateur `pre.012`
|
||||
## 12. Verdict opérateur consolidé jusqu'à `pre.013-fix.004`
|
||||
|
||||
### 12.1 Gate déterministe reçu
|
||||
Le gate technique final reçu le 2026-08-24 est :
|
||||
|
||||
| Exigence | Résultat opérateur |
|
||||
|----------------------------------------------|--------------------------------------|
|
||||
| `cargo fmt --all` | **PASS** |
|
||||
| audit Rust workspace | **PASS, 0 candidate export** |
|
||||
| audit Markdown | **PASS, 87 tableaux / 252 fichiers** |
|
||||
| `cargo check --workspace` | **PASS** |
|
||||
| `cargo clippy --workspace --all-targets` | **PASS sans warning** |
|
||||
| Config unit | **113/113 PASS** |
|
||||
| Config public API | **15/15 PASS** |
|
||||
| Config ownership | **5/5 PASS** |
|
||||
| Transport unit | **383/383 PASS** |
|
||||
| Transport public API | **49/49 PASS** |
|
||||
| Transport release completeness | **43/43 PASS** |
|
||||
| Transport doctests | **4/4 PASS** |
|
||||
| workspace dependencies | **3/3 PASS** |
|
||||
| `cargo test --workspace` | **PASS** |
|
||||
| smoke Mainnet programmatique sans credential | **NOT RUN, ignored** |
|
||||
| graphes Cargo finaux | **NOT PROVIDED / NOT RUN** |
|
||||
| Exigence | Résultat opérateur |
|
||||
|-----------------------------------------------|--------------------------------------|
|
||||
| `cargo fmt --all` | **PASS** |
|
||||
| audit Rust workspace | **PASS, 0 candidate export** |
|
||||
| audit Markdown | **PASS, 87 tableaux / 258 fichiers** |
|
||||
| `cargo check --workspace` | **PASS** |
|
||||
| `cargo clippy --workspace --all-targets` | **PASS sans warning** |
|
||||
| Transport unit | **383/383 PASS** |
|
||||
| Transport public API | **49/49 PASS** |
|
||||
| Transport release completeness | **43/43 PASS** |
|
||||
| Transport doctests | **4/4 PASS** |
|
||||
| Config unit dans workspace | **113/113 PASS** |
|
||||
| Config ownership dans workspace | **5/5 PASS** |
|
||||
| Config public API dans workspace | **15/15 PASS** |
|
||||
| workspace dependencies | **3/3 PASS** |
|
||||
| `cargo test --workspace` | **PASS** |
|
||||
| graphes Cargo finaux | **PASS / inspectés** |
|
||||
| smoke PublicNode Mainnet `Subscribe` + `Slot` | **PASS** |
|
||||
| smoke PublicNode Testnet `Subscribe` + `Slot` | **PASS** |
|
||||
| smoke live total | **2/2 PASS** |
|
||||
|
||||
Le test `yellowstone_publicnode_smoke` compile et apparaît correctement comme `ignored` dans les tests Transport et workspace, mais cela ne constitue pas une exécution live. Aucune preuve de `cargo tree` final n'est présente dans le log fourni.
|
||||
|
||||
### 12.2 Effet de `pre.012-fix.001`
|
||||
|
||||
Le fix ne change ni runtime, ni schema, ni Config, ni smoke. Il corrige le workflow de fermeture afin que les responsabilités restantes ne soient plus mélangées :
|
||||
Les graphes résolus confirment la stack attendue :
|
||||
|
||||
```text
|
||||
pre.013 technique/live : smoke PublicNode + graphes Cargo finaux
|
||||
pre.014 réconciliation documentaire : plan/validation/README/USAGE/références
|
||||
pre.015 publication minimale : prompt suivant + CHANGELOG + ROADMAP
|
||||
rel.001 mécanique stable uniquement
|
||||
yellowstone-grpc-proto 12.6.0
|
||||
tonic 0.14.6
|
||||
tonic-prost 0.14.6
|
||||
prost 0.14.4
|
||||
prost-types 0.14.4
|
||||
yellowstone-grpc-client absent du runtime KSP
|
||||
```
|
||||
|
||||
Le contenu prompt/README/USAGE déjà préparé en `pre.012` n'est pas supprimé rétroactivement. Le prompt reste un brouillon jusqu'à `pre.015` ; README/USAGE seront réconciliés définitivement en `pre.014`.
|
||||
Les graphes ont été exécutés avant `pre.013-fix.004`; ils restent valides car `fix.004` n'a modifié ni dépendance ni feature Cargo.
|
||||
|
||||
## 13. Gate `pre.013` — technique/live
|
||||
## 13. Verdict PublicNode live final
|
||||
|
||||
Commandes minimales :
|
||||
Les essais intermédiaires ont établi deux faits utiles : les appels sans credential peuvent atteindre le service mais recevoir `PERMISSION_DENIED`, et la validation représentative de la foundation doit porter sur `Subscribe` plutôt que sur une unary provider éventuellement restreinte.
|
||||
|
||||
```bash
|
||||
cargo fmt --all
|
||||
python3 scripts/audit_rust_workspace_rules.py
|
||||
cargo check --workspace
|
||||
cargo clippy --workspace --all-targets
|
||||
cargo tree -p ksp-onchain-transport-lib
|
||||
cargo tree -p ksp-onchain-transport-lib --duplicates
|
||||
cargo tree --duplicates
|
||||
cargo test -p ksp-onchain-transport-lib --test yellowstone_publicnode_smoke -- --ignored --nocapture
|
||||
```
|
||||
|
||||
Verdicts attendus :
|
||||
Le smoke final :
|
||||
|
||||
```text
|
||||
smoke Mainnet réellement exécuté
|
||||
GetVersion + GetSlot via TLS sans credential ou incident externe précisément classifié
|
||||
graphes Cargo inspectés
|
||||
aucun changement README/USAGE/prompt/CHANGELOG/ROADMAP
|
||||
reçoit deux personal tokens par stdin, Mainnet puis Testnet
|
||||
accepte que les deux lignes contiennent la même valeur
|
||||
construit une metadata secrète x-token
|
||||
ouvre TLS puis Subscribe
|
||||
filtre slots
|
||||
attend un YellowstoneSubscribeUpdate::Slot sous timeout
|
||||
exige slot > 0
|
||||
ferme de manière bornée
|
||||
n'expose aucun secret dans URL/Debug/arguments
|
||||
```
|
||||
|
||||
Un défaut local découvert dans ce gate reste dans `pre.013-fix.NNN`. Un incident externe n'est jamais maquillé en PASS local.
|
||||
Résultat opérateur final : **Mainnet PASS, Testnet PASS, 2/2**.
|
||||
|
||||
Le timeout KSP de half-close est un résultat accepté par le harness uniquement après réception prouvée d'un slot ; le runtime conserve son contrat de timeout explicite.
|
||||
|
||||
## 14. Gate `pre.014` — réconciliation documentaire
|
||||
|
||||
Cette tranche ferme les documents durables après le gate technique réel :
|
||||
Cette tranche ne modifie ni runtime, ni Config, ni schema, ni smoke. Elle synchronise le plan, la présente validation, README/USAGE Transport et les références durables avec les faits exécutés en `pre.013`.
|
||||
|
||||
```text
|
||||
plan 016
|
||||
validation 012
|
||||
README/USAGE Transport
|
||||
documents de référence 0.2.9 réellement concernés
|
||||
audit Markdown des documents touchés
|
||||
```
|
||||
|
||||
Elle n'introduit aucun nouveau runtime/smoke et ne finalise pas `CHANGELOG.md`, `ROADMAP.md` ni le prompt suivant.
|
||||
|
||||
Le verdict de la validation 012 devient définitif dans cette tranche, sur la base exclusive des preuves réellement exécutées en `pre.013` et des gates antérieurs.
|
||||
Le verdict technique de `0.2.9` est donc **PASS**. Après le gate documentaire `pre.014`, seuls le prompt suivant, `CHANGELOG.md` et `ROADMAP.md` restent à finaliser en `pre.015`.
|
||||
|
||||
## 15. Gate `pre.015` — préparation de publication
|
||||
|
||||
@@ -463,8 +455,9 @@ resource/backpressure/lifecycle verts
|
||||
reconnect/replay sans promesse lossless
|
||||
Config V3 backward V1/V2
|
||||
provider/protocol distincts
|
||||
PublicNode Mainnet live exécuté avec résultat consigné
|
||||
Testnet jamais inventé
|
||||
PublicNode Mainnet live Subscribe + Slot PASS
|
||||
PublicNode Testnet live Subscribe + Slot PASS
|
||||
x-token secret requis par les profils PublicNode, aucun secret versionné
|
||||
HTTP/WS/Helius non régressés
|
||||
dependency firewall vert
|
||||
cargo graphs inspectés
|
||||
|
||||
Reference in New Issue
Block a user