From dfa3723a7f6383c1062bda9599e3602c6a40d1bc Mon Sep 17 00:00:00 2001 From: SinuS Von SifriduS Date: Sun, 30 Aug 2026 21:17:38 +0200 Subject: [PATCH] v0.3.4-pre.002-fix.001 --- Cargo.toml | 4 +- .../unit_tests/migration.rs | 11 +- .../unit_tests/schema.rs | 7 +- deltas/0.3.4/pre.002-fix.001.md | 168 ++++++++++++++++++ ...-V0_3_4_STORE_POSTGRES_RAW_ACCOUNT_PLAN.md | 12 +- .../021-V0_3_4_STORE_POSTGRES_RAW_ACCOUNT.md | 32 +++- 6 files changed, 220 insertions(+), 14 deletions(-) create mode 100644 deltas/0.3.4/pre.002-fix.001.md diff --git a/Cargo.toml b/Cargo.toml index b8ef3c4..b695562 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,12 +1,12 @@ # file: Cargo.toml -# version: 365 +# version: 366 [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.2" +version = "0.3.4-pre.2.fix.1" edition = "2024" license = "MIT" repository = "https://git.sasedev.com/Sasedev/khadhroony-solana-project" diff --git a/crates/ksp-store-postgres-lib/unit_tests/migration.rs b/crates/ksp-store-postgres-lib/unit_tests/migration.rs index 950c8d0..3a49be7 100644 --- a/crates/ksp-store-postgres-lib/unit_tests/migration.rs +++ b/crates/ksp-store-postgres-lib/unit_tests/migration.rs @@ -1,5 +1,5 @@ // file: crates/ksp-store-postgres-lib/unit_tests/migration.rs -// version: 6 +// version: 7 fn applied(version: i64, name: &str, checksum: &str) -> super::AppliedMigration { return super::AppliedMigration { checksum: checksum.to_owned(), name: name.to_owned(), version }; @@ -147,9 +147,16 @@ fn pre_003_fix_001_divergent_missing_or_gapped_history_is_terminal_mismatch() { fn pre_003_fix_001_newer_history_is_rejected_without_down_migration() { let v000 = super::EMBEDDED_MIGRATIONS[0]; let v001 = super::EMBEDDED_MIGRATIONS[1]; + let v002 = super::EMBEDDED_MIGRATIONS[2]; let v000_checksum = super::migration_checksum(&v000); let v001_checksum = super::migration_checksum(&v001); - let history = [applied(0, v000.name, v000_checksum.as_str()), applied(1, v001.name, v001_checksum.as_str()), applied(2, "future", "future-checksum")]; + let v002_checksum = super::migration_checksum(&v002); + let history = [ + applied(0, v000.name, v000_checksum.as_str()), + applied(1, v001.name, v001_checksum.as_str()), + applied(2, v002.name, v002_checksum.as_str()), + applied(3, "future", "future-checksum"), + ]; let result = super::validate_history(&history, super::EMBEDDED_MIGRATIONS); assert_eq!(result.err().map(|value| return value.kind()), std::option::Option::Some(crate::PostgresBackendErrorKind::SchemaNewer)); return; diff --git a/crates/ksp-store-postgres-lib/unit_tests/schema.rs b/crates/ksp-store-postgres-lib/unit_tests/schema.rs index 4a9e772..afc60d0 100644 --- a/crates/ksp-store-postgres-lib/unit_tests/schema.rs +++ b/crates/ksp-store-postgres-lib/unit_tests/schema.rs @@ -1,5 +1,5 @@ // file: crates/ksp-store-postgres-lib/unit_tests/schema.rs -// version: 5 +// version: 6 fn actual_column(name: &str, udt_name: &str, nullable: bool) -> super::ActualColumn { return super::ActualColumn { @@ -62,6 +62,7 @@ fn pre_002_v002_resources_are_exactly_two_tables_plus_base_pk_fk_without_indexes ] ); let sql = crate::V002_RESOURCES.iter().map(|resource| return resource.sql).collect::>().concat(); + let normalized_sql = sql.split_ascii_whitespace().collect::>().join(" "); for required in [ "CREATE TABLE IF NOT EXISTS ksp_raw_account_states", "CREATE TABLE IF NOT EXISTS ksp_raw_account_observations", @@ -71,10 +72,10 @@ fn pre_002_v002_resources_are_exactly_two_tables_plus_base_pk_fk_without_indexes "PRIMARY KEY (observation_key)", "FOREIGN KEY (account_pubkey, account_slot, account_state_hash) REFERENCES ksp_raw_account_states(pubkey, slot, state_hash) ON DELETE RESTRICT", ] { - assert!(sql.contains(required), "V002 pre.002 physical foundation is missing: {required}"); + assert!(normalized_sql.contains(required), "V002 pre.002 physical foundation is missing: {required}"); } for forbidden in ["CREATE INDEX", " CHECK ", "ON DELETE CASCADE", "BIGSERIAL", "slot BIGINT", "data TEXT"] { - assert!(!sql.contains(forbidden), "pre.002 advanced V002 beyond the minimal table/PK/FK scope: {forbidden}"); + assert!(!normalized_sql.contains(forbidden), "pre.002 advanced V002 beyond the minimal table/PK/FK scope: {forbidden}"); } return; } diff --git a/deltas/0.3.4/pre.002-fix.001.md b/deltas/0.3.4/pre.002-fix.001.md new file mode 100644 index 0000000..c68b4ec --- /dev/null +++ b/deltas/0.3.4/pre.002-fix.001.md @@ -0,0 +1,168 @@ + + + +# Delta `0.3.4-pre.002-fix.001` — correction des canaris V002 + +## 1. Base + +Base opérateur obligatoire : + +```text +0.3.4-pre.002 +workspace.package.version = 0.3.4-pre.2 +``` + +Le gate opérateur du 2026-08-30 est propre sur les audits Rust/Markdown, `cargo check --workspace`, Clippy all-targets, Store API, Store façade, Config et `ksp-store-lib --no-default-features`. Il échoue uniquement dans : + +```text +cargo test -p ksp-store-postgres-lib +``` + +avec 41 tests unitaires backend passants et deux canaris en échec. + +## 2. Version + +Ce correctif modifie deux sources Rust de tests. Conformément à `VER-ID-007` et `VER-ID-010` : + +```text +workspace.package.version = 0.3.4-pre.2.fix.1 +``` + +Aucune version de migration n'est ajoutée ou changée. + +## 3. Défaut 1 — canari `SchemaNewer` devenu obsolète + +Le test historique : + +```text +pre_003_fix_001_newer_history_is_rejected_without_down_migration +``` + +construisait V000, V001 puis une migration inconnue de version `2`. Ce scénario était valide quand V001 était la dernière migration embedded. Depuis `pre.002`, V002 occupe légitimement la version `2`; le même historique représente donc une divergence V002 et doit être classé `MigrationMismatch`, ce qui explique l'échec observé : + +```text +left: Some(MigrationMismatch) +right: Some(SchemaNewer) +``` + +Le canari est recalibré sans modifier `validate_history` : il construit le préfixe valide V000/V001/V002 avec leurs checksums réels, puis ajoute une migration inconnue de version `3`. Le scénario teste à nouveau exactement un historique plus récent que le registry KSP et conserve l'attente `SchemaNewer`. + +## 4. Défaut 2 — assertion FK sensible au formatage SQL + +Le canari : + +```text +pre_002_v002_resources_are_exactly_two_tables_plus_base_pk_fk_without_indexes_or_domain_checks +``` + +cherchait la FK complète sous forme d'une chaîne contenant un espace entre la clause `FOREIGN KEY (...)` et `REFERENCES`. La ressource SQL V002 contient un retour à la ligne à cet endroit, sans différence sémantique PostgreSQL. + +La ressource SQL n'est **pas** réécrite. Le test normalise uniquement les espaces ASCII du SQL embedded avant de vérifier ses fragments obligatoires/interdits. Il continue d'exiger : + +- exactement 5 resources V002 ; +- les 2 tables ; +- les 2 PK ; +- la FK composite avec `ON DELETE RESTRICT` ; +- `NUMERIC(20,0)` pour les champs concernés ; +- absence d'index, de `CHECK` de `pre.003`, de cascade, de `BIGSERIAL`, de `slot BIGINT` et de `data TEXT`. + +## 5. Invariants préservés + +Aucune ressource SQL n'est modifiée : + +```text +crates/ksp-store-postgres-lib/migrations/v002_raw_account_state/** +``` + +Le checksum V002 intermédiaire reste donc : + +```text +30ac87496f1bb3805d816660891d7eab2127c599a636eb40c17ade5926311f55 +``` + +Restent également inchangés : + +```text +V000 / V001 +registry V002 et ses 5 resources +src/migration.rs +src/schema.rs +ksp-store-api +ksp-store-lib +Config +aucune capability RawAccount* backend/façade +aucun repository raw_account +aucun index/check de pre.003 +``` + +## 6. Fichiers modifiés + +```text +Cargo.toml +crates/ksp-store-postgres-lib/unit_tests/migration.rs +crates/ksp-store-postgres-lib/unit_tests/schema.rs +docs/plans/025-V0_3_4_STORE_POSTGRES_RAW_ACCOUNT_PLAN.md +docs/validation/021-V0_3_4_STORE_POSTGRES_RAW_ACCOUNT.md +``` + +Fichier ajouté : + +```text +deltas/0.3.4/pre.002-fix.001.md +``` + +Aucun fichier supprimé. + +## 7. Validations déjà fournies par le gate opérateur `pre.002` + +PASS avant le correctif : + +```text +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-config-lib +cargo check -p ksp-store-lib --no-default-features +``` + +Backend avant correctif : + +```text +cargo test -p ksp-store-postgres-lib +41 passed; 2 failed +``` + +## 8. Gate opérateur du correctif + +À rejouer après extraction : + +```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 +``` + +Les commandes Cargo post-correctif ne sont pas exécutables dans l'environnement d'assemblage courant faute d'exécutable `cargo`. + +## 9. Décisions + +- corriger les canaris, pas la production ni V002 ; +- préserver strictement le checksum de migration ; +- conserver `SchemaNewer` pour un historique réellement au-delà de la dernière migration embedded ; +- rendre l'assertion FK insensible uniquement au whitespace SQL, sans affaiblir le contrat de contenu ; +- ne pas avancer `pre.003`. + +## 10. Questions ouvertes + +Aucune pour ce correctif. Le passage à `pre.003` dépend du gate opérateur vert de `pre.002-fix.001`. diff --git a/docs/plans/025-V0_3_4_STORE_POSTGRES_RAW_ACCOUNT_PLAN.md b/docs/plans/025-V0_3_4_STORE_POSTGRES_RAW_ACCOUNT_PLAN.md index ffa66f7..6c8b162 100644 --- a/docs/plans/025-V0_3_4_STORE_POSTGRES_RAW_ACCOUNT_PLAN.md +++ b/docs/plans/025-V0_3_4_STORE_POSTGRES_RAW_ACCOUNT_PLAN.md @@ -1,5 +1,5 @@ - + # Plan `0.3.4` — Store/PostgreSQL `RawAccountState` + complétude RAW @@ -569,12 +569,20 @@ Remplacement du sizing tabulaire par des sous-sections éditables avec statut ex ### `pre.002` — Registry V002 et tables minimales -**Statut : réalisé ; gate Cargo opérateur post-delta à rejouer.** +**Statut : réalisé ; corrigé par `pre.002-fix.001`, gate opérateur du correctif à rejouer.** Budget cible : **15-20 min**. V002 `raw_account_state` est enregistrée avec exactement cinq resources : deux tables, les PK `(pubkey, slot, state_hash)` / `(observation_key)` et la FK composite observation -> state. Aucun repository account ni dispatch façade n'est ajouté. Le checksum resources calculable sur cet état intermédiaire est `30ac87496f1bb3805d816660891d7eab2127c599a636eb40c17ade5926311f55`. Il est **provisoire de prerelease** : `pre.003` ajoute encore les contraintes de domaine et l'index prévus, puis fige le checksum V002 final avant toute preuve live account. V000/V001 restent strictement inchangées. +#### `pre.002-fix.001` — correction des canaris V002 + +**Statut : livré ; gate opérateur à rejouer.** + +Le gate opérateur de `pre.002` compile le workspace et passe Clippy, Store API, Store façade, Config et `--no-default-features`, mais révèle deux canaris backend obsolètes. Le premier construisait encore un historique « futur » en version 2 alors que V002 occupe désormais cette version ; il est recalibré avec V002 valide suivie d'une version 3 inconnue. Le second comparait la FK V002 à une chaîne SQL sensible aux retours à la ligne ; il normalise désormais uniquement les espaces avant de vérifier le contrat physique. + +Aucune ressource SQL, migration, table, contrainte, index, surface runtime ou capability n'est modifiée. Le checksum V002 intermédiaire reste donc exactement `30ac87496f1bb3805d816660891d7eab2127c599a636eb40c17ade5926311f55`. + ### `pre.003` — Contraintes, index et schema compatibility V002 **Statut : planifié.** diff --git a/docs/validation/021-V0_3_4_STORE_POSTGRES_RAW_ACCOUNT.md b/docs/validation/021-V0_3_4_STORE_POSTGRES_RAW_ACCOUNT.md index 1723fe0..bedc9db 100644 --- a/docs/validation/021-V0_3_4_STORE_POSTGRES_RAW_ACCOUNT.md +++ b/docs/validation/021-V0_3_4_STORE_POSTGRES_RAW_ACCOUNT.md @@ -1,11 +1,11 @@ - + # Validation `0.3.4` — Store/PostgreSQL `RawAccountState` + complétude RAW ## 1. Portée -Cette matrice est ouverte par `0.3.4-pre.001`. La tranche courante `0.3.4-pre.002` matérialise uniquement la fondation V002 : registry, deux tables et PK/FK de base. Les contraintes de domaine, l'index, la compatibilité externe complète, les repositories et les quatre capabilities account restent volontairement pending. +Cette matrice est ouverte par `0.3.4-pre.001`. `0.3.4-pre.002` matérialise uniquement la fondation V002 : registry, deux tables et PK/FK de base. Son gate opérateur révèle deux canaris unitaires obsolètes sans défaut de migration ; `0.3.4-pre.002-fix.001` les corrige sans modifier les resources SQL. Les contraintes de domaine, l'index, la compatibilité externe complète, les repositories et les quatre capabilities account restent volontairement pending. Base : @@ -272,7 +272,7 @@ Le test live account devra être opt-in/ignored, URI stdin, sans environnement n | Tranche | Objet | État | |---------|-------------------------------------------------------------------|---------| | pre.001 | audit, kbot3, threat model, V002 design, sizing, plan/validation | DONE | -| pre.002 | V002 registry + deux tables + PK/FK de base, sans repository | CURRENT | +| pre.002 | V002 registry + deux tables + PK/FK de base, sans repository | FIX.001 | | pre.003 | contraintes complètes, index, schema compatibility, checksum V002 | PLANNED | | pre.004 | mapping privé state/observation + get reads + hostile rows | PLANNED | | pre.005 | acquisition atomique state+observation + idempotence/conflict | PLANNED | @@ -324,8 +324,30 @@ Les preuves live restent séparées et explicitement `--ignored --nocapture`. ## 17. Verdict `pre.002` -Fondation V002 minimale : **PASS statique**. Le registry logique V002 expose exactement cinq resources et aucune surface repository/runtime account. Les audits Rust/Markdown applicables sont rejoués dans l'environnement d'assemblage. +Fondation V002 minimale : **PASS statique**. Le registry logique V002 expose exactement cinq resources et aucune surface repository/runtime account. -Compilation/Clippy/tests Cargo post-delta : **NON EXÉCUTÉS dans le conteneur d'assemblage**, faute d'exécutable `cargo`; ils restent à rejouer par l'opérateur. +Gate opérateur du 2026-08-30 : audits Rust/Markdown, `cargo check --workspace`, Clippy all-targets, `ksp-store-api`, `ksp-store-lib`, `ksp-config-lib` et `ksp-store-lib --no-default-features` passent. `cargo test -p ksp-store-postgres-lib` exécute 43 tests unitaires et échoue uniquement sur deux canaris obsolètes : + +- `pre_003_fix_001_newer_history_is_rejected_without_down_migration` attendait `SchemaNewer` avec une fausse version future `2`, désormais occupée par V002 ; +- `pre_002_v002_resources_are_exactly_two_tables_plus_base_pk_fk_without_indexes_or_domain_checks` comparait la FK à une chaîne sensible au saut de ligne avant `REFERENCES`. + +Ces deux défauts appartiennent strictement au couloir `pre.002` et sont corrigés par `pre.002-fix.001`. Ils ne remettent en cause ni les cinq resources V002 ni leur checksum. Contraintes complètes/index/schema compatibility/checksum final : **PENDING `pre.003`**. Repository et capabilities account : **PENDING `pre.004+`**. + +## 18. Correctif `pre.002-fix.001` + +Le correctif applique deux recalibrages de tests seulement : + +1. le canari d'historique construit désormais le préfixe valide V000/V001/V002 puis ajoute une version `3` inconnue, ce qui teste réellement le cas « schéma plus récent » ; +2. le canari de fondation V002 normalise les espaces ASCII du SQL embedded avant ses assertions sémantiques, sans relâcher l'inventaire exact des cinq resources ni les interdictions `CREATE INDEX`, `CHECK`, cascade, `BIGSERIAL`, `BIGINT` ou `TEXT` pour les données account. + +Invariants du correctif : + +- aucune ressource sous `migrations/v002_raw_account_state/` modifiée ; +- checksum V002 intermédiaire inchangé : `30ac87496f1bb3805d816660891d7eab2127c599a636eb40c17ade5926311f55` ; +- V000/V001 inchangées ; +- aucun module repository account, dispatch Store ou implémentation `RawAccount*` ouvert ; +- `workspace.package.version = 0.3.4-pre.2.fix.1` conformément à `VER-ID-007/010`, car des sources Rust de tests sont modifiées. + +Gate opérateur du correctif : **À REJOUER**.