v0.3.7-pre.003-fix.001

This commit is contained in:
2026-09-02 10:55:57 +02:00
parent 862f40ad26
commit 03a94f4fb6
8 changed files with 200 additions and 26 deletions

View File

@@ -1,12 +1,12 @@
# file: Cargo.toml # file: Cargo.toml
# version: 418 # version: 419
[workspace] [workspace]
resolver = "3" resolver = "3"
members = ["crates/ksp-app-backfill-desk", "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-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"] members = ["crates/ksp-app-backfill-desk", "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-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] [workspace.package]
version = "0.3.7-pre.3" version = "0.3.7-pre.3.fix.1"
edition = "2024" edition = "2024"
license = "MIT" license = "MIT"
repository = "https://git.sasedev.com/Sasedev/khadhroony-solana-project" repository = "https://git.sasedev.com/Sasedev/khadhroony-solana-project"

View File

@@ -1,20 +1,24 @@
// file: crates/ksp-app-backfill-desk/src/errors.rs // file: crates/ksp-app-backfill-desk/src/errors.rs
// version: 2 // version: 3
//! Application-local error codes for Backfill Desk composition and desktop runtime surfaces. //! Application-local error codes for Backfill Desk composition and desktop runtime surfaces.
/// Backfill Desk composite configuration is missing or references an unexpected document.
pub(crate) const ERROR_CODE_CONFIG_COMPOSITE_INVALID: ksp_core_lib::ErrorCode = ksp_core_lib::ErrorCode::new("backfill_desk", "config_composite_invalid");
/// Shared Backfill Desk runtime state is internally inconsistent. /// Shared Backfill Desk runtime state is internally inconsistent.
pub(crate) const ERROR_CODE_APP_STATE_INVALID: ksp_core_lib::ErrorCode = ksp_core_lib::ErrorCode::new("backfill_desk", "app_state_invalid"); pub(crate) const ERROR_CODE_APP_STATE_INVALID: ksp_core_lib::ErrorCode = ksp_core_lib::ErrorCode::new("backfill_desk", "app_state_invalid");
/// Shared Backfill Desk runtime state cannot be locked safely. /// Shared Backfill Desk runtime state cannot be locked safely.
pub(crate) const ERROR_CODE_APP_STATE_LOCK_FAILED: ksp_core_lib::ErrorCode = ksp_core_lib::ErrorCode::new("backfill_desk", "app_state_lock_failed"); pub(crate) const ERROR_CODE_APP_STATE_LOCK_FAILED: ksp_core_lib::ErrorCode = ksp_core_lib::ErrorCode::new("backfill_desk", "app_state_lock_failed");
/// Backfill Desk composite configuration is missing or references an unexpected document.
pub(crate) const ERROR_CODE_CONFIG_COMPOSITE_INVALID: ksp_core_lib::ErrorCode =
ksp_core_lib::ErrorCode::new("backfill_desk", "config_composite_invalid");
/// Frontend logging requested an unsupported level. /// Frontend logging requested an unsupported level.
pub(crate) const ERROR_CODE_FRONTEND_LOG_LEVEL_INVALID: ksp_core_lib::ErrorCode = ksp_core_lib::ErrorCode::new("backfill_desk", "frontend_log_level_invalid"); pub(crate) const ERROR_CODE_FRONTEND_LOG_LEVEL_INVALID: ksp_core_lib::ErrorCode =
ksp_core_lib::ErrorCode::new("backfill_desk", "frontend_log_level_invalid");
/// Frontend logging requested a target outside the application whitelist. /// Frontend logging requested a target outside the application whitelist.
pub(crate) const ERROR_CODE_FRONTEND_LOG_TARGET_INVALID: ksp_core_lib::ErrorCode = ksp_core_lib::ErrorCode::new("backfill_desk", "frontend_log_target_invalid"); pub(crate) const ERROR_CODE_FRONTEND_LOG_TARGET_INVALID: ksp_core_lib::ErrorCode =
ksp_core_lib::ErrorCode::new("backfill_desk", "frontend_log_target_invalid");
/// Backfill Desk could not install the managed Logging runtime or its safe fallback. /// Backfill Desk could not install the managed Logging runtime or its safe fallback.
pub(crate) const ERROR_CODE_LOGGING_BOOTSTRAP_FAILED: ksp_core_lib::ErrorCode = ksp_core_lib::ErrorCode::new("backfill_desk", "logging_bootstrap_failed"); pub(crate) const ERROR_CODE_LOGGING_BOOTSTRAP_FAILED: ksp_core_lib::ErrorCode =
ksp_core_lib::ErrorCode::new("backfill_desk", "logging_bootstrap_failed");
/// Splash readiness was invoked from a window other than the splash window. /// Splash readiness was invoked from a window other than the splash window.
pub(crate) const ERROR_CODE_SPLASH_ORIGIN_INVALID: ksp_core_lib::ErrorCode = ksp_core_lib::ErrorCode::new("backfill_desk", "splash_origin_invalid"); pub(crate) const ERROR_CODE_SPLASH_ORIGIN_INVALID: ksp_core_lib::ErrorCode = ksp_core_lib::ErrorCode::new("backfill_desk", "splash_origin_invalid");
/// A KSP desk splash environment duration is malformed or exceeds its safety bound. /// A KSP desk splash environment duration is malformed or exceeds its safety bound.

View File

@@ -1,5 +1,5 @@
// file: crates/ksp-app-backfill-desk/tests/desktop_contract.rs // file: crates/ksp-app-backfill-desk/tests/desktop_contract.rs
// version: 2 // version: 3
//! Structural desktop contract checks for the Backfill Desk scaffold. //! Structural desktop contract checks for the Backfill Desk scaffold.
@@ -99,7 +99,13 @@ fn pre_002_package_dependencies_match_desk_baseline() {
fn pre_002_splash_assets_and_styles_match_existing_desk_template() { fn pre_002_splash_assets_and_styles_match_existing_desk_template() {
let root = app_root(); let root = app_root();
let reference = workspace_root().join("crates/ksp-app-solprices-desk"); let reference = workspace_root().join("crates/ksp-app-solprices-desk");
for relative in ["frontend/fonts/DOS_Amazigh.ttf", "frontend/imgs/logo.png", "frontend/imgs/splash.png", "icons/favicon.png", "icons/favicon.ico"] { for relative in [
"frontend/fonts/DOS_Amazigh.ttf",
"frontend/imgs/logo.png",
"frontend/imgs/splash.png",
"icons/favicon.png",
"icons/favicon.ico",
] {
assert_eq!(read_bytes(root.join(relative).as_path()), read_bytes(reference.join(relative).as_path()), "Desk asset differs: {relative}"); assert_eq!(read_bytes(root.join(relative).as_path()), read_bytes(reference.join(relative).as_path()), "Desk asset differs: {relative}");
} }
let splash = read_text(root.join("frontend/splash.html").as_path()); let splash = read_text(root.join("frontend/splash.html").as_path());
@@ -107,7 +113,9 @@ fn pre_002_splash_assets_and_styles_match_existing_desk_template() {
assert!(splash.contains("Backfill Desk")); assert!(splash.contains("Backfill Desk"));
let splash_style = read_text(root.join("frontend/sass/splash.scss").as_path()); let splash_style = read_text(root.join("frontend/sass/splash.scss").as_path());
let reference_style = read_text(reference.join("frontend/sass/splash.scss").as_path()); let reference_style = read_text(reference.join("frontend/sass/splash.scss").as_path());
let normalized = splash_style.replace("crates/ksp-app-backfill-desk", "crates/ksp-app-solprices-desk").replace("// version: 1", "// version: 2"); let normalized = splash_style
.replace("crates/ksp-app-backfill-desk", "crates/ksp-app-solprices-desk")
.replace("// version: 1", "// version: 2");
assert_eq!(normalized, reference_style); assert_eq!(normalized, reference_style);
} }
@@ -134,7 +142,12 @@ fn pre_002_shell_and_splash_use_shared_frontend_tooling() {
fn pre_003_composite_packaging_follows_atomic_config_registry_contract() { fn pre_003_composite_packaging_follows_atomic_config_registry_contract() {
let root = app_root(); let root = app_root();
let config = read_json(root.join("tauri.conf.json").as_path()); let config = read_json(root.join("tauri.conf.json").as_path());
let resources = config.get("bundle").and_then(|value| value.get("resources")).and_then(serde_json::Value::as_object); let resources = config
.get("bundle")
.and_then(|value| {
return value.get("resources");
})
.and_then(serde_json::Value::as_object);
assert!(resources.is_some()); assert!(resources.is_some());
let resources = match resources { let resources = match resources {
std::option::Option::Some(value) => value, std::option::Option::Some(value) => value,

View File

@@ -1,5 +1,5 @@
// file: crates/ksp-app-backfill-desk/tests/desktop_security.rs // file: crates/ksp-app-backfill-desk/tests/desktop_security.rs
// version: 2 // version: 3
//! Security and dependency-boundary checks for the Backfill Desk scaffold. //! Security and dependency-boundary checks for the Backfill Desk scaffold.
@@ -53,9 +53,15 @@ fn pre_002_capability_surface_is_core_plus_tracing_only() {
} }
let manifest = read_text(root.join("Cargo.toml").as_path()); let manifest = read_text(root.join("Cargo.toml").as_path());
assert!(manifest.contains("tauri-plugin-tracing.workspace = true")); assert!(manifest.contains("tauri-plugin-tracing.workspace = true"));
for forbidden in for forbidden in [
["ksp-job-backfill-lib", "ksp-onchain-transport-lib", "ksp-store-lib", "ksp-store-api", "ksp-store-postgres-lib", "reqwest", "tokio-postgres"] "ksp-job-backfill-lib",
{ "ksp-onchain-transport-lib",
"ksp-store-lib",
"ksp-store-api",
"ksp-store-postgres-lib",
"reqwest",
"tokio-postgres",
] {
assert!(!manifest.contains(forbidden), "pre.002 opens a later-layer dependency: {forbidden}"); assert!(!manifest.contains(forbidden), "pre.002 opens a later-layer dependency: {forbidden}");
} }
} }
@@ -118,7 +124,7 @@ fn pre_002_frontend_instrumentation_avoids_business_or_secret_payloads() {
fn pre_003_keeps_config_only_composition_boundary() { fn pre_003_keeps_config_only_composition_boundary() {
let root = app_root(); let root = app_root();
let manifest = read_text(root.join("Cargo.toml").as_path()); let manifest = read_text(root.join("Cargo.toml").as_path());
assert!(manifest.contains("ksp-config-lib.workspace = true")); assert!(manifest.contains("ksp-config-lib = { path = \"../ksp-config-lib\" }"));
for forbidden in ["ksp-job-backfill-lib", "ksp-onchain-transport-lib", "ksp-store-lib", "ksp-store-api", "ksp-store-postgres-lib"] { for forbidden in ["ksp-job-backfill-lib", "ksp-onchain-transport-lib", "ksp-store-lib", "ksp-store-api", "ksp-store-postgres-lib"] {
assert!(!manifest.contains(forbidden), "pre.003 opens a later-layer dependency: {forbidden}"); assert!(!manifest.contains(forbidden), "pre.003 opens a later-layer dependency: {forbidden}");
} }

View File

@@ -8,12 +8,12 @@
{ {
"component_id": "logging", "component_id": "logging",
"file_id": "cfg.std.logging", "file_id": "cfg.std.logging",
"profile_id": "supertrace" "profile_id": "local_dev"
}, },
{ {
"component_id": "transport", "component_id": "transport",
"file_id": "cfg.std.transport", "file_id": "cfg.std.transport",
"profile_id": "devnet_public" "profile_id": "secret_test"
}, },
{ {
"component_id": "store", "component_id": "store",
@@ -28,12 +28,12 @@
{ {
"component_id": "logging", "component_id": "logging",
"file_id": "cfg.std.logging", "file_id": "cfg.std.logging",
"profile_id": "console_info" "profile_id": "local_dev"
}, },
{ {
"component_id": "transport", "component_id": "transport",
"file_id": "cfg.std.transport", "file_id": "cfg.std.transport",
"profile_id": "mainnet_public" "profile_id": "secret_test"
}, },
{ {
"component_id": "store", "component_id": "store",
@@ -48,12 +48,12 @@
{ {
"component_id": "logging", "component_id": "logging",
"file_id": "cfg.std.logging", "file_id": "cfg.std.logging",
"profile_id": "console_info" "profile_id": "local_dev"
}, },
{ {
"component_id": "transport", "component_id": "transport",
"file_id": "cfg.std.transport", "file_id": "cfg.std.transport",
"profile_id": "publicnode_testnet" "profile_id": "secret_test"
}, },
{ {
"component_id": "store", "component_id": "store",

View File

@@ -0,0 +1,116 @@
<!-- file: deltas/0.3.7/pre.003-fix.001.md -->
<!-- version: 1 -->
# Delta `0.3.7-pre.003-fix.001` — correction du gate Config/composition
## 1. Base requise
```text
0.3.7-pre.003
workspace.package.version = 0.3.7-pre.3
```
Le gate opérateur du 2026-09-02 a validé `cargo check --workspace`, le Markdown et la majorité des suites ciblées, mais a isolé quatre défauts locaux : une violation `RUST-FMT-104`, un lint Clippy `implicit_return`, une incohérence de fixture Config Desk et un canari de manifeste Backfill Desk obsolète.
## 2. Objectif
Corriger uniquement ces quatre défauts de `pre.003` sans ouvrir `pre.004`, sans modifier le comportement runtime et sans changer le composite Backfill Desk de production.
## 3. Corrections
- remettre le bloc de constantes `ERROR_CODE_*` de `ksp-app-backfill-desk/src/errors.rs` dans l'ordre alphabétique attendu ;
- utiliser un `return` explicite dans la closure `bundle.resources` du test `desktop_contract` ;
- adapter la fixture composite Backfill aux profils réduits réellement présents dans les fixtures Config (`local_dev` pour Logging, `secret_test` pour Transport), conformément aux fixtures Desk existantes ;
- faire vérifier au canari `desktop_security` la déclaration KSP interne réelle par `path`, au lieu d'exiger à tort `workspace = true`.
La source `config/composite.ksp-app-backfill-desk.json` reste inchangée : `devnet` continue d'utiliser `supertrace + devnet_public + devnet`.
## 4. Version
Le correctif modifie des fichiers Rust compilés. `VER-ID-007` et `VER-ID-010` imposent donc :
```text
workspace.package.version = 0.3.7-pre.3.fix.1
label = 0.3.7-pre.003-fix.001
```
## 5. Fichiers ajoutés
```text
deltas/0.3.7/pre.003-fix.001.md
```
## 6. Fichiers modifiés
```text
Cargo.toml
crates/ksp-app-backfill-desk/src/errors.rs
crates/ksp-app-backfill-desk/tests/desktop_contract.rs
crates/ksp-app-backfill-desk/tests/desktop_security.rs
crates/ksp-config-lib/unit_tests/fixtures/composite.ksp-app-backfill-desk.json
docs/plans/028-V0_3_7_BACKFILL_DESK_PLAN.md
docs/validation/024-V0_3_7_BACKFILL_DESK.md
```
## 7. Fichiers supprimés
Aucun.
## 8. Invariants conservés
- aucune modification de `config/composite.ksp-app-backfill-desk.json` ;
- `devnet` de production reste sur le profil Logging `supertrace` et le fallback Backfill Desk reste `trace` ;
- registre Config et packaging restent à 14 resources ;
- aucune dépendance `ksp-onchain-transport-lib`, `ksp-store-lib`, `ksp-store-api`, `ksp-store-postgres-lib` ou `ksp-job-backfill-lib` n'est ajoutée à Backfill Desk ;
- aucune construction `HttpTransportPool`, ouverture Store ou exécution Backfill n'est introduite ;
- capabilities Tauri et frontend inchangés.
## 9. Gate opérateur ayant déclenché le fix
```text
Rust rule audit FAIL — 1 x RUST-FMT-104
Markdown table audit PASS — 270 tables / 150 files
cargo check --workspace PASS
cargo clippy --workspace --all-targets FAIL — implicit_return dans desktop_contract.rs
cargo test -p ksp-config-lib PASS
cargo test -p ksp-app-config-desk FAIL — fixture composite / profil Logging absent
cargo test -p ksp-app-wallet-desk PASS
cargo test -p ksp-app-solprices-desk PASS
cargo test -p ksp-app-backfill-desk FAIL — canari de manifeste obsolète
```
## 10. Validations exécutées dans l'environnement d'assemblage
```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.3.7
```
Des contrôles ciblés vérifient également la cohérence des profils référencés par la fixture Backfill et l'absence de modification du composite de production.
## 11. Validations non exécutées dans l'environnement d'assemblage
`cargo` et `rustfmt` ne sont pas disponibles dans cet environnement. Le gate opérateur du fix reste à rejouer :
```text
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.3.7
cargo check --workspace
cargo clippy --workspace --all-targets
cargo test -p ksp-config-lib
cargo test -p ksp-app-config-desk
cargo test -p ksp-app-wallet-desk
cargo test -p ksp-app-solprices-desk
cargo test -p ksp-app-backfill-desk
cargo tree -p ksp-app-backfill-desk --edges normal
cargo tree -p ksp-app-backfill-desk -e features
```
## 12. Décisions
Les quatre défauts ont été introduits ou révélés par la composition Config de `pre.003`. Ils restent donc dans `pre.003-fix.001` conformément à `VER-ID-006` et `VER-LIFECYCLE-009`. `pre.004` reste bloquée jusqu'à un gate opérateur propre du correctif.
## 13. Questions ouvertes
Aucune.

View File

@@ -1,5 +1,5 @@
<!-- file: docs/plans/028-V0_3_7_BACKFILL_DESK_PLAN.md --> <!-- file: docs/plans/028-V0_3_7_BACKFILL_DESK_PLAN.md -->
<!-- version: 3 --> <!-- version: 4 -->
# Plan v0.3.7 — Backfill Desk # Plan v0.3.7 — Backfill Desk
@@ -237,6 +237,8 @@ Créer package lib+bin, shell/splash/tracing/capability, frontend minimal, ports
Ajouter le composite Backfill Desk et l'enregistrer dans Config, mettre à jour atomiquement les quatre bundles Desk vers les 14 resources du registre, puis brancher le bootstrap Config/Logging et ses canaries sans encore ouvrir Transport/Store réel. Pendant le développement de l'application, `devnet` sélectionne le profil Logging `supertrace` et le fallback local Backfill Desk reste au niveau `trace`; ce choix est local au Desk et devra être resserré avant publication stable. Ajouter le composite Backfill Desk et l'enregistrer dans Config, mettre à jour atomiquement les quatre bundles Desk vers les 14 resources du registre, puis brancher le bootstrap Config/Logging et ses canaries sans encore ouvrir Transport/Store réel. Pendant le développement de l'application, `devnet` sélectionne le profil Logging `supertrace` et le fallback local Backfill Desk reste au niveau `trace`; ce choix est local au Desk et devra être resserré avant publication stable.
Le gate opérateur de `pre.003` ouvre `pre.003-fix.001` pour quatre corrections strictement locales : ordre `RUST-FMT-104` d'un bloc de constantes, `return` explicite dans un canari Clippy, réconciliation de la fixture composite Backfill avec les profils réellement disponibles dans le corpus de fixtures Config, et correction d'un canari de dépendance qui doit reconnaître la syntaxe `path` utilisée par les crates KSP internes. Le composite de production, son profil `supertrace` et les frontières runtime de `pre.003` restent inchangés.
### pre.004 — Transport readiness ### pre.004 — Transport readiness
Construire `HttpTransportPool`, dériver réseau/role inventory sûr, vérifier support des deux RPC et produire options DTO sans provider/URL. Construire `HttpTransportPool`, dériver réseau/role inventory sûr, vérifier support des deux RPC et produire options DTO sans provider/URL.

View File

@@ -1,5 +1,5 @@
<!-- file: docs/validation/024-V0_3_7_BACKFILL_DESK.md --> <!-- file: docs/validation/024-V0_3_7_BACKFILL_DESK.md -->
<!-- version: 3 --> <!-- version: 4 -->
# Validation v0.3.7 — Backfill Desk # Validation v0.3.7 — Backfill Desk
@@ -164,4 +164,37 @@ La découverte du contrat réel de `prepare_packaged_runtime()` a réconcilié l
- [X] audit Rust workspace propre, zéro candidat d'export ; - [X] audit Rust workspace propre, zéro candidat d'export ;
- [X] audit Markdown propre : 270 tableaux / 150 fichiers ; - [X] audit Markdown propre : 270 tableaux / 150 fichiers ;
- [X] parsing JSON/TOML, validation JSON Schema et audit structurel Config/package propres ; - [X] parsing JSON/TOML, validation JSON Schema et audit structurel Config/package propres ;
- [ ] `cargo fmt/check/clippy/test` pre.003 : à exécuter par l'opérateur, `cargo`/`rustfmt` absents du sandbox. - [X] gate opérateur `pre.003` exécuté le 2026-09-02 : **FIX REQUIRED** ; `cargo check --workspace` passe, mais l'audit Rust, Clippy, Config Desk et un canari Backfill Desk isolent quatre défauts locaux détaillés ci-dessous.
## 11. Correctif `pre.003-fix.001`
Le gate opérateur de `pre.003` a isolé quatre défauts qui appartiennent tous au couloir Config/composition de `pre.003` :
- `RUST-FMT-104` dans `src/errors.rs` : `ERROR_CODE_CONFIG_COMPOSITE_INVALID` précédait les constantes `ERROR_CODE_APP_STATE_*` ; le bloc est remis dans l'ordre alphabétique sans changer aucune valeur ;
- Clippy `implicit_return` dans `tests/desktop_contract.rs` : la closure qui lit `bundle.resources` utilise désormais un `return` explicite, conformément aux lints workspace ;
- la fixture `composite.ksp-app-backfill-desk.json` reprenait les profils de production (`supertrace`, `devnet_public`, `mainnet_public`, `publicnode_testnet`) alors que les fixtures réduites Logging/Transport n'exposent que `local_dev` et `secret_test` pour ces besoins ; comme les fixtures Wallet/SOL Prices existantes, la fixture Backfill utilise donc les profils disponibles du corpus de test, sans modifier le composite de production ;
- `tests/desktop_security.rs` attendait littéralement `ksp-config-lib.workspace = true`, alors que les Desk KSP déclarent leurs dépendances internes par chemin local ; le canari vérifie désormais la forme réelle `ksp-config-lib = { path = "../ksp-config-lib" }` et conserve les interdictions des couches Transport/Store/Backfill.
Le correctif ne modifie ni le profil `supertrace` de production, ni les 14 resources packagées, ni le bootstrap runtime, ni les capabilities Tauri, ni les dépendances fonctionnelles de Backfill Desk.
La version Cargo devient `0.3.7-pre.3.fix.1` conformément à `VER-ID-007` et `VER-ID-010`, car le correctif touche des fichiers Rust compilés.
### Gate opérateur ayant déclenché le fix
```text
cargo fmt --all exécuté
python3 scripts/audit_rust_workspace_rules.py FAIL — 1 x RUST-FMT-104
python3 scripts/audit_markdown_tables.py ... deltas/0.3.7 PASS
cargo check --workspace PASS
cargo clippy --workspace --all-targets FAIL — implicit_return dans desktop_contract.rs
cargo test -p ksp-config-lib PASS — 128 tests unitaires + suites associées
cargo test -p ksp-app-config-desk FAIL — fixture Backfill / profil supertrace absent
cargo test -p ksp-app-wallet-desk PASS
cargo test -p ksp-app-solprices-desk PASS
cargo test -p ksp-app-backfill-desk FAIL — canari Cargo.toml obsolète
```
### Gate du fix
- [X] audits statiques Rust/Markdown rejoués dans l'environnement d'assemblage ;
- [ ] `cargo fmt --all`, `cargo check --workspace`, Clippy et suites Cargo à rejouer par l'opérateur ; `cargo`/`rustfmt` restent absents du sandbox.