diff --git a/Cargo.toml b/Cargo.toml index e24494e..aa8f1ad 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,12 +1,12 @@ # file: Cargo.toml -# version: 265 +# version: 266 [workspace] resolver = "3" members = ["crates/ksp-app-config-desk", "crates/ksp-app-wallet-desk", "crates/ksp-config-lib", "crates/ksp-core-lib", "crates/ksp-logging-lib", "crates/ksp-onchain-transport-lib", "crates/ksp-wallet-lib"] [workspace.package] -version = "0.2.10-pre.3" +version = "0.2.10-pre.4" edition = "2024" license = "MIT" repository = "https://git.sasedev.com/Sasedev/khadhroony-solana-project" diff --git a/crates/ksp-onchain-transport-lib/README.md b/crates/ksp-onchain-transport-lib/README.md index 608dee5..bbdb602 100644 --- a/crates/ksp-onchain-transport-lib/README.md +++ b/crates/ksp-onchain-transport-lib/README.md @@ -1,5 +1,5 @@ - + # `ksp-onchain-transport-lib` @@ -245,6 +245,8 @@ Config Transport V3 peut mapper des `grpc_endpoints` vers ces settings sans inve Le smoke live opt-in ouvre un `Subscribe` slots authentifié sur PublicNode Mainnet et Testnet, attend un update `Slot` non nul puis ferme de manière bornée. Les deux endpoints sont versionnés. Le harness reçoit ses personal tokens sur stdin ; aucun secret n’est committé ni placé dans l’URL. Le même token a été validé par l’opérateur sur les deux réseaux, même si Config conserve deux variables distinctes pour laisser cette policy flexible. +`0.2.10` ajoute le profil `orbitflare_devnet` sur le même moteur provider-neutral. L’endpoint validé est `http://devnet.rpc.orbitflare.com:10000`; la License Key `ORBIT-*` est fournie par Config via `KSP_SECRET_ORBITFLARE_DEVNET_GRPC_X_TOKEN` et devient la metadata secrète `x-token`. Le smoke live dédié a validé `Subscribe` slots à commitment confirmed, un `Slot` non nul et un `SubscribeUpdate::Ping` standard. Cette preuve confirme qu’aucune façade OrbitFlare, aucun heartbeat provider et aucune modification N1/N2 ne sont nécessaires. + ## Résilience L'admission est calculée par couple endpoint/rôle. Le pool applique : @@ -299,16 +301,20 @@ Transport WebSocket pur : settings programmatiques -> WsSession Composition historique : Config -> std.transport/devnet_public -> HttpTransportPool -> getHealth/getGenesisHash/getVersion/getBalance -Transport Yellowstone gRPC : settings programmatiques + x-token secret - -> PublicNode Mainnet + Testnet - -> TLS -> Subscribe slots -> Slot non nul -> close borné +Transport Yellowstone gRPC PublicNode : settings programmatiques + x-token secret + -> Mainnet + Testnet + -> TLS -> Subscribe slots -> Slot non nul -> close borné + +Transport Yellowstone gRPC OrbitFlare : settings programmatiques + License Key x-token + -> Devnet + -> Subscribe slots -> Slot non nul + server Ping -> close borné ``` Le smoke HTTP Transport utilise pour sa branche Token la forme Devnet documentée `getTokenAccountsByOwner(owner, { programId }, { commitment: finalized, encoding: jsonParsed })`. L'owner est une Pubkey ordinaire de l'exemple officiel ; aucune présence de token account n'est exigée, donc une liste vide reste valide. Le smoke WebSocket Transport cible uniquement la famille stable `slotSubscribe` sur l'endpoint public Devnet `wss://api.devnet.solana.com`. Il borne connexion, attente de notification, unsubscribe et fermeture ; il ne transforme aucune famille unstable en gate live. -Les quatre tests sont `ignored` par défaut ; le test Yellowstone contient deux cas live Mainnet/Testnet. Les trois familles de smokes Transport appartiennent durablement à cette crate ; le smoke cross-crates hébergé dans Config reste transitoire jusqu'à l'existence d'une surface KSP d'intégration/orchestration appropriée. Un rate-limit, refus externe ou incident Devnet n'est pas assimilé automatiquement à une régression locale. +Les cinq tests sont `ignored` par défaut ; le test PublicNode Yellowstone contient deux cas live Mainnet/Testnet et le test OrbitFlare contient un cas Devnet. Les trois familles de smokes Transport appartiennent durablement à cette crate ; le smoke cross-crates hébergé dans Config reste transitoire jusqu'à l'existence d'une surface KSP d'intégration/orchestration appropriée. Un rate-limit, refus externe ou incident Devnet n'est pas assimilé automatiquement à une régression locale. Aucun smoke Helius live supplémentaire n’est committé en `0.2.8-pre.010`. Un tel test devrait à la fois obtenir `KSP_SECRET_HELIUS_API_KEY` via Config et exercer Transport ; l’ajouter dans Transport violerait l’ownership environnement/secret, tandis que l’ajouter dans Config étendrait l’exception cross-crates que le projet veut au contraire résorber. La première surface KSP d’intégration/orchestration dédiée devra héberger ce smoke. Le scénario live recommandé est alors `helius_devnet -> HeliusLaserStreamWsSession -> slotSubscribe -> notification -> unsubscribe -> close`; `transactionSubscribe` reste un smoke optionnel dépendant des droits provider et ne devient pas un gate stable de release. @@ -324,4 +330,6 @@ Aucun smoke Helius live supplémentaire n’est committé en `0.2.8-pre.010`. Un - [`../../docs/validation/007-V0_2_4_HTTP_FINAL_COMPLIANCE.md`](../../docs/validation/007-V0_2_4_HTTP_FINAL_COMPLIANCE.md) — matrice finale validée `52/52 + 14/14` et audit `KSP-TRANSPORT-007` global ; - [`../../docs/plans/016-V0_2_9_YELLOWSTONE_GRPC_PLAN.md`](../../docs/plans/016-V0_2_9_YELLOWSTONE_GRPC_PLAN.md) — plan Yellowstone gRPC standard/provider-neutral et PublicNode ; - [`../../docs/validation/012-V0_2_9_YELLOWSTONE_GRPC.md`](../../docs/validation/012-V0_2_9_YELLOWSTONE_GRPC.md) — matrice de compliance Yellowstone ; +- [`../../docs/plans/017-V0_2_10_ORBITFLARE_YELLOWSTONE_GRPC_PLAN.md`](../../docs/plans/017-V0_2_10_ORBITFLARE_YELLOWSTONE_GRPC_PLAN.md) — composition OrbitFlare Devnet sur le standard Yellowstone ; +- [`../../docs/validation/013-V0_2_10_ORBITFLARE_YELLOWSTONE_GRPC.md`](../../docs/validation/013-V0_2_10_ORBITFLARE_YELLOWSTONE_GRPC.md) — validation finale OrbitFlare `x-token`, `Slot + Ping` et non-régression N1/N2 ; - [`../../config/std.transport.json`](../../config/std.transport.json) — configuration standard Transport V3 HTTP + WebSocket + gRPC, avec lecture backward V1/V2. diff --git a/crates/ksp-onchain-transport-lib/USAGE.md b/crates/ksp-onchain-transport-lib/USAGE.md index 0097b07..424a104 100644 --- a/crates/ksp-onchain-transport-lib/USAGE.md +++ b/crates/ksp-onchain-transport-lib/USAGE.md @@ -1,5 +1,5 @@ - + # Utilisation de `ksp-onchain-transport-lib` @@ -331,6 +331,36 @@ let channel = ksp_onchain_transport_lib::YellowstoneGrpcChannel::connect(endpoin `protocol = solana_yellowstone` est validé par Config et reste distinct du descripteur `provider`. Une valeur provider n’autorise pas Transport à introduire une API provider-specific sans divergence réelle. +### Profil OrbitFlare Devnet + +Le profil committé `orbitflare_devnet` réutilise exactement le même accès Config -> Transport : + +```rust +let resolved = match engine.load_resolved_transport_config(Some("orbitflare_devnet"), &environment) { + Ok(value) => value, + Err(error) => return Err(error), +}; +let grpc_settings = match resolved.grpc_settings() { + Some(value) => value, + None => return Err(ksp_core_lib::Error::new( + ksp_onchain_transport_lib::ERROR_CODE_INVALID_SETTINGS, + "selected OrbitFlare profile has no Yellowstone gRPC endpoint", + )), +}; +let endpoint = match grpc_settings.endpoints().iter().find(|candidate| candidate.enabled()) { + Some(value) => value, + None => return Err(ksp_core_lib::Error::new( + ksp_onchain_transport_lib::ERROR_CODE_INVALID_SETTINGS, + "selected OrbitFlare profile has no enabled Yellowstone gRPC endpoint", + )), +}; +let channel = ksp_onchain_transport_lib::YellowstoneGrpcChannel::connect(endpoint).await; +``` + +Config résout `KSP_SECRET_ORBITFLARE_DEVNET_GRPC_X_TOKEN` vers la metadata secrète `x-token`. Sa valeur effective est la License Key `ORBIT-*` du produit Solana ; `X-ORBIT-KEY` et le Bearer du Customer API ne doivent pas être utilisés pour Yellowstone. Transport ne lit jamais cette variable lui-même. + +L’endpoint validé par `0.2.10` est `http://devnet.rpc.orbitflare.com:10000`. Il reste volontairement en `http` : KSP ne remplace pas le transport provider par `https` sans endpoint TLS explicitement fourni. + ### Subscribe bidirectionnel Une session standard part d’une requête typed complète : @@ -519,6 +549,26 @@ Testnet https://solana-testnet-yellowstone-grpc.publicnode.com:443 Les profils Config conservent deux variables secrètes distinctes afin d'autoriser des credentials différents si nécessaire ; cette séparation ne signifie pas que PublicNode impose actuellement un token différent par réseau. Un timeout KSP de half-close après réception du slot est accepté par le smoke comme fermeture bornée du provider ; aucune absence de slot ni autre erreur n'est masquée. +Le smoke **Transport Yellowstone gRPC OrbitFlare** est lui aussi indépendant de Config. Il lit une seule License Key sur stdin, la classe comme metadata secrète `x-token`, ouvre le standard `Subscribe`, demande `slots` à commitment confirmed, attend un Slot non nul et un `SubscribeUpdate::Ping`, puis ferme la session de manière bornée : + +```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 +``` + +Endpoint validé : + +```text +Devnet http://devnet.rpc.orbitflare.com:10000 +``` + +Le gate `0.2.10-pre.003` a passé ce scénario en live avec `Slot + Ping`. Le Ping reçu est le message Yellowstone standard auquel N1 sait déjà répondre sans remplacer la dernière requête complète mémorisée ; aucun heartbeat OrbitFlare supplémentaire n’est donc requis. + Le smoke de **composition Config -> Transport** reste également disponible : ```bash diff --git a/deltas/0.2.10/pre.004.md b/deltas/0.2.10/pre.004.md new file mode 100644 index 0000000..636de99 --- /dev/null +++ b/deltas/0.2.10/pre.004.md @@ -0,0 +1,128 @@ + + + +# Delta `0.2.10-pre.004` — réconciliation documentaire finale OrbitFlare Yellowstone + +## 1. Base + +```text +0.2.10-pre.003 +``` + +Cette tranche est exclusivement le couloir de réconciliation documentaire finale. Le gate technique/live de `pre.003` est vert ; aucun correctif runtime, Config exécutable, test, schema, dependency ou feature n'est introduit ici. + +## 2. Version technique + +Comme toute prerelease non-fix, la version Cargo est synchronisée mécaniquement : + +```text +workspace.package.version = 0.2.10-pre.4 +``` + +Aucune sémantique runtime ne change. + +## 3. Preuve technique réconciliée + +Le gate opérateur `pre.003` du 2026-08-25 est fermé avec : + +```text +cargo fmt --all PASS +Rust workspace audit PASS / 0 export candidate +Markdown audit PASS / 99 tables / 100 files +cargo check --workspace PASS +cargo clippy --workspace --all-targets PASS +Config unit 114/114 PASS +Config ownership 5/5 PASS +Config public API 15/15 PASS +Transport unit 383/383 PASS +Transport public API 49/49 PASS +Transport release completeness 43/43 PASS +Transport doctests 4/4 PASS +workspace dependency canary 3/3 PASS +cargo test --workspace PASS +OrbitFlare Devnet Subscribe + Slot + Ping 1/1 PASS, 5.19 s +``` + +Les graphes Cargo direct Transport, doublons Transport et doublons workspace ont été inspectés. La pile reste : + +```text +yellowstone-grpc-proto 12.6.0 +tonic / tonic-prost 0.14.6 +prost / prost-types 0.14.4 +``` + +Aucun `yellowstone-grpc-client` runtime, aucun `orbitflare-sdk` runtime et aucune dépendance `Transport -> Config` n'ont été ajoutés. + +## 4. OrbitFlare final + +Contrat durable réconcilié : + +```text +Devnet endpoint http://devnet.rpc.orbitflare.com:10000 +auth License Key ORBIT-* -> secret metadata x-token +Config secret KSP_SECRET_ORBITFLARE_DEVNET_GRPC_X_TOKEN +Subscribe standard Yellowstone N2 +live Slot non nul + server Ping +N1 inchangé +N2 inchangé +provider facade non nécessaire +heartbeat N3 non nécessaire +Config V4 non nécessaire +``` + +Le premier échec `pre.002` sans metadata reste conservé dans son delta historique comme caractérisation ayant conduit au fix d'auth `pre.002-fix.001`. + +## 5. Documents réconciliés + +```text +docs/plans/002-FUNCTIONAL_RELEASE_SEQUENCE.md +docs/plans/017-V0_2_10_ORBITFLARE_YELLOWSTONE_GRPC_PLAN.md +docs/validation/013-V0_2_10_ORBITFLARE_YELLOWSTONE_GRPC.md +crates/ksp-onchain-transport-lib/README.md +crates/ksp-onchain-transport-lib/USAGE.md +docs/000-README.md +``` + +Les anciennes affirmations `PENDING` sont remplacées par les résultats `pre.003` réellement observés. README/USAGE documentent désormais le profil OrbitFlare Devnet et son smoke live durable. + +## 6. Frontière avec `pre.005` + +Cette tranche ne touche pas : + +```text +CHANGELOG.md +ROADMAP.md +prompt suivant +``` + +La décision sur la release suivante est prise pendant cette réconciliation, sans générer encore son prompt : Helius LaserStream gRPC est reporté dans les TODO Yellowstone sans numéro de release faute d'accès live raisonnable ; la séquence active avance et `0.2.11` devient `off-chain price transport`, suivie de `0.2.12` Price Desk + intégration Wallet Desk, `0.2.13` interface/wire foundation et `0.2.14` program-api foundation. Le futur `ROADMAP.md` de `pre.005` devra refléter exactement ce report et cette renumérotation. + +Une fois cette décision prise, `pre.005` reste strictement publication-minimal : prompt suivant + `CHANGELOG.md` + `ROADMAP.md` + signal Cargo + delta. + +Si un défaut technique de `0.2.10` est découvert après ce gate documentaire, il ne doit pas être glissé dans `pre.005`; ouvrir une nouvelle prerelease du couloir approprié puis rejouer les tranches finales nécessaires. + +## 7. Fichiers modifiés/ajoutés + +```text +Cargo.toml +docs/000-README.md +docs/plans/002-FUNCTIONAL_RELEASE_SEQUENCE.md +docs/plans/017-V0_2_10_ORBITFLARE_YELLOWSTONE_GRPC_PLAN.md +docs/validation/013-V0_2_10_ORBITFLARE_YELLOWSTONE_GRPC.md +crates/ksp-onchain-transport-lib/README.md +crates/ksp-onchain-transport-lib/USAGE.md +deltas/0.2.10/pre.004.md +``` + +## 8. Gate opérateur + +```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 --workspace +``` + +Aucun smoke live ni `cargo tree` n'est à rejouer si le delta est appliqué exactement : aucune surface technique ou dépendance n'est modifiée. diff --git a/docs/000-README.md b/docs/000-README.md index e76ebe5..3401a40 100644 --- a/docs/000-README.md +++ b/docs/000-README.md @@ -1,5 +1,5 @@ - + # Documentation KSP @@ -85,7 +85,7 @@ D'autres sous-répertoires seront ajoutés uniquement lorsque leur rôle aura é ## Documents de planification -Le plan historique de la phase fondatrice clôturée est conservé dans [`plans/001-V0_0_3_PLAN.md`](plans/001-V0_0_3_PLAN.md). La séquence active des premières releases fonctionnelles est définie dans [`plans/002-FUNCTIONAL_RELEASE_SEQUENCE.md`](plans/002-FUNCTIONAL_RELEASE_SEQUENCE.md). Le plan détaillé de la release stable `0.1.1` est conservé comme historique clôturé dans [`plans/003-V0_1_1_CORE_FOUNDATION_PLAN.md`](plans/003-V0_1_1_CORE_FOUNDATION_PLAN.md). Le plan détaillé de la release stable `0.1.2` est conservé comme historique clôturé dans [`plans/004-V0_1_2_LOGGING_FOUNDATION_PLAN.md`](plans/004-V0_1_2_LOGGING_FOUNDATION_PLAN.md). Le plan détaillé de la release stable `0.1.3 — Configuration foundation` est conservé comme historique clôturé dans [`plans/005-V0_1_3_CONFIG_FOUNDATION_PLAN.md`](plans/005-V0_1_3_CONFIG_FOUNDATION_PLAN.md). Le plan détaillé de la release stable `0.1.4 — ksp-app-config-desk` est conservé comme historique clôturé dans [`plans/006-V0_1_4_CONFIG_DESKTOP_PLAN.md`](plans/006-V0_1_4_CONFIG_DESKTOP_PLAN.md), avec sa matrice finale [`validation/001-V0_1_4_CONFIG_DESKTOP.md`](validation/001-V0_1_4_CONFIG_DESKTOP.md). Son prompt d'ouverture historique reste [`../prompts/004-V0_1_4_START_PROMPT.md`](../prompts/004-V0_1_4_START_PROMPT.md). La release stable `0.2.0` clôt l'audit de bot3 et le découpage de la série. Son plan directeur est conservé comme historique clôturé dans [`plans/007-V0_2_0_SERIES_PLANNING.md`](plans/007-V0_2_0_SERIES_PLANNING.md), avec sa matrice finale [`validation/002-V0_2_0_SERIES_PLANNING.md`](validation/002-V0_2_0_SERIES_PLANNING.md). La release stable `0.2.1 — HTTP Solana foundation` a été ouverte par [`../prompts/006-V0_2_1_START_PROMPT.md`](../prompts/006-V0_2_1_START_PROMPT.md). Son gate de sizing et sa matrice exhaustive sont conservés dans [`plans/008-V0_2_1_ONCHAIN_HTTP_PLAN.md`](plans/008-V0_2_1_ONCHAIN_HTTP_PLAN.md), avec la validation finale [`validation/003-V0_2_1_ONCHAIN_HTTP.md`](validation/003-V0_2_1_ONCHAIN_HTTP.md), README/USAGE Transport et le smoke Devnet opt-in de composition Config -> Transport. Le prompt [`../prompts/007-V0_2_2_START_PROMPT.md`](../prompts/007-V0_2_2_START_PROMPT.md) a ouvert la release stable `0.2.2 — HTTP Accounts + Tokens + Cluster`. Son plan clôturé [`plans/009-V0_2_2_HTTP_ACCOUNTS_TOKENS_CLUSTER_PLAN.md`](plans/009-V0_2_2_HTTP_ACCOUNTS_TOKENS_CLUSTER_PLAN.md) conserve l'audit et l'implémentation des 22 wrappers typés, tandis que [`validation/004-V0_2_2_HTTP_ACCOUNTS_TOKENS_CLUSTER.md`](validation/004-V0_2_2_HTTP_ACCOUNTS_TOKENS_CLUSTER.md) enregistre les validations déterministes, les graphes Cargo et les deux smokes Devnet passés avant publication. Le prompt [`../prompts/008-V0_2_3_START_PROMPT.md`](../prompts/008-V0_2_3_START_PROMPT.md) a ouvert la release stable `0.2.3 — HTTP Transactions`. Son plan clôturé [`plans/010-V0_2_3_HTTP_TRANSACTIONS_PLAN.md`](plans/010-V0_2_3_HTTP_TRANSACTIONS_PLAN.md) conserve l'audit et l'implémentation des 11 wrappers ; le réaudit [`validation/005-V0_2_3_KSP_TRANSPORT_007_RETRO_AUDIT.md`](validation/005-V0_2_3_KSP_TRANSPORT_007_RETRO_AUDIT.md) confirme la complétude des 37 wrappers HTTP typés et [`validation/006-V0_2_3_HTTP_TRANSACTIONS.md`](validation/006-V0_2_3_HTTP_TRANSACTIONS.md) enregistre les validations finales, graphes Cargo et deux smokes Devnet passés avant publication. Le prompt [`../prompts/009-V0_2_4_START_PROMPT.md`](../prompts/009-V0_2_4_START_PROMPT.md) a ouvert la release stable `0.2.4 — HTTP Blocks + Economics + compliance HTTP finale`. Son plan clôturé [`plans/011-V0_2_4_HTTP_BLOCKS_ECONOMICS_PLAN.md`](plans/011-V0_2_4_HTTP_BLOCKS_ECONOMICS_PLAN.md) conserve l’implémentation des 15 wrappers et la compliance `52/52 + 14/14`; la matrice finale [`validation/007-V0_2_4_HTTP_FINAL_COMPLIANCE.md`](validation/007-V0_2_4_HTTP_FINAL_COMPLIANCE.md) enregistre le réaudit SIMD/inventaire, les canaries globales et les preuves opérateur avant publication. Le prompt [`../prompts/010-V0_2_5_START_PROMPT.md`](../prompts/010-V0_2_5_START_PROMPT.md), finalisé par `0.2.4-pre.009-fix.001`, ouvre `0.2.5 — Wallet foundation` sur la base stable `v0.2.4`. Son plan historique clôturé [`plans/012-V0_2_5_WALLET_FOUNDATION_PLAN.md`](plans/012-V0_2_5_WALLET_FOUNDATION_PLAN.md) part du gate `pre.001` (héritage, threat model offline, VIEW/OWNER indépendants et niveau B read-only), puis matérialise la crate en `pre.002`, le wire/transcript en `pre.003`, les primitives Argon2id/XChaCha20-Poly1305 en `pre.004`, les payloads/create/open en `pre.005`, la persistence en `pre.006`, l'administration/signature en `pre.007` et les adapters transfer en `pre.008`. `pre.009` ferme l'audit adversarial/interoperability/compliance dans [`validation/008-V0_2_5_WALLET_SECURITY_COMPLIANCE.md`](validation/008-V0_2_5_WALLET_SECURITY_COMPLIANCE.md) avant la documentation finale `pre.010` ; `pre.010` finalise [`../crates/ksp-wallet-lib/README.md`](../crates/ksp-wallet-lib/README.md), [`../crates/ksp-wallet-lib/USAGE.md`](../crates/ksp-wallet-lib/USAGE.md), la spec, les graphes et la matrice ; `pre.010-fix.001`–`fix.003` ferment ensuite la mise à niveau Dalek et la normalisation Rust/audit structurel. `0.2.5-rel.001` publie la release stable et [`../prompts/011-V0_2_6_START_PROMPT.md`](../prompts/011-V0_2_6_START_PROMPT.md) ouvre `0.2.6 — Wallet Desk`. Le gate `0.2.6-pre.001` est conservé dans [`plans/013-V0_2_6_WALLET_DESK_PLAN.md`](plans/013-V0_2_6_WALLET_DESK_PLAN.md) : il réaudite Config Desk et les APIs finales, retient le gabarit desktop, fixe `std.wallet`, la composition Config/Wallet/HTTP/Logging, les secrets `KSP_SECRET_WALLET_PASS_*`, les frontières VIEW/OWNER et la trajectoire de validation. `pre.002`–`pre.014` matérialisent ensuite le shell Tauri, Config Wallet/composite, inventory, create/open, balance HTTP, import/export, metadata, rotations, révocation VIEW forte, compliance et polish desktop. `pre.015` fige le wire binaire `.kspwallet` V2, `pre.016` matérialise les APIs génériques/versionnées et le runtime V2, puis `pre.017` ajoute la migration explicite OWNER-authentifiée V1 -> V2. `pre.018` ferme le runtime Tauri packagé Config/resources et la documentation candidate ; `pre.018-fix.001` corrige le canari d'ownership Config, après quoi le gate workspace et le build final Linux sont verts. `pre.018-fix.002` renforce uniquement le contrat de reprise `0.2.7`. `0.2.6-rel.001` publie cette surface stable et [`../prompts/012-V0_2_7_START_PROMPT.md`](../prompts/012-V0_2_7_START_PROMPT.md) devient le prochain point d'entrée. Le gate `0.2.7-pre.001` ouvre la release WebSocket standard dans [`plans/014-V0_2_7_ONCHAIN_WEBSOCKET_PLAN.md`](plans/014-V0_2_7_ONCHAIN_WEBSOCKET_PLAN.md) ; la matrice normative puis finale est conservée dans [`validation/010-V0_2_7_ONCHAIN_WEBSOCKET.md`](validation/010-V0_2_7_ONCHAIN_WEBSOCKET.md). `0.2.7-pre.014` ferme la candidate technique/documentaire après validation 18/18, smoke WebSocket Devnet et audit du graphe Cargo ; `pre.014-fix.001` renforce uniquement le prompt suivant. `0.2.7-rel.001` publie `0.2.7 — WebSocket Solana standard` stable et [`../prompts/013-V0_2_8_START_PROMPT.md`](../prompts/013-V0_2_8_START_PROMPT.md) ouvre `0.2.8 — Helius LaserStream WebSocket`. Le plan historique clôturé [`plans/015-V0_2_8_HELIUS_LASERSTREAM_WEBSOCKET_PLAN.md`](plans/015-V0_2_8_HELIUS_LASERSTREAM_WEBSOCKET_PLAN.md) et la matrice finale [`validation/011-V0_2_8_HELIUS_LASERSTREAM_WEBSOCKET.md`](validation/011-V0_2_8_HELIUS_LASERSTREAM_WEBSOCKET.md) conservent la release stable `0.2.8 — Helius LaserStream WebSocket` publiée par `rel.001` : protocol `helius_laserstream`, sept familles standard Helius (`account/logs/program/root/signature/slot/slotsUpdates`), extension `transactionSubscribe`/`transactionUnsubscribe`, `block/vote` absents, heartbeat Ping 60 s, Config/secrets redacted, lifecycle adversarial et graphes Cargo finaux validés. [`../prompts/014-V0_2_9_START_PROMPT.md`](../prompts/014-V0_2_9_START_PROMPT.md) devient le contrat actif pour ouvrir Yellowstone gRPC standard/provider-neutral depuis le tag stable `v0.2.8`. La release stable `0.2.9` est conservée dans [`plans/016-V0_2_9_YELLOWSTONE_GRPC_PLAN.md`](plans/016-V0_2_9_YELLOWSTONE_GRPC_PLAN.md) et [`validation/012-V0_2_9_YELLOWSTONE_GRPC.md`](validation/012-V0_2_9_YELLOWSTONE_GRPC.md) : stratégie proto Apache + client KSP/Tonic, moteur N1, standard N2, Config V3, profils PublicNode Mainnet/Testnet authentifiés par `x-token` secret et smoke live `Subscribe` validé sur les deux réseaux. `0.2.10-pre.001` ouvre maintenant OrbitFlare dans [`plans/017-V0_2_10_ORBITFLARE_YELLOWSTONE_GRPC_PLAN.md`](plans/017-V0_2_10_ORBITFLARE_YELLOWSTONE_GRPC_PLAN.md) et [`validation/013-V0_2_10_ORBITFLARE_YELLOWSTONE_GRPC.md`](validation/013-V0_2_10_ORBITFLARE_YELLOWSTONE_GRPC.md) avec un objectif prioritaire Devnet gratuit et l'invariant explicite que les moteurs/provider-neutral et le standard Yellowstone ne sont pas modifiés par les releases provider. +Le plan historique de la phase fondatrice clôturée est conservé dans [`plans/001-V0_0_3_PLAN.md`](plans/001-V0_0_3_PLAN.md). La séquence active des premières releases fonctionnelles est définie dans [`plans/002-FUNCTIONAL_RELEASE_SEQUENCE.md`](plans/002-FUNCTIONAL_RELEASE_SEQUENCE.md). Le plan détaillé de la release stable `0.1.1` est conservé comme historique clôturé dans [`plans/003-V0_1_1_CORE_FOUNDATION_PLAN.md`](plans/003-V0_1_1_CORE_FOUNDATION_PLAN.md). Le plan détaillé de la release stable `0.1.2` est conservé comme historique clôturé dans [`plans/004-V0_1_2_LOGGING_FOUNDATION_PLAN.md`](plans/004-V0_1_2_LOGGING_FOUNDATION_PLAN.md). Le plan détaillé de la release stable `0.1.3 — Configuration foundation` est conservé comme historique clôturé dans [`plans/005-V0_1_3_CONFIG_FOUNDATION_PLAN.md`](plans/005-V0_1_3_CONFIG_FOUNDATION_PLAN.md). Le plan détaillé de la release stable `0.1.4 — ksp-app-config-desk` est conservé comme historique clôturé dans [`plans/006-V0_1_4_CONFIG_DESKTOP_PLAN.md`](plans/006-V0_1_4_CONFIG_DESKTOP_PLAN.md), avec sa matrice finale [`validation/001-V0_1_4_CONFIG_DESKTOP.md`](validation/001-V0_1_4_CONFIG_DESKTOP.md). Son prompt d'ouverture historique reste [`../prompts/004-V0_1_4_START_PROMPT.md`](../prompts/004-V0_1_4_START_PROMPT.md). La release stable `0.2.0` clôt l'audit de bot3 et le découpage de la série. Son plan directeur est conservé comme historique clôturé dans [`plans/007-V0_2_0_SERIES_PLANNING.md`](plans/007-V0_2_0_SERIES_PLANNING.md), avec sa matrice finale [`validation/002-V0_2_0_SERIES_PLANNING.md`](validation/002-V0_2_0_SERIES_PLANNING.md). La release stable `0.2.1 — HTTP Solana foundation` a été ouverte par [`../prompts/006-V0_2_1_START_PROMPT.md`](../prompts/006-V0_2_1_START_PROMPT.md). Son gate de sizing et sa matrice exhaustive sont conservés dans [`plans/008-V0_2_1_ONCHAIN_HTTP_PLAN.md`](plans/008-V0_2_1_ONCHAIN_HTTP_PLAN.md), avec la validation finale [`validation/003-V0_2_1_ONCHAIN_HTTP.md`](validation/003-V0_2_1_ONCHAIN_HTTP.md), README/USAGE Transport et le smoke Devnet opt-in de composition Config -> Transport. Le prompt [`../prompts/007-V0_2_2_START_PROMPT.md`](../prompts/007-V0_2_2_START_PROMPT.md) a ouvert la release stable `0.2.2 — HTTP Accounts + Tokens + Cluster`. Son plan clôturé [`plans/009-V0_2_2_HTTP_ACCOUNTS_TOKENS_CLUSTER_PLAN.md`](plans/009-V0_2_2_HTTP_ACCOUNTS_TOKENS_CLUSTER_PLAN.md) conserve l'audit et l'implémentation des 22 wrappers typés, tandis que [`validation/004-V0_2_2_HTTP_ACCOUNTS_TOKENS_CLUSTER.md`](validation/004-V0_2_2_HTTP_ACCOUNTS_TOKENS_CLUSTER.md) enregistre les validations déterministes, les graphes Cargo et les deux smokes Devnet passés avant publication. Le prompt [`../prompts/008-V0_2_3_START_PROMPT.md`](../prompts/008-V0_2_3_START_PROMPT.md) a ouvert la release stable `0.2.3 — HTTP Transactions`. Son plan clôturé [`plans/010-V0_2_3_HTTP_TRANSACTIONS_PLAN.md`](plans/010-V0_2_3_HTTP_TRANSACTIONS_PLAN.md) conserve l'audit et l'implémentation des 11 wrappers ; le réaudit [`validation/005-V0_2_3_KSP_TRANSPORT_007_RETRO_AUDIT.md`](validation/005-V0_2_3_KSP_TRANSPORT_007_RETRO_AUDIT.md) confirme la complétude des 37 wrappers HTTP typés et [`validation/006-V0_2_3_HTTP_TRANSACTIONS.md`](validation/006-V0_2_3_HTTP_TRANSACTIONS.md) enregistre les validations finales, graphes Cargo et deux smokes Devnet passés avant publication. Le prompt [`../prompts/009-V0_2_4_START_PROMPT.md`](../prompts/009-V0_2_4_START_PROMPT.md) a ouvert la release stable `0.2.4 — HTTP Blocks + Economics + compliance HTTP finale`. Son plan clôturé [`plans/011-V0_2_4_HTTP_BLOCKS_ECONOMICS_PLAN.md`](plans/011-V0_2_4_HTTP_BLOCKS_ECONOMICS_PLAN.md) conserve l’implémentation des 15 wrappers et la compliance `52/52 + 14/14`; la matrice finale [`validation/007-V0_2_4_HTTP_FINAL_COMPLIANCE.md`](validation/007-V0_2_4_HTTP_FINAL_COMPLIANCE.md) enregistre le réaudit SIMD/inventaire, les canaries globales et les preuves opérateur avant publication. Le prompt [`../prompts/010-V0_2_5_START_PROMPT.md`](../prompts/010-V0_2_5_START_PROMPT.md), finalisé par `0.2.4-pre.009-fix.001`, ouvre `0.2.5 — Wallet foundation` sur la base stable `v0.2.4`. Son plan historique clôturé [`plans/012-V0_2_5_WALLET_FOUNDATION_PLAN.md`](plans/012-V0_2_5_WALLET_FOUNDATION_PLAN.md) part du gate `pre.001` (héritage, threat model offline, VIEW/OWNER indépendants et niveau B read-only), puis matérialise la crate en `pre.002`, le wire/transcript en `pre.003`, les primitives Argon2id/XChaCha20-Poly1305 en `pre.004`, les payloads/create/open en `pre.005`, la persistence en `pre.006`, l'administration/signature en `pre.007` et les adapters transfer en `pre.008`. `pre.009` ferme l'audit adversarial/interoperability/compliance dans [`validation/008-V0_2_5_WALLET_SECURITY_COMPLIANCE.md`](validation/008-V0_2_5_WALLET_SECURITY_COMPLIANCE.md) avant la documentation finale `pre.010` ; `pre.010` finalise [`../crates/ksp-wallet-lib/README.md`](../crates/ksp-wallet-lib/README.md), [`../crates/ksp-wallet-lib/USAGE.md`](../crates/ksp-wallet-lib/USAGE.md), la spec, les graphes et la matrice ; `pre.010-fix.001`–`fix.003` ferment ensuite la mise à niveau Dalek et la normalisation Rust/audit structurel. `0.2.5-rel.001` publie la release stable et [`../prompts/011-V0_2_6_START_PROMPT.md`](../prompts/011-V0_2_6_START_PROMPT.md) ouvre `0.2.6 — Wallet Desk`. Le gate `0.2.6-pre.001` est conservé dans [`plans/013-V0_2_6_WALLET_DESK_PLAN.md`](plans/013-V0_2_6_WALLET_DESK_PLAN.md) : il réaudite Config Desk et les APIs finales, retient le gabarit desktop, fixe `std.wallet`, la composition Config/Wallet/HTTP/Logging, les secrets `KSP_SECRET_WALLET_PASS_*`, les frontières VIEW/OWNER et la trajectoire de validation. `pre.002`–`pre.014` matérialisent ensuite le shell Tauri, Config Wallet/composite, inventory, create/open, balance HTTP, import/export, metadata, rotations, révocation VIEW forte, compliance et polish desktop. `pre.015` fige le wire binaire `.kspwallet` V2, `pre.016` matérialise les APIs génériques/versionnées et le runtime V2, puis `pre.017` ajoute la migration explicite OWNER-authentifiée V1 -> V2. `pre.018` ferme le runtime Tauri packagé Config/resources et la documentation candidate ; `pre.018-fix.001` corrige le canari d'ownership Config, après quoi le gate workspace et le build final Linux sont verts. `pre.018-fix.002` renforce uniquement le contrat de reprise `0.2.7`. `0.2.6-rel.001` publie cette surface stable et [`../prompts/012-V0_2_7_START_PROMPT.md`](../prompts/012-V0_2_7_START_PROMPT.md) devient le prochain point d'entrée. Le gate `0.2.7-pre.001` ouvre la release WebSocket standard dans [`plans/014-V0_2_7_ONCHAIN_WEBSOCKET_PLAN.md`](plans/014-V0_2_7_ONCHAIN_WEBSOCKET_PLAN.md) ; la matrice normative puis finale est conservée dans [`validation/010-V0_2_7_ONCHAIN_WEBSOCKET.md`](validation/010-V0_2_7_ONCHAIN_WEBSOCKET.md). `0.2.7-pre.014` ferme la candidate technique/documentaire après validation 18/18, smoke WebSocket Devnet et audit du graphe Cargo ; `pre.014-fix.001` renforce uniquement le prompt suivant. `0.2.7-rel.001` publie `0.2.7 — WebSocket Solana standard` stable et [`../prompts/013-V0_2_8_START_PROMPT.md`](../prompts/013-V0_2_8_START_PROMPT.md) ouvre `0.2.8 — Helius LaserStream WebSocket`. Le plan historique clôturé [`plans/015-V0_2_8_HELIUS_LASERSTREAM_WEBSOCKET_PLAN.md`](plans/015-V0_2_8_HELIUS_LASERSTREAM_WEBSOCKET_PLAN.md) et la matrice finale [`validation/011-V0_2_8_HELIUS_LASERSTREAM_WEBSOCKET.md`](validation/011-V0_2_8_HELIUS_LASERSTREAM_WEBSOCKET.md) conservent la release stable `0.2.8 — Helius LaserStream WebSocket` publiée par `rel.001` : protocol `helius_laserstream`, sept familles standard Helius (`account/logs/program/root/signature/slot/slotsUpdates`), extension `transactionSubscribe`/`transactionUnsubscribe`, `block/vote` absents, heartbeat Ping 60 s, Config/secrets redacted, lifecycle adversarial et graphes Cargo finaux validés. [`../prompts/014-V0_2_9_START_PROMPT.md`](../prompts/014-V0_2_9_START_PROMPT.md) devient le contrat actif pour ouvrir Yellowstone gRPC standard/provider-neutral depuis le tag stable `v0.2.8`. La release stable `0.2.9` est conservée dans [`plans/016-V0_2_9_YELLOWSTONE_GRPC_PLAN.md`](plans/016-V0_2_9_YELLOWSTONE_GRPC_PLAN.md) et [`validation/012-V0_2_9_YELLOWSTONE_GRPC.md`](validation/012-V0_2_9_YELLOWSTONE_GRPC.md) : stratégie proto Apache + client KSP/Tonic, moteur N1, standard N2, Config V3, profils PublicNode Mainnet/Testnet authentifiés par `x-token` secret et smoke live `Subscribe` validé sur les deux réseaux. La candidate `0.2.10 — OrbitFlare Yellowstone gRPC` est réconciliée dans [`plans/017-V0_2_10_ORBITFLARE_YELLOWSTONE_GRPC_PLAN.md`](plans/017-V0_2_10_ORBITFLARE_YELLOWSTONE_GRPC_PLAN.md) et [`validation/013-V0_2_10_ORBITFLARE_YELLOWSTONE_GRPC.md`](validation/013-V0_2_10_ORBITFLARE_YELLOWSTONE_GRPC.md) : Devnet `http://devnet.rpc.orbitflare.com:10000`, License Key `ORBIT-*` injectée comme metadata secrète `x-token`, Config Transport V3 inchangée, live `Subscribe -> Slot + Ping` passé, aucun overlay provider et aucun heartbeat supplémentaire. Le sujet de la release suivante reste volontairement non figé pendant `pre.004` et doit être décidé avant la tranche publication-minimale. ## Spécifications de formats diff --git a/docs/plans/002-FUNCTIONAL_RELEASE_SEQUENCE.md b/docs/plans/002-FUNCTIONAL_RELEASE_SEQUENCE.md index 2a45423..cf6a9ac 100644 --- a/docs/plans/002-FUNCTIONAL_RELEASE_SEQUENCE.md +++ b/docs/plans/002-FUNCTIONAL_RELEASE_SEQUENCE.md @@ -365,11 +365,10 @@ Par défaut : 0.2.8 Helius LaserStream WebSocket 0.2.9 Yellowstone gRPC engine + Solana standard + PublicNode 0.2.10 OrbitFlare Yellowstone gRPC -0.2.11 Helius LaserStream gRPC -0.2.12 off-chain price transport -0.2.13 price visualization desk + intégration prix dans Wallet Desk -0.2.14 interface/wire foundation -0.2.15 program-api foundation +0.2.11 off-chain price transport +0.2.12 price visualization desk + intégration prix dans Wallet Desk +0.2.13 interface/wire foundation +0.2.14 program-api foundation ``` `0.2.1-pre.001` a appliqué le gate de sizing et refusé le scope HTTP monolithique initial : l'inventaire du 2026-08-17 contient 52 méthodes courantes et 14 méthodes Deprecated historiques. Ce premier delta avait réparti la couverture typée sur `0.2.1`–`0.2.6`. `0.2.1-pre.001-fix.001` recalibre ensuite les 48 méthodes restantes sur trois releases complémentaires `0.2.2`–`0.2.4`, soit trois sessions nominales au maximum si chaque release utilise sa session complète. Si une release se clôt plus vite que prévu, la même session peut enchaîner la suivante après clôture complète de la précédente et nouveau gate de sizing positif. Un Wallet Desk utile doit pouvoir lire le solde du wallet : `getBalance` fait donc partie des quatre canaris de la foundation `0.2.1`, avant Wallet. Les transports live arrivent ensuite ; Interface/Program restent préparés avant les couches de données décodées. @@ -487,15 +486,12 @@ Mission active : obtenir en priorité un provider Yellowstone gratuit sur **Devn Le plan actif est [`017-V0_2_10_ORBITFLARE_YELLOWSTONE_GRPC_PLAN.md`](017-V0_2_10_ORBITFLARE_YELLOWSTONE_GRPC_PLAN.md) et la matrice active [`../validation/013-V0_2_10_ORBITFLARE_YELLOWSTONE_GRPC.md`](../validation/013-V0_2_10_ORBITFLARE_YELLOWSTONE_GRPC.md). -### `0.2.11` — Helius LaserStream gRPC - -Cette release réauditera Helius indépendamment après fermeture stable de `0.2.10`. Elle réutilisera le même moteur N1 et le standard N2 sans les modifier ; seules les capacités, restrictions, auth et policies provider démontrées pourront être ajoutées au-dessus. - ### TODO/IDEAS — providers Yellowstone en attente Aucune release n'est réservée pour : ```text +TODO Helius LaserStream gRPC — réauditer lorsque l'accès live gRPC est disponible TODO eRPC TODO Triton TODO Alchemy @@ -508,23 +504,25 @@ IDEAS NodeFlare IDEAS autres providers à réauditer ``` +Helius LaserStream gRPC est explicitement reporté : l'audit 2026-08-25 indique une compatibilité wire Yellowstone élevée et une intégration KSP probablement légère au-dessus de N1/N2, mais aucun accès live Helius gRPC n'est actuellement disponible sans plan payant. Il ne reçoit donc plus de numéro de release tant que l'auth, les endpoints, le Subscribe, le Ping, le replay/from_slot et les erreurs provider ne peuvent pas être validés live. Les extensions Helius non standard, notamment les preprocessed transactions, restent un sujet provider séparé. + Ces providers ne déplacent pas la séquence active et ne reçoivent ni façade, ni Config profile, ni smoke tant qu'une décision explicite d'implémentation n'est pas prise. -### `0.2.12` / `0.2.13` — Off-chain price + app +### `0.2.11` / `0.2.12` — Off-chain price + app -`0.2.12` introduit `ksp-offchain-transport-lib` avec au minimum SOL/USD et SOL/EUR via une abstraction indépendante du premier provider. +`0.2.11` introduit `ksp-offchain-transport-lib` avec au minimum SOL/USD et SOL/EUR via une abstraction indépendante du premier provider. -`0.2.13` ajoute une petite application desk de visualisation/validation. Après stabilisation de cette application spécialisée, la même release doit intégrer la capacité de prix offchain dans `ksp-app-wallet-desk` sans dupliquer la récupération/normalisation appartenant au composant spécialisé. +`0.2.12` ajoute une petite application desk de visualisation/validation. Après stabilisation de cette application spécialisée, la même release doit intégrer la capacité de prix offchain dans `ksp-app-wallet-desk` sans dupliquer la récupération/normalisation appartenant au composant spécialisé. Metadata HTTP/IPFS/Arweave viendra au premier besoin Metadata réel. -### `0.2.14` — Interface foundation +### `0.2.13` — Interface foundation `ksp-interface-lib` devient la façade wire officielle et expose une API publique wire utilisable par les implementations officielles et externes. Aucune `ksp-interface-api` séparée n'est retenue pour l'instant. -### `0.2.15` — Program API foundation +### `0.2.14` — Program API foundation Introduire `ksp-program-api`, sans suffixe `-lib`, comme contrat d'extension Program. diff --git a/docs/plans/017-V0_2_10_ORBITFLARE_YELLOWSTONE_GRPC_PLAN.md b/docs/plans/017-V0_2_10_ORBITFLARE_YELLOWSTONE_GRPC_PLAN.md index f50bd19..9742ed8 100644 --- a/docs/plans/017-V0_2_10_ORBITFLARE_YELLOWSTONE_GRPC_PLAN.md +++ b/docs/plans/017-V0_2_10_ORBITFLARE_YELLOWSTONE_GRPC_PLAN.md @@ -1,9 +1,9 @@ - + # Plan `0.2.10` — OrbitFlare Yellowstone gRPC -**Statut courant : `0.2.10-pre.002-fix.001` corrige l’hypothèse d’auth de `pre.002`. Le live sans metadata a atteint OrbitFlare puis `SubscribeOpen` a été rejeté `Unauthenticated`. Le Dashboard opérateur et la référence Yellowstone OrbitFlare établissent désormais que la License Key `ORBIT-*` du produit Solana Free doit être envoyée comme metadata secrète `x-token`. Config V3 et le smoke sont corrigés sans aucune modification N1/N2 ; le rerun authentifié `Slot + Ping` reste le gate live.** +**Statut courant : le gate technique/live final `0.2.10-pre.003` est vert. OrbitFlare Devnet est validé avec la License Key `ORBIT-*` portée par la metadata secrète `x-token` ; le smoke final observe un Slot non nul puis le `SubscribeUpdate::Ping` Yellowstone standard et ferme proprement la session. N1 et N2 restent inchangés, aucune façade provider ni heartbeat N3 n’est nécessaire. `0.2.10-pre.004` est exclusivement la réconciliation documentaire finale.** ## 1. Base et autorité @@ -326,23 +326,31 @@ Cette propriété est testée déterministiquement par le moteur N1. ### 8.4 Décision `pre.001` -**Aucun heartbeat OrbitFlare supplémentaire n'est retenu à ce stade.** +La décision initiale de ne pas modifier le moteur est confirmée par le live final. -Le premier smoke Devnet doit vérifier que l'endpoint OrbitFlare émet bien le `SubscribeUpdate::Ping` standard. Si ce Ping live est observé, la combinaison suivante suffit : +Le smoke authentifié `pre.002-fix.001`, puis son rerun dans `pre.003`, ont observé le `SubscribeUpdate::Ping` standard sur OrbitFlare Devnet : ```text OrbitFlare server Ping live + KSP N1 automatic Ping reply deterministic test = -client-side activity périodique sans code provider supplémentaire +activité bidirectionnelle standard suffisante sans code provider supplémentaire ``` -Il est interdit d'ajouter un timer dans `grpc_stream.rs` ou `YellowstoneGrpcSessionSettings` pour OrbitFlare. +Résultat final : -Si le live montre qu'OrbitFlare ne produit pas le Ping standard ou exige réellement un heartbeat proactif indépendant, cela ouvre un **gate provider spécifique séparé**. La solution doit alors être composée au-dessus de N1 sans modifier le moteur et sans corrompre la requête de reconnect mémorisée. +```text +heartbeat OrbitFlare N3 non nécessaire +façade provider non nécessaire +YellowstoneGrpcSessionSettings inchangé +grpc_stream.rs inchangé +latest_request reconnect sémantique N1 préservée +``` -Point de sécurité important : appeler naïvement la mutation standard avec un request `ping` seul n'est pas acceptable, car le moteur mémorise la dernière mutation complète pour le replay/reconnect. Une éventuelle façade provider doit préserver cette sémantique au lieu de contourner N1. +Il reste interdit d'ajouter un timer dans `grpc_stream.rs` ou `YellowstoneGrpcSessionSettings` pour OrbitFlare. La recommandation provider d’un ping client périodique ne devient pas une policy globale tant que le chemin standard serveur Ping -> réponse automatique N1 satisfait le service live. + +Le point de sécurité initial reste durable : envoyer naïvement une requête `ping` seule via la mutation publique remplacerait la dernière subscription mémorisée pour reconnect. Si un futur provider exige un heartbeat proactif indépendant, cette policy doit être composée au-dessus de N1 sans corrompre cette sémantique. ## 9. Capabilities OrbitFlare @@ -366,7 +374,7 @@ Le CLI/SDK montre également les filtres account/transaction/slot/block standard ### 9.2 Surface non encore prouvée provider -Ces capacités existent dans N2 KSP mais ne sont pas déclarées supportées sur OrbitFlare sans preuve supplémentaire : +Ces capacités existent dans N2 KSP mais n'ont pas été exhaustivement sondées sur le plan OrbitFlare Free pendant `0.2.10` : ```text SubscribeReplayInfo @@ -381,16 +389,18 @@ transactions_status complet champs récents compressed/cuckoo/token expansion selon endpoint déployé ``` -L'absence de documentation n'est pas une preuve d'absence. Le live provider doit distinguer : +La clôture de `0.2.10` ne transforme pas l'absence de probe en absence de support. Le live final requis portait sur le chemin opérationnel utile à la release : authentification, standard Subscribe, Slot, Ping serveur et close borné. + +Classification durable : ```text -standard KSP disponible -provider support prouvé -provider entitlement éventuel -unknown non testé +standard KSP disponible oui dans N2 +provider support live prouvé Subscribe slots + commitment + Ping +provider entitlement éventuel provider-owned +reste unknown / non exhaustivement testé ``` -Aucune capacité N2 n'est supprimée du standard global à cause d'une restriction OrbitFlare. +Aucune capacité N2 n'est supprimée du standard global à cause d'une restriction ou d'un inconnu OrbitFlare. ## 10. Limits et quotas utiles @@ -401,7 +411,7 @@ La documentation actuelle des services partagés indique : | connexions gRPC simultanées | 50 par IP | information provider, pas borne N1 | | portée du cap | globale par IP et régions gRPC partagées | éviter les reconnect storms | | subscriptions par connexion | unlimited | ne pas convertir en garantie universelle | -| idle timeout | environ 10 minutes | gate heartbeat live | +| idle timeout | environ 10 minutes | chemin Ping standard validé live | | dépassement | gRPC `RESOURCE_EXHAUSTED` | status distant safe existant | | reconnect conseillé | exponential backoff | KSP N1 possède déjà un budget/backoff borné | @@ -459,35 +469,50 @@ cluster = devnet protocol = solana_yellowstone auth = x-token <- License Key lue sur stdin request = Subscribe slots à commitment confirmed -preuve = au moins un Slot non nul +preuve = au moins un Slot non nul + SubscribeUpdate::Ping close = borné ``` -La valeur secrète ne doit apparaître ni dans Debug ni dans la ligne de commande. +La valeur secrète n'apparaît ni dans Debug ni dans la ligne de commande. + +Résultats opérateur : + +```text +pre.002-fix.001 Subscribe -> Slot + Ping PASS en 5.10 s +pre.003 final Subscribe -> Slot + Ping PASS en 5.19 s +``` + +Le second passage ferme le gate live sur la version `0.2.10-pre.3` utilisée pour la clôture technique. ### 12.3 Preuve heartbeat -Le smoke corrigé attend encore suffisamment pour observer : +Le `SubscribeUpdate::Ping` standard est observé live sur OrbitFlare Devnet avec l'auth correcte. + +La combinaison suivante est donc prouvée : ```text -SubscribeUpdate::Ping +Subscribe authentifié +-> Slot non nul +-> SubscribeUpdate::Ping serveur +-> chemin de réponse automatique N1 déjà couvert déterministiquement +-> close borné ``` -Un `Ping` serveur live, combiné au test déterministe N1 qui prouve la réponse automatique, ferme le besoin heartbeat sans code OrbitFlare. Si aucun Ping serveur n’est observé après authentification, cette divergence est traitée dans une tranche provider dédiée au-dessus de N1/N2. - -Le smoke final durable peut rester court après cette caractérisation ; il n’a pas besoin de patienter 10 minutes à chaque workspace run. +Verdict final : aucune divergence heartbeat OrbitFlare ne justifie une façade ou une policy provider. Le moteur gRPC et le standard Yellowstone restent inchangés. ### 12.4 Unary et replay -Après le canari Subscribe authentifié : +Les sept unary N2, `SubscribeReplayInfo` et la retention `from_slot` n'ont pas été rendus obligatoires pour le gate OrbitFlare Free. + +Cette décision évite de confondre : ```text -probe 7 unary N2 -probe SubscribeReplayInfo -probe from_slot si support observable +complétude du standard KSP N2 +support/entitlement d'un provider particulier +preuve minimale nécessaire à la mission Devnet de 0.2.10 ``` -Les probes provider ne doivent pas rendre indisponible le smoke minimal `Subscribe -> Slot` si le plan gratuit restreint certaines unary. +Le moteur N1 reste capable d'utiliser `SubscribeReplayInfo` quand il est disponible et tolère son indisponibilité pendant reconnect en poursuivant avec le `from_slot` conservateur demandé. Aucun comportement provider n'est introduit pour combler un inconnu de service. ## 13. Threat model recalibré @@ -541,44 +566,25 @@ README/USAGE dans la tranche documentaire finale ## 15. Forecast recalibré -Le fix d’auth ne change pas l’ordre des couloirs finaux. +Le chemin effectif de `0.2.10` est désormais figé : ```text -pre.001 audit actuel + architecture immuable N1/N2 + auth/endpoints + free Devnet + heartbeat + sizing - preuve : plan 017 + validation 013 + delta + baseline - -pre.002 profil Config V3 OrbitFlare Devnet + smoke de caractérisation standard N2 - hypothèse initiale sans metadata ; live classifie Unauthenticated au SubscribeOpen - -pre.002-fix.001 - corrige l’auth par License Key -> secret x-token - adapte .env.example, Config test et smoke stdin - live : Subscribe -> Slot + observation Ping serveur ; aucune modification moteur gRPC - -pre.003 soit gate technique/live final si le rerun authentifié reste 100 pourcent standard, - soit tranche provider-specific minimale uniquement si le live démontre une divergence heartbeat réelle - -pre.004 gate technique/live final si pre.003 a porté une divergence ; sinon réconciliation documentaire finale - -pre.005 publication minimale si pre.004 est documentaire ; sinon réconciliation documentaire finale - -pre.006 publication minimale uniquement si la divergence a décalé les couloirs précédents - -rel.001 publication stable stricte +pre.001 audit actuel + architecture immuable N1/N2 + auth/endpoints + Free Devnet + heartbeat + sizing +pre.002 profil Config V3 OrbitFlare Devnet + smoke de caractérisation sans metadata +pre.002-fix.001 auth corrigée : License Key -> secret x-token ; live Subscribe -> Slot + Ping PASS +pre.003 gate technique/live final ; workspace + graphes + rerun OrbitFlare PASS +pre.004 réconciliation documentaire finale +pre.005 publication minimale après décision explicite sur la release suivante +rel.001 publication stable stricte ``` -Chemins effectifs : +La branche de divergence heartbeat n'a pas été déclenchée. Aucun couloir supplémentaire n'est requis. -```text -standard pre.001 -> pre.002 -> pre.002-fix.001 -> pre.003 technique -> pre.004 docs -> pre.005 publication -> rel.001 -divergence pre.001 -> pre.002 -> pre.002-fix.001 -> pre.003 provider -> pre.004 technique -> pre.005 docs -> pre.006 publication -> rel.001 -``` - -Le numéro n’est jamais le critère de clôture ; l’ordre technique, documentaire, publication reste obligatoire. +Le numéro n'est jamais le critère de clôture ; l'ordre technique, documentaire puis publication reste obligatoire. ## 16. Critères de split -Ouvrir une tranche provider dédiée avant le gate final si et seulement si le live démontre l'un de ces cas : +Les critères de split définis pendant l'audit étaient : ```text OrbitFlare n'émet pas le Ping standard et exige un Ping client proactif @@ -589,39 +595,65 @@ le replay/from_slot exige une policy provider visible au consumer un failover provider impose une sémantique que N1 ne peut pas composer sans modification ``` -Dans le dernier cas, ne pas modifier N1 dans `0.2.10` : qualifier le blocker et replanifier l'architecture. +**Aucun de ces critères n'a été déclenché par le gate live final.** + +Le principe reste durable pour les providers futurs : si une divergence ne peut pas être composée proprement au-dessus de N1/N2, ne pas modifier le moteur pour le provider ; qualifier le blocker et replanifier l'architecture. ## 17. Critères de clôture -`0.2.10` est stable seulement si : +État à l'entrée de `pre.004` : ```text -Devnet OrbitFlare Free réellement atteint par KSP ou bloc externe qualifié -N1 gRPC inchangé -N2 Yellowstone inchangé -aucun SDK OrbitFlare runtime -provider/auth correctement classifiés -aucune Customer API key sur le data-plane Yellowstone -heartbeat live classifié -Config V3 cohérente sans nouveau format inutile -smoke provider architecture-safe -PublicNode non régressé -Yellowstone standard non régressé -HTTP 52+14 non régressé -WebSocket standard 18/18 non régressé -Helius WebSocket non régressé -workspace complet vert -graphes Cargo inspectés -réconciliation documentaire séparée -publication minimale séparée +Devnet OrbitFlare Free atteint par KSP PASS +N1 gRPC inchangé PASS +N2 Yellowstone inchangé PASS +aucun SDK OrbitFlare runtime PASS +provider/auth correctement classifiés PASS +aucune Customer API key sur le data-plane Yellowstone PASS +heartbeat live classifié PASS +Config V3 cohérente sans nouveau format PASS +smoke provider architecture-safe PASS +PublicNode non régressé déterministiquement PASS +Yellowstone standard non régressé PASS +HTTP 52+14 non régressé PASS +WebSocket standard 18/18 non régressé PASS +Helius WebSocket non régressé PASS +workspace complet vert PASS +graphes Cargo inspectés PASS +réconciliation documentaire séparée EN COURS pre.004 +publication minimale séparée À FAIRE pre.005 ``` +Le gate technique est donc fermé. La stabilité `0.2.10` reste conditionnée à la validation documentaire `pre.004`, au couloir publication-minimal `pre.005`, puis à `rel.001`. + ## 18. Release suivante -La release suivante reste : +La décision préalable à `pre.005` est désormais prise. L'ancien forecast : ```text 0.2.11 — Helius LaserStream gRPC ``` -Elle doit appliquer le même invariant : le moteur gRPC `0.2.9` est une fondation stable ; Helius ne peut ajouter que des fonctionnalités provider au-dessus. +est reporté dans les TODO Yellowstone sans numéro de release. L'audit du 2026-08-25 conclut que la surface Helius reste largement wire-compatible Yellowstone et pourrait probablement se composer au-dessus de N1/N2, mais l'accès gRPC Helius exige actuellement un plan payant que l'opérateur ne retient pas uniquement pour ce test. La release provider est donc différée jusqu'à disponibilité d'un accès live permettant de valider réellement auth, endpoints, Subscribe, Ping, replay/from_slot et erreurs provider. Les extensions Helius non standard restent un sujet séparé. + +La séquence active avance d'un cran : + +```text +0.2.11 — off-chain price transport +0.2.12 — Price Desk + intégration prix Wallet Desk +0.2.13 — interface/wire foundation +0.2.14 — program-api foundation +``` + +Décision de publication : + +```text +aucun prompt suivant dans pre.004 +aucun changement CHANGELOG/ROADMAP dans pre.004 +Helius gRPC -> TODO futur sans numéro +0.2.11 -> off-chain price transport +pre.005 préparera seulement le prompt 0.2.11 + CHANGELOG + ROADMAP +``` + +Quel que soit le provider futur, l'invariant reste le même : N1 gRPC et N2 Yellowstone sont des fondations stables ; les différences provider se composent au-dessus et ne modifient jamais le moteur pour satisfaire un fournisseur. + diff --git a/docs/validation/013-V0_2_10_ORBITFLARE_YELLOWSTONE_GRPC.md b/docs/validation/013-V0_2_10_ORBITFLARE_YELLOWSTONE_GRPC.md index 8eb28e1..abb41f7 100644 --- a/docs/validation/013-V0_2_10_ORBITFLARE_YELLOWSTONE_GRPC.md +++ b/docs/validation/013-V0_2_10_ORBITFLARE_YELLOWSTONE_GRPC.md @@ -1,9 +1,9 @@ - + # 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 l’auth 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 n’est pas utilisé comme oracle positif pour l’aut ## 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 l’inscrire dans l’historique : +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`.