v0.3.3-pre.009

This commit is contained in:
2026-08-30 14:29:33 +02:00
parent 7f0a642972
commit ce658e58f7
8 changed files with 1450 additions and 12 deletions

View File

@@ -6,7 +6,7 @@ resolver = "3"
members = ["crates/ksp-app-config-desk", "crates/ksp-app-solprices-desk", "crates/ksp-app-wallet-desk", "crates/ksp-config-lib", "crates/ksp-core-lib", "crates/ksp-interface-lib", "crates/ksp-logging-lib", "crates/ksp-offchain-transport-lib", "crates/ksp-onchain-transport-lib", "crates/ksp-program-api", "crates/ksp-store-api", "crates/ksp-store-lib", "crates/ksp-store-postgres-lib", "crates/ksp-wallet-lib"] members = ["crates/ksp-app-config-desk", "crates/ksp-app-solprices-desk", "crates/ksp-app-wallet-desk", "crates/ksp-config-lib", "crates/ksp-core-lib", "crates/ksp-interface-lib", "crates/ksp-logging-lib", "crates/ksp-offchain-transport-lib", "crates/ksp-onchain-transport-lib", "crates/ksp-program-api", "crates/ksp-store-api", "crates/ksp-store-lib", "crates/ksp-store-postgres-lib", "crates/ksp-wallet-lib"]
[workspace.package] [workspace.package]
version = "0.3.3-pre.8.fix.1" version = "0.3.3-pre.9"
edition = "2024" edition = "2024"
license = "MIT" license = "MIT"
repository = "https://git.sasedev.com/Sasedev/khadhroony-solana-project" repository = "https://git.sasedev.com/Sasedev/khadhroony-solana-project"

View File

@@ -1,5 +1,5 @@
<!-- file: crates/ksp-store-postgres-lib/README.md --> <!-- file: crates/ksp-store-postgres-lib/README.md -->
<!-- version: 7 --> <!-- version: 8 -->
# ksp-store-postgres-lib # ksp-store-postgres-lib
@@ -161,12 +161,23 @@ Le backend verrouille la ligne canonique avec `FOR UPDATE`, valide la forme phys
Toute transition dont `expected` ou `target` vaut `Compacted` est rejetée avant `pool.get()` avec `RetentionCompactionUnsupported` et le code stable `store.postgres_retention_compaction_unsupported`. PostgreSQL n'utilise pas TOAST comme faux contrat de compaction. Toute transition dont `expected` ou `target` vaut `Compacted` est rejetée avant `pool.get()` avec `RetentionCompactionUnsupported` et le code stable `store.postgres_retention_compaction_unsupported`. PostgreSQL n'utilise pas TOAST comme faux contrat de compaction.
## Preuve PostgreSQL live `0.3.3-pre.009`
La vertical slice `RawTransaction` possède un test PostgreSQL réel opt-in dédié :
```text
postgres_raw_transaction_live
```
Il refuse une base où une table KSP gérée existe déjà, lit lURI dédiée uniquement sur `stdin`, ne laffiche jamais et nettoie seulement le schéma quil a lui-même créé. La preuve couvre bootstrap V000/V001, binding réseau, réparation additive contrôlée, écritures atomiques, concurrence réelle, observations, pagination/cursor, rétention/ForceRehydrate, races et rollback par annulation dune tâche bloquée sur un verrou PostgreSQL.
Le test reste `#[ignore]` dans les gates ordinaires. Son exécution réelle et le major PostgreSQL exercé sont enregistrés dans la matrice de validation de la release.
## Hors périmètre actuel ## Hors périmètre actuel
La crate ne contient encore : La crate ne contient encore :
- aucune capability `RawAccount*` ; - aucune capability `RawAccount*` ;
- aucun dispatch métier dans `ksp-store-lib` ;
- aucune implémentation PostgreSQL des capabilities `RawAccount*` ; - aucune implémentation PostgreSQL des capabilities `RawAccount*` ;
- aucune orchestration worker/job ; - aucune orchestration worker/job ;
- aucun transport d'acquisition ou decoder Program. - aucun transport d'acquisition ou decoder Program.

