v0.2.11-pre.001

This commit is contained in:
2026-08-25 17:50:08 +02:00
parent afaa9c0239
commit a8e980b225
13 changed files with 1216 additions and 31 deletions

View File

@@ -1,5 +1,5 @@
<!-- file: docs/validation/000-README.md -->
<!-- version: 25 -->
<!-- version: 26 -->
# Validations KSP
@@ -21,4 +21,5 @@ Documents :
- [`010-V0_2_7_ONCHAIN_WEBSOCKET.md`](010-V0_2_7_ONCHAIN_WEBSOCKET.md) — matrice finale validée de la release stable `0.2.7`, ouverte par `pre.001`, fermée techniquement par `pre.014` puis publiée par `rel.001` : inventaire 9 subscribe + 9 unsubscribe, lifecycle borné, statuts unstable, compliance 18/18, non-régression HTTP 52+14, composition Config V2, smoke WebSocket Devnet et audit de dépendances.
- [`011-V0_2_8_HELIUS_LASERSTREAM_WEBSOCKET.md`](011-V0_2_8_HELIUS_LASERSTREAM_WEBSOCKET.md) — matrice finale validée de la release stable `0.2.8`, ouverte par `pre.001`, consolidée jusquà `pre.011` puis publiée par `rel.001` : Helius `account/logs/program/root/signature/slot/slotsUpdates + transaction`, `block/vote` absents, heartbeat provider, sécurité/redaction, lifecycle adversarial, non-régressions HTTP/WS, stratégie smoke live et graphes Cargo finaux.
- [`012-V0_2_9_YELLOWSTONE_GRPC.md`](012-V0_2_9_YELLOWSTONE_GRPC.md) — matrice finale de la release stable `0.2.9` : service Geyser courant, `Subscribe` standard, 7 unary, filtres/updates, dépendances/licence, replay/backpressure, Config V3 et smoke PublicNode Mainnet/Testnet.
- [`013-V0_2_10_ORBITFLARE_YELLOWSTONE_GRPC.md`](013-V0_2_10_ORBITFLARE_YELLOWSTONE_GRPC.md) — matrice active ouverte par `0.2.10-pre.001` : Free Devnet, auth provider, endpoint security, heartbeat standard, capabilities, Config V3, smoke live et invariant N1/N2 immuable.
- [`013-V0_2_10_ORBITFLARE_YELLOWSTONE_GRPC.md`](013-V0_2_10_ORBITFLARE_YELLOWSTONE_GRPC.md) — matrice finale de la release stable `0.2.10` : Free Devnet, auth `x-token`, endpoint security, heartbeat standard, Config V3, smoke live `Slot + Ping` et invariant N1/N2 immuable.
- [`014-V0_2_11_OFFCHAIN_PRICE_TRANSPORT.md`](014-V0_2_11_OFFCHAIN_PRICE_TRANSPORT.md) — matrice active ouverte par `0.2.11-pre.001` : SOL/USD multi-provider, `reqwest` sans SDK provider, numeric safety, rate limiting/availability, Config capability-aware, DexScreener pair explicite et frontière HID future.

View File

