diff --git a/Cargo.toml b/Cargo.toml index 8f75778..3cea82c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -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"] [workspace.package] -version = "0.3.3-pre.3.fix.2" +version = "0.3.3-pre.3.fix.3" edition = "2024" license = "MIT" repository = "https://git.sasedev.com/Sasedev/khadhroony-solana-project" diff --git a/crates/ksp-store-postgres-lib/README.md b/crates/ksp-store-postgres-lib/README.md index afbfb4e..8fb9739 100644 --- a/crates/ksp-store-postgres-lib/README.md +++ b/crates/ksp-store-postgres-lib/README.md @@ -1,5 +1,5 @@ - + # ksp-store-postgres-lib @@ -17,7 +17,7 @@ La crate possède seule pour PostgreSQL : - les roots système et le provider cryptographique AWS-LC ; - le bootstrap/moteur de migrations privé KSP ; - la table metadata `ksp_store_schema_migrations` ; -- le sentinel `V000__bootstrap.sql` et son checksum SHA-256 ; +- la migration logique V000 relocalisée sous `migrations/v000_bootstrap/` et son checksum SHA-256 historique ; - l'advisory transaction lock borné des migrations ; - les snapshots runtime/health sûrs destinés au bridge de façade ; - la fermeture explicite du pool et son fallback `Drop` best-effort ; @@ -69,13 +69,13 @@ Les configurations ne permettant pas de vérifier une identité serveur, comme ` ## Migrations -La fondation embarque uniquement : +La fondation historique V000 est embarquée sous : ```text -migrations/V000__bootstrap.sql +migrations/v000_bootstrap/tables/001_ksp_store_schema_migrations.sql ``` -Elle crée la metadata privée : +La vertical slice V001 est ensuite répartie sous `migrations/v001_raw_transaction/{tables,constraints,indexes}/` tout en restant une migration logique unique. V000 crée la metadata privée : ```text ksp_store_schema_migrations diff --git a/crates/ksp-store-postgres-lib/USAGE.md b/crates/ksp-store-postgres-lib/USAGE.md index e1dfbd6..85b64fd 100644 --- a/crates/ksp-store-postgres-lib/USAGE.md +++ b/crates/ksp-store-postgres-lib/USAGE.md @@ -1,5 +1,5 @@ - + # Utilisation de ksp-store-postgres-lib @@ -98,13 +98,13 @@ La valeur typée choisie par KSP prime sur les paramètres SSL de l'URI. ## 5. Bootstrap et migrations -Le backend embarque son propre moteur de migrations. Le seul artefact initial est : +Le backend embarque son propre moteur de migrations. La migration historique V000 est désormais matérialisée par : ```text -migrations/V000__bootstrap.sql +migrations/v000_bootstrap/tables/001_ksp_store_schema_migrations.sql ``` -Le bootstrap maintient : +Les migrations suivantes conservent une version logique unique tout en séparant leurs ressources physiques par famille sous `migrations/vNNN_name/{tables,constraints,indexes}/`. Le bootstrap maintient : ```text ksp_store_schema_migrations diff --git a/crates/ksp-store-postgres-lib/src/schema.rs b/crates/ksp-store-postgres-lib/src/schema.rs index 1d0e568..3ca0616 100644 --- a/crates/ksp-store-postgres-lib/src/schema.rs +++ b/crates/ksp-store-postgres-lib/src/schema.rs @@ -1,5 +1,5 @@ // file: crates/ksp-store-postgres-lib/src/schema.rs -// version: 3 +// version: 4 /// Immutable V000 physical schema resource inventory. pub(crate) const V000_RESOURCES: &[SchemaResource] = &[SchemaResource { @@ -798,7 +798,7 @@ pub(crate) async fn verify_v001_external_compatibility( for row in unique_rows { let name = row.try_get::(0); let constraint_backed = row.try_get::(1); - let (name, constraint_backed) = match (name, constraint_backed) { + let (_name, constraint_backed) = match (name, constraint_backed) { (std::result::Result::Ok(name), std::result::Result::Ok(constraint_backed)) => (name, constraint_backed), _ => return schema_query_error("schema_unique_index_inventory_decode"), }; @@ -1082,10 +1082,26 @@ async fn inspect_equivalent_constraint( fn expected_constraint_definition(resource_sql: &str, name: &str) -> std::option::Option { let marker = std::format!("ADD CONSTRAINT {name} "); - let start = resource_sql.find(marker.as_str())?.checked_add(marker.len())?; - let tail = resource_sql.get(start..)?; - let end = tail.find(';')?; - let definition = tail.get(..end)?; + let marker_start = match resource_sql.find(marker.as_str()) { + std::option::Option::Some(value) => value, + std::option::Option::None => return std::option::Option::None, + }; + let start = match marker_start.checked_add(marker.len()) { + std::option::Option::Some(value) => value, + std::option::Option::None => return std::option::Option::None, + }; + let tail = match resource_sql.get(start..) { + std::option::Option::Some(value) => value, + std::option::Option::None => return std::option::Option::None, + }; + let end = match tail.find(';') { + std::option::Option::Some(value) => value, + std::option::Option::None => return std::option::Option::None, + }; + let definition = match tail.get(..end) { + std::option::Option::Some(value) => value, + std::option::Option::None => return std::option::Option::None, + }; return std::option::Option::Some(normalize_catalog_sql(definition)); } diff --git a/crates/ksp-store-postgres-lib/tests/postgres_foundation_live.rs b/crates/ksp-store-postgres-lib/tests/postgres_foundation_live.rs index 4d5ae1f..9b08c06 100644 --- a/crates/ksp-store-postgres-lib/tests/postgres_foundation_live.rs +++ b/crates/ksp-store-postgres-lib/tests/postgres_foundation_live.rs @@ -1,5 +1,5 @@ // file: crates/ksp-store-postgres-lib/tests/postgres_foundation_live.rs -// version: 2 +// version: 3 #![warn(missing_docs)] #![deny(unreachable_pub)] @@ -12,7 +12,7 @@ //! the URI, and cleans up only the isolated schema it proved absent first. It //! validates migration/bootstrap behavior, not RawTransaction capabilities. -const LIVE_BOOTSTRAP_SQL: &str = include_str!("../migrations/V000__bootstrap.sql"); +const LIVE_BOOTSTRAP_SQL: &str = include_str!("../migrations/v000_bootstrap/tables/001_ksp_store_schema_migrations.sql"); const LIVE_BROKEN_CHECKSUM_A: &str = "0000000000000000000000000000000000000000000000000000000000000000"; const LIVE_BROKEN_CHECKSUM_B: &str = "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; const LIVE_MANAGED_SCHEMA_DROP_SQL: &str = r#"DROP TABLE IF EXISTS ksp_raw_transaction_observations; diff --git a/crates/ksp-store-postgres-lib/unit_tests/schema.rs b/crates/ksp-store-postgres-lib/unit_tests/schema.rs index 6eed2ce..093d4ba 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: 1 +// version: 2 fn actual_column(name: &str, udt_name: &str, nullable: bool) -> super::ActualColumn { return super::ActualColumn { @@ -100,12 +100,10 @@ fn pre_003_fix_001_catalog_normalization_and_resource_owned_constraint_definitio let normalized = super::normalize_catalog_sql("CHECK ((slot >= (0)::numeric) AND (slot <= (18446744073709551615)::numeric))"); assert_eq!(normalized, "checkslot>=0andslot<=18446744073709551615"); let resource = crate::V001_RESOURCES.iter().find(|resource| return resource.id == "constraints/006_ck_ksp_raw_transactions_slot.sql"); + assert!(resource.is_some(), "V001 slot constraint resource must remain embedded"); let resource = match resource { std::option::Option::Some(value) => value, - std::option::Option::None => { - assert!(false, "V001 slot constraint resource must remain embedded"); - return; - }, + std::option::Option::None => return, }; let expected = super::expected_constraint_definition(resource.sql, "ck_ksp_raw_transactions_slot"); assert_eq!(expected.as_deref(), std::option::Option::Some(normalized.as_str())); diff --git a/deltas/0.3.3/pre.003-fix.003.md b/deltas/0.3.3/pre.003-fix.003.md new file mode 100644 index 0000000..75dd780 --- /dev/null +++ b/deltas/0.3.3/pre.003-fix.003.md @@ -0,0 +1,107 @@ + + + +# Delta `0.3.3-pre.003-fix.003` — clôture Clippy et relocalisation du canari live V000 + +## 1. Base et objectif + +Ce correctif s’applique **par-dessus `0.3.3-pre.003-fix.002`**. Son gate opérateur confirme que les audits Rust/Markdown, `cargo check` jusqu’au backend et les tests Config/ownership sont désormais propres, mais révèle trois défauts résiduels strictement locaux : + +1. une variable `name` décodée mais non utilisée dans l’inventaire des indexes uniques ; +2. cinq usages de l’opérateur `?` dans `expected_constraint_definition`, interdits par la policy workspace `clippy::question_mark_used = deny` ; +3. le test opt-in `postgres_foundation_live.rs` référence encore l’ancien fichier monolithique V000 supprimé par `fix.001`. + +Un warning Clippy de test (`assert!(false, ...)`) est également supprimé afin de garder le gate sans bruit. + +Version workspace après application : + +```text +0.3.3-pre.3.fix.3 +``` + +Identifiant de livraison : + +```text +0.3.3-pre.003-fix.003 +``` + +## 2. Correctifs + +### 2.1 Introspection catalogue + +Le nom d’index décodé mais inutilisé est explicitement marqué `_name`. Le comportement reste inchangé : tout index unique externe non adossé à une contrainte reste incompatible. + +### 2.2 Policy Clippy `question_mark_used` + +`expected_constraint_definition` conserve exactement sa sémantique `Option`, mais remplace les cinq propagations `?` par des `match` explicites retournant `None` lorsque la ressource SQL ne peut pas être découpée selon le contrat attendu. + +### 2.3 Canari unitaire + +L’assertion constante `assert!(false, ...)` est remplacée par une assertion sur `resource.is_some()`, puis un `match` non paniquant pour satisfaire simultanément le canari et la policy KSP. + +### 2.4 Test PostgreSQL live V000 + +Le `include_str!` du test opt-in suit maintenant le déplacement effectué dans `fix.001` : + +```text +crates/ksp-store-postgres-lib/migrations/v000_bootstrap/tables/001_ksp_store_schema_migrations.sql +``` + +Aucun comportement live supplémentaire n’est ajouté. + +### 2.5 Documentation backend + +Le README et l’USAGE du backend sont réconciliés avec l’arborescence versionnée introduite par `fix.001`; ils ne présentent plus les anciens fichiers monolithiques supprimés comme artefacts actifs. + +## 3. Invariants inchangés + +Aucune ressource SQL n’est modifiée. Les checksums restent : + +```text +V000 d29068b8c13b9dc0cc9ef6aaadd0fa12d41e0fe4c56541a1118c4bfc846a1450 +V001 31488cda2f08f3f46c4cdbdbb6c18c243662fada02eac4487040c8735d72cc51 +``` + +Le contrat `schema_autocreate` / `schema_autoupdate`, l’introspection physique, le binding réseau et les 40 ressources V001 ne changent pas. + +## 4. Fichiers modifiés + +- `Cargo.toml` +- `crates/ksp-store-postgres-lib/README.md` +- `crates/ksp-store-postgres-lib/USAGE.md` +- `crates/ksp-store-postgres-lib/src/schema.rs` +- `crates/ksp-store-postgres-lib/tests/postgres_foundation_live.rs` +- `crates/ksp-store-postgres-lib/unit_tests/schema.rs` +- `docs/validation/020-V0_3_3_STORE_POSTGRES_RAW_TRANSACTION.md` + +## 5. Fichier ajouté + +- `deltas/0.3.3/pre.003-fix.003.md` + +## 6. Suppressions + +Aucune suppression supplémentaire. Les suppressions de `fix.001` restent acquises : + +```text +crates/ksp-store-postgres-lib/migrations/V000__bootstrap.sql +crates/ksp-store-postgres-lib/migrations/V001__raw_transaction.sql +``` + +## 7. Gate opérateur + +Après extraction par-dessus `fix.002` : + +```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 +``` + +Le correctif n’est validé qu’après gate opérateur entièrement vert. diff --git a/docs/validation/020-V0_3_3_STORE_POSTGRES_RAW_TRANSACTION.md b/docs/validation/020-V0_3_3_STORE_POSTGRES_RAW_TRANSACTION.md index b81ba63..3cc3700 100644 --- a/docs/validation/020-V0_3_3_STORE_POSTGRES_RAW_TRANSACTION.md +++ b/docs/validation/020-V0_3_3_STORE_POSTGRES_RAW_TRANSACTION.md @@ -1,5 +1,5 @@ - + # Validation `0.3.3` — Store/PostgreSQL RawTransaction vertical slice @@ -11,7 +11,7 @@ Cette validation accompagne : 0.3.3 — Store/PostgreSQL RawTransaction vertical slice ``` -Elle démarre en `0.3.3-pre.001` comme matrice de preuve. Les gates opérateur de `pre.001` et `pre.002` sont verts. `pre.003` a été commité avant son gate opérateur ; `pre.003-fix.001` corrige donc sa matérialisation physique par-dessus ce commit. Son premier gate opérateur a ensuite révélé un défaut de binding `ToSql` dans l’introspection catalogue et un faux positif ownership dû à des constantes internes `KSP_*`; `pre.003-fix.002` corrige uniquement ces deux défauts sans modifier le contrat physique ni les checksums de migration. Les lignes non encore implémentées restent explicitement `À FAIRE`; elles ne sont pas présentées comme acquises. +Elle démarre en `0.3.3-pre.001` comme matrice de preuve. Les gates opérateur de `pre.001` et `pre.002` sont verts. `pre.003` a été commité avant son gate opérateur ; `pre.003-fix.001` corrige donc sa matérialisation physique par-dessus ce commit. Son premier gate opérateur a ensuite révélé un défaut de binding `ToSql` dans l’introspection catalogue et un faux positif ownership dû à des constantes internes `KSP_*`; `pre.003-fix.002` corrige uniquement ces deux défauts sans modifier le contrat physique ni les checksums de migration. Son gate opérateur compile désormais le backend mais révèle trois reliquats locaux : un binding inutilisé, cinq usages de `?` interdits par la policy Clippy KSP et un `include_str!` du test live resté sur l’ancien chemin V000 ; `pre.003-fix.003` corrige uniquement ces reliquats sans toucher aux ressources SQL ni aux checksums. Les lignes non encore implémentées restent explicitement `À FAIRE`; elles ne sont pas présentées comme acquises. ## 2. Baseline stable @@ -176,7 +176,7 @@ ksp_raw_transaction_observations ksp_raw_transaction_archive_payloads ``` -Statut `pre.003` : **matérialisé dans V001**. Les quatre tables ci-dessus sont créées par la migration embedded `V001__raw_transaction.sql`; aucune capability/repository ne les consomme encore. +Statut après `pre.003-fix.001` : **matérialisé dans V001**. Les quatre tables sont des ressources embedded distinctes sous `migrations/v001_raw_transaction/tables/`; contraintes et index sont séparés dans leurs propres sous-répertoires. V001 reste une migration logique unique et aucune capability/repository ne les consomme encore. ### 5.2 Indexes @@ -635,3 +635,12 @@ cargo check -p ksp-store-lib --no-default-features - le live PostgreSQL opt-in couvre concurrence et rollback ; - tous les gates techniques/doc sont propres ; - aucun scope `RawAccountState`/worker/app/N2 n'a été ouvert. + +### `pre.003-fix.003` + +- [PASS] correction du binding local inutilisé dans l’inventaire des indexes uniques ; +- [PASS] extraction de définition de contrainte sans opérateur `?`, conformément à `clippy::question_mark_used = deny` ; +- [PASS] canari unitaire sans assertion constante ; +- [PASS] test live V000 relocalisé vers `migrations/v000_bootstrap/tables/001_ksp_store_schema_migrations.sql` ; +- [PASS] aucune ressource SQL V000/V001 modifiée ; checksums inchangés ; +- [À FAIRE] gate Cargo opérateur complet de `fix.003`.