v0.2.11-pre.008
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
<!-- file: docs/validation/014-V0_2_11_OFFCHAIN_PRICE_TRANSPORT.md -->
|
||||
<!-- version: 12 -->
|
||||
<!-- version: 13 -->
|
||||
|
||||
# Validation `0.2.11` — Off-chain price transport SOL/USD
|
||||
|
||||
@@ -234,30 +234,55 @@ Les fixtures de `pre.006` couvrent Jupiter keyless/Free, redaction de la clé, p
|
||||
|
||||
## 3.10 Gate `0.2.11-pre.007`
|
||||
|
||||
| Critère | Statut | Preuve |
|
||||
|------------------------------------------------------------------|---------|---------------------------------------|
|
||||
| version workspace `0.2.11-pre.7` | PASS | `Cargo.toml` racine |
|
||||
| Birdeye Standard SOL/USD adapter public | PASS | `market_price_birdeye.rs` |
|
||||
| Birdeye exige `X-API-KEY` lorsqu'activé | PASS | settings + header sensible |
|
||||
| Birdeye fixe `x-chain = solana` et le mint WSOL | PASS | request builder |
|
||||
| Birdeye Price Single `value` parsé exactement | PASS | `RawValue` -> `MarketPriceDecimal` |
|
||||
| Birdeye `updateUnixTime` conservé comme timestamp provider | PASS | parser provider |
|
||||
| Birdeye Standard 1 RPS compte modélisé | PASS | descriptor provider |
|
||||
| quota Birdeye 30 000 compute units informatif | PASS | `MarketPriceProviderLongTermQuota` |
|
||||
| coût Price Single 3 compute units informatif | PASS | `MarketPriceProviderRequestCost` |
|
||||
| registry provider-neutral matérialisé | PASS | `MarketPriceProviderRegistry` |
|
||||
| huit providers V1 présents dans le canari de complétude registry | PASS | test `market_price_registry` |
|
||||
| registry trié par provider id et doublons rejetés | PASS | constructeur public générique + tests |
|
||||
| entry publique limitée à descriptor + état générique | PASS | `MarketPriceProviderRegistryEntry` |
|
||||
| availability expose éligibilité et `retry_at` génériques | PASS | `MarketPriceProviderAvailability` |
|
||||
| registry sans mutation ou dispatch réseau | PASS | projection générique publique |
|
||||
| registry ne contient aucun dispatch/name provider | PASS | dependency boundary |
|
||||
| refresh single/multiple, Config et smoke live non avancés | PASS | scope réservé à `pre.008+` |
|
||||
| audit Rust sandbox | PASS | clean, 0 candidate export |
|
||||
| audit Markdown sandbox | PASS | clean, 121 tables / 112 fichiers |
|
||||
| gate Cargo | PLANNED | à exécuter par l'opérateur |
|
||||
| Critère | Statut | Preuve |
|
||||
|------------------------------------------------------------------|--------|---------------------------------------|
|
||||
| version workspace `0.2.11-pre.7` | PASS | `Cargo.toml` racine |
|
||||
| Birdeye Standard SOL/USD adapter public | PASS | `market_price_birdeye.rs` |
|
||||
| Birdeye exige `X-API-KEY` lorsqu'activé | PASS | settings + header sensible |
|
||||
| Birdeye fixe `x-chain = solana` et le mint WSOL | PASS | request builder |
|
||||
| Birdeye Price Single `value` parsé exactement | PASS | `RawValue` -> `MarketPriceDecimal` |
|
||||
| Birdeye `updateUnixTime` conservé comme timestamp provider | PASS | parser provider |
|
||||
| Birdeye Standard 1 RPS compte modélisé | PASS | descriptor provider |
|
||||
| quota Birdeye 30 000 compute units informatif | PASS | `MarketPriceProviderLongTermQuota` |
|
||||
| coût Price Single 3 compute units informatif | PASS | `MarketPriceProviderRequestCost` |
|
||||
| registry provider-neutral matérialisé | PASS | `MarketPriceProviderRegistry` |
|
||||
| huit providers V1 présents dans le canari de complétude registry | PASS | test `market_price_registry` |
|
||||
| registry trié par provider id et doublons rejetés | PASS | constructeur public générique + tests |
|
||||
| entry publique limitée à descriptor + état générique | PASS | `MarketPriceProviderRegistryEntry` |
|
||||
| availability expose éligibilité et `retry_at` génériques | PASS | `MarketPriceProviderAvailability` |
|
||||
| registry sans mutation ou dispatch réseau | PASS | projection générique publique |
|
||||
| registry ne contient aucun dispatch/name provider | PASS | dependency boundary |
|
||||
| refresh single/multiple, Config et smoke live non avancés | PASS | scope réservé à `pre.008+` |
|
||||
| audit Rust sandbox | PASS | clean, 0 candidate export |
|
||||
| audit Markdown sandbox | PASS | clean, 121 tables / 112 fichiers |
|
||||
| gate Cargo | PASS | gate opérateur complet du 2026-08-26 |
|
||||
|
||||
Les tests déterministes de `pre.007` couvrent l'auth Birdeye et sa redaction, le descriptor 1 RPS / 30 000 CU / 3 CU, le parsing exact du prix et du timestamp, les réponses invalides, ainsi que le registry complet des huit providers, son ordre déterministe, le rejet de doublons et les projections d'availability. Aucun refresh réseau générique ni smoke live n'est revendiqué dans cette tranche.
|
||||
Les tests déterministes de `pre.007` couvrent l'auth Birdeye et sa redaction, le descriptor 1 RPS / 30 000 CU / 3 CU, le parsing exact du prix et du timestamp, les réponses invalides, ainsi que le registry complet des huit providers, son ordre déterministe, le rejet de doublons et les projections d'availability. Le gate opérateur du 2026-08-26 est intégralement PASS : audits Rust/Markdown, `cargo check --workspace`, `cargo clippy --workspace --all-targets`, tests ciblés Off-chain et `cargo test --workspace`. Aucun smoke live provider n'est revendiqué.
|
||||
|
||||
## 3.11 Gate `0.2.11-pre.008`
|
||||
|
||||
| Critère | Statut | Preuve |
|
||||
|-------------------------------------------------------------------------|---------|--------------------------------------------|
|
||||
| version workspace `0.2.11-pre.8` | PASS | `Cargo.toml` racine |
|
||||
| `MarketPriceService` provider-agnostic public | PASS | `market_price_service.rs` |
|
||||
| setup provider-specific limité à la composition | PASS | `MarketPriceProviderSetup` |
|
||||
| registry détachable sans dispatch provider | PASS | `MarketPriceService::registry` |
|
||||
| refresh individuel par `MarketPriceProviderId` | PASS | `MarketPriceService::refresh` |
|
||||
| refresh multiple par liste d'identifiants opaques | PASS | `MarketPriceService::refresh_many` |
|
||||
| refresh all en ordre provider déterministe | PASS | `MarketPriceService::refresh_all` |
|
||||
| doublons / provider inconnu rejetés avant dispatch | PASS | tests `market_price_service` |
|
||||
| provider non éligible projeté sans requête réseau | PASS | eligibility + test huit providers disabled |
|
||||
| `429` / defer local projetés en `CoolingDown` | PASS | classification générique |
|
||||
| `401/403` keyed projetés en `AuthenticationUnavailable` | PASS | classification auth-aware |
|
||||
| transport temporaire projeté sans rendre le service global inutilisable | PASS | outcome provider-neutral |
|
||||
| aucune attente/sleep de rate limit dans le service | PASS | dependency boundary |
|
||||
| aucun fallback, consensus ou agrégation multi-provider | PASS | scope + dependency boundary |
|
||||
| Config, scheduling périodique et smoke live non avancés | PASS | scope réservé à `pre.009+` |
|
||||
| audit Rust sandbox | PASS | clean, 0 candidate export |
|
||||
| audit Markdown sandbox | PASS | clean, 122 tables / 113 fichiers |
|
||||
| gate Cargo | PLANNED | à exécuter par l'opérateur |
|
||||
|
||||
Les tests déterministes de `pre.008` vérifient le registry de service sur les huit setups V1, `refresh_all` sans réseau lorsque tous les providers sont désactivés, le rejet pré-dispatch des doublons/providers inconnus, les classes auth/rate-limit/temporaire/local misconfiguration et l'éligibilité temporelle des cooldowns. Les méthodes multiples restent séquentielles et déterministes dans V1 ; elles ne dorment jamais pour attendre un provider et ne font aucun fallback/consensus.
|
||||
|
||||
## 4. Matrice provider prévue
|
||||
|
||||
@@ -278,21 +303,21 @@ Avant la stable, les conditions d'usage et la persistance des offres gratuites d
|
||||
|
||||
## 5. Contrat public prévu
|
||||
|
||||
| Invariant | Statut |
|
||||
|------------------------------------------------------------------------|---------|
|
||||
| surface publique limitée à SOL/USD dans V1 | PASS |
|
||||
| identifiants provider opaques pour les consumers | PASS |
|
||||
| provenance provider toujours observable | PASS |
|
||||
| sémantique de prix observable sans prétendre à une équivalence | PASS |
|
||||
| timestamp requête/réception KSP présents | PASS |
|
||||
| timestamp provider optionnel seulement lorsqu'il est réellement fourni | PASS |
|
||||
| absence de prix distincte de zéro | PASS |
|
||||
| `f64` non utilisé comme canon public | PASS |
|
||||
| aucune structure wire provider exportée | PASS |
|
||||
| aucune URL/header/asset id provider requis côté app | PASS |
|
||||
| registry provider et état runtime possédés par Off-chain Transport | PASS |
|
||||
| refresh provider par identifiant générique | PLANNED |
|
||||
| refresh multiple sans connaissance provider côté consumer | PLANNED |
|
||||
| Invariant | Statut |
|
||||
|------------------------------------------------------------------------|--------|
|
||||
| surface publique limitée à SOL/USD dans V1 | PASS |
|
||||
| identifiants provider opaques pour les consumers | PASS |
|
||||
| provenance provider toujours observable | PASS |
|
||||
| sémantique de prix observable sans prétendre à une équivalence | PASS |
|
||||
| timestamp requête/réception KSP présents | PASS |
|
||||
| timestamp provider optionnel seulement lorsqu'il est réellement fourni | PASS |
|
||||
| absence de prix distincte de zéro | PASS |
|
||||
| `f64` non utilisé comme canon public | PASS |
|
||||
| aucune structure wire provider exportée | PASS |
|
||||
| aucune URL/header/asset id provider requis côté app | PASS |
|
||||
| registry provider et état runtime possédés par Off-chain Transport | PASS |
|
||||
| refresh provider par identifiant générique | PASS |
|
||||
| refresh multiple sans connaissance provider côté consumer | PASS |
|
||||
|
||||
## 6. Rate limiting et availability
|
||||
|
||||
@@ -304,10 +329,10 @@ Avant la stable, les conditions d'usage et la persistance des offres gratuites d
|
||||
| `429` classé | PASS |
|
||||
| `Retry-After` honoré lorsqu'exploitable | PASS |
|
||||
| cooldown expose prochain instant admissible | PASS |
|
||||
| refresh all ne lance que les providers éligibles | PLANNED |
|
||||
| provider en cooldown ne bloque pas les autres | PLANNED |
|
||||
| provider down ne rend pas le service global inutilisable | PLANNED |
|
||||
| auth manquante distinguée d'un transport down | PLANNED |
|
||||
| refresh all ne lance que les providers éligibles | PASS |
|
||||
| provider en cooldown ne bloque pas les autres | PASS |
|
||||
| provider down ne rend pas le service global inutilisable | PASS |
|
||||
| auth rejetée distinguée d'un transport down | PASS |
|
||||
| quota indisponible distingué d'un transport down | PLANNED |
|
||||
| quota mensuel local non présenté comme compteur authoritative | PASS |
|
||||
|
||||
|
||||
Reference in New Issue
Block a user