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

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 -->
<!-- version: 90 -->
<!-- version: 91 -->
# 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é.

View File

@@ -1,9 +1,9 @@
<!-- 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
**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

View File

@@ -1,5 +1,5 @@
<!-- 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
@@ -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é