193 lines
6.3 KiB
Markdown
193 lines
6.3 KiB
Markdown
<!-- 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.
|