v0.2.11-pre.012

This commit is contained in:
2026-08-26 15:45:02 +02:00
parent b5a1293953
commit 81eb295a09
9 changed files with 303 additions and 93 deletions

View File

@@ -1,12 +1,12 @@
# file: Cargo.toml # file: Cargo.toml
# version: 283 # version: 284
[workspace] [workspace]
resolver = "3" 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"] 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] [workspace.package]
version = "0.2.11-pre.11.fix.1" version = "0.2.11-pre.12"
edition = "2024" edition = "2024"
license = "MIT" license = "MIT"
repository = "https://git.sasedev.com/Sasedev/khadhroony-solana-project" repository = "https://git.sasedev.com/Sasedev/khadhroony-solana-project"

View File

@@ -1,5 +1,5 @@
<!-- file: crates/ksp-offchain-transport-lib/README.md --> <!-- file: crates/ksp-offchain-transport-lib/README.md -->
<!-- version: 1 --> <!-- version: 2 -->
# ksp-offchain-transport-lib # 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/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. - [`../../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.

View File

@@ -1,9 +1,9 @@
<!-- file: crates/ksp-offchain-transport-lib/USAGE.md --> <!-- file: crates/ksp-offchain-transport-lib/USAGE.md -->
<!-- version: 1 --> <!-- version: 2 -->
# Usage de ksp-offchain-transport-lib # 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 ## 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. `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.

View File

@@ -1,5 +1,5 @@
// file: crates/ksp-offchain-transport-lib/src/lib.rs // file: crates/ksp-offchain-transport-lib/src/lib.rs
// version: 11 // version: 12
#![warn(missing_docs)] #![warn(missing_docs)]
#![deny(unreachable_pub)] #![deny(unreachable_pub)]
@@ -7,7 +7,7 @@
//! KSP-owned off-chain transport foundation. //! 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 //! 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. //! 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 //! Config integration is implemented externally by `ksp-config-lib`; this crate remains independent from Config and never reads KSP environment variables

154
deltas/0.2.11/pre.012.md Normal file
View File

@@ -0,0 +1,154 @@
<!-- file: deltas/0.2.11/pre.012.md -->
<!-- version: 1 -->
# 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.

File diff suppressed because one or more lines are too long

View File

@@ -1,5 +1,5 @@
<!-- file: docs/plans/002-FUNCTIONAL_RELEASE_SEQUENCE.md --> <!-- file: docs/plans/002-FUNCTIONAL_RELEASE_SEQUENCE.md -->
<!-- version: 90 --> <!-- version: 91 -->
# Séquence des releases fonctionnelles KSP # 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` / `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é. `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é.

View File

@@ -1,9 +1,9 @@
<!-- file: docs/plans/018-V0_2_11_OFFCHAIN_PRICE_TRANSPORT_PLAN.md --> <!-- file: docs/plans/018-V0_2_11_OFFCHAIN_PRICE_TRANSPORT_PLAN.md -->
<!-- version: 20 --> <!-- version: 21 -->
# Plan `0.2.11` — Off-chain price transport SOL/USD multi-provider # 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é ## 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 ### `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. 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 #### `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 ### `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 ### `pre.013` — Préparation minimale de publication

View File