View File

@@ -1,5 +1,5 @@
<!-- file: crates/ksp-store-postgres-lib/USAGE.md --> <!-- file: crates/ksp-store-postgres-lib/USAGE.md -->
<!-- version: 7 --> <!-- version: 8 -->
# Utilisation de ksp-store-postgres-lib # Utilisation de ksp-store-postgres-lib
@@ -237,3 +237,14 @@ Cette conformance est principalement utile aux tests backend et à la façade. L
## 12. Ce que cette crate ne permet pas encore ## 12. Ce que cette crate ne permet pas encore
La tranche ne fournit pas les capabilities `RawAccount*`. Elles appartiennent à `0.3.4`. La tranche ne fournit pas les capabilities `RawAccount*`. Elles appartiennent à `0.3.4`.
## 13. Exécuter la preuve PostgreSQL live RawTransaction
Le test `postgres_raw_transaction_live` exige une base PostgreSQL dédiée et vide de toute table KSP gérée. Il lit son URI sur lentrée standard afin de ne pas contourner Config par une variable denvironnement de test :
```bash
printf '%s\n' '<URI_POSTGRES_DEDIEE>' | cargo test -p ksp-store-postgres-lib --test postgres_raw_transaction_live -- --ignored --nocapture
```
Le test refuse de démarrer si une table KSP V000/V001 existe déjà. Il ne logge pas lURI et ne supprime que le schéma quil a prouvé absent avant son propre bootstrap.

View File

@@ -1,5 +1,5 @@
// file: crates/ksp-store-postgres-lib/tests/hardening_completeness.rs // file: crates/ksp-store-postgres-lib/tests/hardening_completeness.rs
// version: 8 // version: 9
#![warn(missing_docs)] #![warn(missing_docs)]
#![deny(unreachable_pub)] #![deny(unreachable_pub)]
@@ -230,3 +230,28 @@ fn pre_009_backend_has_no_env_bypass_reverse_facade_edge_or_raw_account_trait_im
} }
return; return;
} }
#[test]
fn pre_009_live_raw_transaction_proof_is_opt_in_isolated_and_secret_safe() {
let live = include_str!("postgres_raw_transaction_live.rs");
for required in [
"#[ignore = \"opt-in real PostgreSQL RawTransaction proof; reads one dedicated URI from stdin\"]",
"std::io::stdin().read_line",
"managed_schema_preexisting_refusal",
"prove_schema_update_policy",
"prove_concurrent_identical_insert",
"prove_concurrent_divergent_insert",
"prove_pagination",
"prove_retention_and_rehydrate",
"prove_retention_races",
"prove_cancellation_rollback",
"task.abort()",
"cleanup_verification",
] {
assert!(live.contains(required), "missing pre.009 live proof guard/scenario: {required}");
}
for forbidden in ["std::env", "KSP_SECRET_", "PGPASSWORD", "connection_uri = %", "connection_uri = ?", "println!(uri", "eprintln!(uri"] {
assert!(!live.contains(forbidden), "pre.009 live proof contains forbidden secret/environment material: {forbidden}");
}
return;
}

File diff suppressed because it is too large Load Diff

184
deltas/0.3.3/pre.009.md Normal file
View File

