v0.2.12-pre.008

This commit is contained in:
2026-08-27 14:41:08 +02:00
parent 2042482592
commit f1e365ec97
22 changed files with 631 additions and 129 deletions

View File

@@ -1,5 +1,5 @@
<!-- file: docs/validation/015-V0_2_12_SOL_PRICES_DESK.md -->
<!-- version: 12 -->
<!-- version: 13 -->
# Validation `0.2.12` — SOL Prices Desk + intégration Wallet Desk
@@ -46,21 +46,21 @@ NOT RUN commande non exécutée dans le contexte indiqué
## 3. Screen/feature matrix
| Surface | Contrat | Statut |
|------------------------|-----------------------------------------|---------|
| splash Price Desk | lifecycle KSP commun | PASS |
| main shell Price Desk | header/navigation KSP | PASS |
| table providers | registry provider-neutral, ordre stable | PASS |
| table responsive UX | sticky/badges/timestamps distincts | PASS |
| prix exact | String issue de `MarketPriceDecimal` | PASS |
| availability/fraîcheur | état générique + timestamps réels | PASS |
| refresh row | `MarketPriceService::refresh` | PASS |
| refresh selected/many | `MarketPriceService::refresh_many` | PASS |
| refresh all | `MarketPriceService::refresh_all` | PASS |
| Diagnostics | profils/counts sûrs seulement | PASS |
| Wallet price panel | Dashboard compact provider-neutral | PENDING |
| auto-refresh | aucun scheduler/polling | OUT |
| Wallet USD valuation | aucun prix canonique | OUT |
| Surface | Contrat | Statut |
|------------------------|-----------------------------------------|--------|
| splash Price Desk | lifecycle KSP commun | PASS |
| main shell Price Desk | header/navigation KSP | PASS |
| table providers | registry provider-neutral, ordre stable | PASS |
| table responsive UX | sticky/badges/timestamps distincts | PASS |
| prix exact | String issue de `MarketPriceDecimal` | PASS |
| availability/fraîcheur | état générique + timestamps réels | PASS |
| refresh row | `MarketPriceService::refresh` | PASS |
| refresh selected/many | `MarketPriceService::refresh_many` | PASS |
| refresh all | `MarketPriceService::refresh_all` | PASS |
| Diagnostics | profils/counts sûrs seulement | PASS |
| Wallet prix moyen | une case `SOL/USD moyen` / `N.A.` | PASS |
| auto-refresh | aucun scheduler/polling | OUT |
| Wallet USD valuation | aucune multiplication balance × prix | OUT |
## 4. DTO/command matrix
@@ -69,7 +69,7 @@ NOT RUN commande non exécutée dans le contexte indiqué
| `MarketPriceRuntimeStatusDto` | profiles/counts sans secret | PASS |
| `MarketPriceProviderRowDto` | ID/display/pair/semantics/auth/availability/price/timestamps/retry | PASS |
| single refresh direct | provider_id opaque seulement | PASS |
| `MarketPriceRefreshManyRequestDto` | liste dIDs opaques ; borne hostile à durcir en `pre.008` | PASS |
| `MarketPriceRefreshManyRequestDto` | liste dIDs opaques ; borne hostile à durcir en `pre.009` | PASS |
| `MarketPriceRefreshResultDto` | rows/outcome classifiés | PASS |
| runtime/list/refresh/many/all commands | aucun URL/header/API key/body | PASS |
| TS-RS exports | bindings générés non versionnés | PASS |
@@ -115,7 +115,7 @@ NOT RUN commande non exécutée dans le contexte indiqué
| extraction API key/header | aucune projection/log | PASS |
| provider_id inconnu | erreur KSP sûre | PASS |
| batch duplicate | rejet avant dispatch | PASS |
| batch oversized | borne hostile applicative à durcir en `pre.008` | PENDING |
| batch oversized | borne hostile applicative à durcir en `pre.009` | PENDING |
| refresh spam | limites/cooldown Off-chain toujours actifs | PASS |
| stale observation | timestamps/état distingués | PASS |
| double-click race | in-flight/order contrôlés | PASS |
@@ -128,17 +128,22 @@ NOT RUN commande non exécutée dans le contexte indiqué
## 8. Wallet integration matrix
| Contrat | Attendu | Statut |
|----------------------------|-----------------------------------------------------------------|---------|
| Cargo dependency | Wallet Desk -> `ksp-offchain-transport-lib` | PENDING |
| Config component | Wallet composite -> `cfg.std.offchain_transport/public_keyless` | PENDING |
| runtime | ResolvedOffchainTransportConfig -> MarketPriceService | PENDING |
| commands/DTO | provider-neutral | PENDING |
| UI | petit panneau Dashboard | PENDING |
| balance HTTP On-chain | inchangée | PENDING |
| WalletSession VIEW/OWNER | inchangée | PENDING |
| Wallet secret projections | aucune nouvelle | PENDING |
| USD balance multiplication | hors scope | OUT |
| Contrat | Attendu | Statut |
|----------------------------|--------------------------------------------------------------------------|--------|
| Cargo dependency | Wallet Desk -> `ksp-offchain-transport-lib` | PASS |
| Config component | Wallet composite -> `cfg.std.offchain_transport/public_keyless` | PASS |
| runtime | Config -> `ResolvedOffchainTransportConfig` -> `MarketPriceService` | PASS |
| command | `refresh_wallet_balance` existante, aucun input prix/provider | PASS |
| DTO | `WalletBalanceDto.sol_usd_average: Option<String>` | PASS |
| moyenne | observations réussies du refresh courant, backend sans `f64`, 8 déc. max | PASS |
| UI | une seule case `SOL/USD moyen` / `N.A.` | PASS |
| balance HTTP On-chain | `getBalance` inchangé et toujours autoritatif | PASS |
| dégradation prix | échec/absence prix -> `N.A.` sans faire échouer la balance | PASS |
| WalletSession VIEW/OWNER | inchangée | PASS |
| Wallet secret projections | aucune nouvelle | PASS |
| provider ID frontend | aucun | PASS |
| command prix Wallet | aucune | PASS |
| USD balance multiplication | hors scope | OUT |
## 9. Tauri/package matrix
@@ -187,14 +192,14 @@ cargo fmt/check/clippy/test opérateur sur base stable fournie PASS
Après écriture du présent delta, les audits Rust structurel et Markdown ont été rejoués avec `deltas/0.2.12` inclus et sont propres.
## 12. Forecast de clôture
## 12. Forecast de clôture recalibré
Les responsabilités finales restent séparées :
Après décision opérateur de simplifier Wallet Desk, les responsabilités restantes sont condensées sans supprimer les gates de sortie :
```text
pre.013 gate technique/live + builds finaux
pre.014 réconciliation documentaire finale
pre.015 prompt suivant + CHANGELOG + ROADMAP uniquement
pre.008 intégration Wallet minimale + moyenne SOL/USD
pre.009 hardening transversal + gate technique/live + builds finaux
pre.010 réconciliation documentaire + prompt suivant + CHANGELOG + ROADMAP
rel.001 publication stable
```
@@ -531,7 +536,7 @@ python3 scripts/audit_markdown_tables.py README.md ... deltas PASS
cargo fmt/check/clippy/test NOT RUN — cargo indisponible dans le sandbox
```
Le gate opérateur de `pre.006` fourni le 2026-08-27 ferme ensuite cette tranche : audits, `cargo check`, Clippy, test ciblé et `cargo test --workspace` passent, `cargo tauri dev` démarre correctement et le parcours manuel confirme que le multi-refresh fonctionne. Les lignes `refresh selected/many`, `refresh all`, les deux DTOs batch, l'ordre many, le rejet des doublons et le conflit `in_flight` passent donc à `PASS`. La borne hostile d'une requête batch artificiellement surdimensionnée reste volontairement `PENDING` pour le hardening `pre.008`.
Le gate opérateur de `pre.006` fourni le 2026-08-27 ferme ensuite cette tranche : audits, `cargo check`, Clippy, test ciblé et `cargo test --workspace` passent, `cargo tauri dev` démarre correctement et le parcours manuel confirme que le multi-refresh fonctionne. Les lignes `refresh selected/many`, `refresh all`, les deux DTOs batch, l'ordre many, le rejet des doublons et le conflit `in_flight` passent donc à `PASS`. La borne hostile d'une requête batch artificiellement surdimensionnée reste volontairement `PENDING` pour le hardening `pre.009`.
## 23. Gate `0.2.12-pre.007`
@@ -565,3 +570,36 @@ python3 scripts/audit_markdown_tables.py README.md ... deltas PASS
TypeScript syntax transpile main.ts PASS
cargo fmt/check/clippy/test NOT RUN — cargo indisponible dans le sandbox
```
Le gate opérateur du `27 août 2026` ferme `pre.007` : `cargo fmt --all`, audits Rust/Markdown, `cargo check --workspace`, Clippy workspace, `cargo test -p ksp-app-solprices-desk`, `cargo test --workspace` et `cargo tauri dev` passent. Le parcours visuel confirme la table finale avec 8 providers, états Ready/Disabled/Cooling down, observations distinctes, timestamps provider/KSP et les contrôles de refresh.
## 24. Gate `0.2.12-pre.008` — intégration Wallet minimale
La décision opérateur réduit le besoin Wallet à une seule information auxiliaire liée au refresh de balance :
```text
composite Wallet + offchain_transport/public_keyless implémenté
ksp-app-wallet-desk -> ksp-offchain-transport-lib implémenté
runtime Off-chain Wallet best-effort, erreur -> N.A.
refresh_wallet_balance input inchangé
getBalance + refresh_all lancés dans la même opération backend
observations prises pour moyenne uniquement succès du refresh courant
moyenne backend, aucune conversion f64, 8 décimales max
WalletBalanceDto.sol_usd_average Option<String>
UI Wallet une case SOL/USD moyen / N.A.
provider_id / URL / credential / command prix dans frontend absent
valorisation balance SOL en USD absente
WalletSession / VIEW / OWNER / secrets inchangés
```
Le runtime prix est auxiliaire : une indisponibilité Config/Off-chain ou zéro observation ne doit pas invalider une réponse `getBalance` réussie. Aucun état provider détaillé n'est dupliqué dans Wallet Desk ; l'inspection avancée reste dans SOL Prices Desk.
Validations sandbox après matérialisation :
```text
python3 scripts/audit_rust_workspace_rules.py PASS
python3 scripts/audit_markdown_tables.py README.md ... deltas PASS
TypeScript syntax transpile Wallet main.ts PASS
cargo fmt/check/clippy/test NOT RUN — cargo indisponible dans le sandbox
```