From 433e69272a858183cb3a0bd447ad281e1bdb708f Mon Sep 17 00:00:00 2001 From: SinuS Von SifriduS Date: Mon, 24 Aug 2026 17:10:34 +0200 Subject: [PATCH] v0.2.9-pre.008-fix.001 --- Cargo.toml | 4 +- crates/ksp-app-config-desk/Cargo.toml | 4 +- crates/ksp-config-lib/Cargo.toml | 4 +- crates/ksp-logging-lib/Cargo.toml | 4 +- crates/ksp-onchain-transport-lib/Cargo.toml | 6 +- .../unit_tests/grpc_subscribe.rs | 5 +- crates/ksp-wallet-lib/Cargo.toml | 4 +- deltas/0.2.9/pre.008-fix.001.md | 59 +++++++++++++++ .../plans/016-V0_2_9_YELLOWSTONE_GRPC_PLAN.md | 17 ++++- .../validation/012-V0_2_9_YELLOWSTONE_GRPC.md | 75 ++++++++++++------- 10 files changed, 135 insertions(+), 47 deletions(-) create mode 100644 deltas/0.2.9/pre.008-fix.001.md diff --git a/Cargo.toml b/Cargo.toml index 29179d9..b321431 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,12 +1,12 @@ # file: Cargo.toml -# version: 247 +# version: 248 [workspace] resolver = "3" members = ["crates/ksp-app-config-desk", "crates/ksp-app-wallet-desk", "crates/ksp-config-lib", "crates/ksp-core-lib", "crates/ksp-logging-lib", "crates/ksp-onchain-transport-lib", "crates/ksp-wallet-lib"] [workspace.package] -version = "0.2.9-pre.8" +version = "0.2.9-pre.8.fix.1" edition = "2024" license = "MIT" repository = "https://git.sasedev.com/Sasedev/khadhroony-solana-project" diff --git a/crates/ksp-app-config-desk/Cargo.toml b/crates/ksp-app-config-desk/Cargo.toml index a4bcd6a..c1f6576 100644 --- a/crates/ksp-app-config-desk/Cargo.toml +++ b/crates/ksp-app-config-desk/Cargo.toml @@ -1,5 +1,5 @@ # file: crates/ksp-app-config-desk/Cargo.toml -# version: 8 +# version: 9 [package] name = "ksp-app-config-desk" @@ -22,6 +22,7 @@ path = "src/main.rs" tauri-build.workspace = true [dependencies] +chrono = { workspace = true, features = ["std", "now"] } fs2.workspace = true ksp-config-lib = { path = "../ksp-config-lib" } ksp-core-lib = { path = "../ksp-core-lib" } @@ -30,7 +31,6 @@ serde = { workspace = true, features = ["derive"] } serde_json.workspace = true tauri.workspace = true tauri-plugin-tracing.workspace = true -chrono = { workspace = true, features = ["std", "now"] } tokio = { workspace = true, features = ["time"] } ts-rs.workspace = true diff --git a/crates/ksp-config-lib/Cargo.toml b/crates/ksp-config-lib/Cargo.toml index 5f0b443..40ca1f6 100644 --- a/crates/ksp-config-lib/Cargo.toml +++ b/crates/ksp-config-lib/Cargo.toml @@ -1,5 +1,5 @@ # file: crates/ksp-config-lib/Cargo.toml -# version: 7 +# version: 8 [package] name = "ksp-config-lib" @@ -9,12 +9,12 @@ repository.workspace = true [dependencies] directories.workspace = true +jsonschema.workspace = true ksp-core-lib = { path = "../ksp-core-lib" } ksp-logging-lib = { path = "../ksp-logging-lib" } ksp-onchain-transport-lib = { path = "../ksp-onchain-transport-lib" } serde = { workspace = true, features = ["derive"] } serde_json.workspace = true -jsonschema.workspace = true [dev-dependencies] tempfile.workspace = true diff --git a/crates/ksp-logging-lib/Cargo.toml b/crates/ksp-logging-lib/Cargo.toml index a3ad4ea..4487178 100644 --- a/crates/ksp-logging-lib/Cargo.toml +++ b/crates/ksp-logging-lib/Cargo.toml @@ -1,5 +1,5 @@ # file: crates/ksp-logging-lib/Cargo.toml -# version: 5 +# version: 6 [package] name = "ksp-logging-lib" @@ -10,8 +10,8 @@ repository.workspace = true [dependencies] ksp-core-lib = { path = "../ksp-core-lib" } tracing = { workspace = true, features = ["std"] } -tracing-subscriber = { workspace = true, features = ["fmt", "json", "ansi"] } tracing-appender.workspace = true +tracing-subscriber = { workspace = true, features = ["fmt", "json", "ansi"] } [dev-dependencies] tokio = { workspace = true, features = ["macros", "rt", "rt-multi-thread"] } diff --git a/crates/ksp-onchain-transport-lib/Cargo.toml b/crates/ksp-onchain-transport-lib/Cargo.toml index 1f7ddb2..5f16d99 100644 --- a/crates/ksp-onchain-transport-lib/Cargo.toml +++ b/crates/ksp-onchain-transport-lib/Cargo.toml @@ -1,5 +1,5 @@ # file: crates/ksp-onchain-transport-lib/Cargo.toml -# version: 8 +# version: 9 [package] name = "ksp-onchain-transport-lib" @@ -8,10 +8,10 @@ edition.workspace = true repository.workspace = true [dependencies] -ksp-core-lib = { path = "../ksp-core-lib" } -ksp-logging-lib = { path = "../ksp-logging-lib" } futures-util = { workspace = true, features = ["sink", "std"] } http.workspace = true +ksp-core-lib = { path = "../ksp-core-lib" } +ksp-logging-lib = { path = "../ksp-logging-lib" } reqwest = { workspace = true, features = ["rustls"] } serde = { workspace = true, features = ["derive"] } serde_json.workspace = true diff --git a/crates/ksp-onchain-transport-lib/unit_tests/grpc_subscribe.rs b/crates/ksp-onchain-transport-lib/unit_tests/grpc_subscribe.rs index 2cfd0e2..6fcd44f 100644 --- a/crates/ksp-onchain-transport-lib/unit_tests/grpc_subscribe.rs +++ b/crates/ksp-onchain-transport-lib/unit_tests/grpc_subscribe.rs @@ -1,13 +1,12 @@ // file: crates/ksp-onchain-transport-lib/unit_tests/grpc_subscribe.rs -// version: 4 +// version: 5 fn filter_name(value: &str) -> crate::YellowstoneSubscribeFilterName { return crate::YellowstoneSubscribeFilterName::new(value).expect("fixture filter name must validate"); } fn minimal_transaction_info(signature_byte: u8, index: u64) -> yellowstone_grpc_proto::geyser::SubscribeUpdateTransactionInfo { - let mut meta = yellowstone_grpc_proto::solana::storage::confirmed_block::TransactionStatusMeta::default(); - meta.fee = 5_000; + let meta = yellowstone_grpc_proto::solana::storage::confirmed_block::TransactionStatusMeta { fee: 5_000, ..std::default::Default::default() }; return yellowstone_grpc_proto::geyser::SubscribeUpdateTransactionInfo { signature: vec![signature_byte; 64], is_vote: false, diff --git a/crates/ksp-wallet-lib/Cargo.toml b/crates/ksp-wallet-lib/Cargo.toml index 4c3816f..6b0767c 100644 --- a/crates/ksp-wallet-lib/Cargo.toml +++ b/crates/ksp-wallet-lib/Cargo.toml @@ -1,5 +1,5 @@ # file: crates/ksp-wallet-lib/Cargo.toml -# version: 6 +# version: 7 [package] name = "ksp-wallet-lib" @@ -9,12 +9,12 @@ repository.workspace = true [dependencies] argon2 = { workspace = true, features = ["alloc", "zeroize"] } +base64.workspace = true chacha20poly1305 = { workspace = true, features = ["alloc", "zeroize"] } ed25519-dalek = { workspace = true, features = ["signature", "zeroize"] } getrandom.workspace = true ksp-core-lib = { path = "../ksp-core-lib" } ksp-logging-lib = { path = "../ksp-logging-lib" } -base64.workspace = true serde = { workspace = true, features = ["derive"] } serde_json.workspace = true solana-keypair.workspace = true diff --git a/deltas/0.2.9/pre.008-fix.001.md b/deltas/0.2.9/pre.008-fix.001.md new file mode 100644 index 0000000..539c837 --- /dev/null +++ b/deltas/0.2.9/pre.008-fix.001.md @@ -0,0 +1,59 @@ + + + +# Delta `0.2.9-pre.008-fix.001` — hygiène Clippy fixture Blocks + +## 1. Objet + +Corriger l'unique warning Clippy observé au premier gate opérateur de `pre.008`, sans modifier le contrat fonctionnel Blocks + `block_meta` + `entry`. + +## 2. Preuve opérateur avant fix + +```text +cargo fmt --all PASS +workspace Rust audit PASS / clean +cargo check --workspace PASS +cargo clippy --workspace --all-targets PASS + 1 warning field_reassign_with_default +Transport unit 370/370 PASS +Transport public_api 47/47 PASS +Transport release_completeness 41/41 PASS +Transport doctests 4/4 PASS +Core dependency canary 3/3 PASS +cargo test --workspace PASS +``` + +## 3. Correction + +| Surface | Correction | Justification | +|---------------------------------------------|--------------------------------------------------------------|------------------------------------------------| +| `minimal_transaction_info()` fixture Blocks | `TransactionStatusMeta { fee: 5_000, ..Default::default() }` | supprime `clippy::field_reassign_with_default` | +| workspace version | `0.2.9-pre.8.fix.1` | signal technique du delta fix | +| `016` + `012` | preuve du gate et statut `fix.001` | traçabilité de fermeture de `pre.008` | + +## 4. Non-changements + +```text +aucun changement runtime N1/N2 +aucun changement du filtre Blocks +aucun changement des DTOs Block/BlockMeta/Entry +aucun changement du wire protobuf +aucune dépendance/feature Cargo +aucun allow Clippy +aucun stream bidi +aucun reconnect/replay +aucun PublicNode / Config V3 +``` + +## 5. Gate attendu + +```bash +cargo fmt --all +python3 scripts/audit_rust_workspace_rules.py +cargo check --workspace +cargo clippy --workspace --all-targets +cargo test -p ksp-onchain-transport-lib +cargo test -p ksp-core-lib --test workspace_dependencies +cargo test --workspace +``` + +Critère de fermeture : même gate vert, cette fois sans warning `field_reassign_with_default`. diff --git a/docs/plans/016-V0_2_9_YELLOWSTONE_GRPC_PLAN.md b/docs/plans/016-V0_2_9_YELLOWSTONE_GRPC_PLAN.md index 2af4a12..c7ceb26 100644 --- a/docs/plans/016-V0_2_9_YELLOWSTONE_GRPC_PLAN.md +++ b/docs/plans/016-V0_2_9_YELLOWSTONE_GRPC_PLAN.md @@ -1,9 +1,9 @@ - + # Plan `0.2.9` — moteur Yellowstone gRPC + standard Solana + PublicNode -> **Statut : `0.2.9-pre.007` est fermée sur gate opérateur intégralement vert : fmt/audit/check/Clippy/workspace PASS, Transport 367 unit + 46 public API + 40 completeness + 4 doctests. `0.2.9-pre.008` est candidate et complète uniquement Blocks + `block_meta` + `entry` du `Subscribe` standard : filtre Blocks courant complet, rewards/time/height, réutilisation des DTOs Transaction/Account, compteurs serveur indépendants des payloads optionnels et `starting_transaction_index`. Aucun stream bidi n’est encore ouvert ; lifecycle reste `pre.009`.** +> **Statut : `0.2.9-pre.008` est fonctionnellement verte sur gate opérateur : fmt/audit/check/tests/workspace PASS, Transport 370 unit + 47 public API + 41 completeness + 4 doctests. Clippy passe mais émet un unique warning `field_reassign_with_default` dans la fixture `unit_tests/grpc_subscribe.rs`. `0.2.9-pre.008-fix.001` est candidate et corrige uniquement cette hygiène de fixture ; aucun changement runtime Blocks ni bidi.** ## 1. Objet, base et état d'ouverture @@ -931,8 +931,8 @@ pre.006 DONE — structure Transport : namespace privé HTTP explicite pre.007 DONE — standard Solana : Transactions + transaction_status budget : 15–20 min ; preuve : include/exclude/required/Cuckoo/token expansion + tx/meta + TransactionConfig V1 -pre.008 CANDIDATE — standard Solana : Blocks + block_meta + entry - budget : 15–20 min ; preuve : counts/arrays/optional/oneof/payload bounds +pre.008 FIX.001 CANDIDATE — standard Solana : Blocks + block_meta + entry + budget : 15–20 min ; gate fonctionnel PASS 370/47/41/4 + workspace ; fix fixture Clippy warning-only pre.009 moteur partagé : bidi mutation + Ping/Pong + half-close + backpressure + shutdown budget : 15–20 min ; preuve : actor/session local + bounded queues + cleanup déterministe @@ -1335,3 +1335,12 @@ Les compteurs serveur ne sont volontairement pas comparés aux longueurs des vec Les conversions request protobuf et décodeurs Block/BlockMeta/Entry restent `#[cfg(test)]` jusqu’à l’ouverture du stream runtime en `pre.009`. Aucun `SubscribeDeshred`, provider PublicNode, Config V3, Ping/Pong lifecycle ou reconnect n’entre dans cette tranche. **Gate candidat :** audit statique clean ; compilation/Clippy/tests opérateur requis avant fermeture. + +## 25. `pre.008-fix.001` — hygiène Clippy de la fixture Blocks + +Le premier gate opérateur de `pre.008` confirme l'intégralité du contrat Blocks : fmt/audit/check/tests/workspace passent, avec Transport 370/370 unit, 47/47 public API, 41/41 completeness et 4/4 doctests. Clippy termine également avec succès mais signale un unique `field_reassign_with_default` dans `minimal_transaction_info()` de la fixture `grpc_subscribe`. + +Le fix remplace la construction `TransactionStatusMeta::default()` suivie de `meta.fee = 5_000` par un initialiseur struct avec `fee: 5_000` et `..Default::default()`. Aucun `allow`, aucune API, aucun DTO, aucun wire et aucune logique runtime ne changent. + +**Gate attendu :** même gate opérateur, sans warning Clippy. Le bidi reste strictement `pre.009`. + diff --git a/docs/validation/012-V0_2_9_YELLOWSTONE_GRPC.md b/docs/validation/012-V0_2_9_YELLOWSTONE_GRPC.md index 94b0678..1d79031 100644 --- a/docs/validation/012-V0_2_9_YELLOWSTONE_GRPC.md +++ b/docs/validation/012-V0_2_9_YELLOWSTONE_GRPC.md @@ -1,9 +1,9 @@ - + # Validation `0.2.9` — moteur Yellowstone + standard Solana + PublicNode -> **Statut : `pre.007` est fermée sur gate opérateur intégralement vert : fmt/audit/check/Clippy/workspace PASS, Transport 367 unit + 46 public API + 40 completeness + 4 doctests. `0.2.9-pre.008` est candidate Blocks + `block_meta` + `entry` : filtre Blocks courant complet, metadata/rewards/time/height, payloads Transaction/Account réutilisés, Entry complète et compteurs serveur conservés indépendamment des payloads optionnels. Bidi reste `pre.009`.** +> **Statut : `pre.008` est fonctionnellement verte : fmt/audit/check/tests/workspace PASS, Transport 370 unit + 47 public API + 41 completeness + 4 doctests. Clippy passe avec un unique warning `field_reassign_with_default` dans la fixture Blocks. `pre.008-fix.001` corrige uniquement ce warning ; bidi reste `pre.009`.** ## 1. Autorités du gate @@ -410,7 +410,7 @@ pre.004 DONE standard: Subscribe common/from_slot/bounds 15 pre.005 DONE standard: accounts + slots 15–20 min ; gate final fix.001 PASS pre.006 DONE structure: namespace privé HTTP `http_*` 15–20 min ; gate PASS pre.007 DONE standard: transactions + transaction_status 15–20 min ; gate PASS -pre.008 CANDIDATE standard: blocks + block_meta + entry 15–20 min +pre.008 FIX.001 CANDIDATE standard: blocks + block_meta + entry 15–20 min ; gate fonctionnel PASS, 1 warning Clippy fixture pre.009 TODO moteur: bidi/backpressure/half-close/shutdown 15–20 min pre.010 TODO moteur: reconnect/replay/gap/duplicate 15–20 min pre.011 TODO Config V3 + protocol/provider + profils PublicNode 15–20 min @@ -834,32 +834,53 @@ Le proto 12.6.0 ajoute à la représentation de transaction le `Message.config` ## 25. Gate `pre.008` — Blocks + `block_meta` + `entry` candidate -| Surface / invariant | État candidate | -|-------------------------------------------------------|----------------| -| workspace version | `0.2.9-pre.8` | -| Blocks `account_include[]` | SOURCE+TEST | -| `include_transactions?` / `include_accounts?` | SOURCE+TEST | -| `include_entries?` | SOURCE+TEST | -| Cuckoo block account include | SOURCE+TEST | -| `SubscribeUpdateBlock` | SOURCE+TEST | -| rewards + `num_partitions?` | SOURCE+TEST | -| block time / block height optionnels | SOURCE+TEST | -| transactions réutilisent `YellowstoneTransactionInfo` | SOURCE+TEST | -| accounts réutilisent `YellowstoneAccountInfo` | SOURCE+TEST | -| compteurs serveur indépendants des payload vectors | SOURCE+TEST | -| `SubscribeUpdateBlockMeta` | SOURCE+TEST | -| `SubscribeUpdateEntry` + `starting_transaction_index` | SOURCE+TEST | -| blockhash/parent blockhash Base58 -> 32 octets | SOURCE+TEST | -| entry hash exactement 32 octets | SOURCE+TEST | -| Debug sans hashes/sélecteurs/payloads imbriqués | SOURCE+TEST | -| stream bidi / Ping-Pong / lifecycle | OUT pre.008 | -| reconnect / replay | OUT pre.008 | -| PublicNode / Config V3 | OUT pre.008 | -| audit Rust workspace local | PASS / clean | -| fmt/check/Clippy/tests | opérateur TODO | +| Surface / invariant | État candidate | +|-------------------------------------------------------|--------------------------| +| workspace version | `0.2.9-pre.8` | +| Blocks `account_include[]` | SOURCE+TEST | +| `include_transactions?` / `include_accounts?` | SOURCE+TEST | +| `include_entries?` | SOURCE+TEST | +| Cuckoo block account include | SOURCE+TEST | +| `SubscribeUpdateBlock` | SOURCE+TEST | +| rewards + `num_partitions?` | SOURCE+TEST | +| block time / block height optionnels | SOURCE+TEST | +| transactions réutilisent `YellowstoneTransactionInfo` | SOURCE+TEST | +| accounts réutilisent `YellowstoneAccountInfo` | SOURCE+TEST | +| compteurs serveur indépendants des payload vectors | SOURCE+TEST | +| `SubscribeUpdateBlockMeta` | SOURCE+TEST | +| `SubscribeUpdateEntry` + `starting_transaction_index` | SOURCE+TEST | +| blockhash/parent blockhash Base58 -> 32 octets | SOURCE+TEST | +| entry hash exactement 32 octets | SOURCE+TEST | +| Debug sans hashes/sélecteurs/payloads imbriqués | SOURCE+TEST | +| stream bidi / Ping-Pong / lifecycle | OUT pre.008 | +| reconnect / replay | OUT pre.008 | +| PublicNode / Config V3 | OUT pre.008 | +| audit Rust workspace local | PASS / clean | +| fmt/audit/check/tests/workspace | PASS | +| Clippy | PASS + 1 warning fixture | Les `executed_transaction_count`, `updated_account_count` et `entries_count` sont conservés tels que fournis par le serveur ; ils ne sont pas forcés à égaler les tailles de `transactions[]`, `accounts[]` ou `entries[]`, car les trois flags `include_*` peuvent omettre ces payloads. Les messages imbriqués Transaction et Account réutilisent strictement les DTOs déjà introduits ; aucune seconde projection n’est créée. Les helpers wire/decode restent test-only jusqu’au premier consommateur runtime en `pre.009`. -**Verdict `pre.008` : candidate source prête ; fermeture après gate Cargo opérateur.** +**Verdict `pre.008` : contrat fonctionnel validé ; fix warning-only requis avant fermeture.** + +## 26. Gate `pre.008-fix.001` — warning Clippy fixture + +| Gate / observation | Résultat `pre.008` | Correctif `fix.001` | +|------------------------------------------|--------------------------------------|---------------------------------------| +| `cargo fmt --all` | PASS | à réexécuter | +| audit Rust workspace | PASS / clean | PASS local / clean | +| `cargo check --workspace` | PASS | inchangé | +| `cargo clippy --workspace --all-targets` | PASS + `field_reassign_with_default` | initialiseur struct, warning supprimé | +| Transport unit | 370/370 PASS | contrat inchangé | +| Transport `public_api` | 47/47 PASS | contrat inchangé | +| Transport `release_completeness` | 41/41 PASS | contrat inchangé | +| Transport doctests | 4/4 PASS | contrat inchangé | +| Core dependency canary | 3/3 PASS | dépendances inchangées | +| `cargo test --workspace` | PASS | contrat inchangé | + +Le warning provient uniquement de `minimal_transaction_info()` dans `unit_tests/grpc_subscribe.rs`. `fix.001` initialise `TransactionStatusMeta.fee` directement dans le literal struct et conserve `..Default::default()`. Aucun `allow`, aucun changement runtime, aucune dépendance et aucun élargissement vers le bidi. + +**Verdict `fix.001` : candidate warning-only ; fermeture de `pre.008` après gate opérateur sans warning.** +