v0.3.4-pre.009
This commit is contained in:
@@ -1,12 +1,12 @@
|
||||
# file: Cargo.toml
|
||||
# version: 376
|
||||
# version: 377
|
||||
|
||||
[workspace]
|
||||
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"]
|
||||
|
||||
[workspace.package]
|
||||
version = "0.3.4-pre.8.fix.1"
|
||||
version = "0.3.4-pre.9"
|
||||
edition = "2024"
|
||||
license = "MIT"
|
||||
repository = "https://git.sasedev.com/Sasedev/khadhroony-solana-project"
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// file: crates/ksp-store-postgres-lib/tests/hardening_completeness.rs
|
||||
// version: 15
|
||||
// version: 16
|
||||
|
||||
#![warn(missing_docs)]
|
||||
#![deny(unreachable_pub)]
|
||||
@@ -235,6 +235,41 @@ fn pre_009_backend_has_no_env_bypass_reverse_facade_edge_and_keeps_account_impls
|
||||
return;
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn pre_009_live_raw_account_proof_is_opt_in_isolated_secret_safe_and_cross_family() {
|
||||
let live = include_str!("postgres_raw_account_live.rs");
|
||||
for required in [
|
||||
"#[ignore = \"opt-in real PostgreSQL RawAccountState proof; reads one dedicated URI from stdin\"]",
|
||||
"std::io::stdin().read_line",
|
||||
"managed_schema_preexisting_refusal",
|
||||
"prove_schema_update_policy",
|
||||
"prove_state_extremes",
|
||||
"MAX_RAW_ACCOUNT_DATA_BYTES",
|
||||
"u64::MAX",
|
||||
"prove_atomic_idempotence_and_conflicts",
|
||||
"prove_additional_observations",
|
||||
"ReferenceNotFound",
|
||||
"prove_pagination_and_cursors",
|
||||
"KSPT",
|
||||
"prove_cross_family_coexistence",
|
||||
"persist_raw_transaction_acquisition",
|
||||
"prove_concurrent_identical_insert",
|
||||
"prove_concurrent_divergent_insert",
|
||||
"prove_cancellation_rollback",
|
||||
"task.abort()",
|
||||
"cleanup_verification",
|
||||
"ksp_raw_account_states",
|
||||
"ksp_raw_account_observations",
|
||||
"ksp_raw_transactions",
|
||||
] {
|
||||
assert!(live.contains(required), "missing pre.009 RawAccount 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 RawAccount live proof contains forbidden secret/environment material: {forbidden}");
|
||||
}
|
||||
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");
|
||||
@@ -251,6 +286,8 @@ fn pre_009_live_raw_transaction_proof_is_opt_in_isolated_and_secret_safe() {
|
||||
"prove_cancellation_rollback",
|
||||
"task.abort()",
|
||||
"cleanup_verification",
|
||||
"ksp_raw_account_states",
|
||||
"ksp_raw_account_observations",
|
||||
] {
|
||||
assert!(live.contains(required), "missing pre.009 live proof guard/scenario: {required}");
|
||||
}
|
||||
|
||||
1216
crates/ksp-store-postgres-lib/tests/postgres_raw_account_live.rs
Normal file
1216
crates/ksp-store-postgres-lib/tests/postgres_raw_account_live.rs
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,5 +1,5 @@
|
||||
// file: crates/ksp-store-postgres-lib/tests/postgres_raw_transaction_live.rs
|
||||
// version: 4
|
||||
// version: 5
|
||||
|
||||
#![warn(missing_docs)]
|
||||
#![deny(unreachable_pub)]
|
||||
@@ -18,7 +18,9 @@ const LIVE_INDEX_EXISTS_SQL: &str = r#"SELECT EXISTS (
|
||||
AND indexname = 'ix_ksp_raw_transactions_slot_signature'
|
||||
)"#;
|
||||
const LIVE_LOCK_OBSERVATION_SQL: &str = "SELECT observation_key FROM ksp_raw_transaction_observations WHERE observation_key = $1 FOR UPDATE";
|
||||
const LIVE_MANAGED_SCHEMA_DROP_SQL: &str = r#"DROP TABLE IF EXISTS ksp_raw_transaction_observations;
|
||||
const LIVE_MANAGED_SCHEMA_DROP_SQL: &str = r#"DROP TABLE IF EXISTS ksp_raw_account_observations;
|
||||
DROP TABLE IF EXISTS ksp_raw_account_states;
|
||||
DROP TABLE IF EXISTS ksp_raw_transaction_observations;
|
||||
DROP TABLE IF EXISTS ksp_raw_transaction_archive_payloads;
|
||||
DROP TABLE IF EXISTS ksp_raw_transactions;
|
||||
DROP TABLE IF EXISTS ksp_store_identity;
|
||||
@@ -31,7 +33,9 @@ const LIVE_MANAGED_SCHEMA_EXISTS_SQL: &str = r#"SELECT EXISTS (
|
||||
'ksp_store_identity',
|
||||
'ksp_raw_transactions',
|
||||
'ksp_raw_transaction_observations',
|
||||
'ksp_raw_transaction_archive_payloads'
|
||||
'ksp_raw_transaction_archive_payloads',
|
||||
'ksp_raw_account_states',
|
||||
'ksp_raw_account_observations'
|
||||
)
|
||||
AND table_type = 'BASE TABLE'
|
||||
)"#;
|
||||
|
||||
216
deltas/0.3.4/pre.009.md
Normal file
216
deltas/0.3.4/pre.009.md
Normal file
@@ -0,0 +1,216 @@
|
||||
<!-- file: deltas/0.3.4/pre.009.md -->
|
||||
<!-- version: 1 -->
|
||||
|
||||
# Delta `0.3.4-pre.009` — preuve PostgreSQL live `RawAccountState`
|
||||
|
||||
## 1. Base et gate d'entrée
|
||||
|
||||
Base opérateur obligatoire :
|
||||
|
||||
```text
|
||||
0.3.4-pre.008-fix.001
|
||||
```
|
||||
|
||||
Le gate opérateur fourni le 2026-08-30 est entièrement propre : audits Rust/Markdown, `cargo check --workspace`, Clippy all-targets, Store API, Store façade, backend PostgreSQL, Config et `ksp-store-lib --no-default-features` passent. L'inventaire RAW 10/10 de `pre.008` est donc acquis.
|
||||
|
||||
## 2. Version
|
||||
|
||||
```text
|
||||
workspace.package.version = 0.3.4-pre.9
|
||||
```
|
||||
|
||||
## 3. Nouveau test PostgreSQL réel account
|
||||
|
||||
La tranche ajoute :
|
||||
|
||||
```text
|
||||
crates/ksp-store-postgres-lib/tests/postgres_raw_account_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/V002 existe déjà. Il ne nettoie que le schéma qu'il a prouvé absent avant son propre bootstrap.
|
||||
|
||||
PostgreSQL < 15 est refusé comme pour les preuves live existantes.
|
||||
|
||||
## 4. Bootstrap, réseau, migration V002 et schema update
|
||||
|
||||
La preuve couvre :
|
||||
|
||||
- bootstrap V000 + V001 + V002 sur base vide ;
|
||||
- health Ready avec migration 2 ;
|
||||
- refus d'une réouverture sous un autre `RawNetworkId` ;
|
||||
- réouverture idempotente ;
|
||||
- suppression contrôlée de `ix_ksp_raw_account_states_slot_pubkey_state_hash` ;
|
||||
- `schema_autoupdate=false` qui bloque le drift ;
|
||||
- `schema_autoupdate=true` qui recrée et revalide l'index account manquant.
|
||||
|
||||
Aucune ressource de migration n'est modifiée et aucun historique n'est réécrit.
|
||||
|
||||
## 5. Domaine account et round-trip
|
||||
|
||||
Le live matérialise les extrêmes figés par `pre.001` :
|
||||
|
||||
```text
|
||||
slot = u64::MAX
|
||||
lamports = u64::MAX
|
||||
rent_epoch = u64::MAX
|
||||
write_version = u64::MAX
|
||||
data vide = admise
|
||||
data 16 MiB exact = admise et relue complète
|
||||
```
|
||||
|
||||
La lecture réouverte doit restituer exactement la référence, le contenu commun et les metadata optionnelles sans narrowing.
|
||||
|
||||
## 6. Atomicité, idempotence, conflits et observations
|
||||
|
||||
La preuve couvre :
|
||||
|
||||
- acquisition state + observation `Inserted/Inserted` ;
|
||||
- replay exact `AlreadyPresent/AlreadyPresent` ;
|
||||
- même référence complète avec contenu divergent -> `Conflict` ;
|
||||
- même `(pubkey, slot)` avec deux `state_hash` distincts -> deux states durables ;
|
||||
- collision d'`observation_key` pendant une nouvelle acquisition -> `Conflict` et rollback du state nouvellement tenté ;
|
||||
- observation supplémentaire -> `Inserted`, puis replay exact -> `AlreadyPresent` ;
|
||||
- même observation key divergente -> `Conflict` ;
|
||||
- référence state absente -> `ReferenceNotFound` ;
|
||||
- round-trip exact de la provenance commune et des metadata Yellowstone `is_startup`, `transaction_signature`, `write_version`.
|
||||
|
||||
## 7. Pagination et cursor `KSPA`
|
||||
|
||||
Le test matérialise cinq states sur la plage `200..=202` et prouve :
|
||||
|
||||
```text
|
||||
ASC (slot, pubkey, state_hash)
|
||||
DESC (slot, pubkey, state_hash) intégralement inversé
|
||||
page size = 2
|
||||
filtre pubkey exact
|
||||
```
|
||||
|
||||
Il rejoue ensuite le cursor sous direction différente, corrompt son digest, puis fournit un token de famille transaction `KSPT`. Les trois cas doivent être `QueryInvalid`.
|
||||
|
||||
Aucun `OFFSET`, plafond fonctionnel de page, batch-size ou policy worker n'est introduit.
|
||||
|
||||
## 8. Concurrence réelle
|
||||
|
||||
Deux acquisitions identiques sont lancées en vraies tâches concurrentes : le résultat attendu est exactement un `Inserted` et un `AlreadyPresent`.
|
||||
|
||||
Deux acquisitions divergentes partageant la même référence `(pubkey, slot, state_hash)` sont ensuite lancées en concurrence : exactement une gagne et l'autre doit produire `Conflict`.
|
||||
|
||||
## 9. Cancellation réelle
|
||||
|
||||
Le test :
|
||||
|
||||
1. crée une observation account durable ;
|
||||
2. verrouille cette `observation_key` via une transaction PostgreSQL administrateur `FOR UPDATE` ;
|
||||
3. démarre une nouvelle acquisition qui insère son state dans une transaction non committée puis bloque sur la collision observation ;
|
||||
4. vérifie que l'opération reste bloquée au-delà du délai canari ;
|
||||
5. l'annule via `JoinHandle::abort()` ;
|
||||
6. libère le verrou administrateur ;
|
||||
7. vérifie physiquement que le state de l'acquisition annulée n'est pas durable.
|
||||
|
||||
Cette preuve exerce le rollback par cancellation réelle figé en `pre.006`.
|
||||
|
||||
## 10. Coexistence `RawTransaction`
|
||||
|
||||
Dans le même schéma V002, le live persiste une acquisition account et une acquisition transaction utilisant volontairement la même `RawObservationKey` dans leurs tables familiales distinctes. Les deux familles doivent rester lisibles indépendamment, et la transaction est aussi vérifiée physiquement avant le reopen final.
|
||||
|
||||
Le test historique `postgres_raw_transaction_live.rs` est réconcilié uniquement sur son inventaire d'isolation : son probe et son cleanup prennent désormais aussi en compte :
|
||||
|
||||
```text
|
||||
ksp_raw_account_states
|
||||
ksp_raw_account_observations
|
||||
```
|
||||
|
||||
Aucun scénario métier RawTransaction n'est modifié.
|
||||
|
||||
## 11. Isolation et cleanup
|
||||
|
||||
Les deux lives considèrent désormais l'inventaire complet de tables Store V002 :
|
||||
|
||||
```text
|
||||
ksp_store_schema_migrations
|
||||
ksp_store_identity
|
||||
ksp_raw_transactions
|
||||
ksp_raw_transaction_observations
|
||||
ksp_raw_transaction_archive_payloads
|
||||
ksp_raw_account_states
|
||||
ksp_raw_account_observations
|
||||
```
|
||||
|
||||
Ils refusent un schéma préexistant et ne suppriment que le schéma qu'ils ont eux-mêmes bootstrapé après preuve d'absence initiale.
|
||||
|
||||
## 12. Migrations
|
||||
|
||||
Aucune ressource V000/V001/V002 n'est modifiée.
|
||||
|
||||
Checksums attendus :
|
||||
|
||||
```text
|
||||
V000 d29068b8c13b9dc0cc9ef6aaadd0fa12d41e0fe4c56541a1118c4bfc846a1450
|
||||
V001 31488cda2f08f3f46c4cdbdbb6c18c243662fada02eac4487040c8735d72cc51
|
||||
V002 ff21605ed45f7ab4c0f92bbb692700b4118a9488b04d50a31d259ac59bdb550e
|
||||
```
|
||||
|
||||
## 13. Fichiers modifiés
|
||||
|
||||
```text
|
||||
Cargo.toml
|
||||
crates/ksp-store-postgres-lib/tests/hardening_completeness.rs
|
||||
crates/ksp-store-postgres-lib/tests/postgres_raw_transaction_live.rs
|
||||
docs/plans/025-V0_3_4_STORE_POSTGRES_RAW_ACCOUNT_PLAN.md
|
||||
docs/validation/021-V0_3_4_STORE_POSTGRES_RAW_ACCOUNT.md
|
||||
```
|
||||
|
||||
## 14. Fichiers ajoutés
|
||||
|
||||
```text
|
||||
crates/ksp-store-postgres-lib/tests/postgres_raw_account_live.rs
|
||||
deltas/0.3.4/pre.009.md
|
||||
```
|
||||
|
||||
Aucune suppression de fichier.
|
||||
|
||||
## 15. 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 standard et le live restent donc à exécuter localement.
|
||||
|
||||
## 16. 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.4
|
||||
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
|
||||
```
|
||||
|
||||
## 17. 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_account_live -- --ignored --nocapture --test-threads=1
|
||||
```
|
||||
|
||||
Le live `RawTransaction` peut ensuite être rejoué séparément sur une base de nouveau vide :
|
||||
|
||||
```bash
|
||||
printf '%s\n' '<URI_POSTGRES_DEDIEE>' | cargo test -p ksp-store-postgres-lib --test postgres_raw_transaction_live -- --ignored --nocapture --test-threads=1
|
||||
```
|
||||
|
||||
## 18. Suite si les gates sont verts
|
||||
|
||||
```text
|
||||
0.3.4-pre.010 — hardening/completeness cross-family
|
||||
```
|
||||
@@ -1,11 +1,11 @@
|
||||
<!-- file: docs/plans/025-V0_3_4_STORE_POSTGRES_RAW_ACCOUNT_PLAN.md -->
|
||||
<!-- version: 14 -->
|
||||
<!-- version: 15 -->
|
||||
|
||||
# Plan `0.3.4` — Store/PostgreSQL `RawAccountState` + complétude RAW
|
||||
|
||||
## 1. Statut de la release
|
||||
|
||||
`0.3.4-pre.001` a figé le design. `0.3.4-pre.002` a matérialisé la fondation physique V002 minimale puis `pre.002-fix.001` a corrigé deux canaris sans toucher au SQL. `0.3.4-pre.003` complète V002 avec les contraintes de domaine, l'index de navigation, la compatibilité de schéma et le checksum final ; `pre.003-fix.001` corrige uniquement l'ordre alphabétique du bloc `const` de `migration.rs` et son gate opérateur complet est PASS. `0.3.4-pre.004` ouvre le mapping PostgreSQL privé et les deux lectures `get` account ; `pre.004-fix.001` corrige uniquement leur conformité au profil Clippy KSP et un canari inutilisé. `pre.005` ajoute l'acquisition atomique, `pre.006` l'observation supplémentaire, `pre.007` la pagination/cursor account et `pre.007-fix.001` réconcilie ses canaris ; le gate opérateur complet du fix est PASS. `pre.008` ouvre les quatre capabilities account sur `PostgresBackend` puis leur dispatch dans `Store`, pour porter l'inventaire RAW à 10/10 sans nouveau SQL ; son gate initial isole uniquement un déplacement erroné de variable dans un canari et `pre.008-fix.001` le corrige sans toucher à la surface fonctionnelle.
|
||||
`0.3.4-pre.001` a figé le design. `0.3.4-pre.002` a matérialisé la fondation physique V002 minimale puis `pre.002-fix.001` a corrigé deux canaris sans toucher au SQL. `0.3.4-pre.003` complète V002 avec les contraintes de domaine, l'index de navigation, la compatibilité de schéma et le checksum final ; `pre.003-fix.001` corrige uniquement l'ordre alphabétique du bloc `const` de `migration.rs` et son gate opérateur complet est PASS. `0.3.4-pre.004` ouvre le mapping PostgreSQL privé et les deux lectures `get` account ; `pre.004-fix.001` corrige uniquement leur conformité au profil Clippy KSP et un canari inutilisé. `pre.005` ajoute l'acquisition atomique, `pre.006` l'observation supplémentaire, `pre.007` la pagination/cursor account et `pre.007-fix.001` réconcilie ses canaris ; le gate opérateur complet du fix est PASS. `pre.008` ouvre les quatre capabilities account sur `PostgresBackend` puis leur dispatch dans `Store`, pour porter l'inventaire RAW à 10/10 sans nouveau SQL ; `pre.008-fix.001` corrige son unique canari mal réconcilié et son gate opérateur complet est PASS. `pre.009` ajoute la preuve PostgreSQL live account et réconcilie l'isolation du live RawTransaction avec le schéma V002 complet.
|
||||
|
||||
Base canonique auditée :
|
||||
|
||||
@@ -17,11 +17,11 @@ workspace.package.version = 0.3.3
|
||||
Version de travail de cette prerelease :
|
||||
|
||||
```text
|
||||
workspace.package.version = 0.3.4-pre.8.fix.1
|
||||
label = 0.3.4-pre.008-fix.001
|
||||
workspace.package.version = 0.3.4-pre.9
|
||||
label = 0.3.4-pre.009
|
||||
```
|
||||
|
||||
Décision de scope : `ksp-store-api` reste inchangée. L'audit n'a révélé aucun gap backend-agnostic bloquant ; la difficulté restante est exclusivement l'implémentation physique PostgreSQL et son dispatch par la façade.
|
||||
Décision de scope : `ksp-store-api` reste inchangée. L'inventaire backend/façade est désormais 10/10 ; les tranches restantes portent uniquement sur la preuve PostgreSQL réelle, le hardening cross-family, le gate final et la réconciliation documentaire.
|
||||
|
||||
## 2. Invariants hérités et frontières
|
||||
|
||||
@@ -681,15 +681,19 @@ Les canaris historiques sont transformés pour vérifier l'emplacement des impl
|
||||
|
||||
#### `pre.008-fix.001` — Réconciliation du canari `dependency_boundary`
|
||||
|
||||
**Statut : réalisé ; gate opérateur complet à rejouer.**
|
||||
**Statut : réalisé ; gate opérateur complet PASS.**
|
||||
|
||||
Fix strictement borné à `tests/dependency_boundary.rs` : la déclaration `runtime = include_str!("../src/runtime.rs")` est restaurée dans le canari d'ownership `pre.005` qui l'utilise encore pour interdire l'environnement et le SQL physique dans `runtime.rs`, puis retirée du canari V002 `pre.003` où `pre.008` ne l'utilise plus. Aucune assertion de fond, capability, façade, runtime métier, SQL ou migration n'est modifiée.
|
||||
|
||||
### `pre.009` — Preuve PostgreSQL live account
|
||||
|
||||
**Statut : planifié.**
|
||||
**Statut : réalisé ; gate opérateur standard à rejouer, live opt-in à exécuter sur URI dédiée.**
|
||||
|
||||
Budget cible : **15-20 min**. Ajouter la preuve PostgreSQL réelle, ignored/opt-in, couvrant `RawAccountState` et sa coexistence avec la verticale `RawTransaction` existante.
|
||||
Budget cible : **15-20 min**. La preuve réelle est matérialisée dans `tests/postgres_raw_account_live.rs`, ignored/opt-in et alimentée exclusivement par une URI dédiée lue depuis stdin sans écho. Elle refuse tout schéma KSP déjà présent, exige PostgreSQL >= 15, ouvre/ferme/re-ouvre le backend V002, vérifie la réparation de l'index account selon `schema_autoupdate`, puis nettoie uniquement le schéma qu'elle a prouvé absent avant démarrage.
|
||||
|
||||
La matrice live couvre : domaine `u64::MAX`, data vide et borne exacte 16 MiB, acquisition atomique, idempotence exacte, conflit de contenu sous même référence, deux `state_hash` distincts au même `(pubkey, slot)`, collision de clé observation avec rollback du state nouvellement inséré, observation supplémentaire et `ReferenceNotFound`, round-trip des metadata Yellowstone, pagination ASC/DESC filtrée/non filtrée, cursor `KSPA` hostile/cross-query et rejet cross-family `KSPT`, concurrence identique/divergente, cancellation réelle via `JoinHandle::abort()` pendant un conflit d'observation verrouillé, puis reopen.
|
||||
|
||||
La coexistence cross-family est prouvée dans le même schéma : une acquisition account et une acquisition `RawTransaction` peuvent utiliser la même `RawObservationKey` dans leurs tables familiales distinctes, restent lisibles indépendamment et survivent au reopen. Le live `RawTransaction` existant est également réconcilié pour considérer les deux tables V002 account dans son probe et son cleanup d'isolation ; aucune logique métier RawTransaction n'est modifiée.
|
||||
|
||||
### `pre.010` — Hardening et complétude cross-family
|
||||
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
<!-- file: docs/validation/021-V0_3_4_STORE_POSTGRES_RAW_ACCOUNT.md -->
|
||||
<!-- version: 13 -->
|
||||
<!-- version: 14 -->
|
||||
|
||||
# Validation `0.3.4` — Store/PostgreSQL `RawAccountState` + complétude RAW
|
||||
|
||||
## 1. Portée
|
||||
|
||||
Cette matrice est ouverte par `0.3.4-pre.001`. `0.3.4-pre.002` matérialise la fondation V002 minimale et `pre.002-fix.001` corrige deux canaris sans modifier le SQL ; son gate opérateur complet est PASS. `0.3.4-pre.003` complète les contraintes de domaine, l'index de navigation, la compatibilité externe et le checksum V002 final ; `pre.003-fix.001` corrige uniquement l'ordre alphabétique du bloc `const` et son gate opérateur complet est PASS. `pre.004` à `pre.007` matérialisent successivement mapping/read, writes, observation supplémentaire et pagination account ; `pre.007-fix.001` clôt son gate opérateur en PASS. `pre.008` ouvre les quatre capabilities account dans `PostgresBackend` et `Store`, portant l'inventaire RAW statique à 10/10 ; son gate initial échoue uniquement sur un canari `dependency_boundary` mal réconcilié et `pre.008-fix.001` corrige ce déplacement de variable sans toucher à la verticale. La preuve PostgreSQL live reste réservée à `pre.009`.
|
||||
Cette matrice est ouverte par `0.3.4-pre.001`. `0.3.4-pre.002` matérialise la fondation V002 minimale et `pre.002-fix.001` corrige deux canaris sans modifier le SQL ; son gate opérateur complet est PASS. `0.3.4-pre.003` complète les contraintes de domaine, l'index de navigation, la compatibilité externe et le checksum V002 final ; `pre.003-fix.001` corrige uniquement l'ordre alphabétique du bloc `const` et son gate opérateur complet est PASS. `pre.004` à `pre.007` matérialisent successivement mapping/read, writes, observation supplémentaire et pagination account ; `pre.007-fix.001` clôt son gate opérateur en PASS. `pre.008` ouvre les quatre capabilities account dans `PostgresBackend` et `Store`, portant l'inventaire RAW statique à 10/10 ; `pre.008-fix.001` corrige son unique canari mal réconcilié et son gate opérateur complet est PASS. `pre.009` matérialise la preuve PostgreSQL live account, la concurrence/cancellation réelle et la coexistence RawTransaction sans modifier les migrations.
|
||||
|
||||
Base :
|
||||
|
||||
@@ -278,8 +278,8 @@ Le test live account devra être opt-in/ignored, URI stdin, sans environnement n
|
||||
| pre.005 | acquisition atomique state+observation + idempotence/conflict | PASS |
|
||||
| pre.006 | observation supplémentaire + races/cancellation unitaires | PASS |
|
||||
| pre.007 | list RawAccountStateQuery + keyset cursor V1 account | PASS |
|
||||
| pre.008 | 4 impl backend + 4 dispatch Store + conformance 10/10 | CURRENT |
|
||||
| pre.009 | preuve PostgreSQL live account + coexistence RawTransaction | PLANNED |
|
||||
| pre.008 | 4 impl backend + 4 dispatch Store + conformance 10/10 | PASS |
|
||||
| pre.009 | preuve PostgreSQL live account + coexistence RawTransaction | CURRENT |
|
||||
| pre.010 | hardening/completeness cross-family + canaries ownership | PLANNED |
|
||||
| pre.011 | gate technique final + replay live ciblé + graphes | PLANNED |
|
||||
| pre.012 | réconciliation docs finale sans rouvrir le code | PLANNED |
|
||||
@@ -599,4 +599,63 @@ let runtime = include_str!("../src/runtime.rs");
|
||||
|
||||
vers le canari qui le consomme effectivement. Les assertions de placement 10/10 restent inchangées : les implémentations account demeurent uniques dans `runtime.rs`, absentes de `raw_account.rs`, et les couches migration/schema restent sans capability métier. Aucun fichier de production, SQL runtime ou migration V000/V001/V002 n'est modifié.
|
||||
|
||||
Le checksum V002 reste `ff21605ed45f7ab4c0f92bbb692700b4118a9488b04d50a31d259ac59bdb550e`. Le gate opérateur complet doit être rejoué sur `0.3.4-pre.8.fix.1`.
|
||||
Le checksum V002 reste `ff21605ed45f7ab4c0f92bbb692700b4118a9488b04d50a31d259ac59bdb550e`. Le gate opérateur complet du 2026-08-30 sur `0.3.4-pre.8.fix.1` est **PASS** : audits Rust/Markdown, workspace check, Clippy all-targets, Store API, Store façade, backend PostgreSQL (63 tests unitaires + 13 dependency + 7 hardening + 13 public), Config et `--no-default-features` sont verts.
|
||||
|
||||
## 28. Verdict `pre.009`
|
||||
|
||||
Preuve PostgreSQL live `RawAccountState` : **matérialisée ; gate opérateur standard et exécution live opt-in à rejouer**.
|
||||
|
||||
Nouveau test :
|
||||
|
||||
```text
|
||||
crates/ksp-store-postgres-lib/tests/postgres_raw_account_live.rs
|
||||
#[ignore = "opt-in real PostgreSQL RawAccountState proof; reads one dedicated URI from stdin"]
|
||||
```
|
||||
|
||||
Invariants d'exploitation :
|
||||
|
||||
```text
|
||||
URI dédiée lue depuis stdin uniquement
|
||||
aucune lecture d'environnement
|
||||
aucun affichage de l'URI
|
||||
refus si une table KSP managée existe déjà
|
||||
PostgreSQL >= 15
|
||||
cleanup uniquement après preuve d'absence initiale
|
||||
reopen health migration_version = 2
|
||||
```
|
||||
|
||||
Matrice matérialisée :
|
||||
|
||||
| Scénario | Preuve `pre.009` |
|
||||
|--------------------------------------------|--------------------------------------|
|
||||
| bootstrap/reopen V002 | oui |
|
||||
| schema_autoupdate index account | oui |
|
||||
| slot/lamports/rent_epoch/write_version u64 | oui, `u64::MAX` |
|
||||
| data account vide | oui |
|
||||
| data account 16 MiB exact | oui |
|
||||
| acquisition insert/idempotence | oui |
|
||||
| même référence / contenu divergent | `Conflict` |
|
||||
| même pubkey+slot / hashes distincts | oui |
|
||||
| collision observation + rollback state | oui |
|
||||
| observation supplémentaire identique | `AlreadyPresent` |
|
||||
| observation supplémentaire divergente | `Conflict` |
|
||||
| référence state absente | `ReferenceNotFound` |
|
||||
| metadata Yellowstone | round-trip exact |
|
||||
| pagination ASC/DESC | oui |
|
||||
| filtre pubkey | oui |
|
||||
| cursor cross-query / digest hostile | `QueryInvalid` |
|
||||
| cursor cross-family `KSPT` | `QueryInvalid` |
|
||||
| concurrence identique | Inserted + AlreadyPresent |
|
||||
| concurrence divergente | Inserted + Conflict |
|
||||
| cancellation réelle | `JoinHandle::abort()` + state absent |
|
||||
| coexistence RawTransaction | oui |
|
||||
| cleanup isolation | oui |
|
||||
|
||||
Le test `postgres_raw_transaction_live.rs` est ajusté uniquement sur son inventaire de schéma managé : il probe et supprime désormais aussi `ksp_raw_account_states` et `ksp_raw_account_observations`, nécessaires depuis V002. Aucun scénario métier RawTransaction n'est modifié.
|
||||
|
||||
Les migrations V000/V001/V002 restent byte-inchangées ; le checksum V002 reste :
|
||||
|
||||
```text
|
||||
ff21605ed45f7ab4c0f92bbb692700b4118a9488b04d50a31d259ac59bdb550e
|
||||
```
|
||||
|
||||
|
||||
Reference in New Issue
Block a user