1173 lines
32 KiB
Markdown
1173 lines
32 KiB
Markdown
<!-- file: prompts/022-V0_3_3_START_PROMPT.md -->
|
|
<!-- version: 1 -->
|
|
|
|
# Prompt de démarrage `0.3.3` — Store/PostgreSQL `RawTransaction` vertical slice
|
|
|
|
## 1. Identité de la release et base exacte requise
|
|
|
|
La release à ouvrir est :
|
|
|
|
```text
|
|
0.3.3 — Store/PostgreSQL RawTransaction vertical slice
|
|
```
|
|
|
|
La base autoritaire attendue est exclusivement la release stable :
|
|
|
|
```text
|
|
v0.3.2
|
|
workspace.package.version = 0.3.2
|
|
```
|
|
|
|
La nouvelle session doit partir de l'archive opérateur stable `0.3.2` lorsqu'elle est fournie. Cette archive gagne sur les souvenirs, snippets, anciens overlays et prompts intermédiaires.
|
|
|
|
L'archive historique suivante est également **obligatoire pour `pre.001`** :
|
|
|
|
```text
|
|
khadhroony-bot3_v0.5.3-pre.005-fix010.zip
|
|
```
|
|
|
|
Elle sert uniquement à auditer l'ancien schéma/repository PostgreSQL des transactions RAW et leurs observations. Elle n'est jamais une base de code ni une autorité architecturale.
|
|
|
|
Ne pas ouvrir `0.3.3` depuis :
|
|
|
|
```text
|
|
0.3.2-pre.*
|
|
0.3.2-pre.*-fix.*
|
|
0.3.2-rel.* non encore publié stable
|
|
une archive de travail intermédiaire
|
|
khadhroony-bot3 comme base de code
|
|
un souvenir de session
|
|
```
|
|
|
|
À l'ouverture, vérifier au minimum :
|
|
|
|
```text
|
|
tag Git v0.3.2 si metadata Git disponible
|
|
workspace.package.version = 0.3.2
|
|
deltas/0.3.2/rel.001.md présent
|
|
prompts/022-V0_3_3_START_PROMPT.md présent
|
|
ksp-store-api présent
|
|
ksp-store-lib présent
|
|
ksp-store-postgres-lib présent
|
|
migration bootstrap V000 présente
|
|
Config std.store présent
|
|
archive khadhroony-bot3_v0.5.3-pre.005-fix010.zip disponible
|
|
```
|
|
|
|
Si une divergence existe entre ce prompt et la base stable réelle, **la base stable réelle gagne** et la divergence devient une sortie explicite de `pre.001`.
|
|
|
|
`pre.001` reste obligatoirement une tranche de **lecture + audit + brainstorming + threat model + design physique + sizing + planification**. Ne pas commencer la migration métier `RawTransaction` ni les repositories SQL avant la sortie cohérente de ce gate.
|
|
|
|
---
|
|
|
|
## 2. Mission et résultat attendu
|
|
|
|
`0.3.3` étend le couple existant :
|
|
|
|
```text
|
|
ksp-store-lib
|
|
ksp-store-postgres-lib
|
|
```
|
|
|
|
avec la première vertical slice métier PostgreSQL complète de `ksp-store-api` :
|
|
|
|
```text
|
|
RawTransaction
|
|
RawTransactionObservation
|
|
RawTransaction query/pagination
|
|
RawTransaction retention/tombstone/force-rehydrate
|
|
```
|
|
|
|
Les six capabilities `ksp-store-api` concernées sont :
|
|
|
|
```text
|
|
RawTransactionRead
|
|
RawTransactionWrite
|
|
RawTransactionObservationRead
|
|
RawTransactionObservationWrite
|
|
RawTransactionRetentionRead
|
|
RawTransactionRetentionWrite
|
|
```
|
|
|
|
Le résultat attendu à la clôture est que :
|
|
|
|
```text
|
|
ksp-store-postgres-lib implémente réellement la persistence physique RawTransaction
|
|
ksp-store-lib::Store expose/dispatch les six capabilities via la façade commune
|
|
une acquisition transaction + observation est atomique
|
|
les writes sont idempotents pour un contenu identique
|
|
une même identité avec contenu divergent retourne ERROR_CODE_RAW_CONFLICT
|
|
une observation supplémentaire est idempotente et liée à une transaction existante
|
|
get/list respectent les contrats backend-agnostic
|
|
la pagination est déterministe et cursorisée sans policy worker cachée
|
|
la rétention/tombstone/force-rehydrate est atomique et conforme aux contrats acquis
|
|
les mismatches de network sont rejetés avant I/O
|
|
aucun type PostgreSQL/row/SQL ne fuit par ksp-store-lib
|
|
le tout est prouvé sur PostgreSQL réel par un gate opt-in non destructif
|
|
```
|
|
|
|
La release **ne doit pas** ouvrir `RawAccountState`. Cette famille reste réservée à :
|
|
|
|
```text
|
|
0.3.4 — RawAccountState PostgreSQL + complétude/conformance RAW
|
|
```
|
|
|
|
---
|
|
|
|
## 3. Sources de vérité internes obligatoires — ordre de lecture
|
|
|
|
### 3.1 Règles globales
|
|
|
|
Lire d'abord :
|
|
|
|
```text
|
|
RULES.md
|
|
docs/000-README.md
|
|
|
|
docs/rules/RULES_GENERAL.md
|
|
docs/rules/RULES_KSP.md
|
|
docs/rules/RULES_RUST.md
|
|
docs/rules/RULES_DEPENDENCIES.md
|
|
docs/rules/RULES_DOCUMENTATION.md
|
|
docs/rules/FILE_CONTRACTS.md
|
|
docs/rules/VERSION_WORKFLOW.md
|
|
docs/rules/PROMPT_STRUCTURE.md
|
|
```
|
|
|
|
Relire particulièrement les règles applicables aux frontières :
|
|
|
|
```text
|
|
KSP-API-*
|
|
KSP-CONFIG-*
|
|
KSP-STORE-*
|
|
KSP-NOTIFY-*
|
|
KSP-PROC-*
|
|
KSP-REL-*
|
|
|
|
DEP-KSP-*
|
|
DEP-CARGO-*
|
|
DEP-LOG-*
|
|
DEP-STORE-*
|
|
DEP-WORKER-*
|
|
DEP-JOB-*
|
|
```
|
|
|
|
Rappels directement structurants :
|
|
|
|
```text
|
|
ksp-store-lib -> ksp-store-api
|
|
ksp-store-lib[postgres] -> ksp-store-postgres-lib
|
|
ksp-store-postgres-lib -> ksp-store-api
|
|
ksp-store-postgres-lib -X-> ksp-store-lib
|
|
Config -> Store autorisé
|
|
Store/backend -X-> Config
|
|
Transport -X-> Store
|
|
Program/Materializer -X-> Store
|
|
consumer ordinaire -> ksp-store-lib
|
|
consumer ordinaire -X-> ksp-store-postgres-lib
|
|
```
|
|
|
|
### 3.2 Architecture durable
|
|
|
|
Lire ensuite :
|
|
|
|
```text
|
|
docs/architecture/000-README.md
|
|
docs/architecture/001-PROJECT_OBJECTIVES.md
|
|
docs/architecture/002-LAYERS_AND_DEPENDENCIES.md
|
|
docs/architecture/003-COMPONENT_CONTRACTS.md
|
|
docs/architecture/004-COMPONENT_INVENTORY.md
|
|
docs/architecture/005-DEPENDENCY_GRAPH.md
|
|
docs/architecture/007-EXECUTION_AND_POLICY.md
|
|
docs/architecture/008-DATA_MATERIALIZATION_AND_STORE.md
|
|
docs/architecture/009-ACQUISITION_WORKERS_AND_JOBS.md
|
|
docs/architecture/010-APPS_SERVICES_SCENARIOS_AND_CONTROL.md
|
|
```
|
|
|
|
Préserver notamment :
|
|
|
|
```text
|
|
Store persiste et sert ; il ne possède pas la policy de travail
|
|
pagination/cursorisation Store != batch-size/priorité/backlog worker/job
|
|
1 Store instance = 1 RawNetworkId + 1 backend physique
|
|
pas de multiplexage automatique de réseaux/bases dans Store
|
|
Config possède targets/URI/.env/secrets
|
|
backend PostgreSQL possède driver/pool/TLS/SQL/migrations
|
|
aucun type backend physique ne traverse la façade commune
|
|
```
|
|
|
|
### 3.3 Contrats RAW stables `0.3.1`
|
|
|
|
Lire intégralement :
|
|
|
|
```text
|
|
docs/plans/022-V0_3_1_STORE_RAW_PLAN.md
|
|
docs/validation/018-V0_3_1_STORE_RAW.md
|
|
crates/ksp-store-api/Cargo.toml
|
|
crates/ksp-store-api/src/**
|
|
crates/ksp-store-api/tests/**
|
|
```
|
|
|
|
Relire particulièrement :
|
|
|
|
```text
|
|
RawTransaction / RawTransactionObservation
|
|
RawTransactionReference
|
|
RawPayload / RawContentHash / RawObservationKey
|
|
RawAcquisitionProvenance
|
|
RawTransactionQuery / RawPage* / RawSlotRange / RawSortDirection
|
|
RawAcquisitionWriteOutcome / RawEntityWriteOutcome / RawObservationWriteOutcome
|
|
RawRetentionState
|
|
RawTransactionAcquisitionMode
|
|
RawTransactionRetentionTransition
|
|
RawTransactionTombstone
|
|
les six capabilities RawTransaction/observation/retention
|
|
```
|
|
|
|
Ne pas redessiner ces contrats pour simplifier PostgreSQL. Une modification de `ksp-store-api` n'est recevable que si `pre.001` démontre un **gap backend-agnostic réel et bloquant**.
|
|
|
|
### 3.4 Fondation runtime/backend stable `0.3.2`
|
|
|
|
Lire ensuite :
|
|
|
|
```text
|
|
docs/plans/023-V0_3_2_STORE_POSTGRES_FOUNDATION_PLAN.md
|
|
docs/validation/019-V0_3_2_STORE_POSTGRES_FOUNDATION.md
|
|
|
|
crates/ksp-store-lib/Cargo.toml
|
|
crates/ksp-store-lib/README.md
|
|
crates/ksp-store-lib/USAGE.md
|
|
crates/ksp-store-lib/src/**
|
|
crates/ksp-store-lib/tests/**
|
|
|
|
crates/ksp-store-postgres-lib/Cargo.toml
|
|
crates/ksp-store-postgres-lib/README.md
|
|
crates/ksp-store-postgres-lib/USAGE.md
|
|
crates/ksp-store-postgres-lib/src/**
|
|
crates/ksp-store-postgres-lib/tests/**
|
|
|
|
crates/ksp-config-lib/README.md
|
|
crates/ksp-config-lib/USAGE.md
|
|
config/std.store.json
|
|
config/schemas/std.store.schema.json
|
|
config/examples/std.store.example.json
|
|
```
|
|
|
|
Lire enfin :
|
|
|
|
```text
|
|
CHANGELOG.md
|
|
ROADMAP.md
|
|
```
|
|
|
|
Créer en `pre.001` :
|
|
|
|
```text
|
|
docs/plans/024-V0_3_3_STORE_POSTGRES_RAW_TRANSACTION_PLAN.md
|
|
docs/validation/020-V0_3_3_STORE_POSTGRES_RAW_TRANSACTION.md
|
|
```
|
|
|
|
---
|
|
|
|
## 4. Audit historique kbot3 obligatoire et ciblé
|
|
|
|
L'archive kbot3 est requise parce que `0.3.3` ouvre la première vraie persistence métier PostgreSQL. Réauditer uniquement les éléments historiques pouvant informer la conception physique de `RawTransaction` :
|
|
|
|
```text
|
|
ks-store/Cargo.toml
|
|
ks-store/README.md
|
|
ks-store/USAGE.md
|
|
ks-store/src/contracts/dto/raw.rs
|
|
ks-store/src/contracts/entity/raw.rs
|
|
ks-store/src/contracts/repository.rs
|
|
ks-store/src/postgres/query/raw_queries.rs
|
|
ks-store/src/postgres/repository/raw_transaction_repository.rs
|
|
|
|
ks-store/migrations/postgres/schema/tables/create_table_if_not_exists_k_sol_raw_transactions.sql
|
|
ks-store/migrations/postgres/schema/tables/create_table_if_not_exists_k_sol_obs_transaction_observations.sql
|
|
ks-store/migrations/postgres/schema/indexes/*raw_transactions*
|
|
ks-store/migrations/postgres/schema/indexes/*transaction_observations*
|
|
ks-store/migrations/postgres/schema/constraints/*raw_transactions*
|
|
ks-store/migrations/postgres/schema/constraints/*transaction_observations*
|
|
|
|
docs/guides/POSTGRES_STORAGE.md
|
|
docs/plans/V0_5_3_KS_STORE_NORMALIZATION_PLAN.md
|
|
```
|
|
|
|
Classer explicitement chaque idée utile sous :
|
|
|
|
```text
|
|
REPRENDRE
|
|
REDESSINER
|
|
REPORTER
|
|
REJETER
|
|
```
|
|
|
|
L'audit doit notamment comparer :
|
|
|
|
```text
|
|
identité physique transaction
|
|
stockage signature/hash/payload
|
|
observation/idempotence
|
|
atomicité acquisition + observation
|
|
conflit de contenu
|
|
indexes de lecture/pagination
|
|
ordre/cursorisation
|
|
rétention/purge
|
|
concurrence
|
|
SQL error mapping
|
|
```
|
|
|
|
Ne pas reprendre automatiquement :
|
|
|
|
```text
|
|
SQLx
|
|
ancien monolithe Store
|
|
processing_state/processing ledger anticipé
|
|
CORE/DECODE/materialization
|
|
maintenance destructive publique
|
|
identifiants SQL comme API publique
|
|
JSON métier comme excuse pour contourner RawPayload KSP
|
|
batch/replay policy dans Store
|
|
```
|
|
|
|
Si l'archive historique n'est pas disponible :
|
|
|
|
```text
|
|
ne pas inventer son contenu depuis la mémoire
|
|
ne pas déclarer l'audit héritage terminé
|
|
ne pas figer le schéma/indexes RawTransaction définitifs
|
|
```
|
|
|
|
---
|
|
|
|
## 5. Sources externes à réauditer lorsque nécessaire
|
|
|
|
La fondation dépend déjà de :
|
|
|
|
```text
|
|
tokio-postgres 0.7.x
|
|
deadpool-postgres 0.14.x
|
|
tokio-postgres-rustls 0.14.x
|
|
rustls 0.23
|
|
sha2 0.11
|
|
```
|
|
|
|
La base `0.3.2` a réellement résolu lors de son gate :
|
|
|
|
```text
|
|
tokio-postgres 0.7.18
|
|
deadpool-postgres 0.14.2
|
|
tokio-postgres-rustls 0.14.0
|
|
rustls 0.23.43
|
|
sha2 0.11.0
|
|
```
|
|
|
|
`0.3.3` n'est pas une release de mise à jour de dépendances. Ne modifier ces versions/features que si l'audit de la tranche concernée démontre un besoin concret.
|
|
|
|
Consulter les sources PostgreSQL/tokio-postgres actuelles lorsque le design l'exige, en particulier pour :
|
|
|
|
```text
|
|
transactions et rollback
|
|
isolation/locking concurrent
|
|
INSERT ... ON CONFLICT et garanties réelles
|
|
constraints/checks/indexes
|
|
BYTEA et représentation de valeurs fixed-width
|
|
représentation exacte des u64/u32 KSP sans narrowing
|
|
ordre stable et keyset pagination
|
|
limites SQL/parameter/row applicables
|
|
comportement de statement/transaction sous cancellation
|
|
```
|
|
|
|
Préférer les sources primaires PostgreSQL et upstream tokio-postgres. Ne pas ajouter ORM/query builder/codec externe par habitude.
|
|
|
|
---
|
|
|
|
## 6. État validé `0.3.2` à préserver
|
|
|
|
### 6.1 Façade/runtime
|
|
|
|
La base stable possède :
|
|
|
|
```text
|
|
ksp-store-lib
|
|
84 exports crate-root au gate 0.3.2
|
|
feature default = postgres
|
|
ksp-store-postgres-lib optional dependency
|
|
Store::open(settings).await
|
|
Store::runtime_snapshot()
|
|
Store::health().await
|
|
Store::close(self).await
|
|
Store non Clone
|
|
Store lié à exactement un RawNetworkId
|
|
```
|
|
|
|
`ksp-store-lib` ne possède ni SQL ni type physique PostgreSQL.
|
|
|
|
### 6.2 Backend PostgreSQL
|
|
|
|
La base stable possède :
|
|
|
|
```text
|
|
ksp-store-postgres-lib
|
|
PostgresBackend / PostgresBackendSettings
|
|
pool Deadpool borné
|
|
TLS Disabled / VerifyFull
|
|
Rustls + roots système + AWS-LC
|
|
URI parsing/normalization/redaction
|
|
aucune lecture env/PG*/.pgpass
|
|
bootstrap privé
|
|
health/readiness sûr
|
|
shutdown borné
|
|
```
|
|
|
|
Les types suivants restent privés :
|
|
|
|
```text
|
|
Pool
|
|
Client
|
|
Row
|
|
Statement
|
|
Transaction SQL
|
|
config driver
|
|
TLS internals
|
|
```
|
|
|
|
### 6.3 Migrations
|
|
|
|
La fondation stable possède :
|
|
|
|
```text
|
|
V000__bootstrap.sql
|
|
ksp_store_schema_migrations
|
|
version/name/SHA-256
|
|
advisory transaction lock borné
|
|
bootstrap transactionnel
|
|
mismatch/newer schema explicites
|
|
aucun down automatique
|
|
```
|
|
|
|
La prochaine migration métier commence donc normalement à :
|
|
|
|
```text
|
|
V001
|
|
```
|
|
|
|
`pre.001` doit confirmer la convention exacte avant création.
|
|
|
|
### 6.4 Config et réseaux
|
|
|
|
`std.store` possède les targets :
|
|
|
|
```text
|
|
devnet -> network devnet
|
|
mainnet -> network mainnet-beta
|
|
testnet -> network testnet
|
|
```
|
|
|
|
Chaque target utilise une URI/base PostgreSQL indépendante. `Store` n'est pas un registry multi-target.
|
|
|
|
Invariant acquis :
|
|
|
|
```text
|
|
Store.network != input/query/reference.network
|
|
-> rejet avant I/O
|
|
-> jamais de routage automatique vers une autre Store
|
|
```
|
|
|
|
### 6.5 Preuve PostgreSQL réelle
|
|
|
|
Le gate `0.3.2` a exercé la fondation sur :
|
|
|
|
```text
|
|
PostgreSQL major 17
|
|
```
|
|
|
|
La policy de fondation supportée reste :
|
|
|
|
```text
|
|
PostgreSQL >= 15
|
|
```
|
|
|
|
Aucun maximum artificiel n'est imposé par KSP.
|
|
|
|
### 6.6 Ce qui est encore absent
|
|
|
|
À l'ouverture de `0.3.3`, le backend PostgreSQL ne doit encore implémenter aucune capability métier :
|
|
|
|
```text
|
|
RawTransaction*
|
|
RawAccountState*
|
|
```
|
|
|
|
Aucune table/index métier RAW ne doit exister dans les migrations KSP `0.3.2`.
|
|
|
|
---
|
|
|
|
## 7. Décisions acquises et questions réellement ouvertes
|
|
|
|
### 7.1 Décisions acquises
|
|
|
|
```text
|
|
mêmes crates ksp-store-lib + ksp-store-postgres-lib
|
|
pas de nouvelle façade Store
|
|
pas de nouvelle crate repository
|
|
PostgreSQL reste le backend de référence
|
|
les six capabilities RawTransaction sont la surface fonctionnelle de 0.3.3
|
|
ksp-store-postgres-lib réalise la persistence physique
|
|
ksp-store-lib::Store dispatch les capabilities aux backends compilés
|
|
network mismatch rejeté avant I/O
|
|
acquisition transaction + observation atomique
|
|
même identité + même contenu = idempotence
|
|
même identité + contenu divergent = ERROR_CODE_RAW_CONFLICT
|
|
observation_key est la clé d'idempotence observation
|
|
normal sur tombstone purgé = SkippedPurged / NotRecorded
|
|
ForceRehydrate est explicite et ne masque jamais un conflit
|
|
pagination Store reste navigation/cursorisation uniquement
|
|
batch-size/priorité/backlog/policy restent hors Store
|
|
SQL/rows/index ids restent privés au backend
|
|
Config reste propriétaire des URI/secrets/targets
|
|
```
|
|
|
|
### 7.2 Questions à fermer obligatoirement en `pre.001`
|
|
|
|
#### Schéma physique et binding réseau
|
|
|
|
Décider explicitement :
|
|
|
|
```text
|
|
noms des tables/indexes/constraints KSP
|
|
clé physique transaction
|
|
clé physique observation
|
|
comment la database prouve son RawNetworkId en cas d'URI mal configurée
|
|
network stocké par ligne, metadata de database, ou autre preuve robuste
|
|
```
|
|
|
|
Une mauvaise URI ne doit jamais permettre de relire silencieusement des données Devnet comme Mainnet ou inversement.
|
|
|
|
#### Représentation des entiers KSP
|
|
|
|
Auditer sans narrowing :
|
|
|
|
```text
|
|
slot u64
|
|
format_version u32
|
|
source_payload_size_bytes u64 borné
|
|
RawTimestamp u64 borné
|
|
page limit u64
|
|
```
|
|
|
|
PostgreSQL `BIGINT` est signé. Il est interdit de résoudre la différence par un cast silencieux ou une réduction arbitraire du contrat `ksp-store-api`.
|
|
|
|
#### Idempotence et concurrence
|
|
|
|
Figer l'algorithme exact pour :
|
|
|
|
```text
|
|
deux inserts identiques concurrents
|
|
deux inserts divergents concurrents
|
|
transaction déjà présente + observation nouvelle
|
|
observation_key déjà présent identique
|
|
observation_key déjà présent divergent
|
|
ForceRehydrate concurrent
|
|
rollback si l'observation échoue après la partie canonical
|
|
```
|
|
|
|
Éviter tout pattern race-prone du type :
|
|
|
|
```text
|
|
SELECT/has puis INSERT séparé sans garantie transactionnelle
|
|
```
|
|
|
|
#### Pagination/cursor
|
|
|
|
Figer :
|
|
|
|
```text
|
|
ordre total déterministe
|
|
clé de tie-break
|
|
format/version du cursor opaque
|
|
validation d'un cursor hostile
|
|
liaison du cursor à network/range/direction si nécessaire
|
|
comportement pour une RawPageLimit trop grande pour une limite physique PostgreSQL réelle
|
|
```
|
|
|
|
Le cursor :
|
|
|
|
```text
|
|
ne contient aucun SQL public
|
|
ne contient aucun secret
|
|
ne devient pas un protocole public documenté
|
|
reste <= MAX_RAW_PAGE_CURSOR_BYTES
|
|
```
|
|
|
|
Ne pas ajouter `bincode`. Si un encodage privé fixe suffit, le coder directement sans ouvrir un codec wire KSP. Les codecs wire officiels restent possédés par `ksp-interface-lib` et ne sont ajoutés que lorsqu'un protocole réel l'exige.
|
|
|
|
#### Rétention physique
|
|
|
|
Les contrats logiques acquis sont :
|
|
|
|
```text
|
|
Full -> Compacted -> Archived -> Purged
|
|
Full -> Archived
|
|
Compacted -> Archived
|
|
```
|
|
|
|
`pre.001` doit décider comment PostgreSQL peut représenter **honnêtement** chaque état supporté.
|
|
|
|
Ne pas marquer `Compacted` si aucun compactage réel n'existe, ni `Archived` si le payload reste simplement dans le même hot path sans sémantique d'archive. Si un gap backend-agnostic empêche une conformance honnête, le documenter avant de modifier `ksp-store-api`.
|
|
|
|
`Purged` doit conserver le tombstone minimal défini par l'API et supprimer l'accès ordinaire au payload complet.
|
|
|
|
#### Erreurs
|
|
|
|
Définir une taxonomie sûre pour les échecs de persistence/query backend :
|
|
|
|
```text
|
|
conflit logique -> ERROR_CODE_RAW_CONFLICT
|
|
input/query invalide -> codes Store API existants
|
|
backend/SQL failure -> code(s) Store runtime sûrs à définir si nécessaires
|
|
aucun SQLSTATE/message serveur/valeur bindée sensible dans l'erreur publique
|
|
```
|
|
|
|
---
|
|
|
|
## 8. Livrables fonctionnels et hors périmètre
|
|
|
|
### 8.1 Livrables
|
|
|
|
`0.3.3` doit livrer :
|
|
|
|
```text
|
|
migration(s) métier RawTransaction à partir de V001
|
|
schema/constraints/indexes PostgreSQL minimaux justifiés
|
|
mapping privé rows <-> ksp-store-api
|
|
impl des six capabilities sur le backend PostgreSQL
|
|
impl/dispatch des six capabilities sur Store
|
|
atomicité canonical + observation
|
|
idempotence/conflits
|
|
get transaction
|
|
get observation
|
|
record observation
|
|
list références transaction cursorisé
|
|
retention state
|
|
retention transition atomique
|
|
tombstone
|
|
ForceRehydrate
|
|
tests déterministes
|
|
canaris API/dependency/security
|
|
PostgreSQL live integration
|
|
README/USAGE/plan/validation réconciliés en fermeture
|
|
```
|
|
|
|
### 8.2 Hors périmètre strict
|
|
|
|
Ne pas ouvrir :
|
|
|
|
```text
|
|
RawAccountState PostgreSQL
|
|
RawAccountObservation PostgreSQL
|
|
schema/indexes account state
|
|
N2 STRUCTURAL
|
|
N3 DECODED
|
|
N4 DOMAIN
|
|
processing ledger
|
|
worker/job/backfill
|
|
batch scheduler
|
|
Store Desk / inspection app
|
|
event bus / LISTEN NOTIFY
|
|
nouveau transport/acquisition provider
|
|
conversion HTTP/WS/gRPC -> RawTransaction
|
|
codec wire officiel
|
|
compression/archive worker global
|
|
maintenance destructive publique
|
|
backend MySQL/SQLite/Oracle/RocksDB/ClickHouse
|
|
```
|
|
|
|
Les tests peuvent construire directement des modèles `ksp-store-api`; `0.3.3` ne doit pas aspirer Transport uniquement pour fabriquer des fixtures.
|
|
|
|
---
|
|
|
|
## 9. Contraintes sécurité/API/architecture spécifiques
|
|
|
|
### 9.1 Atomicité
|
|
|
|
```text
|
|
persist_raw_transaction_acquisition
|
|
canonical + observation dans une unité atomique
|
|
jamais canonical durable si observation échoue
|
|
jamais observation orpheline
|
|
```
|
|
|
|
Toute course concurrente doit produire un outcome déterministe ou une erreur stable, jamais un overwrite silencieux.
|
|
|
|
### 9.2 Network boundary
|
|
|
|
Avant toute acquisition/query/retention :
|
|
|
|
```text
|
|
input.network == Store.network
|
|
```
|
|
|
|
Sinon :
|
|
|
|
```text
|
|
rejet avant pool.get / SQL
|
|
aucun fallback
|
|
aucun auto-routing
|
|
```
|
|
|
|
Le backend doit également empêcher une mauvaise URI de transformer l'identité réseau des données déjà persistées.
|
|
|
|
### 9.3 SQL
|
|
|
|
```text
|
|
SQL statique ou paramètres bindés
|
|
aucune interpolation de valeur métier
|
|
identifiants physiques constants KSP
|
|
constraints correspondant aux invariants exacts lorsqu'elles sont utiles
|
|
pas de SQL exposé dans API/log/error
|
|
pas d'ORM ajouté sans besoin démontré
|
|
```
|
|
|
|
### 9.4 Représentation des bytes
|
|
|
|
Préserver exactement :
|
|
|
|
```text
|
|
signature 64 bytes
|
|
content hash 32 bytes
|
|
observation key 32 bytes
|
|
payload canonical opaque <= 16 MiB
|
|
source payload hash optionnel 32 bytes
|
|
```
|
|
|
|
Une lecture de row invalide est un échec backend sûr ; elle ne doit jamais reconstruire un modèle partiel ou tronqué.
|
|
|
|
### 9.5 Pagination
|
|
|
|
Utiliser une pagination keyset/cursor déterministe si retenue par `pre.001`; ne pas utiliser un `OFFSET` non borné comme substitut automatique à un cursor opaque lorsque cela compromet stabilité ou coût.
|
|
|
|
Aucune limite `100`, `500`, `1000`, etc. n'est inventée par Store. Une limitation physique réelle doit être représentée honnêtement par continuation ou erreur backend justifiée.
|
|
|
|
### 9.6 Rétention et policy
|
|
|
|
Store applique la transition demandée par le caller ; il ne décide jamais :
|
|
|
|
```text
|
|
quand compacter
|
|
quand archiver
|
|
quand purger
|
|
si STRUCTURAL/DECODED est suffisamment complet
|
|
```
|
|
|
|
Ces décisions appartiennent aux futurs jobs/workers/policies.
|
|
|
|
### 9.7 Secrets et diagnostics
|
|
|
|
Aucun :
|
|
|
|
```text
|
|
URI
|
|
credential
|
|
payload RAW
|
|
signature complète
|
|
hash complet
|
|
observation key complète
|
|
SQL
|
|
bind value
|
|
server error brut
|
|
```
|
|
|
|
ne doit apparaître dans un log/error/debug non explicitement conçu pour l'exposer. Les `Debug` existants de Store API restent la référence de redaction.
|
|
|
|
### 9.8 Async/runtime
|
|
|
|
```text
|
|
async-first
|
|
pas de runtime global additionnel
|
|
pas de spawn orphelin
|
|
pas de mutex sync gardé à travers await
|
|
transactions SQL bornées par les timeouts existants ou des bounds justifiés
|
|
pool central réutilisé
|
|
shutdown foundation inchangé
|
|
```
|
|
|
|
### 9.9 Logging
|
|
|
|
Utiliser uniquement `ksp-logging-lib` avec `TRACING_TARGET` existant. Ne pas journaliser les données métier RAW ni le SQL.
|
|
|
|
---
|
|
|
|
## 10. Première mission `0.3.3-pre.001`
|
|
|
|
`pre.001` ne crée pas encore la migration métier ni les repositories lourds.
|
|
|
|
### 10.1 Vérifier la base stable réelle
|
|
|
|
Inventorier :
|
|
|
|
```text
|
|
versions Cargo/features Store
|
|
exports/modules exacts des trois crates Store
|
|
migrations présentes et checksum V000
|
|
Config std.store final
|
|
Store/network lifecycle final
|
|
tests hardening/completeness 0.3.2
|
|
PostgreSQL live proof 0.3.2
|
|
```
|
|
|
|
### 10.2 Auditer exactement les six capabilities
|
|
|
|
Pour chacune, écrire une matrice :
|
|
|
|
```text
|
|
input
|
|
invariants pré-I/O
|
|
transaction SQL nécessaire
|
|
row(s) touchée(s)
|
|
idempotence
|
|
conflit
|
|
absence/not-found
|
|
error mapping
|
|
concurrence
|
|
test déterministe
|
|
test PostgreSQL live
|
|
```
|
|
|
|
### 10.3 Audit historique kbot3 ciblé
|
|
|
|
Exécuter l'audit de la section 4 et produire la classification `REPRENDRE / REDESSINER / REPORTER / REJETER`.
|
|
|
|
### 10.4 Design physique
|
|
|
|
Proposer puis figer :
|
|
|
|
```text
|
|
V001 exact
|
|
noms tables/columns/indexes/constraints
|
|
network binding database/rows
|
|
mapping de tous les champs API
|
|
représentation u64/u32 sans narrowing
|
|
algorithme conflict/idempotence
|
|
transaction boundaries
|
|
observation uniqueness
|
|
cursor format/order
|
|
retention storage
|
|
purge/tombstone
|
|
ForceRehydrate
|
|
error taxonomy
|
|
```
|
|
|
|
Aucun champ physique ne doit être ajouté « au cas où » pour les futurs processors.
|
|
|
|
### 10.5 Threat model
|
|
|
|
Couvrir au minimum :
|
|
|
|
```text
|
|
wrong-network input avant I/O
|
|
wrong-network database URI
|
|
signature/hash/key malformed dans DB
|
|
payload oversized/corrupted dans DB
|
|
u64 overflow/narrowing
|
|
observation orphan
|
|
canonical orphan après rollback
|
|
identical concurrent insert
|
|
divergent concurrent insert
|
|
observation-key collision
|
|
cursor hostile/replayed against another query
|
|
pagination duplicate/skip sous ordre ambigu
|
|
retention compare-and-transition race
|
|
purge vs read/write race
|
|
ForceRehydrate vs normal acquisition race
|
|
SQL/server error leak
|
|
pool cancellation pendant transaction
|
|
schema/index migration mismatch
|
|
```
|
|
|
|
### 10.6 Sizing
|
|
|
|
Chaque tranche intermédiaire prévue au-delà d'environ **15 à 20 minutes de travail effectif** doit être scindée avant implémentation. Ce budget sert au sizing, pas à promettre un délai.
|
|
|
|
Si `RawTransaction` complet ne semble plus clôturable dans une session, redécouper la release avant le SQL lourd. Ne jamais tirer `RawAccountState` dans `0.3.3`.
|
|
|
|
### 10.7 Documents de gate
|
|
|
|
Créer :
|
|
|
|
```text
|
|
docs/plans/024-V0_3_3_STORE_POSTGRES_RAW_TRANSACTION_PLAN.md
|
|
docs/validation/020-V0_3_3_STORE_POSTGRES_RAW_TRANSACTION.md
|
|
```
|
|
|
|
Le plan doit reprendre la prévision souple recalibrée et les décisions physiques exactes.
|
|
|
|
### 10.8 Critères de sortie de `pre.001`
|
|
|
|
`pre.001` est terminé seulement si :
|
|
|
|
```text
|
|
base stable vérifiée
|
|
règles/architecture 0.3.1/0.3.2 relues
|
|
six capabilities auditées
|
|
archive kbot3 ciblée relue et classée
|
|
schema V001 proposé
|
|
network binding décidé
|
|
représentation u64/u32 décidée
|
|
atomicité/idempotence/conflit décidés
|
|
cursor/order décidés
|
|
retention/tombstone/rehydrate décidés ou gap API explicitement identifié
|
|
error taxonomy décidée
|
|
indexes minimaux justifiés
|
|
threat model complet
|
|
stratégie live PostgreSQL définie
|
|
plan 024 créé
|
|
validation 020 créée
|
|
prévision souple recalibrée
|
|
aucun RawAccountState/N2/worker aspiré
|
|
```
|
|
|
|
---
|
|
|
|
## 11. Prévision souple initiale des prereleases
|
|
|
|
Cette prévision est volontairement fine et peut être scindée/recalibrée par `pre.001`.
|
|
|
|
### `pre.001` — Audit contrats, kbot3, schéma, concurrence et sizing
|
|
|
|
Lecture complète, matrice des six capabilities, audit historique ciblé, design V001/indexes/network binding/u64/cursor/rétention, threat model et plan/validation.
|
|
|
|
### `pre.002` — Migration V001 + schéma/indexes RawTransaction
|
|
|
|
Ajouter uniquement les structures physiques réellement nécessaires à `RawTransaction`, observations et rétention, via le moteur de migrations KSP existant. Tests checksum/history/schema. Pas encore de façade métier complète.
|
|
|
|
### `pre.003` — Mapping physique + lectures unitaires
|
|
|
|
Introduire les mappings privés rows/API et les primitives SQL de lecture `get transaction`, `get observation`, retention metadata/tombstone, avec validation hostile des rows. Aucun type SQL public.
|
|
|
|
### `pre.004` — Persistence acquisition atomique + observations
|
|
|
|
Implémenter `persist_raw_transaction_acquisition` et `record_raw_transaction_observation` avec atomicité, idempotence, conflit et concurrence déterministes.
|
|
|
|
### `pre.005` — List/query + cursorisation
|
|
|
|
Implémenter `RawTransactionQuery`, ordre total, slot range, directions, cursor opaque/versionné, continuation et gestion honnête des limites physiques.
|
|
|
|
### `pre.006` — Rétention, tombstone et ForceRehydrate
|
|
|
|
Implémenter compare-and-transition atomique, lecture state/tombstone, purge conforme et réhydratation forcée selon le design `pre.001`, sans policy worker.
|
|
|
|
### `pre.007` — Composition façade + conformance des six capabilities
|
|
|
|
Faire implémenter/dispatcher les six traits par `Store`, fermer network mismatch pré-I/O, error mapping, feature mismatch et canaris d'API/dependency.
|
|
|
|
### `pre.008` — PostgreSQL integration réelle RawTransaction
|
|
|
|
Gate opt-in sur base dédiée : migration V001, write/read, observation, idempotence, conflit, concurrence, pagination multi-page, rétention/tombstone/rehydrate, rollback et close.
|
|
|
|
### `pre.009` — Hardening/completeness
|
|
|
|
Inputs hostiles, rows corrompues, cursor adversarial, no-secret/no-SQL-leak, exact exports/modules, `ksp-store-api` non régressé, aucun AccountState, aucun worker policy.
|
|
|
|
### `pre.010` — Gate technique final
|
|
|
|
`cargo clean` si pertinent, workspace complet, tests ciblés, `cargo test --workspace`, graphes/features et replay du live PostgreSQL RawTransaction. Aucun développement fonctionnel nouveau.
|
|
|
|
### `pre.011` — Réconciliation documentaire finale
|
|
|
|
README/USAGE Store/backend, plan, validation et indexes docs réellement impactés. Ne pas toucher `CHANGELOG.md`, `ROADMAP.md` ni au prompt suivant.
|
|
|
|
### `pre.012` — Préparation de publication minimale
|
|
|
|
Uniquement :
|
|
|
|
```text
|
|
Cargo.toml
|
|
CHANGELOG.md
|
|
ROADMAP.md
|
|
prompts/023-V0_3_4_START_PROMPT.md
|
|
deltas/0.3.3/pre.012.md
|
|
```
|
|
|
|
### `rel.001` — Publication stable
|
|
|
|
Version finale + delta uniquement.
|
|
|
|
---
|
|
|
|
## 12. Versionnement, deltas, commits et tags
|
|
|
|
Respecter `docs/rules/VERSION_WORKFLOW.md`.
|
|
|
|
Rappels :
|
|
|
|
```text
|
|
workspace.package.version prerelease : 0.3.3-pre.N
|
|
livraison : 0.3.3-pre.NNN
|
|
fix runtime/code : Cargo 0.3.3-pre.N.fix.M
|
|
fix doc-only : Cargo inchangé
|
|
chaque delta commité
|
|
tag stable final : v0.3.3
|
|
```
|
|
|
|
Chaque delta contient :
|
|
|
|
```text
|
|
base requise
|
|
objectif
|
|
fichiers ajoutés/modifiés/supprimés
|
|
validations exécutées
|
|
validations non exécutées
|
|
décisions
|
|
questions ouvertes
|
|
```
|
|
|
|
Une commande non exécutée n'est jamais déclarée PASS.
|
|
|
|
---
|
|
|
|
## 13. Procédure d'application et validation opérateur
|
|
|
|
Après chaque overlay :
|
|
|
|
```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.3
|
|
cargo check --workspace
|
|
cargo clippy --workspace --all-targets
|
|
```
|
|
|
|
Tests ciblés typiques :
|
|
|
|
```bash
|
|
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
|
|
```
|
|
|
|
Lorsque le graphe/features change ou au gate final :
|
|
|
|
```bash
|
|
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 gate technique final inclut :
|
|
|
|
```bash
|
|
cargo test --workspace
|
|
```
|
|
|
|
Ne pas refaire systématiquement les builds Tauri : `0.3.3` n'a aucune raison d'en modifier les resources/configs desktop sauf changement réellement démontré.
|
|
|
|
---
|
|
|
|
## 14. Validation PostgreSQL réelle spécifique
|
|
|
|
La release doit disposer d'un test PostgreSQL réel opt-in, sûr et non destructif sur une database dédiée.
|
|
|
|
Le gate doit couvrir au minimum :
|
|
|
|
```text
|
|
PostgreSQL >= 15
|
|
V000 + V001 bootstrap
|
|
open Store pour un RawNetworkId explicite
|
|
persist acquisition nouvelle
|
|
read transaction exacte
|
|
read observation exacte
|
|
re-persist identique -> AlreadyPresent
|
|
conflit même identité/contenu divergent -> ERROR_CODE_RAW_CONFLICT
|
|
observation supplémentaire
|
|
observation idempotente
|
|
concurrence identical/divergent
|
|
list ascending/descending
|
|
slot range
|
|
au moins deux pages et cursor continuation
|
|
cursor hostile rejeté
|
|
retention state
|
|
compare-and-transition concurrent
|
|
purge/tombstone
|
|
normal acquisition après purge -> SkippedPurged
|
|
ForceRehydrate conforme
|
|
rollback d'une acquisition forcée en échec
|
|
health reste Ready après opérations valides
|
|
close borné
|
|
cleanup uniquement des objets possédés par le test
|
|
```
|
|
|
|
Le test ne doit :
|
|
|
|
```text
|
|
afficher aucune URI/credential
|
|
lire aucun env depuis Store/backend
|
|
DROP aucune database/schema non créée par lui
|
|
utiliser aucune table RawAccountState
|
|
exiger aucun endpoint Solana live
|
|
```
|
|
|
|
---
|
|
|
|
## 15. Critères de clôture de `0.3.3`
|
|
|
|
La release stable est prête seulement si :
|
|
|
|
```text
|
|
V001+ migrations RawTransaction sont versionnées/checksummées
|
|
schema physique conserve tous les invariants API utiles sans narrowing
|
|
binding réseau empêche une réinterprétation cross-network
|
|
PostgresBackend satisfait les six capabilities RawTransaction
|
|
Store satisfait/dispatch les six capabilities
|
|
network mismatch est rejeté avant I/O
|
|
acquisition canonical+observation est atomique
|
|
idempotence identical est stable
|
|
conflit divergent retourne ERROR_CODE_RAW_CONFLICT
|
|
observations supplémentaires sont idempotentes
|
|
get transaction/observation fonctionnent
|
|
list est déterministe et cursorisé
|
|
aucune policy batch/backlog n'est introduite
|
|
rétention compare-and-transition est atomique
|
|
purge conserve le tombstone minimal
|
|
normal post-purge skippe
|
|
ForceRehydrate fonctionne sans écraser un conflit
|
|
aucun SQL/type physique n'est exposé par la façade
|
|
aucun secret/payload/SQL distant ne fuite dans erreurs/logs
|
|
ksp-store-api reste backend-agnostic ou toute modification est justifiée par un gap réel
|
|
RawAccountState PostgreSQL reste absent
|
|
PostgreSQL live gate est vert
|
|
workspace/Clippy/tests/graphes sont verts
|
|
README/USAGE/plan/validation sont réconciliés
|
|
prompt 0.3.4 réserve RawAccountState + complétude RAW
|
|
```
|
|
|
|
---
|
|
|
|
## 16. Release suivante et instruction d'ouverture
|
|
|
|
La release suivante envisagée est :
|
|
|
|
```text
|
|
0.3.4 — Store/PostgreSQL RawAccountState + complétude/conformance RAW
|
|
```
|
|
|
|
Elle réutilisera la même fondation `0.3.2` et les patterns physiques/concurrence validés par `0.3.3`, sans recréer une seconde architecture Store.
|
|
|
|
### Instruction d'ouverture
|
|
|
|
À réception de la base stable `v0.3.2` et de l'archive historique requise :
|
|
|
|
1. vérifier la base exacte et les migrations réellement présentes ;
|
|
2. lire règles, architecture, plans/validations `0.3.1` et `0.3.2`, puis les sources des trois crates Store ;
|
|
3. auditer les six capabilities `RawTransaction` une par une ;
|
|
4. réauditer kbot3 uniquement sur son ancienne vertical slice RAW transaction/observation ;
|
|
5. figer V001, network binding, représentation u64/u32, idempotence/concurrence, cursor et rétention ;
|
|
6. produire threat model, sizing, plan `024` et validation `020` ;
|
|
7. **ne pas créer la migration métier ni le repository lourd avant validation cohérente de `pre.001`** ;
|
|
8. **ne pas ouvrir `RawAccountState`, STRUCTURAL, jobs/workers ou application d'inspection dans `0.3.3`**.
|