v0.2.11-pre.011

This commit is contained in:
2026-08-26 14:37:59 +02:00
parent 98708df6e0
commit 251f9f9ad8
5 changed files with 461 additions and 46 deletions

192
deltas/0.2.11/pre.011.md Normal file
View File

@@ -0,0 +1,192 @@
<!-- 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.