@@ -1,5 +1,5 @@
<!-- file: docs/validation/014-V0_2_11_OFFCHAIN_PRICE_TRANSPORT.md --> <!-- file: docs/validation/014-V0_2_11_OFFCHAIN_PRICE_TRANSPORT.md -->
<!-- version: 19 --> <!-- version: 20 -->
# Validation `0.2.11` — Off-chain price transport SOL/USD # Validation `0.2.11` — Off-chain price transport SOL/USD
@@ -366,36 +366,54 @@ 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`. 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 | | Critère | Statut | Preuve / condition opérateur |
|----------------------------------------------------|---------|----------------------------------------------------------------| |----------------------------------------------------|--------|-----------------------------------------------------|
| version workspace `0.2.11-pre.11.fix.1` | PASS | `Cargo.toml` racine | | 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` | | 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 | | 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` | | 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é | | 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 | | 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` | | re-smoke keyless après fix | PASS | 7/7 opérateur le 2026-08-26 |
| smoke keyed réel | PENDING | `SKIP opérateur` permis si les quatre credentials sont absents | | 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`. 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`
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`.
`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.
| 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` |
## 4. Matrice provider finale
| Provider | SOL/USD V1 | Gratuit V1 | Mode auth prévu | Test déterministe | Smoke live | Statut courant | | 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 | | CoinGecko | Oui | Oui | keyless ou Demo key | PASS | PASS keyless | IMPLEMENTED |
| CoinMarketCap | Oui | Oui | keyless ou Basic key | PASS | PENDING re-smoke | IMPLEMENTED | | CoinMarketCap | Oui | Oui | keyless ou Basic key | PASS | PASS keyless | IMPLEMENTED |
| CoinPaprika | Oui | Oui | aucune | PASS | PASS | IMPLEMENTED | | CoinPaprika | Oui | Oui | aucune | PASS | PASS | IMPLEMENTED |
| Kraken | Oui | Oui | aucune | PASS | PASS | IMPLEMENTED | | Kraken | Oui | Oui | aucune | PASS | PASS | IMPLEMENTED |
| Coinbase Exchange | 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 | | Jupiter Price V3 | Oui | Oui | keyless ou Free key | PASS | PASS keyless | IMPLEMENTED |
| Birdeye | Oui | Oui | API key Standard | PASS | PENDING keyed | IMPLEMENTED | | Birdeye | Oui | Oui | API key Standard | PASS | SKIP keyed | IMPLEMENTED |
| DexScreener | Oui | Oui | aucune | PASS | PASS | IMPLEMENTED | | DexScreener | Oui | Oui | aucune | PASS | PASS | IMPLEMENTED |
`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. 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.
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. 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 prévu ## 5. Contrat public final
| Invariant | Statut | | Invariant | Statut |
|------------------------------------------------------------------------|--------| |------------------------------------------------------------------------|--------|
@@ -416,7 +434,7 @@ Avant la stable, les conditions d'usage et la persistance des offres gratuites d
## 6. Rate limiting et availability ## 6. Rate limiting et availability
| Cas | Statut | | Cas | Statut |
|---------------------------------------------------------------|---------| |---------------------------------------------------------------|--------|
| cadence locale fixe représentable | PASS | | cadence locale fixe représentable | PASS |
| burst documenté supérieur à la cadence moyenne représentable | PASS | | burst documenté supérieur à la cadence moyenne représentable | PASS |
| limite dynamique keyless représentable | PASS | | limite dynamique keyless représentable | PASS |
@@ -427,7 +445,7 @@ Avant la stable, les conditions d'usage et la persistance des offres gratuites d
| provider en cooldown ne bloque pas les autres | PASS | | provider en cooldown ne bloque pas les autres | PASS |
| provider down ne rend pas le service global inutilisable | PASS | | provider down ne rend pas le service global inutilisable | PASS |
| auth rejetée distinguée d'un transport down | PASS | | auth rejetée distinguée d'un transport down | PASS |
| quota indisponible distingué d'un transport down | PLANNED | | état `QuotaUnavailable` distinct représentable | PASS |
| quota mensuel local non présenté comme compteur authoritative | PASS | | quota mensuel local non présenté comme compteur authoritative | PASS |
## 7. Numeric safety ## 7. Numeric safety
@@ -447,7 +465,7 @@ Avant la stable, les conditions d'usage et la persistance des offres gratuites d
## 8. HTTP et sécurité ## 8. HTTP et sécurité
| Invariant | Statut | | Invariant | Statut |
|------------------------------------------------|---------| |------------------------------------------------|--------|
| `reqwest` seul client provider | PASS | | `reqwest` seul client provider | PASS |
| aucun SDK provider | PASS | | aucun SDK provider | PASS |
| endpoint provider officiel fixe en V1 | PASS | | endpoint provider officiel fixe en V1 | PASS |
@@ -462,7 +480,7 @@ Avant la stable, les conditions d'usage et la persistance des offres gratuites d
| 401/403 classés auth/access | PASS | | 401/403 classés auth/access | PASS |
| 429 classé rate limit | PASS | | 429 classé rate limit | PASS |
| 5xx classé transient | PASS | | 5xx classé transient | PASS |
| schema drift classé provider protocol | PLANNED | | schema drift classé réponse provider invalide | PASS |
## 9. DexScreener V1 ## 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`. 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 | | Gate | Statut |
|-------------------------------------------------|---------| |----------------------------------------------|---------|
| `cargo fmt --all` | PLANNED | | `cargo fmt --all` | PASS |
| audit Rust workspace | PLANNED | | audit Rust workspace | PASS |
| audit Markdown tables | PLANNED | | audit Markdown tables | PASS |
| `cargo check --workspace` | PLANNED | | `cargo check --workspace` | PASS |
| `cargo clippy --workspace --all-targets` | PLANNED | | `cargo clippy --workspace --all-targets` | PASS |
| `cargo test --workspace` | PLANNED | | `cargo test --workspace` sur `pre.011` | PASS |
| tests `ksp-offchain-transport-lib` | PLANNED | | tests `ksp-offchain-transport-lib` après fix | PASS |
| tests Config | PLANNED | | tests Config après fix | PASS |
| cargo tree Off-chain Transport | PENDING | | cargo tree Off-chain Transport | PASS |
| absence de dépendances provider SDK | PENDING | | absence de dépendances provider SDK | PASS |
| smokes keyless gratuits | PENDING | | smoke keyless gratuit final | PASS |
| smokes keyed gratuits disponibles à l'opérateur | PENDING | | smoke keyed quatre credentials | SKIP |
| réconciliation README/USAGE/plan/validation | PLANNED | | réconciliation README/USAGE/plan/validation | PASS |
| gate workspace de `pre.012` | PENDING |
## 13. Hors scope validé ## 13. Hors scope validé