v0.3.2-pre.007
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
<!-- file: docs/plans/023-V0_3_2_STORE_POSTGRES_FOUNDATION_PLAN.md -->
|
||||
<!-- version: 8 -->
|
||||
<!-- version: 9 -->
|
||||
|
||||
# Plan `0.3.2` — Store/PostgreSQL runtime foundation
|
||||
|
||||
@@ -563,7 +563,7 @@ ops futures ont besoin d'un diagnostic safe sans pool leak
|
||||
close doit être observable sans exposer le backend
|
||||
```
|
||||
|
||||
Surface candidate dans `ksp-store-lib` :
|
||||
Surface matérialisée dans `ksp-store-lib` par `pre.007` :
|
||||
|
||||
```text
|
||||
StoreHealthState
|
||||
@@ -574,17 +574,24 @@ StoreRuntimeSnapshot
|
||||
Projection sûre seulement :
|
||||
|
||||
```text
|
||||
backend kind
|
||||
state
|
||||
pool size/available sous forme de compteurs bornés
|
||||
schema/migration version courante
|
||||
pending migration count
|
||||
last safe error code éventuel
|
||||
StoreRuntimeSnapshot
|
||||
backend kind
|
||||
network logique
|
||||
pool capacity/size/available/waiting bornés
|
||||
|
||||
StoreHealthSnapshot
|
||||
Ready | NotReady
|
||||
runtime snapshot
|
||||
migration version observée éventuelle
|
||||
pending migration count
|
||||
last safe ErrorCode éventuel
|
||||
```
|
||||
|
||||
Interdits : URI, host, username, database name si sensible, SQL, nom physique de relation, server error string, pool/client handles.
|
||||
`Store::runtime_snapshot()` est synchrone et ne réalise aucun I/O. `Store::health().await` est un probe borné : acquisition Deadpool sous deadline, `SELECT 1`, puis lecture interne de la version maximale de `ksp_store_schema_migrations`. Un échec ne renvoie jamais le texte PostgreSQL ; il produit `NotReady` et un code KSP déjà classifié. La deadline du probe réutilise le `wait_timeout` du pool, avec un fallback interne borné uniquement si le pool ne fournit pas ce paramètre.
|
||||
|
||||
Le backend PostgreSQL peut utiliser `SELECT 1` et une introspection minimale interne, puis mapper son résultat vers la projection portable.
|
||||
Interdits : URI, host, username, database name si sensible, SQL, nom physique de relation dans la projection publique, server error string, pool/client handles.
|
||||
|
||||
Le probe ne vérifie pas toute l'intégrité checksum à chaque appel : `Store::open` reste propriétaire de la vérification complète bootstrap/history avant de rendre une instance. Le health relit la disponibilité et la version de schéma comme diagnostic léger.
|
||||
|
||||
## 12. Config `std.store`
|
||||
|
||||
@@ -984,7 +991,7 @@ Le gate opérateur de `pre.005-fix.001` est vert : audits, workspace check/Clipp
|
||||
|
||||
### `pre.006` — Migration/bootstrap foundation
|
||||
|
||||
Statut : matérialisé par `0.3.2-pre.006`, gate Cargo opérateur à exécuter.
|
||||
Statut : matérialisé par `0.3.2-pre.006`, gate opérateur vert.
|
||||
|
||||
La tranche introduit un moteur privé `ksp-store-postgres-lib` sans crate de migration externe :
|
||||
|
||||
@@ -1011,7 +1018,21 @@ Avec les quatre codes PostgreSQL ajoutés en `pre.005` puis les trois codes migr
|
||||
|
||||
### `pre.007` — Composition end-to-end + health
|
||||
|
||||
Fermer `StoreSettings -> Store -> PostgresBackend`, health/readiness portable, close et mapping diagnostics.
|
||||
Statut : matérialisé par `0.3.2-pre.007`, gate Cargo opérateur requis.
|
||||
|
||||
La façade ferme la projection runtime/health sans exposer de type physique :
|
||||
|
||||
```text
|
||||
Store::runtime_snapshot() -> StoreRuntimeSnapshot
|
||||
Store::health().await -> StoreHealthSnapshot
|
||||
|
||||
StoreHealthState = Ready | NotReady
|
||||
ERROR_CODE_POSTGRES_HEALTH_FAILED = store.postgres_health_failed
|
||||
```
|
||||
|
||||
Le backend ajoute uniquement deux DTO bridge safe (`PostgresBackendRuntimeSnapshot`, `PostgresBackendHealthSnapshot`). Les compteurs `max_size/size/available/waiting` sont saturés en `u32`. Le probe est borné, exécute seulement une disponibilité légère et la lecture de version de migration, puis mappe tout échec vers une classification backend statique sans source externe. `Store::open` ne change pas de sémantique : il ne rend une instance qu'après connexion physique et bootstrap/history vérifiés. Aucun SQL métier RAW n'est introduit.
|
||||
|
||||
Avec `StoreHealthState`, `StoreRuntimeSnapshot`, `StoreHealthSnapshot` et `ERROR_CODE_POSTGRES_HEALTH_FAILED`, la façade atteint désormais 84 exports crate-root : 60 réexports `ksp-store-api` et 24 éléments runtime Store.
|
||||
|
||||
### `pre.008` — PostgreSQL integration réelle
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!-- file: docs/validation/019-V0_3_2_STORE_POSTGRES_FOUNDATION.md -->
|
||||
<!-- version: 8 -->
|
||||
<!-- version: 9 -->
|
||||
|
||||
# Validation `0.3.2` — Store/PostgreSQL runtime foundation
|
||||
|
||||
@@ -207,7 +207,7 @@ Drop best-effort seulement
|
||||
|
||||
`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 / `PASS pre.005-fix.001 opérateur` pour l'ouverture et le shutdown physiques / `TODO pre.007` pour la composition health.
|
||||
Statut : `PASS pre.003-fix.001 opérateur` pour les signatures / `PASS pre.005-fix.001 opérateur` pour l'ouverture et le shutdown physiques / `TODO gate opérateur pre.007` pour la composition health.
|
||||
|
||||
## 5. Config ownership
|
||||
|
||||
@@ -331,7 +331,7 @@ aucune tâche volontairement laissée orpheline
|
||||
|
||||
`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 : `PASS pre.005-fix.001 opérateur / TODO pre.007/pre.008`.
|
||||
Statut : `PASS pre.005-fix.001 opérateur / TODO gate pre.007 / TODO pre.008 live`.
|
||||
|
||||
## 7. TLS
|
||||
|
||||
@@ -384,7 +384,7 @@ et aucune table métier RAW/CORE/DECODE/SPECIALIZED.
|
||||
|
||||
`pre.006` embarque exactement `migrations/V000__bootstrap.sql`, dont le seul DDL de production crée `ksp_store_schema_migrations`. Le canari source interdit les identifiants métier RAW/CORE/DECODE/SPECIALIZED dans le moteur et la ressource SQL.
|
||||
|
||||
Statut : `TODO gate opérateur pre.006 / TODO pre.008 live`.
|
||||
Statut : `PASS pre.006 opérateur / TODO pre.008 live`.
|
||||
|
||||
### V32-MIG-002 — Version/checksum
|
||||
|
||||
@@ -400,7 +400,7 @@ mismatch historique terminal
|
||||
|
||||
`pre.006` calcule explicitement SHA-256 sur les octets exacts du SQL embarqué puis encode les 32 octets en 64 caractères hex minuscules. Le sentinel `(0, bootstrap, checksum)` est inséré dans la même transaction que la création metadata. Les tests unitaires figent le checksum du SQL committed et couvrent sentinel valide, missing, nom/checksum divergents et historique plus récent.
|
||||
|
||||
Statut : `TODO gate opérateur pre.006 / TODO pre.008 live`.
|
||||
Statut : `PASS pre.006 opérateur / TODO pre.008 live`.
|
||||
|
||||
### V32-MIG-003 — Concurrence
|
||||
|
||||
@@ -408,7 +408,7 @@ Critère : deux runners concurrents sont sérialisés par advisory transaction l
|
||||
|
||||
`pre.006` utilise une clé KSP fixe et `pg_try_advisory_xact_lock($1)` dans une boucle bornée par `migration_lock_timeout`, avec polling de 25 ms maximum. Aucun lock bloquant illimité n'est utilisé.
|
||||
|
||||
Statut : `TODO gate opérateur pre.006 / TODO pre.008 concurrence réelle`.
|
||||
Statut : `PASS pre.006 opérateur / TODO pre.008 concurrence réelle`.
|
||||
|
||||
### V32-MIG-004 — Atomicité/recovery
|
||||
|
||||
@@ -416,7 +416,7 @@ Critère : échec d'une migration du run courant rollback DDL + history de ce ru
|
||||
|
||||
`pre.006` place lock, metadata DDL, sentinel et validation dans une transaction unique ; toute sortie d'erreur avant `commit()` droppe la transaction et PostgreSQL rollback le run courant. Un timeout externe borne également l'ensemble du bootstrap. L'injection d'échec et la preuve physique du rollback restent au smoke réel.
|
||||
|
||||
Statut : `TODO gate opérateur pre.006 / TODO pre.008 rollback réel`.
|
||||
Statut : `PASS pre.006 opérateur / TODO pre.008 rollback réel`.
|
||||
|
||||
### V32-MIG-005 — Newer runtime guard
|
||||
|
||||
@@ -424,7 +424,7 @@ Critère : migration appliquée inconnue/supérieure à la liste embarquée prod
|
||||
|
||||
`pre.006` connaît uniquement la version `0`; toute history `> 0` est classée `SchemaNewer` par le backend puis `store.postgres_schema_newer` par la façade. Aucun chemin de down migration n'existe.
|
||||
|
||||
Statut : `TODO gate opérateur pre.006`.
|
||||
Statut : `PASS pre.006 opérateur`.
|
||||
|
||||
### V32-MIG-006 — SQL injection
|
||||
|
||||
@@ -438,7 +438,7 @@ aucun identifier physique user-configurable en 0.3.2
|
||||
|
||||
`pre.006` garde le DDL versionné sous `include_str!` et toutes les values variables des requêtes de contrôle (`lock key`, `statement_timeout`, history values) passent par paramètres. Les noms physiques sont des constantes KSP, jamais des settings.
|
||||
|
||||
Statut : `TODO gate opérateur pre.006 / TODO pre.009 hardening`.
|
||||
Statut : `PASS pre.006 opérateur / TODO pre.009 hardening`.
|
||||
|
||||
### V32-MIG-007 — No business capability
|
||||
|
||||
@@ -456,21 +456,27 @@ Statut : `TODO pre.009/gate final`.
|
||||
|
||||
### V32-HEALTH-001 — Projection portable
|
||||
|
||||
Critère : façade expose uniquement état/backend/counts/migration safe, jamais URI/SQL/pool/client.
|
||||
Critère : façade expose uniquement état/backend/network/counts/migration safe, jamais URI/SQL/pool/client.
|
||||
|
||||
Statut : `TODO pre.007`.
|
||||
`pre.007` matérialise `StoreRuntimeSnapshot`, `StoreHealthState::{Ready, NotReady}` et `StoreHealthSnapshot`. Les compteurs pool sont bornés en `u32`; la version migration est optionnelle si le probe ne peut pas la lire.
|
||||
|
||||
Statut : `TODO gate opérateur pre.007`.
|
||||
|
||||
### V32-HEALTH-002 — Readiness réelle
|
||||
|
||||
Critère : `Store::open` ne retourne Ready qu'après connect + bootstrap/verify selon settings.
|
||||
Critère : `Store::open` ne retourne Ready qu'après connect + bootstrap/verify selon settings, et `Store::health()` sonde ensuite la disponibilité physique sous deadline.
|
||||
|
||||
Statut : `TODO pre.007/pre.008`.
|
||||
`pre.007` conserve l'ouverture stricte acquise en `pre.006` et ajoute un probe borné par le `wait_timeout` du pool : acquisition, `SELECT 1`, lecture de version migration. Le smoke réel reste nécessaire pour prouver ce chemin contre PostgreSQL.
|
||||
|
||||
Statut : `TODO gate opérateur pre.007 / TODO pre.008 live`.
|
||||
|
||||
### V32-HEALTH-003 — Error redaction
|
||||
|
||||
Critère : un health failure n'expose pas server error string, query text ou credential.
|
||||
|
||||
Statut : `TODO pre.007/pre.009`.
|
||||
Le backend ne conserve que `PostgresBackendErrorKind`; la façade mappe vers un `ErrorCode` KSP optionnel. Le snapshot public ne contient aucune string serveur, URI, SQL, host, user, database ou handle.
|
||||
|
||||
Statut : `TODO gate opérateur pre.007 / TODO pre.009 hardening`.
|
||||
|
||||
## 10. PostgreSQL integration réelle
|
||||
|
||||
|
||||
Reference in New Issue
Block a user