# Delta `0.2.12-pre.007` — UX et instrumentation SOL Prices Desk ## 1. Identité ```text release : 0.2.12 tranche : pre.007 version Cargo : 0.2.12-pre.7 base : 0.2.12-pre.6 ``` Le gate opérateur de `pre.006` est intégralement propre : audits Rust/Markdown, `cargo check --workspace`, Clippy, `cargo test -p ksp-app-solprices-desk`, `cargo test --workspace` et lancement `cargo tauri dev` passent. Le parcours manuel confirme également le fonctionnement du multi-refresh. ## 2. Scope réalisé `pre.007` finalise l'ergonomie du SOL Prices Desk sans modifier les contrats de dispatch Off-chain : ```text résumé états providers Providers / Ready / Observed / Attention / Refreshing table responsive + header sticky + scroll horizontal borné colonnes secondaires Semantics/Auth adaptatives availability badges génériques provider-neutral prix String exacte inchangée timestamps rendu humain + millisecondes exactes provider timestamp absent Not supplied, jamais remplacé par received_at sélection row + select all + clear selection refresh row / selected / all inchangés nouvelle commande IPC aucune ``` ## 3. Lisibilité et fraîcheur La table ne transforme pas la vérité métier : - le prix exact reste la `String` canonique fournie par `MarketPriceDecimal` ; - aucun `parseFloat` ni `Number(provider.price)` n'est introduit ; - les millisecondes exactes restent visibles pour les timestamps ; - une présentation locale/ISO est calculée uniquement pour l'affichage temporel, après validation d'une valeur entière compatible `Date` ; - `provider_timestamp = None` est rendu comme `Not supplied` ; - `received_at` reste une ligne KSP distincte ; - `retry_at` est affiché séparément lorsqu'il existe ; - `loading` ne remplace pas l'availability persistée : il devient uniquement le badge visuel temporaire `Refreshing`. ## 4. Interactions frontend La sélection gagne deux contrôles purement locaux : ```text select all providers clear selection ``` Ils ne déclenchent aucun appel réseau et ne créent aucun état persistant navigateur. Le master checkbox expose les états `checked`/`indeterminate` à partir de la sélection courante. Les boutons batch restent désactivés pendant une opération visible `loading`. ## 5. Instrumentation Le bridge Logging couvre désormais l'ensemble des contrôles : ```text navigation/view activation debug sélection row debug + provider_id opaque + bool select all debug + selectedCount clear selection debug + selectedCount Refresh row debug + provider_id opaque Refresh selected debug + selectedCount Refresh all debug + providerCount IPC request/completion debug / trace rendu table trace + row/observed/attention counts échec frontend warn sans payload métier échec command backend warn + command/error_domain/error_code ``` Aucun prix, timestamp, body provider, URL, header, API key, credential ou DTO complet n'est journalisé. ## 6. Canaris Les canaris `pre.007` vérifient : - présence du résumé, du master select, de `Clear selection`, du header sticky et des styles responsive ; - projection des états génériques actuels sans branche provider spécifique ; - absence de coercition flottante du prix ; - distinction explicite entre provider timestamp et KSP receipt timestamp ; - instrumentation de tous les contrôles utilisateur ; - projection backend des erreurs limitée à `command`, `error_domain` et `error_code` ; - absence de `fetch`, `XMLHttpRequest`, `localStorage`, `sessionStorage`, `setInterval`, `setTimeout` et `requestAnimationFrame` dans le frontend prix. ## 7. Hors scope confirmé ```text hardening hostile batch/package final pre.008 Wallet Desk Off-chain runtime pre.009 Wallet Desk price DTO/commands pre.010 Wallet Desk price UI pre.011 auto-refresh / polling OUT 0.2.12 prix canonique / fallback / moyenne OUT 0.2.12 valorisation USD Wallet OUT 0.2.12 ``` ## 8. Gate À exécuter par l'opérateur : ```bash cargo fmt --all python3 scripts/audit_rust_workspace_rules.py python3 scripts/audit_markdown_tables.py README.md RULES.md ROADMAP.md CHANGELOG.md docs prompts crates deltas/0.2.12 cargo check --workspace cargo clippy --workspace --all-targets cargo test -p ksp-app-solprices-desk cargo test --workspace (cd crates/ksp-app-solprices-desk && cargo tauri dev) ```