7.6 KiB
Delta 0.3.3-pre.001 — audit et physical design RawTransaction PostgreSQL
1. Objet
Ouverture de :
0.3.3 — Store/PostgreSQL RawTransaction vertical slice
Cette tranche reste volontairement documentaire/conception : elle fixe l'audit, le threat model, le design physique V001 et le séquencement avant toute migration ou persistence métier.
2. Base
Base canonique :
v0.3.2
Le gate opérateur fourni pour 0.3.2 est propre : audits Rust/Markdown, workspace check, Clippy, tests Store/API/PostgreSQL foundation/Config et ksp-store-lib --no-default-features passent ; les tests live restent opt-in/ignored conformément à la fondation.
3. Version
Version workspace après overlay :
0.3.3-pre.1
Label de livraison :
0.3.3-pre.001
4. Fichiers ajoutés
docs/plans/024-V0_3_3_STORE_POSTGRES_RAW_TRANSACTION_PLAN.md
docs/validation/020-V0_3_3_STORE_POSTGRES_RAW_TRANSACTION.md
deltas/0.3.3/pre.001.md
5. Fichier modifié
Cargo.toml
Modifications :
workspace.package.version : 0.3.2 -> 0.3.3-pre.1
file header version : 347 -> 348
6. Fichiers supprimés
Aucun.
7. Audit effectué
Ont été relus avant design :
- règles générales/KSP/Rust/dépendances/docs/file contracts/version workflow/prompt structure ;
- architectures Layers/Dependencies/Store/API/Config concernées ;
- plan/validation
0.3.1; - source/tests complets
ksp-store-api; - plan/validation
0.3.2; - source/tests complets
ksp-store-libetksp-store-postgres-lib; - surface Config
std.store; - archive historique kbot3 ciblée demandée par le prompt ;
- documentation PostgreSQL/tokio-postgres nécessaire aux choix numériques et de concurrence.
8. Décisions majeures
8.1 slot: u64
BIGINT est rejeté pour slot car il narrowe le domaine API. V001 utilisera :
NUMERIC(20,0)
avec conversion décimale fallible et tests jusqu'à u64::MAX.
8.2 Réseau physique
V001 introduira :
ksp_store_identity
Une base V001 est mono-réseau. Le binding est créé/validé sous le bootstrap lock afin qu'une URI pointant vers un autre réseau échoue avant exposition d'un backend prêt.
8.3 Schéma RAW minimal
Tables décidées :
ksp_store_identity
ksp_raw_transactions
ksp_raw_transaction_observations
ksp_raw_transaction_archive_payloads
Index métier additionnel unique :
(slot, signature) WHERE retention_state <> 'purged'
Aucun index provider/status/created_at/hash n'est ajouté sans requête correspondante.
8.4 Atomicité/idempotence
Le repository n'utilisera aucun has_* préalable. La stratégie est :
INSERT ... ON CONFLICT DO NOTHING RETURNING
-> si conflit : SELECT ... FOR UPDATE
-> comparaison exacte du contenu
-> AlreadyPresent ou ERROR_CODE_RAW_CONFLICT
Le canonique et son observation d'acquisition sont dans la même transaction PostgreSQL.
8.5 Pagination
Ordre total :
(slot, signature)
Cursor backend-private V1 fixe 109 octets, lié par SHA-256 au réseau, à la direction, au slot range et à la dernière clé. Aucun cap métier arbitraire n'est ajouté.
8.6 Rétention
Full, Archived et Purged sont représentables honnêtement par le backend 0.3.3 avec une relation archive séparée du hot path.
Compacted n'est pas assimilé au TOAST PostgreSQL et n'est pas simulé. Le plan 0.3.1 le qualifiait déjà d'optionnel ; aucun changement ksp-store-api n'est donc justifié. Les transitions qui l'impliquent seront rejetées avant I/O par store.postgres_retention_compaction_unsupported.
9. Audit kbot3
Classification effectuée :
- REPRENDRE : unicités, FK, keyset/index slot conceptuels ;
- REDESSINER : fixed bytes, payload opaque, u64 exact, atomicité, conflit réel, réseau, retention compare-and-transition ;
- REPORTER : indexes provider/status/time, processing/replay, batches, apps, AccountState ;
- REJETER : sqlx,
has_*, JSONB canonique, narrowing i64/i32, FKSET NULL, error text SQL, caps 500/1000, processing_state RAW.
Aucun code historique n'est copié.
10. Threat model couvert
Le plan couvre explicitement :
- mauvaise URI/réseau ;
- DB bytes malformés ;
- overflow u64 ;
- observation orpheline ;
- inserts identiques/divergents concurrents ;
- collision observation ;
- cursor hostile/replay ;
- ambiguïté pagination ;
- retention race ;
- purge/read/write race ;
- ForceRehydrate race ;
- fuite SQL/server text ;
- cancellation/rollback ;
- migration mismatch.
11. Séquencement recalibré
Le forecast initial est étendu à pre.013 afin de séparer proprement :
- généralisation du moteur de migration ;
- V001/binding réseau ;
- mapping/read ;
- write/observation atomiques ;
- pagination ;
- rétention ;
- façade ;
- live PostgreSQL ;
- hardening ;
- gate ;
- docs ;
- publication.
12. Hors scope conservé
Aucun changement fonctionnel n'est apporté à :
RawAccountState
N2
workers/jobs/backfills
apps
transport
codecs wire
event bus
compression/archive worker global
autres backends
13. Validations exécutées
Audit statique de la base et de l'overlay :
python3 scripts/audit_rust_workspace_rules.py
General Rust rule audit: clean
Rust export completeness audit: 0 candidate(s)
KSP workspace Rust rule audit: clean
python3 scripts/audit_markdown_tables.py README.md RULES.md ROADMAP.md CHANGELOG.md docs prompts crates deltas/0.3.3
Markdown table audit: clean (214 table(s), 131 file(s))
assertions structurelles locales
workspace.package.version = 0.3.3-pre.1
headers/version des trois nouveaux Markdown corrects
aucune référence résiduelle au faux code API RAW_RETENTION_UNSUPPORTED
L'audit de base couvre aussi manifests/features, modules/exports, V000 et checksum, Config std.store, plans/validations 0.3.1/0.3.2, tests hardening/completeness et preuve live documentée.
14. Validations non exécutées
Le conteneur d'assemblage ne fournit pas l'exécutable cargo. Les commandes suivantes sont donc NON EXÉCUTÉES, jamais déclarées PASS :
cargo fmt --all
cargo check --workspace
cargo clippy --workspace --all-targets
cargo test -p ksp-store-api
cargo test -p ksp-store-lib
cargo test -p ksp-store-postgres-lib
cargo test -p ksp-config-lib
cargo check -p ksp-store-lib --no-default-features
Les tests PostgreSQL live ne sont pas exécutés non plus. pre.001 ne modifie aucun SQL/runtime métier, la preuve foundation réelle 0.3.2 est déjà acquise et le futur test RawTransaction n'existe pas encore.
15. Questions ouvertes
Aucune question de design bloquante n'est laissée ouverte par pre.001.
Les valeurs runtime retenues sont déjà fixées :
store.postgres_retention_compaction_unsupported
store.wrong_network
store.raw_reference_not_found
store.postgres_read_failed
store.postgres_write_failed
store.postgres_data_invalid
store.postgres_page_limit_unsupported
Le checksum V001 n'est pas une question de design : il sera calculé sur les bytes exacts lorsque V001__raw_transaction.sql sera créé en pre.003.
16. Gate demandé
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
cargo test -p ksp-store-api
cargo test -p ksp-store-lib
cargo test -p ksp-store-postgres-lib
cargo test -p ksp-config-lib
cargo check -p ksp-store-lib --no-default-features
Aucun test PostgreSQL live n'est requis dans cette tranche documentaire.