v0.2.10-pre.004

This commit is contained in:
2026-08-25 15:26:04 +02:00
parent be5e3464ee
commit 0edeed1c48
8 changed files with 493 additions and 245 deletions

View File

@@ -1,9 +1,9 @@
<!-- file: docs/validation/013-V0_2_10_ORBITFLARE_YELLOWSTONE_GRPC.md -->
<!-- version: 3 -->
<!-- version: 4 -->
# Validation `0.2.10` — OrbitFlare Yellowstone gRPC
**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`.**
**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
@@ -63,7 +63,7 @@ Toute modification de `grpc_stream.rs`, `grpc_channel.rs`, `grpc_settings.rs`, `
| 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** |
| Devnet live KSP | Subscribe authentifié, Slot + Ping | **PASS LIVE** |
| Mainnet gratuit | non documenté | **OUT** |
| Testnet endpoint | non prouvé | **UNKNOWN** |
@@ -114,50 +114,50 @@ Le CLI OrbitFlare courant nest pas utilisé comme oracle positif pour laut
## 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` | **PASS** |
| moteur N1 à modifier | non | **PASS** |
| Ping serveur OrbitFlare Devnet observé | live non encore exécuté | **PENDING** |
| heartbeat provider additionnel | non justifié tant que live non contraire | **NO** |
| 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** |
Critère de fermeture : observer le Ping standard sur OrbitFlare Devnet ou qualifier précisément pourquoi il n'est pas observable et quelle divergence provider existe.
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 | PENDING |
| slots | oui | PASS | PENDING |
| transactions | oui | PASS | PENDING |
| transactions_status | partiel | PASS | PENDING |
| blocks | oui | PASS | PENDING |
| blocks_meta | oui | PASS | PENDING |
| entry | oui | PASS | PENDING |
| commitment | oui | PASS | PENDING |
| accounts_data_slice | oui | PASS | PENDING |
| Subscribe Ping/Pong | oui | PASS | PENDING |
| 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** |
Le premier smoke n'a pas besoin de démontrer chaque famille. Il doit prouver que le provider exécute le standard KSP sur Devnet ; les capacités supplémentaires sont sondées sans élargir N2.
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 | Live |
|---------------------|--------|-----------------|---------|
| SubscribeReplayInfo | PASS | non prouvé | PENDING |
| Ping unary | PASS | non prouvé | PENDING |
| GetLatestBlockhash | PASS | non prouvé | PENDING |
| GetBlockHeight | PASS | non prouvé | PENDING |
| GetSlot | PASS | non prouvé | PENDING |
| IsBlockhashValid | PASS | non prouvé | PENDING |
| GetVersion | PASS | non prouvé | PENDING |
| from_slot | PASS | non prouvé | PENDING |
| retention | N/A | non documentée | UNKNOWN |
| 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 provider ne rétrograde jamais la disponibilité de la méthode dans le standard global KSP.
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
@@ -174,29 +174,29 @@ 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 `x-token` | **REQUIRED** |
| valeur License Key via `KSP_SECRET_*` | **PASS DESIGN** |
| `X-ORBIT-KEY` dans Transport Config | **FORBID** |
| heartbeat dans `grpc_defaults` | **NO** |
| 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** |
`pre.002-fix.001` corrige le profil en :
Contrat final :
```text
secret_metadata = x-token <- ${KSP_SECRET_ORBITFLARE_DEVNET_GRPC_X_TOKEN}
```
La valeur effective doit rester redacted dans toutes les projections safe/debug.
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 attendu
## 12. Smoke Devnet final
Smoke corrigé :
Smoke durable :
```text
License Key lue sur stdin
@@ -207,28 +207,35 @@ url = http://devnet.rpc.orbitflare.com:10000
open standard Subscribe
request slots confirmed
receive Slot non nul
observe Ping serveur pendant fenêtre bornée de caractérisation
observe Ping serveur
close borné
```
Verdicts actuels :
| Preuve | Verdict |
|----------------------------------------------|--------------------------------|
| endpoint parsé par N1 | **PASS STATIC** |
| endpoint parsé par N1 | **PASS** |
| 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** |
| 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 N1 / LIVE PENDING** |
| 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
La release reste sans façade OrbitFlare si `pre.002` démontre :
Verdict final : **aucune façade/policy OrbitFlare n'est nécessaire**.
Les conditions de réutilisation directe sont toutes satisfaites :
```text
standard Subscribe fonctionne
@@ -237,64 +244,56 @@ Config V3 exprime endpoint/auth
aucune restriction consumer-visible ne requiert un type provider
```
Une façade/policy OrbitFlare devient admissible seulement après preuve live d'une divergence. Même dans ce cas :
Les interdictions restent durables :
```text
N1 ne change pas
N2 ne change pas
pas de raw Tonic
pas de SDK OrbitFlare
ownership/close provider bornés
```
## 14. Non-régressions finales
| Surface | Baseline | Final |
|-----------------------------------|--------------|---------|
| HTTP current typed | 52 sur 52 | PENDING |
| HTTP historical | 14 sur 14 | PENDING |
| WebSocket standard | 18 sur 18 | PENDING |
| Helius LaserStream WebSocket | stable 0.2.8 | PENDING |
| Yellowstone N1/N2 | stable 0.2.9 | PENDING |
| PublicNode Mainnet/Testnet | stable 0.2.9 | PENDING |
| Config V1/V2/V3 backward readable | stable 0.2.9 | PENDING |
| dependency firewall | stable 0.2.9 | PENDING |
| 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, LIVE PENDING** |
| capabilities auditées | **PASS, LIVE PENDING** |
| 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** |
| 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 :
```text
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
```
Verdict final : architecture positive, inconnus provider non requis qualifiés, aucun split déclenché.
## 16. Gate `pre.002` commité
@@ -319,44 +318,77 @@ Validation opérateur du 2026-08-25 :
| 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é.
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 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** |
| 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** |
Commande live dédiée, avec secret saisi sans linscrire dans lhistorique :
Le fix ferme l'auth et confirme que le chemin standard suffit.
```bash
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
```
## 18. Gate `pre.003` technique/live final
Interprétation :
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
Slot + Ping PASS
-> auth et heartbeat standards composables ; pre.003 devient gate technique/live final
Subscribe/Slot PASS mais Ping absent
-> divergence heartbeat provider à traiter au-dessus de N1/N2 dans pre.003
auth encore rejetée avec la License Key x-token
-> blocker provider/account à qualifier ; ne jamais modifier N1 pour contourner le gate
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`.