v0.2.12-pre.010

This commit is contained in:
2026-08-27 19:11:07 +02:00
parent ca6af3d904
commit 4f71dbc62d
14 changed files with 457 additions and 50 deletions

View File

@@ -1,12 +1,12 @@
# file: Cargo.toml
# version: 299
# version: 300
[workspace]
resolver = "3"
members = ["crates/ksp-app-config-desk", "crates/ksp-app-solprices-desk", "crates/ksp-app-wallet-desk", "crates/ksp-config-lib", "crates/ksp-core-lib", "crates/ksp-logging-lib", "crates/ksp-offchain-transport-lib", "crates/ksp-onchain-transport-lib", "crates/ksp-wallet-lib"]
[workspace.package]
version = "0.2.12-pre.9.fix.1"
version = "0.2.12-pre.10"
edition = "2024"
license = "MIT"
repository = "https://git.sasedev.com/Sasedev/khadhroony-solana-project"

View File

@@ -1,11 +1,11 @@
<!-- file: crates/ksp-app-solprices-desk/README.md -->
<!-- version: 1 -->
<!-- version: 2 -->
# `ksp-app-solprices-desk`
`ksp-app-solprices-desk` est le Desk Tauri spécialisé destiné à visualiser les prix SOL/USD fournis par `ksp-offchain-transport-lib` sans exposer les détails propres aux providers au frontend.
`ksp-app-solprices-desk` est l'application desktop spécialisée de visualisation et de refresh manuel des prix SOL/USD fournis par `ksp-offchain-transport-lib`.
`0.2.12-pre.002` crée uniquement le **scaffold desktop**. La composition Off-chain, les DTO prix, la table provider-neutral et les commandes de refresh appartiennent aux tranches suivantes.
L'application reste une **HID provider-neutral** : elle consomme le registry, les observations, les disponibilités et les opérations génériques du service Off-chain sans connaître les endpoints, credentials, limites ou wire formats propres aux providers.
## Package
@@ -15,30 +15,93 @@ lib : ksp_app_solprices_desk_lib
bin : ksp-app-solprices-desk
```
Le binaire reste un launcher mince. La bibliothèque applicative possède l'assemblage Tauri, l'état de bootstrap, le bridge Logging et le lifecycle des fenêtres.
Le binaire reste un launcher mince. La bibliothèque applicative possède l'assemblage Tauri, le bootstrap Config/Logging/Off-chain, l'état de présentation en mémoire et les commands Tauri.
## Surface du scaffold
## Responsabilités
```text
splash
-> Config standard + Logging
-> main
-> Prices placeholder non fonctionnel en pre.002
-> Diagnostics identité/runtime Logging sûre
ksp-config-lib -> composite, profils, secrets et runtime packagé
ksp-offchain-transport-lib -> providers, HTTP, registry, availability, limits et refresh
ksp-logging-lib -> logging/tracing applicatif
ksp-app-solprices-desk -> orchestration Tauri + projections provider-neutral sûres
```
Le scaffold ne possède encore aucun `MarketPriceService`, aucun fetch prix, aucun provider, aucun endpoint, aucun credential et aucun scheduler.
Le Desk ne possède aucun client HTTP provider et ne réimplémente ni admission, ni cooldown, ni retry provider.
## Vues
### Prices
La vue `Prices` affiche l'inventaire SOL/USD dans l'ordre stable du registry et conserve chaque observation séparée.
La projection comprend notamment :
- identité/display provider et paire ;
- sémantique et mode d'authentification ;
- availability générique ;
- prix exact sous forme de `String` ;
- timestamp provider lorsqu'il existe ;
- timestamp de réception KSP ;
- `retry_at` lorsqu'il existe ;
- état `Refreshing` local à la présentation.
Aucune moyenne, aucun fallback automatique et aucun prix canonique ne sont produits par cette application.
Les actions manuelles sont :
```text
Refresh
Refresh selected
Refresh all
Select all providers
Clear selection
```
Le batch applicatif est borné à `1..=64` IDs opaques avant parsing/dispatch. Les doublons, IDs inconnus et conflits `in_flight` sont rejetés avant mutation partielle.
### Diagnostics
La vue `Diagnostics` expose uniquement des informations de runtime sûres : identité/version applicative, profils résolus et compte de providers. Aucun endpoint, header, API key, payload provider ou prix n'est journalisé comme diagnostic brut.
## Config et profils
Le composite dédié est :
```text
cfg.composite.ksp-app-solprices-desk
```
Il compose :
```text
logging
Off-chain Transport
```
Profils committed :
```text
public_keyless profil par défaut
all_free modes gratuits incluant les credentials Config requis
tests profil déterministe de composition
```
Le frontend ne sélectionne ni provider concret ni secret. La résolution des credentials reste entièrement possédée par Config.
## Frontières desktop
Le frontend utilise uniquement les capabilities :
Le frontend utilise uniquement :
```text
core:default
tracing:default
```
Aucun plugin dialog, filesystem, HTTP ou shell n'est accordé au WebView. Le bridge frontend Logging passe par des commandes Rust centralisées dans `tauri.rs`.
Il ne possède aucun accès direct filesystem, HTTP, shell ou persistence navigateur. Les refresh passent uniquement par les commands Rust centralisées dans `tauri.rs`.
Il n'existe aucun polling, auto-refresh ou scheduler prix dans le Desk. Les deadlines/cooldowns affichés proviennent de `ksp-offchain-transport-lib`.
## Ports et build
Les ports réservés sont :
@@ -47,32 +110,45 @@ Vite HTTP : 1434
Vite WS : 1435
```
Le port Vite est strict et le frontend build est isolé sous :
Le frontend build est isolé sous :
```text
builds/khadhroony-solana-project/ksp-app-solprices-desk/dist
```
## Config et packaging
La version du binaire et des bundles Tauri provient de la version Cargo résolue. `tauri.conf.json` ne duplique pas cette version ; `package.json` reste un manifeste frontend privé non autoritatif pour la release KSP.
Pendant `pre.002`, le Desk utilise le document Logging standard pour établir le gabarit commun. Le composite dédié `cfg.composite.ksp-app-solprices-desk` n'existe pas encore et reste réservé à `pre.003`.
## Runtime packagé
Le bundle embarque les dix ressources correspondant au registry Config courant. `pre.003` ajoutera atomiquement le onzième document composite et synchronisera les resources des Desks concernés.
Les onze resources Config/Schemas enregistrées sont embarquées dans le bundle. Au démarrage release, `ksp-config-lib` prépare la racine KSP user-writable commune, seed les documents absents, resynchronise les schemas et ne bundle jamais `.env`.
## Développement
Le cycle Tauri est crate-local :
## Développement et validation
```bash
(cd crates/ksp-app-solprices-desk && cargo tauri dev)
```
`-c/--config` n'est pas utilisé comme sélecteur d'application. En développement, le launcher normalise le current working directory vers la racine du workspace avant le bootstrap Config.
Gate Rust courant :
Le build production final sera exécuté dans le couloir de validation de la release :
```bash
cargo fmt --all
python3 scripts/audit_rust_workspace_rules.py
cargo check --workspace
cargo clippy --workspace --all-targets
cargo test -p ksp-app-solprices-desk
cargo test --workspace
```
Smoke live de composition opt-in :
```bash
cargo test -p ksp-app-solprices-desk --test market_price_composition_live_smoke -- --ignored --nocapture
```
Build production :
```bash
(cd crates/ksp-app-solprices-desk && cargo tauri build)
```
`USAGE.md` sera finalisé lorsque l'application sera fonctionnellement complète, conformément au workflow de clôture des applications KSP.
Voir également [`USAGE.md`](USAGE.md), [`../ksp-offchain-transport-lib/README.md`](../ksp-offchain-transport-lib/README.md) et [`../../docs/validation/015-V0_2_12_SOL_PRICES_DESK.md`](../../docs/validation/015-V0_2_12_SOL_PRICES_DESK.md).

