v0.3.8-pre.009-fix.001

This commit is contained in:
2026-09-03 20:52:31 +02:00
parent 32c4b67541
commit 01502678bf
7 changed files with 78 additions and 24 deletions

View File

@@ -1,12 +1,12 @@
# file: Cargo.toml
# version: 464
# version: 465
[workspace]
resolver = "3"
members = ["crates/ksp-app-backfill-desk", "crates/ksp-app-config-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-store-api", "crates/ksp-store-lib", "crates/ksp-store-postgres-lib", "crates/ksp-wallet-lib"]
[workspace.package]
version = "0.3.8-pre.9"
version = "0.3.8-pre.9.fix.1"
edition = "2024"
license = "MIT"
repository = "https://git.sasedev.com/Sasedev/khadhroony-solana-project"

View File

@@ -1,5 +1,5 @@
// file: crates/ksp-store-api/src/model/raw_inspection.rs
// version: 2
// version: 3
/// Random-access page request dedicated to bounded interactive RAW inspection.
///
@@ -104,10 +104,10 @@ impl RawTransactionObservationInspectionQuery {
direction: crate::RawSortDirection,
page: crate::RawInspectionPageRequest,
) -> crate::Result<Self> {
if let std::option::Option::Some(reference) = transaction.as_ref() {
if reference.network() != &network {
return std::result::Result::Err(raw_model_error("transaction"));
}
if let std::option::Option::Some(reference) = transaction.as_ref()
&& reference.network() != &network
{
return std::result::Result::Err(raw_model_error("transaction"));
}
return std::result::Result::Ok(Self { direction, network, page, transaction });
}
@@ -154,10 +154,10 @@ impl RawAccountObservationInspectionQuery {
direction: crate::RawSortDirection,
page: crate::RawInspectionPageRequest,
) -> crate::Result<Self> {
if let std::option::Option::Some(reference) = account.as_ref() {
if reference.network() != &network {
return std::result::Result::Err(raw_model_error("account"));
}
if let std::option::Option::Some(reference) = account.as_ref()
&& reference.network() != &network
{
return std::result::Result::Err(raw_model_error("account"));
}
return std::result::Result::Ok(Self { account, direction, network, page });
}

View File

@@ -1,5 +1,5 @@
// file: crates/ksp-store-postgres-lib/src/raw_account.rs
// version: 7
// version: 8
pub(crate) mod cursor;
@@ -421,10 +421,10 @@ pub(crate) async fn inspect_raw_account_observations(
std::result::Result::Ok(value) => value,
std::result::Result::Err(error) => return std::result::Result::Err(error),
};
if let std::option::Option::Some(reference) = query.account() {
if observation.account() != reference {
return std::result::Result::Err(data_invalid("raw_account_observation_inspection_reference"));
}
if let std::option::Option::Some(reference) = query.account()
&& observation.account() != reference
{
return std::result::Result::Err(data_invalid("raw_account_observation_inspection_reference"));
}
items.push(ksp_store_api::RawAccountObservationSummary::new(
observation.observation_key(),

View File

@@ -1,5 +1,5 @@
// file: crates/ksp-store-postgres-lib/src/raw_transaction.rs
// version: 6
// version: 7
pub(crate) mod cursor;
@@ -404,10 +404,10 @@ pub(crate) async fn inspect_raw_transaction_observations(
std::result::Result::Ok(value) => value,
std::result::Result::Err(error) => return std::result::Result::Err(error),
};
if let std::option::Option::Some(reference) = query.transaction() {
if observation.transaction() != reference {
return std::result::Result::Err(data_invalid("raw_transaction_observation_inspection_reference"));
}
if let std::option::Option::Some(reference) = query.transaction()
&& observation.transaction() != reference
{
return std::result::Result::Err(data_invalid("raw_transaction_observation_inspection_reference"));
}
items.push(ksp_store_api::RawTransactionObservationSummary::new(
observation.observation_key(),

View File

@@ -1,5 +1,5 @@
// file: crates/ksp-store-postgres-lib/tests/hardening_completeness.rs
// version: 22
// version: 23
#![warn(missing_docs)]
#![deny(unreachable_pub)]
@@ -428,7 +428,7 @@ fn v0_3_8_pre_009_observation_inspection_sql_is_counted_random_access_safe_and_f
] {
assert!(statement.contains(required), "missing transaction-observation inspection SQL contract: {required}");
}
for forbidden in ["ksp_raw_transactions AS", "payload", "archive_payload", "SELECT *"] {
for forbidden in ["ksp_raw_transactions", "ksp_raw_transaction_archive_payloads", "page.payload", "SELECT payload", "SELECT *"] {
assert!(!statement.contains(forbidden), "transaction-observation inspection leaked unrelated/raw material: {forbidden}");
}
}

View File

@@ -0,0 +1,43 @@
<!-- file: deltas/0.3.8/pre.009-fix.001.md -->
<!-- version: 1 -->
# Delta `0.3.8-pre.009-fix.001` — Clippy et canari Observation
## Base requise
Base directe attendue : `0.3.8-pre.009` (`workspace.package.version = 0.3.8-pre.9`).
## Objet
Fermer les quatre warnings Clippy introduits par `pre.009` et rescopier le canari SQL Observation Transaction afin qu'il distingue les metadata de provenance sûres des bytes RAW interdits.
## Corrections production
Les quatre validations imbriquées `if let` + `if` des nouvelles queries/decoders Observation sont exprimées avec des let-chains Rust 2024. La logique, les erreurs statiques, les network guards et les références comparées restent identiques.
## Correction du canari SQL
Le canari ne bannit plus le token générique `payload`, car `source_payload_hash` et `source_payload_size_bytes` sont des metadata de provenance contractuelles et sûres. Il interdit à la place les surfaces RAW physiques exactes :
```text
ksp_raw_transactions
ksp_raw_transaction_archive_payloads
page.payload
SELECT payload
SELECT *
```
Les statements Observation de production ne sont pas modifiés.
## Hors scope
Aucune UI, migration, index, Config, capability Tauri, projection Observation ou payload/data RAW n'est ajouté.
## Version
```text
delivery = 0.3.8-pre.009-fix.001
workspace.package.version = 0.3.8-pre.9.fix.1
commit = v0.3.8-pre.009-fix.001
tag = aucun
```

View File

@@ -1,5 +1,5 @@
<!-- file: docs/validation/025-V0_3_8_STORE_DESK.md -->
<!-- version: 20 -->
<!-- version: 21 -->
# Validation v0.3.8 — Store Desk V1 RAW
@@ -737,3 +737,14 @@ Store operation-network validation inventory: 18
Le gate Cargo de `pre.009` reste à rejouer après application du delta.
## 35. `pre.009-fix.001` — Clippy et canari SQL Observation Transaction
Le gate opérateur de `0.3.8-pre.9` confirme que les audits KSP, `cargo check --workspace`, Store API, Store lib et les inventaires 14/14 sont fonctionnels. Deux défauts de qualité restent à corriger avant clôture de `pre.009` :
- [X] quatre warnings `clippy::collapsible_if` dans les nouveaux chemins Observation (`ksp-store-api`, `raw_transaction.rs`, `raw_account.rs`) sont remplacés par des let-chains Rust 2024 sans modifier le contrat ;
- [X] le canari SQL Transaction Observation ne bannit plus le mot générique `payload`, car les metadata sûres `source_payload_hash` et `source_payload_size_bytes` en font légitimement usage ;
- [X] le canari interdit désormais les sources/colonnes RAW physiques précises : table transaction, table archive payload, `page.payload`, `SELECT payload` et `SELECT *` ;
- [X] aucune projection Observation ne gagne de byte payload/data et aucun SQL de production n'est élargi ;
- [X] la version workspace devient `0.3.8-pre.9.fix.1` car du code Rust de production et un test Rust sont modifiés.
Le gate Cargo du fix reste à rejouer après application du delta.