v0.2.11-pre.009
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
<!-- file: docs/validation/014-V0_2_11_OFFCHAIN_PRICE_TRANSPORT.md -->
|
||||
<!-- version: 14 -->
|
||||
<!-- version: 15 -->
|
||||
|
||||
# Validation `0.2.11` — Off-chain price transport SOL/USD
|
||||
|
||||
@@ -261,30 +261,57 @@ Les tests déterministes de `pre.007` couvrent l'auth Birdeye et sa redaction, l
|
||||
|
||||
## 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 `pre.008` brut | FAIL | 1 warning Clippy + 1 canari boundary FAIL |
|
||||
| fix `pre.008-fix.001` statique | PASS | audits Rust/Markdown sandbox |
|
||||
| gate Cargo du fix | PLANNED | à exécuter par l'opérateur |
|
||||
| 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 `pre.008` brut | FAIL | 1 warning Clippy + 1 canari boundary FAIL |
|
||||
| fix `pre.008-fix.001` statique | PASS | audits Rust/Markdown sandbox |
|
||||
| gate Cargo du fix | PASS | gate opérateur complet du 2026-08-26 |
|
||||
|
||||
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. Le gate opérateur initial a toutefois trouvé un warning `clippy::collapsible_if` et un canari boundary trop large (`!service.contains("consensus")`) qui échouait sur la rustdoc décrivant justement l'absence de consensus. `pre.008-fix.001` corrige ces deux points sans modifier le comportement runtime.
|
||||
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. Le gate opérateur initial a toutefois trouvé un warning `clippy::collapsible_if` et un canari boundary trop large (`!service.contains("consensus")`) qui échouait sur la rustdoc décrivant justement l'absence de consensus. `pre.008-fix.001` corrige ces deux points sans modifier le comportement runtime. Le gate rejoué sur `0.2.11-pre.8.fix.1` est intégralement PASS : audits Rust/Markdown, `cargo check --workspace`, `cargo clippy --workspace --all-targets`, 54 tests unitaires + 6 boundary + 7 public API Off-chain, puis `cargo test --workspace` avec uniquement les smokes/timing explicitement ignorés.
|
||||
|
||||
## 3.12 Gate `0.2.11-pre.009`
|
||||
|
||||
| Critère | Statut | Preuve |
|
||||
|----------------------------------------------------------------------|---------|----------------------------------------------------------------|
|
||||
| version workspace `0.2.11-pre.9` | PASS | `Cargo.toml` racine |
|
||||
| document `cfg.std.offchain_transport` enregistré | PASS | registry Config + `std.offchain_transport.json` |
|
||||
| schema `schema.std.offchain_transport` enregistré | PASS | registry Config + schema Draft 2020-12 |
|
||||
| domaine actuel imbriqué sous `market_price` | PASS | document/schema V1 |
|
||||
| profils `public_keyless` et `all_free` versionnés | PASS | document standard + exemple |
|
||||
| huit branches provider Config obligatoires | PASS | schema + fixture |
|
||||
| credentials conditionnés par mode/provider | PASS | `if/then` du schema |
|
||||
| credentials effectifs exigent une provenance Config Secret | PASS | adapter `offchain_transport.rs` + tests |
|
||||
| littéral credential rejeté par l'adapter effectif | PASS | test `literal_or_nonsecret_provider_credentials...` |
|
||||
| DexScreener pair requis seulement lorsque le provider est activé | PASS | schema + `MarketPriceDexScreenerSettings` |
|
||||
| Dex pair via environnement exige une provenance Public | PASS | adapter Config + test |
|
||||
| `.env.example` inventorie quatre secrets et la paire publique | PASS | `.env.example` |
|
||||
| Config construit `MarketPriceService` via `MarketPriceProviderSetup` | PASS | `ResolvedOffchainTransportConfig` |
|
||||
| Off-chain Transport ne dépend pas de Config | PASS | dependency ownership + manifest |
|
||||
| aucune cadence provider libre ajoutée à Config | PASS | schema/document sans rate-limit override |
|
||||
| Config Debug/safe view ne divulgue pas les API keys | PASS | tests adapter |
|
||||
| applications desktop embarquent document + schema | PASS | deux `tauri.conf.json` + canaries desktop |
|
||||
| audit Rust sandbox | PASS | clean, 0 candidate export |
|
||||
| audit Markdown sandbox | PASS | clean, 123 tables / 115 fichiers |
|
||||
| `cargo check` / Clippy / tests Config et workspace | PLANNED | gate opérateur requis après application de l'archive `pre.009` |
|
||||
|
||||
La tranche n'ajoute aucune URL provider configurable, aucun SDK provider et aucune lecture directe de l'environnement dans `ksp-offchain-transport-lib`. Les secrets restent résolus par `ksp-config-lib`; le service runtime reçoit uniquement les settings typés nécessaires. La modification DexScreener est capability-aware : une paire absente est valide uniquement lorsque l'adapter est désactivé, ce qui permet de conserver son entrée dans l'inventaire générique sans fabriquer de fausse configuration.
|
||||
|
||||
## 4. Matrice provider prévue
|
||||
|
||||
@@ -374,32 +401,32 @@ Avant la stable, les conditions d'usage et la persistance des offres gratuites d
|
||||
|
||||
## 9. DexScreener V1
|
||||
|
||||
| Invariant | Statut |
|
||||
|----------------------------------------------|--------|
|
||||
| pair address SOL/USD explicite dans settings | PASS |
|
||||
| `chainId = solana` vérifié | PASS |
|
||||
| identité SOL de la paire vérifiée | PASS |
|
||||
| `priceUsd` utilisé comme prix commun | PASS |
|
||||
| aucune recherche automatique de pool | PASS |
|
||||
| aucun tri automatique par liquidité | PASS |
|
||||
| aucune moyenne/consensus entre pools | PASS |
|
||||
| Invariant | Statut |
|
||||
|--------------------------------------------------|--------|
|
||||
| pair address SOL/USD explicite si provider actif | PASS |
|
||||
| `chainId = solana` vérifié | PASS |
|
||||
| identité SOL de la paire vérifiée | PASS |
|
||||
| `priceUsd` utilisé comme prix commun | PASS |
|
||||
| aucune recherche automatique de pool | PASS |
|
||||
| aucun tri automatique par liquidité | PASS |
|
||||
| aucune moyenne/consensus entre pools | PASS |
|
||||
|
||||
## 10. Config -> Off-chain Transport
|
||||
|
||||
| Invariant | Statut |
|
||||
|------------------------------------------------------------------|---------|
|
||||
| Off-chain Transport ne dépend pas de Config | PLANNED |
|
||||
| document standard offchain dédié | PLANNED |
|
||||
| branches provider conditionnelles dans schema | PLANNED |
|
||||
| CoinGecko keyless/Demo représentés | PLANNED |
|
||||
| CoinMarketCap keyless/Basic représentés | PLANNED |
|
||||
| Jupiter keyless/Free représentés | PLANNED |
|
||||
| Birdeye exige credential lorsqu'activé | PLANNED |
|
||||
| DexScreener exige pair address lorsqu'activé | PLANNED |
|
||||
| providers sans auth n'exposent pas de faux champ API key | PLANNED |
|
||||
| secrets via Config uniquement | PLANNED |
|
||||
| `.env.example` synchronisé pour les secrets réellement ajoutés | PLANNED |
|
||||
| aucune cadence provider configurable au-dessus de la limite sûre | PLANNED |
|
||||
| Invariant | Statut |
|
||||
|------------------------------------------------------------------|--------|
|
||||
| Off-chain Transport ne dépend pas de Config | PASS |
|
||||
| document standard offchain dédié | PASS |
|
||||
| branches provider conditionnelles dans schema | PASS |
|
||||
| CoinGecko keyless/Demo représentés | PASS |
|
||||
| CoinMarketCap keyless/Basic représentés | PASS |
|
||||
| Jupiter keyless/Free représentés | PASS |
|
||||
| Birdeye exige credential lorsqu'activé | PASS |
|
||||
| DexScreener exige pair address lorsqu'activé | PASS |
|
||||
| providers sans auth n'exposent pas de faux champ API key | PASS |
|
||||
| secrets via Config uniquement | PASS |
|
||||
| `.env.example` synchronisé pour les secrets réellement ajoutés | PASS |
|
||||
| aucune cadence provider configurable au-dessus de la limite sûre | PASS |
|
||||
|
||||
## 11. Frontière future `ksp-app-solprices-desk`
|
||||
|
||||
|
||||
Reference in New Issue
Block a user