# Delta `0.3.2-pre.002` — scaffold Store runtime/PostgreSQL et feature graph ## 1. Base requise ```text 0.3.2-pre.001 ``` Le gate opérateur de `pre.001` est fourni vert : ```text cargo fmt --all PASS audit Rust général / exports / workspace PASS audit Markdown PASS — 186 tables / 124 files cargo check --workspace PASS cargo clippy --workspace --all-targets PASS ``` ## 2. Objectif Créer uniquement les deux crates runtime prévues par le plan `0.3.2` et matérialiser le feature graph PostgreSQL sans avancer les settings, la Config Store, la connexion, le pool, TLS, les migrations ou les vertical slices RAW. Crates créées : ```text ksp-store-lib ksp-store-postgres-lib ``` ## 3. Version Le workspace passe à : ```text 0.3.2-pre.2 ``` Les deux crates sont ajoutées aux membres du workspace. ## 4. Graphe matérialisé ```text ksp-store-lib ├── ksp-store-api └── [default feature postgres] └── ksp-store-postgres-lib └── ksp-store-api ``` Invariants : ```text ksp-store-postgres-lib -X-> ksp-store-lib ksp-store-lib -X-> Config/Transport/Program/Materializer ksp-store-postgres-lib -X-> Config/Transport/Program/Materializer ``` Feature exacte : ```toml [features] default = ["postgres"] postgres = ["dep:ksp-store-postgres-lib"] ``` `ksp-store-postgres-lib` reste une optional dependency de la façade afin que : ```text cargo check -p ksp-store-lib --no-default-features ``` puisse compiler sans backend PostgreSQL. ## 5. Dépendances volontairement différées `pre.002` n'ajoute pas encore : ```text ksp-logging-lib tokio tokio-postgres deadpool-postgres tokio-postgres-rustls rustls sha2 ``` Ce n'est pas une remise en cause du graphe cible du plan 023. Aucun comportement de production ne consomme encore ces crates dans le scaffold ; les ajouter maintenant violerait le contrat selon lequel une dépendance de package correspond à un usage réel. Le séquencement reste : ```text ksp-logging-lib façade lors du premier comportement Store réel ksp-logging-lib backend lors du premier comportement PostgreSQL réel tokio/driver/pool/TLS pre.005 sha2 pre.006 ``` Les deux crates possèdent cependant dès maintenant leur `src/constants.rs` et le `TRACING_TARGET` crate-owned attendu, sans émission de log artificielle. ## 6. Surface Rust `ksp-store-lib` reste un scaffold sans API runtime publique. Il ne matérialise pas encore : ```text Store StoreSettings StoreBackendSettings PostgresStoreSettings StoreBackendKind errors Store runtime reexports ksp-store-api ``` Ces éléments restent réservés à `pre.003`. `ksp-store-postgres-lib` n'expose encore aucun type backend public et ne contient aucun driver, pool, SQL, migration ou health runtime. Aucun `pub mod` n'est introduit. ## 7. Canaris ajoutés ### `ksp-store-lib` `tests/dependency_boundary.rs` vérifie : ```text default feature postgres exact optional backend dependency exacte façade -> ksp-store-api absence Config/Transport/Program/Materializer absence driver/pool/TLS prématurés absence de settings/Store/backend types publics en pre.002 TRACING_TARGET possédé par constants.rs ``` ### `ksp-store-postgres-lib` `tests/dependency_boundary.rs` vérifie : ```text backend -> ksp-store-api absence backend -> ksp-store-lib absence Config/Transport/Program/Materializer absence Tokio/tokio-postgres/Deadpool/Rustls/SHA-256 absence SQL/migration/runtime surface prématurée TRACING_TARGET possédé par constants.rs ``` ## 8. Documentation mise à jour ```text docs/plans/023-V0_3_2_STORE_POSTGRES_FOUNDATION_PLAN.md docs/validation/019-V0_3_2_STORE_POSTGRES_FOUNDATION.md ``` Le plan marque le scaffold comme matérialisé et précise le staging des dépendances runtime. La validation conserve les critères Cargo en `TODO` tant que le gate opérateur de cette tranche n'a pas été fourni. ## 9. Fichiers ajoutés ```text crates/ksp-store-lib/Cargo.toml crates/ksp-store-lib/src/constants.rs crates/ksp-store-lib/src/lib.rs crates/ksp-store-lib/tests/dependency_boundary.rs crates/ksp-store-postgres-lib/Cargo.toml crates/ksp-store-postgres-lib/src/constants.rs crates/ksp-store-postgres-lib/src/lib.rs crates/ksp-store-postgres-lib/tests/dependency_boundary.rs deltas/0.3.2/pre.002.md ``` ## 10. Fichiers modifiés ```text Cargo.toml docs/plans/023-V0_3_2_STORE_POSTGRES_FOUNDATION_PLAN.md docs/validation/019-V0_3_2_STORE_POSTGRES_FOUNDATION.md ``` ## 11. Fichiers supprimés ```text aucun ``` ## 12. Validations exécutées dans l'environnement de génération ```text python3 scripts/audit_rust_workspace_rules.py General Rust rule audit: clean Rust export completeness audit: 0 candidate(s) KSP workspace Rust rule audit: clean python3 scripts/audit_markdown_tables.py README.md RULES.md ROADMAP.md CHANGELOG.md docs prompts crates deltas/0.3.2 Markdown table audit: clean (186 tables, 125 files) ``` Une validation statique complémentaire des manifests/features confirme également le graphe exact attendu et les deux canaris de frontière ont été rejoués par équivalent textuel dans l’environnement sans Cargo. ## 13. Validations opérateur requises `cargo`, `rustc` et `rustfmt` ne sont pas disponibles dans l'environnement de génération. Après application : ```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-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 ``` Une commande non exécutée n'est pas déclarée PASS. ## 14. Hors scope confirmé ```text StoreSettings / backend selection runtime STORE_BACKEND_NOT_COMPILED Config std.store URI/secrets Store connexion PostgreSQL pool Deadpool TLS Rustls migrations/bootstrap health/readiness runtime SQL métier RawTransaction PostgreSQL RawAccountState PostgreSQL ``` ## 15. Suite `0.3.2-pre.003` matérialise les settings backend-neutral, l'identité/sélection de backend, les erreurs stables de façade et le lifecycle contract `Store` sans encore ouvrir la connexion PostgreSQL lourde.