v0.3.2-pre.004-fix.001
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
<!-- file: docs/plans/023-V0_3_2_STORE_POSTGRES_FOUNDATION_PLAN.md -->
|
||||
<!-- version: 5 -->
|
||||
<!-- version: 6 -->
|
||||
|
||||
# Plan `0.3.2` — Store/PostgreSQL runtime foundation
|
||||
|
||||
@@ -349,6 +349,7 @@ Lorsque la feature est active, `ksp-store-lib` convertit en privé ces settings
|
||||
Les groupes de settings sont :
|
||||
|
||||
```text
|
||||
network RawNetworkId explicite, un seul réseau logique par instance Store
|
||||
connection_uri String possédée, Debug redacted, aucun getter de diagnostic
|
||||
pool bornes de section 6
|
||||
tls Disabled ou VerifyFull
|
||||
@@ -381,7 +382,7 @@ StoreSettings
|
||||
Store
|
||||
```
|
||||
|
||||
`PostgresPoolSettings::default()` et `PostgresBootstrapSettings::default()` portent exactement les bornes décidées par le gate `pre.001`. `StoreSettings::with_default_shutdown(...)` fournit uniquement la borne commune de shutdown à 5 s. Il n'existe toujours aucun `Default` pour `PostgresStoreSettings` ou `StoreSettings`, afin de ne jamais inventer une URI ou un backend de production.
|
||||
`PostgresPoolSettings::default()` et `PostgresBootstrapSettings::default()` portent exactement les bornes décidées par le gate `pre.001`. À partir de `pre.004-fix.001`, `StoreSettings` exige aussi un `RawNetworkId` explicite et `StoreSettings::with_default_shutdown(network, ...)` fournit uniquement la borne commune de shutdown à 5 s. Il n'existe toujours aucun `Default` pour `PostgresStoreSettings` ou `StoreSettings`, afin de ne jamais inventer une URI ou un backend de production.
|
||||
|
||||
Les validations `pre.003` restent backend-neutral et sans parsing PostgreSQL : URI non vide, pool 1..64, timeouts pool/connect 100..60 000 ms, migration 1 000..300 000 ms, lock 100..120 000 ms et shutdown 100..30 000 ms. Le parsing/normalisation de l'URI et les options réellement honorées restent propriétaires de `pre.005`.
|
||||
|
||||
@@ -611,28 +612,41 @@ Le document V1 est profilé comme les autres documents standards :
|
||||
```json
|
||||
{
|
||||
"format_version": 1,
|
||||
"default_profile": "postgres_default",
|
||||
"default_profile": "devnet",
|
||||
"profiles": [
|
||||
{
|
||||
"profile_id": "postgres_default",
|
||||
"profile_id": "devnet",
|
||||
"network": "devnet",
|
||||
"backend": "postgres",
|
||||
"postgres": {
|
||||
"connection_uri": "${KSP_SECRET_STORE_POSTGRES_URI:-postgresql://localhost/ksp}",
|
||||
"pool": {
|
||||
"max_connections": 8,
|
||||
"connect_timeout_ms": 10000,
|
||||
"wait_timeout_ms": 5000,
|
||||
"create_timeout_ms": 10000,
|
||||
"recycle_timeout_ms": 5000
|
||||
},
|
||||
"tls": {
|
||||
"mode": "verify_full"
|
||||
},
|
||||
"bootstrap": {
|
||||
"auto_migrate": true,
|
||||
"migration_timeout_ms": 30000,
|
||||
"migration_lock_timeout_ms": 10000
|
||||
},
|
||||
"connection_uri": "${KSP_SECRET_STORE_DEVNET_POSTGRES_URI:-postgresql://localhost/ksp_devnet}",
|
||||
"pool": { "max_connections": 8, "connect_timeout_ms": 10000, "wait_timeout_ms": 5000, "create_timeout_ms": 10000, "recycle_timeout_ms": 5000 },
|
||||
"tls": { "mode": "verify_full" },
|
||||
"bootstrap": { "auto_migrate": true, "migration_timeout_ms": 30000, "migration_lock_timeout_ms": 10000 },
|
||||
"shutdown_timeout_ms": 5000
|
||||
}
|
||||
},
|
||||
{
|
||||
"profile_id": "mainnet",
|
||||
"network": "mainnet-beta",
|
||||
"backend": "postgres",
|
||||
"postgres": {
|
||||
"connection_uri": "${KSP_SECRET_STORE_MAINNET_POSTGRES_URI:-postgresql://localhost/ksp_mainnet}",
|
||||
"pool": { "max_connections": 8, "connect_timeout_ms": 10000, "wait_timeout_ms": 5000, "create_timeout_ms": 10000, "recycle_timeout_ms": 5000 },
|
||||
"tls": { "mode": "verify_full" },
|
||||
"bootstrap": { "auto_migrate": true, "migration_timeout_ms": 30000, "migration_lock_timeout_ms": 10000 },
|
||||
"shutdown_timeout_ms": 5000
|
||||
}
|
||||
},
|
||||
{
|
||||
"profile_id": "testnet",
|
||||
"network": "testnet",
|
||||
"backend": "postgres",
|
||||
"postgres": {
|
||||
"connection_uri": "${KSP_SECRET_STORE_TESTNET_POSTGRES_URI:-postgresql://localhost/ksp_testnet}",
|
||||
"pool": { "max_connections": 8, "connect_timeout_ms": 10000, "wait_timeout_ms": 5000, "create_timeout_ms": 10000, "recycle_timeout_ms": 5000 },
|
||||
"tls": { "mode": "verify_full" },
|
||||
"bootstrap": { "auto_migrate": true, "migration_timeout_ms": 30000, "migration_lock_timeout_ms": 10000 },
|
||||
"shutdown_timeout_ms": 5000
|
||||
}
|
||||
}
|
||||
@@ -640,13 +654,17 @@ Le document V1 est profilé comme les autres documents standards :
|
||||
}
|
||||
```
|
||||
|
||||
Le fallback localhost est classé `Secret` car il appartient à un placeholder `KSP_SECRET_*`; sa safe projection reste redacted. Il ne provoque aucune connexion automatique.
|
||||
Chaque profile `std.store` est un **target Store nommé** : son `profile_id` est l'identifiant de target, son champ `network` fixe exactement un réseau logique et son backend désigne exactement une base/configuration physique. `default_profile` choisit le target autonome ; un job, worker ou app peut imposer un autre `profile_id` via le mécanisme Config existant. `ksp-store-lib` ne route jamais entre plusieurs targets.
|
||||
|
||||
Le target par défaut committed est `devnet`, cohérent avec le défaut Transport et plus sûr pour les workflows de développement. Les targets `mainnet` et `testnet` utilisent des URI distinctes. Le fallback localhost de chaque target est classé `Secret` car il appartient à un placeholder `KSP_SECRET_*`; sa safe projection reste redacted. Il ne provoque aucune connexion automatique.
|
||||
|
||||
`.env.example` ajoutera dans la même tranche :
|
||||
|
||||
```text
|
||||
# PostgreSQL connection URI used by Config std.store profiles.
|
||||
# KSP_SECRET_STORE_POSTGRES_URI=postgresql://user:password@localhost/ksp
|
||||
# PostgreSQL connection URIs used by named Config std.store targets.
|
||||
# KSP_SECRET_STORE_DEVNET_POSTGRES_URI=postgresql://user:password@localhost/ksp_devnet
|
||||
# KSP_SECRET_STORE_MAINNET_POSTGRES_URI=postgresql://user:password@localhost/ksp_mainnet
|
||||
# KSP_SECRET_STORE_TESTNET_POSTGRES_URI=postgresql://user:password@localhost/ksp_testnet
|
||||
```
|
||||
|
||||
La valeur d'exemple commentée n'est jamais un vrai credential.
|
||||
@@ -657,6 +675,10 @@ Config reconnaît `backend = "postgres"` indépendamment de la feature du consum
|
||||
|
||||
Ainsi Config ne doit pas connaître les `cfg(feature = "postgres")` de chaque consumer.
|
||||
|
||||
### 12.4 Invariant target/réseau
|
||||
|
||||
Une instance `Store` ouverte reçoit exactement un `StoreSettings.network`. Ce réseau provient du target Config sélectionné, mais reste un contrat Store backend-neutral. Les futures opérations RAW doivent comparer ce réseau à celui de l'identité/query avant I/O : une transaction/account/query `devnet` soumise à un Store `mainnet-beta` doit être rejetée, jamais routée vers un autre Store. La sélection d'un autre réseau se fait en résolvant un autre profile/target puis en ouvrant une autre instance `Store`.
|
||||
|
||||
## 13. Logging et redaction
|
||||
|
||||
Les deux crates runtime auront un `constants.rs` privé avec un target explicite :
|
||||
@@ -937,7 +959,7 @@ Le dernier comportement est volontairement transitoire : `pre.003` ne retourne j
|
||||
|
||||
### `pre.004` — Config `std.store`
|
||||
|
||||
Document/schema/example/registry/adaptor, `.env.example`, provenance/sensitivity/redaction, packaging resources strictement nécessaires. Aucun env dans Store/backend. `pre.004` matérialise les noms canoniques `std.store.json`, `std.store.schema.json` et `std.store.example.json`, conformément au prompt de démarrage et aux conventions Config existantes.
|
||||
Document/schema/example/registry/adaptor, `.env.example`, provenance/sensitivity/redaction, targets nommés réseau-spécifiques, packaging resources strictement nécessaires. Aucun env dans Store/backend. `pre.004` matérialise les noms canoniques `std.store.json`, `std.store.schema.json` et `std.store.example.json`, conformément au prompt de démarrage et aux conventions Config existantes.
|
||||
|
||||
### `pre.005` — PostgreSQL connection + deadpool + Rustls
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!-- file: docs/validation/019-V0_3_2_STORE_POSTGRES_FOUNDATION.md -->
|
||||
<!-- version: 5 -->
|
||||
<!-- version: 6 -->
|
||||
|
||||
# Validation `0.3.2` — Store/PostgreSQL runtime foundation
|
||||
|
||||
@@ -213,28 +213,46 @@ Critères :
|
||||
std.store enregistré
|
||||
schema V1 valide
|
||||
example valide
|
||||
profiles typés
|
||||
profiles/targets nommés typés
|
||||
un réseau explicite par target
|
||||
backend postgres explicite
|
||||
```
|
||||
|
||||
Matérialisé par `pre.004` avec `cfg.std.store` / `schema.std.store`, V1 profilée, backend PostgreSQL typé et example canonique.
|
||||
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`.
|
||||
Statut : `TODO gate opérateur pre.004-fix.001`.
|
||||
|
||||
### V32-CONFIG-002 — Secrets/provenance
|
||||
|
||||
Critères :
|
||||
|
||||
```text
|
||||
KSP_SECRET_STORE_POSTGRES_URI classé Secret
|
||||
KSP_SECRET_STORE_{DEVNET,MAINNET,TESTNET}_POSTGRES_URI classés Secret
|
||||
safe projection redacted
|
||||
provenance sans valeur
|
||||
dotenv inventory à jour
|
||||
```
|
||||
|
||||
Matérialisé par `pre.004` : `KSP_SECRET_STORE_POSTGRES_URI` est inventorié, le fallback reste `Secret`, la safe projection est redacted et la provenance n'embarque aucune valeur.
|
||||
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`.
|
||||
Statut : `TODO gate opérateur pre.004-fix.001`.
|
||||
|
||||
### V32-CONFIG-002B — Target/réseau sans multiplexage
|
||||
|
||||
Critères :
|
||||
|
||||
```text
|
||||
profile_id std.store = identifiant de target Store
|
||||
default_profile choisit exactement un target
|
||||
StoreSettings porte exactement un RawNetworkId
|
||||
résolution explicite mainnet/devnet/testnet retourne URI + network du target choisi
|
||||
ksp-store-lib ne possède aucun routeur multi-target/multi-réseau
|
||||
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`.
|
||||
|
||||
### V32-CONFIG-003 — No-env Store/backend
|
||||
|
||||
@@ -249,17 +267,17 @@ PG*
|
||||
.pgpass
|
||||
```
|
||||
|
||||
`pre.004` renforce aussi le canari d'ownership avec les nouveaux filenames Store ; Store/backend restent sans dépendance Config et sans lecture KSP/KSPB.
|
||||
`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 / TODO pre.009`.
|
||||
Statut : `TODO gate opérateur pre.004-fix.001 / TODO pre.009`.
|
||||
|
||||
### V32-CONFIG-004 — Adapter Config -> Store
|
||||
|
||||
Critère : `ksp-config-lib` seul transforme un profil résolu en `StoreSettings` et ne transmet aucun secret dans diagnostics.
|
||||
Critère : `ksp-config-lib` seul transforme un profil/target résolu en `StoreSettings` réseau-spécifique et ne transmet aucun secret dans diagnostics.
|
||||
|
||||
Matérialisé par `pre.004` : seul `ksp-config-lib` dépend de `ksp-store-lib` avec `default-features = false` et construit `StoreSettings` sans forcer la feature backend.
|
||||
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`.
|
||||
Statut : `TODO gate opérateur pre.004-fix.001`.
|
||||
|
||||
## 6. Pool et lifecycle PostgreSQL
|
||||
|
||||
|
||||
Reference in New Issue
Block a user