Files
2026-08-29 19:53:00 +02:00

4.2 KiB

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 :

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 :

crates/ksp-store-postgres-lib/migrations/V000__bootstrap.sql

Elle crée uniquement :

ksp_store_schema_migrations

avec les champs minimaux :

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 :

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 :

MigrationFailed
MigrationMismatch
SchemaNewer

La façade mappe vers :

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 :

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

workspace.package.version = 0.3.2-pre.6

9. Gate opérateur

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.