# Delta `0.3.2-pre.005` — PostgreSQL connection + pool + TLS ## 1. Base Base exacte : `0.3.2-pre.004-fix.001`, incluant l'ajustement opérateur de `.env.example` version `13`. Le gate opérateur du 29 août 2026 est entièrement vert : audits Rust/Markdown, workspace check/Clippy, 126 tests Config, ownership, Store avec et sans feature PostgreSQL, compilation `--no-default-features` et Config Desk passent. ## 2. Objet Matérialiser la première ouverture PostgreSQL physique sans ouvrir encore les migrations ou le SQL métier : ```text tokio-postgres 0.7.18+ deadpool-postgres 0.14.x tokio-postgres-rustls 0.14.x rustls 0.23.x / AWS-LC roots système pool borné Store::open physique Store::close borné ``` ## 3. Frontière façade/backend `ksp-store-lib` reste l'unique surface consumer et ne dépend directement d'aucun driver/pool/TLS. Il convertit ses settings vers un bridge `ksp-store-postgres-lib`, puis mappe les erreurs backend vers des `ErrorCode` Store stables. `ksp-store-postgres-lib` possède seul : ```text parse/normalisation tokio_postgres::Config Deadpool Manager/Pool connector Rustls roots système première acquisition physique fermeture/drain physique ``` Les types physiques `Pool`, `Client`, `Row` et `Statement` ne sont jamais réexportés par la façade. ## 4. Normalisation de l'URI Le backend consomme uniquement l'URI déjà résolue par Config. Après parsing, KSP impose : ```text application_name = ksp-store connect_timeout = settings typés sslnegotiation = postgres Disabled -> sslmode=disable VerifyFull -> sslmode=require ``` `options=` est rejeté dans cette fondation. `VerifyFull` exige un host TCP afin de disposer d'une identité serveur à vérifier : `hostaddr` seul et les sockets Unix sont rejetés. Les erreurs de parsing ne conservent jamais le texte de l'URI. ## 5. Pool et lifecycle Le pool applique les limites validées en `pre.003` : taille maximale et deadlines `wait/create/recycle`. Le manager utilise `RecyclingMethod::Verified`; la requête de vérification éventuelle reste interne à Deadpool et aucun SQL KSP n'est ajouté. La création du pool est lazy, donc `Store::open` exécute explicitement une première `pool.get().await`. Le succès signifie ainsi qu'une connexion physique/auth/TLS a réellement été établie. `Store::close(self)` appelle `Pool::close()` puis attend un drain `size == 0` sous `shutdown_timeout`. `Drop` ne fait qu'un close best-effort. ## 6. TLS Modes exacts : ```text Disabled VerifyFull ``` `VerifyFull` charge les roots système dans `rustls::RootCertStore`, utilise explicitement le provider AWS-LC et conserve la vérification standard de certificat + identité serveur. Aucun mode `Prefer`, aucun verifier permissif et aucun fallback plaintext ne sont introduits. ## 7. Erreurs sûres Le backend retourne uniquement une classification et une phase statique : ```text ConfigInvalid ConnectFailed PoolTimeout ShutdownTimeout TlsFailed ``` La façade mappe vers : ```text store.postgres_config_invalid store.postgres_connect_failed store.postgres_pool_timeout store.postgres_tls_failed store.shutdown_timeout ``` Aucune erreur `tokio-postgres`, Deadpool, Rustls ou native-certs n'est attachée comme source publique. ## 8. Hors scope ```text migrations/bootstrap SQL ksp_store_schema_migrations health snapshot public RAW transaction/account persistence routing multi-target/multi-réseau dans Store live PostgreSQL integration test ``` Ces éléments restent respectivement aux tranches `pre.006`, `pre.007`, `0.3.3/0.3.4` et `pre.008`. ## 9. Version ```text workspace.package.version = 0.3.2-pre.5 ``` ## 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-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 cargo tree --duplicates ```