From 410e6f753671bacf0539405e64a0da8b5c3ca0f5 Mon Sep 17 00:00:00 2001 From: SinuS Von SifriduS Date: Tue, 22 Sep 2026 06:27:44 +0200 Subject: [PATCH] 0.3.16-pre.007-fix.001 --- Cargo.toml | 2 +- .../unit_tests/raw_transaction.rs | 6 +- .../unit_tests/runtime.rs | 4 +- deltas/0.3.16/pre.007-fix.001.md | 115 ++++++++++++++++++ 4 files changed, 121 insertions(+), 6 deletions(-) create mode 100644 deltas/0.3.16/pre.007-fix.001.md diff --git a/Cargo.toml b/Cargo.toml index 62bd170..37e3ca7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,7 +6,7 @@ resolver = "3" members = ["crates/ksp-app-backfill-desk", "crates/ksp-app-config-desk", "crates/ksp-app-raw-transaction-ingest-desk", "crates/ksp-app-solprices-desk", "crates/ksp-app-store-desk", "crates/ksp-app-wallet-desk", "crates/ksp-config-lib", "crates/ksp-core-lib", "crates/ksp-interface-lib", "crates/ksp-job-api", "crates/ksp-job-backfill-lib", "crates/ksp-logging-lib", "crates/ksp-offchain-transport-lib", "crates/ksp-onchain-transport-lib", "crates/ksp-program-api", "crates/ksp-raw-transaction-lib", "crates/ksp-store-api", "crates/ksp-store-lib", "crates/ksp-store-postgres-lib", "crates/ksp-wallet-lib", "crates/ksp-worker-api", "crates/ksp-worker-raw-transaction-ingest-lib"] [workspace.package] -version = "0.3.16-pre.7" +version = "0.3.16-pre.7.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/raw_transaction.rs b/crates/ksp-store-postgres-lib/unit_tests/raw_transaction.rs index c5b33d2..cd5279f 100644 --- a/crates/ksp-store-postgres-lib/unit_tests/raw_transaction.rs +++ b/crates/ksp-store-postgres-lib/unit_tests/raw_transaction.rs @@ -1,5 +1,5 @@ // file: crates/ksp-store-postgres-lib/unit_tests/raw_transaction.rs -// version: 14 +// version: 15 fn network() -> ksp_store_api::RawNetworkId { return match ksp_store_api::RawNetworkId::new("devnet") { @@ -346,7 +346,7 @@ fn pre_005_existing_full_content_requires_exact_payload_equality_not_hash_only() let network = network(); let incoming = raw_transaction(9, &[1, 2, 3, 4], 7); let matching = super::compare_existing_transaction(&network, transaction_row("full"), &incoming); - assert!(matching.is_err(), "fixture intentionally differs in slot/content and must conflict"); + assert!(matches!(matching, std::result::Result::Ok(super::ExistingTransactionMatch::ActiveConflict(_)))); let mut exact_row = transaction_row("full"); exact_row.signature = vec![9; 64]; exact_row.slot_text = "42".to_owned(); @@ -362,7 +362,7 @@ fn pre_005_existing_full_content_requires_exact_payload_equality_not_hash_only() same_hash_different_bytes.format_version = 1; same_hash_different_bytes.payload = std::option::Option::Some(vec![9, 9, 9, 9]); let conflict = super::compare_existing_transaction(&network, same_hash_different_bytes, &incoming); - assert_eq!(conflict.err().map(|value| return value.kind()), std::option::Option::Some(crate::PostgresBackendErrorKind::Conflict)); + assert!(matches!(conflict, std::result::Result::Ok(super::ExistingTransactionMatch::ActiveConflict(_)))); return; } diff --git a/crates/ksp-worker-raw-transaction-ingest-lib/unit_tests/runtime.rs b/crates/ksp-worker-raw-transaction-ingest-lib/unit_tests/runtime.rs index 4b6d1e6..2a49ee7 100644 --- a/crates/ksp-worker-raw-transaction-ingest-lib/unit_tests/runtime.rs +++ b/crates/ksp-worker-raw-transaction-ingest-lib/unit_tests/runtime.rs @@ -1,5 +1,5 @@ // file: crates/ksp-worker-raw-transaction-ingest-lib/unit_tests/runtime.rs -// version: 13 +// version: 14 struct ActiveTaskGuard { active: std::sync::Arc, @@ -522,7 +522,7 @@ async fn v0_3_16_pre_007_quarantined_conflict_keeps_worker_running_and_degraded( assert_eq!(snapshot.store_failure_total(), 0); assert!(handle.request_stop()); let terminal = handle.wait_terminal().await; - assert_eq!(terminal, std::result::Result::Ok(ksp_worker_api::WorkerState::Stopped)); + assert!(matches!(terminal, std::result::Result::Ok(ksp_worker_api::WorkerState::Stopped))); return; } diff --git a/deltas/0.3.16/pre.007-fix.001.md b/deltas/0.3.16/pre.007-fix.001.md new file mode 100644 index 0000000..fe95e9b --- /dev/null +++ b/deltas/0.3.16/pre.007-fix.001.md @@ -0,0 +1,115 @@ + + + +# Delta `0.3.16-pre.007-fix.001` — réalignement des canaris Worker et PostgreSQL + +## Base requise + +```text +0.3.16-pre.007 appliqué +workspace.package.version = 0.3.16-pre.7 +``` + +Le gate opérateur de `pre.007` confirme que les audits Rust/export/KSP/Markdown sont propres, que `cargo check --workspace` passe et que les suites Store API et Store façade exécutées avant les défauts sont vertes. + +Deux défauts de tests bloquent ensuite le gate : + +1. un test Worker compare avec `assert_eq!` un `Result`, alors que `ksp_core_lib::Error` n'implémente volontairement pas `PartialEq` ; +2. un test PostgreSQL hérité de `pre.005` attend encore qu'une divergence active soit retournée comme `PostgresBackendErrorKind::Conflict`, alors que `pre.007` la classe désormais comme `ExistingTransactionMatch::ActiveConflict(...)` afin de permettre sa quarantaine durable. + +Aucun des deux défauts ne nécessite une modification runtime. + +## Version + +Le correctif modifie des tests Rust et synchronise donc la version Cargo : + +```text +workspace.package.version = 0.3.16-pre.7.fix.1 +``` + +## Correction Worker + +Le test `v0_3_16_pre_007_durable_conflict_is_non_terminal_and_degrades_health` conserve exactement la même exigence fonctionnelle : après une quarantaine durable, le Worker reste contrôlable et un stop explicite doit terminer en `WorkerState::Stopped`. + +L'assertion n'utilise plus `assert_eq!` sur le `Result` complet. Elle vérifie la variante de succès avec `matches!`, ce qui ne requiert pas `PartialEq` sur le type d'erreur. + +## Correction PostgreSQL + +Le test `pre_005_existing_full_content_requires_exact_payload_equality_not_hash_only` conserve son objectif historique : un hash identique ne suffit jamais à déclarer deux payloads exacts. + +Sous le contrat `pre.007`, une divergence d'une transaction active n'est toutefois plus une erreur backend terminale. Le comparateur PostgreSQL doit retourner : + +```text +ExistingTransactionMatch::ActiveConflict(_) +``` + +Le test exige désormais ce résultat pour : + +- la fixture volontairement différente en contenu/slot ; +- le cas de même hash avec bytes de payload différents. + +Le cas exact reste `ExistingTransactionMatch::Active`, et le comportement particulier des tombstones `Purged` n'est pas modifié. + +## Fichiers modifiés + +```text +Cargo.toml +crates/ksp-store-postgres-lib/unit_tests/raw_transaction.rs +crates/ksp-worker-raw-transaction-ingest-lib/unit_tests/runtime.rs +``` + +## Fichier ajouté + +```text +deltas/0.3.16/pre.007-fix.001.md +``` + +## Fichiers supprimés + +```text +aucun +``` + +## Validations exécutées lors de la génération + +```bash +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 +``` + +Le toolchain Rust n'est pas installé dans l'environnement de génération. `cargo fmt`, `cargo check`, Clippy et les tests Cargo ne sont donc pas déclarés exécutés ici. + +## Validations opérateur demandées + +```bash +cargo fmt --all +cargo fmt --all -- --check + +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 + +cargo check --workspace +cargo clippy --workspace --all-targets --all-features -- -D warnings + +cargo test -p ksp-store-api --all-targets --all-features +cargo test -p ksp-store-lib --all-targets --all-features +cargo test -p ksp-store-postgres-lib --all-targets --all-features +cargo test -p ksp-job-backfill-lib --all-targets --all-features +cargo test -p ksp-worker-raw-transaction-ingest-lib --all-targets --all-features +``` + +## Décisions prises + +- aucune logique runtime de `pre.007` n'est modifiée ; +- `ksp_core_lib::Error` n'est pas rendu `PartialEq` uniquement pour satisfaire un test ; +- les divergences actives restent explicitement classées `ActiveConflict` afin d'alimenter le chemin de quarantaine durable ; +- le test de collision de hash continue d'exiger une comparaison byte-exacte ; +- les conflits portant sur une transaction `Purged` conservent leur comportement fail-closed existant. + +## Questions ouvertes + +Aucune question bloquante. + +## Suite + +Après gate propre : `0.3.16-pre.008` — hardening concurrence/rollback et régressions finales Store/Backfill/Worker.