v0.2.11-pre.003
This commit is contained in:
@@ -1,9 +1,9 @@
|
||||
<!-- file: docs/plans/018-V0_2_11_OFFCHAIN_PRICE_TRANSPORT_PLAN.md -->
|
||||
<!-- version: 6 -->
|
||||
<!-- version: 7 -->
|
||||
|
||||
# Plan `0.2.11` — Off-chain price transport SOL/USD multi-provider
|
||||
|
||||
**Statut courant : `0.2.11-pre.002-fix.003` ferme le nommage public de la famille `market_price` avant `pre.003`. Les types, constantes et codes d'erreur publics spécifiques à cette famille portent désormais le préfixe `MarketPrice` / `MARKET_PRICE`, afin d'éviter une collision future avec `swap_quote_*` ou une autre capacité off-chain. Le contrat V1 reste limité à SOL/USD et aucun client HTTP/provider n'est encore ajouté.**
|
||||
**Statut courant : `0.2.11-pre.003` matérialise le HTTP REST commun et le rate limiting provider-neutral sans encore ajouter d'adapter provider. Les primitives `http_*` restent internes à la crate et réutilisables par les futures familles off-chain ; `market_price_*` reste la seule famille métier actuelle et demeure limitée à SOL/USD.**
|
||||
|
||||
## 1. Base et autorité
|
||||
|
||||
@@ -482,24 +482,30 @@ Décisions V1 :
|
||||
|
||||
```text
|
||||
reqwest uniquement
|
||||
HTTPS officiel fixe lorsque le provider le supporte
|
||||
HTTPS officiel fixe dans les adapters V1
|
||||
redirect désactivé
|
||||
proxy implicite désactivé selon le pattern KSP retenu
|
||||
connect timeout borné
|
||||
request timeout borné
|
||||
Referer automatique désactivé
|
||||
proxy système/implicite désactivé
|
||||
retries implicites reqwest désactivés
|
||||
connect timeout borné : défaut 5 s, hard max 30 s
|
||||
request timeout borné : défaut 10 s, hard max 120 s
|
||||
GET uniquement pour les prix V1
|
||||
body réponse borné
|
||||
JSON attendu et validé
|
||||
body réponse borné avant désérialisation : défaut 1 MiB, hard max 4 MiB
|
||||
JSON syntaxiquement validé avant remise à l'adapter typed
|
||||
429 classé explicitement
|
||||
Retry-After honoré lorsqu'il est exploitable
|
||||
5xx classé transitoire
|
||||
401/403 classé auth/access
|
||||
Retry-After delta-seconds honoré et borné à 1 h lorsqu'il est exploitable
|
||||
408 et 5xx classés transitoires
|
||||
401/403 classés auth/access
|
||||
URL retirée des erreurs reqwest avant contexte KSP
|
||||
aucun body remote brut dans KspError
|
||||
```
|
||||
|
||||
Il n'existe pas d'URL provider arbitraire dans la Config V1. Cela évite SSRF, redirection de credential et confusion de provenance.
|
||||
|
||||
Les primitives `http_*` sont **crate-private** : elles ne créent pas un client HTTP générique public contournant les capacités métier. Les adapters `market_price_*`, puis de futures familles telles que `swap_quote_*`, les consomment derrière leur propre contrat.
|
||||
|
||||
Le limiter `pre.003` est non bloquant. Une cadence fixe est matérialisée par un token bucket lissé ; lorsqu'aucun burst n'est documenté, la capacité locale initiale reste volontairement `1`. Une limite dynamique n'invente aucune cadence locale et apprend seulement des réponses provider, notamment `429`. Un `Retry-After` serveur peut prolonger le cooldown mais ne peut pas dépasser une borne défensive d'une heure. Aucune primitive HTTP commune ne dort en attendant la disponibilité : elle expose un délai de defer que l'orchestrateur `pre.008` pourra projeter provider par provider.
|
||||
|
||||
## 15. Config provider-capability-aware
|
||||
|
||||
Config reste l'unique propriétaire des documents/env/secrets.
|
||||
@@ -686,9 +692,9 @@ Préfixage de toute la surface publique spécifique à la famille `market_price`
|
||||
|
||||
### `pre.003` — HTTP REST commun et rate limiting
|
||||
|
||||
**Statut : planifié.**
|
||||
**Statut : réalisé.**
|
||||
|
||||
Client HTTP REST commun, classification d'erreurs, bornes de body et timeouts, redaction, limiter et cooldown génériques.
|
||||
Client HTTP REST commun crate-private, classification d'erreurs HTTP/reqwest, bornes de body et timeouts, redaction, désactivation explicite des redirects/proxy/retries implicites, JSON syntaxiquement validé, limiter token-bucket générique non bloquant et cooldown provider-driven borné. Aucun adapter provider n'est avancé.
|
||||
|
||||
### `pre.004` — CoinGecko, CoinMarketCap et CoinPaprika
|
||||
|
||||
|
||||
@@ -1157,4 +1157,3 @@ warnings 0
|
||||
```
|
||||
|
||||
Après validation de `rel.001`, le tag unique de la release est `v0.2.8` et `prompts/014-V0_2_9_START_PROMPT.md` devient le contrat actif pour `0.2.9-pre.001`.
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!-- file: docs/validation/014-V0_2_11_OFFCHAIN_PRICE_TRANSPORT.md -->
|
||||
<!-- version: 5 -->
|
||||
<!-- version: 6 -->
|
||||
|
||||
# Validation `0.2.11` — Off-chain price transport SOL/USD
|
||||
|
||||
@@ -103,6 +103,29 @@ ERROR_CODE_MARKET_PRICE_*
|
||||
|
||||
Cette correction reste dans la responsabilité de `pre.002` : elle stabilise la fondation et sa façade avant l'introduction du HTTP runtime en `pre.003`.
|
||||
|
||||
## 3.4 Gate `0.2.11-pre.003`
|
||||
|
||||
| Critère | Statut | Preuve |
|
||||
|-----------------------------------------------------------------------|---------|-----------------------------------------------------|
|
||||
| version workspace `0.2.11-pre.3` | PASS | `Cargo.toml` racine |
|
||||
| `reqwest` utilisé directement, sans SDK provider | PASS | manifest `ksp-offchain-transport-lib` |
|
||||
| primitives HTTP communes sous modules `http_*` crate-private | PASS | `http_client`, `http_settings`, `http_admission` |
|
||||
| client HTTP générique non exporté aux consumers | PASS | façade `lib.rs` |
|
||||
| redirects, Referer, proxy système et retries reqwest désactivés | PASS | construction `HttpRestClient` |
|
||||
| connect/request timeouts bornés | PASS | `HttpClientSettings` |
|
||||
| body borné pendant lecture chunked avant désérialisation | PASS | `HttpRestClient::get_json` |
|
||||
| JSON syntaxiquement validé sans normalisation numérique intermédiaire | PASS | `serde::de::IgnoredAny` sur bytes bruts |
|
||||
| 401/403, 429, 408/5xx et autres statuts distingués | PASS | codes d'erreur HTTP dédiés |
|
||||
| URL reqwest supprimée des sources d'erreur | PASS | `reqwest::Error::without_url` |
|
||||
| body remote non recopié dans les erreurs | PASS | erreurs construites uniquement depuis metadata safe |
|
||||
| limiter fixe lissé et burst absent traité conservativement | PASS | `HttpAdmissionController` |
|
||||
| limite dynamique n'invente pas de cadence locale | PASS | `HttpAdmissionPolicy::Dynamic` |
|
||||
| cooldown `Retry-After` borné et admission non bloquante | PASS | `record_rate_limited` + `try_admit` |
|
||||
| adapters CoinGecko/Jupiter/etc. ajoutés | N/A | explicitement réservés à `pre.004+` |
|
||||
| gate Cargo complet sur l'état livré | PENDING | à exécuter par l'opérateur |
|
||||
|
||||
Les tests déterministes de `pre.003` couvrent en particulier le body chunked dépassant la limite, le refus des redirects, un `429` avec `Retry-After`, la non-propagation d'un body distant canari, le JSON invalide et le refill/cooldown du limiter.
|
||||
|
||||
## 4. Matrice provider prévue
|
||||
|
||||
| Provider | SOL/USD V1 | Gratuit V1 | Mode auth prévu | Test déterministe | Smoke live | Statut courant |
|
||||
|
||||
Reference in New Issue
Block a user