@@ -0,0 +1,184 @@
<!-- file: deltas/0.3.3/pre.009.md -->
<!-- version: 1 -->
# Delta `0.3.3-pre.009` — preuve PostgreSQL live complète RawTransaction
## 1. Base et gate d'entrée
Base opérateur obligatoire :
```text
0.3.3-pre.8.fix.1
```
Le gate opérateur fourni le 2026-08-30 est entièrement propre : audits Rust/Markdown, `cargo check --workspace`, Clippy all-targets sans warning, tests Store API/façade/PostgreSQL/Config et `ksp-store-lib --no-default-features` passent. `pre.008-fix.001` est donc acquise.
## 2. Version
```text
workspace.package.version = 0.3.3-pre.9
```
## 3. Nouveau test PostgreSQL réel
La tranche ajoute :
```text
crates/ksp-store-postgres-lib/tests/postgres_raw_transaction_live.rs
```
Le test est `#[ignore]`, lit une URI PostgreSQL dédiée uniquement sur `stdin`, ne l'affiche jamais et refuse de démarrer lorsqu'une table KSP V000/V001 existe déjà. Il ne nettoie que le schéma qu'il a prouvé absent avant son propre bootstrap.
Il refuse PostgreSQL < 15 comme la preuve fondation existante.
## 4. Migration, identité réseau et schema update
La preuve couvre :
- bootstrap V000 + V001 sur base vide ;
- health Ready avec migration 1 ;
- refus d'une réouverture sous un autre `RawNetworkId` ;
- réouverture idempotente ;
- suppression contrôlée de `ix_ksp_raw_transactions_slot_signature` ;
- `schema_autoupdate=false` qui bloque le drift ;
- `schema_autoupdate=true` qui recrée et revalide l'index manquant.
Aucune ressource de migration n'est modifiée et aucun historique n'est réécrit.
## 5. Écriture, idempotence, concurrence et rollback
Le live couvre :
- canonical + observation atomiques ;
- get canonical exact ;
- observation round-trip exact avec provenance complète ;
- deux acquisitions identiques en vraies tâches concurrentes : un `Inserted`, un `AlreadyPresent` ;
- deux acquisitions divergentes sous la même signature : un gagnant et un `Conflict` ;
- vérification qu'une seule observation du duel divergent est durable ;
- observation supplémentaire `Inserted` puis `AlreadyPresent` ;
- même observation key divergente -> `Conflict` ;
- collision observation pendant une nouvelle acquisition -> rollback du canonical nouvellement tenté.
## 6. Pagination
Le test insère cinq signatures sur trois slots, dont deux paires ex æquo, et prouve :
```text
Ascending 50, 51, 52, 53, 54
Descending 54, 53, 52, 51, 50
page size 2
```
Il rejoue ensuite le cursor V1 sous :
- direction différente ;
- range différente.
Les deux cas doivent être `QueryInvalid`.
## 7. Rétention et rehydrate
La preuve couvre :
- compare mismatch observable ;
- `Full -> Archived` et lecture exacte depuis archive ;
- idempotence `AlreadyAtTarget` ;
- `Archived -> Purged` ;
- `get -> None` et tombstone minimal exact ;
- acquisition normale sur tombstone -> `SkippedPurged/NotRecorded` ;
- ForceRehydrate divergent -> `Conflict` sans mutation ;
- ForceRehydrate compatible -> `Rehydrated/Inserted` ;
- `Full -> Compacted` rejeté par `RetentionCompactionUnsupported` sans changement d'état ;
- deux archives concurrentes puis deux purges concurrentes : un `Applied` et un `AlreadyAtTarget` par race ;
- rehydrate après la race purge.
## 8. Cancellation réelle
Le test crée une observation durable, la verrouille via une transaction PostgreSQL administrateur, puis démarre une nouvelle acquisition qui :
1. insère son canonical dans sa transaction non committée ;
2. bloque sur la collision de l'observation verrouillée ;
3. reste bloquée au-delà du délai canari ;
4. est annulée via `JoinHandle::abort()` ;
5. libère ensuite le verrou administrateur ;
6. prouve que le canonical de l'acquisition annulée n'est pas durable.
Cette preuve exerce un rollback par cancellation réelle, pas une simulation séquentielle.
## 9. Réouverture finale
Après toutes les opérations, le backend est rouvert sur le même réseau. Le test exige :
- health Ready ;
- migration 1 ;
- lecture exacte d'un canonical durable antérieur.
Le cleanup final supprime les cinq tables KSP uniquement parce que leur absence initiale a été prouvée.
## 10. Migrations
Aucune ressource V000/V001 n'est modifiée.
Checksums attendus et recalculés :
```text
V000 d29068b8c13b9dc0cc9ef6aaadd0fa12d41e0fe4c56541a1118c4bfc846a1450
V001 31488cda2f08f3f46c4cdbdbb6c18c243662fada02eac4487040c8735d72cc51
```
V001 reste exactement à 40 ressources.
## 11. Fichiers modifiés
```text
Cargo.toml
crates/ksp-store-postgres-lib/README.md
crates/ksp-store-postgres-lib/USAGE.md
crates/ksp-store-postgres-lib/tests/hardening_completeness.rs
crates/ksp-store-postgres-lib/tests/postgres_raw_transaction_live.rs
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.009.md
```
Aucune suppression de fichier.
## 12. Validation exécutée dans l'environnement de génération
```text
General Rust rule audit: clean
Rust export completeness audit: 0 candidate(s)
KSP workspace Rust rule audit: clean
Markdown table audit: clean
```
Cargo, rustfmt et PostgreSQL réel ne sont pas disponibles dans l'environnement de génération. Le gate opérateur et le live restent donc à exécuter localement.
## 13. Gate opérateur standard
```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
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
```
## 14. Gate PostgreSQL live opt-in
Sur une base PostgreSQL dédiée et vide de toute table KSP gérée :
```bash
printf '%s\n' '<URI_POSTGRES_DEDIEE>' | cargo test -p ksp-store-postgres-lib --test postgres_raw_transaction_live -- --ignored --nocapture
```
## 15. Suite si les deux gates sont verts
```text
0.3.3-pre.010 — hardening/completeness
```