View File

@@ -0,0 +1,149 @@
<!-- file: crates/ksp-app-solprices-desk/USAGE.md -->
<!-- version: 1 -->
# Utilisation de `ksp-app-solprices-desk`
## 1. Lancement de développement
Depuis la racine du workspace :
```bash
(cd crates/ksp-app-solprices-desk && cargo tauri dev)
```
Le launcher debug normalise son current working directory vers la racine du workspace avant le bootstrap Config.
Les ports réservés sont :
```text
Vite HTTP : 1434
Vite WS : 1435
```
## 2. Profil de prix
Le composite `cfg.composite.ksp-app-solprices-desk` utilise `public_keyless` par défaut.
Profils committed :
```text
public_keyless providers utilisables sans secret
all_free modes gratuits avec credentials Config lorsqu'ils sont requis
tests composition de test
```
La sélection d'un autre profil appartient aux mécanismes Config ; l'interface ne demande jamais directement une API key et ne choisit pas d'endpoint provider.
## 3. Vue Prices
La vue `Prices` présente une row par provider du registry Off-chain.
Les informations principales sont :
- paire SOL/USD ;
- sémantique de prix ;
- mode d'authentification ;
- availability ;
- prix exact lorsqu'une observation existe ;
- timestamp provider lorsqu'il est réellement fourni ;
- timestamp de réception KSP ;
- prochaine deadline `retry_at` lorsqu'elle existe.
`Not supplied` signifie qu'un provider n'a pas fourni de timestamp exploitable. Cette absence n'est jamais remplacée artificiellement par le timestamp KSP.
## 4. Refresh individuel
Le bouton `Refresh` d'une row déclenche uniquement le provider correspondant via `MarketPriceService::refresh`.
Pendant l'appel, la row passe temporairement à `Refreshing`. Le Desk ne garde aucun mutex de présentation pendant l'I/O réseau.
Si le service ne produit pas de nouvelle observation, la dernière observation réussie peut rester visible tandis que l'availability/retry est actualisée.
## 5. Refresh sélectionné
Cocher une ou plusieurs rows puis utiliser :
```text
Refresh selected
```
La sélection est reconstruite dans l'ordre courant du registry. Les doublons, IDs inconnus, conflits `in_flight`, batch vide et batch supérieur à 64 IDs sont rejetés côté Rust avant dispatch partiel.
Les contrôles :
```text
Select all providers
Clear selection
```
ne déclenchent aucun accès réseau par eux-mêmes.
## 6. Refresh global
```text
Refresh all
```
appelle la surface générique `MarketPriceService::refresh_all` et conserve l'ordre déterministe du service.
Les providers disabled, en cooldown ou temporairement indisponibles restent classifiés par Off-chain Transport. Le frontend ne contourne jamais ces règles et n'implémente aucun retry local.
## 7. Lecture des états
Les états visibles sont provider-neutral, notamment :
```text
Ready
Cooling down
Authentication unavailable
Disabled
Misconfigured
Quota unavailable
Temporarily unavailable
Refreshing
```
Le résumé en haut de la vue indique les nombres de providers, rows ready, observations disponibles, états nécessitant attention et refresh en cours.
Aucune moyenne ou fusion de prix n'est calculée dans SOL Prices Desk.
## 8. Diagnostics et sécurité
La vue `Diagnostics` expose uniquement les informations sûres de composition/runtime.
Le frontend :
- ne fait aucun `fetch`/XHR provider ;
- ne possède aucun endpoint ou header provider ;
- ne stocke aucun secret dans `localStorage`/`sessionStorage` ;
- n'utilise aucun scheduler ou polling prix ;
- ne journalise aucun prix ou payload provider brut.
Les actions utilisateur sont instrumentées via le bridge Logging KSP.
## 9. Runtime packagé
En build release, les documents Config et schemas enregistrés sont embarqués comme resources Tauri. `ksp-config-lib` prépare ensuite la racine KSP user-writable commune ; les Config utilisateur existantes sont conservées, les schemas sont resynchronisés et `.env` n'est jamais embarqué.
La version de bundle est dérivée de Cargo. `package.json` reste un manifeste frontend privé.
## 10. Validation de publication
Avant le build :
```bash
cargo fmt --all
python3 scripts/audit_rust_workspace_rules.py
python3 scripts/audit_markdown_tables.py README.md RULES.md ROADMAP.md CHANGELOG.md docs prompts crates deltas/0.2.12
cargo check --workspace
cargo clippy --workspace --all-targets
cargo test -p ksp-app-solprices-desk
cargo test --workspace
cargo test -p ksp-app-solprices-desk --test market_price_composition_live_smoke -- --ignored --nocapture
```
Le build production est :
```bash
(cd crates/ksp-app-solprices-desk && cargo tauri build)
```

