# 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é.