v0.2.12-pre.006
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
<!-- file: docs/plans/019-V0_2_12_SOL_PRICES_DESK_PLAN.md -->
|
||||
<!-- version: 11 -->
|
||||
<!-- version: 12 -->
|
||||
|
||||
# Plan `0.2.12` — SOL Prices Desk + intégration prix Wallet Desk
|
||||
|
||||
@@ -268,7 +268,7 @@ Le prix exact traverse IPC comme chaîne décimale, jamais comme `f64`. Les time
|
||||
|------------------------------------|----------------------------------------------------------------------------------------------------------------|--------------------|
|
||||
| `MarketPriceRuntimeStatusDto` | app version, composite profile, offchain profile, provider counts, fallback logging | Public/safe |
|
||||
| `MarketPriceProviderRowDto` | provider_id, display_name, pair, semantics, auth_mode, availability, price?, timestamps?, retry_at?, refreshed | Public/safe |
|
||||
| `MarketPriceRefreshRequestDto` | provider_id opaque | Public input borné |
|
||||
| single refresh direct | `provider_id` opaque conservé directement depuis `pre.005` | Public input borné |
|
||||
| `MarketPriceRefreshManyRequestDto` | provider_ids opaques bornés | Public input borné |
|
||||
| `MarketPriceRefreshResultDto` | rows affectées + refreshed/classification | Public/safe |
|
||||
| `CommandErrorDto` | domain/code/message borné sans context sensible | Public/safe |
|
||||
@@ -291,7 +291,7 @@ Config effective secret values
|
||||
|-----------------------------|--------------------------------------|----------------------------------|----------------------------------|-----------------------|
|
||||
| `get_runtime_status` | aucun | `MarketPriceRuntimeStatusDto` | AppState/Config runtime | safe |
|
||||
| `list_market_prices` | aucun | `Vec<MarketPriceProviderRowDto>` | MarketPriceRuntime + registry | safe |
|
||||
| `refresh_market_price` | `provider_id` | `MarketPriceRefreshResultDto` | MarketPriceService::refresh | safe ID |
|
||||
| `refresh_market_price` | `provider_id` | `MarketPriceProviderRowDto` | MarketPriceService::refresh | safe ID |
|
||||
| `refresh_market_prices` | liste bornée `provider_id` | `MarketPriceRefreshResultDto` | MarketPriceService::refresh_many | safe IDs |
|
||||
| `refresh_all_market_prices` | aucun | `MarketPriceRefreshResultDto` | MarketPriceService::refresh_all | safe |
|
||||
| `splash_frontend_ready` | fenêtre invoquante | ordre splash existant | Tauri window lifecycle | safe |
|
||||
@@ -514,21 +514,21 @@ Le gate de `pre.004-fix.001` a révélé que `desktop_contract.rs` comparait enc
|
||||
|
||||
### `pre.005` — Refresh individuel
|
||||
|
||||
**Statut : implémenté ; corrigé par `pre.005-fix.001`, gate opérateur à confirmer.**
|
||||
**Statut : réalisé ; corrigé par `pre.005-fix.001`, gate opérateur Cargo/workspace intégralement PASS.**
|
||||
|
||||
Branchement du refresh d'une ligne via `MarketPriceService::refresh`, projection de l'observation exacte, de la fraîcheur et de l'availability, gestion d'erreur sûre et maintien du dernier état applicatif uniquement en mémoire backend. Le backend marque la ligne `loading` sans conserver le mutex de présentation pendant l'`await`, puis applique l'outcome provider-neutral ; une tentative sans nouvelle observation conserve la dernière observation réussie. L'UI ajoute un bouton `Refresh` par ligne, journalise le clic en `debug`, et n'expose encore aucun refresh multiple/global avant `pre.006`.
|
||||
|
||||
#### `pre.005-fix.001` — Canari de centralisation Tauri rendu structurel
|
||||
|
||||
**Statut : implémenté ; gate opérateur à confirmer.**
|
||||
**Statut : réalisé ; gate opérateur Cargo/workspace intégralement PASS.**
|
||||
|
||||
Le gate de `pre.005` confirme que le refresh individuel fonctionne et que le runtime Tauri démarre, mais révèle un faux positif dans `desktop_security.rs` : le canari assimilait toute occurrence du nom métier `refresh_market_price` hors `tauri.rs` à du plumbing de commande. Le fix conserve l'interdiction structurelle de `#[tauri::command]` hors `tauri.rs`, ajoute l'interdiction de `tauri::generate_handler!` hors `tauri.rs`, et autorise les méthodes applicatives homonymes dans `AppState`. Aucun comportement réseau, DTO, provider, row, frontend ou commande n'est modifié.
|
||||
|
||||
### `pre.006` — Refresh multiple et global
|
||||
|
||||
**Statut : planifié.**
|
||||
**Statut : implémenté ; gate opérateur à confirmer.**
|
||||
|
||||
Ajout des refresh selected/many/all, suivi `in-flight`, ordre déterministe et projection des cooldown/retry deadlines sans scheduling consommateur. Aucun polling périodique, fallback automatique ou consensus provider n'est introduit.
|
||||
Ajout de `refresh_market_prices` et `refresh_all_market_prices` sur les APIs génériques `MarketPriceService::refresh_many`/`refresh_all`. La sélection frontend est reconstruite dans l'ordre courant des rows, le backend valide atomiquement doublons/IDs inconnus/conflits `in_flight`, marque toutes les lignes concernées `loading`, relâche le mutex de présentation pendant l'`await`, puis applique les outcomes dans leur ordre déterministe. `MarketPriceRefreshManyRequestDto` transporte uniquement les IDs opaques et `MarketPriceRefreshResultDto` retourne les rows affectées avec `requested_count`/`refreshed_count`. Les cooldown/retry deadlines restent les projections Off-chain existantes ; aucun polling, sleep consommateur, fallback automatique ou consensus provider n'est introduit.
|
||||
|
||||
### `pre.007` — UX et instrumentation SOL Prices Desk
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!-- file: docs/validation/015-V0_2_12_SOL_PRICES_DESK.md -->
|
||||
<!-- version: 10 -->
|
||||
<!-- version: 11 -->
|
||||
|
||||
# Validation `0.2.12` — SOL Prices Desk + intégration Wallet Desk
|
||||
|
||||
@@ -50,13 +50,13 @@ NOT RUN commande non exécutée dans le contexte indiqué
|
||||
|------------------------|-----------------------------------------|---------|
|
||||
| splash Price Desk | lifecycle KSP commun | PASS |
|
||||
| main shell Price Desk | header/navigation KSP | PASS |
|
||||
| table providers | registry provider-neutral, ordre stable | PENDING |
|
||||
| prix exact | String issue de `MarketPriceDecimal` | PENDING |
|
||||
| availability/fraîcheur | état générique + timestamps réels | PENDING |
|
||||
| refresh row | `MarketPriceService::refresh` | PENDING |
|
||||
| table providers | registry provider-neutral, ordre stable | 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` | PENDING |
|
||||
| refresh all | `MarketPriceService::refresh_all` | PENDING |
|
||||
| Diagnostics | profils/counts sûrs seulement | PENDING |
|
||||
| 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 |
|
||||
@@ -65,13 +65,13 @@ NOT RUN commande non exécutée dans le contexte indiqué
|
||||
|
||||
| Contrat | Entrée/sortie sûre | Statut |
|
||||
|----------------------------------------|--------------------------------------------------------------------|---------|
|
||||
| `MarketPriceRuntimeStatusDto` | profiles/counts sans secret | PENDING |
|
||||
| `MarketPriceProviderRowDto` | ID/display/pair/semantics/auth/availability/price/timestamps/retry | PENDING |
|
||||
| `MarketPriceRefreshRequestDto` | provider_id opaque seulement | PENDING |
|
||||
| `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 bornée d’IDs opaques | PENDING |
|
||||
| `MarketPriceRefreshResultDto` | rows/outcome classifiés | PENDING |
|
||||
| runtime/list/refresh/many/all commands | aucun URL/header/API key/body | PENDING |
|
||||
| TS-RS exports | bindings générés non versionnés | PENDING |
|
||||
| TS-RS exports | bindings générés non versionnés | PASS |
|
||||
| provider-specific type dans IPC | interdit | OUT |
|
||||
| prix `f64` comme vérité IPC | interdit | OUT |
|
||||
|
||||
@@ -110,12 +110,12 @@ NOT RUN commande non exécutée dans le contexte indiqué
|
||||
|
||||
| Risque/canari | Attendu | Statut |
|
||||
|--------------------------------|----------------------------------------------|---------|
|
||||
| URL arbitraire depuis frontend | impossible par contrat command | PENDING |
|
||||
| extraction API key/header | aucune projection/log | PENDING |
|
||||
| provider_id inconnu | erreur KSP sûre | PENDING |
|
||||
| URL arbitraire depuis frontend | impossible par contrat command | PASS |
|
||||
| extraction API key/header | aucune projection/log | PASS |
|
||||
| provider_id inconnu | erreur KSP sûre | PASS |
|
||||
| batch duplicate/oversized | rejet avant dispatch | PENDING |
|
||||
| refresh spam | limites/cooldown Off-chain toujours actifs | PENDING |
|
||||
| stale observation | timestamps/état distingués | 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 | PENDING |
|
||||
| close pendant refresh | aucune persistance/sûreté frontend requise | PENDING |
|
||||
| CWD/resource confusion | canaris propres à chaque app | PENDING |
|
||||
@@ -486,3 +486,47 @@ runtime prix / frontend / providers inchangés
|
||||
```
|
||||
|
||||
La version technique devient `0.2.12-pre.5.fix.1`. Le gate attendu doit confirmer le test ciblé puis le workspace complet avant d'ouvrir `pre.006`.
|
||||
|
||||
## 22. Gate `0.2.12-pre.006`
|
||||
|
||||
Le gate opérateur de `pre.005-fix.001` fourni le 2026-08-27 confirme la fermeture de la tranche précédente :
|
||||
|
||||
```text
|
||||
cargo fmt --all PASS
|
||||
python3 scripts/audit_rust_workspace_rules.py PASS
|
||||
python3 scripts/audit_markdown_tables.py ... deltas/0.2.12 PASS
|
||||
cargo check --workspace PASS
|
||||
cargo clippy --workspace --all-targets PASS
|
||||
cargo test -p ksp-app-solprices-desk PASS
|
||||
cargo test --workspace PASS
|
||||
```
|
||||
|
||||
`pre.006` matérialise ensuite le batch manuel provider-neutral :
|
||||
|
||||
```text
|
||||
MarketPriceRefreshManyRequestDto implémenté, IDs opaques uniquement
|
||||
MarketPriceRefreshResultDto implémenté, rows + requested/refreshed counts
|
||||
refresh_market_prices implémenté via MarketPriceService::refresh_many
|
||||
refresh_all_market_prices implémenté via MarketPriceService::refresh_all
|
||||
ordre selected ordre courant des rows / requête conservé
|
||||
ordre all ordre stable provider-id du service
|
||||
in-flight backend validation atomique avant mutation
|
||||
doublon / ID inconnu rejet sûr avant état loading partiel
|
||||
mutex présentation pendant await non
|
||||
cooldown / retry_at projection Off-chain existante
|
||||
Refresh selected / Refresh all frontend implémentés
|
||||
logging clic sélection/selected/all debug, compte/ID opaque seulement
|
||||
logging résultat batch trace, requested/refreshed counts seulement
|
||||
polling / setInterval / scheduler / sleep consommateur absent
|
||||
fallback / consensus / moyenne absent
|
||||
```
|
||||
|
||||
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
|
||||
cargo fmt/check/clippy/test NOT RUN — cargo indisponible dans le sandbox
|
||||
```
|
||||
|
||||
Les lignes `refresh selected/many`, `refresh all`, `MarketPriceRefreshManyRequestDto`, `MarketPriceRefreshResultDto`, ordre many, batch duplicate/oversized et double-click race de la matrice générale restent `PENDING` jusqu'au gate opérateur de cette tranche.
|
||||
|
||||
Reference in New Issue
Block a user