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/plans/023-V0_3_2_STORE_POSTGRES_FOUNDATION_PLAN.md -->
<!-- version: 11 -->
<!-- version: 12 -->
# Plan `0.3.2` — Store/PostgreSQL runtime foundation
@@ -1117,7 +1117,48 @@ cargo tree --duplicates
### `pre.010` — Gate technique final
Workspace/clippy/tests, targeted tests, PostgreSQL live gate, graphes Cargo finaux. Aucun développement fonctionnel nouveau.
Base requise : `0.3.2-pre.009` avec hardening/completeness entièrement vert. Le gate opérateur `pre.009` du 29 août 2026 confirme les audits Rust/Markdown, workspace check/Clippy, Store API, backend PostgreSQL, façade avec et sans feature, Config, graphes Cargo et `cargo test --workspace`.
Cette tranche ne modifie aucun code de production, test fonctionnel, migration, Config ou dépendance runtime. Elle synchronise uniquement la version de prerelease et prépare le gate technique final.
Gate final attendu :
```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-api
cargo test -p ksp-store-postgres-lib
cargo test -p ksp-store-lib
cargo test -p ksp-store-lib --no-default-features
cargo test -p ksp-config-lib
cargo check -p ksp-store-lib --no-default-features
cargo test --workspace
cargo tree -p ksp-store-lib --edges normal
cargo tree -p ksp-store-lib -e features
cargo tree -p ksp-store-postgres-lib --edges normal
cargo tree --duplicates
```
Le smoke PostgreSQL réel est ensuite rejoué sur une base dédiée où `ksp_store_schema_migrations` est absente avant démarrage :
```bash
read -rsp "Dedicated PostgreSQL URI: " KSP_PG_TEST_URI; echo
printf '%s\n' "$KSP_PG_TEST_URI" | cargo test -p ksp-store-postgres-lib --test postgres_foundation_live -- --ignored --nocapture --test-threads=1
unset KSP_PG_TEST_URI
```
Comme `pre.004` a réellement modifié les resources de packaging desktop pour `std.store`, le gate final rejoue aussi :
```bash
(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)
```
Aucun développement fonctionnel nouveau n'est autorisé dans `pre.010`. Tout défaut découvert ouvre un `pre.010-fix.NNN` avant la réconciliation documentaire.
### `pre.011` — Réconciliation documentaire finale

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 :