v0.3.2-pre.005
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
<!-- file: docs/plans/023-V0_3_2_STORE_POSTGRES_FOUNDATION_PLAN.md -->
|
||||
<!-- version: 6 -->
|
||||
<!-- version: 7 -->
|
||||
|
||||
# Plan `0.3.2` — Store/PostgreSQL runtime foundation
|
||||
|
||||
@@ -963,7 +963,22 @@ Document/schema/example/registry/adaptor, `.env.example`, provenance/sensitivity
|
||||
|
||||
### `pre.005` — PostgreSQL connection + deadpool + Rustls
|
||||
|
||||
Implémenter parse/normalisation URI, pool borné, connect/open/close, VerifyFull/Disabled, timeouts et erreurs redacted. Aucun SQL métier.
|
||||
Matérialiser le bridge physique backend sans modifier la façade publique backend-neutral :
|
||||
|
||||
```text
|
||||
ksp-store-lib
|
||||
-> PostgresBackendSettings privé à la composition
|
||||
-> PostgresBackend::open/close
|
||||
|
||||
ksp-store-postgres-lib
|
||||
-> tokio-postgres >= 0.7.18
|
||||
-> deadpool-postgres ^0.14.2
|
||||
-> tokio-postgres-rustls 0.14.x
|
||||
-> rustls 0.23.x + AWS-LC
|
||||
-> roots système via rustls-native-certs
|
||||
```
|
||||
|
||||
Après parsing, la policy KSP réécrit `application_name`, `connect_timeout`, `sslnegotiation` et `sslmode`; les `options=` serveur sont rejetées. `Disabled` force le plaintext, `VerifyFull` force TLS + roots système + identité serveur et interdit un target `hostaddr` sans `host` ainsi que les sockets Unix, sur lesquels PostgreSQL ne négocie pas TLS. Le pool applique `max_size` et deadlines `wait/create/recycle`, utilise le recycling `Verified`, et `Store::open` ne réussit qu'après une première acquisition physique. Les erreurs externes ne sont jamais conservées comme source/texte public. `Store::close` ferme et draine sous deadline; `Drop` reste best-effort. Aucun SQL KSP, migration ou table métier n'est introduit.
|
||||
|
||||
### `pre.006` — Migration/bootstrap foundation
|
||||
|
||||
@@ -1051,8 +1066,6 @@ Aucune question architecturale ne bloque `pre.002`.
|
||||
Les détails suivants sont réservés à leur tranche sans rouvrir les décisions du gate :
|
||||
|
||||
```text
|
||||
mapping exact deadpool timeouts en pre.005
|
||||
construction exacte du rustls RootCertStore en pre.005
|
||||
DDL précis de ksp_store_schema_migrations en pre.006
|
||||
forme finale des snapshots health en pre.007
|
||||
```
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!-- file: docs/validation/019-V0_3_2_STORE_POSTGRES_FOUNDATION.md -->
|
||||
<!-- version: 6 -->
|
||||
<!-- version: 7 -->
|
||||
|
||||
# Validation `0.3.2` — Store/PostgreSQL runtime foundation
|
||||
|
||||
@@ -74,6 +74,8 @@ Le gate opérateur de `pre.002-fix.001`, fourni le 29 août 2026, est entièreme
|
||||
|
||||
Le gate opérateur de `pre.003-fix.001`, fourni le 29 août 2026, est entièrement vert : audits Rust/Markdown, workspace check/Clippy, tests `ksp-store-lib` avec et sans feature par défaut, tests backend et compilation `--no-default-features` passent. Cette base est l'entrée effective de `pre.004`.
|
||||
|
||||
Le gate opérateur de `pre.004-fix.001`, après correction manuelle des commentaires `.env.example`, est entièrement vert : audits Rust/Markdown, workspace check/Clippy, 126 tests `ksp-config-lib`, ownership, `ksp-store-lib` avec et sans feature PostgreSQL, compilation `--no-default-features` et 63 tests Config Desk passent. Cette base est l'entrée effective de `pre.005`.
|
||||
|
||||
## 3. Frontières Cargo
|
||||
|
||||
### V32-DEP-001 — Façade -> API
|
||||
@@ -134,7 +136,9 @@ Store/backend -> Materializer
|
||||
consumer ordinaire -> ksp-store-postgres-lib
|
||||
```
|
||||
|
||||
Statut : `TODO pre.009`.
|
||||
Matérialisé par `pre.005` : les types physiques nécessaires sont publics uniquement dans la crate backend pour la frontière inter-crates et ne sont jamais réexportés par `ksp-store-lib`; `Pool/Client/Row/Statement` restent absents de sa crate-root.
|
||||
|
||||
Statut : `TODO gate opérateur pre.005 / TODO pre.009`.
|
||||
|
||||
### V32-DEP-006 — `ksp-store-api` non régressé
|
||||
|
||||
@@ -199,9 +203,9 @@ close borné
|
||||
Drop best-effort seulement
|
||||
```
|
||||
|
||||
`pre.003` fixe les signatures `Store::open(settings).await` et `Store::close(self).await` et garde `Store` opaque/non constructible par un consumer. Aucun succès d'ouverture n'est simulé avant la connexion réelle : le backend compilé s'arrête avec `store.backend_open_failed` et le contexte sûr `runtime_foundation_pending`.
|
||||
`pre.003` fixe les signatures `Store::open(settings).await` et `Store::close(self).await`. `pre.005` remplace le stop de staging PostgreSQL par l'ouverture physique : un succès exige `pool.get().await` après construction du pool, puis `close(self)` ferme et draine ce pool sous la deadline configurée. Aucun pool/client n'est exposé par la façade.
|
||||
|
||||
Statut : `PASS pre.003-fix.001 opérateur` pour les signatures et le staging ; `TODO pre.007` pour le shutdown physique borné.
|
||||
Statut : `PASS pre.003-fix.001 opérateur` pour les signatures / `TODO gate opérateur pre.005` pour l'ouverture et le shutdown physiques / `TODO pre.007` pour la composition health.
|
||||
|
||||
## 5. Config ownership
|
||||
|
||||
@@ -220,7 +224,7 @@ backend postgres explicite
|
||||
|
||||
Matérialisé par `pre.004` puis corrigé par `pre.004-fix.001` avec `cfg.std.store` / `schema.std.store`, trois targets committed `devnet`/`mainnet`/`testnet`, `default_profile = devnet`, un `network` explicite par target et des URI PostgreSQL séparées.
|
||||
|
||||
Statut : `TODO gate opérateur pre.004-fix.001`.
|
||||
Statut : `PASS pre.004-fix.001 opérateur`.
|
||||
|
||||
### V32-CONFIG-002 — Secrets/provenance
|
||||
|
||||
@@ -235,7 +239,7 @@ dotenv inventory à jour
|
||||
|
||||
Matérialisé par `pre.004-fix.001` : les trois URI réseau-spécifiques sont inventoriées, chaque fallback reste `Secret`, la safe projection est redacted et la provenance n'embarque aucune valeur.
|
||||
|
||||
Statut : `TODO gate opérateur pre.004-fix.001`.
|
||||
Statut : `PASS pre.004-fix.001 opérateur`.
|
||||
|
||||
### V32-CONFIG-002B — Target/réseau sans multiplexage
|
||||
|
||||
@@ -252,7 +256,7 @@ future RAW mismatch Store.network != entity/query.network rejeté avant I/O
|
||||
|
||||
Matérialisé contractuellement par `pre.004-fix.001`; l'enforcement sur opérations RAW sera exercé dans `0.3.3`/`0.3.4`.
|
||||
|
||||
Statut : `TODO gate opérateur pre.004-fix.001 / TODO 0.3.3-0.3.4`.
|
||||
Statut : `PASS pre.004-fix.001 opérateur` pour la sélection target/réseau / `TODO 0.3.3-0.3.4` pour le mismatch RAW.
|
||||
|
||||
### V32-CONFIG-003 — No-env Store/backend
|
||||
|
||||
@@ -269,7 +273,7 @@ PG*
|
||||
|
||||
`pre.004` renforce aussi le canari d'ownership avec les nouveaux filenames Store ; `pre.004-fix.001` conserve cette frontière tout en ajoutant le réseau au contrat `StoreSettings`. Store/backend restent sans dépendance Config et sans lecture KSP/KSPB.
|
||||
|
||||
Statut : `TODO gate opérateur pre.004-fix.001 / TODO pre.009`.
|
||||
Statut : `PASS pre.004-fix.001 opérateur / TODO pre.009`.
|
||||
|
||||
### V32-CONFIG-004 — Adapter Config -> Store
|
||||
|
||||
@@ -277,7 +281,7 @@ Critère : `ksp-config-lib` seul transforme un profil/target résolu en `StoreSe
|
||||
|
||||
Matérialisé par `pre.004` puis `pre.004-fix.001` : seul `ksp-config-lib` dépend de `ksp-store-lib` avec `default-features = false`; il mappe le `profile_id` sélectionné vers un target, construit son `RawNetworkId` et ses settings backend sans forcer la feature backend.
|
||||
|
||||
Statut : `TODO gate opérateur pre.004-fix.001`.
|
||||
Statut : `PASS pre.004-fix.001 opérateur`.
|
||||
|
||||
## 6. Pool et lifecycle PostgreSQL
|
||||
|
||||
@@ -292,19 +296,25 @@ aucune taille zéro
|
||||
aucune valeur pathologique
|
||||
```
|
||||
|
||||
Statut : `TODO pre.005`.
|
||||
Matérialisé par `pre.005` : `deadpool-postgres` possède un pool `max_size` explicite et applique les deadlines `wait/create/recycle`; `tokio-postgres::Config` reçoit aussi le `connect_timeout` typé après parsing de l'URI.
|
||||
|
||||
Statut : `TODO gate opérateur pre.005`.
|
||||
|
||||
### V32-POOL-002 — Connection task ownership
|
||||
|
||||
Critère : chaque connection future tokio-postgres est pilotée par le manager retenu et son task handle reste possédé jusqu'au drop/close.
|
||||
|
||||
Statut : `TODO pre.005/pre.009`.
|
||||
`pre.005` délègue la création/recycle des connexions au `Manager` Deadpool retenu ; aucun `tokio::spawn` KSP n'est introduit dans Store. La preuve de non-régression détaillée reste au hardening.
|
||||
|
||||
Statut : `TODO gate opérateur pre.005 / TODO pre.009`.
|
||||
|
||||
### V32-POOL-003 — Open failure safe
|
||||
|
||||
Critère : DNS/connect/auth/server errors ne copient ni URI ni texte remote arbitraire dans Display/Debug public.
|
||||
|
||||
Statut : `TODO pre.005`.
|
||||
Matérialisé par `pre.005` : parsing/connexion/pool/TLS sont ramenés à une classification backend locale sans conserver le texte des erreurs externes ni l'URI. La façade mappe vers des codes `store.postgres_*` stables avec contexte statique sûr.
|
||||
|
||||
Statut : `TODO gate opérateur pre.005`.
|
||||
|
||||
### V32-POOL-004 — Close
|
||||
|
||||
@@ -317,7 +327,9 @@ shutdown respecte timeout
|
||||
aucune tâche volontairement laissée orpheline
|
||||
```
|
||||
|
||||
Statut : `TODO pre.007/pre.008`.
|
||||
`pre.005` matérialise déjà `Pool::close()` et un drain borné par `shutdown_timeout`; `Drop` ne fait qu'un `close()` best-effort. La preuve end-to-end avec backend réel reste réservée à `pre.007/pre.008`.
|
||||
|
||||
Statut : `TODO gate opérateur pre.005 / TODO pre.007/pre.008`.
|
||||
|
||||
## 7. TLS
|
||||
|
||||
@@ -330,7 +342,9 @@ Disabled
|
||||
VerifyFull
|
||||
```
|
||||
|
||||
Statut : `TODO pre.005`.
|
||||
Matérialisé par `pre.005` : la surface physique accepte exactement `Disabled` et `VerifyFull`; l'URI parsée est ensuite normalisée vers `SslMode::Disable` ou `SslMode::Require`, donc elle ne peut pas modifier la policy typée.
|
||||
|
||||
Statut : `TODO gate opérateur pre.005`.
|
||||
|
||||
### V32-TLS-002 — VerifyFull
|
||||
|
||||
@@ -344,7 +358,9 @@ nom serveur vérifié
|
||||
aucun fallback plaintext
|
||||
```
|
||||
|
||||
Statut : `TODO pre.005`.
|
||||
Matérialisé par `pre.005` : `VerifyFull` construit un `rustls::RootCertStore` à partir des roots système, utilise explicitement le provider AWS-LC, requiert un host TCP pour l'identité serveur, rejette `hostaddr` seul et les sockets Unix, et ne permet aucun fallback plaintext. Les erreurs de roots/certificats sont réduites à des compteurs sûrs.
|
||||
|
||||
Statut : `TODO gate opérateur pre.005`.
|
||||
|
||||
### V32-TLS-003 — Pas de fichier TLS implicite
|
||||
|
||||
|
||||
Reference in New Issue
Block a user