diff --git a/Cargo.toml b/Cargo.toml index 107373a..d4bbbe9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,12 +1,12 @@ # file: Cargo.toml -# version: 629 +# version: 630 [workspace] 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.15-pre.14.fix.1" +version = "0.3.15-pre.14.fix.2" 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 ad36e35..08dd226 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: 9 +// version: 10 fn network() -> ksp_store_api::RawNetworkId { return match ksp_store_api::RawNetworkId::new("devnet") { @@ -473,7 +473,7 @@ fn v0_3_15_pre_014_fix_001_incoming_truncated_logs_are_compatible_only_when_miss let mut stored_row = transaction_row("full"); stored_row.signature = stored.reference().signature().as_bytes().to_vec(); stored_row.slot_text = stored.slot().to_string(); - stored_row.block_time_unix_millis = stored.block_time().map(|value| return value.unix_millis()); + stored_row.block_time_unix_millis = stored.block_time().and_then(|value| return i64::try_from(value.unix_millis()).ok()); stored_row.format_id = stored.payload().format_id().as_str().to_owned(); stored_row.format_version = i64::from(stored.payload().format_version()); stored_row.content_hash = stored.payload().content_hash().as_bytes().to_vec(); diff --git a/deltas/0.3.15/pre.014-fix.002.md b/deltas/0.3.15/pre.014-fix.002.md new file mode 100644 index 0000000..28c39f4 --- /dev/null +++ b/deltas/0.3.15/pre.014-fix.002.md @@ -0,0 +1,56 @@ + + + +# Delta v0.3.15-pre.014-fix.002 — correction de typage du gate `fix.001` + +## Base requise + +```text +ksp-general-0.3.15-pre.014-fix.001.zip +SHA-256 : 5be219224ea361d9e604943e79dd6eaad79f74679467ce0441408204d0a3912c +bytes : 160680 +``` + +## Cause + +Le gate opérateur de `pre.014-fix.001` passe les audits et `cargo check --workspace`, puis Clippy/tests compilant les tests de `ksp-store-postgres-lib` échouent sur `unit_tests/raw_transaction.rs` : + +```text +expected Option +found Option +``` + +Le test projette `RawTimestamp::unix_millis()` (`u64`) vers `RawTransactionRow::block_time_unix_millis` (`Option`). Le fixture porte `block_time=None`, mais la closure reste entièrement typée à la compilation. + +## Correction + +La projection du test utilise désormais une conversion bornée et non-panique : + +```text +block_time.map(unix_millis).and_then(i64::try_from(...).ok()) +``` + +La sémantique de production de `pre.014-fix.001` reste inchangée. Aucun `unwrap`, `expect`, `panic`, changement Store runtime, Transport ou Worker n'est introduit par ce fix. + +## Résultat live déjà observé sur la base `fix.001` + +Le run opérateur confirme que la compatibilité `logMessages` tronqués fonctionne en production : plusieurs observations Mainnet tronquées sont acceptées avec le domaine `store.raw_transaction.compatible_partial`, le canonique complet reste inchangé et aucun `content_conflict` n'est émis pour ces cas. + +Le même run reproduit toutefois `grpc_backpressure_overflow` sur Yellowstone Mainnet à `22:09:54`, bien avant le Stop opérateur à `22:12:03`. Ce défaut appartient au couloir acquisition Yellowstone de `pre.013`. Conformément à `VER-LIFECYCLE-010`, il ouvrira une nouvelle prerelease dédiée après validation de ce fix ; il n'est pas mélangé à `pre.014-fix.002`. + +## Validation opérateur + +```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/0.3.15 +cargo check --workspace +cargo clippy --workspace --all-targets --all-features -- -D warnings +cargo test -p ksp-store-postgres-lib --all-targets --all-features +cargo test -p ksp-worker-raw-transaction-ingest-lib --all-targets --all-features +cargo test -p ksp-app-raw-transaction-ingest-desk --all-targets --all-features +cargo test --workspace --all-targets --all-features +``` + +Le live n'a pas besoin d'être rejoué pour valider la correction de typage elle-même ; le prochain live prolongé appartient à la prerelease acquisition dédiée. diff --git a/docs/validation/032-V0_3_15_RAW_TRANSACTION_INGEST_DESK.md b/docs/validation/032-V0_3_15_RAW_TRANSACTION_INGEST_DESK.md index b9fbc60..00639c6 100644 --- a/docs/validation/032-V0_3_15_RAW_TRANSACTION_INGEST_DESK.md +++ b/docs/validation/032-V0_3_15_RAW_TRANSACTION_INGEST_DESK.md @@ -1,5 +1,5 @@ - + # Validation v0.3.15 — Raw Transaction Ingest Desk @@ -986,3 +986,14 @@ canonique déjà complet Le canonical RAW n'est jamais remplacé par la version tronquée. Les cas suivants restent des `content_conflict` en `0.3.15` : préfixe différent avant le marqueur, autre champ `meta` différent, marqueur non exact ou multiple, canonique déjà tronqué puis version plus complète entrante. Ce dernier cas nécessite une promotion canonique atomique et appartient explicitement à `0.3.16`, avec variantes durables et historique de résolution ; il n'est pas simulé par un overwrite opportuniste dans ce fix. Le correctif ne change aucune API publique Store/Worker, aucun schema SQL et aucun outcome public. `RawEntityWriteOutcome::AlreadyPresent` reste l'outcome canonique, l'observation entrante est conservée normalement et le Worker ne reçoit plus d'erreur pour le cas compatible démontré. + +### `pre.014-fix.002` — correction du canari PostgreSQL et résultat live prolongé + +Le gate opérateur de `pre.014-fix.001` confirme les audits statiques et `cargo check --workspace`, puis échoue pendant Clippy/tests sur le nouveau test PostgreSQL : `RawTimestamp::unix_millis()` renvoie `u64` alors que la ligne de test `RawTransactionRow::block_time_unix_millis` attend `Option`. Le fixture concerné utilise `block_time=None`, mais Rust doit tout de même typer la closure. `fix.002` remplace la projection de test par une conversion sûre `i64::try_from(...).ok()` ; aucun comportement de production n'est modifié. + +Le même run live apporte deux preuves distinctes. D'abord, le comportement `fix.001` est confirmé sur plusieurs transactions Mainnet : le backend PostgreSQL accepte les `logMessages` entrants explicitement tronqués comme observations compatibles sans remplacer le canonique complet et sans produire de `content_conflict`. Les couples observés incluent `159/144`, `176/119`, `136/133` et `154/141` lignes `stored/incoming`. + +Ensuite, un `grpc_backpressure_overflow` réapparaît sur Yellowstone Mainnet lors d'un run prolongé. Le WARN Transport survient à `22:09:54`, plus de deux minutes avant le Stop opérateur à `22:12:03`; il ne s'agit donc pas d'une race de shutdown. Le correctif `pre.013` a supprimé le couplage strictement séquentiel, mais sa file privée de `256` slots pending et ses `8` hydratations concurrentes ne suffisent pas lorsque le débit aval moyen reste durablement inférieur au débit gRPC. Conformément à `VER-LIFECYCLE-010`, cette anomalie du couloir acquisition Yellowstone ne sera pas mélangée à `pre.014-fix.002` : elle ouvre la prochaine prerelease dédiée, avant de rejouer le gate technique/live final. + +Non-claims de `fix.002` : aucun changement de Transport, Worker runtime, Store production, politique de conflit ou capacité de queue. Le seul changement Rust est la correction de typage du test PostgreSQL. +