From 81eb295a0902f192bf0e4c0b016b69dda5054fbf Mon Sep 17 00:00:00 2001 From: SinuS Von SifriduS Date: Wed, 26 Aug 2026 15:45:02 +0200 Subject: [PATCH] v0.2.11-pre.012 --- Cargo.toml | 4 +- crates/ksp-offchain-transport-lib/README.md | 12 +- crates/ksp-offchain-transport-lib/USAGE.md | 37 +++- crates/ksp-offchain-transport-lib/src/lib.rs | 4 +- deltas/0.2.11/pre.012.md | 154 +++++++++++++++++ docs/000-README.md | 4 +- docs/plans/002-FUNCTIONAL_RELEASE_SEQUENCE.md | 4 +- ...8-V0_2_11_OFFCHAIN_PRICE_TRANSPORT_PLAN.md | 14 +- .../014-V0_2_11_OFFCHAIN_PRICE_TRANSPORT.md | 163 ++++++++++-------- 9 files changed, 303 insertions(+), 93 deletions(-) create mode 100644 deltas/0.2.11/pre.012.md diff --git a/Cargo.toml b/Cargo.toml index 6564d2b..e328a18 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,12 +1,12 @@ # file: Cargo.toml -# version: 283 +# version: 284 [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-offchain-transport-lib", "crates/ksp-onchain-transport-lib", "crates/ksp-wallet-lib"] [workspace.package] -version = "0.2.11-pre.11.fix.1" +version = "0.2.11-pre.12" edition = "2024" license = "MIT" repository = "https://git.sasedev.com/Sasedev/khadhroony-solana-project" diff --git a/crates/ksp-offchain-transport-lib/README.md b/crates/ksp-offchain-transport-lib/README.md index 281b660..98cf2d4 100644 --- a/crates/ksp-offchain-transport-lib/README.md +++ b/crates/ksp-offchain-transport-lib/README.md @@ -1,5 +1,5 @@ - + # ksp-offchain-transport-lib @@ -135,4 +135,12 @@ URL provider configurable - [`../../docs/plans/018-V0_2_11_OFFCHAIN_PRICE_TRANSPORT_PLAN.md`](../../docs/plans/018-V0_2_11_OFFCHAIN_PRICE_TRANSPORT_PLAN.md) — plan de release ; - [`../../docs/validation/014-V0_2_11_OFFCHAIN_PRICE_TRANSPORT.md`](../../docs/validation/014-V0_2_11_OFFCHAIN_PRICE_TRANSPORT.md) — matrice de validation. -Ce README est un **brouillon technique de `pre.010`**. La réconciliation documentaire finale reste la responsabilité de `pre.012`, après le gate technique/live de `pre.011`. +## Validation de release `0.2.11` + +La candidate finale a été validée sur les huit adapters par tests déterministes. Le smoke live keyless de clôture a réellement rafraîchi les sept modes ne nécessitant aucun credential : Coinbase Exchange, CoinGecko, CoinMarketCap, CoinPaprika, DexScreener, Jupiter et Kraken. Un premier passage a révélé le paramètre CoinMarketCap V2 erroné `ids`; `pre.011-fix.001` l'a corrigé en `id=5426`, puis le re-smoke a passé les sept providers. + +Birdeye n'expose pas de mode keyless V1. Le smoke keyed commun Birdeye/CoinGecko Demo/CoinMarketCap Basic/Jupiter Free reste opt-in et peut être `SKIP opérateur` lorsque les quatre credentials gratuits ne sont pas disponibles. KSP ne transforme jamais cette absence de credentials en preuve live fictive. + +Les offres gratuites, quotas et conditions d'usage appartiennent aux providers et peuvent évoluer indépendamment du contrat KSP. Les descriptors représentent le snapshot audité pour `0.2.11`; un changement commercial ou de quota futur peut rendre un provider indisponible sans modifier la façade provider-neutral. + +Ce README est la documentation durable de la surface `0.2.11`. Les détails de construction et les commandes de smoke sont conservés dans [`USAGE.md`](USAGE.md), tandis que le plan et la matrice de validation enregistrent les décisions et preuves de release. diff --git a/crates/ksp-offchain-transport-lib/USAGE.md b/crates/ksp-offchain-transport-lib/USAGE.md index 620f980..8832a4d 100644 --- a/crates/ksp-offchain-transport-lib/USAGE.md +++ b/crates/ksp-offchain-transport-lib/USAGE.md @@ -1,9 +1,9 @@ - + # Usage de ksp-offchain-transport-lib -Cette page montre la surface technique disponible à `0.2.11-pre.010`. Les credentials et documents runtime doivent normalement être résolus par `ksp-config-lib`; les constructions directes ci-dessous servent surtout aux tests, outils bas niveau et compositions programmatiques maîtrisées. +Cette page documente la surface stable préparée pour `0.2.11`. Les credentials et documents runtime doivent normalement être résolus par `ksp-config-lib`; les constructions directes ci-dessous servent surtout aux tests, outils bas niveau et compositions programmatiques maîtrisées. ## 1. Construire un service programmatique @@ -147,6 +147,35 @@ payload de Config secret `ksp-offchain-transport-lib` utilise `ksp-logging-lib` et son `TRACING_TARGET` propriétaire ; une application ne doit pas ajouter un bypass direct `tracing` pour obtenir les payloads rejetés. -## 10. Statut documentaire +## 10. Smokes live de release -Ce document est un **brouillon technique de `pre.010`**. Il ne vaut ni smoke live, ni garantie commerciale sur les plans gratuits des providers. `pre.011` porte les contrôles techniques/live finaux ; `pre.012` porte la réconciliation documentaire finale. +Le smoke keyless final ne requiert aucun secret et couvre les sept modes V1 concernés : + +```bash +cargo test -p ksp-offchain-transport-lib \ + --test market_price_live_smoke \ + keyless_market_price_providers_live_smoke \ + -- --ignored --exact --nocapture --test-threads=1 +``` + +Le gate `0.2.11-pre.011-fix.001` a passé ce smoke en `7/7`. Le test ne compare jamais les providers à un prix exact commun : il valide l'identité, la paire SOL/USD, la sémantique, un prix canonique positif et la cohérence des timestamps disponibles. + +Le smoke keyed reste volontairement distinct. Il lit quatre clés sur `stdin`, dans l'ordre Birdeye, CoinGecko Demo, CoinMarketCap Basic et Jupiter Free : + +```bash +printf '%s\n%s\n%s\n%s\n' \ + "$KSP_SECRET_BIRDEYE_API_KEY" \ + "$KSP_SECRET_COINGECKO_DEMO_API_KEY" \ + "$KSP_SECRET_COINMARKETCAP_API_KEY" \ + "$KSP_SECRET_JUPITER_API_KEY" \ +| cargo test -p ksp-offchain-transport-lib \ + --test market_price_live_smoke \ + keyed_market_price_providers_live_smoke \ + -- --ignored --exact --nocapture --test-threads=1 +``` + +Ce second smoke peut être omis si l'opérateur ne possède pas les quatre credentials ; l'absence de credentials doit alors rester explicitement `SKIP opérateur`. + +## 11. Statut documentaire + +Ce document est la référence d'usage durable de la surface `market_price` livrée par `0.2.11`. Il ne promet ni prix identique entre providers, ni disponibilité permanente de leurs plans gratuits, ni compatibilité avec une surface provider qui changerait après la release. diff --git a/crates/ksp-offchain-transport-lib/src/lib.rs b/crates/ksp-offchain-transport-lib/src/lib.rs index cf1b613..508a74d 100644 --- a/crates/ksp-offchain-transport-lib/src/lib.rs +++ b/crates/ksp-offchain-transport-lib/src/lib.rs @@ -1,5 +1,5 @@ // file: crates/ksp-offchain-transport-lib/src/lib.rs -// version: 11 +// version: 12 #![warn(missing_docs)] #![deny(unreachable_pub)] @@ -7,7 +7,7 @@ //! KSP-owned off-chain transport foundation. //! -//! `0.2.11-pre.010` hardens the complete SOL/USD V1 surface over eight providers. The crate owns exact decimal normalization, provider adapters, hardened +//! `0.2.11` delivers the complete SOL/USD V1 surface over eight providers. The crate owns exact decimal normalization, provider adapters, hardened //! HTTP, non-blocking rate-limit/cooldown handling, provider-neutral registry/availability and individual/multiple/all refresh operations. Provider-specific //! setup remains confined to composition while runtime consumers can operate on opaque provider identifiers, registry projections and normalized outcomes. //! Config integration is implemented externally by `ksp-config-lib`; this crate remains independent from Config and never reads KSP environment variables diff --git a/deltas/0.2.11/pre.012.md b/deltas/0.2.11/pre.012.md new file mode 100644 index 0000000..1c486cc --- /dev/null +++ b/deltas/0.2.11/pre.012.md @@ -0,0 +1,154 @@ + + + +# Delta `0.2.11-pre.012` — réconciliation documentaire finale Off-chain price + +## 1. Base + +```text +0.2.11-pre.011-fix.001 +``` + +Cette tranche est exclusivement le couloir de réconciliation documentaire finale. Elle ne modifie aucun comportement Rust, test, schema, Config exécutable, endpoint provider, dépendance ou feature. Le seul fichier `.rs` touché est la rustdoc crate-root, afin de retirer une référence obsolète à `pre.010`. + +## 2. Fermeture de la lane technique/live + +Le gate `pre.011` a passé les validations déterministes complètes et les graphes Cargo. Son premier smoke keyless a tenté les sept providers et a isolé CoinMarketCap comme seul échec. + +`pre.011-fix.001` a corrigé le builder CoinMarketCap Simple Price V2 : + +```text +ids=5426 -> id=5426 +``` + +Le re-smoke opérateur du `2026-08-26` a ensuite confirmé : + +```text +keyless_market_price_providers_live_smoke 1/1 PASS +providers keyless réellement couverts 7/7 PASS +``` + +Les sept adapters couverts sont Coinbase Exchange, CoinGecko, CoinMarketCap, CoinPaprika, DexScreener, Jupiter et Kraken. + +Le smoke keyed Birdeye/CoinGecko Demo/CoinMarketCap Basic/Jupiter Free n'a pas été exécuté faute des quatre credentials gratuits simultanés. Son statut final reste donc explicitement : + +```text +SKIP opérateur +``` + +Il n'est jamais converti en PASS fictif. + +## 3. Version technique + +```text +workspace.package.version = 0.2.11-pre.12 +commit attendu = v0.2.11-pre.012 +aucun tag prerelease +``` + +Le changement Cargo est mécanique ; aucune sémantique runtime ne change. + +## 4. Documents réconciliés + +```text +docs/plans/002-FUNCTIONAL_RELEASE_SEQUENCE.md +docs/plans/018-V0_2_11_OFFCHAIN_PRICE_TRANSPORT_PLAN.md +docs/validation/014-V0_2_11_OFFCHAIN_PRICE_TRANSPORT.md +crates/ksp-offchain-transport-lib/README.md +crates/ksp-offchain-transport-lib/USAGE.md +crates/ksp-offchain-transport-lib/src/lib.rs — rustdoc seulement +docs/000-README.md +``` + +Les README/USAGE Config ont été relus mais ne nécessitent aucun changement : le document `std.offchain_transport`, les règles de provenance Secret/Public et la direction `Config -> Off-chain Transport` y sont déjà décrits durablement. + +## 5. Réconciliation finale du contrat `0.2.11` + +La release candidate porte exactement : + +```text +SOL/USD uniquement +8 adapters REST V1 +reqwest sans SDK provider +MarketPriceDecimal exact sans vérité canonique f64 +MarketPriceObservation avec sémantique/provenance/timestamps +registry + availability provider-neutral +rate limits/cooldowns possédés par Off-chain Transport +refresh / refresh_many / refresh_all génériques +refresh multiple V1 séquentiel et déterministe +Config std.offchain_transport +origines provider fixes +DexScreener pair address explicite, aucune discovery +aucun fallback, consensus ou moyenne KSP +``` + +Le statut `QuotaUnavailable` est documenté comme état générique représentable. `0.2.11` ne prétend pas disposer d'un compteur quota live authoritative pour chaque provider. + +Les erreurs de schema/wire provider sont déjà classées par le code `market_price.provider_response_invalid`; la validation finale ne les laisse plus artificiellement `PLANNED`. + +## 6. Références durables + +`crates/ksp-offchain-transport-lib/README.md` devient la référence de responsabilité/architecture de la crate et `USAGE.md` la référence d'utilisation de la façade `market_price` ainsi que des commandes de smoke opt-in. + +Le statut de brouillon `pre.010` est supprimé. Le README enregistre le résultat live final keyless `7/7` et le statut keyed `SKIP opérateur` sans transformer les conditions commerciales des providers en garantie KSP. + +La séquence fonctionnelle conserve la release suivante : + +```text +0.2.12 — ksp-app-solprices-desk + intégration prix dans Wallet Desk +``` + +`0.2.12` reste HID : aucune logique provider, endpoint, credential, rate-limit ou normalisation prix ne doit migrer dans Tauri/frontend. + +## 7. Frontière avec `pre.013` + +Cette tranche ne touche pas : + +```text +CHANGELOG.md +ROADMAP.md +prompt 0.2.12 +``` + +Ces surfaces appartiennent exclusivement à `pre.013`, en plus de son bump Cargo mécanique et de son delta. + +Si un défaut technique ou documentaire durable est découvert après le gate de `pre.012`, il ne doit pas être glissé dans `pre.013`; une nouvelle prerelease du couloir approprié doit être ouverte. + +## 8. Fichiers ajoutés/modifiés + +```text +Cargo.toml +docs/000-README.md +docs/plans/002-FUNCTIONAL_RELEASE_SEQUENCE.md +docs/plans/018-V0_2_11_OFFCHAIN_PRICE_TRANSPORT_PLAN.md +docs/validation/014-V0_2_11_OFFCHAIN_PRICE_TRANSPORT.md +crates/ksp-offchain-transport-lib/README.md +crates/ksp-offchain-transport-lib/USAGE.md +crates/ksp-offchain-transport-lib/src/lib.rs +deltas/0.2.11/pre.012.md +``` + +## 9. Gate opérateur + +Comme `pre.012` ne modifie aucune surface technique : + +```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.11 +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 : le smoke keyless `7/7` et les graphes Cargo appartiennent à la lane technique/live déjà fermée. + +## 10. Suite + +Si ce gate est vert : + +```text +0.2.11-pre.013 — préparation minimale de publication +``` + +`pre.013` reste limitée au prompt de `0.2.12`, à `CHANGELOG.md`, à `ROADMAP.md`, au bump Cargo mécanique et à son delta. diff --git a/docs/000-README.md b/docs/000-README.md index 0730ce0..b19df1b 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. 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. La release active `0.2.11 — Off-chain price transport` est ouverte par [`plans/018-V0_2_11_OFFCHAIN_PRICE_TRANSPORT_PLAN.md`](plans/018-V0_2_11_OFFCHAIN_PRICE_TRANSPORT_PLAN.md) et suivie par [`validation/014-V0_2_11_OFFCHAIN_PRICE_TRANSPORT.md`](validation/014-V0_2_11_OFFCHAIN_PRICE_TRANSPORT.md) : SOL/USD V1, huit providers REST gratuits sans SDK, ownership des rate limits/indisponibilités dans Off-chain Transport et future `ksp-app-solprices-desk` purement HID. +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. La candidate `0.2.11 — Off-chain price transport` est réconciliée dans [`plans/018-V0_2_11_OFFCHAIN_PRICE_TRANSPORT_PLAN.md`](plans/018-V0_2_11_OFFCHAIN_PRICE_TRANSPORT_PLAN.md) et [`validation/014-V0_2_11_OFFCHAIN_PRICE_TRANSPORT.md`](validation/014-V0_2_11_OFFCHAIN_PRICE_TRANSPORT.md) : SOL/USD V1, huit adapters REST sans SDK provider, décimal exact, registry/availability/rate limits possédés par Off-chain Transport, Config `std.offchain_transport`, refresh individuel/multiple provider-neutral et smoke live keyless final `7/7` après correction CoinMarketCap V2. [`../crates/ksp-offchain-transport-lib/README.md`](../crates/ksp-offchain-transport-lib/README.md) et [`../crates/ksp-offchain-transport-lib/USAGE.md`](../crates/ksp-offchain-transport-lib/USAGE.md) deviennent les références durables ; la future `ksp-app-solprices-desk` reste une HID sans logique provider. ## Spécifications de formats diff --git a/docs/plans/002-FUNCTIONAL_RELEASE_SEQUENCE.md b/docs/plans/002-FUNCTIONAL_RELEASE_SEQUENCE.md index ddba4a1..9dfe9cc 100644 --- a/docs/plans/002-FUNCTIONAL_RELEASE_SEQUENCE.md +++ b/docs/plans/002-FUNCTIONAL_RELEASE_SEQUENCE.md @@ -1,5 +1,5 @@ - + # Séquence des releases fonctionnelles KSP @@ -510,7 +510,7 @@ Ces providers ne déplacent pas la séquence active et ne reçoivent ni façade, ### `0.2.11` / `0.2.12` — Off-chain price + SOL Prices Desk -`0.2.11` introduit `ksp-offchain-transport-lib` avec une première surface volontairement limitée à SOL/USD. Le gate `pre.001` retient plusieurs providers gratuits accessibles en HTTP REST simple ; leurs adapters utilisent uniquement `reqwest` et des DTOs KSP privés, sans SDK provider. Off-chain Transport possède le registry provider, les capacités/rate limits, les indisponibilités et les refresh individuels/multiples ; aucun consensus ou fallback automatique multi-provider n'est introduit. +`0.2.11` introduit `ksp-offchain-transport-lib` avec une première surface volontairement limitée à SOL/USD. La release retient huit adapters REST (`CoinGecko`, `CoinMarketCap`, `CoinPaprika`, `Kraken`, `Coinbase Exchange`, `Jupiter Price V3`, `Birdeye`, `DexScreener`) utilisant `reqwest` et des DTOs KSP privés, sans SDK provider. Off-chain Transport possède le registry, les capacités/rate limits, les indisponibilités et les refresh individuels/multiples séquentiels ; Config construit le service depuis `std.offchain_transport`. Le gate live final keyless passe `7/7` après correction du paramètre CoinMarketCap Simple Price V2. Aucun consensus, fallback automatique ou découverte de pool DexScreener n'est introduit. `0.2.12` ajoute `ksp-app-solprices-desk`, HID pure qui ne connaît aucun provider et consomme uniquement les descriptors, observations, états et opérations génériques de `ksp-offchain-transport-lib`. Sa première vue liste les providers/prix et permet refresh individuel/multiple en laissant entièrement les limitations au service. 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é. diff --git a/docs/plans/018-V0_2_11_OFFCHAIN_PRICE_TRANSPORT_PLAN.md b/docs/plans/018-V0_2_11_OFFCHAIN_PRICE_TRANSPORT_PLAN.md index 48e8282..683eab0 100644 --- a/docs/plans/018-V0_2_11_OFFCHAIN_PRICE_TRANSPORT_PLAN.md +++ b/docs/plans/018-V0_2_11_OFFCHAIN_PRICE_TRANSPORT_PLAN.md @@ -1,9 +1,9 @@ - + # Plan `0.2.11` — Off-chain price transport SOL/USD multi-provider -**Statut courant : `0.2.11-pre.011-fix.001` corrige le contrat de requête CoinMarketCap Simple Price V2 après le premier smoke live. Le gate déterministe de `pre.011` est PASS et six providers keyless sur sept ont répondu correctement ; CoinMarketCap a échoué parce que KSP envoyait encore `ids=5426` alors que la surface V2 officielle exige `id=5426`. Le re-smoke keyless opérateur reste requis avant `pre.012`.** +**Statut courant : `0.2.11-pre.012` réconcilie la documentation finale après fermeture de la lane technique/live. Le gate déterministe complet de `pre.011` est PASS ; `pre.011-fix.001` a corrigé CoinMarketCap Simple Price V2 de `ids=5426` vers `id=5426`, puis le re-smoke keyless opérateur a passé les sept providers sans credential. Le smoke keyed commun reste `SKIP opérateur` autorisé faute des quatre credentials gratuits. Aucun changement runtime n'est introduit dans `pre.012`.** ## 1. Base et autorité @@ -805,21 +805,21 @@ Durcissement de la façade publique avec `#[non_exhaustive]` sur les enums évol ### `pre.011` — Gate technique et live final -**Statut : implémenté ; gate déterministe et smokes opérateur à exécuter.** +**Statut : réalisé ; gate déterministe complet PASS, premier smoke keyless 6/7 puis correctif ciblé.** Nouvel audit final des huit contrats provider, ajout de `tests/market_price_live_smoke.rs`, smoke keyless de sept providers, smoke keyed des quatre modes gratuits avec secrets sur `stdin`, vérification des graphes Cargo et reprise du gate workspace complet. Aucun endpoint, parser, rate-limit, Config ou comportement de refresh n'est modifié par cette tranche. #### `pre.011-fix.001` — Paramètre CoinMarketCap Simple Price V2 -**Statut : implémenté ; re-smoke keyless opérateur requis.** +**Statut : réalisé ; re-smoke keyless 7/7 PASS.** -Le premier smoke live keyless de `pre.011` a tenté les sept providers et n'a remonté qu'un échec CoinMarketCap. Le réaudit officiel ciblé a confirmé que `GET /v2/simple/price` et son équivalent keyless `/public-api/v2/simple/price` utilisent le paramètre `id`, singulier. L'adapter KSP envoyait encore `ids`, hérité d'une forme préparatoire erronée. Le correctif remplace uniquement `ids=5426` par `id=5426` pour les modes Keyless et Basic et ajoute un canari exact sur la query string. Aucun endpoint, parser, rate-limit, credential, sémantique ou contrat générique de refresh n'est modifié. +Le premier smoke live keyless de `pre.011` a tenté les sept providers et n'a remonté qu'un échec CoinMarketCap. Le réaudit officiel ciblé a confirmé que `GET /v2/simple/price` et son équivalent keyless `/public-api/v2/simple/price` utilisent le paramètre `id`, singulier. L'adapter KSP envoyait encore `ids`, hérité d'une forme préparatoire erronée. Le correctif remplace uniquement `ids=5426` par `id=5426` pour les modes Keyless et Basic et ajoute un canari exact sur la query string. Aucun endpoint, parser, rate-limit, credential, sémantique ou contrat générique de refresh n'est modifié. Le gate rejoué sur `pre.011-fix.001` confirme audits Rust/Markdown, `cargo check`, Clippy, tests Off-chain/Config et surtout le smoke keyless réel `7/7` PASS. Le `cargo test --workspace` complet avait déjà passé sur `pre.011` avant ce correctif ciblé ; `pre.012` le rejoue comme gate documentaire final. ### `pre.012` — Réconciliation documentaire finale -**Statut : planifié.** +**Statut : réalisé ; gate documentaire opérateur à exécuter.** -Réconciliation finale du plan, de la validation, des README/USAGE, de l'architecture et des références durables après les gates techniques. +Réconciliation finale du plan, de la validation, des README/USAGE Off-chain, de la séquence fonctionnelle et de l'index documentaire après fermeture du gate live keyless. Les statuts résiduels `PLANNED/PENDING` du scope V1 sont convertis en contrats réellement livrés, `SKIP opérateur` ou hors-scope explicite. Aucun comportement Rust, test, schema, Config exécutable, endpoint, dépendance ou feature n'est modifié ; seule la rustdoc crate-root retire sa référence obsolète à `pre.010`. ### `pre.013` — Préparation minimale de publication diff --git a/docs/validation/014-V0_2_11_OFFCHAIN_PRICE_TRANSPORT.md b/docs/validation/014-V0_2_11_OFFCHAIN_PRICE_TRANSPORT.md index 1eb17ea..dae86de 100644 --- a/docs/validation/014-V0_2_11_OFFCHAIN_PRICE_TRANSPORT.md +++ b/docs/validation/014-V0_2_11_OFFCHAIN_PRICE_TRANSPORT.md @@ -1,5 +1,5 @@ - + # Validation `0.2.11` — Off-chain price transport SOL/USD @@ -365,37 +365,55 @@ La tranche `pre.011` ne change aucune logique réseau de production. Elle rend u Le smoke keyless opérateur de `pre.011` a bien exécuté les sept providers avant assertion finale. Les six adapters Coinbase Exchange, CoinGecko, CoinPaprika, DexScreener, Jupiter et Kraken ont produit une observation valide. CoinMarketCap seul a terminé `TemporarilyUnavailable`. Le réaudit officiel ciblé a identifié un écart déterministe dans le builder KSP : Simple Price V2 attend `id=5426`, alors que l'adapter envoyait `ids=5426`. -| Critère | Statut | Preuve / condition opérateur | -|----------------------------------------------------|---------|----------------------------------------------------------------| -| version workspace `0.2.11-pre.11.fix.1` | PASS | `Cargo.toml` racine | -| endpoint CoinMarketCap V2 inchangé | PASS | `/v2/simple/price` et `/public-api/v2/simple/price` | -| identifiant SOL CoinMarketCap corrigé en `id=5426` | PASS | builder commun Keyless / Basic | -| query V2 exacte canarisée | PASS | `id=5426&convert=USD&include_last_updated=true` | -| parser/rate-limit/auth/sémantique inchangés | PASS | aucun autre contrat runtime modifié | -| six autres providers keyless du smoke initial | PASS | outcomes live `pre.011`, aucun autre échec | -| re-smoke keyless après fix | PENDING | obligatoire avant `pre.012` | -| smoke keyed réel | PENDING | `SKIP opérateur` permis si les quatre credentials sont absents | +| Critère | Statut | Preuve / condition opérateur | +|----------------------------------------------------|--------|-----------------------------------------------------| +| version workspace `0.2.11-pre.11.fix.1` | PASS | `Cargo.toml` racine | +| endpoint CoinMarketCap V2 inchangé | PASS | `/v2/simple/price` et `/public-api/v2/simple/price` | +| identifiant SOL CoinMarketCap corrigé en `id=5426` | PASS | builder commun Keyless / Basic | +| query V2 exacte canarisée | PASS | `id=5426&convert=USD&include_last_updated=true` | +| parser/rate-limit/auth/sémantique inchangés | PASS | aucun autre contrat runtime modifié | +| six autres providers keyless du smoke initial | PASS | outcomes live `pre.011`, aucun autre échec | +| re-smoke keyless après fix | PASS | 7/7 opérateur le 2026-08-26 | +| smoke keyed réel | SKIP | opérateur sans les quatre credentials gratuits | Ce correctif est technique et appartient toujours à la lane `pre.011`. Il ne transfère aucune responsabilité documentaire à `pre.012`. -## 4. Matrice provider prévue +## 3.16 Réconciliation documentaire `0.2.11-pre.012` -| Provider | SOL/USD V1 | Gratuit V1 | Mode auth prévu | Test déterministe | Smoke live | Statut courant | -|-------------------|------------|------------|----------------------|-------------------|------------------|----------------| -| CoinGecko | Oui | Oui | keyless ou Demo key | PASS | PASS keyless | IMPLEMENTED | -| CoinMarketCap | Oui | Oui | keyless ou Basic key | PASS | PENDING re-smoke | IMPLEMENTED | -| CoinPaprika | Oui | Oui | aucune | PASS | PASS | IMPLEMENTED | -| Kraken | Oui | Oui | aucune | PASS | PASS | IMPLEMENTED | -| Coinbase Exchange | Oui | Oui | aucune | PASS | PASS | IMPLEMENTED | -| Jupiter Price V3 | Oui | Oui | keyless ou Free key | PASS | PASS keyless | IMPLEMENTED | -| Birdeye | Oui | Oui | API key Standard | PASS | PENDING keyed | IMPLEMENTED | -| DexScreener | Oui | Oui | aucune | PASS | PASS | IMPLEMENTED | +La lane technique/live est fermée avant cette tranche : le premier smoke keyless a isolé CoinMarketCap, `pre.011-fix.001` a corrigé le paramètre V2, puis le re-smoke opérateur a passé les sept providers keyless en `7/7`. Le smoke keyed n'a pas été exécuté faute des quatre credentials gratuits simultanés et reste explicitement `SKIP opérateur`. -`AUDITED` signifie uniquement que la documentation officielle actuelle satisfait le gate d'entrée. Ce statut ne vaut pas preuve d'un smoke réseau KSP. +`pre.012` ne modifie aucun comportement Rust, test, schema, Config exécutable, dépendance ou contrat réseau. La rustdoc crate-root est seulement réconciliée pour retirer `pre.010`. La tranche prépare ensuite un dernier gate workspace sans refaire le smoke live ni les graphes Cargo. -Avant la stable, les conditions d'usage et la persistance des offres gratuites doivent être réauditées ; un provider peut rester techniquement supporté tout en nécessitant un plan différent pour certains usages. +| Critère | Statut | Preuve / condition opérateur | +|--------------------------------------------------------|---------|-------------------------------------------------| +| re-smoke keyless après CoinMarketCap fix | PASS | 7/7 le 2026-08-26 | +| smoke keyed avec quatre credentials | SKIP | credentials non disponibles ensemble | +| plan `0.2.11` réconcilié | PASS | statuts techniques/live finalisés | +| matrice provider finale | PASS | huit providers implémentés | +| README/USAGE Off-chain durables | PASS | brouillon `pre.010` supprimé | +| index documentaire réconcilié | PASS | `docs/000-README.md` | +| séquence fonctionnelle `0.2.11` / `0.2.12` réconciliée | PASS | `002-FUNCTIONAL_RELEASE_SEQUENCE.md` | +| aucune responsabilité `CHANGELOG` / `ROADMAP` / prompt | PASS | réservée à `pre.013` | +| gate workspace documentaire final | PENDING | opérateur après application exacte de `pre.012` | -## 5. Contrat public prévu +## 4. Matrice provider finale + +| Provider | SOL/USD V1 | Gratuit V1 | Mode auth prévu | Test déterministe | Smoke live | Statut courant | +|-------------------|------------|------------|----------------------|-------------------|--------------|----------------| +| CoinGecko | Oui | Oui | keyless ou Demo key | PASS | PASS keyless | IMPLEMENTED | +| CoinMarketCap | Oui | Oui | keyless ou Basic key | PASS | PASS keyless | IMPLEMENTED | +| CoinPaprika | Oui | Oui | aucune | PASS | PASS | IMPLEMENTED | +| Kraken | Oui | Oui | aucune | PASS | PASS | IMPLEMENTED | +| Coinbase Exchange | Oui | Oui | aucune | PASS | PASS | IMPLEMENTED | +| Jupiter Price V3 | Oui | Oui | keyless ou Free key | PASS | PASS keyless | IMPLEMENTED | +| Birdeye | Oui | Oui | API key Standard | PASS | SKIP keyed | IMPLEMENTED | +| DexScreener | Oui | Oui | aucune | PASS | PASS | IMPLEMENTED | + +Le smoke `PASS` signifie qu'un mode keyless de ce provider a été réellement exercé par le harness KSP de clôture. `SKIP keyed` signifie uniquement que Birdeye, qui n'a pas de mode keyless V1, n'a pas reçu de preuve live faute du jeu complet de credentials opérateur ; ses fixtures, parsing, auth et descriptors restent couverts déterministiquement. + +Les conditions d'usage et la persistance des offres gratuites ont été réauditées au gate final du `2026-08-26`. Elles restent des propriétés externes susceptibles d'évoluer après la release et ne constituent pas une garantie commerciale KSP. + +## 5. Contrat public final | Invariant | Statut | |------------------------------------------------------------------------|--------| @@ -415,20 +433,20 @@ Avant la stable, les conditions d'usage et la persistance des offres gratuites d ## 6. Rate limiting et availability -| Cas | Statut | -|---------------------------------------------------------------|---------| -| cadence locale fixe représentable | PASS | -| burst documenté supérieur à la cadence moyenne représentable | PASS | -| limite dynamique keyless représentable | PASS | -| `429` classé | PASS | -| `Retry-After` honoré lorsqu'exploitable | PASS | -| cooldown expose prochain instant admissible | PASS | -| refresh all ne lance que les providers éligibles | PASS | -| provider en cooldown ne bloque pas les autres | PASS | -| provider down ne rend pas le service global inutilisable | PASS | -| auth rejetée distinguée d'un transport down | PASS | -| quota indisponible distingué d'un transport down | PLANNED | -| quota mensuel local non présenté comme compteur authoritative | PASS | +| Cas | Statut | +|---------------------------------------------------------------|--------| +| cadence locale fixe représentable | PASS | +| burst documenté supérieur à la cadence moyenne représentable | PASS | +| limite dynamique keyless représentable | PASS | +| `429` classé | PASS | +| `Retry-After` honoré lorsqu'exploitable | PASS | +| cooldown expose prochain instant admissible | PASS | +| refresh all ne lance que les providers éligibles | PASS | +| provider en cooldown ne bloque pas les autres | PASS | +| provider down ne rend pas le service global inutilisable | PASS | +| auth rejetée distinguée d'un transport down | PASS | +| état `QuotaUnavailable` distinct représentable | PASS | +| quota mensuel local non présenté comme compteur authoritative | PASS | ## 7. Numeric safety @@ -446,23 +464,23 @@ Avant la stable, les conditions d'usage et la persistance des offres gratuites d ## 8. HTTP et sécurité -| Invariant | Statut | -|------------------------------------------------|---------| -| `reqwest` seul client provider | PASS | -| aucun SDK provider | PASS | -| endpoint provider officiel fixe en V1 | PASS | -| redirects désactivés | PASS | -| proxy implicite désactivé selon policy KSP | PASS | -| connect timeout borné | PASS | -| request timeout borné | PASS | -| body réponse borné avant parsing | PASS | -| URL retirée des erreurs reqwest | PASS | -| réponse remote brute absente des KspError/logs | PASS | -| API key absente de Debug/log/error | PASS | -| 401/403 classés auth/access | PASS | -| 429 classé rate limit | PASS | -| 5xx classé transient | PASS | -| schema drift classé provider protocol | PLANNED | +| Invariant | Statut | +|------------------------------------------------|--------| +| `reqwest` seul client provider | PASS | +| aucun SDK provider | PASS | +| endpoint provider officiel fixe en V1 | PASS | +| redirects désactivés | PASS | +| proxy implicite désactivé selon policy KSP | PASS | +| connect timeout borné | PASS | +| request timeout borné | PASS | +| body réponse borné avant parsing | PASS | +| URL retirée des erreurs reqwest | PASS | +| réponse remote brute absente des KspError/logs | PASS | +| API key absente de Debug/log/error | PASS | +| 401/403 classés auth/access | PASS | +| 429 classé rate limit | PASS | +| 5xx classé transient | PASS | +| schema drift classé réponse provider invalide | PASS | ## 9. DexScreener V1 @@ -509,23 +527,24 @@ Avant la stable, les conditions d'usage et la persistance des offres gratuites d Cette section valide l'architecture préparée par `0.2.11`; l'application elle-même reste hors scope et sera testée en `0.2.12`. -## 12. Non-régression et gates finaux prévus +## 12. Non-régression et gates finaux -| Gate | Statut | -|-------------------------------------------------|---------| -| `cargo fmt --all` | PLANNED | -| audit Rust workspace | PLANNED | -| audit Markdown tables | PLANNED | -| `cargo check --workspace` | PLANNED | -| `cargo clippy --workspace --all-targets` | PLANNED | -| `cargo test --workspace` | PLANNED | -| tests `ksp-offchain-transport-lib` | PLANNED | -| tests Config | PLANNED | -| cargo tree Off-chain Transport | PENDING | -| absence de dépendances provider SDK | PENDING | -| smokes keyless gratuits | PENDING | -| smokes keyed gratuits disponibles à l'opérateur | PENDING | -| réconciliation README/USAGE/plan/validation | PLANNED | +| Gate | Statut | +|----------------------------------------------|---------| +| `cargo fmt --all` | PASS | +| audit Rust workspace | PASS | +| audit Markdown tables | PASS | +| `cargo check --workspace` | PASS | +| `cargo clippy --workspace --all-targets` | PASS | +| `cargo test --workspace` sur `pre.011` | PASS | +| tests `ksp-offchain-transport-lib` après fix | PASS | +| tests Config après fix | PASS | +| cargo tree Off-chain Transport | PASS | +| absence de dépendances provider SDK | PASS | +| smoke keyless gratuit final | PASS | +| smoke keyed quatre credentials | SKIP | +| réconciliation README/USAGE/plan/validation | PASS | +| gate workspace de `pre.012` | PENDING | ## 13. Hors scope validé