v0.2.12-pre.008
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
<!-- file: docs/plans/019-V0_2_12_SOL_PRICES_DESK_PLAN.md -->
|
||||
<!-- version: 13 -->
|
||||
<!-- version: 14 -->
|
||||
|
||||
# Plan `0.2.12` — SOL Prices Desk + intégration prix Wallet Desk
|
||||
|
||||
@@ -29,7 +29,7 @@ Mission concrète de la release :
|
||||
```text
|
||||
1. créer ksp-app-solprices-desk comme HID Tauri provider-agnostic
|
||||
2. valider son contrat Config + MarketPriceService + DTO/commands + UI
|
||||
3. intégrer ensuite la même capacité générique dans ksp-app-wallet-desk
|
||||
3. intégrer dans ksp-app-wallet-desk une projection auxiliaire minimale : moyenne SOL/USD calculée lors du refresh de balance
|
||||
```
|
||||
|
||||
Ownership durable :
|
||||
@@ -242,21 +242,27 @@ splash
|
||||
|
||||
Le shell reste volontairement petit : pas de dashboard trading, graphe, historique, quote routing ou éditeur Config.
|
||||
|
||||
### Point d'insertion Wallet Desk
|
||||
### Point d'insertion Wallet Desk — décision opérateur `pre.008`
|
||||
|
||||
Le périmètre Wallet Desk est volontairement réduit après validation complète de SOL Prices Desk :
|
||||
|
||||
```text
|
||||
Wallet Desk existing shell
|
||||
-> Dashboard
|
||||
-> panneau compact “SOL/USD prices”
|
||||
-> quelques/toutes lignes provider-neutral selon espace
|
||||
-> availability + fraîcheur
|
||||
-> refresh row / refresh all borné
|
||||
-> aucune dépendance à une Wallet sélectionnée ou déverrouillée
|
||||
-> Dashboard / Wallet courant
|
||||
-> Balance SOL existante
|
||||
-> une seule case “SOL/USD moyen”
|
||||
-> valeur moyenne dérivée du refresh courant
|
||||
-> N.A. si aucune observation exploitable
|
||||
-> bouton Refresh balance existant
|
||||
-> getBalance On-chain
|
||||
-> refresh_all Off-chain des providers éligibles
|
||||
-> moyenne backend
|
||||
-> projection commune Balance + SOL/USD
|
||||
```
|
||||
|
||||
Le panneau prix est indépendant du lifecycle VIEW/OWNER. Il ne modifie ni la balance SOL ni les opérations Wallet.
|
||||
Aucun inventaire provider, aucune availability détaillée et aucun bouton prix supplémentaire ne sont dupliqués dans Wallet Desk. Les fonctions avancées restent la responsabilité de `ksp-app-solprices-desk`. Le prix auxiliaire suit le lifecycle du refresh de balance existant et n'ajoute aucun nouveau droit VIEW/OWNER.
|
||||
|
||||
**Valorisation USD du solde : hors scope `0.2.12`.** Il n'existe pas de prix KSP canonique et la release ne choisit pas arbitrairement le premier provider.
|
||||
**Valorisation USD du solde : toujours hors scope `0.2.12`.** La moyenne est seulement affichée comme information SOL/USD ; aucun calcul `balance SOL × prix` n'est introduit.
|
||||
|
||||
## 9. DTO map retenue
|
||||
|
||||
@@ -299,7 +305,7 @@ Config effective secret values
|
||||
|
||||
Aucune command n'accepte URL, credential, header, rate-limit override ou payload provider.
|
||||
|
||||
Wallet Desk réutilise la même sémantique de commands (`list/refresh/refresh_all`), avec noms éventuellement préfixés pour éviter collision avec ses commandes existantes. L'input reste uniquement le `provider_id` opaque.
|
||||
Wallet Desk n'expose finalement **aucune nouvelle command prix**. La command existante `refresh_wallet_balance` orchestre côté Rust le `getBalance` et le `MarketPriceService::refresh_all`; le frontend ne transmet ni `provider_id`, ni URL, ni sélection provider. `WalletBalanceDto` gagne uniquement `sol_usd_average: Option<String>`.
|
||||
|
||||
## 11. Refresh UX
|
||||
|
||||
@@ -318,35 +324,46 @@ Décisions :
|
||||
|
||||
**Auto-refresh périodique : hors scope.** Aucun `setInterval`, scheduler ou worker prix n'est ajouté en `0.2.12`.
|
||||
|
||||
## 12. Intégration Wallet Desk
|
||||
## 12. Intégration Wallet Desk — périmètre simplifié
|
||||
|
||||
Wallet Desk ajoutera une dépendance directe à `ksp-offchain-transport-lib` parce qu'il consomme le contrat public générique retourné par Config. Cette direction est déjà admise par l'architecture; Off-chain Transport ne dépend jamais de Wallet ni de Config.
|
||||
Wallet Desk ajoute une dépendance directe à `ksp-offchain-transport-lib` uniquement pour consommer les contrats publics `MarketPriceService`, `MarketPriceRefreshOutcome` et `MarketPriceDecimal` construits par Config. Aucune logique provider concrète n'est dupliquée.
|
||||
|
||||
Flux :
|
||||
Flux retenu :
|
||||
|
||||
```text
|
||||
Config composite Wallet Desk
|
||||
-> component offchain_transport / cfg.std.offchain_transport / public_keyless
|
||||
-> ConfigDocumentEngine::resolve_offchain_transport_config_profile
|
||||
-> ResolvedOffchainTransportConfig
|
||||
-> MarketPriceService dans AppState/MarketPriceRuntime
|
||||
-> DTO provider-neutral
|
||||
-> panneau Dashboard
|
||||
-> MarketPriceService conservé côté Rust
|
||||
|
||||
refresh_wallet_balance
|
||||
-> getBalance On-chain
|
||||
-> en parallèle : MarketPriceService::refresh_all
|
||||
-> ne garder que les observations réussies du refresh courant
|
||||
-> moyenne arithmétique backend sans f64, arrondie à 8 décimales maximum
|
||||
-> WalletBalanceDto { ..., sol_usd_average: Option<String> }
|
||||
-> une seule case UI “SOL/USD moyen” ou “N.A.”
|
||||
```
|
||||
|
||||
La branche prix est **auxiliaire/best-effort** : un runtime Off-chain indisponible, zéro observation ou un échec structurel prix ne rend pas `getBalance` invalide. La balance SOL reste autoritative et la projection prix devient `None`.
|
||||
|
||||
Non-régressions obligatoires :
|
||||
|
||||
```text
|
||||
WalletSession inchangée
|
||||
VIEW/OWNER inchangés
|
||||
Wallet secrets inchangés
|
||||
getBalance On-chain inchangé
|
||||
aucune Pubkey requise pour obtenir un prix SOL/USD
|
||||
commande refresh_wallet_balance inchangée côté input
|
||||
aucun provider_id dans l'IPC Wallet
|
||||
aucune command prix Wallet supplémentaire
|
||||
aucun fetch TS
|
||||
aucune multiplication balance x prix
|
||||
aucun fallback sur une observation stale
|
||||
aucun provider canonique
|
||||
```
|
||||
|
||||
Aucun adapter, parser, limiter ou fetch TS n'est copié dans Wallet Desk.
|
||||
La moyenne n'est ni un consensus de marché, ni un nouveau contrat Off-chain partagé : c'est une présentation auxiliaire propre au Wallet Desk.
|
||||
|
||||
## 13. Mutualisation entre applications
|
||||
|
||||
@@ -354,7 +371,7 @@ La mutualisation métier existe déjà dans `ksp-offchain-transport-lib` et la m
|
||||
|
||||
`pre.001` ne retient **aucune nouvelle crate partagée**. Les deux apps peuvent posséder de petits adapters DTO/runtime propres parce qu'ils sont de la présentation/composition et que leurs `AppState`/runtime status diffèrent déjà.
|
||||
|
||||
Un helper partagé ne sera envisagé que si `pre.009`–`pre.011` démontrent une duplication non triviale, stable et réellement réutilisable. Il ne sera pas créé pour éviter quelques conversions enum -> label.
|
||||
Le périmètre Wallet simplifié ne justifie aucune nouvelle crate/helper partagé : SOL Prices Desk conserve les projections riches, Wallet Desk ne consomme que le service générique et calcule une moyenne auxiliaire locale.
|
||||
|
||||
## 14. Capabilities et plugins
|
||||
|
||||
@@ -411,7 +428,7 @@ Canari obligatoire : `ksp-app-solprices-desk` référence son propre `package.js
|
||||
| CWD/resource confusion cross-app | CWD KSP normalisé + resources registry + canari paths/ports/backend dédiés |
|
||||
| capabilities trop larges | core + tracing seulement pour Price Desk; aucun network/fs/dialog guest |
|
||||
| logs frontend sensibles | log seulement action, provider_id, compte, code KSP; jamais DTO brut/secret/body |
|
||||
| faux prix canonique | semantics visibles; aucune moyenne/fallback/first-provider |
|
||||
| faux prix canonique | Price Desk sans canonique/fallback; moyenne Wallet explicitement auxiliaire |
|
||||
| perte de précision JS | prix transmis comme chaîne décimale exacte |
|
||||
|
||||
## 17. Stratégie de tests et gates
|
||||
@@ -427,7 +444,7 @@ Canari obligatoire : `ksp-app-solprices-desk` référence son propre `package.js
|
||||
| TS-RS | bindings exportés par tests; prix exact en String |
|
||||
| workspace | fmt + audits + check + clippy + test |
|
||||
| SOL Prices Desk dev | parcours splash -> table -> row/many/all sur composition réelle |
|
||||
| Wallet Desk dev | panneau prix + non-régression Wallet/balance |
|
||||
| Wallet Desk dev | refresh balance + une case moyenne SOL/USD/N.A. + non-régression Wallet |
|
||||
| live composition | un smoke keyless applicatif opt-in suffit; ne réaudite pas les 8 wires |
|
||||
| production build | `cargo tauri build` crate-local pour SOL Prices Desk puis Wallet Desk |
|
||||
|
||||
@@ -440,7 +457,7 @@ nouveau provider ou modification des 8 adapters V1
|
||||
SOL/EUR ou token arbitraire
|
||||
OHLCV/historique/chart
|
||||
SSE/WebSocket prix
|
||||
consensus/moyenne/fallback automatique
|
||||
consensus/fallback automatique
|
||||
provider canonique
|
||||
valorisation USD du solde Wallet
|
||||
auto-refresh/polling périodique
|
||||
@@ -496,13 +513,13 @@ Correction strictement locale du test `config_composition` : le message d'assert
|
||||
|
||||
### `pre.004` — Runtime prix, registry rows et DTOs
|
||||
|
||||
**Statut : implémenté ; corrigé par `pre.004-fix.001` puis `pre.004-fix.002`, gate opérateur à confirmer.**
|
||||
**Statut : réalisé ; corrigé par `pre.004-fix.001` puis `pre.004-fix.002`, gate opérateur intégralement PASS.**
|
||||
|
||||
Création du `MarketPriceRuntime` applicatif, projection provider-neutral du registry, DTOs TS-RS et états initiaux/loading/empty. `list_market_prices` projette les lignes depuis le registry sans dispatch réseau ; l'état de présentation reste uniquement en mémoire backend. Les providers restent opaques à l'UI, le prix exact et les timestamps traversent l'IPC sous forme de chaînes exactes, et aucun refresh n'est encore disponible avant `pre.005`.
|
||||
|
||||
#### `pre.004-fix.001` — Synchronisation de la fixture composite Config Desk
|
||||
|
||||
**Statut : implémenté ; gate opérateur à confirmer.**
|
||||
**Statut : réalisé ; corrigé par `pre.004-fix.002`, gate opérateur final PASS.**
|
||||
|
||||
Correction du gate workspace révélé après `pre.004` : le registry Config contient désormais le composite SOL Prices Desk, donc le jeu de fixtures utilisé par `ksp-app-config-desk` doit contenir le document correspondant. Le fix ajoute la fixture dédiée avec des profils valides dans l'environnement de test et renforce le canari d'inventory pour vérifier explicitement `cfg.composite.ksp-app-solprices-desk`. Aucun runtime prix, provider, DTO ou frontend n'est modifié.
|
||||
|
||||
@@ -532,65 +549,35 @@ Ajout de `refresh_market_prices` et `refresh_all_market_prices` sur les APIs gé
|
||||
|
||||
### `pre.007` — UX et instrumentation SOL Prices Desk
|
||||
|
||||
**Statut : implémenté ; gate opérateur à confirmer.**
|
||||
**Statut : réalisé ; gate opérateur Cargo/workspace/Tauri et parcours visuel intégralement PASS.**
|
||||
|
||||
Finalisation de la table responsive sans changer le contrat de dispatch : résumé providers/ready/observed/attention/refreshing, header sticky, colonnes secondaires adaptatives, badges génériques d'auth/semantics/availability, prix exact conservé en String et timestamps présentés à la fois sous forme humaine et en millisecondes exactes. `provider_timestamp = None` est rendu explicitement comme `Not supplied`, sans substitution par `received_at`. La sélection gagne un contrôle global et `Clear selection`, uniquement frontend. Chaque nouveau contrôle est journalisé en `debug`; les rendus et comptes sûrs restent en `trace`. Les wrappers Tauri journalisent les échecs avec seulement `command`, `error_domain` et `error_code`. Aucun prix, timestamp, payload provider, URL, header ou credential n'entre dans les logs. La tranche reste manuelle : aucune nouvelle commande métier, aucun auto-refresh, scheduler ou persistance navigateur n'est ajouté.
|
||||
|
||||
### `pre.008` — Hardening SOL Prices Desk
|
||||
### `pre.008` — Intégration Wallet minimale + recalibrage de clôture
|
||||
|
||||
**Statut : implémenté ; gate opérateur à confirmer.**
|
||||
|
||||
Absorption de l'ancien couloir Wallet `pre.009`–`pre.011` dans une seule tranche : ajout `offchain_transport/public_keyless` au composite Wallet, runtime Off-chain auxiliaire, `refresh_all` lors de `refresh_wallet_balance`, moyenne SOL/USD backend sans `f64`, `WalletBalanceDto.sol_usd_average` et une seule case UI `SOL/USD moyen`/`N.A.`. Aucun panneau provider, aucune command prix Wallet, aucun provider ID frontend et aucune valorisation USD du solde. La tranche réconcilie également le présent forecast avec cette réduction de scope.
|
||||
|
||||
### `pre.009` — Hardening transversal + gate technique/live final
|
||||
|
||||
**Statut : planifié.**
|
||||
|
||||
Durcissement des boundaries desktop/security/package, canaris de capabilities minimales, parcours fonctionnel complet et non-régression du bootstrap avant d'étendre Wallet Desk. Le Desk doit être stable isolément à la sortie de cette tranche.
|
||||
Fusion des anciens hardenings `pre.008`/`pre.012` et du gate `pre.013` : canaris batch hostile/capabilities/resources, non-régression des deux Desks, workspace complet, smoke live keyless de composition, et `cargo tauri build` final des deux applications modifiées. Aucun nouveau comportement métier n'est ouvert.
|
||||
|
||||
### `pre.009` — Extension composite/runtime Wallet Desk
|
||||
### `pre.010` — Réconciliation documentaire + préparation de publication
|
||||
|
||||
**Statut : planifié.**
|
||||
|
||||
Extension additive du composite Wallet Desk avec Off-chain Transport et intégration du runtime prix backend, sans modifier les contrats Wallet existants, le lifecycle VIEW/OWNER ni le chemin `getBalance`.
|
||||
|
||||
### `pre.010` — DTOs et commands prix Wallet Desk
|
||||
|
||||
**Statut : planifié.**
|
||||
|
||||
Ajout de la surface IPC provider-neutral nécessaire au Wallet Desk pour l'inventaire et le refresh prix. Aucun secret, URL provider, wire provider-specific ou valorisation USD du solde ne traverse cette surface.
|
||||
|
||||
### `pre.011` — Panneau prix Wallet Desk
|
||||
|
||||
**Statut : planifié.**
|
||||
|
||||
Ajout du panneau Dashboard prix avec refresh manuel et projection des observations/availability, puis vérification des non-régressions balance et autorisations VIEW/OWNER. Le solde SOL et les prix restent deux informations distinctes ; aucune valorisation USD canonique n'est calculée.
|
||||
|
||||
### `pre.012` — Hardening cross-app et complétude
|
||||
|
||||
**Statut : planifié.**
|
||||
|
||||
Revue croisée des deux Desks, capabilities/resources, contracts IPC, dépendances, sécurité et canaris de complétude. Cette tranche ferme le comportement applicatif avant le gate technique/live final.
|
||||
|
||||
### `pre.013` — Gate technique/live final
|
||||
|
||||
**Statut : planifié.**
|
||||
|
||||
Gate workspace complet, tests applicatifs pertinents, smoke live keyless de composition application -> Config -> `MarketPriceService`, graphes de dépendances utiles et builds Tauri finaux des applications modifiées. Cette tranche ne réconcilie pas README/USAGE ni les documents finaux.
|
||||
|
||||
### `pre.014` — Réconciliation documentaire finale
|
||||
|
||||
**Statut : planifié.**
|
||||
|
||||
Réconciliation du plan, de la validation, des README/USAGE et autres documents durables concernés avec le runtime réellement livré après le gate technique. Cette tranche ne finalise ni `CHANGELOG.md`, ni `ROADMAP.md`, ni le prompt suivant.
|
||||
|
||||
### `pre.015` — Préparation minimale de publication
|
||||
|
||||
**Statut : planifié.**
|
||||
|
||||
Préparation du prompt de la release suivante, de `CHANGELOG.md` et de `ROADMAP.md`, avec la mécanique Cargo/delta imposée par le workflow. Aucun code, test, plan, validation, README ou USAGE n'est rouvert dans cette dernière prerelease.
|
||||
Fusion des anciennes tranches `pre.014`/`pre.015` : réconciliation README/USAGE/plan/validation avec le runtime réellement validé, puis prompt suivant, `CHANGELOG.md` et `ROADMAP.md`. Cette tranche reste documentaire/mécanique et ne rouvre aucun code fonctionnel.
|
||||
|
||||
### `rel.001` — Publication stable `v0.2.12`
|
||||
|
||||
**Statut : planifié.**
|
||||
|
||||
Mécanique de publication stable uniquement, après validation de la dernière prerelease et vérification de la cohérence de release. Aucun défaut fonctionnel ou documentaire ne doit être absorbé par `rel.001`.
|
||||
Mécanique de publication stable uniquement, après validation de `pre.010` et vérification de la cohérence de release. Aucun défaut fonctionnel ou documentaire ne doit être absorbé par `rel.001`.
|
||||
|
||||
Le packaging transversal et les refresh manuels du Price Desk sont désormais fermés par les gates opérateur jusqu’à `pre.006`. Après le polish `pre.007`, le prochain risque fonctionnel est borné au hardening `pre.008` avant l’ouverture du couloir Wallet Desk `pre.009+`, sans remettre en cause le découpage souple ni les responsabilités documentaires de clôture.
|
||||
Le Price Desk est fermé fonctionnellement après `pre.007`. La décision opérateur de simplifier Wallet Desk réduit le reste de la release à une seule tranche fonctionnelle `pre.008`, un gate/hardening transversal `pre.009`, une clôture documentaire/mécanique `pre.010`, puis `rel.001`.
|
||||
|
||||
## 20. Critères de sortie `pre.001`
|
||||
|
||||
|
||||
Reference in New Issue
Block a user