v0.2.10-pre.002-fix.001

This commit is contained in:
2026-08-25 14:17:40 +02:00
parent af807afff5
commit 1967e845b0
8 changed files with 464 additions and 174 deletions

View File

@@ -1,9 +1,9 @@
<!-- file: docs/validation/013-V0_2_10_ORBITFLARE_YELLOWSTONE_GRPC.md -->
<!-- version: 2 -->
<!-- version: 3 -->
# Validation `0.2.10` — OrbitFlare Yellowstone gRPC
**Statut courant : `0.2.10-pre.002` matérialise le profil Config V3 OrbitFlare Devnet et le smoke opt-in de caractérisation sur le standard Yellowstone KSP inchangé. Les preuves statiques sont fermées ; `connect`, `Subscribe`, `Slot` et `Ping` restent `PENDING` jusqu'au run live opérateur.**
**Statut courant : `0.2.10-pre.002` est commité et son gate statique/workspace est vert. Son live sans metadata a atteint OrbitFlare mais `SubscribeOpen` a été rejeté `Unauthenticated`. `0.2.10-pre.002-fix.001` corrige lauth en License Key `ORBIT-*` transmise comme secret `x-token`, sans modification N1/N2. Le rerun authentifié `Subscribe -> Slot + Ping` reste `PENDING OPERATOR`.**
## 1. Autorités
@@ -55,17 +55,17 @@ Toute modification de `grpc_stream.rs`, `grpc_channel.rs`, `grpc_settings.rs`, `
## 4. Pricing et réseau
| Point | Preuve actuelle | Verdict |
|----------------------|------------------------------------------|-------------|
| plan Solana Free | 0 USD par mois | **PASS** |
| gRPC Free | Devnet only | **PASS** |
| RPS Free | 10 | INFO |
| TPS Free | 1 | INFO |
| crédit | unlimited dans le RPS | INFO |
| Devnet gRPC endpoint | `http://devnet.rpc.orbitflare.com:10000` | **PASS** |
| Devnet live KSP | non encore exécuté | **PENDING** |
| Mainnet gratuit | non documenté | **OUT** |
| Testnet endpoint | non prouvé | **UNKNOWN** |
| Point | Preuve actuelle | Verdict |
|----------------------|------------------------------------------|---------------|
| plan Solana Free | 0 USD par mois | **PASS** |
| gRPC Free | Devnet only | **PASS** |
| RPS Free | 10 | INFO |
| TPS Free | 1 | INFO |
| crédit | unlimited dans le RPS | INFO |
| Devnet gRPC endpoint | `http://devnet.rpc.orbitflare.com:10000` | **PASS** |
| Devnet live KSP | service atteint, Subscribe auth rejeté | **AUTH GATE** |
| Mainnet gratuit | non documenté | **OUT** |
| Testnet endpoint | non prouvé | **UNKNOWN** |
Sources :
@@ -88,18 +88,29 @@ KSP ne prétend pas qu'un canal gRPC plaintext bénéficie d'une sécurité TLS
## 6. Auth classification
| Élément | Usage prouvé | Verdict |
|-----------------------------|--------------------------------|-----------------------|
| `X-ORBIT-KEY` | Customer API | **CONTROL-PLANE** |
| Bearer Customer API | Customer API v2 | **CONTROL-PLANE** |
| RPC `api_key` | Solana HTTP RPC | **HTTP ONLY** |
| API key compte opérateur | CLI/Customer API | **NOT GRPC PROOF** |
| token gRPC Dashboard | quickstart Yellowstone | **ACCOUNT DEPENDENT** |
| metadata upstream `x-token` | mécanisme Yellowstone standard | **POSSIBLE** |
| aucune metadata gRPC | SDK Go OrbitFlare | **DOCUMENTED** |
| auth Devnet Free réelle | smoke KSP à exécuter | **PENDING** |
| Élément | Usage prouvé | Verdict |
|-----------------------|-----------------------------|------------------------------|
| `X-ORBIT-KEY` | Customer API | **CONTROL-PLANE** |
| Bearer Device Flow | Customer API v2 | **CONTROL-PLANE** |
| RPC `api_key` | Solana HTTP RPC | **HTTP ONLY** |
| License Key `ORBIT-*` | produit Solana Free | **DATA-PLANE PROVIDER** |
| metadata `x-token` | Yellowstone gRPC OrbitFlare | **REQUIRED / PROVEN DOC** |
| sans metadata | live KSP `pre.002` | **REJECTED UNAUTHENTICATED** |
| IP whitelist | autre mode produit | **NOT ACTIVE FOR OPERATOR** |
Aucun secret opérateur nest demandé pour le premier smoke `pre.002` ; la tentative initiale est explicitement sans metadata.
Preuve live `pre.002` :
```text
grpc_operation = SubscribeOpen
grpc_status = Unauthenticated
grpc_code = The request does not have valid authentication credentials
```
Preuve provider : la référence Yellowstone OrbitFlare construit le client avec `X_TOKEN = ORBITFLARE_LICENSE_KEY` et indique que le token est porté par la metadata gRPC `x-token`.
Le Dashboard opérateur classe le produit `Solana Free` en `API Key Mode Active`. La License Key est donc le secret data-plane à utiliser ; elle nest pas une `X-ORBIT-KEY` Customer API.
Le CLI OrbitFlare courant nest pas utilisé comme oracle positif pour lauth gRPC : après stockage de la License Key, `orbitflare ping --service grpc --network devnet` retourne `invalid x-token: api key not found`, et son implémentation courante ninjecte pas le secret dans le canal gRPC.
## 7. Heartbeat
@@ -163,28 +174,36 @@ Ces valeurs restent provider-owned et ne deviennent pas des validations généri
## 11. Config V3
| Exigence | Verdict |
|-------------------------------------|-----------------|
| nouveau format Config nécessaire | **NO** |
| `provider = orbitflare` | **PASS STATIC** |
| `protocol = solana_yellowstone` | **PASS STATIC** |
| `cluster = devnet` | **PASS STATIC** |
| Devnet URL publique | **PASS STATIC** |
| secret metadata par défaut | **NO / PASS** |
| `X-ORBIT-KEY` dans Transport Config | **FORBID** |
| `x-token` si token gRPC prouvé | **DEFER** |
| heartbeat dans `grpc_defaults` | **NO** |
| Exigence | Verdict |
|---------------------------------------|-----------------|
| nouveau format Config nécessaire | **NO** |
| `provider = orbitflare` | **PASS STATIC** |
| `protocol = solana_yellowstone` | **PASS STATIC** |
| `cluster = devnet` | **PASS STATIC** |
| Devnet URL publique | **PASS STATIC** |
| secret metadata `x-token` | **REQUIRED** |
| valeur License Key via `KSP_SECRET_*` | **PASS DESIGN** |
| `X-ORBIT-KEY` dans Transport Config | **FORBID** |
| heartbeat dans `grpc_defaults` | **NO** |
`pre.002-fix.001` corrige le profil en :
```text
secret_metadata = x-token <- ${KSP_SECRET_ORBITFLARE_DEVNET_GRPC_X_TOKEN}
```
La valeur effective doit rester redacted dans toutes les projections safe/debug.
## 12. Smoke Devnet attendu
Premier smoke :
Smoke corrigé :
```text
Config/fixture -> YellowstoneGrpcEndpointSettings
License Key lue sur stdin
YellowstoneGrpcMetadataEntry::secret("x-token", ...)
provider = orbitflare
cluster = devnet
url = http://devnet.rpc.orbitflare.com:10000
metadata vide
open standard Subscribe
request slots confirmed
receive Slot non nul
@@ -194,15 +213,18 @@ close borné
Verdicts actuels :
| Preuve | Verdict |
|------------------------------|----------------------------|
| endpoint parsé par Config/N1 | **PASS STATIC** |
| connect Devnet | **PENDING** |
| Subscribe accepté | **PENDING** |
| Slot reçu | **PENDING** |
| server Ping reçu | **PENDING** |
| auto reply KSP déterministe | **PASS N1** |
| close borné | **PASS N1 / LIVE PENDING** |
| Preuve | Verdict |
|----------------------------------------------|--------------------------------|
| endpoint parsé par N1 | **PASS STATIC** |
| sans metadata | **FAIL EXPECTED / CLASSIFIED** |
| secret `x-token` représentable par Config V3 | **PASS STATIC** |
| License Key redacted | **PASS STATIC** |
| connect authentifié | **PENDING OPERATOR** |
| Subscribe authentifié | **PENDING OPERATOR** |
| Slot reçu | **PENDING OPERATOR** |
| server Ping reçu | **PENDING OPERATOR** |
| auto reply KSP déterministe | **PASS N1** |
| close borné | **PASS N1 / LIVE PENDING** |
## 13. Provider overlay gate
@@ -266,48 +288,75 @@ ownership/close provider bornés
Verdict :
```text
architecture/sizing gate = POSITIVE
operator pre.001 gate = PASS
pre.002 static gate = READY FOR OPERATOR VALIDATION
live provider gate = PENDING pre.002 characterization
architecture/sizing gate = POSITIVE
operator pre.001 gate = PASS
pre.002 static/workspace gate = PASS
pre.002 live auth hypothesis = FAIL CLASSIFIED
pre.002-fix.001 static gate = READY FOR OPERATOR VALIDATION
live provider gate = PENDING authenticated characterization
```
## 16. Gate `pre.002` candidat
## 16. Gate `pre.002` commité
| Critère | Verdict |
|-------------------------------------------|----------------------|
| Cargo `0.2.10-pre.2` | **PASS STATIC** |
| profil Config `orbitflare_devnet` | **PASS STATIC** |
| endpoint gRPC sans metadata | **PASS STATIC** |
| companions HTTP/WS Devnet préservés | **PASS STATIC** |
| nouveau format Config | **NO** |
| `.env.example` / secret OrbitFlare ajouté | **NO** |
| moteur N1 modifié | **NO** |
| standard N2 modifié | **NO** |
| SDK OrbitFlare ajouté | **NO** |
| smoke provider dans Transport | **PASS STATIC** |
| reconnect du smoke | zéro retry |
| fenêtre caractérisation | 45 secondes |
| `Subscribe -> Slot` live | **PENDING OPERATOR** |
| `SubscribeUpdate::Ping` live | **PENDING OPERATOR** |
| close live | **PENDING OPERATOR** |
| auth Devnet Free sans metadata | **PENDING OPERATOR** |
Validation opérateur du 2026-08-25 :
Commande live dédiée :
| Critère | Verdict |
|------------------------------------------|---------------------------------|
| Cargo `0.2.10-pre.2` | **PASS** |
| `cargo fmt --all` | **PASS** |
| audit Rust | **PASS** |
| audit Markdown | **PASS / 98 tables / 98 files** |
| `cargo check --workspace` | **PASS** |
| `cargo clippy --workspace --all-targets` | **PASS** |
| Config unit | **114 sur 114 PASS** |
| Transport unit | **383 sur 383 PASS** |
| Transport public API | **49 sur 49 PASS** |
| Transport release completeness | **43 sur 43 PASS** |
| workspace test | **PASS** |
| graphes Transport | **FOURNIS / PAS DE CONFLIT N1** |
| moteur N1 modifié | **NO** |
| standard N2 modifié | **NO** |
| live sans metadata | **FAIL CLASSIFIED** |
| `SubscribeOpen` | **UNAUTHENTICATED** |
Le failure live est un résultat de caractérisation utile et non une régression du moteur. Il impose un fix de configuration/auth provider parce que `pre.002` est déjà commité.
## 17. Gate `pre.002-fix.001`
| Critère | Verdict |
|-----------------------------------------------------------------|----------------------|
| Cargo `0.2.10-pre.2.fix.1` | **PASS STATIC** |
| `.env.example` inventorie le secret OrbitFlare | **PASS STATIC** |
| Config `secret_metadata` contient `x-token` | **PASS STATIC** |
| valeur provenant de `KSP_SECRET_ORBITFLARE_DEVNET_GRPC_X_TOKEN` | **PASS STATIC** |
| test Config prouve redaction et classification secrète | **PASS STATIC** |
| smoke lit la License Key sur stdin | **PASS STATIC** |
| secret absent des arguments CLI | **PASS STATIC** |
| moteur N1 modifié | **NO** |
| standard N2 modifié | **NO** |
| SDK OrbitFlare ajouté | **NO** |
| connect authentifié | **PENDING OPERATOR** |
| `Subscribe -> Slot` live | **PENDING OPERATOR** |
| `SubscribeUpdate::Ping` live | **PENDING OPERATOR** |
| close live | **PENDING OPERATOR** |
Commande live dédiée, avec secret saisi sans linscrire dans lhistorique :
```bash
cargo test -p ksp-onchain-transport-lib --test yellowstone_orbitflare_smoke -- --ignored --nocapture
read -rsp 'OrbitFlare License Key: ' ORBITFLARE_LICENSE_KEY; echo
printf '%s\n' "$ORBITFLARE_LICENSE_KEY" | cargo test -p ksp-onchain-transport-lib --test yellowstone_orbitflare_smoke -- --ignored --nocapture
unset ORBITFLARE_LICENSE_KEY
```
Le résultat live décide la suite :
Interprétation :
```text
Slot + Ping PASS
-> OrbitFlare reste standard ; aucun provider heartbeat/facade
-> auth et heartbeat standards composables ; pre.003 devient gate technique/live final
connection/auth failure
-> classifier le service/licence réel avant toute metadata
Subscribe/Slot PASS mais Ping absent
-> divergence heartbeat provider à traiter au-dessus de N1/N2 dans pre.003
Slot PASS mais Ping absent
-> divergence heartbeat à prouver avant une couche provider-specific
auth encore rejetée avec la License Key x-token
-> blocker provider/account à qualifier ; ne jamais modifier N1 pour contourner le gate
```