Files
2026-08-26 14:37:59 +02:00

193 lines
6.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!-- file: deltas/0.2.11/pre.011.md -->
<!-- version: 1 -->
# 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.