v0.3.7-pre.005-fix.001
This commit is contained in:
@@ -1,12 +1,12 @@
|
||||
# file: Cargo.toml
|
||||
# version: 421
|
||||
# version: 422
|
||||
|
||||
[workspace]
|
||||
resolver = "3"
|
||||
members = ["crates/ksp-app-backfill-desk", "crates/ksp-app-config-desk", "crates/ksp-app-solprices-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.7-pre.5"
|
||||
version = "0.3.7-pre.5.fix.1"
|
||||
edition = "2024"
|
||||
license = "MIT"
|
||||
repository = "https://git.sasedev.com/Sasedev/khadhroony-solana-project"
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// file: crates/ksp-app-backfill-desk/tests/config_composition.rs
|
||||
// version: 3
|
||||
// version: 4
|
||||
|
||||
//! Config composite, Transport readiness and Store-network composition contracts for Backfill Desk through pre.005.
|
||||
|
||||
@@ -157,20 +157,35 @@ fn pre_004_default_composite_builds_http_pool_for_both_backfill_rpc_methods() {
|
||||
}
|
||||
}
|
||||
|
||||
fn declared_http_networks(profile: &ksp_config_lib::ResolvedConfigProfile) -> std::vec::Vec<String> {
|
||||
let endpoints = profile.profile().get("endpoints").and_then(serde_json::Value::as_array);
|
||||
let endpoints = match endpoints {
|
||||
std::option::Option::Some(value) => value,
|
||||
std::option::Option::None => return std::vec::Vec::new(),
|
||||
};
|
||||
let mut networks = endpoints
|
||||
.iter()
|
||||
.filter_map(|endpoint| {
|
||||
let enabled = endpoint.get("enabled").and_then(serde_json::Value::as_bool);
|
||||
if enabled != std::option::Option::Some(true) {
|
||||
return std::option::Option::None;
|
||||
}
|
||||
return endpoint.get("cluster").and_then(serde_json::Value::as_str).map(str::to_owned);
|
||||
})
|
||||
.collect::<std::vec::Vec<_>>();
|
||||
networks.sort();
|
||||
networks.dedup();
|
||||
return networks;
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn pre_005_all_composite_profiles_keep_resolved_transport_and_store_networks_identical() {
|
||||
fn pre_005_all_composite_profiles_keep_declared_http_and_store_networks_identical_without_external_secrets() {
|
||||
let engine = workspace_engine();
|
||||
assert!(engine.is_ok(), "workspace Config engine should be constructible: {engine:?}");
|
||||
let engine = match engine {
|
||||
std::result::Result::Ok(value) => value,
|
||||
std::result::Result::Err(_) => return,
|
||||
};
|
||||
let environment = ksp_config_lib::ConfigEnvironment::load();
|
||||
assert!(environment.is_ok(), "Config environment should load for committed Backfill Desk profiles");
|
||||
let environment = match environment {
|
||||
std::result::Result::Ok(value) => value,
|
||||
std::result::Result::Err(_) => return,
|
||||
};
|
||||
let file_id = ksp_config_lib::ConfigFileId::new(ksp_config_lib::FILE_ID_COMPOSITE_KSP_APP_BACKFILL_DESK);
|
||||
let file_id = match file_id {
|
||||
std::result::Result::Ok(value) => value,
|
||||
@@ -191,30 +206,12 @@ fn pre_005_all_composite_profiles_keep_resolved_transport_and_store_networks_ide
|
||||
(std::option::Option::Some(transport), std::option::Option::Some(store)) => (transport, store),
|
||||
_ => continue,
|
||||
};
|
||||
let transport = engine.resolve_transport_config_profile(transport.resolved(), &environment);
|
||||
let store = engine.resolve_store_config_profile(store.resolved(), &environment);
|
||||
assert!(transport.is_ok(), "profile {profile_id} Transport should map: {transport:?}");
|
||||
assert!(store.is_ok(), "profile {profile_id} Store should map: {store:?}");
|
||||
let (transport, store) = match (transport, store) {
|
||||
(std::result::Result::Ok(transport), std::result::Result::Ok(store)) => (transport, store),
|
||||
_ => continue,
|
||||
};
|
||||
let mut networks = transport
|
||||
.settings()
|
||||
.endpoints()
|
||||
.iter()
|
||||
.filter_map(|endpoint| {
|
||||
if endpoint.enabled() {
|
||||
return std::option::Option::Some(endpoint.cluster().as_str().to_owned());
|
||||
}
|
||||
return std::option::Option::None;
|
||||
})
|
||||
.collect::<std::vec::Vec<_>>();
|
||||
networks.sort();
|
||||
networks.dedup();
|
||||
assert_eq!(networks.len(), 1, "profile {profile_id} must resolve exactly one enabled HTTP network");
|
||||
if let std::option::Option::Some(transport_network) = networks.first() {
|
||||
assert_eq!(transport_network.as_str(), store.settings().network().as_str(), "profile {profile_id} Store/Transport network mismatch");
|
||||
let networks = declared_http_networks(transport.resolved());
|
||||
assert_eq!(networks.len(), 1, "profile {profile_id} must declare exactly one enabled HTTP network");
|
||||
let store_network = store.resolved().profile().get("network").and_then(serde_json::Value::as_str);
|
||||
assert!(store_network.is_some(), "profile {profile_id} Store should declare one logical network");
|
||||
if let (std::option::Option::Some(transport_network), std::option::Option::Some(store_network)) = (networks.first(), store_network) {
|
||||
assert_eq!(transport_network.as_str(), store_network, "profile {profile_id} Store/Transport network mismatch");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
97
deltas/0.3.7/pre.005-fix.001.md
Normal file
97
deltas/0.3.7/pre.005-fix.001.md
Normal file
@@ -0,0 +1,97 @@
|
||||
<!-- file: deltas/0.3.7/pre.005-fix.001.md -->
|
||||
<!-- version: 1 -->
|
||||
|
||||
# Delta `0.3.7-pre.005-fix.001` — Canari Store/Transport déterministe
|
||||
|
||||
## 1. Base requise
|
||||
|
||||
```text
|
||||
0.3.7-pre.005
|
||||
workspace.package.version = 0.3.7-pre.5
|
||||
```
|
||||
|
||||
## 2. Objectif
|
||||
|
||||
Corriger l'unique échec du gate opérateur `pre.005` sans modifier le runtime Store/Transport : le test de cohérence réseau des trois profils Backfill ne doit pas exiger un secret Yellowstone gRPC PublicNode lorsqu'il vérifie seulement le réseau HTTP déclaré et le réseau logique Store.
|
||||
|
||||
## 3. Cause
|
||||
|
||||
`pre_005_all_composite_profiles_keep_resolved_transport_and_store_networks_identical` appelait `resolve_transport_config_profile()` pour `publicnode_testnet`. Cette API résout légitimement l'ensemble du profil Transport V3, y compris `grpc_endpoints.secret_metadata`, et exige donc `KSP_SECRET_PUBLICNODE_TESTNET_GRPC_X_TOKEN`.
|
||||
|
||||
Le secret est pertinent pour un runtime gRPC réel, mais il n'est pas une précondition du canari déterministe de cohérence réseau HTTP/Store. Le test mélangeait donc deux responsabilités.
|
||||
|
||||
## 4. Correction
|
||||
|
||||
- remplacer dans le test de composition `pre.005` le mapping Transport complet par la lecture des champs non secrets du `ResolvedConfigProfile` déjà validé ;
|
||||
- extraire, trier et dédupliquer les `cluster` des seuls endpoints HTTP `enabled` ;
|
||||
- lire le champ `network` du profil Store composé ;
|
||||
- conserver l'exigence d'exactement un réseau HTTP et de son égalité stricte avec le réseau Store pour `devnet`, `mainnet` et `testnet` ;
|
||||
- ne modifier ni le composite de production, ni `std.transport`, ni `std.store`, ni le runtime Backfill Desk.
|
||||
|
||||
Les tests propriétaires de `ksp-config-lib` restent responsables de la résolution des credentials PublicNode gRPC ; les tests unitaires `store_runtime` restent responsables de la comparaison runtime effective avant `Store::open`.
|
||||
|
||||
## 5. Version
|
||||
|
||||
Le correctif modifie un test Rust compilé. Conformément à `VER-ID-007` et `VER-ID-010` :
|
||||
|
||||
```text
|
||||
workspace.package.version = 0.3.7-pre.5.fix.1
|
||||
label = 0.3.7-pre.005-fix.001
|
||||
```
|
||||
|
||||
## 6. Fichiers ajoutés
|
||||
|
||||
```text
|
||||
deltas/0.3.7/pre.005-fix.001.md
|
||||
```
|
||||
|
||||
## 7. Fichiers modifiés
|
||||
|
||||
```text
|
||||
Cargo.toml
|
||||
crates/ksp-app-backfill-desk/tests/config_composition.rs
|
||||
docs/validation/024-V0_3_7_BACKFILL_DESK.md
|
||||
```
|
||||
|
||||
## 8. Fichiers supprimés
|
||||
|
||||
Aucun.
|
||||
|
||||
## 9. Validations exécutées dans l'environnement d'assemblage
|
||||
|
||||
```text
|
||||
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.7
|
||||
```
|
||||
|
||||
Contrôles ciblés :
|
||||
|
||||
- parse TOML du workspace ;
|
||||
- test source : aucune référence au secret `KSP_SECRET_PUBLICNODE_TESTNET_GRPC_X_TOKEN` dans le canari Backfill `pre.005` ;
|
||||
- test source : le composite de production et les fichiers `std.transport.json` / `std.store.json` restent byte-for-byte inchangés par rapport à `pre.005` ;
|
||||
- test source : la vérification conserve exactement les profils `devnet`, `mainnet`, `testnet` et l'exigence d'un réseau HTTP unique identique au réseau Store.
|
||||
|
||||
## 10. Validations non exécutées dans l'environnement d'assemblage
|
||||
|
||||
`cargo` et `rustfmt` ne sont pas disponibles dans cet environnement. Gate opérateur :
|
||||
|
||||
```text
|
||||
cargo fmt --all
|
||||
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.7
|
||||
cargo check --workspace
|
||||
cargo clippy --workspace --all-targets
|
||||
cargo test -p ksp-app-backfill-desk
|
||||
cargo tree -p ksp-app-backfill-desk --edges normal
|
||||
cargo tree -p ksp-app-backfill-desk -e features
|
||||
```
|
||||
|
||||
## 11. Décisions et suite
|
||||
|
||||
Le fix reste strictement dans le périmètre `pre.005` conformément à `VER-LIFECYCLE-009`.
|
||||
|
||||
La décision suivante est enregistrée mais explicitement différée conformément à `VER-LIFECYCLE-010` : Backfill Desk doit cibler Mainnet par défaut, tout en restant reconfigurable vers Devnet/Testnet, et doit permettre de tester les moyens de transport historiques pertinents — HTTP standard, HTTP provider/configuré (notamment Helius) et Yellowstone gRPC. WebSocket n'est pas retenu pour le backfill V1 tant qu'aucun besoin fonctionnel n'est démontré. Cette correction Config/Transport ouvrira une prerelease dédiée après validation du présent fix ; elle ne sera pas mélangée à `pre.006` DTO/request initialement prévu.
|
||||
|
||||
## 12. Questions ouvertes
|
||||
|
||||
Aucune pour ce correctif.
|
||||
@@ -1,5 +1,5 @@
|
||||
<!-- file: docs/validation/024-V0_3_7_BACKFILL_DESK.md -->
|
||||
<!-- version: 6 -->
|
||||
<!-- version: 7 -->
|
||||
|
||||
# Validation v0.3.7 — Backfill Desk
|
||||
|
||||
@@ -253,3 +253,19 @@ Une seule network distincte et au moins un rôle compatible sont requis pour `tr
|
||||
- [X] aucun `BackfillRequest`, `BackfillJobRuntime`, Start/Cancel/Resume n'est ouvert ;
|
||||
- [X] audit Rust workspace local propre, zéro candidat d'export ;
|
||||
- [ ] `cargo fmt/check/clippy/test` de `pre.005` à rejouer par l'opérateur ; `cargo`/`rustfmt` restent absents du sandbox.
|
||||
|
||||
## 14. Correctif `pre.005-fix.001`
|
||||
|
||||
Le gate opérateur de `pre.005` confirme que les audits Rust/Markdown, `cargo check --workspace` et Clippy sont propres, puis isole un seul échec déterministe dans `tests/config_composition.rs` : le canari de cohérence réseau essayait de mapper intégralement le profil Transport `publicnode_testnet`, ce qui résout aussi son endpoint Yellowstone gRPC et exige donc `KSP_SECRET_PUBLICNODE_TESTNET_GRPC_X_TOKEN` même si le test ne vérifiait que l'identité du réseau HTTP.
|
||||
|
||||
Le correctif ne modifie aucun runtime, aucun composite Config, aucun profil Transport/Store et aucune capability. Le canari lit désormais uniquement les champs non secrets déjà validés des profils composés : clusters des endpoints HTTP activés et réseau logique Store. Les tests runtime unitaires restent responsables de la comparaison effective avant `Store::open`, tandis que les tests Config/Transport propriétaires couvrent séparément la résolution des secrets gRPC.
|
||||
|
||||
### Gate du fix
|
||||
|
||||
- [X] correction strictement limitée au couloir Store/composition de `pre.005` ;
|
||||
- [X] aucune modification du composite de production ni des settings Transport/Store ;
|
||||
- [X] aucun secret provider requis par le test déterministe de cohérence réseau ;
|
||||
- [X] audits statiques Rust/Markdown rejoués dans l'environnement d'assemblage ;
|
||||
- [ ] replay opérateur `cargo fmt/check/clippy/test` de `pre.005-fix.001` à exécuter.
|
||||
|
||||
La décision utilisateur de faire de Mainnet le profil Backfill par défaut et de tester plusieurs familles de transport Backfill (HTTP standard, HTTP provider tel que Helius, Yellowstone gRPC ; WebSocket exclu de V1 sauf besoin démontré) appartient à des couloirs Config/Transport antérieurs. Conformément à `VER-LIFECYCLE-010`, elle n'est pas introduite dans ce fix et doit ouvrir une prerelease dédiée après validation du correctif.
|
||||
|
||||
Reference in New Issue
Block a user