Files
khadhroony-solana-project/deltas/0.2.11/pre.011.md
2026-08-26 14:37:59 +02:00

6.3 KiB
Raw Blame History

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 :

0.2.11-pre.10.fix.1

Version Cargo de sortie :

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 :

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 :

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é :

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 :

Coinbase Exchange
CoinGecko keyless
CoinMarketCap keyless
CoinPaprika
DexScreener
Jupiter keyless
Kraken

DexScreener utilise exclusivement la paire publique explicite Orca SOL/USDC :

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 :

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é :

keyed_market_price_providers_live_smoke

Il couvre :

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

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

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 :

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

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

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.