From 5ac2197b6ee1db1dad90b3ace5e815a812021d04 Mon Sep 17 00:00:00 2001 From: SinuS Von SifriduS Date: Thu, 27 Aug 2026 10:22:53 +0200 Subject: [PATCH] v0.2.12-pre.004-fix.002 --- Cargo.toml | 4 +- crates/ksp-app-solprices-desk/package.json | 2 +- crates/ksp-app-solprices-desk/tauri.conf.json | 2 +- .../tests/desktop_contract.rs | 46 ++++++- deltas/0.2.12/pre.004-fix.002.md | 118 ++++++++++++++++++ .../plans/019-V0_2_12_SOL_PRICES_DESK_PLAN.md | 10 +- .../validation/015-V0_2_12_SOL_PRICES_DESK.md | 28 ++++- 7 files changed, 200 insertions(+), 10 deletions(-) create mode 100644 deltas/0.2.12/pre.004-fix.002.md diff --git a/Cargo.toml b/Cargo.toml index 1243827..0fba77c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,12 +1,12 @@ # file: Cargo.toml -# version: 290 +# version: 291 [workspace] resolver = "3" members = ["crates/ksp-app-config-desk", "crates/ksp-app-solprices-desk", "crates/ksp-app-wallet-desk", "crates/ksp-config-lib", "crates/ksp-core-lib", "crates/ksp-logging-lib", "crates/ksp-offchain-transport-lib", "crates/ksp-onchain-transport-lib", "crates/ksp-wallet-lib"] [workspace.package] -version = "0.2.12-pre.4.fix.1" +version = "0.2.12-pre.4.fix.2" edition = "2024" license = "MIT" repository = "https://git.sasedev.com/Sasedev/khadhroony-solana-project" diff --git a/crates/ksp-app-solprices-desk/package.json b/crates/ksp-app-solprices-desk/package.json index 4270c46..eda2133 100644 --- a/crates/ksp-app-solprices-desk/package.json +++ b/crates/ksp-app-solprices-desk/package.json @@ -1,7 +1,7 @@ { "name": "ksp-app-solprices-desk", "private": true, - "version": "0.2.12-pre.4.fix.1", + "version": "0.2.12-pre.4.fix.2", "type": "module", "scripts": { "dev": "vite", diff --git a/crates/ksp-app-solprices-desk/tauri.conf.json b/crates/ksp-app-solprices-desk/tauri.conf.json index 9772cd9..8e14597 100644 --- a/crates/ksp-app-solprices-desk/tauri.conf.json +++ b/crates/ksp-app-solprices-desk/tauri.conf.json @@ -1,7 +1,7 @@ { "$schema": "https://schema.tauri.app/config/2", "productName": "KSP SOL Prices Desk", - "version": "0.2.12-pre.4.fix.1", + "version": "0.2.12-pre.4.fix.2", "identifier": "com.sasedev.ksp-app-solprices-desk", "build": { "beforeDevCommand": { diff --git a/crates/ksp-app-solprices-desk/tests/desktop_contract.rs b/crates/ksp-app-solprices-desk/tests/desktop_contract.rs index 05492e6..47bfab0 100644 --- a/crates/ksp-app-solprices-desk/tests/desktop_contract.rs +++ b/crates/ksp-app-solprices-desk/tests/desktop_contract.rs @@ -1,5 +1,5 @@ // file: crates/ksp-app-solprices-desk/tests/desktop_contract.rs -// version: 4 +// version: 5 //! Desktop scaffold, shared-template and Config packaging contract audits for SOL Prices Desk `0.2.12`. @@ -31,15 +31,55 @@ fn read_text(path: &std::path::Path) -> String { }; } +fn parse_semver_core(value: &str) -> std::option::Option<(u64, u64, u64)> { + let core = match value.split_once('-') { + std::option::Option::Some((core, _)) => core, + std::option::Option::None => value, + }; + let mut parts = core.split('.'); + let major = match parts.next().and_then(|part| return part.parse::().ok()) { + std::option::Option::Some(value) => value, + std::option::Option::None => return std::option::Option::None, + }; + let minor = match parts.next().and_then(|part| return part.parse::().ok()) { + std::option::Option::Some(value) => value, + std::option::Option::None => return std::option::Option::None, + }; + let patch = match parts.next().and_then(|part| return part.parse::().ok()) { + std::option::Option::Some(value) => value, + std::option::Option::None => return std::option::Option::None, + }; + if parts.next().is_some() { + return std::option::Option::None; + } + return std::option::Option::Some((major, minor, patch)); +} + +fn assert_packaged_version_floor(value: std::option::Option<&str>, field: &str) { + assert!(value.is_some(), "{field} packaged version must exist"); + let value = match value { + std::option::Option::Some(value) => value, + std::option::Option::None => return, + }; + let parsed = parse_semver_core(value); + assert!(parsed.is_some(), "{field} packaged version must be SemVer-like"); + if let std::option::Option::Some(parsed) = parsed { + assert!(parsed >= (0, 2, 6), "{field} packaged version must be >= 0.2.6"); + } +} + #[test] fn pre_002_shell_uses_reserved_ports_windows_and_owned_backend_paths() { let root = app_root(); let tauri = read_json(root.join("tauri.conf.json").as_path()); assert_eq!(tauri.pointer("/productName").and_then(serde_json::Value::as_str), std::option::Option::Some("KSP SOL Prices Desk")); assert_eq!(tauri.pointer("/identifier").and_then(serde_json::Value::as_str), std::option::Option::Some("com.sasedev.ksp-app-solprices-desk")); - assert_eq!(tauri.pointer("/version").and_then(serde_json::Value::as_str), std::option::Option::Some("0.2.12-pre.4")); + let tauri_version = tauri.pointer("/version").and_then(serde_json::Value::as_str); + assert_packaged_version_floor(tauri_version, "tauri.conf.json"); let package = read_json(root.join("package.json").as_path()); - assert_eq!(package.pointer("/version").and_then(serde_json::Value::as_str), std::option::Option::Some("0.2.12-pre.4")); + let package_version = package.pointer("/version").and_then(serde_json::Value::as_str); + assert_packaged_version_floor(package_version, "package.json"); + assert_eq!(tauri_version, package_version, "desktop package metadata versions must remain synchronized"); assert_eq!(tauri.pointer("/build/devUrl").and_then(serde_json::Value::as_str), std::option::Option::Some("http://localhost:1434")); assert_eq!(tauri.pointer("/build/beforeDevCommand/script").and_then(serde_json::Value::as_str), std::option::Option::Some("npm run dev")); assert_eq!(tauri.pointer("/build/beforeDevCommand/cwd").and_then(serde_json::Value::as_str), std::option::Option::Some(".")); diff --git a/deltas/0.2.12/pre.004-fix.002.md b/deltas/0.2.12/pre.004-fix.002.md new file mode 100644 index 0000000..f6dfff9 --- /dev/null +++ b/deltas/0.2.12/pre.004-fix.002.md @@ -0,0 +1,118 @@ + + + +# Delta `0.2.12-pre.004-fix.002` — canari de version desktop version-neutral + +## 1. Base requise + +```text +0.2.12-pre.004-fix.001 appliquée +workspace.package.version = 0.2.12-pre.4.fix.1 +``` + +Le gate opérateur du `27 août 2026` confirme `cargo fmt`, les audits Rust/Markdown, `cargo check --workspace` et Clippy workspace. `cargo test -p ksp-app-solprices-desk` échoue toutefois dans `pre_002_shell_uses_reserved_ports_windows_and_owned_backend_paths` : le canari compare encore les métadonnées desktop à la chaîne historique `0.2.12-pre.4`, alors que le fix précédent a légitimement avancé la version technique à `0.2.12-pre.4.fix.1`. + +## 2. Type de livraison et version + +```text +ksp-general-0.2.12-pre.004-fix.002.zip +``` + +Le correctif modifie un test Rust compilé. Conformément à `VER-ID-007` et `VER-ID-010`, la version technique devient : + +```text +workspace.package.version = 0.2.12-pre.4.fix.2 +``` + +Les versions de `crates/ksp-app-solprices-desk/package.json` et `tauri.conf.json` sont synchronisées sur `0.2.12-pre.4.fix.2`. + +## 3. Cause + +Le canari `pre_002_shell_uses_reserved_ports_windows_and_owned_backend_paths` contenait deux assertions exactes : + +```text +tauri.conf.json version == 0.2.12-pre.4 +package.json version == 0.2.12-pre.4 +``` + +Cette forme n'est pas durable : tout suffixe `fix` ou toute prerelease ultérieure rend le test rouge alors que les métadonnées restent correctement synchronisées. Config Desk et Wallet Desk utilisent déjà un contrat version-neutral pour cette responsabilité. + +## 4. Correction + +SOL Prices Desk reprend la même convention : + +```text +parse_semver_core(...) +assert_packaged_version_floor(...) +version SemVer-like +version core >= 0.2.6 +tauri.conf.json == package.json +``` + +La chaîne exacte `0.2.12-pre.4` disparaît donc du canari de scaffold. Le test continue de protéger l'existence et la cohérence des versions desktop sans être couplé au numéro de la tranche courante. + +## 5. Périmètre strict + +Aucun changement n'est apporté à : + +```text +MarketPriceRuntime +MarketPriceService +DTOs prix +commandes Tauri prix +frontend SOL Prices Desk +providers / adapters / wire REST +Config registry / composite / fixtures +``` + +Le fix ne change donc aucun comportement fonctionnel de `pre.004` et ne commence pas `pre.005`. + +## 6. Fichiers ajoutés + +```text +deltas/0.2.12/pre.004-fix.002.md +``` + +## 7. Fichiers modifiés + +```text +Cargo.toml +crates/ksp-app-solprices-desk/package.json +crates/ksp-app-solprices-desk/tauri.conf.json +crates/ksp-app-solprices-desk/tests/desktop_contract.rs +docs/plans/019-V0_2_12_SOL_PRICES_DESK_PLAN.md +docs/validation/015-V0_2_12_SOL_PRICES_DESK.md +``` + +## 8. Fichiers supprimés + +Aucun. + +## 9. Validations exécutées dans le sandbox + +```text +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 +``` + +Le sandbox ne possède pas `cargo`; aucune validation Cargo n'est revendiquée localement. + +## 10. Gate opérateur attendu + +```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 +``` + +Le résultat attendu est que le canari desktop reste vert avec `0.2.12-pre.4.fix.2` et ne contienne plus de dépendance à une chaîne de version de prerelease figée. + +## 11. Décisions et questions ouvertes + +Décision : utiliser le même contrat version-neutral que Config Desk et Wallet Desk plutôt que remplacer une chaîne figée par une nouvelle chaîne figée. + +Question ouverte : aucune. Après gate propre, `pre.005` peut commencer le refresh individuel. diff --git a/docs/plans/019-V0_2_12_SOL_PRICES_DESK_PLAN.md b/docs/plans/019-V0_2_12_SOL_PRICES_DESK_PLAN.md index 2464f77..d1ad0b7 100644 --- a/docs/plans/019-V0_2_12_SOL_PRICES_DESK_PLAN.md +++ b/docs/plans/019-V0_2_12_SOL_PRICES_DESK_PLAN.md @@ -1,5 +1,5 @@ - + # Plan `0.2.12` — SOL Prices Desk + intégration prix Wallet Desk @@ -496,7 +496,7 @@ Correction strictement locale du test `config_composition` : le message d'assert ### `pre.004` — Runtime prix, registry rows et DTOs -**Statut : implémenté ; corrigé par `pre.004-fix.001`, gate opérateur à confirmer.** +**Statut : implémenté ; corrigé par `pre.004-fix.001` puis `pre.004-fix.002`, gate opérateur à confirmer.** Création du `MarketPriceRuntime` applicatif, projection provider-neutral du registry, DTOs TS-RS et états initiaux/loading/empty. `list_market_prices` projette les lignes depuis le registry sans dispatch réseau ; l'état de présentation reste uniquement en mémoire backend. Les providers restent opaques à l'UI, le prix exact et les timestamps traversent l'IPC sous forme de chaînes exactes, et aucun refresh n'est encore disponible avant `pre.005`. @@ -506,6 +506,12 @@ Création du `MarketPriceRuntime` applicatif, projection provider-neutral du reg Correction du gate workspace révélé après `pre.004` : le registry Config contient désormais le composite SOL Prices Desk, donc le jeu de fixtures utilisé par `ksp-app-config-desk` doit contenir le document correspondant. Le fix ajoute la fixture dédiée avec des profils valides dans l'environnement de test et renforce le canari d'inventory pour vérifier explicitement `cfg.composite.ksp-app-solprices-desk`. Aucun runtime prix, provider, DTO ou frontend n'est modifié. +#### `pre.004-fix.002` — Canari de version desktop rendu version-neutral + +**Statut : implémenté ; gate opérateur à confirmer.** + +Le gate de `pre.004-fix.001` a révélé que `desktop_contract.rs` comparait encore `package.json` et `tauri.conf.json` à la chaîne figée `0.2.12-pre.4`. Le fix reprend la convention déjà utilisée par Config Desk et Wallet Desk : validation SemVer-like avec plancher compatible, puis égalité entre les deux métadonnées desktop. Les futures prereleases/fixes peuvent ainsi avancer la version sans rendre le canari historique `pre.002` artificiellement rouge. Aucun runtime prix, provider, DTO ou frontend n'est modifié. + ### `pre.005` — Refresh individuel **Statut : planifié.** diff --git a/docs/validation/015-V0_2_12_SOL_PRICES_DESK.md b/docs/validation/015-V0_2_12_SOL_PRICES_DESK.md index 80707a4..b334056 100644 --- a/docs/validation/015-V0_2_12_SOL_PRICES_DESK.md +++ b/docs/validation/015-V0_2_12_SOL_PRICES_DESK.md @@ -1,5 +1,5 @@ - + # Validation `0.2.12` — SOL Prices Desk + intégration Wallet Desk @@ -389,4 +389,30 @@ cargo test -p ksp-app-config-desk cargo test -p ksp-app-solprices-desk cargo test --workspace ``` +## 19. Fix `0.2.12-pre.004-fix.002` + +Le gate opérateur de `pre.004-fix.001` confirme : + +```text +cargo fmt --all PASS +python3 scripts/audit_rust_workspace_rules.py PASS +python3 scripts/audit_markdown_tables.py ... deltas/0.2.12 PASS +cargo check --workspace PASS +cargo clippy --workspace --all-targets PASS +cargo test -p ksp-app-solprices-desk FAIL +``` + +L'échec est limité à `pre_002_shell_uses_reserved_ports_windows_and_owned_backend_paths` : le test attend encore littéralement `0.2.12-pre.4`, alors que `pre.004-fix.001` a correctement synchronisé `package.json` et `tauri.conf.json` sur `0.2.12-pre.4.fix.1`. Le comportement runtime n'est pas en cause. + +Le correctif aligne SOL Prices Desk sur les contrats déjà utilisés par Config Desk et Wallet Desk : + +```text +parse SemVer core des versions desktop implémenté +plancher version >= 0.2.6 implémenté +égalité tauri.conf.json / package.json implémentée +chaîne exacte 0.2.12-pre.4 dans le canari supprimée +runtime prix / DTO / provider / frontend inchangés +``` + +La version technique devient `0.2.12-pre.4.fix.2`. Le gate attendu doit confirmer que le canari reste vert avec ce suffixe et continuera de l'être lors des prochaines prereleases.