Files
khadhroony-solana-project/deltas/0.2.11/pre.010.md
2026-08-26 12:06:51 +02:00

310 lines
10 KiB
Markdown

<!-- file: deltas/0.2.11/pre.010.md -->
<!-- version: 1 -->
# Delta `0.2.11-pre.010` — Hardening et complétude technique Off-chain Transport
## 1. Base requise
Cette tranche s'applique exclusivement après l'état validé :
```text
v0.2.10
+ 0.2.11-pre.001
+ 0.2.11-pre.001-fix.001
+ 0.2.11-pre.002
+ 0.2.11-pre.002-fix.001
+ 0.2.11-pre.002-fix.002
+ 0.2.11-pre.002-fix.003
+ 0.2.11-pre.003
+ 0.2.11-pre.003-fix.001
+ 0.2.11-pre.004
+ 0.2.11-pre.004-fix.001
+ 0.2.11-pre.005
+ 0.2.11-pre.006
+ 0.2.11-pre.007
+ 0.2.11-pre.008
+ 0.2.11-pre.008-fix.001
+ 0.2.11-pre.009
```
Le gate opérateur de `pre.009` est intégralement PASS : audits Rust/Markdown, `cargo check --workspace`, `cargo clippy --workspace --all-targets`, tests ciblés `ksp-offchain-transport-lib`, tests Config et `cargo test --workspace`. Seuls les smokes live et probes de timing explicitement `ignored` restent hors du gate déterministe.
La version workspace devient :
```text
0.2.11-pre.10
```
## 2. Mission
`pre.010` ne crée aucun provider ni endpoint supplémentaire. La tranche durcit l'état fonctionnel complet obtenu par `pre.009` avant le gate technique/live de `pre.011`.
Le scope est limité à :
```text
forward compatibility de la façade publique
complétude exacte des huit providers V1
hardening numeric/timestamps/provenance
redaction et ownership de diagnostics/secrets
interdiction durable des URL/rate-limit provider libres dans Config
brouillons techniques README/USAGE
correction de la documentation technique du refresh multiple V1
```
La réconciliation documentaire finale reste explicitement réservée à `pre.012`.
## 3. Forward compatibility de la façade publique
Les enums publiques dont l'espace de valeurs doit pouvoir évoluer sont désormais `#[non_exhaustive]` :
```text
MarketPricePair
MarketPriceSemantics
MarketPriceProviderAuthMode
MarketPriceProviderRateLimitScope
MarketPriceProviderRateLimitKind
MarketPriceProviderQuotaPeriod
MarketPriceProviderQuotaUnit
MarketPriceProviderAvailability
MarketPriceCoinGeckoAccessMode
MarketPriceCoinMarketCapAccessMode
MarketPriceJupiterAccessMode
MarketPriceProviderSetup
```
Cette décision évite qu'une future paire, sémantique, classe de quota, disponibilité, access mode ou provider impose une rupture source aux consumers qui respectent la façade évolutive.
Les structs à champs privés restent extensibles sans attribut supplémentaire.
`ksp-config-lib` étant une crate downstream, ses matches CoinGecko/CoinMarketCap/Jupiter absorbent maintenant explicitement les futures variantes inconnues via une erreur Config effective sûre. La Config ne suppose donc plus que ces enums resteront exhaustifs pour toujours.
## 4. Complétude release-level des huit providers
Un nouveau canari `tests/release_completeness.rs` construit les huit setups désactivés et vérifie l'inventaire exact, ordonné et provider-neutral :
```text
birdeye
coinbase_exchange
coingecko
coinmarketcap
coinpaprika
dexscreener
jupiter
kraken
```
Il verrouille pour chaque entrée :
```text
provider_id
MarketPriceSemantics
MarketPriceProviderAuthMode du mode testé
support SOL/USD
availability Disabled
```
Le même canari vérifie statiquement que les enums évolutives restent `#[non_exhaustive]`.
Aucun neuvième provider, autre paire ou abstraction wire publique n'est ajouté.
## 5. Hardening adversarial numeric, timestamps et provenance
Les tests déterministes sont complétés pour couvrir :
### 5.1 `MarketPriceDecimal`
Rejet explicite de formes JSON qui ne doivent jamais devenir un prix réussi :
```text
null
booléens
objet
tableau
zéro string
négatif string
scale/exposant pathologique
overflow d'exposant
```
Le chemin canonique reste sans `serde_json::Value::as_f64` dans les modules `market_price_*`.
### 5.2 Timestamps provider
Les helpers communs couvrent désormais :
```text
RFC3339 valide avec millisecondes fractionnelles
pré-epoch rejeté
RFC3339 invalide rejeté
Unix seconds valide
multiplication Unix seconds overflow rejetée
```
Aucun timestamp provider n'est inventé lorsqu'une source ne fournit pas une vraie information temporelle du prix.
### 5.3 Provenance
`MarketPriceProvenance` est canarisée à sa borne maximale exacte et rejette :
```text
dépassement de borne
leading/trailing whitespace
contrôle tabulation
```
Les erreurs provider invalides conservent seulement le provider et le champ sûrs dans leur contexte.
## 6. Hardening secrets, diagnostics et ownership
Le nouveau canari `tests/security_hardening.rs` vérifie notamment :
```text
Debug Birdeye/CoinGecko/CoinMarketCap/Jupiter ne contient pas la clé
Debug MarketPriceService ne contient pas la clé
aucun module market_price_* ne lit std::env
aucun module market_price_* n'utilise as_f64 comme vérité prix
aucun module market_price_* n'utilise tracing:: directement
schema Config sans base_url/endpoint_url/rate_limit/requests_per provider
```
Les origines HTTPS, headers et cadences restent donc possédés par Off-chain Transport.
## 7. Hardening Config
Un test Config adversarial injecte dans le document standard des champs non autorisés représentant :
```text
base_url provider arbitraire
rate_limit provider arbitraire
```
Le schema strict doit les rejeter avant le mapping runtime. Cette protection complète les canaries statiques et empêche qu'une future modification du document transforme silencieusement Config en bypass SSRF/credential-redirection ou en moyen d'augmenter une cadence provider.
Les access modes `#[non_exhaustive]` reçoivent aussi une branche downstream future-safe dans l'adapter Config ; aucune variante inconnue n'est interprétée arbitrairement.
## 8. Refresh multiple V1 explicitement séquentiel
Le plan d'origine conservait encore une phrase préparatoire affirmant que les providers éligibles seraient lancés concurremment. Cette phrase était devenue fausse depuis `pre.008`, qui a délibérément matérialisé V1 comme séquentielle et déterministe.
`pre.010` réconcilie le **contrat technique courant**, sans attendre la documentation finale :
```text
refresh_many valide tous les IDs avant dispatch
ordre demandé conservé
refresh_all suit l'ordre stable du registry
aucun sleep pour attendre un cooldown
provider non éligible projeté immédiatement
aucun fallback
aucun consensus
aucune agrégation
```
La concurrence n'est pas interdite pour toujours, mais elle nécessitera un contrat futur explicite sur ordre observable, admission et rate limiting.
## 9. Brouillons techniques README/USAGE
La nouvelle crate reçoit ses premiers documents techniques :
```text
crates/ksp-offchain-transport-lib/README.md
crates/ksp-offchain-transport-lib/USAGE.md
```
Ils décrivent la taxonomie hétérogène, la façade `MarketPrice*`, les huit providers, les frontières Config/HTTP, numeric safety, refresh séquentiel V1 et les règles de diagnostic.
`ksp-config-lib/README.md` et `USAGE.md` sont complétés pour documenter `cfg.std.offchain_transport`, les nouvelles ressources du registry et la direction :
```text
ksp-config-lib -> ksp-offchain-transport-lib
```
Ces textes sont explicitement qualifiés de brouillons techniques. Ils ne remplacent pas la réconciliation documentaire finale de `pre.012` et ne revendiquent aucun résultat live de `pre.011`.
## 10. Scope inchangé
La tranche n'ajoute pas :
```text
provider supplémentaire
SOL/EUR ou autre paire
endpoint nouveau
SDK provider
fallback
consensus/moyenne/médiane
scheduler périodique
concurrence de refresh multiple
cache/historique
smoke live
swap_quote
application Price Desk
```
## 11. Validations sandbox et gate opérateur demandé
Les audits exécutables dans le sandbox sur l'état final donnent :
```text
General Rust rule audit: clean
Rust export completeness audit: 0 candidate(s)
KSP workspace Rust rule audit: clean
Markdown table audit: clean (124 tables / 118 files)
Rust > 160 colonnes dans les crates touchées: 0
```
Cargo n'est pas disponible dans le sandbox de production du delta ; aucune compilation locale n'est donc revendiquée.
Après application :
```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
```
Le gate attendu doit rester sans warning. Les smokes live demeurent réservés à `pre.011`.
## 12. Fichiers ajoutés
```text
crates/ksp-offchain-transport-lib/README.md
crates/ksp-offchain-transport-lib/USAGE.md
crates/ksp-offchain-transport-lib/tests/release_completeness.rs
crates/ksp-offchain-transport-lib/tests/security_hardening.rs
crates/ksp-offchain-transport-lib/unit_tests/market_price_adapter.rs
deltas/0.2.11/pre.010.md
```
## 13. Fichiers modifiés
```text
Cargo.toml
crates/ksp-config-lib/README.md
crates/ksp-config-lib/USAGE.md
crates/ksp-config-lib/src/offchain_transport.rs
crates/ksp-config-lib/unit_tests/offchain_transport.rs
crates/ksp-offchain-transport-lib/src/lib.rs
crates/ksp-offchain-transport-lib/src/market_price_adapter.rs
crates/ksp-offchain-transport-lib/src/market_price_coingecko.rs
crates/ksp-offchain-transport-lib/src/market_price_coinmarketcap.rs
crates/ksp-offchain-transport-lib/src/market_price_jupiter.rs
crates/ksp-offchain-transport-lib/src/market_price_provider.rs
crates/ksp-offchain-transport-lib/src/market_price_service.rs
crates/ksp-offchain-transport-lib/unit_tests/market_price_decimal.rs
crates/ksp-offchain-transport-lib/unit_tests/market_price_observation.rs
docs/plans/018-V0_2_11_OFFCHAIN_PRICE_TRANSPORT_PLAN.md
docs/validation/014-V0_2_11_OFFCHAIN_PRICE_TRANSPORT.md
```
## 14. Fichiers supprimés
Aucun.
## 15. Autorité du delta
Le présent delta décrit uniquement `0.2.11-pre.010`. Les résultats Cargo du gate opérateur demandé après application devront être reportés dans la validation courante ou dans un éventuel fix si un défaut réel est détecté. `pre.011` reste propriétaire du gate technique/live final ; `pre.012` de la réconciliation documentaire finale ; `pre.013` de la préparation minimale de publication.