# Delta `0.3.2-pre.003` — Store settings, backend selection et lifecycle contract ## 1. Base requise Base exacte : ```text 0.3.2-pre.002-fix.001 workspace.package.version = 0.3.2-pre.2.fix.1 ``` Le gate opérateur fourni le 29 août 2026 est entièrement vert et sans warning : ```text cargo fmt --all PASS audit Rust général / exports / workspace PASS audit Markdown PASS — 186 tables / 126 files cargo check --workspace PASS cargo clippy --workspace --all-targets PASS cargo test -p ksp-store-lib PASS cargo test -p ksp-store-postgres-lib PASS cargo check -p ksp-store-lib --no-default-features PASS ``` Le correctif `pre.002-fix.001` est déjà commité. `pre.003` ne réécrit pas ce delta. Le crate-root `ksp-store-lib` étant réellement modifié dans cette tranche, son ancrage `TRACING_TARGET` adopte désormais la forme canonique `const _: &str = crate::TRACING_TARGET;`. `crates/ksp-store-lib/src/constants.rs` n'est pas modifié et conserve donc son header/version existant. ## 2. Objectif Matérialiser uniquement le contrat runtime backend-neutral prévu par le plan 023 : ```text StoreBackendKind StoreBackendSettings PostgresStoreSettings PostgresPoolSettings PostgresBootstrapSettings PostgresTlsMode StoreSettings Store::open(settings).await Store::close(self).await codes d'erreur Store stables réexports ksp-store-api depuis la façade ``` Aucune connexion, pool physique, TLS connector, migration, Config `std.store` ou SQL n'est introduit. ## 3. Settings et bornes `PostgresStoreSettings` possède une URI explicitement fournie par le caller. Il n'existe aucun `Default` qui invente une URI ou un backend. La chaîne URI : ```text est possédée par le settings est intégralement redacted dans Debug n'a aucun getter public n'entre dans aucun ErrorContext n'est pas parsée avant pre.005 ``` Les settings typés matérialisent les bornes décidées en `pre.001` : ```text max_connections défaut 8 plage 1..64 connect_timeout_ms défaut 10_000 plage 100..60_000 pool_wait_timeout_ms défaut 5_000 plage 100..60_000 pool_create_timeout_ms défaut 10_000 plage 100..60_000 pool_recycle_timeout_ms défaut 5_000 plage 100..60_000 shutdown_timeout_ms défaut 5_000 plage 100..30_000 auto_migrate défaut true migration_timeout_ms défaut 30_000 plage 1_000..300_000 migration_lock_ms défaut 10_000 plage 100..120_000 ``` Ces bornes restent des garde-fous de ressources/lifecycle et non une policy worker/job. ## 4. Backend selection et lifecycle Backend connu : ```text StoreBackendKind::Postgres ``` Le dispatch `Store::open` valide d'abord tous les settings puis : ```text feature postgres absente -> store.backend_not_compiled avant I/O feature postgres présente -> store.backend_open_failed / runtime_foundation_pending avant I/O ``` Le second résultat est volontairement transitoire : `pre.003` ne fabrique jamais un faux `Store` prêt avant la connexion réelle de `pre.005`. La signature finale `Store::close(self).await` est fixée maintenant, mais aucune ressource physique n'existe encore à fermer. ## 5. Erreurs Store communes Codes crate-root : ```text ERROR_CODE_BACKEND_CLOSED -> store.backend_closed ERROR_CODE_BACKEND_NOT_COMPILED -> store.backend_not_compiled ERROR_CODE_BACKEND_OPEN_FAILED -> store.backend_open_failed ERROR_CODE_SETTINGS_INVALID -> store.settings_invalid ERROR_CODE_SHUTDOWN_TIMEOUT -> store.shutdown_timeout ``` Aucune erreur externe ou chaîne distante n'est attachée à cette tranche. ## 6. Réexports API `ksp-store-lib` réexporte explicitement les 60 éléments crate-root de `ksp-store-api` nécessaires à la consommation de la façade. La façade compte donc à cette tranche : ```text 60 reexports ksp-store-api 13 éléments runtime Store propres 73 exports crate-root au total ``` Aucun type, handle ou symbole de `ksp-store-postgres-lib` n'est réexporté. ## 7. Fichiers Modifiés : ```text Cargo.toml crates/ksp-store-lib/src/lib.rs crates/ksp-store-lib/tests/dependency_boundary.rs docs/plans/023-V0_3_2_STORE_POSTGRES_FOUNDATION_PLAN.md docs/validation/019-V0_3_2_STORE_POSTGRES_FOUNDATION.md ``` Ajoutés : ```text crates/ksp-store-lib/src/error.rs crates/ksp-store-lib/src/settings.rs crates/ksp-store-lib/src/store.rs crates/ksp-store-lib/unit_tests/settings.rs crates/ksp-store-lib/unit_tests/store.rs crates/ksp-store-lib/tests/feature_mismatch.rs crates/ksp-store-lib/tests/public_api.rs deltas/0.3.2/pre.003.md ``` Non modifiés intentionnellement : ```text crates/ksp-store-lib/src/constants.rs crates/ksp-store-postgres-lib/** ksp-store-api/** config/** CHANGELOG.md ROADMAP.md ``` ## 8. Version La tranche touche le runtime/API Rust ; la version workspace devient : ```text 0.3.2-pre.3 ``` Identifiant de livraison : ```text 0.3.2-pre.003 ``` ## 9. Validations exécutées pendant la préparation ```text python3 scripts/audit_rust_workspace_rules.py PASS ``` Les validations Cargo ne sont pas disponibles dans l'environnement de génération et ne sont jamais déclarées PASS. ## 10. Gate opérateur 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/0.3.2 cargo check --workspace cargo clippy --workspace --all-targets cargo test -p ksp-store-api cargo test -p ksp-store-lib cargo test -p ksp-store-lib --no-default-features cargo test -p ksp-store-postgres-lib cargo check -p ksp-store-lib --no-default-features cargo tree -p ksp-store-lib --edges normal cargo tree -p ksp-store-lib -e features cargo tree -p ksp-store-postgres-lib --edges normal ``` ## 11. Hors scope et suite Toujours absents : ```text Config std.store tokio-postgres Deadpool Rustls connexion PostgreSQL migrations/bootstrap physique health/readiness physique RawTransaction PostgreSQL RawAccountState PostgreSQL ``` Si le gate est vert, `0.3.2-pre.004` ouvre exclusivement Config `std.store`, son schema/example/registry/adaptor et les impacts de packaging strictement requis.