# Delta `0.2.11-pre.011` — Gate technique et live final ## 1. Base requise Cette tranche s'applique exclusivement après `0.2.11-pre.010-fix.001`, dont le gate opérateur complet est PASS. Version Cargo attendue à l'entrée : ```text 0.2.11-pre.10.fix.1 ``` Version Cargo de sortie : ```text 0.2.11-pre.11 ``` ## 2. Mission `pre.011` ne développe plus de fonctionnalité Off-chain Transport. Elle possède uniquement le gate technique/live final avant la réconciliation documentaire de `pre.012` : ```text réaudit officiel des huit providers V1 harness live keyless durable harness live keyed durable validation de non-court-circuit du batch vérification finale dependency graph / absence SDK provider rejeu des gates workspace ``` Aucun endpoint, DTO wire, parser, rate-limit, Config ou comportement de `MarketPriceService` n'est modifié. ## 3. Réaudit provider du `2026-08-26` Les contrats codés restent compatibles avec la documentation provider courante : ```text CoinGecko public keyless + Demo ; Simple Price + last_updated_at ; Demo 100/min CoinMarketCap Simple Price V2 ; /public-api keyless ; Basic gratuit disponible CoinPaprika 10 requêtes/s/IP ; Free 20k/mois ; données pouvant dater jusqu'à 10 min Kraken Ticker public SOLUSD ; cadence sûre 1 appel/s ou moins Coinbase Exchange /products/SOL-USD/ticker ; 10 requêtes/s/IP, burst 15 Jupiter Price V3 api.jup.ag ; keyless/Free ; usdPrice + blockId Birdeye Standard ; 1 RPS ; 30 000 CU ; Price Single 3 CU DexScreener direct pair endpoint ; 300 requêtes/min ; aucune discovery KSP ``` La documentation CoinPaprika est contradictoire sur la fraîcheur Free : la référence ticker mentionne environ 5 minutes en moyenne alors que Plans/Pricing annonce jusqu’à 10 minutes. Cela ne modifie pas KSP : aucune cadence provider n'est présentée comme freshness authoritative et aucun scheduler V1 n'est dérivé de cette information. ## 4. Smoke keyless Nouveau test ignoré : ```text crates/ksp-offchain-transport-lib/tests/market_price_live_smoke.rs keyless_market_price_providers_live_smoke ``` Il couvre en une seule exécution séquentielle : ```text Coinbase Exchange CoinGecko keyless CoinMarketCap keyless CoinPaprika DexScreener Jupiter keyless Kraken ``` DexScreener utilise exclusivement la paire publique explicite Orca SOL/USDC : ```text 7qbRF6YsyGuLUVs6Y1q64bdVrfe4ZcUUz1JRdoVNUJnm ``` Cette paire a été revalidée au `2026-08-26` avec WSOL comme base. Elle n'est ni une configuration runtime par défaut, ni une découverte de pool. Le smoke valide uniquement des invariants non volatils : ```text une observation produite pour chaque provider provider_id identique à l'outcome MarketPricePair::SolUsd prix exact positif déjà validé par MarketPriceDecimal received_at >= request_started_at sémantique identique au descriptor du registry ``` Aucun prix exact n'est figé. Les sept outcomes sont collectés avant l'assertion finale. Un provider externe en défaut ne peut donc pas empêcher les providers suivants d'être tentés ; le smoke échoue ensuite en listant seulement les IDs et availability génériques en échec. ## 5. Smoke keyed Second test ignoré : ```text keyed_market_price_providers_live_smoke ``` Il couvre : ```text Birdeye Standard CoinGecko Demo CoinMarketCap Basic Jupiter Free ``` Les quatre API keys sont lues depuis `stdin` dans cet ordre. Elles ne sont jamais des arguments CLI, ne sont jamais imprimées et ne sont jamais lues directement depuis l'environnement par `ksp-offchain-transport-lib`. La provenance `KSP_SECRET_*` de la composition de production reste vérifiée séparément par les tests déterministes `ksp-config-lib`. Si l'opérateur ne possède pas les quatre credentials gratuits, ce smoke doit être consigné `SKIP opérateur`; il ne doit pas être déclaré PASS sans exécution. ## 6. Gate opérateur déterministe ```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 -p ksp-offchain-transport-lib cargo test -p ksp-config-lib cargo test --workspace cargo tree -p ksp-offchain-transport-lib --edges normal ``` Le `cargo tree` doit confirmer l'absence de SDK provider et l'absence de dépendance `ksp-offchain-transport-lib -> ksp-config-lib`. ## 7. Gate live keyless obligatoire ```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 ``` Ce gate effectue des requêtes HTTPS externes réelles et doit être exécuté immédiatement avant `pre.012`. ## 8. Gate live keyed conditionnel Si les quatre credentials sont disponibles dans le shell opérateur : ```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 ``` Ne jamais coller les secrets dans le delta ou dans un log retourné. Si les quatre credentials ne sont pas disponibles, consigner `SKIP opérateur`. ## 9. Fichiers ajoutés/modifiés ```text Cargo.toml crates/ksp-offchain-transport-lib/tests/market_price_live_smoke.rs docs/plans/018-V0_2_11_OFFCHAIN_PRICE_TRANSPORT_PLAN.md docs/validation/014-V0_2_11_OFFCHAIN_PRICE_TRANSPORT.md deltas/0.2.11/pre.011.md ``` ## 10. Contrôles sandbox avant livraison ```text General Rust rule audit: clean Rust export completeness audit: 0 candidate(s) KSP workspace Rust rule audit: clean Markdown table audit: clean (125 tables / 120 files) Rust > 160 colonnes dans le nouveau smoke: 0 ``` Cargo n'est pas disponible dans l'environnement de construction ; les gates Cargo et live restent donc opérateur. ## 11. Sortie attendue `pre.011` n'est close qu'après retour opérateur du gate déterministe, du `cargo tree` et du smoke keyless. Le smoke keyed est PASS s'il est exécuté avec les quatre credentials, sinon `SKIP opérateur` explicite. Après ce gate seulement, `pre.012` peut porter la réconciliation documentaire finale.