View File

@@ -1,5 +1,5 @@
<!-- file: crates/ksp-app-wallet-desk/README.md -->
<!-- version: 3 -->
<!-- version: 4 -->
# `ksp-app-wallet-desk`
@@ -21,6 +21,7 @@ Wallet Desk reste une couche d'interface et de composition. Il ne possède ni le
ksp-config-lib -> configuration/composite/.env
ksp-wallet-lib -> format, crypto, VIEW/OWNER, import/export, migration
ksp-onchain-transport-lib -> RPC Solana HTTP
ksp-offchain-transport-lib -> prix SOL/USD provider-neutral
ksp-logging-lib -> logging/tracing applicatif
ksp-app-wallet-desk -> orchestration Tauri + projections sûres
```
@@ -64,6 +65,19 @@ La surface validée comprend :
- export OWNER Solana CLI JSON/Base58 no-clobber ;
- wire V2 par défaut tout en conservant la compatibilité V1.
## Prix SOL/USD auxiliaire
Le refresh de balance compose deux capacités backend : `getBalance` et `MarketPriceService::refresh_all`. Les observations réussies du refresh courant sont moyennées côté Rust sans `f64`; la balance SOL reste autoritative et le prix reste auxiliaire.
Le frontend reçoit uniquement :
```text
SOL/USD moyen
Équivalent USD de la balance
```
ou `N.A.` lorsque le prix n'est pas disponible. Cette moyenne est une projection locale à Wallet Desk : elle ne devient ni un consensus, ni un fallback, ni un prix canonique de `ksp-offchain-transport-lib`. Aucun provider ID ou détail provider n'est exposé au frontend Wallet.
## Frontières desktop
Le frontend utilise Bootstrap, Font Awesome, DataTables/Select, SimpleBar et le bridge Logging KSP. Les capabilities Tauri du guest restent minimales :

View File

@@ -1,5 +1,5 @@
<!-- file: crates/ksp-app-wallet-desk/USAGE.md -->
<!-- version: 2 -->
<!-- version: 3 -->
# Utilisation de `ksp-app-wallet-desk`
@@ -82,9 +82,21 @@ migrate_wallet_file_v1_to_v2_in_place
Elles authentifient OWNER, reconstruisent un document cryptographique V2 neuf et conservent l'identité Solana ainsi que les metadata/note IDs. Lorsque VIEW est activé, un password VIEW cible doit être fourni. La copie est no-clobber ; le remplacement in-place est stale-protected.
## 7. Balance Solana
## 7. Balance Solana et prix auxiliaire
Une session VIEW ou OWNER autorisée peut demander `getBalance` via `ksp-onchain-transport-lib`. Le frontend ne choisit ni Pubkey arbitraire ni URL RPC : ces valeurs sont dérivées de l'état Rust autorisé et de Config.
Une session VIEW ou OWNER autorisée peut rafraîchir sa balance. Le backend compose alors `getBalance` via `ksp-onchain-transport-lib` et un `refresh_all` SOL/USD via `ksp-offchain-transport-lib`. Le frontend ne choisit ni Pubkey arbitraire, ni URL RPC, ni provider prix : ces valeurs sont dérivées de l'état Rust autorisé et de Config.
Lorsque des observations SOL/USD sont produites par le refresh courant, Wallet Desk calcule côté Rust une moyenne arithmétique exacte puis l'équivalent USD de la balance. Aucun `f64` n'est utilisé comme vérité métier.
L'interface affiche :
```text
Balance SOL
SOL/USD moyen
Équivalent USD
```
Si aucune observation prix exploitable n'est disponible, les deux champs USD affichent `N.A.` sans transformer un `getBalance` réussi en erreur Wallet. La moyenne est strictement une projection de consommation Wallet ; elle ne modifie pas le contrat provider-neutral de `ksp-offchain-transport-lib`.
## 8. Runtime packagé

92
deltas/0.2.12/pre.010.md Normal file
View File

@@ -0,0 +1,92 @@
<!-- file: deltas/0.2.12/pre.010.md -->
<!-- version: 1 -->
# Delta `0.2.12-pre.010` — réconciliation documentaire finale
## Base requise
```text
0.2.12-pre.009-fix.001
workspace.package.version = 0.2.12-pre.9.fix.1
```
Le gate opérateur de cette base est intégralement vert : audits, `cargo check`, Clippy, tests ciblés, workspace complet, smoke live de composition SOL Prices et builds Tauri Linux SOL Prices/Wallet/Config Desk.
## Objectif
Figé documentaire final de `0.2.12` avant la prerelease de préparation de publication. Cette tranche applique explicitement la séparation `VER-LIFECYCLE-006` : elle réconcilie README/USAGE, architecture, plan et validation, sans modifier `CHANGELOG.md`, `ROADMAP.md` ni créer/finaliser le prompt `0.2.13`.
## Version Cargo
Publication non-fix de prerelease :
```text
0.2.12-pre.9.fix.1
-> 0.2.12-pre.10
```
Conformément à `VER-ID-015/016`, aucun `tauri.conf.json` ou `package.json` n'est synchronisé artificiellement.
## Fichiers ajoutés
```text
crates/ksp-app-solprices-desk/USAGE.md
deltas/0.2.12/pre.010.md
```
## Fichiers modifiés
```text
Cargo.toml
crates/ksp-app-solprices-desk/README.md
crates/ksp-app-wallet-desk/README.md
crates/ksp-app-wallet-desk/USAGE.md
docs/000-README.md
docs/architecture/003-COMPONENT_CONTRACTS.md
docs/architecture/004-COMPONENT_INVENTORY.md
docs/architecture/005-DEPENDENCY_GRAPH.md
docs/architecture/010-APPS_SERVICES_SCENARIOS_AND_CONTROL.md
docs/plans/002-FUNCTIONAL_RELEASE_SEQUENCE.md
docs/plans/019-V0_2_12_SOL_PRICES_DESK_PLAN.md
docs/validation/015-V0_2_12_SOL_PRICES_DESK.md
```
## Fichiers supprimés
Aucun.
## Décisions réconciliées
- SOL Prices Desk est une HID provider-neutral avec refresh manuel row/selected/all, batch borné `1..=64`, aucune moyenne/fallback/auto-refresh.
- Wallet Desk consomme `MarketPriceService::refresh_all` pendant le refresh balance et calcule côté Rust une moyenne SOL/USD consumer-owned ainsi que l'équivalent USD exact ; indisponibilité prix -> `N.A.` sans échec de balance.
- La moyenne Wallet ne devient jamais un contrat Off-chain Transport ni un prix canonique.
- La version desktop reste Cargo-owned ; les manifests npm privés ne pilotent pas la version KSP.
- La fermeture ne fusionne finalement pas documentation et publication : `pre.010` est documentaire, `pre.011` sera la préparation minimale.
## Validations exécutées dans l'environnement de génération
```text
python3 scripts/audit_rust_workspace_rules.py PASS
python3 scripts/audit_markdown_tables.py README.md ... deltas PASS — 143 tables / 127 fichiers
```
Les contrôles portent sur l'arbre complet reconstruit jusqu'à `pre.009-fix.001`, puis réconcilié par `pre.010`.
## Validations opérateur héritées de la base
```text
fmt/audits/check/clippy PASS
tests SOL Prices + workspace PASS
smoke live composition SOL Prices PASS
Tauri build SOL Prices PASS
Tauri build Wallet PASS
Tauri build Config PASS supplémentaire
```
## Validations non exécutées
Les commandes Cargo ne sont pas revendiquées dans l'environnement de génération. `pre.010` ne requiert aucun nouveau smoke live ni build Tauri, le couloir technique étant déjà fermé.
## Question ouverte
Aucune pour le périmètre `0.2.12`. La tranche suivante est exclusivement `pre.011` : prompt `0.2.13 — Interface foundation`, `CHANGELOG.md`, `ROADMAP.md`, `Cargo.toml` et delta mécanique.

File diff suppressed because one or more lines are too long

View File

@@ -1,5 +1,5 @@
<!-- file: docs/architecture/003-COMPONENT_CONTRACTS.md -->
<!-- version: 8 -->
<!-- version: 9 -->
# Contrats initiaux des composants KSP
@@ -78,7 +78,9 @@ Pour cette surface, Off-chain Transport possède le registry runtime des provide
Les adapters provider V1 utilisent uniquement `reqwest` et les primitives génériques du workspace ; aucun SDK provider n'est introduit. Config peut adapter ses documents vers les settings publics provider-capability-aware, mais Off-chain Transport ne lit jamais directement l'environnement ou les fichiers Config.
La future `ksp-app-solprices-desk` est une HID provider-agnostic : elle liste et déclenche uniquement les surfaces génériques de la crate. Toute connaissance de CoinGecko, CoinMarketCap, CoinPaprika, Kraken, Coinbase, Jupiter, Birdeye ou DexScreener reste sous Off-chain Transport/Config.
`ksp-app-solprices-desk` est la HID provider-agnostic dédiée : elle liste et déclenche uniquement les surfaces génériques de la crate. Toute connaissance de CoinGecko, CoinMarketCap, CoinPaprika, Kraken, Coinbase, Jupiter, Birdeye ou DexScreener reste sous Off-chain Transport/Config.
Wallet Desk peut consommer la même surface générique comme capacité auxiliaire. Sa moyenne SOL/USD et l'équivalent USD de balance sont des projections locales au consumer calculées à partir des observations du refresh courant ; ils ne deviennent ni un consensus, ni un fallback, ni un prix canonique possédé par Off-chain Transport.
## Wallet

View File

@@ -1,5 +1,5 @@
<!-- file: docs/architecture/004-COMPONENT_INVENTORY.md -->
<!-- version: 22 -->
<!-- version: 23 -->
# Inventaire initial des composants KSP
@@ -25,13 +25,13 @@ Ce document maintient l'inventaire synthétique des composants retenus ou presse
| Config Desk | `ksp-app-config-desk` | app | Stable | `0.1.4` | validation/management Config |
| On-chain HTTP | `ksp-onchain-transport-lib` | lib | Stable | `0.2.1``0.2.4` | HTTP standard complet : 52/52 current + 14/14 historical |
| Wallet | `ksp-wallet-lib` | lib | Stable | `0.2.5` | `.kspwallet`, VIEW/OWNER, secrets, signature, import/export |
| Wallet Desk | `ksp-app-wallet-desk` | app | Stable | `0.2.6` | Wallet + Config composite + HTTP/balance |
| Wallet Desk | `ksp-app-wallet-desk` | app | Stable | `0.2.6` | Wallet + Config + balance HTTP + projection SOL/USD auxiliaire |
| Wallet V2 | `ksp-wallet-lib` | lib | Stable | `0.2.6` | wire/runtime V2 + API default/versionnée + migration explicite |
| Standard WS | `ksp-onchain-transport-lib` | lib | Stable | `0.2.7` | WebSocket Solana 18/18, sessions/subscriptions bornées |
| Helius WS | `ksp-onchain-transport-lib` | lib | Stable | `0.2.8` | LaserStream WS : 7 standard + transaction, actor partagé |
| Yellowstone | `ksp-onchain-transport-lib` | lib | Stable | `0.2.9` | client gRPC standard/provider-neutral |
| Off-chain price | `ksp-offchain-transport-lib` | lib | Actif | `0.2.11` | prix SOL/USD multi-provider, limits et availability |
| SOL Prices Desk | `ksp-app-solprices-desk` | app | Retenu | `0.2.12` | HID provider-agnostic pour visualisation/refresh prix |
| Off-chain price | `ksp-offchain-transport-lib` | lib | Stable | `0.2.11` | prix SOL/USD multi-provider, limits et availability |
| SOL Prices Desk | `ksp-app-solprices-desk` | app | Stable | `0.2.12` | HID provider-agnostic pour visualisation/refresh prix |
| Wire | `ksp-interface-lib` | lib | Retenu | `0.2.13` | façade wire officielle + API publique wire |
| Program API | `ksp-program-api` | API | Retenu | `0.2.14` | contrats extensibles Program |
| Program impl. | `ksp-program-lib` | lib | Retenu | vertical slices ultérieurs | implementations Program officielles |

View File

@@ -1,5 +1,5 @@
<!-- file: docs/architecture/005-DEPENDENCY_GRAPH.md -->
<!-- version: 14 -->
<!-- version: 15 -->
# Graphe de dépendances KSP
@@ -395,10 +395,11 @@ ksp-app-wallet-desk
-> ksp-config-lib
-> ksp-wallet-lib
-> ksp-onchain-transport-lib
-> ksp-offchain-transport-lib
-> ksp-logging-lib
```
L'app compose ; elle ne déplace pas Config/Wallet/Transport dans Tauri. Les handles `WalletView`/`WalletOwner` restent côté Rust, et le frontend ne reçoit que des DTOs sûrs. Config fournit la racine/profil Wallet et le profil Transport. Les passwords Wallet ne deviennent jamais des champs des documents JSON Config ; ils peuvent être saisis éphémèrement frontend -> Rust ou provenir plus tard de secrets process/`.env` `KSP_SECRET_WALLET_PASS_*` possédés exclusivement par Config. Le secret Solana ne devient jamais une valeur Config ni un DTO frontend.
L'app compose ; elle ne déplace pas Config/Wallet/Transport dans Tauri. Les handles `WalletView`/`WalletOwner` restent côté Rust, et le frontend ne reçoit que des DTOs sûrs. Config fournit la racine/profil Wallet, le profil Transport et le profil Off-chain Transport. Le refresh de balance peut composer une moyenne SOL/USD et un équivalent USD auxiliaires à partir des observations génériques du refresh courant sans introduire de provider concret dans Wallet Desk. Les passwords Wallet ne deviennent jamais des champs des documents JSON Config ; ils peuvent être saisis éphémèrement frontend -> Rust ou provenir plus tard de secrets process/`.env` `KSP_SECRET_WALLET_PASS_*` possédés exclusivement par Config. Le secret Solana ne devient jamais une valeur Config ni un DTO frontend.
### SOL Prices Desk

