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