v0.2.11-pre.002-fix.003

This commit is contained in:
2026-08-25 20:37:09 +02:00
parent 126e8abfcd
commit 2dbddfe367
15 changed files with 499 additions and 271 deletions

View File

@@ -1,9 +1,9 @@
<!-- file: docs/plans/018-V0_2_11_OFFCHAIN_PRICE_TRANSPORT_PLAN.md -->
<!-- version: 5 -->
<!-- version: 6 -->
# Plan `0.2.11` — Off-chain price transport SOL/USD multi-provider
**Statut courant : `0.2.11-pre.002-fix.002` ferme le dernier écart Clippy de la fondation avant `pre.003`. Les rustdocs, la façade Logging KSP et la taxonomie interne `market_price_*` restent acquises ; le contrat V1 reste limité à SOL/USD et aucun client HTTP/provider n'est encore ajouté.**
**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é.**
## 1. Base et autorité
@@ -110,6 +110,8 @@ swap_quote_* réservé aux futures quotes montant/route, uniq
Les fichiers génériques `decimal.rs`, `observation.rs`, `provider.rs` et `settings.rs` introduits initialement par `pre.002` sont donc corrigés avant toute extension runtime : la fonctionnalité actuelle est préfixée `market_price_*`. Les futurs domaines ne doivent pas être ajoutés dans ces modules uniquement parce qu'ils utilisent eux aussi un provider HTTP.
La même frontière s'applique à la **façade publique**. À partir de `pre.002-fix.003`, tout symbole public spécifique à cette famille porte un nom explicitement `MarketPrice*` ou `MARKET_PRICE_*` : `MarketPriceDecimal`, `MarketPriceObservation`, `MarketPriceProviderId`, `MarketPriceProviderDescriptor`, `MarketPriceProviderRateLimit`, etc. Aucun alias public `Price*` n'est conservé pendant cette prerelease, car il figerait précisément l'ambiguïté que le correctif supprime. Une future famille `swap_quote_*` devra employer son propre préfixe public `SwapQuote*`; une abstraction sans préfixe de famille ne pourra être créée que lorsqu'un invariant réellement partagé aura été démontré.
La règle est **responsabilité avant taille** : un module commun n'est promu au niveau crate-wide que lorsqu'au moins deux familles réelles partagent le même invariant. Ainsi, le HTTP, le scheduling ou une identité provider pourront être factorisés plus tard si leur partage est effectivement démontré ; aucune abstraction générique n'est créée aujourd'hui uniquement pour anticiper Jupiter Quotes.
### 3.2 Lecture, écriture et verbes HTTP
@@ -339,7 +341,7 @@ Le choix d'une paire explicite évite d'introduire silencieusement une politique
Le gate rejette `f64` comme représentation canonique publique du prix.
Décision matérialisée en `pre.002` : `PriceDecimal` est le type décimal KSP borné, sérialisable sans perte et construit depuis la représentation textuelle du provider.
Décision matérialisée en `pre.002` : `MarketPriceDecimal` est le type décimal KSP borné, sérialisable sans perte et construit depuis la représentation textuelle du provider.
Contrat V1 exact :
@@ -358,7 +360,7 @@ serialization canonique décimale en chaîne
Le wire d'un provider peut être JSON number ou string. L'adapter le convertit vers le type KSP sans utiliser `as_f64()` comme vérité canonique.
`PriceDecimal` sérialise toujours sa valeur canonique sous forme de chaîne décimale non scientifique. Le zéro est invalide pour ce type puisqu'il représente exclusivement un prix réussi ; l'absence de prix reste donc hors de la valeur numérique elle-même.
`MarketPriceDecimal` sérialise toujours sa valeur canonique sous forme de chaîne décimale non scientifique. Le zéro est invalide pour ce type puisqu'il représente exclusivement un prix réussi ; l'absence de prix reste donc hors de la valeur numérique elle-même.
Cette solution évite d'ajouter une crate decimal uniquement pour V1 et prépare le passage frontend sans perte IEEE-754.
@@ -376,7 +378,7 @@ instant provider optionnel lorsqu'il existe réellement
provenance provider sûre et bornée
```
`pre.002` matérialise ce contrat avec `SolUsdPriceObservation`, `PriceTimestamp` (millisecondes UTC depuis Unix epoch) et `PriceProvenance` bornée à 256 octets sans caractères de contrôle. Le constructeur d'observation rejette un instant de réception antérieur au départ de requête.
`pre.002` matérialise ce contrat avec `MarketPriceObservation`, `MarketPriceTimestamp` (millisecondes UTC depuis Unix epoch) et `MarketPriceProvenance` bornée à 256 octets sans caractères de contrôle. Le constructeur d'observation rejette un instant de réception antérieur au départ de requête.
Règles :
@@ -410,7 +412,7 @@ limitation générique
support SOL/USD
```
`pre.002` fixe `PriceProviderId`, `PriceProviderDescriptor`, `PriceProviderAuthMode`, `PriceProviderRateLimit`, `PriceProviderLongTermQuota` et leurs enums de scope/période/unité. Les limites fixes exigent un budget et une fenêtre non nuls ; les limites dynamiques restent explicitement distinctes. Les quotas longs termes sont descriptifs et ne deviennent jamais un compteur local de quota restant.
`pre.002` fixe `MarketPriceProviderId`, `MarketPriceProviderDescriptor`, `MarketPriceProviderAuthMode`, `MarketPriceProviderRateLimit`, `MarketPriceProviderLongTermQuota` et leurs enums de scope/période/unité. Les limites fixes exigent un budget et une fenêtre non nuls ; les limites dynamiques restent explicitement distinctes. Les quotas longs termes sont descriptifs et ne deviennent jamais un compteur local de quota restant.
L'état runtime peut représenter au minimum :
@@ -424,7 +426,7 @@ misconfigured
disabled
```
`PriceProviderAvailability` et `PriceProviderState` matérialisent cette projection générique dès `pre.002`; le registry et les transitions runtime effectives restent prévus en `pre.007`.
`MarketPriceProviderAvailability` et `MarketPriceProviderState` matérialisent cette projection générique dès `pre.002`; le registry et les transitions runtime effectives restent prévus en `pre.007`.
Les noms Rust de cette fondation sont désormais matérialisés ; aucun consumer ne doit parser des strings d'erreur pour connaître cet état.
@@ -662,7 +664,7 @@ Remplacement du forecast tabulaire par des sous-sections éditables, clarificati
**Statut : réalisé.**
Création de la crate et de sa façade publique initiale : `PriceDecimal`, paire SOL/USD, observation/provenance/timestamps, identifiants/descriptors provider, capacités auth/rate-limit/quota, settings communs minimaux et états d'availability provider-neutral. Aucun HTTP, limiter actif, credential provider ou adapter wire n'est avancé depuis `pre.003+`.
Création de la crate et de sa façade publique initiale : `MarketPriceDecimal`, paire SOL/USD, observation/provenance/timestamps, identifiants/descriptors provider, capacités auth/rate-limit/quota, settings communs minimaux et états d'availability provider-neutral. Aucun HTTP, limiter actif, credential provider ou adapter wire n'est avancé depuis `pre.003+`.
#### `pre.002-fix.001` — Rustdoc, Logging et taxonomie Off-chain
@@ -676,6 +678,12 @@ Correction des deux warnings `missing_docs` des tests d'intégration, ajout de `
Correction du canari `dependency_boundary` pour respecter `-D clippy::implicit-return`, sans changement de contrat ni de comportement runtime. La version technique workspace devient `0.2.11-pre.2.fix.2`.
#### `pre.002-fix.003` — Nommage public `MarketPrice*`
**Statut : réalisé.**
Préfixage de toute la surface publique spécifique à la famille `market_price` en `MarketPrice*` / `MARKET_PRICE_*`, y compris observation, décimal, timestamps, provenance, provider settings/descriptors/limits/availability et codes d'erreur. Aucun alias `Price*` n'est conservé : le correctif évite de devoir renommer ces API lorsque d'autres familles telles que `swap_quote_*` seront ajoutées. La version technique workspace devient `0.2.11-pre.2.fix.3`.
### `pre.003` — HTTP REST commun et rate limiting
**Statut : planifié.**

