# Delta `0.3.7-pre.005` — Store readiness et cohérence réseau de Backfill Desk ## 1. Base requise ```text 0.3.7-pre.004 workspace.package.version = 0.3.7-pre.4 ``` Le replay opérateur de `pre.004` est propre : audits Rust/Markdown, `cargo check --workspace`, Clippy, suite complète `ksp-app-backfill-desk` et arbres de dépendances ne rapportent aucun échec. Le lancement réel `cargo tauri dev` confirme également le profil Logging de développement `supertrace`, le profil Transport `devnet_public`, un réseau unique, un rôle compatible, `transport_ready = true` et le tracing `DEBUG` des interactions frontend. ## 2. Objectif Ouvrir uniquement la readiness Store de Backfill Desk : résoudre le Store sélectionné par le composite, prouver la cohérence exacte Store/Transport avant toute ouverture physique, ouvrir la façade backend-neutre `ksp-store-lib::Store`, exécuter un health probe borné, projeter une readiness sûre puis fermer explicitement le Store lors de la fermeture de l'application. Aucun runtime Job Backfill n'est ouvert dans cette tranche. ## 3. Implémentation - ajouter uniquement la dépendance backend `ksp-store-lib` à Backfill Desk ; - créer `store_runtime.rs`, propriétaire de la résolution Store, de la cohérence réseau, du health probe et du close explicite ; - dériver le réseau Store depuis `ResolvedStoreConfig::settings()` et le réseau Transport depuis le pool déjà construit ; - exiger exactement un réseau Transport puis une égalité stricte avec le réseau Store **avant** `Store::open` ; - ne pas ouvrir Store lorsque Transport ne permet pas de déterminer un réseau unique ou lorsque les réseaux divergent ; - exécuter `Store::health()` une fois après ouverture et conserver le Store côté Rust même lorsqu'il est `NotReady`, afin de permettre sa fermeture explicite ; - étendre `BackfillDeskOptionsDto` avec `store_network`, `network_coherent`, `store_ready`, `composition_ready` et un diagnostic Store sûr ; - conserver hors IPC toute URI, identité backend physique, détail de pool, provider, URL ou credential ; - intercepter `CloseRequested` de la fenêtre principale, empêcher la fermeture immédiate, exécuter le close Store one-shot puis quitter l'application ; - conserver les capabilities Tauri à `core:default + tracing:default` et le tracing de développement Backfill à `supertrace` / fallback `trace` ; - ne pas ajouter `ksp-job-backfill-lib`, `BackfillRequest`, `BackfillJobRuntime`, Start, Cancel ou Resume. ## 4. Version Cette tranche modifie le runtime et ouvre une nouvelle dépendance fonctionnelle. Conformément à `VER-ID-009` : ```text workspace.package.version = 0.3.7-pre.5 label = 0.3.7-pre.005 ``` ## 5. Fichiers ajoutés ```text crates/ksp-app-backfill-desk/src/store_runtime.rs crates/ksp-app-backfill-desk/unit_tests/store_runtime.rs deltas/0.3.7/pre.005.md ``` ## 6. Fichiers modifiés ```text Cargo.toml crates/ksp-app-backfill-desk/Cargo.toml crates/ksp-app-backfill-desk/src/app_state.rs crates/ksp-app-backfill-desk/src/constants.rs crates/ksp-app-backfill-desk/src/dto_common.rs crates/ksp-app-backfill-desk/src/errors.rs crates/ksp-app-backfill-desk/src/lib.rs crates/ksp-app-backfill-desk/src/tauri.rs crates/ksp-app-backfill-desk/src/transport_runtime.rs crates/ksp-app-backfill-desk/tests/config_composition.rs crates/ksp-app-backfill-desk/tests/desktop_contract.rs crates/ksp-app-backfill-desk/tests/desktop_security.rs crates/ksp-app-backfill-desk/unit_tests/dto_common.rs crates/ksp-app-backfill-desk/unit_tests/transport_runtime.rs 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 - Config reste propriétaire des profils, variables d'environnement et secrets ; - Transport reste propriétaire du routage physique, retry, pacing et endpoint selection ; - Store est consommé uniquement via `ksp-store-lib`, sans dépendance directe à `ksp-store-api` ou `ksp-store-postgres-lib` ; - la comparaison réseau logique précède `Store::open` ; - `BackfillDeskOptionsDto` ne projette aucun détail physique Transport/Store ; - un Store non-ready ne produit jamais `composition_ready = true` ; - le Store est fermé explicitement et au plus une fois lors de la fermeture de la fenêtre principale ; - aucune capability Tauri réseau/fichier/dialog/shell n'est ajoutée ; - le frontend, son gabarit commun et son instrumentation de clics/tabs restent inchangés ; - `ksp-job-backfill-lib` reste fermé jusqu'à la tranche prévue ; - le tracing de développement reste `supertrace` via Config devnet et `trace` en fallback Backfill Desk. ## 9. 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 ``` Contrôles ciblés supplémentaires : - parse TOML des manifests racine et Backfill Desk ; - parse JSON des capabilities et de la configuration Tauri ; - vérification que la comparaison Store/Transport apparaît avant `Store::open` ; - vérification de la frontière de dépendances : `ksp-store-lib` admis, backend/API Store et Job interdits ; - vérification que les capabilities restent `core:default + tracing:default` ; - vérification structurelle du lifecycle `CloseRequested -> prevent_close -> Store::close -> exit` ; - vérification de la projection IPC sûre Store/Transport ; - vérification statique de la cohérence réseau Config pour les profils `devnet`, `mainnet` et `testnet`, plus ajout du test Rust déterministe correspondant. ## 10. Validations non exécutées dans l'environnement d'assemblage `cargo` et `rustfmt` ne sont pas disponibles dans cet environnement. Le gate opérateur `pre.005` reste à exécuter : ```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-app-backfill-desk cargo tree -p ksp-app-backfill-desk --edges normal cargo tree -p ksp-app-backfill-desk -e features ``` Un lancement `cargo tauri dev` avec un Store PostgreSQL de développement disponible est recommandé pour confirmer le health probe et la fermeture explicite dans le runtime réel ; ce live smoke n'est pas assimilé aux tests déterministes. ## 11. Décisions `pre.005` sépare explicitement la readiness Store de l'exécution Backfill. Le fait qu'un Store soit ouvert et healthy ne suffit pas à autoriser une campagne : `composition_ready` requiert également Transport ready et une cohérence réseau exacte. Les DTO/request de campagne restent réservés à `pre.006`. La fermeture de la fenêtre principale devient le point de lifecycle explicite du Store. Elle est one-shot afin d'éviter deux consommations concurrentes du handle `Store`, et le processus quitte après la tentative de close bornée même si celle-ci retourne une erreur, après émission d'un diagnostic backend sûr. ## 12. Questions ouvertes Aucune.