diff --git a/crates/rrt-runtime/src/inspect/smp/services/company/near_city_acquisition/mod.rs b/crates/rrt-runtime/src/inspect/smp/services/company/near_city_acquisition/mod.rs index 2485e3d..f8aa9f5 100644 --- a/crates/rrt-runtime/src/inspect/smp/services/company/near_city_acquisition/mod.rs +++ b/crates/rrt-runtime/src/inspect/smp/services/company/near_city_acquisition/mod.rs @@ -66,6 +66,8 @@ pub(super) fn build_near_city_acquisition_trace_inputs( .near_city_acquisition_nontransport_late_bringup_candidate_branches, near_city_acquisition_nontransport_explicit_trigger_kind_retags: projection .near_city_acquisition_nontransport_explicit_trigger_kind_retags, + near_city_acquisition_nontransport_top_dispatch_signature_condition_clusters: projection + .near_city_acquisition_nontransport_top_dispatch_signature_condition_clusters, near_city_acquisition_nontransport_add_building_descriptor_map_paths: projection .near_city_acquisition_nontransport_add_building_descriptor_map_paths, near_city_acquisition_nontransport_add_building_signature_condition_cluster_map_paths: diff --git a/crates/rrt-runtime/src/inspect/smp/services/company/near_city_acquisition/model.rs b/crates/rrt-runtime/src/inspect/smp/services/company/near_city_acquisition/model.rs index 1b4a070..dbcecf4 100644 --- a/crates/rrt-runtime/src/inspect/smp/services/company/near_city_acquisition/model.rs +++ b/crates/rrt-runtime/src/inspect/smp/services/company/near_city_acquisition/model.rs @@ -29,6 +29,8 @@ pub(in crate::inspect::smp) struct NearCityAcquisitionTraceInputs { Vec, pub(in crate::inspect::smp) near_city_acquisition_nontransport_explicit_trigger_kind_retags: Vec, + pub(in crate::inspect::smp) near_city_acquisition_nontransport_top_dispatch_signature_condition_clusters: + Vec, pub(in crate::inspect::smp) near_city_acquisition_nontransport_add_building_descriptor_map_paths: BTreeMap>, pub(in crate::inspect::smp) near_city_acquisition_nontransport_add_building_signature_condition_cluster_map_paths: diff --git a/crates/rrt-runtime/src/inspect/smp/services/company/near_city_acquisition/projection_status.rs b/crates/rrt-runtime/src/inspect/smp/services/company/near_city_acquisition/projection_status.rs index 501640f..90b1f1f 100644 --- a/crates/rrt-runtime/src/inspect/smp/services/company/near_city_acquisition/projection_status.rs +++ b/crates/rrt-runtime/src/inspect/smp/services/company/near_city_acquisition/projection_status.rs @@ -1,5 +1,7 @@ use std::collections::BTreeMap; +use crate::inspect::smp::services::SmpCompactDispatchSignatureConditionClusterSummaryEntry; + pub(super) struct NearCityProjectionStatusFields { pub(super) near_city_acquisition_shellless_readiness_status: String, pub(super) near_city_acquisition_runtime_backed_input_families: Vec, @@ -18,6 +20,8 @@ pub(super) struct NearCityProjectionStatusFields { pub(super) near_city_acquisition_nontransport_add_building_record_count: usize, pub(super) near_city_acquisition_nontransport_late_bringup_candidate_branches: Vec, pub(super) near_city_acquisition_nontransport_explicit_trigger_kind_retags: Vec, + pub(super) near_city_acquisition_nontransport_top_dispatch_signature_condition_clusters: + Vec, pub(super) near_city_acquisition_nontransport_add_building_descriptor_map_paths: BTreeMap>, pub(super) near_city_acquisition_nontransport_add_building_signature_condition_cluster_map_paths: @@ -125,6 +129,90 @@ pub(super) fn build_near_city_projection_status_fields() -> NearCityProjectionSt "0x00443526 SP - GOLD rewrites [event+0x7ef] 1 -> 5 for live runtime-event id 1 under [world+0x66de]".to_string(), "0x00443601 Labor rewrites [event+0x7ef] 0 -> 2 for live runtime-event id 0x0d under [world+0x66de]".to_string(), ], + near_city_acquisition_nontransport_top_dispatch_signature_condition_clusters: vec![ + SmpCompactDispatchSignatureConditionClusterSummaryEntry { + cluster_key: "nondirect-ge1e-h0001-0360-0004-0100-0200-p0000-0000-0000-ffff :: [864:4]".to_string(), + occurrence_count: 36, + map_count: 18, + descriptor_keys: vec![ + "39 Game Variable 1".to_string(), + "40 Game Variable 2".to_string(), + "41 Game Variable 3".to_string(), + "42 Game Variable 4".to_string(), + "43 Company Variable 1".to_string(), + "44 Company Variable 2".to_string(), + "45 Company Variable 3".to_string(), + "46 Company Variable 4".to_string(), + "8 Economic Status".to_string(), + ], + sample_map_paths: vec![ + "rt3_wineprefix/drive_c/rt3_105/maps/Britain.gmp".to_string(), + "rt3_wineprefix/drive_c/rt3_105/maps/Central Pacific.gmp".to_string(), + "rt3_wineprefix/drive_c/rt3_105/maps/Chicago to New York.gmp".to_string(), + "rt3_wineprefix/drive_c/rt3_105/maps/Crossing the Alps.gmp".to_string(), + "rt3_wineprefix/drive_c/rt3_105/maps/Eastern Canada.gmp".to_string(), + "rt3_wineprefix/drive_c/rt3_105/maps/Eastern China.gmp".to_string(), + ], + }, + SmpCompactDispatchSignatureConditionClusterSummaryEntry { + cluster_key: "nondirect-ge1e-h0001-ffff-0004-0000-0200-p0000-0000-0000-ffff :: [-1:4]".to_string(), + occurrence_count: 27, + map_count: 14, + descriptor_keys: vec![ + "16 Company Track Pieces Buildable".to_string(), + "39 Game Variable 1".to_string(), + "40 Game Variable 2".to_string(), + "41 Game Variable 3".to_string(), + "42 Game Variable 4".to_string(), + "43 Company Variable 1".to_string(), + "44 Company Variable 2".to_string(), + "46 Company Variable 4".to_string(), + "47 Player Variable 1".to_string(), + "48 Player Variable 2".to_string(), + "49 Player Variable 3".to_string(), + "50 Player Variable 4".to_string(), + "506 Add Building Barracks".to_string(), + "507 Add Building Bauxite Mine".to_string(), + ], + sample_map_paths: vec![ + "rt3_wineprefix/drive_c/rt3_105/maps/Alternate USA.gmp".to_string(), + "rt3_wineprefix/drive_c/rt3_105/maps/Central Pacific.gmp".to_string(), + "rt3_wineprefix/drive_c/rt3_105/maps/Chicago to New York.gmp".to_string(), + "rt3_wineprefix/drive_c/rt3_105/maps/Coast to Coast.gmp".to_string(), + "rt3_wineprefix/drive_c/rt3_105/maps/Go West!.gmp".to_string(), + "rt3_wineprefix/drive_c/rt3_105/maps/Greenland Growing.gmp".to_string(), + ], + }, + SmpCompactDispatchSignatureConditionClusterSummaryEntry { + cluster_key: "nondirect-ge1e-h0001-004a-0004-0100-0200-p0000-0000-0000-ffff :: [74:4]".to_string(), + occurrence_count: 9, + map_count: 1, + descriptor_keys: vec!["54 Territory Variable 4".to_string()], + sample_map_paths: vec![ + "rt3_wineprefix/drive_c/rt3_105/maps/Alternate USA.gmp".to_string(), + ], + }, + SmpCompactDispatchSignatureConditionClusterSummaryEntry { + cluster_key: "nondirect-ge1e-h0001-0080-0004-0100-0200-p0000-0000-0000-ffff :: [128:4]".to_string(), + occurrence_count: 9, + map_count: 4, + descriptor_keys: vec![ + "39 Game Variable 1".to_string(), + "43 Company Variable 1".to_string(), + "44 Company Variable 2".to_string(), + "45 Company Variable 3".to_string(), + "46 Company Variable 4".to_string(), + "47 Player Variable 1".to_string(), + "50 Player Variable 4".to_string(), + ], + sample_map_paths: vec![ + "rt3_wineprefix/drive_c/rt3_105/maps/Argentina Opens Up.gmp".to_string(), + "rt3_wineprefix/drive_c/rt3_105/maps/California Island.gmp".to_string(), + "rt3_wineprefix/drive_c/rt3_105/maps/Orient Express.gmp".to_string(), + "rt3_wineprefix/drive_c/rt3_105/maps/South East Australia.gmp".to_string(), + ], + }, + ], near_city_acquisition_nontransport_add_building_descriptor_map_paths: BTreeMap::from([ ( "506 Add Building Barracks".to_string(), diff --git a/crates/rrt-runtime/src/inspect/smp/services/company/status/near_city_fields.rs b/crates/rrt-runtime/src/inspect/smp/services/company/status/near_city_fields.rs index 5fc0cb7..53d1340 100644 --- a/crates/rrt-runtime/src/inspect/smp/services/company/status/near_city_fields.rs +++ b/crates/rrt-runtime/src/inspect/smp/services/company/status/near_city_fields.rs @@ -24,6 +24,8 @@ pub(super) struct NearCityReportFields { pub(super) near_city_acquisition_nontransport_add_building_record_count: usize, pub(super) near_city_acquisition_nontransport_late_bringup_candidate_branches: Vec, pub(super) near_city_acquisition_nontransport_explicit_trigger_kind_retags: Vec, + pub(super) near_city_acquisition_nontransport_top_dispatch_signature_condition_clusters: + Vec, pub(super) near_city_acquisition_nontransport_add_building_descriptor_map_paths: BTreeMap>, pub(super) near_city_acquisition_nontransport_add_building_signature_condition_cluster_map_paths: @@ -100,6 +102,9 @@ pub(super) fn build_near_city_report_fields( near_city_acquisition_nontransport_explicit_trigger_kind_retags: inputs .near_city_acquisition_nontransport_explicit_trigger_kind_retags .clone(), + near_city_acquisition_nontransport_top_dispatch_signature_condition_clusters: inputs + .near_city_acquisition_nontransport_top_dispatch_signature_condition_clusters + .clone(), near_city_acquisition_nontransport_add_building_descriptor_map_paths: inputs .near_city_acquisition_nontransport_add_building_descriptor_map_paths .clone(), diff --git a/crates/rrt-runtime/src/inspect/smp/services/company/status/report.rs b/crates/rrt-runtime/src/inspect/smp/services/company/status/report.rs index d14a5d2..6721dab 100644 --- a/crates/rrt-runtime/src/inspect/smp/services/company/status/report.rs +++ b/crates/rrt-runtime/src/inspect/smp/services/company/status/report.rs @@ -126,6 +126,9 @@ pub(in crate::inspect::smp) fn build_periodic_company_service_trace_report( .near_city_acquisition_nontransport_late_bringup_candidate_branches, near_city_acquisition_nontransport_explicit_trigger_kind_retags: near_city_fields .near_city_acquisition_nontransport_explicit_trigger_kind_retags, + near_city_acquisition_nontransport_top_dispatch_signature_condition_clusters: + near_city_fields + .near_city_acquisition_nontransport_top_dispatch_signature_condition_clusters, near_city_acquisition_nontransport_add_building_descriptor_map_paths: near_city_fields .near_city_acquisition_nontransport_add_building_descriptor_map_paths, near_city_acquisition_nontransport_add_building_signature_condition_cluster_map_paths: diff --git a/crates/rrt-runtime/src/inspect/smp/services/model/company.rs b/crates/rrt-runtime/src/inspect/smp/services/model/company.rs index 563ea36..b6daff6 100644 --- a/crates/rrt-runtime/src/inspect/smp/services/model/company.rs +++ b/crates/rrt-runtime/src/inspect/smp/services/model/company.rs @@ -90,6 +90,17 @@ pub struct SmpSavePlacedStructurePolicyTrailingWordSummaryEntry { pub count: usize, } +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +pub struct SmpCompactDispatchSignatureConditionClusterSummaryEntry { + pub cluster_key: String, + pub occurrence_count: usize, + pub map_count: usize, + #[serde(default)] + pub descriptor_keys: Vec, + #[serde(default)] + pub sample_map_paths: Vec, +} + #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] pub struct SmpPeriodicCompanyServiceTraceReport { pub profile_family: String, @@ -184,6 +195,9 @@ pub struct SmpPeriodicCompanyServiceTraceReport { #[serde(default)] pub near_city_acquisition_nontransport_explicit_trigger_kind_retags: Vec, #[serde(default)] + pub near_city_acquisition_nontransport_top_dispatch_signature_condition_clusters: + Vec, + #[serde(default)] pub near_city_acquisition_nontransport_add_building_descriptor_map_paths: BTreeMap>, #[serde(default)] diff --git a/crates/rrt-runtime/src/inspect/smp/tests/services/periodic_company.rs b/crates/rrt-runtime/src/inspect/smp/tests/services/periodic_company.rs index e31c20b..3e1d574 100644 --- a/crates/rrt-runtime/src/inspect/smp/tests/services/periodic_company.rs +++ b/crates/rrt-runtime/src/inspect/smp/tests/services/periodic_company.rs @@ -360,6 +360,52 @@ fn builds_periodic_company_service_trace_report_with_candidate_consumers() { .iter() .any(|line| line.contains("0x00443601") && line.contains("0 -> 2")) ); + assert_eq!( + trace + .near_city_acquisition_nontransport_top_dispatch_signature_condition_clusters + .len(), + 4 + ); + let top_cluster = + &trace.near_city_acquisition_nontransport_top_dispatch_signature_condition_clusters[0]; + assert_eq!( + top_cluster.cluster_key, + "nondirect-ge1e-h0001-0360-0004-0100-0200-p0000-0000-0000-ffff :: [864:4]" + ); + assert_eq!(top_cluster.occurrence_count, 36); + assert_eq!(top_cluster.map_count, 18); + assert!( + top_cluster + .descriptor_keys + .iter() + .any(|key| key == "8 Economic Status") + ); + assert!( + top_cluster + .sample_map_paths + .iter() + .any(|path| path.ends_with("Britain.gmp")) + ); + let mixed_cluster = + &trace.near_city_acquisition_nontransport_top_dispatch_signature_condition_clusters[1]; + assert_eq!( + mixed_cluster.cluster_key, + "nondirect-ge1e-h0001-ffff-0004-0000-0200-p0000-0000-0000-ffff :: [-1:4]" + ); + assert_eq!(mixed_cluster.occurrence_count, 27); + assert_eq!(mixed_cluster.map_count, 14); + assert!( + mixed_cluster + .descriptor_keys + .iter() + .any(|key| key == "506 Add Building Barracks") + ); + assert!( + mixed_cluster + .sample_map_paths + .iter() + .any(|path| path.ends_with("Alternate USA.gmp")) + ); assert_eq!( trace .near_city_acquisition_nontransport_add_building_descriptor_map_paths