View File

@@ -1,5 +1,5 @@
<!-- file: docs/plans/024-V0_3_3_STORE_POSTGRES_RAW_TRANSACTION_PLAN.md --> <!-- file: docs/plans/024-V0_3_3_STORE_POSTGRES_RAW_TRANSACTION_PLAN.md -->
<!-- version: 9 --> <!-- version: 10 -->
# Plan `0.3.3` — Store/PostgreSQL RawTransaction vertical slice # Plan `0.3.3` — Store/PostgreSQL RawTransaction vertical slice
@@ -32,15 +32,17 @@ Tranches techniques validées :
0.3.3-pre.004 — mapping et lectures RAW 0.3.3-pre.004 — mapping et lectures RAW
0.3.3-pre.005 — écriture atomique et observations 0.3.3-pre.005 — écriture atomique et observations
0.3.3-pre.006 + fix.001 — pagination keyset + cursor V1 0.3.3-pre.006 + fix.001 — pagination keyset + cursor V1
0.3.3-pre.007 + fix.001 — archive, purge, compare-and-transition et rejet Compacted
0.3.3-pre.008 + fix.001 — six capabilities PostgreSQL + dispatch façade
``` ```
Tranche technique courante : Tranche technique courante :
```text ```text
0.3.3-pre.007archive, purge, compare-and-transition et rejet Compacted 0.3.3-pre.009preuve PostgreSQL live complète RawTransaction
``` ```
Les gates opérateur jusqu'à `pre.006-fix.001` sont verts. `pre.007` complète la surface backend-specific `RawTransaction` avec les transitions physiques `Full -> Archived -> Purged`, sans implémenter encore les six traits ni leur dispatch dans `ksp-store-lib`. Les gates opérateur jusqu'à `pre.008-fix.001` sont verts. `pre.009` n'ajoute aucun comportement métier ni migration : elle matérialise la preuve PostgreSQL réelle opt-in de la vertical slice complète, y compris concurrence, pagination, rétention/rehydrate et rollback/cancellation.
## 2. Sources et autorité ## 2. Sources et autorité
@@ -1170,6 +1172,22 @@ Tranche matérialisée :
- rétention/rehydrate ; - rétention/rehydrate ;
- rollback/cancellation. - rollback/cancellation.
Tranche matérialisée :
- nouveau test `postgres_raw_transaction_live`, `#[ignore]`, URI dédiée lue uniquement sur `stdin` et jamais affichée ;
- refus de démarrer si une table KSP V000/V001 existe déjà ; cleanup uniquement après preuve d'absence initiale ;
- bootstrap V000/V001, réouverture idempotente et refus d'un réseau différent ;
- suppression contrôlée de l'index business puis preuve `schema_autoupdate=false` bloquante / `schema_autoupdate=true` réparatrice ;
- insert canonical + observation, get exact et observation round-trip ;
- insert identique et divergent en vraies tâches concurrentes ;
- collision d'observation et preuve de rollback du canonical ;
- pagination multi-page sur slots ex æquo, ASC/DESC, cursor rejoué sous direction/range différente ;
- `Full -> Archived -> Purged`, tombstone, normal skip, ForceRehydrate compatible/divergent, rejet `Compacted` ;
- races concurrentes archive/purge puis rehydrate ;
- cancellation réelle : verrou PostgreSQL sur l'observation, acquisition bloquée après ouverture transactionnelle, `JoinHandle::abort`, puis preuve que le canonical non committé est absent ;
- réouverture finale et lecture d'un canonical durable ;
- aucune ressource V000/V001 modifiée.
### `0.3.3-pre.010` — hardening/completeness ### `0.3.3-pre.010` — hardening/completeness
- scans boundaries ; - scans boundaries ;

