# Delta `0.2.10-pre.002-fix.001` — OrbitFlare License Key `x-token` ## 1. Base et identité Base exacte : ```text 0.2.10-pre.002 commité ``` Le fix porte une correction runtime/configuration de l’auth provider. La version Cargo devient donc : ```text workspace.package.version = 0.2.10-pre.2.fix.1 commit attendu = v0.2.10-pre.002-fix.001 aucun tag prerelease ``` ## 2. Défaut démontré par le live `pre.002` Le gate statique/workspace `pre.002` est vert. Le smoke live sans metadata a atteint OrbitFlare puis l’ouverture du stream a échoué de manière sûre : ```text grpc_operation = SubscribeOpen grpc_status = Unauthenticated grpc_code = The request does not have valid authentication credentials ``` Le Dashboard opérateur montre un produit `Solana Free` avec License Key `ORBIT-*` et `API Key Mode Active`. La référence Yellowstone OrbitFlare précise ensuite le contrat data-plane : ```text ORBITFLARE_LICENSE_KEY -> metadata gRPC x-token -> Yellowstone ``` Le `X-ORBIT-KEY` et le Bearer Device Flow restent des credentials Customer API et ne sont pas utilisés par Transport Yellowstone. ## 3. Correction Config V3 `config/std.transport.json` conserve le même endpoint et ajoute uniquement la metadata secrète requise : ```text provider = orbitflare cluster = devnet protocol = solana_yellowstone url = http://devnet.rpc.orbitflare.com:10000 metadata = [] secret_metadata = x-token <- ${KSP_SECRET_ORBITFLARE_DEVNET_GRPC_X_TOKEN} ``` Aucun format Config V4 n’est créé. `.env.example` inventorie désormais : ```text KSP_SECRET_ORBITFLARE_DEVNET_GRPC_X_TOKEN ``` La valeur locale attendue est la License Key `ORBIT-*`. Une `X-ORBIT-KEY` Customer API ne doit jamais être placée dans cette variable. ## 4. Preuve Config déterministe Le test `committed_v3_orbitflare_devnet_profile_maps_provider_neutral_yellowstone_grpc_with_license_x_token` injecte un canari secret via `ConfigEnvironment` et prouve : ```text profil explicite orbitflare_devnet companions HTTP/WS Devnet inchangés endpoint Yellowstone OrbitFlare inchangé metadata key = x-token metadata classée secret validation Transport PASS URL provider absente du Debug canari secret absent du Debug X-ORBIT-KEY absent du Transport ``` ## 5. Smoke live corrigé `yellowstone_orbitflare_smoke.rs` ne dépend toujours pas de Config et ne lit aucun environnement. Il suit le pattern de sécurité déjà utilisé par les smokes PublicNode : ```text une License Key lue sur stdin aucun secret en argument de ligne de commande YellowstoneGrpcMetadataEntry::secret("x-token", ...) reconnect max_retries = 0 Subscribe slots confirmed fenêtre Slot + Ping = 45 s close borné ``` Le smoke vérifie également que la License Key n’apparaît pas dans `Debug`. Commande opérateur : ```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 ``` ## 6. Invariant architectural Toujours inchangés : ```text src/grpc_settings.rs src/grpc_channel.rs src/grpc_unary.rs src/grpc_subscribe.rs src/grpc_stream.rs ``` Le standard Yellowstone N2 reste inchangé. Aucun SDK OrbitFlare runtime n’est ajouté. L’auth provider est entièrement composée par la surface metadata secrète déjà existante. ## 7. Heartbeat Ce fix ne matérialise aucun heartbeat OrbitFlare. Le rerun authentifié doit d’abord qualifier : ```text Slot non nul SubscribeUpdate::Ping serveur ``` Si les deux sont observés, N1 répond déjà automatiquement au Ping standard et aucune couche provider heartbeat n’est requise. Si le stream authentifié fonctionne mais n’émet aucun Ping serveur dans la fenêtre de caractérisation, `pre.003` devient une tranche provider-specific au-dessus de N1/N2. Il reste interdit d’ajouter un timer OrbitFlare au moteur gRPC. ## 8. Validation disponible dans l’environnement de génération Exécuté : ```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 python3 scripts/audit_markdown_tables.py README.md RULES.md ROADMAP.md CHANGELOG.md docs prompts crates deltas/0.2.10 Markdown table audit: clean (99 table(s), 99 file(s)) config/std.transport.json JSON parse PASS JSON Schema validation PASS comparaison N1 avec pre.002 grpc_settings.rs inchangé grpc_channel.rs inchangé grpc_unary.rs inchangé grpc_subscribe.rs inchangé grpc_stream.rs inchangé ``` Aucune commande Cargo n’est déclarée exécutée dans l’environnement de génération. ## 9. Gates opérateur Après application du fix : ```bash cargo fmt --all python3 scripts/audit_rust_workspace_rules.py python3 scripts/audit_markdown_tables.py README.md RULES.md ROADMAP.md CHANGELOG.md docs prompts crates deltas/0.2.10 cargo check --workspace cargo clippy --workspace --all-targets cargo test -p ksp-config-lib cargo test -p ksp-onchain-transport-lib cargo test -p ksp-core-lib --test workspace_dependencies cargo test --workspace ``` Puis exécuter le live authentifié décrit en section 5. ## 10. Fichiers ajoutés/modifiés ```text Cargo.toml .env.example config/std.transport.json crates/ksp-config-lib/unit_tests/transport.rs crates/ksp-onchain-transport-lib/tests/yellowstone_orbitflare_smoke.rs docs/plans/017-V0_2_10_ORBITFLARE_YELLOWSTONE_GRPC_PLAN.md docs/validation/013-V0_2_10_ORBITFLARE_YELLOWSTONE_GRPC.md deltas/0.2.10/pre.002-fix.001.md ``` Le delta commité `deltas/0.2.10/pre.002.md` reste immuable.