View File

@@ -1,5 +1,5 @@
<!-- file: docs/validation/014-V0_2_11_OFFCHAIN_PRICE_TRANSPORT.md -->
<!-- version: 4 -->
<!-- version: 5 -->
# Validation `0.2.11` — Off-chain price transport SOL/USD
@@ -46,19 +46,19 @@ Les statuts `PLANNED` restent non validés tant que la tranche correspondante n'
## 3. Gate `0.2.11-pre.002`
| Critère | Statut | Preuve |
|----------------------------------------------------|--------|----------------------------------------------------|
| crate `ksp-offchain-transport-lib` créée | PASS | membre workspace + package dédié |
| version workspace synchronisée sur `0.2.11-pre.2` | PASS | `Cargo.toml` racine |
| dépendance inverse vers Config absente | PASS | manifest crate |
| `reqwest` et SDK providers absents de la fondation | PASS | manifest crate |
| `PriceDecimal` exact sans canon `f64` | PASS | coefficient `u128`, scale 18, sérialisation string |
| SOL/USD seule paire publique V1 | PASS | `PricePair::SolUsd` + `SolUsdPriceObservation` |
| identifiant/descripteur provider opaques | PASS | `PriceProviderId` + `PriceProviderDescriptor` |
| auth/rate-limit/quota représentables génériquement | PASS | types provider-neutral dédiés |
| settings communs sans faux endpoint/API key | PASS | `PriceProviderCommonSettings` |
| availability provider-neutral représentable | PASS | `PriceProviderAvailability` + `PriceProviderState` |
| HTTP actif ou adapter provider ajouté | N/A | explicitement réservé à `pre.003+` |
| Critère | Statut | Preuve |
|----------------------------------------------------|--------|----------------------------------------------------------------|
| crate `ksp-offchain-transport-lib` créée | PASS | membre workspace + package dédié |
| version workspace synchronisée sur `0.2.11-pre.2` | PASS | `Cargo.toml` racine |
| dépendance inverse vers Config absente | PASS | manifest crate |
| `reqwest` et SDK providers absents de la fondation | PASS | manifest crate |
| `MarketPriceDecimal` exact sans canon `f64` | PASS | coefficient `u128`, scale 18, sérialisation string |
| SOL/USD seule paire publique V1 | PASS | `MarketPricePair::SolUsd` + `MarketPriceObservation` |
| identifiant/descripteur provider opaques | PASS | `MarketPriceProviderId` + `MarketPriceProviderDescriptor` |
| auth/rate-limit/quota représentables génériquement | PASS | types provider-neutral dédiés |
| settings communs sans faux endpoint/API key | PASS | `MarketPriceProviderCommonSettings` |
| availability provider-neutral représentable | PASS | `MarketPriceProviderAvailability` + `MarketPriceProviderState` |
| HTTP actif ou adapter provider ajouté | N/A | explicitement réservé à `pre.003+` |
## 3.1 Taxonomie Off-chain et observabilité
@@ -81,6 +81,28 @@ Les statuts `PLANNED` restent non validés tant que la tranche correspondante n'
Le gate `cargo clippy --workspace --all-targets` de `pre.002-fix.001` a détecté un unique écart `clippy::implicit-return` dans le canari `tests/dependency_boundary.rs`. Le correctif ajoute le `return` explicite attendu dans la closure de `Iterator::any` et synchronise `workspace.package.version` sur `0.2.11-pre.2.fix.2`. Aucun contrat public, comportement runtime ou scope provider n'est modifié.
Les validations opérateur du `2026-08-25` sur `pre.002-fix.002` sont : `cargo fmt --all` PASS, audit Rust PASS, audit Markdown PASS, `cargo check --workspace` PASS, `cargo test -p ksp-offchain-transport-lib` PASS avec 13 tests exécutés, et `cargo clippy --workspace --all-targets` PASS. `cargo test --workspace` n'a pas été rejoué après ce fix et n'est donc pas déclaré PASS pour cet état exact.
## 3.3 Correctif `0.2.11-pre.002-fix.003`
Le nommage public initial `Price*` restait trop générique alors que les modules qui possèdent ces contrats sont explicitement la famille `market_price_*`. Le correctif synchronise `workspace.package.version` sur `0.2.11-pre.2.fix.3` et renomme sans alias de compatibilité toute la surface publique spécifique à cette famille en `MarketPrice*` / `MARKET_PRICE_*`.
Le contrat attendu après application est :
```text
MarketPriceDecimal
MarketPriceObservation
MarketPriceTimestamp
MarketPriceProvenance
MarketPricePair
MarketPriceSemantics
MarketPriceProvider*
MARKET_PRICE_*
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`.
## 4. Matrice provider prévue
| Provider | SOL/USD V1 | Gratuit V1 | Mode auth prévu | Test déterministe | Smoke live | Statut courant |