Files
khadhroony-solana-project/prompts/017-V0_2_12_START_PROMPT.md
2026-08-26 17:41:00 +02:00

1338 lines
38 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!-- file: prompts/017-V0_2_12_START_PROMPT.md -->
<!-- version: 1 -->
# 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 1520 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/<nouveau-plan-0.2.12>.md
docs/validation/<nouvelle-validation-0.2.12>.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-<delivery-id>.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é.