# Validation `0.2.10` — OrbitFlare Yellowstone gRPC **Statut courant : `0.2.10-pre.003` ferme le gate technique/live final. Le workspace complet est vert, les graphes Cargo ont été inspectés et le smoke OrbitFlare Devnet authentifié par License Key `ORBIT-*` en secret `x-token` observe `Subscribe -> Slot + Ping` puis ferme proprement. N1/N2 restent inchangés ; `pre.004` réconcilie uniquement la documentation finale.** ## 1. Autorités ```text RULES.md + docs/rules/* archive stable v0.2.9 plan 016 et validation 012 pour N1/N2 plan 017 courant prompt 015 pour les contraintes non supersédées deltas/0.2.10/* OrbitFlare docs/pricing/SDK/CLI actuels Yellowstone upstream actuel ``` ## 2. Baseline stable | Gate | Résultat | |------------------------------------------|----------------------------------| | version de base | `0.2.9` PASS | | `deltas/0.2.9/rel.001.md` | PASS | | prompt `015` | PASS | | `cargo fmt --all` | PASS | | audit Rust | PASS | | audit Markdown | PASS | | `cargo check --workspace` | PASS | | `cargo clippy --workspace --all-targets` | PASS | | `cargo test --workspace` | PASS | | Transport unit | 383 sur 383 PASS | | Transport public API | 49 sur 49 PASS | | Transport release completeness | 43 sur 43 PASS | | Config unit | 113 sur 113 PASS | | graph duplicates Transport | fourni, aucun conflit N1 visible | | graph complet Transport | fourni sur `0.2.10-pre.1` PASS | ## 3. Invariant architecture | Exigence | Verdict | |----------------------------------------|----------| | moteur gRPC N1 modifié pour OrbitFlare | **NO** | | standard Yellowstone N2 modifié | **NO** | | second client Tonic | **NO** | | SDK OrbitFlare runtime | **NO** | | provider séparé du protocol | **PASS** | | Config -> Transport seulement | **PASS** | | Transport -> Config/env | **PASS** | | façade provider sans divergence | **NO** | Toute modification de `grpc_stream.rs`, `grpc_channel.rs`, `grpc_settings.rs`, `grpc_unary.rs` ou `grpc_subscribe.rs` motivée uniquement par OrbitFlare invalide ce gate. ## 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 | Subscribe authentifié, Slot + Ping | **PASS LIVE** | | Mainnet gratuit | non documenté | **OUT** | | Testnet endpoint | non prouvé | **UNKNOWN** | Sources : ```text https://orbitflare.com/pricing https://orbitflare.com/products/rpc-nodes https://docs.orbitflare.com/cli ``` ## 5. Transport security | Forme endpoint | Classification | Verdict | |---------------------------------------|-----------------------|----------| | `http://*.rpc.orbitflare.com:10000` | HTTP/2 plaintext | **PASS** | | `https://*.grpc.orbitflare.com` | HTTP/2 TLS | **PASS** | | transformation automatique http/https | interdite | **PASS** | | endpoint Dashboard | autoritaire si fourni | **PASS** | KSP ne prétend pas qu'un canal gRPC plaintext bénéficie d'une sécurité TLS implicite. ## 6. Auth classification | É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** | 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 n’est pas une `X-ORBIT-KEY` Customer API. Le CLI OrbitFlare courant n’est pas utilisé comme oracle positif pour l’auth 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 n’injecte pas le secret dans le canal gRPC. ## 7. Heartbeat | Point | Preuve | Verdict | |----------------------------------------|---------------------------------------------|----------| | OrbitFlare idle timeout partagé | environ 10 minutes | **PASS** | | OrbitFlare recommande client Ping | 30 secondes | **PASS** | | Yellowstone serveur Ping périodique | upstream documenté | **PASS** | | KSP auto reply au serveur Ping | test N1 `0.2.9` et non-régression `pre.003` | **PASS** | | moteur N1 à modifier | non | **PASS** | | Ping serveur OrbitFlare Devnet observé | live `pre.002-fix.001` + `pre.003` | **PASS** | | heartbeat provider additionnel | aucune divergence live | **NO** | Le gate est fermé : OrbitFlare émet le Ping Yellowstone standard et le chemin de réponse automatique N1 reste suffisant sans timer provider. ## 8. Capabilities streaming | Capability | Docs OrbitFlare | KSP N2 | Live provider | |---------------------|-----------------|--------|--------------------------| | accounts | oui | PASS | non sondé exhaustivement | | slots | oui | PASS | **PASS** | | transactions | oui | PASS | non sondé exhaustivement | | transactions_status | partiel | PASS | non sondé exhaustivement | | blocks | oui | PASS | non sondé exhaustivement | | blocks_meta | oui | PASS | non sondé exhaustivement | | entry | oui | PASS | non sondé exhaustivement | | commitment | oui | PASS | **PASS confirmed** | | accounts_data_slice | oui | PASS | non sondé exhaustivement | | Subscribe Ping/Pong | oui | PASS | **PASS Ping serveur** | La release prouve le chemin provider nécessaire à sa mission sans transformer les familles non sondées en capacités absentes. ## 9. Unary et replay | Capability | N2 KSP | OrbitFlare docs | Verdict provider | |---------------------|--------|-----------------|-----------------------------------| | SubscribeReplayInfo | PASS | non prouvé | UNKNOWN / non bloquant | | Ping unary | PASS | non prouvé | UNKNOWN / non bloquant | | GetLatestBlockhash | PASS | non prouvé | UNKNOWN / non bloquant | | GetBlockHeight | PASS | non prouvé | UNKNOWN / non bloquant | | GetSlot | PASS | non prouvé | UNKNOWN / non bloquant | | IsBlockhashValid | PASS | non prouvé | UNKNOWN / non bloquant | | GetVersion | PASS | non prouvé | UNKNOWN / non bloquant | | from_slot | PASS | non prouvé | N1 disponible, provider non sondé | | retention | N/A | non documentée | UNKNOWN / provider-owned | Une restriction ou un inconnu provider ne rétrograde jamais la disponibilité de la méthode dans le standard global KSP. Le reconnect N1 tolère déjà l'indisponibilité de `SubscribeReplayInfo` et poursuit avec le `from_slot` conservateur demandé. ## 10. Limits provider | Limite | Valeur | Verdict | |------------------------------|--------------------------|---------| | concurrent gRPC connections | 50 par IP | INFO | | subscriptions par connection | unlimited | INFO | | cap partagé entre régions | oui | INFO | | idle timeout | environ 10 minutes | INFO | | dépassement | `RESOURCE_EXHAUSTED` | INFO | | backoff recommandé | exponentiel jusqu'à 30 s | INFO | Ces valeurs restent provider-owned et ne deviennent pas des validations génériques de `YellowstoneGrpcSessionSettings`. ## 11. Config V3 | Exigence | Verdict | |---------------------------------------|----------| | nouveau format Config nécessaire | **NO** | | `provider = orbitflare` | **PASS** | | `protocol = solana_yellowstone` | **PASS** | | `cluster = devnet` | **PASS** | | Devnet URL publique | **PASS** | | secret metadata `x-token` | **PASS** | | valeur License Key via `KSP_SECRET_*` | **PASS** | | `X-ORBIT-KEY` dans Transport Config | **NO** | | heartbeat dans `grpc_defaults` | **NO** | Contrat final : ```text secret_metadata = x-token <- ${KSP_SECRET_ORBITFLARE_DEVNET_GRPC_X_TOKEN} ``` Le test Config prouve la classification secrète et la redaction ; le live prouve que ce credential ouvre le Subscribe OrbitFlare Devnet. ## 12. Smoke Devnet final Smoke durable : ```text License Key lue sur stdin YellowstoneGrpcMetadataEntry::secret("x-token", ...) provider = orbitflare cluster = devnet url = http://devnet.rpc.orbitflare.com:10000 open standard Subscribe request slots confirmed receive Slot non nul observe Ping serveur close borné ``` | Preuve | Verdict | |----------------------------------------------|--------------------------------| | endpoint parsé par N1 | **PASS** | | sans metadata | **FAIL EXPECTED / CLASSIFIED** | | secret `x-token` représentable par Config V3 | **PASS** | | License Key redacted | **PASS** | | connect authentifié | **PASS LIVE** | | Subscribe authentifié | **PASS LIVE** | | Slot reçu | **PASS LIVE** | | server Ping reçu | **PASS LIVE** | | auto reply KSP déterministe | **PASS N1** | | close borné | **PASS LIVE** | Résultats : ```text pre.002-fix.001 1/1 PASS en 5.10 s pre.003 final 1/1 PASS en 5.19 s ``` ## 13. Provider overlay gate Verdict final : **aucune façade/policy OrbitFlare n'est nécessaire**. Les conditions de réutilisation directe sont toutes satisfaites : ```text standard Subscribe fonctionne heartbeat standard fonctionne Config V3 exprime endpoint/auth aucune restriction consumer-visible ne requiert un type provider ``` Les interdictions restent durables : ```text N1 ne change pas N2 ne change pas pas de raw Tonic pas de SDK OrbitFlare ``` ## 14. Non-régressions finales | Surface | Baseline | Final | |-----------------------------------|--------------|------------------------| | HTTP current typed | 52 sur 52 | **PASS** | | HTTP historical | 14 sur 14 | **PASS** | | WebSocket standard | 18 sur 18 | **PASS** | | Helius LaserStream WebSocket | stable 0.2.8 | **PASS** | | Yellowstone N1/N2 | stable 0.2.9 | **PASS** | | PublicNode Mainnet/Testnet | stable 0.2.9 | **PASS deterministic** | | Config V1/V2/V3 backward readable | stable 0.2.9 | **PASS** | | dependency firewall | stable 0.2.9 | **PASS** | Les smokes PublicNode live n'ont pas été rejoués en `pre.003` car N1/N2 et les profils PublicNode n'ont pas changé ; leurs preuves live de `0.2.9` restent la baseline et la non-régression déterministe est verte. ## 15. Gate `pre.001` | Critère | Verdict | |-------------------------------------|----------------------| | base stable `v0.2.9` | **PASS** | | baseline fmt/audits/check/clippy | **PASS** | | workspace test | **PASS** | | graph duplicates | **PASS** | | graph complet Transport | **PASS** | | sources OrbitFlare actuelles | **PASS** | | sources Yellowstone actuelles | **PASS** | | Free Devnet gRPC confirmé | **PASS** | | endpoints classifiés | **PASS** | | auth planes distingués | **PASS** | | heartbeat KSP vs provider classifié | **PASS FINAL** | | capabilities auditées | **PASS** | | replay/from_slot | **UNKNOWN PROVIDER** | | N1 immutable | **PASS** | | N2 immutable | **PASS** | | Config V3 shape | **PASS** | | smoke ownership | **PASS** | | threat model | **PASS** | | sizing/forecast | **PASS** | | provider runtime lourd ajouté | **NO** | Verdict final : architecture positive, inconnus provider non requis qualifiés, aucun split déclenché. ## 16. Gate `pre.002` commité Validation opérateur du 2026-08-25 : | 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 la caractérisation historique qui a imposé le fix d'auth, pas une régression du moteur. ## 17. Gate `pre.002-fix.001` | Critère | Verdict | |-----------------------------------------------------------------|------------------------| | Cargo `0.2.10-pre.2.fix.1` | **PASS** | | `.env.example` inventorie le secret OrbitFlare | **PASS** | | Config `secret_metadata` contient `x-token` | **PASS** | | valeur provenant de `KSP_SECRET_ORBITFLARE_DEVNET_GRPC_X_TOKEN` | **PASS** | | test Config prouve redaction et classification secrète | **PASS** | | smoke lit la License Key sur stdin | **PASS** | | secret absent des arguments CLI | **PASS** | | moteur N1 modifié | **NO** | | standard N2 modifié | **NO** | | SDK OrbitFlare ajouté | **NO** | | connect authentifié | **PASS LIVE** | | `Subscribe -> Slot` live | **PASS LIVE / 5.10 s** | | `SubscribeUpdate::Ping` live | **PASS LIVE** | | close live | **PASS LIVE** | Le fix ferme l'auth et confirme que le chemin standard suffit. ## 18. Gate `pre.003` technique/live final Gate opérateur du 2026-08-25 : | Critère | Verdict | |------------------------------------------|----------------------------------| | Cargo `0.2.10-pre.3` | **PASS** | | `cargo fmt --all` | **PASS** | | audit Rust | **PASS / 0 export candidate** | | audit Markdown | **PASS / 99 tables / 100 files** | | `cargo check --workspace` | **PASS** | | `cargo clippy --workspace --all-targets` | **PASS** | | Config unit | **114 sur 114 PASS** | | Config ownership | **5 sur 5 PASS** | | Config public API | **15 sur 15 PASS** | | Transport unit | **383 sur 383 PASS** | | Transport public API | **49 sur 49 PASS** | | Transport release completeness | **43 sur 43 PASS** | | Transport doctests | **4 sur 4 PASS** | | workspace dependency canary | **3 sur 3 PASS** | | `cargo test --workspace` | **PASS** | | OrbitFlare Devnet live | **1 sur 1 PASS / 5.19 s** | | graphes Cargo | **INSPECTÉS / PAS DE BLOCAGE** | | moteur N1 modifié | **NO** | | standard N2 modifié | **NO** | Pile directe réconciliée : ```text yellowstone-grpc-proto 12.6.0 tonic / tonic-prost 0.14.6 prost / prost-types 0.14.4 ``` Verdict : **gate technique/live final fermé**. ## 19. Gate `pre.004` documentaire Cette tranche doit uniquement synchroniser : ```text plan 017 validation 013 README Transport USAGE Transport docs/000-README.md ``` Elle ne change ni code, ni Config runtime, ni schema, ni test, ni dependency. `CHANGELOG.md`, `ROADMAP.md` et le prompt suivant restent réservés au couloir publication-minimal. La décision de séquence est prise avant `pre.005` : Helius LaserStream gRPC est reporté dans les TODO Yellowstone sans numéro de release faute d'accès live raisonnable, et `0.2.11` devient `off-chain price transport`. Aucun prompt suivant n'est généré dans `pre.004`.