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

@@ -166,7 +166,8 @@
<div class="mb-3">
<label for="demoPipeline2ValidationProfileSelect" class="form-label">Validation profile</label>
<select id="demoPipeline2ValidationProfileSelect" class="form-select">
<option value="0.7.32_validation_report_semantics" selected>0.7.32validation report semantics</option>
<option value="0.7.33_pair_trading_readiness" selected>0.7.33pair trading readiness</option>
<option value="0.7.32_validation_report_semantics">0.7.32 — validation report semantics</option>
<option value="0.7.31_trade_event_actionability_policy">0.7.31 — trade event actionability policy</option>
<option value="0.7.30_non_trade_event_classification">0.7.30 — non-trade event classification</option>
<option value="0.7.29_multi_dex_matrix_baseline">0.7.29 — DEX matrix baseline</option>

View File

@@ -63,4 +63,16 @@ pairCandleCount: number,
/**
* Last known price.
*/
lastPriceQuotePerBase: number | null, };
lastPriceQuotePerBase: number | null,
/**
* Pair trading-readiness class derived from base/quote orientation.
*/
pairTradingReadiness: string,
/**
* Quote asset class used by the readiness classifier.
*/
quoteAssetClass: string,
/**
* Whether the pair likely requires a router or aggregator before direct execution.
*/
tradingRouteRequired: boolean, };

View File

@@ -0,0 +1,38 @@
// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
/**
* Local pair trading-readiness diagnostics summary for the UI.
*/
export type DemoPipeline2LocalPairTradingReadinessDiagnosticSummary = {
/**
* Pair trading-readiness class.
*/
pairTradingReadiness: string,
/**
* Quote asset class.
*/
quoteAssetClass: string,
/**
* Whether a router or aggregator is required before direct execution.
*/
tradingRouteRequired: boolean,
/**
* Pair count.
*/
pairCount: number,
/**
* Decoded event count.
*/
decodedEventCount: number,
/**
* Decoded trade candidate count.
*/
decodedTradeCandidateCount: number,
/**
* Trade event count.
*/
tradeEventCount: number,
/**
* Pair candle count.
*/
pairCandleCount: number, };

View File

@@ -10,6 +10,7 @@ import type { DemoPipeline2LocalNonActionablePairDiagnosticSummary } from "./Dem
import type { DemoPipeline2LocalPairActionabilityDiagnosticSummary } from "./DemoPipeline2LocalPairActionabilityDiagnosticSummary";
import type { DemoPipeline2LocalPairDiagnosticSummary } from "./DemoPipeline2LocalPairDiagnosticSummary";
import type { DemoPipeline2LocalPairGapDiagnosticSample } from "./DemoPipeline2LocalPairGapDiagnosticSample";
import type { DemoPipeline2LocalPairTradingReadinessDiagnosticSummary } from "./DemoPipeline2LocalPairTradingReadinessDiagnosticSummary";
/**
* Local pipeline diagnostics summary for the UI.
@@ -184,6 +185,10 @@ pairSummaries: Array<DemoPipeline2LocalPairDiagnosticSummary>,
* Diagnostics grouped by pair materialization/actionability class.
*/
pairActionabilitySummaries: Array<DemoPipeline2LocalPairActionabilityDiagnosticSummary>,
/**
* Diagnostics grouped by pair trading-readiness class.
*/
pairTradingReadinessSummaries: Array<DemoPipeline2LocalPairTradingReadinessDiagnosticSummary>,
/**
* Diagnostics grouped by decoded event kind.
*/

View File

@@ -1,7 +1,7 @@
{
"name": "kb-demo-app",
"private": true,
"version": "0.7.32",
"version": "0.7.33",
"type": "module",
"scripts": {
"dev": "vite",

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 {

View File

@@ -1,7 +1,7 @@
{
"$schema": "https://schema.tauri.app/config/2",
"productName": "kb-demo-app",
"version": "0.7.32",
"version": "0.7.33",
"identifier": "com.sasedev.kb-demo-app",
"build": {
"beforeDevCommand": "npm run dev",