From 8130e01b70275d878477964d4673564a882c2830 Mon Sep 17 00:00:00 2001 From: SinuS Von SifriduS Date: Thu, 3 Sep 2026 16:28:13 +0200 Subject: [PATCH] v0.3.8-pre.006-fix.001 --- Cargo.toml | 4 +- crates/ksp-app-store-desk/src/dto_common.rs | 6 +-- .../src/frontend_logging.rs | 4 +- crates/ksp-app-store-desk/src/splash.rs | 6 +-- .../ksp-app-store-desk/src/store_runtime.rs | 18 ++++---- crates/ksp-app-store-desk/src/tw_main.rs | 6 +-- crates/ksp-app-store-desk/src/tw_splash.rs | 7 ++- .../tests/dependency_boundary.rs | 37 ++++++++++++++- deltas/0.3.8/pre.006-fix.001.md | 46 +++++++++++++++++++ docs/plans/029-V0_3_8_STORE_DESK_PLAN.md | 6 ++- docs/validation/025-V0_3_8_STORE_DESK.md | 28 ++++++++++- 11 files changed, 139 insertions(+), 29 deletions(-) create mode 100644 deltas/0.3.8/pre.006-fix.001.md diff --git a/Cargo.toml b/Cargo.toml index 5110466..2fb9a8b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,12 +1,12 @@ # file: Cargo.toml -# version: 456 +# version: 457 [workspace] resolver = "3" members = ["crates/ksp-app-backfill-desk", "crates/ksp-app-config-desk", "crates/ksp-app-solprices-desk", "crates/ksp-app-store-desk", "crates/ksp-app-wallet-desk", "crates/ksp-config-lib", "crates/ksp-core-lib", "crates/ksp-interface-lib", "crates/ksp-job-api", "crates/ksp-job-backfill-lib", "crates/ksp-logging-lib", "crates/ksp-offchain-transport-lib", "crates/ksp-onchain-transport-lib", "crates/ksp-program-api", "crates/ksp-store-api", "crates/ksp-store-lib", "crates/ksp-store-postgres-lib", "crates/ksp-wallet-lib"] [workspace.package] -version = "0.3.8-pre.6" +version = "0.3.8-pre.6.fix.1" edition = "2024" license = "MIT" repository = "https://git.sasedev.com/Sasedev/khadhroony-solana-project" diff --git a/crates/ksp-app-store-desk/src/dto_common.rs b/crates/ksp-app-store-desk/src/dto_common.rs index 5b720fc..037a028 100644 --- a/crates/ksp-app-store-desk/src/dto_common.rs +++ b/crates/ksp-app-store-desk/src/dto_common.rs @@ -1,5 +1,5 @@ // file: crates/ksp-app-store-desk/src/dto_common.rs -// version: 2 +// version: 3 //! Common Tauri DTOs shared by the Store Desk shell and Store runtime Overview. @@ -46,7 +46,7 @@ pub(crate) struct ShellStatusDto { /// Current implementation phase exposed by the shell. pub(crate) shell_phase: String, /// Safe startup diagnostic that caused fallback Logging, when applicable. - pub(crate) startup_diagnostic: std::option::Option, + pub(crate) startup_diagnostic: std::option::Option, } /// Backend-neutral Store runtime and health projection used by the Overview screen. @@ -57,7 +57,7 @@ pub(crate) struct StoreRuntimeStatusDto { /// Stable selected Store backend kind, when configuration resolution reached that phase. pub(crate) backend_kind: std::option::Option, /// Safe Store startup/health diagnostic, when present. - pub(crate) diagnostic: std::option::Option, + pub(crate) diagnostic: std::option::Option, /// Portable Store health code (`ready`, `not_ready`, `unavailable`, `closed`, or `unknown`). pub(crate) health_state: String, /// Applied migration version rendered as an exact decimal string. diff --git a/crates/ksp-app-store-desk/src/frontend_logging.rs b/crates/ksp-app-store-desk/src/frontend_logging.rs index deb4000..96cc902 100644 --- a/crates/ksp-app-store-desk/src/frontend_logging.rs +++ b/crates/ksp-app-store-desk/src/frontend_logging.rs @@ -1,5 +1,5 @@ // file: crates/ksp-app-store-desk/src/frontend_logging.rs -// version: 1 +// version: 2 //! KSP-owned bridge for technical log events emitted by Store Desk frontend scripts. @@ -35,7 +35,7 @@ enum FrontendLogTarget { } /// Emits one validated frontend event through the KSP Logging facade. -pub(crate) fn emit_frontend_log_event(payload: FrontendLogPayloadDto) -> ksp_core_lib::Result<()> { +pub(crate) fn emit_frontend_log_event(payload: crate::FrontendLogPayloadDto) -> ksp_core_lib::Result<()> { let level = parse_level(payload.level.as_str()); let level = match level { std::result::Result::Ok(value) => value, diff --git a/crates/ksp-app-store-desk/src/splash.rs b/crates/ksp-app-store-desk/src/splash.rs index 8ad82b1..049f34d 100644 --- a/crates/ksp-app-store-desk/src/splash.rs +++ b/crates/ksp-app-store-desk/src/splash.rs @@ -1,5 +1,5 @@ // file: crates/ksp-app-store-desk/src/splash.rs -// version: 1 +// version: 2 //! Common splash settings and frontend event contracts for Store Desk. @@ -25,7 +25,7 @@ pub(crate) struct SplashSettings { fade_out_source: ksp_config_lib::ConfigEnvironmentSource, } -impl SplashSettings { +impl crate::SplashSettings { /// Resolves splash timings through the Config-owned environment snapshot. pub(crate) fn load() -> ksp_core_lib::Result { let environment = ksp_config_lib::ConfigEnvironment::load(); @@ -144,7 +144,7 @@ pub(crate) struct SplashOrderDto { pub(crate) duration_ms: std::option::Option, } -impl SplashOrderDto { +impl crate::SplashOrderDto { /// Creates a new `SplashOrderDto` value. #[must_use] pub(crate) fn new(action: &str, message: std::option::Option<&str>, status: std::option::Option<&str>, duration_ms: std::option::Option) -> Self { diff --git a/crates/ksp-app-store-desk/src/store_runtime.rs b/crates/ksp-app-store-desk/src/store_runtime.rs index f2d8792..de3b5f9 100644 --- a/crates/ksp-app-store-desk/src/store_runtime.rs +++ b/crates/ksp-app-store-desk/src/store_runtime.rs @@ -1,5 +1,5 @@ // file: crates/ksp-app-store-desk/src/store_runtime.rs -// version: 1 +// version: 2 //! Composite-selected Store readiness, status and bounded shutdown lifecycle owned by Store Desk. @@ -9,10 +9,10 @@ pub(crate) struct StoreStartup { diagnostic: std::option::Option, network: std::option::Option, profile_id: std::option::Option, - runtime: std::option::Option, + runtime: std::option::Option, } -impl StoreStartup { +impl crate::StoreStartup { /// Builds a fresh backend-neutral runtime/health projection for the Overview screen. pub(crate) async fn status(&self) -> crate::StoreRuntimeStatusDto { let runtime = self.runtime.as_ref(); @@ -51,7 +51,7 @@ pub(crate) struct StoreRuntime { store: tokio::sync::RwLock>, } -impl StoreRuntime { +impl crate::StoreRuntime { /// Builds one fresh safe Store status from the retained facade without exposing backend connection details. pub(crate) async fn status(&self) -> crate::StoreRuntimeStatusDto { let locked = self.store.read().await; @@ -128,7 +128,7 @@ impl StoreRuntime { } /// Resolves the composite Store target, opens Store through the facade and captures one initial readiness probe. -pub(crate) async fn initialize_store(management: &ksp_config_lib::ConfigManagement) -> StoreStartup { +pub(crate) async fn initialize_store(management: &ksp_config_lib::ConfigManagement) -> crate::StoreStartup { let environment = ksp_config_lib::ConfigEnvironment::load(); let environment = match environment { std::result::Result::Ok(value) => value, @@ -189,12 +189,12 @@ pub(crate) async fn initialize_store(management: &ksp_config_lib::ConfigManageme pending_migration_count = health.pending_migration_count(), "initialized Store Desk Store from composite-managed configuration" ); - return StoreStartup { + return crate::StoreStartup { backend_kind: std::option::Option::Some(backend_kind), diagnostic: non_ready_health_diagnostic(&health), network: std::option::Option::Some(network), profile_id: std::option::Option::Some(profile_id.clone()), - runtime: std::option::Option::Some(StoreRuntime { profile_id, store: tokio::sync::RwLock::new(std::option::Option::Some(store)) }), + runtime: std::option::Option::Some(crate::StoreRuntime { profile_id, store: tokio::sync::RwLock::new(std::option::Option::Some(store)) }), }; } @@ -230,7 +230,7 @@ fn unavailable_startup( backend_kind: std::option::Option, network: std::option::Option, error: ksp_core_lib::Error, -) -> StoreStartup { +) -> crate::StoreStartup { let diagnostic = crate::CommandErrorDto::from_error(&error); ksp_logging_lib::warn!( target: crate::TRACING_TARGET, @@ -239,7 +239,7 @@ fn unavailable_startup( error_code = diagnostic.code.as_str(), "Store Desk Store readiness is unavailable; keeping desktop shell available" ); - return StoreStartup { + return crate::StoreStartup { backend_kind, diagnostic: std::option::Option::Some(diagnostic), network, diff --git a/crates/ksp-app-store-desk/src/tw_main.rs b/crates/ksp-app-store-desk/src/tw_main.rs index d7e1731..db56872 100644 --- a/crates/ksp-app-store-desk/src/tw_main.rs +++ b/crates/ksp-app-store-desk/src/tw_main.rs @@ -1,12 +1,12 @@ // file: crates/ksp-app-store-desk/src/tw_main.rs -// version: 1 +// version: 2 //! Tauri-window helpers for the Store Desk main window. use tauri::Manager; // rust-rules: trait-import -/// Crate-internal `WINDOW_LABEL_MAIN` constant. -pub(crate) const WINDOW_LABEL_MAIN: &str = "main"; +/// Private main-window label owned by this module. +const WINDOW_LABEL_MAIN: &str = "main"; /// Resolves the required main window or returns a typed error. pub(crate) fn require_main_window(manager: &impl Manager) -> ksp_core_lib::Result { diff --git a/crates/ksp-app-store-desk/src/tw_splash.rs b/crates/ksp-app-store-desk/src/tw_splash.rs index e5cb64a..44ca360 100644 --- a/crates/ksp-app-store-desk/src/tw_splash.rs +++ b/crates/ksp-app-store-desk/src/tw_splash.rs @@ -1,15 +1,14 @@ // file: crates/ksp-app-store-desk/src/tw_splash.rs -// version: 1 +// version: 2 //! Tauri-window lifecycle for the Store Desk splash window. use tauri::Emitter; // rust-rules: trait-import use tauri::Manager; // rust-rules: trait-import -/// Crate-internal splash window label. -pub(crate) const WINDOW_LABEL_SPLASH: &str = "splash"; - const SPLASH_EVENT_NAME: &str = "ksp-splash-order"; +/// Private splash-window label owned by this module. +const WINDOW_LABEL_SPLASH: &str = "splash"; /// Resolves the required splash window or returns a typed error. pub(crate) fn require_splash_window(manager: &impl Manager) -> ksp_core_lib::Result { diff --git a/crates/ksp-app-store-desk/tests/dependency_boundary.rs b/crates/ksp-app-store-desk/tests/dependency_boundary.rs index f9456fd..25759a0 100644 --- a/crates/ksp-app-store-desk/tests/dependency_boundary.rs +++ b/crates/ksp-app-store-desk/tests/dependency_boundary.rs @@ -1,5 +1,5 @@ // file: crates/ksp-app-store-desk/tests/dependency_boundary.rs -// version: 3 +// version: 4 //! Dependency-boundary tests for the Store Desk application. @@ -40,3 +40,38 @@ fn pre_006_store_open_is_owned_by_store_runtime_and_never_escapes_to_physical_sq assert!(!sources.contains(forbidden), "Store Desk leaked forbidden physical Store surface: {forbidden}"); } } + +#[test] +fn pre_006_fix_001_shared_visible_items_use_the_crate_root_facade_inside_owner_modules() { + let lib = include_str!("../src/lib.rs"); + let dto_common = include_str!("../src/dto_common.rs"); + let frontend_logging = include_str!("../src/frontend_logging.rs"); + let splash = include_str!("../src/splash.rs"); + let store_runtime = include_str!("../src/store_runtime.rs"); + let tw_main = include_str!("../src/tw_main.rs"); + let tw_splash = include_str!("../src/tw_splash.rs"); + for expected in [ + "pub(crate) use self::dto_common::CommandErrorDto;", + "pub(crate) use self::frontend_logging::FrontendLogPayloadDto;", + "pub(crate) use self::splash::SplashOrderDto;", + "pub(crate) use self::splash::SplashSettings;", + "pub(crate) use self::store_runtime::StoreRuntime;", + "pub(crate) use self::store_runtime::StoreStartup;", + ] { + assert!(lib.contains(expected), "missing Store Desk crate-root re-export: {expected}"); + } + assert!(dto_common.contains("std::option::Option")); + assert!(frontend_logging.contains("payload: crate::FrontendLogPayloadDto")); + assert!(splash.contains("impl crate::SplashSettings")); + assert!(splash.contains("impl crate::SplashOrderDto")); + assert!(store_runtime.contains("std::option::Option")); + assert!(store_runtime.contains("impl crate::StoreRuntime")); + assert!(store_runtime.contains("impl crate::StoreStartup")); + assert!(store_runtime.contains("-> crate::StoreStartup")); + assert!(store_runtime.contains("crate::StoreStartup {")); + assert!(store_runtime.contains("std::option::Option::Some(crate::StoreRuntime {")); + assert!(tw_main.contains("const WINDOW_LABEL_MAIN: &str = \"main\";")); + assert!(!tw_main.contains("pub(crate) const WINDOW_LABEL_MAIN")); + assert!(tw_splash.contains("const WINDOW_LABEL_SPLASH: &str = \"splash\";")); + assert!(!tw_splash.contains("pub(crate) const WINDOW_LABEL_SPLASH")); +} diff --git a/deltas/0.3.8/pre.006-fix.001.md b/deltas/0.3.8/pre.006-fix.001.md new file mode 100644 index 0000000..6be8fb6 --- /dev/null +++ b/deltas/0.3.8/pre.006-fix.001.md @@ -0,0 +1,46 @@ + + + +# Delta `0.3.8-pre.006-fix.001` — conformité crate-root des items visibles Store Desk + +## Base requise + +Base directe attendue : `0.3.8-pre.006`. + +## Cause + +Le gate opérateur est fonctionnellement vert mais émet un warning `unused_imports` sur `pub(crate) use self::store_runtime::StoreRuntime;`. Le réexport est correct et doit rester : le module `store_runtime` accède encore à `StoreRuntime` par nom nu, ce qui contourne la façade crate-root exigée par `RUST-IMPORT-009`, `RUST-IMPORT-012` et `RUST-API-004`. + +La revue ciblée de Store Desk identifie le même motif pour plusieurs items visibles partagés. Deux labels de fenêtre sont en outre `pub(crate)` alors qu'ils ne sont consommés que dans leur module et ne doivent donc pas être artificiellement promus. + +## Correction + +- `CommandErrorDto`, `FrontendLogPayloadDto`, `SplashSettings`, `SplashOrderDto`, `StoreStartup` et `StoreRuntime` restent réexportés par `src/lib.rs` et sont utilisés via `crate::Item` jusque dans leur module propriétaire ; +- les `impl`, signatures, champs et constructions Store runtime utilisent `crate::StoreStartup` / `crate::StoreRuntime` ; +- `WINDOW_LABEL_MAIN` et `WINDOW_LABEL_SPLASH` deviennent privés car ils sont strictement module-local ; +- `tests/dependency_boundary.rs` ajoute un canari de façade crate-root pour les items concernés. + +## Version + +```text +delivery = 0.3.8-pre.006-fix.001 +workspace.package.version = 0.3.8-pre.6.fix.1 +``` + +## Hors scope + +Aucun changement de Config composite, Store runtime, SQL, inspection RAW, migration, capability, IPC, frontend, DataTables, Logging ou lifecycle Tauri. + +## Gate requis + +```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 +cargo check --workspace +cargo clippy --workspace --all-targets +cargo test -p ksp-app-store-desk +cargo test -p ksp-config-lib +cargo test -p ksp-store-lib +cargo check -p ksp-store-lib --no-default-features +``` diff --git a/docs/plans/029-V0_3_8_STORE_DESK_PLAN.md b/docs/plans/029-V0_3_8_STORE_DESK_PLAN.md index 9883922..df354d9 100644 --- a/docs/plans/029-V0_3_8_STORE_DESK_PLAN.md +++ b/docs/plans/029-V0_3_8_STORE_DESK_PLAN.md @@ -1,5 +1,5 @@ - + # Plan v0.3.8 — Store Desk V1 RAW @@ -578,6 +578,10 @@ Même vertical slice pour Account : filtre exact `pubkey`, range slot inclusif, Créer `config/composite.ksp-app-store-desk.json`, enregistrer son `file_id` dans le registre partagé `ksp-config-lib`, propager la quinzième ressource Config aux cinq bundles Desk utilisant `prepare_packaged_runtime()`, puis brancher Store Desk sur `ksp-store-lib::Store` uniquement. Le composite sélectionne Logging `supertrace` et le profil Store homonyme `devnet`/`mainnet`/`testnet`. L'Overview et Diagnostics exposent uniquement backend logique, network, health, migration et compteurs de pool via un DTO IPC backend-neutral ; aucune URI, credential, SQL, handle physique ou byte RAW. La fermeture de la fenêtre principale déclenche une fermeture Store one-shot et bornée avant sortie Tauri. Les DataTables Transactions/Accounts restent locales et `serverSide:false` jusqu'à `pre.007`/`pre.008`. +#### pre.006-fix.001 — conformité crate-root des items visibles Store Desk + +Le gate opérateur de `pre.006` est fonctionnellement vert mais signale un warning `unused_imports` sur le réexport crate-root de `StoreRuntime`. Le réexport n'est pas supprimé : conformément à `RUST-IMPORT-009`, `RUST-IMPORT-012` et `RUST-API-004`, les items `pub`/`pub(crate)` partagés restent réexportés via `lib.rs` et sont consommés par `crate::Item`, y compris depuis leur module propriétaire. Le correctif normalise les usages Store Desk concernés (`CommandErrorDto`, `FrontendLogPayloadDto`, `SplashSettings`, `SplashOrderDto`, `StoreStartup`, `StoreRuntime`) et rend privés les deux labels de fenêtre qui n'ont aucune consommation crate-wide au lieu de les promouvoir artificiellement. Aucun comportement Config/Store/Tauri/IPC/frontend n'est modifié. + ### pre.007 — RawTransaction DataTables serverSide + détail Brancher l'unique pager DataTables via `ajax` function/Tauri invoke, mapping offset/limit/totaux, filtres Store explicites, summary rows, retention badges, détail à la demande et instrumentation. Aucun second pager. diff --git a/docs/validation/025-V0_3_8_STORE_DESK.md b/docs/validation/025-V0_3_8_STORE_DESK.md index fbb811f..71e2704 100644 --- a/docs/validation/025-V0_3_8_STORE_DESK.md +++ b/docs/validation/025-V0_3_8_STORE_DESK.md @@ -1,5 +1,5 @@ - + # Validation v0.3.8 — Store Desk V1 RAW @@ -512,3 +512,29 @@ Le smoke `cargo tauri dev` de Store Desk démarre aussi correctement ; le journa - [X] aucune migration, query métier d'inspection, détail RAW ou changement de capability Tauri n'est ajouté en `pre.006`. Le gate Cargo opérateur de `pre.006` reste à exécuter après application du delta. + +## 27. Gate opérateur `pre.006` et ouverture de `pre.006-fix.001` + +Le gate opérateur de `0.3.8-pre.6` est fonctionnellement vert : audits Rust/Markdown, `cargo check --workspace`, `cargo clippy --workspace --all-targets`, `ksp-config-lib` (128 unitaires + intégrations), `ksp-store-lib`, `--no-default-features`, Store Desk et les quatre autres Desk apps passent. Le smoke `cargo tauri dev` confirme également le composite `mainnet`, Logging `supertrace`, l'ouverture/health Store, les traces frontend et la fermeture Store bornée. + +Il subsiste toutefois un warning Rust récurrent : + +```text +warning: unused import: `self::store_runtime::StoreRuntime` + --> crates/ksp-app-store-desk/src/lib.rs +``` + +Le réexport `StoreRuntime` est requis par la règle de façade crate-root et ne doit pas être supprimé. Le défaut est inverse : le module propriétaire utilise encore le nom nu `StoreRuntime` au lieu de `crate::StoreRuntime`. La revue de conformité étendue de Store Desk relève le même motif pour plusieurs items partagés déjà réexportés : `CommandErrorDto`, `FrontendLogPayloadDto`, `SplashSettings`, `SplashOrderDto`, `StoreStartup` et `StoreRuntime`. + +`pre.006-fix.001` applique donc `RUST-IMPORT-009`, `RUST-IMPORT-012` et `RUST-API-004` dans la crate Store Desk : + +- [X] tous les items `pub`/`pub(crate)` partagés concernés restent réexportés via `lib.rs` ; +- [X] leurs usages dans leur module propriétaire passent par `crate::Item` ; +- [X] `StoreRuntime` et `StoreStartup` utilisent `crate::StoreRuntime` / `crate::StoreStartup` jusque dans les `impl`, signatures et constructions ; +- [X] les champs DTO partagés utilisent `crate::CommandErrorDto` ; +- [X] le bridge frontend prend `crate::FrontendLogPayloadDto` ; +- [X] les `impl` splash utilisent `crate::SplashSettings` et `crate::SplashOrderDto` ; +- [X] `WINDOW_LABEL_MAIN` et `WINDOW_LABEL_SPLASH`, utilisés exclusivement dans leur module, redeviennent privés au lieu d'être `pub(crate)` sans façade crate-root ; +- [X] un canari `dependency_boundary` verrouille ces chemins et la distinction item partagé / helper local privé. + +Aucun composite Config, Store runtime, query, SQL, DTO wire, commande Tauri, frontend, DataTables ou comportement de fermeture n'est modifié.