@@ -0,0 +1,210 @@
<!-- file: docs/validation/014-V0_2_11_OFFCHAIN_PRICE_TRANSPORT.md -->
<!-- version: 1 -->
# Validation `0.2.11` — Off-chain price transport SOL/USD
## 1. Objet
Cette matrice suit la release `0.2.11 — Off-chain price transport` ouverte par `pre.001`.
Le contrat fonctionnel V1 est :
```text
SOL/USD uniquement
plusieurs providers gratuits admis
HTTP REST reqwest uniquement
aucun SDK provider
provider/rate-limit/availability possédés par ksp-offchain-transport-lib
Config -> Off-chain Transport sans dépendance inverse
future ksp-app-solprices-desk purement HID et provider-agnostic
```
Les statuts `PLANNED` restent non validés tant que la tranche correspondante n'est pas exécutée.
## 2. Gate `0.2.11-pre.001`
| Critère | Statut | Preuve |
|---------------------------------------------------------------|--------|-----------------------------------------------------------------------------------------|
| archive stable `v0.2.10` utilisée | PASS | archive Gitea fournie par l'opérateur |
| `workspace.package.version = 0.2.10` à l'entrée | PASS | inspection `Cargo.toml` |
| `deltas/0.2.10/rel.001.md` présent | PASS | inspection archive |
| `prompts/016-V0_2_11_START_PROMPT.md` présent | PASS | inspection archive |
| `.git` absent de l'archive | PASS | inspection filesystem |
| `ksp-offchain-transport-lib` absent à l'entrée | PASS | inventaire workspace |
| primitives reqwest/serde/serde_json/tokio/http déjà présentes | PASS | inventaire `[workspace.dependencies]` |
| audit providers gratuit/live actuel | PASS | sources officielles CoinGecko, CMC, CoinPaprika, Kraken, Coinbase, Jupiter, Birdeye, DS |
| conditions d'usage gratuites distinguées du transport | PASS | plan 018, gratuité technique distincte de licence commerciale durable |
| SOL/USD retenu comme seule paire V1 | PASS | décision opérateur + plan 018 |
| aucun SDK provider retenu | PASS | décision opérateur + plan 018 |
| huit providers retenus pour implémentation | PASS | plan 018 section provider |
| DexScreener V1 limité à une paire SOL/USD configurée | PASS | décision opérateur + plan 018 |
| future `ksp-app-solprices-desk` purement HID | PASS | décision opérateur + architecture |
| ownership rate limits/availability dans Off-chain Transport | PASS | décision opérateur + plan 018 |
| threat model V1 établi | PASS | plan 018 |
| forecast prereleases établi | PASS | plan 018 |
| code runtime provider ajouté en `pre.001` | N/A | interdit par le gate, aucune crate créée |
## 3. Matrice provider prévue
| Provider | SOL/USD V1 | Gratuit V1 | Mode auth prévu | Test déterministe | Smoke live | Statut courant |
|-------------------|------------|------------|----------------------|-------------------|------------|----------------|
| CoinGecko | Oui | Oui | keyless ou Demo key | PLANNED | PLANNED | AUDITED |
| CoinMarketCap | Oui | Oui | keyless ou Basic key | PLANNED | PLANNED | AUDITED |
| CoinPaprika | Oui | Oui | aucune | PLANNED | PLANNED | AUDITED |
| Kraken | Oui | Oui | aucune | PLANNED | PLANNED | AUDITED |
| Coinbase Exchange | Oui | Oui | aucune | PLANNED | PLANNED | AUDITED |
| Jupiter Price V3 | Oui | Oui | keyless ou Free key | PLANNED | PLANNED | AUDITED |
| Birdeye | Oui | Oui | API key Standard | PLANNED | PLANNED | AUDITED |
| DexScreener | Oui | Oui | aucune | PLANNED | PLANNED | AUDITED |
`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.
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.
## 4. Contrat public prévu
| Invariant | Statut |
|------------------------------------------------------------------------|---------|
| surface publique limitée à SOL/USD dans V1 | PLANNED |
| identifiants provider opaques pour les consumers | PLANNED |
| provenance provider toujours observable | PLANNED |
| sémantique de prix observable sans prétendre à une équivalence | PLANNED |
| timestamp requête/réception KSP présents | PLANNED |
| timestamp provider optionnel seulement lorsqu'il est réellement fourni | PLANNED |
| absence de prix distincte de zéro | PLANNED |
| `f64` non utilisé comme canon public | PLANNED |
| aucune structure wire provider exportée | PLANNED |
| aucune URL/header/asset id provider requis côté app | PLANNED |
| registry provider et état runtime possédés par Off-chain Transport | PLANNED |
| refresh provider par identifiant générique | PLANNED |
| refresh multiple sans connaissance provider côté consumer | PLANNED |
## 5. Rate limiting et availability
| Cas | Statut |
|---------------------------------------------------------------|---------|
| cadence locale fixe représentable | PLANNED |
| burst documenté représentable | PLANNED |
| limite dynamique keyless représentable | PLANNED |
| `429` classé | PLANNED |
| `Retry-After` honoré lorsqu'exploitable | PLANNED |
| cooldown expose prochain instant admissible | PLANNED |
| refresh all ne lance que les providers éligibles | PLANNED |
| provider en cooldown ne bloque pas les autres | PLANNED |
| provider down ne rend pas le service global inutilisable | PLANNED |
| auth manquante distinguée d'un transport down | PLANNED |
| quota indisponible distingué d'un transport down | PLANNED |
| quota mensuel local non présenté comme compteur authoritative | PLANNED |
## 6. Numeric safety
| Cas | Statut |
|-----------------------------------------------------|---------|
| décimal string valide | PLANNED |
| JSON number valide sans passage canonique par `f64` | PLANNED |
| notation scientifique bornée | PLANNED |
| coefficient/scale overflow rejeté | PLANNED |
| valeur négative rejetée | PLANNED |
| zéro rejeté pour une observation réussie | PLANNED |
| NaN/Inf impossibles dans le type canonique | PLANNED |
| serialization canonique sans perte | PLANNED |
| round-trip public déterministe | PLANNED |
## 7. HTTP et sécurité
| Invariant | Statut |
|------------------------------------------------|---------|
| `reqwest` seul client provider | PLANNED |
| aucun SDK provider | PLANNED |
| endpoint provider officiel fixe en V1 | PLANNED |
| redirects désactivés | PLANNED |
| proxy implicite désactivé selon policy KSP | PLANNED |
| connect timeout borné | PLANNED |
| request timeout borné | PLANNED |
| body réponse borné avant parsing | PLANNED |
| URL retirée des erreurs reqwest | PLANNED |
| réponse remote brute absente des KspError/logs | PLANNED |
| API key absente de Debug/log/error | PLANNED |
| 401/403 classés auth/access | PLANNED |
| 429 classé rate limit | PLANNED |
| 5xx classé transient | PLANNED |
| schema drift classé provider protocol | PLANNED |
## 8. DexScreener V1
| Invariant | Statut |
|----------------------------------------------|---------|
| pair address SOL/USD explicite dans settings | PLANNED |
| `chainId = solana` vérifié | PLANNED |
| identité SOL de la paire vérifiée | PLANNED |
| `priceUsd` utilisé comme prix commun | PLANNED |
| aucune recherche automatique de pool | PLANNED |
| aucun tri automatique par liquidité | PLANNED |
| aucune moyenne/consensus entre pools | PLANNED |
## 9. Config -> Off-chain Transport
| Invariant | Statut |
|------------------------------------------------------------------|---------|
| Off-chain Transport ne dépend pas de Config | PLANNED |
| document standard offchain dédié | PLANNED |
| branches provider conditionnelles dans schema | PLANNED |
| CoinGecko keyless/Demo représentés | PLANNED |
| CoinMarketCap keyless/Basic représentés | PLANNED |
| Jupiter keyless/Free représentés | PLANNED |
| Birdeye exige credential lorsqu'activé | PLANNED |
| DexScreener exige pair address lorsqu'activé | PLANNED |
| providers sans auth n'exposent pas de faux champ API key | PLANNED |
| secrets via Config uniquement | PLANNED |
| `.env.example` synchronisé pour les secrets réellement ajoutés | PLANNED |
| aucune cadence provider configurable au-dessus de la limite sûre | PLANNED |
## 10. Frontière future `ksp-app-solprices-desk`
| Invariant | Statut |
|--------------------------------------------------------------------|---------|
| nom de l'application fixé à `ksp-app-solprices-desk` | DECIDED |
| rôle HID uniquement | DECIDED |
| aucun enum/provider spécifique requis dans l'UI | PLANNED |
| aucun endpoint/header/provider id propriétaire dans l'app | PLANNED |
| table construite depuis l'inventaire générique Off-chain Transport | PLANNED |
| refresh row appelle une opération générique | PLANNED |
| refresh multiple appelle une opération générique | PLANNED |
| cooldown/availability affichables depuis état générique | PLANNED |
| aucune logique de rate limiting dans Tauri/frontend | PLANNED |
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`.
## 11. Non-régression et gates finaux prévus
| 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 | PLANNED |
| absence de dépendances provider SDK | PLANNED |
| smokes keyless gratuits | PLANNED |
| smokes keyed gratuits disponibles à l'opérateur | PLANNED |
| réconciliation README/USAGE/plan/validation | PLANNED |
## 12. Hors scope validé
```text
SOL/EUR et autres quotes
SPL token price générique
OHLCV/historique
streaming price
fallback automatique
consensus/moyenne/médiane
pool discovery DexScreener
Price Desk dans 0.2.11
Wallet Desk dans 0.2.11
Pyth V1
Binance SOL/USDT assimilé à SOL/USD
```