v0.3.3-pre.006

This commit is contained in:
2026-08-30 13:06:33 +02:00
parent 66a3926adb
commit 1352a61d70
15 changed files with 891 additions and 36 deletions

View File

@@ -1,5 +1,5 @@
<!-- file: docs/plans/024-V0_3_3_STORE_POSTGRES_RAW_TRANSACTION_PLAN.md -->
<!-- version: 6 -->
<!-- version: 7 -->
# Plan `0.3.3` — Store/PostgreSQL RawTransaction vertical slice
@@ -28,15 +28,18 @@ Tranches techniques validées :
```text
0.3.3-pre.001 — audit, threat model, physical design, sizing et planning
0.3.3-pre.002 — moteur de migrations multi-version
0.3.3-pre.003 + fix.001/fix.002/fix.003 — V001 physique, compatibilité de schéma et binding réseau
0.3.3-pre.004 — mapping et lectures RAW
0.3.3-pre.005 — écriture atomique et observations
```
Tranche technique courante :
```text
0.3.3-pre.003V001 physique + binding réseau
0.3.3-pre.006pagination keyset + cursor V1
```
Les gates opérateur de `pre.001` et `pre.002` sont verts. `pre.003` matérialise le schéma physique V001 et le binding mono-réseau atomique, mais n'ouvre encore ni repository PostgreSQL métier, ni capability RAW, ni dispatch dans `ksp-store-lib`.
Les gates opérateur jusqu'à `pre.005` sont verts. `pre.006` complète la surface backend-specific de lecture `RawTransaction` avec `list_raw_transactions`, sans ouvrir encore la rétention mutante, les implémentations complètes des six traits ni le dispatch dans `ksp-store-lib`.
## 2. Sources et autorité
@@ -1108,12 +1111,23 @@ Tranche matérialisée :
### `0.3.3-pre.006` — pagination/cursor
- ordre total ;
- index utilisé ;
- cursor V1 opaque ;
- binding de query ;
- limites physiques explicites ;
- matrice hostile.
Tranche matérialisée :
- `PostgresBackend::list_raw_transactions` retourne uniquement `RawPage<RawTransactionReference>` ;
- mauvais réseau rejeté avant acquisition d'un client du pool ;
- lignes `Purged` exclues de la liste ;
- bornes `RawSlotRange` appliquées de façon inclusive ;
- ordre total `Ascending = (slot ASC, signature ASC)` et `Descending = (slot DESC, signature DESC)` ;
- continuation keyset stricte `(slot, signature) > cursor` ou `< cursor`, sans `OFFSET` ;
- requêtes alignées avec l'index partiel V001 `(slot, signature) WHERE retention_state <> 'purged'` ;
- cursor V1 backend-private de 109 octets : magic `KSPT`, version 1, `last_slot`, `last_signature`, digest SHA-256 ;
- digest lié avec domaine séparé au network, à la direction, aux flags/valeurs des bornes et à la dernière clé ;
- replay sous autre network/range/direction, taille/magic/version/digest hostiles et `last_slot` hors range -> `QueryInvalid` avant pool I/O ;
- `RawPageLimit` sans cap métier : `LIMIT requested + 1`, borne PostgreSQL exacte `requested <= i64::MAX - 1`, sinon `PageLimitUnsupported` sans clamp ;
- la row `limit+1` est décodée elle aussi afin de ne pas masquer une corruption physique ;
- aucune promesse de snapshot inter-pages ; une mutation concurrente placée avant le cursor peut ne pas être observée ;
- aucune transition de rétention mutante et aucune implémentation complète de trait dans cette tranche ;
- V000/V001 restent byte-identiques.
### `0.3.3-pre.007` — archive, purge, tombstone, ForceRehydrate

View File

@@ -1,5 +1,5 @@
<!-- file: docs/validation/020-V0_3_3_STORE_POSTGRES_RAW_TRANSACTION.md -->
<!-- version: 8 -->
<!-- version: 9 -->
# Validation `0.3.3` — Store/PostgreSQL RawTransaction vertical slice
@@ -580,12 +580,21 @@ cap 500/1000 dans Store pagination
- observation write séparée, key identique/divergente, absent/purged : PASS statique/unit design ;
- `Conflict` / `ReferenceNotFound` / `WriteFailed` sans texte serveur : PASS statique ;
- preuve PostgreSQL concurrente/rollback réelle : différée à `pre.009` ;
- gate Cargo opérateur : À EXÉCUTER.
- gate opérateur complet du 2026-08-30 : PASS (`check`, Clippy, Store/API/PostgreSQL/Config, no-default-features ; 30 tests unit backend).
### `pre.006`
- list/cursor/order/ranges ;
- hostile cursor matrix.
- `list_raw_transactions` backend-specific et mauvais réseau pré-I/O : PASS statique/unit design ;
- ordre total ASC/DESC `(slot, signature)` et keyset stricte sans OFFSET : PASS statique ;
- bornes inclusives et exclusion `Purged` : PASS statique ;
- cursor V1 fixe 109 octets, magic/version/last key/digest : PASS unit design ;
- binding digest network/direction/range + replay hostile rejeté : PASS unit design ;
- taille/magic/version/digest/random bytes hostiles : PASS unit design ;
- `last_slot` hors range rejeté : PASS unit design ;
- `LIMIT requested + 1`, limite `i64::MAX - 1`, aucun cap worker : PASS unit/statique ;
- index V001 `(slot, signature)` partiel réutilisé, migration inchangée : PASS statique ;
- snapshot inter-pages explicitement non garanti : PASS doc ;
- gate Cargo opérateur : À EXÉCUTER.
### `pre.007`
@@ -622,7 +631,7 @@ cap 500/1000 dans Store pagination
- publication stable.
## 22. Gate courant `pre.005`
## 22. Gate courant `pre.006`
```bash
cargo fmt --all
@@ -687,4 +696,15 @@ cargo check -p ksp-store-lib --no-default-features
- [PASS] référence canonique absente classée `ReferenceNotFound` ;
- [PASS] erreurs physiques d'écriture classées `WriteFailed` sans conserver le texte PostgreSQL ;
- [PASS] aucune migration SQL modifiée et aucun scope pagination/rétention mutante ouvert ;
- [À FAIRE] gate Cargo opérateur complet de `pre.005`.
- [PASS] gate Cargo opérateur complet de `pre.005` fourni le 2026-08-30.
### `pre.006` — état de la tranche
- [PASS] bridge `list_raw_transactions` ajouté sans type PostgreSQL public ;
- [PASS] keyset stricte ASC/DESC sur `(slot, signature)`, sans `OFFSET` ;
- [PASS] bornes de slots inclusives et tombstones `Purged` exclus ;
- [PASS] cursor V1 fixe 109 octets et digest lié à la query ;
- [PASS] replay network/direction/range et cursor hostile classés `QueryInvalid` ;
- [PASS] limite physique `requested <= i64::MAX - 1`, au-delà `PageLimitUnsupported` sans clamp ;
- [PASS] aucune migration SQL modifiée, aucun scope rétention mutante/façade ouvert ;
- [À FAIRE] gate Cargo opérateur complet de `pre.006`.