This commit is contained in:
2026-05-13 13:19:23 +02:00
parent 24d21818cf
commit 693a456e62
19 changed files with 631 additions and 40 deletions

View File

@@ -368,6 +368,9 @@ pub(crate) struct DemoPipeline2LocalPipelineDiagnosticSummary {
/// Diagnostics grouped by pair materialization/actionability class.
pub pair_actionability_summaries:
std::vec::Vec<DemoPipeline2LocalPairActionabilityDiagnosticSummary>,
/// Diagnostics grouped by pair trading-readiness class.
pub pair_trading_readiness_summaries:
std::vec::Vec<DemoPipeline2LocalPairTradingReadinessDiagnosticSummary>,
/// Diagnostics grouped by decoded event kind.
pub decoded_event_summaries: std::vec::Vec<DemoPipeline2LocalDecodedEventDiagnosticSummary>,
/// Diagnostics grouped by decoded event classification.
@@ -476,6 +479,12 @@ pub(crate) struct DemoPipeline2LocalPairDiagnosticSummary {
/// Last known price.
#[ts(type = "number | null")]
pub last_price_quote_per_base: std::option::Option<f64>,
/// Pair trading-readiness class derived from base/quote orientation.
pub pair_trading_readiness: std::string::String,
/// Quote asset class used by the readiness classifier.
pub quote_asset_class: std::string::String,
/// Whether the pair likely requires a router or aggregator before direct execution.
pub trading_route_required: bool,
}
/// Local pair actionability diagnostics summary for the UI.
@@ -511,6 +520,37 @@ pub(crate) struct DemoPipeline2LocalPairActionabilityDiagnosticSummary {
pub pair_candle_count: i64,
}
/// Local pair trading-readiness diagnostics summary for the UI.
#[derive(Clone, Debug, serde::Serialize, TS)]
#[ts(
export,
export_to = "../frontend/ts/bindings/DemoPipeline2LocalPairTradingReadinessDiagnosticSummary.ts"
)]
#[serde(rename_all = "camelCase")]
pub(crate) struct DemoPipeline2LocalPairTradingReadinessDiagnosticSummary {
/// Pair trading-readiness class.
pub pair_trading_readiness: std::string::String,
/// Quote asset class.
pub quote_asset_class: std::string::String,
/// Whether a router or aggregator is required before direct execution.
pub trading_route_required: bool,
/// Pair count.
#[ts(type = "number")]
pub pair_count: i64,
/// Decoded event count.
#[ts(type = "number")]
pub decoded_event_count: i64,
/// Decoded trade candidate count.
#[ts(type = "number")]
pub decoded_trade_candidate_count: i64,
/// Trade event count.
#[ts(type = "number")]
pub trade_event_count: i64,
/// Pair candle count.
#[ts(type = "number")]
pub pair_candle_count: i64,
}
/// Local decoded-event diagnostics summary for the UI.
#[derive(Clone, Debug, serde::Serialize, TS)]
#[ts(
@@ -1035,7 +1075,7 @@ pub(crate) async fn demo_pipeline2_validate_local_pipeline(
let service = kb_lib::LocalPipelineValidationService::new(database.clone());
let profile_code = match request {
Some(request) => request.profile_code,
None => "0.7.32_validation_report_semantics".to_string(),
None => "0.7.33_pair_trading_readiness".to_string(),
};
let run_result = match profile_code.as_str() {
"0.7.27" | "0.7.27_dexes_non_regression" => {
@@ -1056,6 +1096,9 @@ pub(crate) async fn demo_pipeline2_validate_local_pipeline(
"0.7.32" | "0.7.32_validation_report_semantics" => {
service.validate_v0_7_32_current_database().await
},
"0.7.33" | "0.7.33_pair_trading_readiness" => {
service.validate_v0_7_33_current_database().await
},
other => Err(kb_lib::Error::InvalidState(format!(
"unsupported local pipeline validation profile: {other}"
))),
@@ -1547,6 +1590,14 @@ fn demo_pipeline2_map_local_diagnostics_summary(
),
);
}
let mut pair_trading_readiness_summaries = std::vec::Vec::new();
for pair_trading_readiness_summary in summary.pair_trading_readiness_summaries {
pair_trading_readiness_summaries.push(
demo_pipeline2_map_local_pair_trading_readiness_diagnostic_summary(
pair_trading_readiness_summary,
),
);
}
let mut decoded_event_summaries = std::vec::Vec::new();
for decoded_event_summary in summary.decoded_event_summaries {
decoded_event_summaries
@@ -1642,6 +1693,7 @@ fn demo_pipeline2_map_local_diagnostics_summary(
dex_summaries,
pair_summaries,
pair_actionability_summaries,
pair_trading_readiness_summaries,
decoded_event_summaries,
event_classification_summaries,
missing_trade_event_reason_summaries,
@@ -1689,6 +1741,9 @@ fn demo_pipeline2_map_local_pair_diagnostic_summary(
invalid_trade_event_count: summary.invalid_trade_event_count,
pair_candle_count: summary.pair_candle_count,
last_price_quote_per_base: summary.last_price_quote_per_base,
pair_trading_readiness: summary.pair_trading_readiness,
quote_asset_class: summary.quote_asset_class,
trading_route_required: summary.trading_route_required,
}
}
@@ -1707,6 +1762,21 @@ fn demo_pipeline2_map_local_pair_actionability_diagnostic_summary(
}
}
fn demo_pipeline2_map_local_pair_trading_readiness_diagnostic_summary(
summary: kb_lib::LocalPairTradingReadinessDiagnosticSummaryDto,
) -> DemoPipeline2LocalPairTradingReadinessDiagnosticSummary {
DemoPipeline2LocalPairTradingReadinessDiagnosticSummary {
pair_trading_readiness: summary.pair_trading_readiness,
quote_asset_class: summary.quote_asset_class,
trading_route_required: summary.trading_route_required,
pair_count: summary.pair_count,
decoded_event_count: summary.decoded_event_count,
decoded_trade_candidate_count: summary.decoded_trade_candidate_count,
trade_event_count: summary.trade_event_count,
pair_candle_count: summary.pair_candle_count,
}
}
fn demo_pipeline2_map_local_decoded_event_diagnostic_summary(
summary: kb_lib::LocalDecodedEventDiagnosticSummaryDto,
) -> DemoPipeline2LocalDecodedEventDiagnosticSummary {