View File

@@ -1,5 +1,5 @@
<!-- file: docs/architecture/010-APPS_SERVICES_SCENARIOS_AND_CONTROL.md -->
<!-- version: 5 -->
<!-- version: 6 -->
# Applications, services, scenarios et control plane
@@ -76,6 +76,7 @@ Exemples de familles spécialisées :
```text
ksp-app-config-desk
ksp-app-wallet-desk
ksp-app-solprices-desk
ksp-app-store-desk
ksp-app-worker-<role>-desk
ksp-app-scenario-<domain>-<environment>-desk-demo
@@ -96,7 +97,14 @@ ksp-app-config-desk
-> ksp-config-lib
ksp-app-wallet-desk
-> ksp-config-lib
-> ksp-wallet-lib
-> ksp-onchain-transport-lib
-> ksp-offchain-transport-lib
ksp-app-solprices-desk
-> ksp-config-lib
-> ksp-offchain-transport-lib
ksp-app-store-desk
-> ksp-store-api

View File

@@ -1,5 +1,5 @@
<!-- file: docs/plans/002-FUNCTIONAL_RELEASE_SEQUENCE.md -->
<!-- version: 92 -->
<!-- version: 93 -->
# Séquence des releases fonctionnelles KSP
@@ -512,7 +512,9 @@ Ces providers ne déplacent pas la séquence active et ne reçoivent ni façade,
`0.2.11` introduit `ksp-offchain-transport-lib` avec une première surface volontairement limitée à SOL/USD. La release retient huit adapters REST (`CoinGecko`, `CoinMarketCap`, `CoinPaprika`, `Kraken`, `Coinbase Exchange`, `Jupiter Price V3`, `Birdeye`, `DexScreener`) utilisant `reqwest` et des DTOs KSP privés, sans SDK provider. Off-chain Transport possède le registry, les capacités/rate limits, les indisponibilités et les refresh individuels/multiples séquentiels ; Config construit le service depuis `std.offchain_transport`. Le gate live final keyless passe `7/7` après correction du paramètre CoinMarketCap Simple Price V2. Aucun consensus, fallback automatique ou découverte de pool DexScreener n'est introduit.
`0.2.12` ajoute `ksp-app-solprices-desk`, HID pure qui ne connaît aucun provider et consomme uniquement les descriptors, observations, états et opérations génériques de `ksp-offchain-transport-lib`. Sa première vue liste les providers/prix et permet refresh individuel/multiple en laissant entièrement les limitations au service. Après stabilisation de cette application spécialisée, la même release doit intégrer la capacité de prix offchain dans `ksp-app-wallet-desk` sans dupliquer la récupération/normalisation appartenant au composant spécialisé. Le gate actif est [`019-V0_2_12_SOL_PRICES_DESK_PLAN.md`](019-V0_2_12_SOL_PRICES_DESK_PLAN.md) avec [`../validation/015-V0_2_12_SOL_PRICES_DESK.md`](../validation/015-V0_2_12_SOL_PRICES_DESK.md) : composite Price Desk dédié, ports 1434/1435, état de présentation backend en mémoire, auto-refresh et valorisation USD du solde hors scope.
`0.2.12` ajoute `ksp-app-solprices-desk`, HID pure qui ne connaît aucun provider et consomme uniquement les descriptors, observations, états et opérations génériques de `ksp-offchain-transport-lib`. La vue Prices expose les états et timestamps distincts, le prix exact, le refresh individuel, sélectionné et global, avec garde batch `1..=64` et sans polling/auto-refresh. Le composite dédié utilise les ports 1434/1435 et un état de présentation backend en mémoire.
La même release étend `ksp-app-wallet-desk` de façon minimale : le refresh de balance déclenche aussi le refresh SOL/USD générique, calcule côté Rust une moyenne à partir des observations produites par ce refresh puis affiche cette moyenne et l'équivalent USD exact de la balance, ou `N.A.`. Cette moyenne est strictement consumer-owned et ne crée aucun consensus/fallback/prix canonique dans Off-chain Transport. Le gate final est conservé dans [`019-V0_2_12_SOL_PRICES_DESK_PLAN.md`](019-V0_2_12_SOL_PRICES_DESK_PLAN.md) avec [`../validation/015-V0_2_12_SOL_PRICES_DESK.md`](../validation/015-V0_2_12_SOL_PRICES_DESK.md).
Metadata HTTP/IPFS/Arweave viendra au premier besoin Metadata réel. SOL/EUR et les autres quotes restent une extension ultérieure explicite, sans conversion fiat cachée.

View File

@@ -1,5 +1,5 @@
<!-- file: docs/plans/019-V0_2_12_SOL_PRICES_DESK_PLAN.md -->
<!-- version: 19 -->
<!-- version: 20 -->
# Plan `0.2.12` — SOL Prices Desk + intégration prix Wallet Desk
@@ -588,21 +588,29 @@ Fusion des anciens hardenings `pre.008`/`pre.012` et du gate `pre.013` : la sél
#### `pre.009-fix.001` — Build Price Desk + source de vérité de version Tauri
**Statut : réalisé ; gate opérateur complet PASS, y compris smoke live et builds Config/Wallet/SOL Prices Desk.**
Le fix supprime la fonction TypeScript morte et formalise la politique de version desktop : `workspace.package.version` est l'identité KSP autoritative ; les trois `tauri.conf.json` omettent `version` afin que Tauri la dérive de Cargo ; les `package.json` privés restent des manifests frontend non couplés au bump workspace. Les canaris Config/Wallet/SOL Prices vérifient désormais ce fallback plutôt qu'une égalité artificielle `package.json == tauri.conf.json == CARGO_PKG_VERSION`. Aucun comportement prix, Wallet ou Config n'est modifié.
### `pre.010` — Réconciliation documentaire + préparation de publication
### `pre.010` — Réconciliation documentaire finale
**Statut : réalisé ; gate documentaire à confirmer.**
Réconciliation finale des documents durables avec le runtime effectivement validé : README/USAGE SOL Prices Desk, README/USAGE Wallet Desk, architecture Apps/Dependencies/Contracts/Inventory, séquence fonctionnelle, index documentation, présent plan et matrice de validation. Cette tranche ne modifie ni `CHANGELOG.md`, ni `ROADMAP.md`, ni le prompt suivant et ne rouvre aucun code fonctionnel.
### `pre.011` — Préparation de publication minimale
**Statut : planifié.**
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.
Dernière prerelease conforme à `PROMPT_STRUCTURE.md` / `VER-LIFECYCLE-003` : hors `Cargo.toml` et delta mécaniques, elle modifie uniquement le prompt de démarrage `0.2.13`, `CHANGELOG.md` et `ROADMAP.md`. Aucun README/USAGE/plan/validation/architecture/code/test n'est rouvert.
### `rel.001` — Publication stable `v0.2.12`
**Statut : planifié.**
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`.
Mécanique de publication stable uniquement, après validation de `pre.011` et vérification de la cohérence de release. Aucun défaut fonctionnel ou documentaire ne doit être absorbé par `rel.001`.
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`.
Le Price Desk est fermé fonctionnellement après `pre.007`, Wallet après `pre.008`, et le gate technique/live/builds après `pre.009-fix.001`. La fermeture minimale restante est donc `pre.010` documentaire, `pre.011` publication prep, puis `rel.001`.
## 20. Critères de sortie `pre.001`

View File

@@ -1,5 +1,5 @@
<!-- file: docs/validation/015-V0_2_12_SOL_PRICES_DESK.md -->
<!-- version: 18 -->
<!-- version: 19 -->
# Validation `0.2.12` — SOL Prices Desk + intégration Wallet Desk
@@ -40,7 +40,7 @@ NOT RUN commande non exécutée dans le contexte indiqué
| Wallet integration map | PASS | plan 019 section 12 |
| auto-refresh | OUT | hors scope confirmé |
| équivalent USD du solde | PASS | demandé opérateur; calcul backend exact depuis moyenne du refresh |
| forecast souple recalibré | PASS | clôture condensée jusquà `pre.010` + `rel.001` |
| forecast souple recalibré | PASS | fermeture normative `pre.010` docs + `pre.011` publication + rel |
| scope clôturable | PASS | pas de redécoupage requis avant `pre.002` |
| code/scaffold fonctionnel ajouté en `pre.001` | OUT | interdit par le gate |
@@ -200,7 +200,8 @@ Après décision opérateur de simplifier Wallet Desk, les responsabilités rest
```text
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
pre.010 réconciliation documentaire finale
pre.011 prompt suivant + CHANGELOG + ROADMAP uniquement
rel.001 publication stable
```
@@ -847,3 +848,45 @@ cargo test -p ksp-app-solprices-desk --test market_price_composition_live_smoke
```
Le build Wallet n'a pas besoin d'être rejoué pour valider la correction TypeScript Price Desk, mais un build opportuniste reste autorisé pour confirmer le fallback Cargo sur une autre app.
## 30. Gate `0.2.12-pre.009-fix.001` — clôture technique complète
Le gate opérateur final confirme la correction TypeScript et la nouvelle source de vérité de version desktop :
```text
cargo fmt --all PASS
python3 scripts/audit_rust_workspace_rules.py PASS
python3 scripts/audit_markdown_tables.py README.md ... deltas PASS
cargo check --workspace PASS
cargo clippy --workspace --all-targets PASS
cargo test -p ksp-app-solprices-desk PASS
cargo test --workspace PASS
market_price_composition_live_smoke PASS
cargo tauri build — SOL Prices Desk PASS — deb/rpm/AppImage 0.2.12-pre.9.fix.1
cargo tauri build — Wallet Desk PASS — deb/rpm/AppImage 0.2.12-pre.9.fix.1
cargo tauri build — Config Desk PASS — deb/rpm/AppImage 0.2.12-pre.9.fix.1
```
Le build Config est supplémentaire au gate minimal mais confirme le contrat `VER-ID-015/016` : son `package.json` reste à `0.2.6`, tandis que le bundle Tauri prend correctement `0.2.12-pre.9.fix.1` depuis Cargo sans champ `tauri.conf.json.version`.
Le couloir technique/live/build est donc fermé. Aucun test réseau ou build Tauri supplémentaire n'est requis dans la réconciliation documentaire `pre.010`, sauf découverte d'une anomalie documentaire qui invaliderait une preuve technique.
## 31. Réconciliation `0.2.12-pre.010` — documents durables
La réconciliation finale doit figer les documents durables avant la tranche de publication minimale :
```text
SOL Prices Desk README final provider-neutral/manual refresh
SOL Prices Desk USAGE guide opérateur créé
Wallet Desk README/USAGE moyenne SOL/USD + équivalent USD documentés
architecture Component Contracts Price Desk actuel + moyenne consumer-owned
architecture Component Inventory Off-chain/Price Desk stables pour 0.2.11/0.2.12
architecture Dependency Graph Wallet -> Off-chain Transport explicite
architecture Apps/Services Price Desk et dépendances directes explicites
Functional Release Sequence scope réel 0.2.12 réconcilié
docs/000-README candidate 0.2.12 récapitulée
plan 019 / validation 015 gates réels et fermeture séparée
```
Conformément à `PROMPT_STRUCTURE.md`, `CHANGELOG.md`, `ROADMAP.md` et le prompt `0.2.13` restent intacts dans `pre.010`. Ils appartiennent exclusivement à `pre.011`.