0.3.15-pre.014-fix.002

This commit is contained in:
2026-09-18 00:42:56 +02:00
parent 6d820bf0d7
commit 463c82bfcf
4 changed files with 72 additions and 5 deletions

View File

@@ -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"

View File

@@ -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();

View File

@@ -0,0 +1,56 @@
<!-- file: deltas/0.3.15/pre.014-fix.002.md -->
<!-- version: 1 -->
# 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<i64>
found Option<u64>
```
Le test projette `RawTimestamp::unix_millis()` (`u64`) vers `RawTransactionRow::block_time_unix_millis` (`Option<i64>`). 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.

View File

@@ -1,5 +1,5 @@
<!-- file: docs/validation/032-V0_3_15_RAW_TRANSACTION_INGEST_DESK.md -->
<!-- version: 29 -->
<!-- version: 30 -->
# 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<i64>`. 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.