# Delta `0.3.2-pre.006` — migration/bootstrap PostgreSQL foundation ## 1. Base Base exacte : `0.3.2-pre.005-fix.001`. Le gate opérateur du 29 août 2026 est entièrement vert : audits Rust/Markdown, workspace check/Clippy, tests `ksp-store-postgres-lib`, tests `ksp-store-lib` avec et sans feature PostgreSQL et compilation `--no-default-features` passent. Les versions physiques réellement résolues observées sont `tokio-postgres 0.7.18`, `deadpool-postgres 0.14.2` et `tokio-postgres-rustls 0.14.0`. ## 2. Objet Matérialiser le moteur privé de migration/bootstrap de la fondation PostgreSQL, sans aucune persistence métier : ```text ksp_store_schema_migrations uniquement sentinel version 0 nom bootstrap immuable SHA-256 du SQL exact advisory transaction lock borné statement timeout transaction-local transaction unique validation metadata/history newer-runtime guard rollback du run courant ``` ## 3. Dépendance SHA-256 `sha2 ^0.11` devient une dépendance workspace explicite et une dépendance directe de `ksp-store-postgres-lib`, car le backend calcule lui-même le checksum persistant. Le digest SHA-256 est encodé explicitement en 64 caractères hex minuscules ; aucune dépendance de codec hex supplémentaire n'est ajoutée. ## 4. Migration bootstrap embarquée La seule ressource SQL de production ajoutée est : ```text crates/ksp-store-postgres-lib/migrations/V000__bootstrap.sql ``` Elle crée uniquement : ```text ksp_store_schema_migrations ``` avec les champs minimaux : ```text version BIGINT PRIMARY KEY name TEXT NOT NULL checksum TEXT NOT NULL applied_at TIMESTAMPTZ NOT NULL ``` Aucune table/index RAW, CORE, DECODE ou SPECIALIZED n'est introduit. ## 5. Algorithme runtime Après la première acquisition physique déjà introduite en `pre.005`, le backend conserve ce client dédié et exécute : ```text begin transaction pg_try_advisory_xact_lock($1) en polling borné set_config('statement_timeout', $1, true) probe metadata si absente et auto_migrate=false -> migration_pending sans DDL si absente et auto_migrate=true -> V000 + sentinel dans la même transaction si présente -> vérification forme minimale + PK version load history ordered missing/divergence -> migration mismatch version > 0 -> schema newer commit unique ``` L'ensemble du bootstrap est aussi borné par `migration_timeout`. Une sortie avant `commit()` droppe la transaction ; le rollback PostgreSQL implicite protège DDL et history du run courant. Les colonnes obligatoires de metadata sont vérifiées sans interdire des colonnes supplémentaires futures. Cela permet à un ancien runtime de lire une history plus récente et de produire `schema_newer` plutôt qu'un faux mismatch de forme. ## 6. Erreurs façade Le bridge backend ajoute : ```text MigrationFailed MigrationMismatch SchemaNewer ``` La façade mappe vers : ```text store.postgres_migration_failed store.postgres_migration_mismatch store.postgres_schema_newer ``` Aucun texte serveur, SQL, URI ou credential n'est propagé. ## 7. Tests/canaris Les tests unitaires sans serveur couvrent : ```text checksum exact/stable du V000 absence de schéma métier dans le SQL sentinel valide sentinel missing nom/checksum divergent history plus récente bridge backend étendu frontière dépendances + sha2 direct ``` La concurrence réelle, l'idempotence réelle et le rollback injecté restent au test PostgreSQL opt-in de `pre.008`. ## 8. Version ```text workspace.package.version = 0.3.2-pre.6 ``` ## 9. Gate opérateur ```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-postgres-lib cargo test -p ksp-store-lib cargo test -p ksp-store-lib --no-default-features cargo check -p ksp-store-lib --no-default-features cargo tree -p ksp-store-postgres-lib --edges normal cargo tree -p ksp-store-lib --edges normal ``` ## 10. Suite Après gate propre, `pre.007` ferme la composition end-to-end et ajoute la projection health/readiness sûre, sans ouvrir encore les tables RAW métier.