v0.3.2-pre.010

This commit is contained in:
2026-08-29 23:44:19 +02:00
parent 9ec4f26874
commit e1fe419028
4 changed files with 218 additions and 28 deletions

View File

@@ -1,5 +1,5 @@
<!-- file: docs/validation/019-V0_3_2_STORE_POSTGRES_FOUNDATION.md -->
<!-- version: 11 -->
<!-- version: 12 -->
# Validation `0.3.2` — Store/PostgreSQL runtime foundation
@@ -84,6 +84,8 @@ Le gate opérateur de `pre.007`, fourni le 29 août 2026, est entièrement vert
Le gate `pre.008` du 29 août 2026 est doublement vert : le gate déterministe passe intégralement puis `postgres_foundation_live` passe sur **PostgreSQL 17**. La preuve réelle couvre bootstrap initial/idempotent/concurrent, mismatch/recovery checksum, rollback transactionnel, health `Ready`, fermeture bornée et cleanup de la metadata possédée par le test. Cette base est l'entrée effective de `pre.009`.
Le gate opérateur de `pre.009`, fourni le 29 août 2026, est entièrement vert : audits Rust/Markdown, workspace check/Clippy, `ksp-store-api`, backend PostgreSQL, façade avec et sans feature, Config, compilation `--no-default-features`, graphes/features/duplicates et `cargo test --workspace` passent. Les canaris hardening/completeness ajoutés par `pre.009` sont donc validés. Cette base est l'entrée effective de `pre.010`.
## 3. Frontières Cargo
### V32-DEP-001 — Façade -> API
@@ -116,7 +118,7 @@ Preuves : manifest scanner + cargo tree.
Le canari source de `pre.002` interdit explicitement la dépendance inverse ; le `cargo tree` opérateur confirme l'absence de cycle. La frontière sera durcie à nouveau en `pre.009`.
Statut : `PASS pre.002 opérateur / MATÉRIALISÉ pre.009 / TODO gate opérateur`.
Statut : `PASS pre.002 opérateur / PASS pre.009 opérateur`.
### V32-DEP-004 — Feature PostgreSQL
@@ -146,7 +148,7 @@ consumer ordinaire -> ksp-store-postgres-lib
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 : `PASS pre.005-fix.001 opérateur / MATÉRIALISÉ pre.009 / TODO gate opérateur`.
Statut : `PASS pre.005-fix.001 opérateur / PASS pre.009 opérateur`.
### V32-DEP-006 — `ksp-store-api` non régressé
@@ -158,7 +160,7 @@ exports/capabilities existants conservés
aucun type backend ajouté pour PostgreSQL
```
Statut : `MATÉRIALISÉ pre.009 / TODO gate opérateur puis gate final` — le canari backend externe de `ksp-store-api` est rejoué sans modification de la crate.
Statut : `PASS pre.009 opérateur / TODO revalidation pre.010` — le canari backend externe de `ksp-store-api` est rejoué sans modification de la crate.
## 4. Public API et settings
@@ -176,7 +178,7 @@ Critère : `Postgres` reste un backend connu sans feature et `Store::open` écho
Matérialisé par `pre.003` : le test `feature_mismatch` appelle réellement `Store::open` sous `--no-default-features` et exige `store.backend_not_compiled`.
Statut : `PASS pre.003-fix.001 opérateur / MATÉRIALISÉ pre.009 / TODO gate opérateur`.
Statut : `PASS pre.003-fix.001 opérateur / PASS pre.009 opérateur`.
### V32-API-003 — Aucun type backend physique public
@@ -189,7 +191,7 @@ rustls::*
PostgresBackend / Pool / Client / Row / Statement
```
Statut : `MATÉRIALISÉ pre.009 / TODO gate opérateur`.
Statut : `PASS pre.009 opérateur`.
### V32-API-004 — Réexports Store API
@@ -197,7 +199,7 @@ Critère : un consumer de `ksp-store-lib` accède aux contrats Store API utiles
`pre.003` réexporte explicitement les 60 symboles crate-root acquis de `ksp-store-api` depuis `ksp-store-lib`, sans glob et sans réexport backend.
Statut : `PASS pre.003-fix.001 opérateur / MATÉRIALISÉ pre.009 exact exports / TODO gate opérateur`.
Statut : `PASS pre.003-fix.001 opérateur / PASS pre.009 opérateur exact exports`.
### V32-API-005 — Lifecycle
@@ -281,7 +283,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 : `PASS pre.004-fix.001 opérateur / MATÉRIALISÉ pre.009 / TODO gate opérateur`.
Statut : `PASS pre.004-fix.001 opérateur / PASS pre.009 opérateur`.
### V32-CONFIG-004 — Adapter Config -> Store
@@ -314,7 +316,7 @@ Critère : chaque connection future tokio-postgres est pilotée par le manager r
`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 : `PASS pre.005-fix.001 opérateur / MATÉRIALISÉ pre.009 / TODO gate opérateur`.
Statut : `PASS pre.005-fix.001 opérateur / PASS pre.009 opérateur`.
### V32-POOL-003 — Open failure safe
@@ -374,7 +376,7 @@ Statut : `PASS pre.005-fix.001 opérateur`.
Critère : backend ne lit pas `sslrootcert`, `sslcert`, `sslkey`, `.postgresql/*` ou autre fichier implicite hors settings KSP.
Statut : `MATÉRIALISÉ pre.009 / TODO gate opérateur`.
Statut : `PASS pre.009 opérateur`.
## 8. Migration/bootstrap
@@ -444,7 +446,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 : `PASS pre.006 opérateur / MATÉRIALISÉ pre.009 hardening / TODO gate opérateur`.
Statut : `PASS pre.006 opérateur / PASS pre.009 opérateur hardening`.
### V32-MIG-007 — No business capability
@@ -456,7 +458,7 @@ Critères :
0 repository RAW métier
```
Statut : `MATÉRIALISÉ pre.009 / TODO gate opérateur puis gate final`.
Statut : `PASS pre.009 opérateur / TODO revalidation pre.010`.
## 9. Health/readiness
@@ -482,7 +484,7 @@ Critère : un health failure n'expose pas server error string, query text ou cre
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 : `PASS pre.007 opérateur / MATÉRIALISÉ pre.009 hardening / TODO gate opérateur`.
Statut : `PASS pre.007 opérateur / PASS pre.009 opérateur hardening`.
## 10. PostgreSQL integration réelle
@@ -554,7 +556,7 @@ Attendu : rejet borné sans echo.
`pre.009` ajoute un test d'intégration backend qui force avant I/O : URI malformed, URI > 4096 octets, `hostaddr` sans identité sous `VerifyFull` et `options=` libpq. Chaque cas contient un canary secret et exige une erreur `ConfigInvalid` avec phase statique seulement.
Statut : `MATÉRIALISÉ pre.009 / TODO gate opérateur`.
Statut : `PASS pre.009 opérateur`.
### V32-SEC-002 — Secret canary
@@ -570,7 +572,7 @@ health snapshots
`pre.009` injecte des canaris distincts dans la façade et le backend. Les settings Debug doivent afficher `<redacted>`; les erreurs pré-I/O publiques/backend ne doivent contenir aucun canary. Les snapshots health restent couverts par les canaris déterministes de `pre.007`.
Statut : `MATÉRIALISÉ pre.009 / TODO gate opérateur`.
Statut : `PASS pre.009 opérateur`.
### V32-SEC-003 — Timeouts hostiles
@@ -578,19 +580,19 @@ Cas : zéro, inversion, dépassement bornes pour pool/connect/migration/close.
Les bornes backend-neutral décidées en `pre.001` sont matérialisées et couvertes par tests unitaires en `pre.003`. `pre.005` applique physiquement `connect/wait/create/recycle/shutdown`; `pre.006` applique physiquement `migration_timeout` et `migration_lock_timeout`.
Statut : `PASS pre.003-fix.001 opérateur` pour les bornes backend-neutral / `PASS pre.005-fix.001 opérateur` pour pool/connect/shutdown / `PASS pre.006 opérateur` pour migration / `MATÉRIALISÉ pre.009` hardening / `TODO gate opérateur`.
Statut : `PASS pre.003-fix.001 opérateur` pour les bornes backend-neutral / `PASS pre.005-fix.001 opérateur` pour pool/connect/shutdown / `PASS pre.006 opérateur` pour migration / `PASS pre.009 opérateur` hardening`.
### V32-SEC-004 — Feature mismatch avant I/O
`pre.003` matérialise un canari d'intégration compilé avec et sans `postgres`. Sans feature, `Store::open` retourne le code stable `store.backend_not_compiled` avant tout chemin backend physique.
Statut : `PASS pre.003-fix.001 opérateur / MATÉRIALISÉ pre.009 / TODO gate opérateur`.
Statut : `PASS pre.003-fix.001 opérateur / PASS pre.009 opérateur`.
### V32-SEC-005 — Server error sanitization
Un serveur/test double qui renvoie un message contenant un canary ne doit pas le faire traverser l'erreur publique.
Statut : bridge de sanitization matérialisé en `pre.005`; `pre.009` ajoute un canari structurel prouvant que `PostgresBackendError` ne peut retenir que `kind + phase` statiques et que `PoolError::Backend(_)` abandonne le texte remote. `TODO gate opérateur`.
Statut : bridge de sanitization matérialisé en `pre.005`; `pre.009` ajoute un canari structurel prouvant que `PostgresBackendError` ne peut retenir que `kind + phase` statiques et que `PoolError::Backend(_)` abandonne le texte remote. `PASS pre.009 opérateur`.
## 12. Hardening/completeness `pre.009`
@@ -615,9 +617,28 @@ V000 metadata-only
compatibilité backend externe ksp-store-api rejouée au gate
```
Statut global `pre.009` : `MATÉRIALISÉ / TODO gate opérateur`.
Statut global `pre.009` : `PASS opérateur` — tests ciblés, canaris hardening, Config, graphes et `cargo test --workspace` verts.
## 13. Gates Rust/workspace
## 13. Gate technique final `pre.010`
`pre.010` ne contient aucun développement fonctionnel. Il doit revalider sur la version `0.3.2-pre.10` :
```text
audits Rust/Markdown
workspace check + Clippy
Store API
backend PostgreSQL
façade default + no-default-features
Config std.store
cargo test --workspace
graphes normal/features/duplicates
PostgreSQL live foundation
3 builds Tauri avec resources std.store packagées
```
Statut global `pre.010` : `MATÉRIALISÉ / TODO gate opérateur`.
## 14. Gates Rust/workspace
À chaque tranche applicable :
@@ -644,7 +665,7 @@ cargo tree -p ksp-store-postgres-lib --edges normal
cargo tree --duplicates
```
Gate PostgreSQL réel `pre.008` après les gates déterministes :
Gate PostgreSQL réel `pre.010` après les gates déterministes :
```bash
read -rsp "Dedicated PostgreSQL URI: " KSP_PG_TEST_URI; echo
@@ -658,13 +679,16 @@ Gate technique final :
```bash
cargo test --workspace
(cd crates/ksp-app-config-desk && cargo tauri build)
(cd crates/ksp-app-solprices-desk && cargo tauri build)
(cd crates/ksp-app-wallet-desk && cargo tauri build)
```
Les builds Tauri ne sont requis que si `pre.004` modifie réellement les resources/packaging desktop de manière justifiant cette preuve, puis au gate final si la matrice de packaging l'exige.
Les trois builds Tauri sont requis au gate final parce que `pre.004` a réellement ajouté les resources `std.store` au packaging desktop.
Statut global : `TODO` jusqu'aux preuves de chaque tranche.
Statut global : `TODO gate opérateur pre.010`.
## 14. Critères de fermeture
## 15. Critères de fermeture
La matrice ne peut passer en finale que si tous les critères applicables sont `PASS` et que :