diff --git a/CHANGELOG.md b/CHANGELOG.md index d636580..754b628 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,18 @@ - + # Changelog KSP +## 0.2.11 — Off-chain price transport — 2026-08-26 + +`0.2.11` crée `ksp-offchain-transport-lib` avec une première surface volontairement bornée à **SOL/USD** et huit adapters REST V1 : CoinGecko, CoinMarketCap, CoinPaprika, Kraken, Coinbase Exchange, Jupiter Price V3, Birdeye et DexScreener. Les adapters utilisent `reqwest` directement, sans SDK provider, avec origines HTTPS possédées par la crate, DTOs wire privés et prix normalisés par `MarketPriceDecimal` sans passage canonique par `f64`. `MarketPriceObservation` conserve paire, sémantique, provenance et timestamps réellement disponibles afin de ne pas confondre prix agrégé, dernier trade d'exchange, heuristique Solana, spot provider et prix DEX pair. DexScreener exige une paire Solana explicite et ne réalise aucune discovery ou sélection automatique de pool. + +La crate possède désormais le registry provider-neutral, les descriptors/capabilities, les limites et quotas informatifs, les états `MarketPriceProviderAvailability`, le cooldown et le service générique `MarketPriceService`. Les consumers disposent de `registry`, `refresh`, `refresh_many` et `refresh_all`; le batch V1 reste séquentiel et déterministe, ne dort jamais pour attendre un rate limit et n'introduit ni fallback, ni consensus, ni moyenne KSP. Les erreurs provider sont normalisées en états génériques et les credentials/endpoints/raw bodies restent absents des projections et diagnostics publics. + +Config ajoute `std.offchain_transport` V1, son schema, les profils `public_keyless` et `all_free`, ainsi que `ResolvedOffchainTransportConfig` qui construit le service sans dépendance inverse. Les credentials CoinGecko/CoinMarketCap/Jupiter/Birdeye restent sous `KSP_SECRET_*`; la paire DexScreener utilise une provenance `KSP_PUBLIC_*`. Les deux applications desktop existantes embarquent les nouvelles resources Config sans encore consommer fonctionnellement le prix. Les canaris de sécurité verrouillent notamment l'absence d'URL/rate-limit provider configurable au-dessus de Config, de lecture directe d'environnement dans Off-chain Transport et de fuite de clés par `Debug`. + +Le gate technique final a passé les audits Rust/Markdown, `cargo check`, Clippy, les tests ciblés Config/Off-chain, le workspace complet et les graphes Cargo. Le premier smoke live keyless a isolé une erreur de query CoinMarketCap (`ids=5426` au lieu de `id=5426`); `pre.011-fix.001` la corrige pour les modes Keyless et Basic, puis le re-smoke passe **7/7** providers keyless. Le smoke keyed Birdeye/CoinGecko Demo/CoinMarketCap Basic/Jupiter Free reste explicitement `SKIP opérateur`. `prompts/017-V0_2_12_START_PROMPT.md` ouvre ensuite `0.2.12 — SOL Prices Desk + intégration prix Wallet Desk` uniquement depuis le tag stable `v0.2.11`, avec audit/sizing desktop strict avant toute implémentation UI lourde. + ## 0.2.10 — OrbitFlare Yellowstone gRPC — 2026-08-25 `0.2.10` ajoute OrbitFlare comme provider Yellowstone gRPC sur le moteur N1 et le standard N2 acquis dans `0.2.9`, sans modifier le moteur gRPC ni créer de façade provider inutile. L'audit et le smoke live ont établi le contrat réel du service Solana Free Devnet : endpoint `http://devnet.rpc.orbitflare.com:10000`, authentification par metadata gRPC secrète `x-token` portant la License Key OrbitFlare, et émission du Ping Yellowstone standard. Config Transport V3 représente ce provider avec `provider = orbitflare`, `cluster = devnet`, `protocol = solana_yellowstone` et `secret_metadata`, tandis que `.env.example` inventorie `KSP_SECRET_ORBITFLARE_DEVNET_GRPC_X_TOKEN` sans valeur réelle. diff --git a/Cargo.toml b/Cargo.toml index e328a18..e9e6a3e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,12 +1,12 @@ # file: Cargo.toml -# version: 284 +# version: 285 [workspace] resolver = "3" members = ["crates/ksp-app-config-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.11-pre.12" +version = "0.2.11-pre.13" edition = "2024" license = "MIT" repository = "https://git.sasedev.com/Sasedev/khadhroony-solana-project" diff --git a/ROADMAP.md b/ROADMAP.md index 13aa57f..997e2b1 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -1,5 +1,5 @@ - + # Roadmap KSP @@ -55,7 +55,7 @@ Le roadmap décrit les objectifs à atteindre et les grandes étapes prévues. U - [X] `0.2.8` — Helius LaserStream WebSocket stable : façade provider dédiée sur l’actor WebSocket partagé, sept familles standard réutilisées (`account/logs/program/root/signature/slot/slotsUpdates`) + `transactionSubscribe`/`transactionUnsubscribe`, `block/vote` absents, heartbeat Ping 60 s Helius-only, Config V2/secrets redacted, lifecycle adversarial, compliance HTTP 52+14 / Standard WS 18/18 et graphes Cargo finaux validés ; prompt `0.2.9` prêt. - [X] `0.2.9` — Yellowstone gRPC standard/provider-neutral stable : moteur Tonic/Protobuf KSP partagé, sept unary standard retenues, `Subscribe` bidi et neuf variantes d’update, lifecycle/backpressure/reconnect/replay bornés sans promesse lossless, Config Transport V3 backward V1/V2 avec provider/protocol séparés, profils PublicNode Mainnet/Testnet authentifiés par `x-token`, smoke live `Subscribe -> Slot` 2/2 PASS et graphes Cargo finaux inspectés ; `SubscribeDeshred` reste hors scope. - [X] `0.2.10` — OrbitFlare Yellowstone gRPC stable : profil Config V3 Devnet, License Key injectée comme metadata secrète `x-token`, smoke live `Subscribe -> Slot + Ping` validé deux fois, sans modification du moteur N1/N2 ni heartbeat provider. -- [ ] `0.2.11` — Introduire `ksp-offchain-transport-lib` avec SOL/USD multi-provider via HTTP REST `reqwest` sans SDK provider ; la crate possède adapters, capacités/rate limits, disponibilité et refresh génériques, sans consensus/fallback automatique. +- [X] `0.2.11` — Off-chain price transport stable : `ksp-offchain-transport-lib` expose SOL/USD via huit adapters REST `reqwest` sans SDK provider, décimal exact, sémantiques/provenance explicites, registry/availability/rate limits et refresh single/many/all génériques ; Config `std.offchain_transport` construit le service sans dépendance inverse, DexScreener reste lié à une paire explicite sans discovery, aucun consensus/fallback automatique n’est introduit, et le smoke live keyless final passe 7/7 après correction CoinMarketCap V2. - [ ] `0.2.12` — Introduire `ksp-app-solprices-desk` comme HID provider-agnostic consommant uniquement `ksp-offchain-transport-lib`, avec tableau prix/provider et refresh individuel/multiple ; puis intégrer cette capacité dans `ksp-app-wallet-desk` sans dupliquer la logique de récupération/normalisation. - [ ] `0.2.13` — Introduire la première surface de `ksp-interface-lib`, comprenant une API wire publique utilisable par les implémentations officielles et externes. - [ ] `0.2.14` — Introduire `ksp-program-api` comme premier contrat Program extensible, sans imposer encore `ksp-program-lib` complet. diff --git a/deltas/0.2.11/pre.013.md b/deltas/0.2.11/pre.013.md new file mode 100644 index 0000000..a054c9b --- /dev/null +++ b/deltas/0.2.11/pre.013.md @@ -0,0 +1,245 @@ + + + +# Delta `0.2.11-pre.013` — préparation de publication minimale + +## 1. Base + +```text +0.2.11-pre.012 +``` + +Cette tranche est exclusivement le couloir de préparation de publication. Conformément à `docs/rules/PROMPT_STRUCTURE.md` et `docs/rules/FILE_CONTRACTS.md`, elle ne modifie aucun code fonctionnel, test, schema, Config, README, USAGE, plan, validation, architecture ou règle normative. + +Le payload fonctionnel est limité à : + +```text +prompt de démarrage 0.2.12 +CHANGELOG.md +ROADMAP.md +``` + +avec les deux fichiers mécaniques autorisés : + +```text +Cargo.toml +deltas/0.2.11/pre.013.md +``` + +## 2. Gate `pre.012` + +Le gate opérateur `pre.012` du `2026-08-26` est entièrement vert : + +```text +cargo fmt --all PASS +Rust workspace audit PASS / 0 export candidate +Markdown audit PASS / 127 tables / 122 files +cargo check --workspace PASS +cargo clippy --workspace --all-targets PASS +cargo test --workspace PASS +``` + +Les suites directement concernées conservent notamment : + +```text +Off-chain Transport unit 58/58 PASS +Off-chain dependency boundary 6/6 PASS +Off-chain public API 7/7 PASS +Off-chain release completeness 2/2 PASS +Off-chain security hardening 3/3 PASS +Config unit 120/120 PASS +Config ownership 5/5 PASS +Config public API 16/16 PASS +``` + +Les smokes live restent `ignored` dans le workspace normal. Le re-smoke keyless `pre.011-fix.001` acquis avant la réconciliation documentaire reste la preuve live finale : + +```text +7/7 providers keyless PASS +``` + +Le smoke keyed reste explicitement `SKIP opérateur` et n'est pas requalifié. + +## 3. Version technique + +```text +workspace.package.version = 0.2.11-pre.13 +commit attendu = v0.2.11-pre.013 +aucun tag prerelease +``` + +Le changement Cargo est mécanique ; aucune sémantique runtime ne change. + +## 4. Relecture préalable au prompt `0.2.12` + +Avant rédaction du prompt, les sources normatives ont été relues, notamment : + +```text +docs/rules/PROMPT_STRUCTURE.md +docs/rules/VERSION_WORKFLOW.md +docs/rules/RULES_DOCUMENTATION.md +docs/rules/RULES_GENERAL.md +docs/rules/RULES_DEPENDENCIES.md +docs/rules/RULES_KSP.md +docs/rules/FILE_CONTRACTS.md + +docs/architecture/000-README.md +docs/architecture/002-LAYERS_AND_DEPENDENCIES.md +docs/architecture/003-COMPONENT_CONTRACTS.md +docs/architecture/004-COMPONENT_INVENTORY.md +docs/architecture/005-DEPENDENCY_GRAPH.md +docs/architecture/009-ACQUISITION_WORKERS_AND_JOBS.md +docs/architecture/010-APPS_SERVICES_SCENARIOS_AND_CONTROL.md +``` + +La rédaction a aussi confronté : + +```text +prompts/011-V0_2_6_START_PROMPT.md +prompts/015-V0_2_10_START_PROMPT.md +prompts/016-V0_2_11_START_PROMPT.md + +docs/plans/002-FUNCTIONAL_RELEASE_SEQUENCE.md +docs/plans/018-V0_2_11_OFFCHAIN_PRICE_TRANSPORT_PLAN.md +docs/validation/014-V0_2_11_OFFCHAIN_PRICE_TRANSPORT.md + +crates/ksp-offchain-transport-lib public API +ksp-config-lib Off-chain adapter/composite/packaging +ksp-app-config-desk gabarit Tauri actuel +ksp-app-wallet-desk composition/runtime actuel +``` + +Les sources officielles Tauri 2 actuelles sur configuration, sécurité et capabilities ainsi que la référence TS-RS sont inscrites dans le prompt comme sources externes à réauditer en `0.2.12-pre.001`. Aucune version historique n'est transformée en pin. + +## 5. Prompt `0.2.12` + +Ajout de : + +```text +prompts/017-V0_2_12_START_PROMPT.md +``` + +Le prompt ouvre exclusivement : + +```text +v0.2.11 -> 0.2.12-pre.001 +``` + +Mission : + +```text +1. créer ksp-app-solprices-desk comme HID provider-agnostic +2. valider inventory/price/availability/freshness + refresh single/many/all +3. intégrer ensuite la même capacité générique dans ksp-app-wallet-desk +4. ne dupliquer aucune récupération/normalisation provider dans les applications +``` + +Les décisions acquises sont reprises depuis l'architecture et la clôture `0.2.11` : + +```text +SOL/USD V1 existant +8 providers sous Off-chain Transport +aucun provider concret hardcodé dans l'app +Config propriétaire des credentials +Off-chain Transport propriétaire des rate limits/cooldowns +provider_id opaque autorisé comme identifiant générique +ports SOL Prices Desk attendus 1434/1435 +Tauri lancé crate-local +aucun fetch provider frontend +aucune API key/URL/header provider dans les DTOs +Wallet Desk réutilise MarketPriceService +``` + +Le prompt ne transforme pas les questions d'UI/composition encore ouvertes en décisions arbitraires. `pre.001` doit notamment trancher screen map, command/DTO map, composite dédié, ownership de l'état de présentation, UX refresh, capabilities Tauri, insertion Wallet Desk et stratégie de gate fonctionnel/live. + +## 6. Prévision souple `0.2.12` + +Le prompt fournit un forecast initial détaillé allant de l'audit/sizing au scaffold SOL Prices Desk, composition Config, table/refresh, stabilisation standalone, intégration Wallet Desk, hardening, puis trois couloirs distincts : + +```text +gate technique/live final +réconciliation documentaire finale +préparation minimale de publication +``` + +Le forecast est explicitement recalibrable par `0.2.12-pre.001`. Si SOL Prices Desk + intégration Wallet Desk apparaît surdimensionné pour une release concrète clôturable dans la session, la frontière doit être rediscutée avant implémentation lourde plutôt que de supprimer silencieusement une partie de la mission. + +## 7. `CHANGELOG.md` + +Le changelog stable est préparé pour `0.2.11 — Off-chain price transport` avec les faits consolidés : + +```text +SOL/USD V1 +8 adapters REST sans SDK provider +MarketPriceDecimal exact +sémantiques/provenance/timestamps explicites +registry + availability + rate limits/cooldowns +refresh single/many/all séquentiel et déterministe +Config std.offchain_transport V1 +origines provider fixes et secrets Config-owned +DexScreener pair explicite sans discovery +aucun consensus/fallback/moyenne KSP +CoinMarketCap ids -> id corrigé au gate live +re-smoke keyless final 7/7 PASS +smoke keyed SKIP opérateur +prompt 0.2.12 préparé +``` + +## 8. `ROADMAP.md` + +`0.2.11` passe à l'état réalisé avec une synthèse stable correspondant au contrat réellement livré et au smoke keyless final `7/7`. + +La suite active reste : + +```text +0.2.12 SOL Prices Desk + intégration prix Wallet Desk +0.2.13 Interface foundation +0.2.14 Program API foundation +``` + +Aucune renumérotation supplémentaire n'est introduite. + +## 9. Fichiers modifiés/ajoutés + +```text +Cargo.toml +CHANGELOG.md +ROADMAP.md +prompts/017-V0_2_12_START_PROMPT.md +deltas/0.2.11/pre.013.md +``` + +Aucun autre fichier ne doit changer dans cette tranche. En particulier, `prompts/000-README.md` n'est pas mis à jour ici : c'est un README et la lane de publication minimale interdit de rouvrir les README après la réconciliation documentaire. + +## 10. Gate opérateur + +Comme cette tranche ne modifie aucun code/runtime/config/schema : + +```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.11 +cargo check --workspace +cargo clippy --workspace --all-targets +cargo test --workspace +``` + +Aucun smoke live ni `cargo tree` n'est à rejouer si le delta est appliqué exactement. + +## 11. Suite + +Si ce gate est vert, la seule étape restante est : + +```text +0.2.11-rel.001 +``` + +Elle est limitée à la mécanique de publication stable : version Cargo `0.2.11`, delta `rel.001`, commit final et tag stable `v0.2.11`, sans rattrapage technique ou documentaire. + +Après publication du tag stable, la session suivante ouvre : + +```text +0.2.12-pre.001 +``` + +avec `prompts/017-V0_2_12_START_PROMPT.md` et commence impérativement par l'audit/sizing défini dans ce prompt. diff --git a/prompts/017-V0_2_12_START_PROMPT.md b/prompts/017-V0_2_12_START_PROMPT.md new file mode 100644 index 0000000..008ce10 --- /dev/null +++ b/prompts/017-V0_2_12_START_PROMPT.md @@ -0,0 +1,1337 @@ + + + +# Prompt de démarrage `0.2.12` — SOL Prices Desk + intégration prix Wallet Desk + +## 1. Identité de la release et base exacte requise + +La base attendue est **exclusivement** la release stable : + +```text +v0.2.11 +``` + +Ne pas ouvrir `0.2.12` depuis `0.2.11-pre.*`, depuis un ZIP intermédiaire, depuis une ancienne archive de travail ni depuis un souvenir de session. + +Si une archive opérateur de `v0.2.11` est fournie au démarrage, **cette archive réelle devient la première autorité** devant les snippets, anciens prompts, anciennes archives et mémoire de conversation. Une divergence entre la base réelle et le présent prompt déclenche un audit explicite ; elle ne se résout jamais par supposition. + +La release à ouvrir est : + +```text +0.2.12 — SOL Prices Desk + intégration prix Wallet Desk +``` + +La première tranche est : + +```text +0.2.12-pre.001 +``` + +`pre.001` est obligatoirement une tranche **lecture + audit de la base + audit Tauri/frontend + screen map + DTO/command map + Config/composition + sécurité + sizing + planification**. Elle ne doit pas commencer par copier une application Tauri entière ni par coder directement le tableau de prix. + +À l'ouverture, vérifier au minimum : + +```text +git describe / tag stable si metadata Git disponible +workspace.package.version = 0.2.11 +deltas/0.2.11/rel.001.md présent +prompts/017-V0_2_12_START_PROMPT.md présent +``` + +État fonctionnel attendu depuis `v0.2.11` : + +```text +ksp-offchain-transport-lib stable +surface market_price SOL/USD uniquement +providers V1 8 REST adapters +providers keyless live 7/7 PASS au gate final +provider keyed live SKIP opérateur documenté +numeric model MarketPriceDecimal exact, pas de vérité f64 +registry / availability provider-neutral +refresh single / many / all +refresh_many/all V1 séquentiel et déterministe +rate limits/cooldowns possédés par Off-chain Transport +provider wire/endpoints privés et fixes +Config Off-chain std.offchain_transport V1 +Config -> Off-chain Transport autorisé +Off-chain Transport -> Config interdit +ksp-app-config-desk stable, gabarit Tauri de référence +ksp-app-wallet-desk stable, Config/Wallet/HTTP/Logging +SOL Prices Desk absente au démarrage +Wallet Desk price runtime absent au démarrage +``` + +--- + +## 2. Mission et résultat attendu + +`0.2.12` doit d'abord créer : + +```text +crates/ksp-app-solprices-desk +``` + +comme application Tauri spécialisée **HID et provider-agnostic**, puis intégrer la même capacité générique de prix dans : + +```text +crates/ksp-app-wallet-desk +``` + +La release ne doit pas déplacer la récupération, la normalisation, les rate limits, les cooldowns ou le dispatch provider vers Tauri ou TypeScript. + +Résultat attendu à la clôture : + +```text +ksp-app-solprices-desk existe comme package Tauri Rust lib + bin +shell desktop aligné sur le gabarit KSP actuel +ports dédiés 1434/1435 selon la règle KSP +Config compose Logging + Off-chain Transport proprement +backend construit MarketPriceService depuis ksp-config-lib +frontend ne connaît aucun provider concret +inventaire provider affiché depuis MarketPriceProviderRegistry +nom d'affichage provider issu du descriptor générique +prix SOL/USD affiché après observation valide +availability/fraîcheur/retry_at projetés sans logique provider UI +refresh individuel générique +refresh multiple/all générique +aucun sleep/token bucket/retry provider dans l'application +aucun fetch HTTP provider depuis le frontend +aucun endpoint/header/API key projeté au frontend +instrumentation frontend/Rust conforme au gabarit KSP +Wallet Desk compose à son tour Off-chain Transport +Wallet Desk expose la capacité prix sans recopier le réseau/normalisation +tests desktop/security/composition verts +builds Tauri finaux des deux applications modifiées verts +README/USAGE/plan/validation réconciliés dans le couloir documentaire +``` + +L'ordre fonctionnel de la release est volontaire : + +```text +1. valider la capacité dans SOL Prices Desk +2. stabiliser son contrat applicatif générique +3. intégrer ensuite la même capacité dans Wallet Desk +``` + +La partie Wallet Desk n'est pas un bonus facultatif. Si le sizing de `pre.001` démontre que l'ensemble est trop gros pour une release concrète clôturable dans la session, **la frontière de release doit être rediscutée explicitement avant implémentation lourde** ; il ne faut ni supprimer silencieusement l'intégration Wallet Desk ni forcer une release surdimensionnée. + +--- + +## 3. Sources de vérité internes obligatoires — ordre de lecture + +### 3.1 Règles globales + +Lire d'abord, dans cet ordre : + +```text +RULES.md +docs/000-README.md + +docs/rules/RULES_GENERAL.md +docs/rules/RULES_KSP.md +docs/rules/RULES_RUST.md +docs/rules/RULES_DEPENDENCIES.md +docs/rules/RULES_DOCUMENTATION.md +docs/rules/FILE_CONTRACTS.md +docs/rules/VERSION_WORKFLOW.md +docs/rules/PROMPT_STRUCTURE.md +``` + +Le présent prompt est autonome mais ne remplace pas les règles normatives. + +Rappels qui conditionnent directement cette release : + +```text +Rust 2024 +unsafe / unwrap / expect / panic interdits selon les règles KSP +? interdit en production +retours explicites ; clippy::implicit_return deny +#![warn(missing_docs)] +#![deny(unreachable_pub)] +#![forbid(unsafe_code)] + +pas de pub mod +pub/pub(crate) consommés crate-wide via reexports crate-root +private testé depuis unit_tests via super::Item +visibilité jamais élargie seulement pour tester +unit tests sous unit_tests/ +integration tests sous tests/ + +ksp-logging-lib possède le runtime tracing KSP +ksp-config-lib possède documents/env/secrets +applications = interface + composition +frontend -X-> logique provider/réseau +``` + +Règles desktop KSP à relire particulièrement : + +```text +KSP-APP-001..003 application mince, pas de logique réutilisable déplacée dans l'app +KSP-APP-008 Config Desk = gabarit Tauri de référence +KSP-APP-010..014 package lib+bin, main/lib/tauri/tw_* structurés +KSP-APP-015 splash lifecycle commun +KSP-APP-019 tracing via adapter Tauri, pas tauri-plugin-log/log +KSP-APP-022 Builder Tauri progressif +KSP-APP-023 frontend/, frontend/ts/, frontend/sass/, bindings générés non versionnés +KSP-APP-024 ports dédiés par paire ; prochaine paire 1434/1435 +KSP-APP-025 dependencies/devDependencies corrects +KSP-APP-026 cargo tauri exécuté depuis la crate ciblée +KSP-APP-027 instrumentation frontend systématique +KSP-APP-028 header desk cohérent +KSP-APP-029 CWD dev normalisé sans reprendre ownership Config +KSP-APP-030+ règles desktop complémentaires réellement présentes dans la base stable +``` + +Après toute modification Rust : + +```bash +cargo fmt --all +python3 scripts/audit_rust_workspace_rules.py +cargo check --workspace +cargo clippy --workspace --all-targets +``` + +Pour tout Markdown touché : + +```bash +python3 scripts/audit_markdown_tables.py README.md RULES.md ROADMAP.md CHANGELOG.md docs prompts crates deltas/0.2.12 +``` + +Une commande non exécutée n'est jamais déclarée PASS. + +### 3.2 Architecture durable à préserver + +Lire ensuite : + +```text +docs/architecture/000-README.md +docs/architecture/002-LAYERS_AND_DEPENDENCIES.md +docs/architecture/003-COMPONENT_CONTRACTS.md +docs/architecture/004-COMPONENT_INVENTORY.md +docs/architecture/005-DEPENDENCY_GRAPH.md +docs/architecture/009-ACQUISITION_WORKERS_AND_JOBS.md +docs/architecture/010-APPS_SERVICES_SCENARIOS_AND_CONTROL.md +``` + +Points acquis : + +```text +ksp-app-solprices-desk est une HID mince +elle consomme inventaire/observations/états/opérations génériques Off-chain +elle ne connaît ni providers concrets, ni endpoints, ni credentials, ni limites +ksp-offchain-transport-lib reste propriétaire des adapters/wires/rate limits/cooldowns +ksp-config-lib reste propriétaire des documents/env/secrets +Config -> Off-chain Transport autorisé +Off-chain Transport -> Config interdit +applications spécialisées avant toute app globale +aucune nouvelle crate ksp-offchain-transport-api +aucune nouvelle crate UI/service partagée sans besoin concret démontré +``` + +### 3.3 Plans, validations et clôture `0.2.11` + +Lire : + +```text +docs/plans/002-FUNCTIONAL_RELEASE_SEQUENCE.md +docs/plans/018-V0_2_11_OFFCHAIN_PRICE_TRANSPORT_PLAN.md +docs/validation/014-V0_2_11_OFFCHAIN_PRICE_TRANSPORT.md +deltas/0.2.11/rel.001.md + +crates/ksp-offchain-transport-lib/README.md +crates/ksp-offchain-transport-lib/USAGE.md +``` + +Le contrat stable `0.2.11` prime sur les hypothèses historiques de `prompts/016-V0_2_11_START_PROMPT.md` qui ont été recalibrées pendant la release. + +### 3.4 Références desktop historiques à relire + +Lire ensuite : + +```text +prompts/004-V0_1_4_START_PROMPT.md +prompts/011-V0_2_6_START_PROMPT.md + +docs/plans/006-V0_1_4_CONFIG_DESKTOP_PLAN.md +docs/validation/001-V0_1_4_CONFIG_DESKTOP.md + +docs/plans/013-V0_2_6_WALLET_DESK_PLAN.md +docs/validation/009-V0_2_6_WALLET_DESK_COMPLIANCE.md +``` + +Ces documents sont des références de patterns et de pièges déjà rencontrés ; ils ne doivent pas être copiés aveuglément si la base stable actuelle a évolué. + +### 3.5 Code réel à inventorier avant design + +Inspecter au minimum : + +```text +Cargo.toml + +crates/ksp-offchain-transport-lib/Cargo.toml +crates/ksp-offchain-transport-lib/src/lib.rs +crates/ksp-offchain-transport-lib/src/market_price_service.rs +crates/ksp-offchain-transport-lib/src/market_price_registry.rs +crates/ksp-offchain-transport-lib/src/market_price_provider.rs +crates/ksp-offchain-transport-lib/src/market_price_observation.rs +crates/ksp-offchain-transport-lib/tests/public_api.rs +crates/ksp-offchain-transport-lib/tests/release_completeness.rs +crates/ksp-offchain-transport-lib/tests/security_hardening.rs +crates/ksp-offchain-transport-lib/tests/market_price_live_smoke.rs + +crates/ksp-config-lib/src/lib.rs +crates/ksp-config-lib/src/offchain_transport.rs +crates/ksp-config-lib/src/composite.rs +crates/ksp-config-lib/src/registry.rs +crates/ksp-config-lib/src/packaging.rs +crates/ksp-config-lib/unit_tests/offchain_transport.rs +config/std.offchain_transport.json +config/schemas/std.offchain_transport.schema.json +config/composite.ksp-app-wallet-desk.json +config/schemas/composite.schema.json +.env.example + +crates/ksp-app-config-desk/Cargo.toml +crates/ksp-app-config-desk/tauri.conf.json +crates/ksp-app-config-desk/vite.config.ts +crates/ksp-app-config-desk/package.json +crates/ksp-app-config-desk/src/ +crates/ksp-app-config-desk/frontend/ +crates/ksp-app-config-desk/tests/ + +crates/ksp-app-wallet-desk/Cargo.toml +crates/ksp-app-wallet-desk/tauri.conf.json +crates/ksp-app-wallet-desk/vite.config.ts +crates/ksp-app-wallet-desk/package.json +crates/ksp-app-wallet-desk/src/app_state.rs +crates/ksp-app-wallet-desk/src/bootstrap.rs +crates/ksp-app-wallet-desk/src/transport_runtime.rs +crates/ksp-app-wallet-desk/src/wallet_balance.rs +crates/ksp-app-wallet-desk/src/tauri.rs +crates/ksp-app-wallet-desk/frontend/ +crates/ksp-app-wallet-desk/tests/ +``` + +Auditer la base telle qu'elle existe réellement. Ne pas supposer que les noms de DTO, les ressources packagées, les profils composites, le nombre de documents Config ou les versions frontend sont restés identiques à un ancien prompt. + +--- + +## 4. Sources externes à réauditer en `pre.001` + +`0.2.12` est une release d'application, pas une nouvelle release provider. Les sources externes à réauditer concernent donc en priorité le **framework desktop et ses dépendances réellement utilisées**. + +Sources Tauri officielles actuelles : + +```text +https://v2.tauri.app/ +https://v2.tauri.app/reference/config/ +https://v2.tauri.app/security/ +https://v2.tauri.app/security/capabilities/ +``` + +TS-RS : + +```text +https://github.com/Aleph-Alpha/ts-rs +``` + +Réauditer aussi les versions réellement courantes des dépendances déjà présentes dans le template avant toute mise à niveau : + +```text +tauri +tauri-build +tauri-plugin-tracing +tauri-plugin-dialog si réellement nécessaire +ts-rs +@tauri-apps/api +@tauri-apps/cli +bootstrap +datatables.net-bs5 / datatables.net-select-bs5 si réutilisés +simplebar +sass-embedded +typescript +vite +``` + +Ne pas mettre à jour une dépendance simplement parce qu'une version plus récente existe. Une mise à niveau doit correspondre à un besoin réel, être validée contre les deux Desks existantes et respecter les règles de dépendances KSP. + +Les huit providers de prix n'ont **pas** à être réaudités individuellement pour concevoir l'UI. Leur contrat est possédé par `ksp-offchain-transport-lib`. Un réaudit provider ne devient nécessaire que si une contradiction live apparaît ou si l'application demande une information qui n'existe pas dans la façade générique stable ; dans ce cas, l'écart est d'abord traité à la bonne couche, jamais par un parsing provider dans l'application. + +--- + +## 5. État validé à préserver depuis `v0.2.11` + +### 5.1 Off-chain Transport + +Préserver exactement : + +```text +SOL/USD V1 +8 providers configurables +MarketPriceProviderId opaque +MarketPriceProviderDescriptor générique +MarketPriceProviderRegistry / Entry +MarketPriceProviderState +MarketPriceProviderAvailability +MarketPriceObservation +MarketPriceDecimal exact +MarketPriceSemantics explicite +MarketPriceRefreshOutcome +MarketPriceService::registry +MarketPriceService::refresh +MarketPriceService::refresh_many +MarketPriceService::refresh_all +``` + +Le service V1 : + +```text +ne sleep pas pour attendre un provider +ne fait aucun fallback +ne fait aucun consensus +ne fait aucune moyenne +valide les sélections many avant dispatch +préserve un ordre déterministe +normalise les échecs provider en availability générique +``` + +Aucune app ne doit contourner ce contrat. + +### 5.2 Config + +Préserver : + +```text +cfg.std.offchain_transport +schema.std.offchain_transport +format_version = 1 +profile public_keyless +profile all_free +ResolvedOffchainTransportConfig +ConfigDocumentEngine -> resolved offchain config +Config seul propriétaire des credentials KSP_SECRET_* +DexScreener pair via provenance Public +origines/rate limits non configurables par l'application +``` + +### 5.3 Gabarit Tauri + +La base stable possède déjà : + +```text +ksp-app-config-desk ports 1430/1431 +ksp-app-wallet-desk ports 1432/1433 +``` + +La règle KSP réserve donc naturellement au nouveau desk : + +```text +ksp-app-solprices-desk ports 1434/1435 +``` + +Le couple exact doit être vérifié dans la base stable au gate `pre.001`, mais il ne doit pas être changé arbitrairement si aucune collision documentée n'existe. + +Préserver les patterns actuels : + +```text +package Rust lib + bin +main.rs launcher mince +lib.rs déclarations/réexports +command wrappers centralisés dans tauri.rs +modules tw_* par fenêtre +splash commun +frontend/ts + frontend/sass +TS-RS depuis DTO Rust +bindings générés non versionnés +Vite strictPort +cargo tauri dev/build exécuté depuis la crate +runtime distribué indépendant du checkout source +Config resources packagées et racine writable préparée via ksp-config-lib +``` + +### 5.4 Wallet Desk + +Wallet Desk reste propriétaire uniquement de sa composition/UI Wallet. Préserver : + +```text +Wallet secrets jamais projetés au frontend +Wallet VIEW/OWNER lifecycle inchangé +balance SOL via On-chain Transport inchangée +Config composite comme source de sélection de composants +pas de client HTTP provider direct +pas de secrets provider lus directement par l'application +``` + +L'intégration prix doit être additive et ne doit pas dégrader les canaris sécurité Wallet existants. + +--- + +## 6. Décisions acquises — ne pas redébattre sans contradiction réelle + +```text +nom de l'app : ksp-app-solprices-desk +rôle : HID/provider-agnostic uniquement +surface : SOL/USD V1 existante +Off-chain Transport reste propriétaire des providers/wires/endpoints/rate limits +Config reste propriétaire des credentials et documents +aucun provider concret hardcodé dans Rust applicatif ou TypeScript +un provider_id opaque peut circuler comme identifiant générique +le display name vient du descriptor générique +la table est construite depuis le registry générique +refresh ligne -> MarketPriceService::refresh +refresh sélection/multiple -> MarketPriceService::refresh_many +refresh all -> MarketPriceService::refresh_all +cooldown/availability/retry_at viennent des états génériques +aucun sleep/retry/token bucket dans l'app +aucun fetch provider depuis le frontend +aucun SDK provider dans l'app +aucun endpoint/header/API key exposé à l'UI +Wallet Desk doit réutiliser la même capacité dans cette release +aucune duplication récupération/normalisation dans Wallet Desk +Config Desk reste le gabarit Tauri de référence +ports attendus du nouveau desk : 1434/1435 +``` + +La phrase « aucun provider concret hardcodé » interdit par exemple : + +```text +if provider == "coingecko" +match "kraken" +bouton Birdeye codé en dur +URL api.jup.ag dans l'app +header x-api-key dans l'app +cadence 1 RPS codée dans l'app +``` + +Elle n'interdit pas d'afficher les noms que le descriptor générique fournit à runtime. + +--- + +## 7. Questions réellement ouvertes à trancher pendant `pre.001` + +### 7.1 Config/composite de SOL Prices Desk + +Auditer et décider la composition exacte. Direction attendue à confirmer : + +```text +composite.ksp-app-solprices-desk + logging -> cfg.std.logging + offchain_transport -> cfg.std.offchain_transport +``` + +Questions : + +```text +file_id exact du composite +profil par défaut public_keyless ou autre profil explicitement justifié +profil(s) de test +noms des component_id +ressources Tauri à embarquer +réutilisation du schema composite existant sans nouveau schema inutile +``` + +Ne pas créer un nouveau format Config si le contrat composite existant suffit. + +### 7.2 État de présentation des dernières observations + +`MarketPriceService` expose registry/state et retourne les observations via les outcomes ; il ne constitue pas un cache historique de prix. + +`pre.001` doit décider où conserver **uniquement l'état de présentation courant** nécessaire à l'UI : + +```text +backend Tauri en mémoire +frontend en mémoire +projection hybride strictement justifiée +``` + +Ne pas modifier Off-chain Transport uniquement pour faire office de store UI si le besoin peut rester applicatif. Ne jamais persister automatiquement les prix dans Config ou localStorage. + +### 7.3 Screen map SOL Prices Desk + +Définir au minimum : + +```text +splash +main shell +table providers/prix +états loading/empty/error +refresh row +refresh selected/multiple si sélection retenue +refresh all +runtime/config diagnostics nécessaires +``` + +Réutiliser le langage visuel KSP existant. Ne pas ajouter un dashboard complexe sans besoin. + +### 7.4 DTO/command map + +Définir des DTO applicatifs génériques, par exemple autour de : + +```text +provider_id opaque +provider_display_name +pair +price optionnelle +semantics si utile à l'affichage +auth capability générique si utile +availability +provider_timestamp optionnel +requested_at / received_at +retry_at optionnel +refreshed bool +``` + +Les noms exacts sont à décider après audit du code réel. Les DTO ne transportent jamais : + +```text +API key +header auth +endpoint URL +provider-specific wire +raw response body +rate-limit internal bucket state +``` + +### 7.5 Refresh UX + +Décider : + +```text +comportement du bouton row pendant une requête +comportement d'un batch partiellement indisponible +tri/stabilité des lignes +projection de CoolingDown / AuthenticationUnavailable / Misconfigured / TemporarilyUnavailable / Disabled +affichage de retry_at +message lorsque provider_timestamp est absent +``` + +Ne pas inventer de compte à rebours réseau actif ou de scheduler dans le frontend. + +### 7.6 Auto-refresh + +Le scope acquis exige du refresh utilisateur individuel/multiple. Un polling périodique automatique n'est **pas** acquis. + +`pre.001` doit décider s'il reste explicitement hors scope. S'il est proposé, il doit être dimensionné séparément avec ownership backend clair, respect du service/rate-limit et arrêt propre avec le lifecycle Tauri. Il ne doit jamais être ajouté par simple `setInterval` frontend. + +### 7.7 Intégration Wallet Desk + +Définir précisément le premier usage utile sans transformer Wallet Desk en Market Desk. + +MVP recommandé à auditer : + +```text +petit panneau SOL/USD provider-neutral +état/fraîcheur génériques +refresh générique +option de choisir/afficher plusieurs observations selon l'UX retenue +``` + +Une **valorisation USD du solde Wallet** n'est pas automatiquement acquise. Si elle est retenue, `pre.001` doit trancher : + +```text +numeric ownership +arithmétique exacte lamports x MarketPriceDecimal +arrondi d'affichage uniquement +absence de faux consensus entre providers +sens exact d'une valeur USD lorsqu'il existe plusieurs prix +``` + +Ne jamais prendre arbitrairement le premier provider comme « prix canonique KSP ». + +### 7.8 Mutualisation entre les deux applications + +La récupération/normalisation est déjà mutualisée dans `ksp-offchain-transport-lib`. + +Ne pas créer préventivement une nouvelle crate `ksp-market-price-ui-lib` ou un service global. `pre.001` doit seulement identifier les duplications réellement problématiques après dessin des deux command/DTO maps. Un helper partagé n'est introduit que si un contrat réutilisable réel apparaît. + +### 7.9 Tauri capabilities/plugins + +Auditer les capabilities réellement nécessaires au nouveau desk et à Wallet Desk après intégration. + +Objectif : + +```text +surface IPC minimale +aucun filesystem/network plugin frontend inutile +aucun plugin dialog si le Price Desk n'en a pas besoin +tracing adapter uniquement selon le gabarit +aucune permission copiée sans usage +``` + +### 7.10 Packaging et build + +Vérifier : + +```text +frontendDist hors source +resources Config/schemas nécessaires +package versions cohérentes +productName / identifier +icons +bundle targets +beforeDevCommand / beforeBuildCommand crate-local +CWD dev/release correct +aucun lancement du backend d'une autre app +``` + +Le dernier point doit être canarisé : le nouveau desk ne doit jamais lancer le backend Wallet Desk par erreur de copie de configuration. + +--- + +## 8. Objectifs et livrables de `0.2.12` + +### 8.1 SOL Prices Desk + +Livrer : + +```text +package ksp-app-solprices-desk +Cargo/lib/bin/build.rs/tauri.conf/vite/package frontend +splash + main shell +logging frontend/Rust +Config bootstrap/composition +MarketPriceService runtime +provider registry projection +price row DTO +refresh row +refresh many/all +availability/freshness/retry projection +safe error DTO +security/dependency canaries +Tauri resources/package canaries +README/USAGE durables +``` + +### 8.2 Wallet Desk + +Livrer : + +```text +composition Off-chain Transport via Config +runtime MarketPriceService +DTO/commands provider-neutral +surface UI prix bornée +refresh générique +non-régression balance Wallet +non-régression VIEW/OWNER/secrets +aucune logique provider dupliquée +README/USAGE réconciliés si nécessaire +``` + +### 8.3 Config + +Si un composite SOL Prices Desk est retenu : + +```text +document composite dédié +registry Config synchronisé +packaged runtime synchronisé +resources des applications synchronisées +tests de sélection file_id/profile +``` + +Ne pas modifier `std.offchain_transport` sauf besoin réel démontré par une lacune du contrat stable. + +### 8.4 Validation + +Créer un plan et une matrice dédiés `0.2.12` pendant `pre.001`, avec au minimum : + +```text +screen/feature matrix +DTO/command matrix +Config/composite matrix +security matrix +provider-agnostic boundary matrix +Wallet integration matrix +Tauri/package matrix +live/functional gate matrix +``` + +--- + +## 9. Hors périmètre explicite + +Sauf décision opérateur explicite après découverte d'un blocage architectural : + +```text +nouveau provider de prix +modification des huit adapters V1 +SOL/EUR +prix SPL arbitraires +OHLCV / historique +websocket/SSE de prix +consensus/moyenne/fallback automatique +pool discovery DexScreener +auto-sélection d'un provider canonique +Market Desk trading +quote/routing Jupiter +transaction construction/signature/submission +Store/persistence historique des prix +worker de prix +job de prix +application globale KSP +éditeur Config provider dans SOL Prices Desk +nouvelle crate API/UI générique spéculative +``` + +Un polling automatique périodique reste hors scope par défaut tant que `pre.001` ne l'a pas explicitement retenu et dimensionné. + +--- + +## 10. Contraintes sécurité, API et architecture spécifiques + +### 10.1 Frontend + +Interdictions : + +```text +fetch/XMLHttpRequest vers provider +URL provider codée en TypeScript +API key/header provider en DTO +provider-specific branch +localStorage/sessionStorage pour secrets +lecture directe filesystem Config +lecture directe .env +``` + +Le frontend peut conserver un état UI non sensible en mémoire si `pre.001` le retient. + +### 10.2 Commands Tauri + +Les commands reçoivent seulement les inputs applicatifs nécessaires, par exemple un `provider_id` opaque ou une liste bornée d'IDs. Elles ne reçoivent jamais : + +```text +endpoint URL +header name/value +API key +rate-limit override +raw request body provider +``` + +Toute validation de provider ID passe par les contrats Off-chain Transport. + +### 10.3 Secrets + +Les credentials restent : + +```text +Config document -> Environment resolution -> ResolvedOffchainTransportConfig -> MarketPriceService +``` + +Ils ne sont jamais projetés dans : + +```text +frontend +TS-RS bindings +logs +Debug +error DTO +runtime status DTO +local/session storage +``` + +### 10.4 Provider semantics + +La présence de plusieurs prix SOL/USD ne crée aucun prix canonique KSP. + +L'application peut afficher plusieurs observations et leur `MarketPriceSemantics`. Elle ne doit pas fusionner silencieusement : + +```text +AggregatedMarket +ExchangeLastTrade +SolanaHeuristic +SolanaSpot +DexPairUsd +``` + +ou toute variante réellement présente dans la base stable. + +### 10.5 Logging + +Réutiliser le bridge frontend commun et `ksp-logging-lib` côté Rust. + +Tracer : + +```text +action refresh demandée +provider_id générique +nombre d'IDs d'un batch +transition UI significative +succès/échec classifié par code KSP +``` + +Ne jamais tracer : + +```text +API key +raw provider body +header auth +endpoint credentialisé +payload Wallet protégé +``` + +--- + +## 11. Première mission `0.2.12-pre.001` — gate obligatoire + +### 11.1 Baseline stable + +Avant toute modification lourde : + +```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 --workspace +``` + +Si `deltas/0.2.12` n'existe pas encore, adapter uniquement le chemin Markdown sans considérer cela comme une erreur de la base. + +### 11.2 Audit interne + +Produire un inventaire réel de : + +```text +surface publique ksp-offchain-transport-lib +surface ResolvedOffchainTransportConfig +registry Config et composite existants +patterns AppState/runtime des deux Desks +commands/DTOs Tauri actuels +frontend shell/splash/logging +capabilities/plugins +resources packagées +ports et CWD +build outputs +``` + +### 11.3 Audit externe desktop + +Vérifier les sources officielles actuelles Tauri/TS-RS et les versions réellement résolues si une dépendance doit être ajoutée ou mise à jour. + +Ne pas faire un upgrade global par inertie. + +### 11.4 Screen map + +Dessiner le parcours SOL Prices Desk et le point d'insertion Wallet Desk. + +Au minimum : + +```text +SOL Prices Desk splash -> main -> table -> row refresh -> multi/all refresh +Wallet Desk existing shell -> price surface -> generic refresh +``` + +### 11.5 DTO/command map + +Lister chaque command envisagée, ses inputs, son output, son propriétaire et son niveau de sensibilité. + +Prouver qu'aucun DTO ne nécessite un type provider-specific. + +### 11.6 Config/composition map + +Décider : + +```text +composite SOL Prices Desk oui/non +component ids +file ids +profiles +resources +bootstrap +Wallet Desk composite extension +``` + +### 11.7 Threat model desktop + +Couvrir au minimum : + +```text +frontend compromis tentant de choisir une URL arbitraire +frontend compromis tentant d'obtenir API key/header +provider_id arbitraire/inconnu +batch oversized/duplicate +spam refresh / rate limit +cooldown non expiré +provider unavailable +raw error body hostile +stale observation affichée comme fraîche +race double-click refresh +fermeture fenêtre pendant refresh +CWD/resource confusion entre applications +capabilities Tauri trop larges +logs frontend révélant des valeurs sensibles +``` + +### 11.8 Wallet integration audit + +Prouver comment Wallet Desk réutilisera `MarketPriceService` sans : + +```text +copier un adapter +copier un parser +copier un rate limiter +faire un fetch TS +choisir un provider canonique +coupler Wallet à un wire provider +``` + +### 11.9 Tests et live gate + +Décider les gates exacts : + +```text +unit/app tests +integration Config composition +desktop contract/security +TS-RS export +frontend build via Tauri +Tauri dev parcours fonctionnel +Tauri production build +smoke live keyless de composition si utile +``` + +Le smoke provider `0.2.11` existe déjà. `0.2.12` n'a pas à dupliquer un audit provider ; un éventuel smoke live doit prouver la **composition applicative générique**, pas tester une nouvelle fois chaque wire provider pour le principe. + +### 11.10 Sizing + +Chaque tranche intermédiaire doit rester approximativement dans le budget KSP de 15–20 minutes de travail effectif. Si une tranche est manifestement plus grosse, la scinder. + +La release concrète doit rester raisonnablement clôturable dans une session. Si le sizing contredit cette contrainte, le signaler avant `pre.002`. + +### 11.11 Documents de sortie + +`pre.001` doit produire au minimum : + +```text +docs/plans/.md +docs/validation/.md +deltas/0.2.12/pre.001.md +``` + +avec forecast souple recalibré. + +### Critères de sortie de `pre.001` + +Le gate est franchi seulement si : + +```text +base v0.2.11 vérifiée +règles/architecture relues +baseline verte ou écarts documentés +gabarit Config/Wallet Desk audité +surface Off-chain/Config réelle inventoriée +screen map écrite +DTO/command map écrite +Config/composite map écrite +threat model écrit +Wallet integration map écrite +dépendances desktop auditées si concernées +stratégie tests/build/live écrite +forecast recalibré +scope clôturable confirmé ou redécoupage explicitement proposé +``` + +Une simple discussion de design en chat ne ferme pas `pre.001`. + +--- + +## 12. Prévision souple initiale des prereleases + +Point de départ à recalibrer par `pre.001` : + +```text +pre.001 audit/sizing/screen map/DTO-command map/Config/security/Wallet integration map +pre.002 scaffold ksp-app-solprices-desk + package Tauri + shell/splash/logging + ports 1434/1435 +pre.003 Config/composite SOL Prices Desk + bootstrap ResolvedOffchainTransportConfig + MarketPriceService +pre.004 registry/provider rows + DTOs génériques + état initial/empty/loading +pre.005 refresh individuel + observation/availability/fraîcheur + erreurs sûres +pre.006 refresh selected/many/all + ordre déterministe + cooldown/retry projection +pre.007 frontend UX/polish/instrumentation + responsive/table lifecycle +pre.008 tests intégration/security/package + parcours fonctionnel SOL Prices Desk +pre.009 Wallet Desk composite + runtime Off-chain Transport +pre.010 Wallet Desk DTO/commands prix provider-neutral +pre.011 Wallet Desk UI prix + refresh + non-régression balance/VIEW/OWNER +pre.012 hardening cross-app + capabilities/resources + completeness +pre.013 gate technique/live final + builds Tauri finaux des apps modifiées +pre.014 réconciliation documentaire finale +pre.015 prompt suivant + CHANGELOG + ROADMAP uniquement +rel.001 publication stable v0.2.12 +``` + +Cette prévision est **souple**. Elle peut recevoir des tranches/fixes supplémentaires. + +Les trois responsabilités de fermeture restent obligatoirement séparées : + +```text +gate technique/live +réconciliation documentaire +préparation minimale de publication +``` + +Un `fix` reste local à la responsabilité de sa tranche. + +--- + +## 13. Versionnement, deltas, commits, archives et tags + +Version Cargo : + +```text +0.2.12-pre.1 +0.2.12-pre.2 +... +0.2.12-pre.N.fix.M +``` + +Deltas : + +```text +deltas/0.2.12/pre.001.md +deltas/0.2.12/pre.002.md +... +deltas/0.2.12/pre.NNN-fix.MMM.md +deltas/0.2.12/rel.001.md +``` + +Commits : + +```text +v0.2.12-pre.001 +v0.2.12-pre.002 +v0.2.12-pre.NNN-fix.MMM +v0.2.12-rel.001 +``` + +Aucun tag Git prerelease. + +Seule la publication stable crée : + +```text +v0.2.12 +``` + +Les archives d'échange restent : + +```text +ksp-general-.zip +``` + +et contiennent uniquement les fichiers ajoutés/modifiés du delta correspondant. + +Une modification code/build/runtime/config ajoute le signal Cargo approprié. Une correction purement documentaire suit `VERSION_WORKFLOW.md` et ne force pas artificiellement un bump technique de type fix. + +--- + +## 14. Validation opérateur et commandes Tauri + +Après chaque tranche Rust : + +```bash +cargo fmt --all +python3 scripts/audit_rust_workspace_rules.py +cargo check --workspace +cargo clippy --workspace --all-targets +``` + +Puis tests ciblés selon la tranche. + +Commandes applicatives : + +```bash +(cd crates/ksp-app-solprices-desk && cargo tauri dev) +(cd crates/ksp-app-solprices-desk && cargo tauri build) + +(cd crates/ksp-app-wallet-desk && cargo tauri dev) +(cd crates/ksp-app-wallet-desk && cargo tauri build) +``` + +Ne pas utiliser : + +```text +cargo tauri dev -c crates/.../tauri.conf.json +``` + +comme sélecteur de crate. + +Aux gates globaux : + +```bash +python3 scripts/audit_markdown_tables.py README.md RULES.md ROADMAP.md CHANGELOG.md docs prompts crates deltas/0.2.12 +cargo test --workspace +``` + +Si le graphe de dépendances des apps change : + +```bash +cargo tree -p ksp-app-solprices-desk --edges normal +cargo tree -p ksp-app-wallet-desk --edges normal +cargo tree --duplicates +``` + +Ne jamais déclarer un build Tauri ou un parcours `tauri dev` PASS s'il n'a pas été réellement exécuté. + +--- + +## 15. Tests attendus + +### 15.1 SOL Prices Desk + +Au minimum : + +```text +package/lib/bin contract +ports 1434/1435 stricts +beforeDevCommand/beforeBuildCommand crate-local +wrong-backend launch regression +splash/main lifecycle +Config composite selection +resolved offchain profile +registry row mapping +provider_id opaque roundtrip +refresh row +refresh many/all +unknown provider id +batch duplicate/oversized +availability variants +retry_at projection +provider timestamp absent/present +price exact -> display string sans f64 canonique +error DTO safe +Debug safe +frontend no direct network/provider URLs +capabilities/plugins minimaux +resources packagées +TS-RS exports +public run entry point +``` + +### 15.2 Wallet Desk + +Au minimum : + +```text +composite inclut offchain component si retenu +Off-chain runtime construit via Config +price command générique +aucun provider branch +aucun secret/API key DTO +balance SOL non régressée +VIEW/OWNER/security non régressés +frontend price surface sans fetch direct +release compliance resources mis à jour +``` + +### 15.3 Cross-app + +```text +same generic service contracts +no provider URLs in app sources +no provider SDK in app manifests +no direct reqwest/provider HTTP in app logic +no Config reverse dependency +no secret logging +workspace logging ownership +packaged runtime config completeness +``` + +### 15.4 Frontend/Tauri + +Le gate final doit inclure les builds réellement concernés : + +```bash +(cd crates/ksp-app-solprices-desk && cargo tauri build) +(cd crates/ksp-app-wallet-desk && cargo tauri build) +``` + +Les builds Tauri de production restent les dernières opérations lourdes du couloir technique avant la réconciliation documentaire. + +--- + +## 16. Critères de clôture de `0.2.12` + +La release peut devenir stable seulement si : + +```text +SOL Prices Desk existe et suit le gabarit KSP +ports/cwd/package/build corrects +Config compose Off-chain sans fuite de secret +UI construite depuis registry générique +aucun provider concret hardcodé dans l'app +refresh individuel fonctionne +refresh multiple/all fonctionne +availability/fraîcheur/retry_at correctement projetés +aucune logique de rate limiting dans Tauri/frontend +aucun provider HTTP direct frontend/app +aucun endpoint/header/API key projeté au frontend +Wallet Desk intègre la capacité générique +aucune duplication récupération/normalisation Wallet Desk +balance Wallet et lifecycle VIEW/OWNER non régressés +security/dependency/completeness canaries verts +workspace complet vert +build Tauri SOL Prices Desk vert +build Tauri Wallet Desk vert après intégration +smoke/live de composition retenu par pre.001 exécuté ou bloc externe précisément documenté +README/USAGE/plan/validation réconciliés dans la prerelease documentaire dédiée +prompt 0.2.13 finalisé uniquement dans la dernière prerelease +CHANGELOG/ROADMAP finalisés uniquement dans la dernière prerelease +aucun rattrapage technique/documentaire dans rel.001 +``` + +Le numéro de prerelease n'est jamais un critère de clôture. + +--- + +## 17. Release/session suivante envisagée + +La release suivante active est : + +```text +0.2.13 — Interface foundation +``` + +Direction actuellement décidée : + +```text +introduire ksp-interface-lib +façade wire officielle KSP +API wire publique utilisable par implémentations officielles et externes +pas de ksp-interface-api séparée pour l'instant +``` + +Elle devra être réauditée et dimensionnée indépendamment après publication stable de `v0.2.12`. + +Ensuite : + +```text +0.2.14 — Program API foundation +``` + +Ne pas anticiper Interface/Program dans `0.2.12`. + +--- + +## 18. Instruction d'ouverture + +Au début de la session `0.2.12` : + +1. confirmer la base stable `v0.2.11` ou l'archive stable autoritaire ; +2. vérifier `workspace.package.version = 0.2.11` et `deltas/0.2.11/rel.001.md` ; +3. lire les règles puis l'architecture dans l'ordre de la section 3 ; +4. relire plan/validation/README/USAGE `0.2.11` ; +5. relire les références Config Desk et Wallet Desk ; +6. exécuter la baseline avant modification lourde ; +7. auditer les surfaces publiques réelles Off-chain/Config ; +8. auditer le gabarit Tauri actuel, ses ports, CWD, resources, capabilities et dépendances ; +9. produire screen map SOL Prices Desk + insertion Wallet Desk ; +10. produire DTO/command map et prouver l'absence de type/wire provider dans l'app ; +11. produire Config/composite map ; +12. décider ownership de l'état de présentation des dernières observations ; +13. auditer le threat model frontend/IPC/credentials/rate-limit ; +14. décider le gate fonctionnel/live et les builds Tauri ; +15. dimensionner chaque tranche et recalibrer la prévision souple ; +16. créer plan, validation et `deltas/0.2.12/pre.001.md` ; +17. **ne pas copier une app complète ni commencer le tableau/refresh avant que ce gate soit cohérent**. + +La première réponse de travail de la nouvelle session doit donc être un **audit/sizing `0.2.12-pre.001` complet**, avec screen map, DTO/commands, Config/composition, sécurité et forecast recalibré — pas un scaffold Tauri déjà figé.