diff --git a/Cargo.toml b/Cargo.toml index 56cb37b..c064bab 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -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" diff --git a/crates/ksp-app-solprices-desk/README.md b/crates/ksp-app-solprices-desk/README.md index 143aaf4..d84ad9f 100644 --- a/crates/ksp-app-solprices-desk/README.md +++ b/crates/ksp-app-solprices-desk/README.md @@ -1,11 +1,11 @@ - + # `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). diff --git a/crates/ksp-app-solprices-desk/USAGE.md b/crates/ksp-app-solprices-desk/USAGE.md new file mode 100644 index 0000000..0a89632 --- /dev/null +++ b/crates/ksp-app-solprices-desk/USAGE.md @@ -0,0 +1,149 @@ + + + +# 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) +``` diff --git a/crates/ksp-app-wallet-desk/README.md b/crates/ksp-app-wallet-desk/README.md index 7753257..fc21e8b 100644 --- a/crates/ksp-app-wallet-desk/README.md +++ b/crates/ksp-app-wallet-desk/README.md @@ -1,5 +1,5 @@ - + # `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 : diff --git a/crates/ksp-app-wallet-desk/USAGE.md b/crates/ksp-app-wallet-desk/USAGE.md index 18a4089..51baadc 100644 --- a/crates/ksp-app-wallet-desk/USAGE.md +++ b/crates/ksp-app-wallet-desk/USAGE.md @@ -1,5 +1,5 @@ - + # 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é diff --git a/deltas/0.2.12/pre.010.md b/deltas/0.2.12/pre.010.md new file mode 100644 index 0000000..5dd84c1 --- /dev/null +++ b/deltas/0.2.12/pre.010.md @@ -0,0 +1,92 @@ + + + +# 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. diff --git a/docs/000-README.md b/docs/000-README.md index dbfdbed..7ef67e2 100644 --- a/docs/000-README.md +++ b/docs/000-README.md @@ -1,5 +1,5 @@ - + # Documentation KSP @@ -89,7 +89,7 @@ D'autres sous-répertoires seront ajoutés uniquement lorsque leur rôle aura é ## Documents de planification -Le plan historique de la phase fondatrice clôturée est conservé dans [`plans/001-V0_0_3_PLAN.md`](plans/001-V0_0_3_PLAN.md). La séquence active des premières releases fonctionnelles est définie dans [`plans/002-FUNCTIONAL_RELEASE_SEQUENCE.md`](plans/002-FUNCTIONAL_RELEASE_SEQUENCE.md). Le plan détaillé de la release stable `0.1.1` est conservé comme historique clôturé dans [`plans/003-V0_1_1_CORE_FOUNDATION_PLAN.md`](plans/003-V0_1_1_CORE_FOUNDATION_PLAN.md). Le plan détaillé de la release stable `0.1.2` est conservé comme historique clôturé dans [`plans/004-V0_1_2_LOGGING_FOUNDATION_PLAN.md`](plans/004-V0_1_2_LOGGING_FOUNDATION_PLAN.md). Le plan détaillé de la release stable `0.1.3 — Configuration foundation` est conservé comme historique clôturé dans [`plans/005-V0_1_3_CONFIG_FOUNDATION_PLAN.md`](plans/005-V0_1_3_CONFIG_FOUNDATION_PLAN.md). Le plan détaillé de la release stable `0.1.4 — ksp-app-config-desk` est conservé comme historique clôturé dans [`plans/006-V0_1_4_CONFIG_DESKTOP_PLAN.md`](plans/006-V0_1_4_CONFIG_DESKTOP_PLAN.md), avec sa matrice finale [`validation/001-V0_1_4_CONFIG_DESKTOP.md`](validation/001-V0_1_4_CONFIG_DESKTOP.md). Son prompt d'ouverture historique reste [`../prompts/004-V0_1_4_START_PROMPT.md`](../prompts/004-V0_1_4_START_PROMPT.md). La release stable `0.2.0` clôt l'audit de bot3 et le découpage de la série. Son plan directeur est conservé comme historique clôturé dans [`plans/007-V0_2_0_SERIES_PLANNING.md`](plans/007-V0_2_0_SERIES_PLANNING.md), avec sa matrice finale [`validation/002-V0_2_0_SERIES_PLANNING.md`](validation/002-V0_2_0_SERIES_PLANNING.md). La release stable `0.2.1 — HTTP Solana foundation` a été ouverte par [`../prompts/006-V0_2_1_START_PROMPT.md`](../prompts/006-V0_2_1_START_PROMPT.md). Son gate de sizing et sa matrice exhaustive sont conservés dans [`plans/008-V0_2_1_ONCHAIN_HTTP_PLAN.md`](plans/008-V0_2_1_ONCHAIN_HTTP_PLAN.md), avec la validation finale [`validation/003-V0_2_1_ONCHAIN_HTTP.md`](validation/003-V0_2_1_ONCHAIN_HTTP.md), README/USAGE Transport et le smoke Devnet opt-in de composition Config -> Transport. Le prompt [`../prompts/007-V0_2_2_START_PROMPT.md`](../prompts/007-V0_2_2_START_PROMPT.md) a ouvert la release stable `0.2.2 — HTTP Accounts + Tokens + Cluster`. Son plan clôturé [`plans/009-V0_2_2_HTTP_ACCOUNTS_TOKENS_CLUSTER_PLAN.md`](plans/009-V0_2_2_HTTP_ACCOUNTS_TOKENS_CLUSTER_PLAN.md) conserve l'audit et l'implémentation des 22 wrappers typés, tandis que [`validation/004-V0_2_2_HTTP_ACCOUNTS_TOKENS_CLUSTER.md`](validation/004-V0_2_2_HTTP_ACCOUNTS_TOKENS_CLUSTER.md) enregistre les validations déterministes, les graphes Cargo et les deux smokes Devnet passés avant publication. Le prompt [`../prompts/008-V0_2_3_START_PROMPT.md`](../prompts/008-V0_2_3_START_PROMPT.md) a ouvert la release stable `0.2.3 — HTTP Transactions`. Son plan clôturé [`plans/010-V0_2_3_HTTP_TRANSACTIONS_PLAN.md`](plans/010-V0_2_3_HTTP_TRANSACTIONS_PLAN.md) conserve l'audit et l'implémentation des 11 wrappers ; le réaudit [`validation/005-V0_2_3_KSP_TRANSPORT_007_RETRO_AUDIT.md`](validation/005-V0_2_3_KSP_TRANSPORT_007_RETRO_AUDIT.md) confirme la complétude des 37 wrappers HTTP typés et [`validation/006-V0_2_3_HTTP_TRANSACTIONS.md`](validation/006-V0_2_3_HTTP_TRANSACTIONS.md) enregistre les validations finales, graphes Cargo et deux smokes Devnet passés avant publication. Le prompt [`../prompts/009-V0_2_4_START_PROMPT.md`](../prompts/009-V0_2_4_START_PROMPT.md) a ouvert la release stable `0.2.4 — HTTP Blocks + Economics + compliance HTTP finale`. Son plan clôturé [`plans/011-V0_2_4_HTTP_BLOCKS_ECONOMICS_PLAN.md`](plans/011-V0_2_4_HTTP_BLOCKS_ECONOMICS_PLAN.md) conserve l’implémentation des 15 wrappers et la compliance `52/52 + 14/14`; la matrice finale [`validation/007-V0_2_4_HTTP_FINAL_COMPLIANCE.md`](validation/007-V0_2_4_HTTP_FINAL_COMPLIANCE.md) enregistre le réaudit SIMD/inventaire, les canaries globales et les preuves opérateur avant publication. Le prompt [`../prompts/010-V0_2_5_START_PROMPT.md`](../prompts/010-V0_2_5_START_PROMPT.md), finalisé par `0.2.4-pre.009-fix.001`, ouvre `0.2.5 — Wallet foundation` sur la base stable `v0.2.4`. Son plan historique clôturé [`plans/012-V0_2_5_WALLET_FOUNDATION_PLAN.md`](plans/012-V0_2_5_WALLET_FOUNDATION_PLAN.md) part du gate `pre.001` (héritage, threat model offline, VIEW/OWNER indépendants et niveau B read-only), puis matérialise la crate en `pre.002`, le wire/transcript en `pre.003`, les primitives Argon2id/XChaCha20-Poly1305 en `pre.004`, les payloads/create/open en `pre.005`, la persistence en `pre.006`, l'administration/signature en `pre.007` et les adapters transfer en `pre.008`. `pre.009` ferme l'audit adversarial/interoperability/compliance dans [`validation/008-V0_2_5_WALLET_SECURITY_COMPLIANCE.md`](validation/008-V0_2_5_WALLET_SECURITY_COMPLIANCE.md) avant la documentation finale `pre.010` ; `pre.010` finalise [`../crates/ksp-wallet-lib/README.md`](../crates/ksp-wallet-lib/README.md), [`../crates/ksp-wallet-lib/USAGE.md`](../crates/ksp-wallet-lib/USAGE.md), la spec, les graphes et la matrice ; `pre.010-fix.001`–`fix.003` ferment ensuite la mise à niveau Dalek et la normalisation Rust/audit structurel. `0.2.5-rel.001` publie la release stable et [`../prompts/011-V0_2_6_START_PROMPT.md`](../prompts/011-V0_2_6_START_PROMPT.md) ouvre `0.2.6 — Wallet Desk`. Le gate `0.2.6-pre.001` est conservé dans [`plans/013-V0_2_6_WALLET_DESK_PLAN.md`](plans/013-V0_2_6_WALLET_DESK_PLAN.md) : il réaudite Config Desk et les APIs finales, retient le gabarit desktop, fixe `std.wallet`, la composition Config/Wallet/HTTP/Logging, les secrets `KSP_SECRET_WALLET_PASS_*`, les frontières VIEW/OWNER et la trajectoire de validation. `pre.002`–`pre.014` matérialisent ensuite le shell Tauri, Config Wallet/composite, inventory, create/open, balance HTTP, import/export, metadata, rotations, révocation VIEW forte, compliance et polish desktop. `pre.015` fige le wire binaire `.kspwallet` V2, `pre.016` matérialise les APIs génériques/versionnées et le runtime V2, puis `pre.017` ajoute la migration explicite OWNER-authentifiée V1 -> V2. `pre.018` ferme le runtime Tauri packagé Config/resources et la documentation candidate ; `pre.018-fix.001` corrige le canari d'ownership Config, après quoi le gate workspace et le build final Linux sont verts. `pre.018-fix.002` renforce uniquement le contrat de reprise `0.2.7`. `0.2.6-rel.001` publie cette surface stable et [`../prompts/012-V0_2_7_START_PROMPT.md`](../prompts/012-V0_2_7_START_PROMPT.md) devient le prochain point d'entrée. Le gate `0.2.7-pre.001` ouvre la release WebSocket standard dans [`plans/014-V0_2_7_ONCHAIN_WEBSOCKET_PLAN.md`](plans/014-V0_2_7_ONCHAIN_WEBSOCKET_PLAN.md) ; la matrice normative puis finale est conservée dans [`validation/010-V0_2_7_ONCHAIN_WEBSOCKET.md`](validation/010-V0_2_7_ONCHAIN_WEBSOCKET.md). `0.2.7-pre.014` ferme la candidate technique/documentaire après validation 18/18, smoke WebSocket Devnet et audit du graphe Cargo ; `pre.014-fix.001` renforce uniquement le prompt suivant. `0.2.7-rel.001` publie `0.2.7 — WebSocket Solana standard` stable et [`../prompts/013-V0_2_8_START_PROMPT.md`](../prompts/013-V0_2_8_START_PROMPT.md) ouvre `0.2.8 — Helius LaserStream WebSocket`. Le plan historique clôturé [`plans/015-V0_2_8_HELIUS_LASERSTREAM_WEBSOCKET_PLAN.md`](plans/015-V0_2_8_HELIUS_LASERSTREAM_WEBSOCKET_PLAN.md) et la matrice finale [`validation/011-V0_2_8_HELIUS_LASERSTREAM_WEBSOCKET.md`](validation/011-V0_2_8_HELIUS_LASERSTREAM_WEBSOCKET.md) conservent la release stable `0.2.8 — Helius LaserStream WebSocket` publiée par `rel.001` : protocol `helius_laserstream`, sept familles standard Helius (`account/logs/program/root/signature/slot/slotsUpdates`), extension `transactionSubscribe`/`transactionUnsubscribe`, `block/vote` absents, heartbeat Ping 60 s, Config/secrets redacted, lifecycle adversarial et graphes Cargo finaux validés. [`../prompts/014-V0_2_9_START_PROMPT.md`](../prompts/014-V0_2_9_START_PROMPT.md) devient le contrat actif pour ouvrir Yellowstone gRPC standard/provider-neutral depuis le tag stable `v0.2.8`. La release stable `0.2.9` est conservée dans [`plans/016-V0_2_9_YELLOWSTONE_GRPC_PLAN.md`](plans/016-V0_2_9_YELLOWSTONE_GRPC_PLAN.md) et [`validation/012-V0_2_9_YELLOWSTONE_GRPC.md`](validation/012-V0_2_9_YELLOWSTONE_GRPC.md) : stratégie proto Apache + client KSP/Tonic, moteur N1, standard N2, Config V3, profils PublicNode Mainnet/Testnet authentifiés par `x-token` secret et smoke live `Subscribe` validé sur les deux réseaux. La candidate `0.2.10 — OrbitFlare Yellowstone gRPC` est réconciliée dans [`plans/017-V0_2_10_ORBITFLARE_YELLOWSTONE_GRPC_PLAN.md`](plans/017-V0_2_10_ORBITFLARE_YELLOWSTONE_GRPC_PLAN.md) et [`validation/013-V0_2_10_ORBITFLARE_YELLOWSTONE_GRPC.md`](validation/013-V0_2_10_ORBITFLARE_YELLOWSTONE_GRPC.md) : Devnet `http://devnet.rpc.orbitflare.com:10000`, License Key `ORBIT-*` injectée comme metadata secrète `x-token`, Config Transport V3 inchangée, live `Subscribe -> Slot + Ping` passé, aucun overlay provider et aucun heartbeat supplémentaire. La candidate `0.2.11 — Off-chain price transport` est réconciliée dans [`plans/018-V0_2_11_OFFCHAIN_PRICE_TRANSPORT_PLAN.md`](plans/018-V0_2_11_OFFCHAIN_PRICE_TRANSPORT_PLAN.md) et [`validation/014-V0_2_11_OFFCHAIN_PRICE_TRANSPORT.md`](validation/014-V0_2_11_OFFCHAIN_PRICE_TRANSPORT.md) : SOL/USD V1, huit adapters REST sans SDK provider, décimal exact, registry/availability/rate limits possédés par Off-chain Transport, Config `std.offchain_transport`, refresh individuel/multiple provider-neutral et smoke live keyless final `7/7` après correction CoinMarketCap V2. [`../crates/ksp-offchain-transport-lib/README.md`](../crates/ksp-offchain-transport-lib/README.md) et [`../crates/ksp-offchain-transport-lib/USAGE.md`](../crates/ksp-offchain-transport-lib/USAGE.md) deviennent les références durables ; la future `ksp-app-solprices-desk` reste une HID sans logique provider. `0.2.12-pre.001` ouvre désormais cette HID dans [`plans/019-V0_2_12_SOL_PRICES_DESK_PLAN.md`](plans/019-V0_2_12_SOL_PRICES_DESK_PLAN.md), avec la matrice active [`validation/015-V0_2_12_SOL_PRICES_DESK.md`](validation/015-V0_2_12_SOL_PRICES_DESK.md) : composite Logging + Off-chain Transport, ports 1434/1435, état de présentation backend mémoire, DTO/commands provider-neutral, puis intégration additive dans Wallet Desk sans prix canonique ni auto-refresh. +Le plan historique de la phase fondatrice clôturée est conservé dans [`plans/001-V0_0_3_PLAN.md`](plans/001-V0_0_3_PLAN.md). La séquence active des premières releases fonctionnelles est définie dans [`plans/002-FUNCTIONAL_RELEASE_SEQUENCE.md`](plans/002-FUNCTIONAL_RELEASE_SEQUENCE.md). Le plan détaillé de la release stable `0.1.1` est conservé comme historique clôturé dans [`plans/003-V0_1_1_CORE_FOUNDATION_PLAN.md`](plans/003-V0_1_1_CORE_FOUNDATION_PLAN.md). Le plan détaillé de la release stable `0.1.2` est conservé comme historique clôturé dans [`plans/004-V0_1_2_LOGGING_FOUNDATION_PLAN.md`](plans/004-V0_1_2_LOGGING_FOUNDATION_PLAN.md). Le plan détaillé de la release stable `0.1.3 — Configuration foundation` est conservé comme historique clôturé dans [`plans/005-V0_1_3_CONFIG_FOUNDATION_PLAN.md`](plans/005-V0_1_3_CONFIG_FOUNDATION_PLAN.md). Le plan détaillé de la release stable `0.1.4 — ksp-app-config-desk` est conservé comme historique clôturé dans [`plans/006-V0_1_4_CONFIG_DESKTOP_PLAN.md`](plans/006-V0_1_4_CONFIG_DESKTOP_PLAN.md), avec sa matrice finale [`validation/001-V0_1_4_CONFIG_DESKTOP.md`](validation/001-V0_1_4_CONFIG_DESKTOP.md). Son prompt d'ouverture historique reste [`../prompts/004-V0_1_4_START_PROMPT.md`](../prompts/004-V0_1_4_START_PROMPT.md). La release stable `0.2.0` clôt l'audit de bot3 et le découpage de la série. Son plan directeur est conservé comme historique clôturé dans [`plans/007-V0_2_0_SERIES_PLANNING.md`](plans/007-V0_2_0_SERIES_PLANNING.md), avec sa matrice finale [`validation/002-V0_2_0_SERIES_PLANNING.md`](validation/002-V0_2_0_SERIES_PLANNING.md). La release stable `0.2.1 — HTTP Solana foundation` a été ouverte par [`../prompts/006-V0_2_1_START_PROMPT.md`](../prompts/006-V0_2_1_START_PROMPT.md). Son gate de sizing et sa matrice exhaustive sont conservés dans [`plans/008-V0_2_1_ONCHAIN_HTTP_PLAN.md`](plans/008-V0_2_1_ONCHAIN_HTTP_PLAN.md), avec la validation finale [`validation/003-V0_2_1_ONCHAIN_HTTP.md`](validation/003-V0_2_1_ONCHAIN_HTTP.md), README/USAGE Transport et le smoke Devnet opt-in de composition Config -> Transport. Le prompt [`../prompts/007-V0_2_2_START_PROMPT.md`](../prompts/007-V0_2_2_START_PROMPT.md) a ouvert la release stable `0.2.2 — HTTP Accounts + Tokens + Cluster`. Son plan clôturé [`plans/009-V0_2_2_HTTP_ACCOUNTS_TOKENS_CLUSTER_PLAN.md`](plans/009-V0_2_2_HTTP_ACCOUNTS_TOKENS_CLUSTER_PLAN.md) conserve l'audit et l'implémentation des 22 wrappers typés, tandis que [`validation/004-V0_2_2_HTTP_ACCOUNTS_TOKENS_CLUSTER.md`](validation/004-V0_2_2_HTTP_ACCOUNTS_TOKENS_CLUSTER.md) enregistre les validations déterministes, les graphes Cargo et les deux smokes Devnet passés avant publication. Le prompt [`../prompts/008-V0_2_3_START_PROMPT.md`](../prompts/008-V0_2_3_START_PROMPT.md) a ouvert la release stable `0.2.3 — HTTP Transactions`. Son plan clôturé [`plans/010-V0_2_3_HTTP_TRANSACTIONS_PLAN.md`](plans/010-V0_2_3_HTTP_TRANSACTIONS_PLAN.md) conserve l'audit et l'implémentation des 11 wrappers ; le réaudit [`validation/005-V0_2_3_KSP_TRANSPORT_007_RETRO_AUDIT.md`](validation/005-V0_2_3_KSP_TRANSPORT_007_RETRO_AUDIT.md) confirme la complétude des 37 wrappers HTTP typés et [`validation/006-V0_2_3_HTTP_TRANSACTIONS.md`](validation/006-V0_2_3_HTTP_TRANSACTIONS.md) enregistre les validations finales, graphes Cargo et deux smokes Devnet passés avant publication. Le prompt [`../prompts/009-V0_2_4_START_PROMPT.md`](../prompts/009-V0_2_4_START_PROMPT.md) a ouvert la release stable `0.2.4 — HTTP Blocks + Economics + compliance HTTP finale`. Son plan clôturé [`plans/011-V0_2_4_HTTP_BLOCKS_ECONOMICS_PLAN.md`](plans/011-V0_2_4_HTTP_BLOCKS_ECONOMICS_PLAN.md) conserve l’implémentation des 15 wrappers et la compliance `52/52 + 14/14`; la matrice finale [`validation/007-V0_2_4_HTTP_FINAL_COMPLIANCE.md`](validation/007-V0_2_4_HTTP_FINAL_COMPLIANCE.md) enregistre le réaudit SIMD/inventaire, les canaries globales et les preuves opérateur avant publication. Le prompt [`../prompts/010-V0_2_5_START_PROMPT.md`](../prompts/010-V0_2_5_START_PROMPT.md), finalisé par `0.2.4-pre.009-fix.001`, ouvre `0.2.5 — Wallet foundation` sur la base stable `v0.2.4`. Son plan historique clôturé [`plans/012-V0_2_5_WALLET_FOUNDATION_PLAN.md`](plans/012-V0_2_5_WALLET_FOUNDATION_PLAN.md) part du gate `pre.001` (héritage, threat model offline, VIEW/OWNER indépendants et niveau B read-only), puis matérialise la crate en `pre.002`, le wire/transcript en `pre.003`, les primitives Argon2id/XChaCha20-Poly1305 en `pre.004`, les payloads/create/open en `pre.005`, la persistence en `pre.006`, l'administration/signature en `pre.007` et les adapters transfer en `pre.008`. `pre.009` ferme l'audit adversarial/interoperability/compliance dans [`validation/008-V0_2_5_WALLET_SECURITY_COMPLIANCE.md`](validation/008-V0_2_5_WALLET_SECURITY_COMPLIANCE.md) avant la documentation finale `pre.010` ; `pre.010` finalise [`../crates/ksp-wallet-lib/README.md`](../crates/ksp-wallet-lib/README.md), [`../crates/ksp-wallet-lib/USAGE.md`](../crates/ksp-wallet-lib/USAGE.md), la spec, les graphes et la matrice ; `pre.010-fix.001`–`fix.003` ferment ensuite la mise à niveau Dalek et la normalisation Rust/audit structurel. `0.2.5-rel.001` publie la release stable et [`../prompts/011-V0_2_6_START_PROMPT.md`](../prompts/011-V0_2_6_START_PROMPT.md) ouvre `0.2.6 — Wallet Desk`. Le gate `0.2.6-pre.001` est conservé dans [`plans/013-V0_2_6_WALLET_DESK_PLAN.md`](plans/013-V0_2_6_WALLET_DESK_PLAN.md) : il réaudite Config Desk et les APIs finales, retient le gabarit desktop, fixe `std.wallet`, la composition Config/Wallet/HTTP/Logging, les secrets `KSP_SECRET_WALLET_PASS_*`, les frontières VIEW/OWNER et la trajectoire de validation. `pre.002`–`pre.014` matérialisent ensuite le shell Tauri, Config Wallet/composite, inventory, create/open, balance HTTP, import/export, metadata, rotations, révocation VIEW forte, compliance et polish desktop. `pre.015` fige le wire binaire `.kspwallet` V2, `pre.016` matérialise les APIs génériques/versionnées et le runtime V2, puis `pre.017` ajoute la migration explicite OWNER-authentifiée V1 -> V2. `pre.018` ferme le runtime Tauri packagé Config/resources et la documentation candidate ; `pre.018-fix.001` corrige le canari d'ownership Config, après quoi le gate workspace et le build final Linux sont verts. `pre.018-fix.002` renforce uniquement le contrat de reprise `0.2.7`. `0.2.6-rel.001` publie cette surface stable et [`../prompts/012-V0_2_7_START_PROMPT.md`](../prompts/012-V0_2_7_START_PROMPT.md) devient le prochain point d'entrée. Le gate `0.2.7-pre.001` ouvre la release WebSocket standard dans [`plans/014-V0_2_7_ONCHAIN_WEBSOCKET_PLAN.md`](plans/014-V0_2_7_ONCHAIN_WEBSOCKET_PLAN.md) ; la matrice normative puis finale est conservée dans [`validation/010-V0_2_7_ONCHAIN_WEBSOCKET.md`](validation/010-V0_2_7_ONCHAIN_WEBSOCKET.md). `0.2.7-pre.014` ferme la candidate technique/documentaire après validation 18/18, smoke WebSocket Devnet et audit du graphe Cargo ; `pre.014-fix.001` renforce uniquement le prompt suivant. `0.2.7-rel.001` publie `0.2.7 — WebSocket Solana standard` stable et [`../prompts/013-V0_2_8_START_PROMPT.md`](../prompts/013-V0_2_8_START_PROMPT.md) ouvre `0.2.8 — Helius LaserStream WebSocket`. Le plan historique clôturé [`plans/015-V0_2_8_HELIUS_LASERSTREAM_WEBSOCKET_PLAN.md`](plans/015-V0_2_8_HELIUS_LASERSTREAM_WEBSOCKET_PLAN.md) et la matrice finale [`validation/011-V0_2_8_HELIUS_LASERSTREAM_WEBSOCKET.md`](validation/011-V0_2_8_HELIUS_LASERSTREAM_WEBSOCKET.md) conservent la release stable `0.2.8 — Helius LaserStream WebSocket` publiée par `rel.001` : protocol `helius_laserstream`, sept familles standard Helius (`account/logs/program/root/signature/slot/slotsUpdates`), extension `transactionSubscribe`/`transactionUnsubscribe`, `block/vote` absents, heartbeat Ping 60 s, Config/secrets redacted, lifecycle adversarial et graphes Cargo finaux validés. [`../prompts/014-V0_2_9_START_PROMPT.md`](../prompts/014-V0_2_9_START_PROMPT.md) devient le contrat actif pour ouvrir Yellowstone gRPC standard/provider-neutral depuis le tag stable `v0.2.8`. La release stable `0.2.9` est conservée dans [`plans/016-V0_2_9_YELLOWSTONE_GRPC_PLAN.md`](plans/016-V0_2_9_YELLOWSTONE_GRPC_PLAN.md) et [`validation/012-V0_2_9_YELLOWSTONE_GRPC.md`](validation/012-V0_2_9_YELLOWSTONE_GRPC.md) : stratégie proto Apache + client KSP/Tonic, moteur N1, standard N2, Config V3, profils PublicNode Mainnet/Testnet authentifiés par `x-token` secret et smoke live `Subscribe` validé sur les deux réseaux. La candidate `0.2.10 — OrbitFlare Yellowstone gRPC` est réconciliée dans [`plans/017-V0_2_10_ORBITFLARE_YELLOWSTONE_GRPC_PLAN.md`](plans/017-V0_2_10_ORBITFLARE_YELLOWSTONE_GRPC_PLAN.md) et [`validation/013-V0_2_10_ORBITFLARE_YELLOWSTONE_GRPC.md`](validation/013-V0_2_10_ORBITFLARE_YELLOWSTONE_GRPC.md) : Devnet `http://devnet.rpc.orbitflare.com:10000`, License Key `ORBIT-*` injectée comme metadata secrète `x-token`, Config Transport V3 inchangée, live `Subscribe -> Slot + Ping` passé, aucun overlay provider et aucun heartbeat supplémentaire. La candidate `0.2.11 — Off-chain price transport` est réconciliée dans [`plans/018-V0_2_11_OFFCHAIN_PRICE_TRANSPORT_PLAN.md`](plans/018-V0_2_11_OFFCHAIN_PRICE_TRANSPORT_PLAN.md) et [`validation/014-V0_2_11_OFFCHAIN_PRICE_TRANSPORT.md`](validation/014-V0_2_11_OFFCHAIN_PRICE_TRANSPORT.md) : SOL/USD V1, huit adapters REST sans SDK provider, décimal exact, registry/availability/rate limits possédés par Off-chain Transport, Config `std.offchain_transport`, refresh individuel/multiple provider-neutral et smoke live keyless final `7/7` après correction CoinMarketCap V2. [`../crates/ksp-offchain-transport-lib/README.md`](../crates/ksp-offchain-transport-lib/README.md) et [`../crates/ksp-offchain-transport-lib/USAGE.md`](../crates/ksp-offchain-transport-lib/USAGE.md) deviennent les références durables ; la future `ksp-app-solprices-desk` reste une HID sans logique provider. La candidate `0.2.12 — SOL Prices Desk + intégration prix Wallet Desk` est réconciliée dans [`plans/019-V0_2_12_SOL_PRICES_DESK_PLAN.md`](plans/019-V0_2_12_SOL_PRICES_DESK_PLAN.md) et [`validation/015-V0_2_12_SOL_PRICES_DESK.md`](validation/015-V0_2_12_SOL_PRICES_DESK.md) : `ksp-app-solprices-desk` fournit le refresh manuel row/selected/all provider-neutral, états/timestamps exacts et diagnostics sûrs sur ports 1434/1435 ; Wallet Desk réutilise `MarketPriceService::refresh_all` pendant le refresh balance pour afficher une moyenne SOL/USD consumer-owned et l'équivalent USD exact, sans provider concret ni fallback Off-chain. Les gates finaux workspace/live et les trois builds Tauri Linux sont verts avant réconciliation documentaire. ## Spécifications de formats diff --git a/docs/architecture/003-COMPONENT_CONTRACTS.md b/docs/architecture/003-COMPONENT_CONTRACTS.md index e996123..f51f663 100644 --- a/docs/architecture/003-COMPONENT_CONTRACTS.md +++ b/docs/architecture/003-COMPONENT_CONTRACTS.md @@ -1,5 +1,5 @@ - + # 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 diff --git a/docs/architecture/004-COMPONENT_INVENTORY.md b/docs/architecture/004-COMPONENT_INVENTORY.md index e2b24a3..0d5afa8 100644 --- a/docs/architecture/004-COMPONENT_INVENTORY.md +++ b/docs/architecture/004-COMPONENT_INVENTORY.md @@ -1,5 +1,5 @@ - + # 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 | diff --git a/docs/architecture/005-DEPENDENCY_GRAPH.md b/docs/architecture/005-DEPENDENCY_GRAPH.md index bd0b5aa..3d77c32 100644 --- a/docs/architecture/005-DEPENDENCY_GRAPH.md +++ b/docs/architecture/005-DEPENDENCY_GRAPH.md @@ -1,5 +1,5 @@ - + # 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 diff --git a/docs/architecture/010-APPS_SERVICES_SCENARIOS_AND_CONTROL.md b/docs/architecture/010-APPS_SERVICES_SCENARIOS_AND_CONTROL.md index 197fbd6..befc3a2 100644 --- a/docs/architecture/010-APPS_SERVICES_SCENARIOS_AND_CONTROL.md +++ b/docs/architecture/010-APPS_SERVICES_SCENARIOS_AND_CONTROL.md @@ -1,5 +1,5 @@ - + # 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--desk ksp-app-scenario---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 diff --git a/docs/plans/002-FUNCTIONAL_RELEASE_SEQUENCE.md b/docs/plans/002-FUNCTIONAL_RELEASE_SEQUENCE.md index 543e308..13015b8 100644 --- a/docs/plans/002-FUNCTIONAL_RELEASE_SEQUENCE.md +++ b/docs/plans/002-FUNCTIONAL_RELEASE_SEQUENCE.md @@ -1,5 +1,5 @@ - + # 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. diff --git a/docs/plans/019-V0_2_12_SOL_PRICES_DESK_PLAN.md b/docs/plans/019-V0_2_12_SOL_PRICES_DESK_PLAN.md index 568ca14..a8c3908 100644 --- a/docs/plans/019-V0_2_12_SOL_PRICES_DESK_PLAN.md +++ b/docs/plans/019-V0_2_12_SOL_PRICES_DESK_PLAN.md @@ -1,5 +1,5 @@ - + # 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` diff --git a/docs/validation/015-V0_2_12_SOL_PRICES_DESK.md b/docs/validation/015-V0_2_12_SOL_PRICES_DESK.md index d4d911e..2ffea52 100644 --- a/docs/validation/015-V0_2_12_SOL_PRICES_DESK.md +++ b/docs/validation/015-V0_2_12_SOL_PRICES_DESK.md @@ -1,5 +1,5 @@ - + # 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`. +