View File

@@ -1,5 +1,5 @@
<!-- file: docs/validation/020-V0_3_3_STORE_POSTGRES_RAW_TRANSACTION.md --> <!-- file: docs/validation/020-V0_3_3_STORE_POSTGRES_RAW_TRANSACTION.md -->
<!-- version: 13 --> <!-- version: 14 -->
# Validation `0.3.3` — Store/PostgreSQL RawTransaction vertical slice # Validation `0.3.3` — Store/PostgreSQL RawTransaction vertical slice
@@ -622,11 +622,24 @@ cap 500/1000 dans Store pagination
- `--no-default-features` : PASS ; - `--no-default-features` : PASS ;
- V000/V001 inchangées ; - V000/V001 inchangées ;
- premier gate opérateur : fonctionnellement PASS mais deux warnings Clippy `extra_unused_type_parameters` dans les helpers de preuve de traits ; - premier gate opérateur : fonctionnellement PASS mais deux warnings Clippy `extra_unused_type_parameters` dans les helpers de preuve de traits ;
- `pre.008-fix.001` matérialise `T` via `PhantomData<T>` dans ces deux helpers sans modifier les bounds, la production ni les migrations ; gate opérateur complet à rejouer. - `pre.008-fix.001` matérialise `T` via `PhantomData<T>` dans ces deux helpers sans modifier les bounds, la production ni les migrations ; gate opérateur complet PASS le 2026-08-30.
### `pre.009` ### `pre.009`
- PostgreSQL live opt-in complet. - test `postgres_raw_transaction_live` dédié et `#[ignore]` : MATÉRIALISÉ ;
- base dédiée obligatoire, refus de toute table KSP préexistante, URI lue sur `stdin` sans echo : PASS statique ;
- bootstrap V000/V001 + réouverture + wrong-network : COUVERT par le test, exécution réelle À FOURNIR ;
- réparation additive index avec `schema_autoupdate` off/on : COUVERTE par le test, exécution réelle À FOURNIR ;
- canonical+observation atomique + exact reads : COUVERT ;
- identical/divergent concurrent inserts : COUVERT en tâches `tokio::spawn` ;
- observation idempotence/divergence + rollback canonical sur conflit observation : COUVERT ;
- pagination multi-page/ties ASC-DESC + replay cursor autre direction/range : COUVERT ;
- archive/purge/tombstone/normal-skip/ForceRehydrate compatible-divergent/Compacted : COUVERT ;
- races archive et purge : COUVERT en tâches concurrentes ;
- cancellation : verrou observation PostgreSQL + acquisition bloquée + `abort()` + canonical absent après rollback : COUVERT ;
- réouverture finale : COUVERTE ;
- gate Cargo standard : NON EXÉCUTÉ dans l'environnement de génération ;
- test PostgreSQL réel `--ignored` : À EXÉCUTER côté opérateur.
### `pre.010` ### `pre.010`
@@ -648,7 +661,7 @@ cap 500/1000 dans Store pagination
- publication stable. - publication stable.
## 22. Gate courant `pre.008-fix.001` ## 22. Gate courant `pre.009`
```bash ```bash
cargo fmt --all cargo fmt --all