38 KiB
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 :
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 :
0.2.12 — SOL Prices Desk + intégration prix Wallet Desk
La première tranche est :
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 :
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 :
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 :
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 :
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 :
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 :
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 :
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 :
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 :
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 :
cargo fmt --all
python3 scripts/audit_rust_workspace_rules.py
cargo check --workspace
cargo clippy --workspace --all-targets
Pour tout Markdown touché :
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 :
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 :
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 :
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 :
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 :
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 :
https://v2.tauri.app/
https://v2.tauri.app/reference/config/
https://v2.tauri.app/security/
https://v2.tauri.app/security/capabilities/
TS-RS :
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 :
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 :
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 :
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 :
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à :
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 :
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 :
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 :
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
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 :
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 :
composite.ksp-app-solprices-desk
logging -> cfg.std.logging
offchain_transport -> cfg.std.offchain_transport
Questions :
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 :
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 :
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 :
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 :
API key
header auth
endpoint URL
provider-specific wire
raw response body
rate-limit internal bucket state
7.5 Refresh UX
Décider :
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 :
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 :
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 :
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 :
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 :
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 :
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 :
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 :
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 :
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 :
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 :
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 :
Config document -> Environment resolution -> ResolvedOffchainTransportConfig -> MarketPriceService
Ils ne sont jamais projetés dans :
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 :
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 :
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 :
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 :
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 :
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 :
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 :
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 :
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 :
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 :
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 :
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 :
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 :
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 :
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 :
0.2.12-pre.1
0.2.12-pre.2
...
0.2.12-pre.N.fix.M
Deltas :
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 :
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 :
v0.2.12
Les archives d'échange restent :
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 :
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 :
(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 :
cargo tauri dev -c crates/.../tauri.conf.json
comme sélecteur de crate.
Aux gates globaux :
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 :
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 :
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 :
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
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 :
(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 :
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 :
0.2.13 — Interface foundation
Direction actuellement décidée :
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 :
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 :
- confirmer la base stable
v0.2.11ou l'archive stable autoritaire ; - vérifier
workspace.package.version = 0.2.11etdeltas/0.2.11/rel.001.md; - lire les règles puis l'architecture dans l'ordre de la section 3 ;
- relire plan/validation/README/USAGE
0.2.11; - relire les références Config Desk et Wallet Desk ;
- exécuter la baseline avant modification lourde ;
- auditer les surfaces publiques réelles Off-chain/Config ;
- auditer le gabarit Tauri actuel, ses ports, CWD, resources, capabilities et dépendances ;
- produire screen map SOL Prices Desk + insertion Wallet Desk ;
- produire DTO/command map et prouver l'absence de type/wire provider dans l'app ;
- produire Config/composite map ;
- décider ownership de l'état de présentation des dernières observations ;
- auditer le threat model frontend/IPC/credentials/rate-limit ;
- décider le gate fonctionnel/live et les builds Tauri ;
- dimensionner chaque tranche et recalibrer la prévision souple ;
- créer plan, validation et
deltas/0.2.12/pre.001.md; - 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é.