diff --git a/crates/rrt-cli/src/main.rs b/crates/rrt-cli/src/main.rs index 5b04dda..40de4ac 100644 --- a/crates/rrt-cli/src/main.rs +++ b/crates/rrt-cli/src/main.rs @@ -341,6 +341,12 @@ struct RuntimeCompactEventDispatchClusterReport { add_building_dispatch_records_missing_trigger_kind: usize, add_building_descriptor_occurrence_counts: BTreeMap, add_building_descriptor_map_counts: BTreeMap, + add_building_signature_family_occurrence_counts: BTreeMap, + add_building_signature_family_map_counts: BTreeMap, + add_building_condition_tuple_occurrence_counts: BTreeMap, + add_building_condition_tuple_map_counts: BTreeMap, + add_building_signature_condition_cluster_occurrence_counts: BTreeMap, + add_building_signature_condition_cluster_map_counts: BTreeMap, } #[derive(Debug, Serialize)] @@ -361,6 +367,12 @@ struct RuntimeCompactEventDispatchClusterCountsReport { add_building_dispatch_records_missing_trigger_kind: usize, add_building_descriptor_occurrence_counts: BTreeMap, add_building_descriptor_map_counts: BTreeMap, + add_building_signature_family_occurrence_counts: BTreeMap, + add_building_signature_family_map_counts: BTreeMap, + add_building_condition_tuple_occurrence_counts: BTreeMap, + add_building_condition_tuple_map_counts: BTreeMap, + add_building_signature_condition_cluster_occurrence_counts: BTreeMap, + add_building_signature_condition_cluster_map_counts: BTreeMap, } #[derive(Debug, Clone, Serialize)] @@ -1835,6 +1847,17 @@ fn run_runtime_inspect_compact_event_dispatch_cluster_counts( add_building_descriptor_occurrence_counts: report .add_building_descriptor_occurrence_counts, add_building_descriptor_map_counts: report.add_building_descriptor_map_counts, + add_building_signature_family_occurrence_counts: report + .add_building_signature_family_occurrence_counts, + add_building_signature_family_map_counts: report + .add_building_signature_family_map_counts, + add_building_condition_tuple_occurrence_counts: report + .add_building_condition_tuple_occurrence_counts, + add_building_condition_tuple_map_counts: report.add_building_condition_tuple_map_counts, + add_building_signature_condition_cluster_occurrence_counts: report + .add_building_signature_condition_cluster_occurrence_counts, + add_building_signature_condition_cluster_map_counts: report + .add_building_signature_condition_cluster_map_counts, }, }; println!("{}", serde_json::to_string_pretty(&output)?); @@ -1861,6 +1884,13 @@ fn build_runtime_compact_event_dispatch_cluster_report( let mut add_building_dispatch_records_missing_trigger_kind = 0usize; let mut add_building_descriptor_occurrence_counts = BTreeMap::::new(); let mut add_building_descriptor_map_counts = BTreeMap::::new(); + let mut add_building_signature_family_occurrence_counts = BTreeMap::::new(); + let mut add_building_signature_family_map_counts = BTreeMap::::new(); + let mut add_building_condition_tuple_occurrence_counts = BTreeMap::::new(); + let mut add_building_condition_tuple_map_counts = BTreeMap::::new(); + let mut add_building_signature_condition_cluster_occurrence_counts = + BTreeMap::::new(); + let mut add_building_signature_condition_cluster_map_counts = BTreeMap::::new(); let mut dispatch_descriptor_occurrences = BTreeMap::>::new(); let mut unknown_descriptor_occurrences = @@ -1876,6 +1906,9 @@ fn build_runtime_compact_event_dispatch_cluster_report( let mut map_dispatch_strip_record_count = 0usize; let mut map_descriptor_keys = BTreeSet::::new(); let mut map_add_building_descriptor_keys = BTreeSet::::new(); + let mut map_add_building_signature_families = BTreeSet::::new(); + let mut map_add_building_condition_tuples = BTreeSet::::new(); + let mut map_add_building_signature_condition_clusters = BTreeSet::::new(); for record in &summary.records { let matching_rows = record .grouped_effect_rows @@ -1920,6 +1953,16 @@ fn build_runtime_compact_event_dispatch_cluster_report( }) .collect::>(); let signature_family = compact_event_signature_family_from_notes(&record.notes); + let condition_tuple_family = + compact_event_dispatch_condition_tuple_family(&condition_tuples); + let signature_family_key = signature_family + .clone() + .unwrap_or_else(|| "unknown-signature-family".to_string()); + let signature_condition_cluster_key = + compact_event_dispatch_signature_condition_cluster_key( + signature_family.as_deref(), + &condition_tuples, + ); for (descriptor_id, rows) in matching_rows { let occurrence = RuntimeCompactEventDispatchClusterOccurrence { @@ -1943,6 +1986,19 @@ fn build_runtime_compact_event_dispatch_cluster_report( .entry(descriptor_key.clone()) .or_insert(0) += 1; map_add_building_descriptor_keys.insert(descriptor_key.clone()); + *add_building_signature_family_occurrence_counts + .entry(signature_family_key.clone()) + .or_insert(0) += 1; + *add_building_condition_tuple_occurrence_counts + .entry(condition_tuple_family.clone()) + .or_insert(0) += 1; + *add_building_signature_condition_cluster_occurrence_counts + .entry(signature_condition_cluster_key.clone()) + .or_insert(0) += 1; + map_add_building_signature_families.insert(signature_family_key.clone()); + map_add_building_condition_tuples.insert(condition_tuple_family.clone()); + map_add_building_signature_condition_clusters + .insert(signature_condition_cluster_key.clone()); } dispatch_descriptor_occurrences .entry(descriptor_key) @@ -1979,6 +2035,21 @@ fn build_runtime_compact_event_dispatch_cluster_report( .entry(descriptor_key) .or_insert(0) += 1; } + for signature_family in map_add_building_signature_families { + *add_building_signature_family_map_counts + .entry(signature_family) + .or_insert(0) += 1; + } + for condition_tuple_family in map_add_building_condition_tuples { + *add_building_condition_tuple_map_counts + .entry(condition_tuple_family) + .or_insert(0) += 1; + } + for signature_condition_cluster in map_add_building_signature_condition_clusters { + *add_building_signature_condition_cluster_map_counts + .entry(signature_condition_cluster) + .or_insert(0) += 1; + } } let unknown_descriptor_ids = unknown_descriptor_occurrences @@ -2012,6 +2083,12 @@ fn build_runtime_compact_event_dispatch_cluster_report( add_building_dispatch_records_missing_trigger_kind, add_building_descriptor_occurrence_counts, add_building_descriptor_map_counts, + add_building_signature_family_occurrence_counts, + add_building_signature_family_map_counts, + add_building_condition_tuple_occurrence_counts, + add_building_condition_tuple_map_counts, + add_building_signature_condition_cluster_occurrence_counts, + add_building_signature_condition_cluster_map_counts, }) } @@ -4395,6 +4472,33 @@ fn compact_event_dispatch_descriptor_key( .unwrap_or_else(|| descriptor_id.to_string()) } +fn compact_event_dispatch_condition_tuple_family( + tuples: &[RuntimeCompactEventDispatchClusterConditionTuple], +) -> String { + if tuples.is_empty() { + return "[]".to_string(); + } + let parts = tuples + .iter() + .map(|tuple| match &tuple.metric { + Some(metric) => format!("{}:{}:{}", tuple.raw_condition_id, tuple.subtype, metric), + None => format!("{}:{}", tuple.raw_condition_id, tuple.subtype), + }) + .collect::>(); + format!("[{}]", parts.join(",")) +} + +fn compact_event_dispatch_signature_condition_cluster_key( + signature_family: Option<&str>, + tuples: &[RuntimeCompactEventDispatchClusterConditionTuple], +) -> String { + format!( + "{} :: {}", + signature_family.unwrap_or("unknown-signature-family"), + compact_event_dispatch_condition_tuple_family(tuples) + ) +} + fn parse_hex_offset(text: &str) -> Option { text.strip_prefix("0x") .and_then(|digits| usize::from_str_radix(digits, 16).ok()) diff --git a/crates/rrt-runtime/src/import.rs b/crates/rrt-runtime/src/import.rs index 853d2aa..0c894f0 100644 --- a/crates/rrt-runtime/src/import.rs +++ b/crates/rrt-runtime/src/import.rs @@ -6603,6 +6603,9 @@ mod tests { add_building_dispatch_strip_descriptor_labels: vec![], add_building_dispatch_strip_records_with_trigger_kind: 0, add_building_dispatch_strip_records_missing_trigger_kind: 0, + add_building_dispatch_strip_signature_families: vec![], + add_building_dispatch_strip_condition_tuple_families: vec![], + add_building_dispatch_strip_signature_condition_clusters: vec![], records: vec![ crate::SmpLoadedPackedEventRecordSummary { record_index: 0, @@ -7620,6 +7623,9 @@ mod tests { add_building_dispatch_strip_descriptor_labels: vec![], add_building_dispatch_strip_records_with_trigger_kind: 0, add_building_dispatch_strip_records_missing_trigger_kind: 0, + add_building_dispatch_strip_signature_families: vec![], + add_building_dispatch_strip_condition_tuple_families: vec![], + add_building_dispatch_strip_signature_condition_clusters: vec![], records: vec![crate::SmpLoadedPackedEventRecordSummary { record_index: 0, live_entry_id: 7, @@ -7760,6 +7766,9 @@ mod tests { add_building_dispatch_strip_descriptor_labels: vec![], add_building_dispatch_strip_records_with_trigger_kind: 0, add_building_dispatch_strip_records_missing_trigger_kind: 0, + add_building_dispatch_strip_signature_families: vec![], + add_building_dispatch_strip_condition_tuple_families: vec![], + add_building_dispatch_strip_signature_condition_clusters: vec![], records: vec![crate::SmpLoadedPackedEventRecordSummary { record_index: 0, live_entry_id: 7, @@ -7878,6 +7887,9 @@ mod tests { add_building_dispatch_strip_descriptor_labels: vec![], add_building_dispatch_strip_records_with_trigger_kind: 0, add_building_dispatch_strip_records_missing_trigger_kind: 0, + add_building_dispatch_strip_signature_families: vec![], + add_building_dispatch_strip_condition_tuple_families: vec![], + add_building_dispatch_strip_signature_condition_clusters: vec![], records: vec![ synthetic_packed_record( 0, @@ -8022,6 +8034,9 @@ mod tests { add_building_dispatch_strip_descriptor_labels: vec![], add_building_dispatch_strip_records_with_trigger_kind: 0, add_building_dispatch_strip_records_missing_trigger_kind: 0, + add_building_dispatch_strip_signature_families: vec![], + add_building_dispatch_strip_condition_tuple_families: vec![], + add_building_dispatch_strip_signature_condition_clusters: vec![], records: vec![ synthetic_packed_record( 0, @@ -8127,6 +8142,9 @@ mod tests { add_building_dispatch_strip_descriptor_labels: vec![], add_building_dispatch_strip_records_with_trigger_kind: 0, add_building_dispatch_strip_records_missing_trigger_kind: 0, + add_building_dispatch_strip_signature_families: vec![], + add_building_dispatch_strip_condition_tuple_families: vec![], + add_building_dispatch_strip_signature_condition_clusters: vec![], records: vec![crate::SmpLoadedPackedEventRecordSummary { record_index: 0, live_entry_id: 7, @@ -8300,6 +8318,9 @@ mod tests { add_building_dispatch_strip_descriptor_labels: vec![], add_building_dispatch_strip_records_with_trigger_kind: 0, add_building_dispatch_strip_records_missing_trigger_kind: 0, + add_building_dispatch_strip_signature_families: vec![], + add_building_dispatch_strip_condition_tuple_families: vec![], + add_building_dispatch_strip_signature_condition_clusters: vec![], records: vec![ crate::SmpLoadedPackedEventRecordSummary { record_index: 0, @@ -8563,6 +8584,9 @@ mod tests { add_building_dispatch_strip_descriptor_labels: vec![], add_building_dispatch_strip_records_with_trigger_kind: 0, add_building_dispatch_strip_records_missing_trigger_kind: 0, + add_building_dispatch_strip_signature_families: vec![], + add_building_dispatch_strip_condition_tuple_families: vec![], + add_building_dispatch_strip_signature_condition_clusters: vec![], records: vec![crate::SmpLoadedPackedEventRecordSummary { record_index: 0, live_entry_id: 7, @@ -8661,6 +8685,9 @@ mod tests { add_building_dispatch_strip_descriptor_labels: vec![], add_building_dispatch_strip_records_with_trigger_kind: 0, add_building_dispatch_strip_records_missing_trigger_kind: 0, + add_building_dispatch_strip_signature_families: vec![], + add_building_dispatch_strip_condition_tuple_families: vec![], + add_building_dispatch_strip_signature_condition_clusters: vec![], records: vec![crate::SmpLoadedPackedEventRecordSummary { record_index: 0, live_entry_id: 7, @@ -8783,6 +8810,9 @@ mod tests { add_building_dispatch_strip_descriptor_labels: vec![], add_building_dispatch_strip_records_with_trigger_kind: 0, add_building_dispatch_strip_records_missing_trigger_kind: 0, + add_building_dispatch_strip_signature_families: vec![], + add_building_dispatch_strip_condition_tuple_families: vec![], + add_building_dispatch_strip_signature_condition_clusters: vec![], records: vec![crate::SmpLoadedPackedEventRecordSummary { record_index: 0, live_entry_id: 7, @@ -8878,6 +8908,9 @@ mod tests { add_building_dispatch_strip_descriptor_labels: vec![], add_building_dispatch_strip_records_with_trigger_kind: 0, add_building_dispatch_strip_records_missing_trigger_kind: 0, + add_building_dispatch_strip_signature_families: vec![], + add_building_dispatch_strip_condition_tuple_families: vec![], + add_building_dispatch_strip_signature_condition_clusters: vec![], records: vec![crate::SmpLoadedPackedEventRecordSummary { record_index: 0, live_entry_id: 8, @@ -8976,6 +9009,9 @@ mod tests { add_building_dispatch_strip_descriptor_labels: vec![], add_building_dispatch_strip_records_with_trigger_kind: 0, add_building_dispatch_strip_records_missing_trigger_kind: 0, + add_building_dispatch_strip_signature_families: vec![], + add_building_dispatch_strip_condition_tuple_families: vec![], + add_building_dispatch_strip_signature_condition_clusters: vec![], records: vec![crate::SmpLoadedPackedEventRecordSummary { record_index: 0, live_entry_id: 9, @@ -9087,6 +9123,9 @@ mod tests { add_building_dispatch_strip_descriptor_labels: vec![], add_building_dispatch_strip_records_with_trigger_kind: 0, add_building_dispatch_strip_records_missing_trigger_kind: 0, + add_building_dispatch_strip_signature_families: vec![], + add_building_dispatch_strip_condition_tuple_families: vec![], + add_building_dispatch_strip_signature_condition_clusters: vec![], records: vec![crate::SmpLoadedPackedEventRecordSummary { record_index: 0, live_entry_id: 31, @@ -9214,6 +9253,9 @@ mod tests { add_building_dispatch_strip_descriptor_labels: vec![], add_building_dispatch_strip_records_with_trigger_kind: 0, add_building_dispatch_strip_records_missing_trigger_kind: 0, + add_building_dispatch_strip_signature_families: vec![], + add_building_dispatch_strip_condition_tuple_families: vec![], + add_building_dispatch_strip_signature_condition_clusters: vec![], records: vec![crate::SmpLoadedPackedEventRecordSummary { record_index: 0, live_entry_id: 32, @@ -9312,6 +9354,9 @@ mod tests { add_building_dispatch_strip_descriptor_labels: vec![], add_building_dispatch_strip_records_with_trigger_kind: 0, add_building_dispatch_strip_records_missing_trigger_kind: 0, + add_building_dispatch_strip_signature_families: vec![], + add_building_dispatch_strip_condition_tuple_families: vec![], + add_building_dispatch_strip_signature_condition_clusters: vec![], records: vec![crate::SmpLoadedPackedEventRecordSummary { record_index: 0, live_entry_id: 33, @@ -9487,6 +9532,9 @@ mod tests { add_building_dispatch_strip_descriptor_labels: vec![], add_building_dispatch_strip_records_with_trigger_kind: 0, add_building_dispatch_strip_records_missing_trigger_kind: 0, + add_building_dispatch_strip_signature_families: vec![], + add_building_dispatch_strip_condition_tuple_families: vec![], + add_building_dispatch_strip_signature_condition_clusters: vec![], records: vec![crate::SmpLoadedPackedEventRecordSummary { record_index: 0, live_entry_id: 33, @@ -9607,6 +9655,9 @@ mod tests { add_building_dispatch_strip_descriptor_labels: vec![], add_building_dispatch_strip_records_with_trigger_kind: 0, add_building_dispatch_strip_records_missing_trigger_kind: 0, + add_building_dispatch_strip_signature_families: vec![], + add_building_dispatch_strip_condition_tuple_families: vec![], + add_building_dispatch_strip_signature_condition_clusters: vec![], records: vec![crate::SmpLoadedPackedEventRecordSummary { record_index: 0, live_entry_id: 34, @@ -9704,6 +9755,9 @@ mod tests { add_building_dispatch_strip_descriptor_labels: vec![], add_building_dispatch_strip_records_with_trigger_kind: 0, add_building_dispatch_strip_records_missing_trigger_kind: 0, + add_building_dispatch_strip_signature_families: vec![], + add_building_dispatch_strip_condition_tuple_families: vec![], + add_building_dispatch_strip_signature_condition_clusters: vec![], records: vec![crate::SmpLoadedPackedEventRecordSummary { record_index: 0, live_entry_id: 35, @@ -9801,6 +9855,9 @@ mod tests { add_building_dispatch_strip_descriptor_labels: vec![], add_building_dispatch_strip_records_with_trigger_kind: 0, add_building_dispatch_strip_records_missing_trigger_kind: 0, + add_building_dispatch_strip_signature_families: vec![], + add_building_dispatch_strip_condition_tuple_families: vec![], + add_building_dispatch_strip_signature_condition_clusters: vec![], records: vec![crate::SmpLoadedPackedEventRecordSummary { record_index: 0, live_entry_id: 41, @@ -9972,6 +10029,9 @@ mod tests { add_building_dispatch_strip_descriptor_labels: vec![], add_building_dispatch_strip_records_with_trigger_kind: 0, add_building_dispatch_strip_records_missing_trigger_kind: 0, + add_building_dispatch_strip_signature_families: vec![], + add_building_dispatch_strip_condition_tuple_families: vec![], + add_building_dispatch_strip_signature_condition_clusters: vec![], records: vec![crate::SmpLoadedPackedEventRecordSummary { record_index: 0, live_entry_id: 36, @@ -10088,6 +10148,9 @@ mod tests { add_building_dispatch_strip_descriptor_labels: vec![], add_building_dispatch_strip_records_with_trigger_kind: 0, add_building_dispatch_strip_records_missing_trigger_kind: 0, + add_building_dispatch_strip_signature_families: vec![], + add_building_dispatch_strip_condition_tuple_families: vec![], + add_building_dispatch_strip_signature_condition_clusters: vec![], records: vec![crate::SmpLoadedPackedEventRecordSummary { record_index: 0, live_entry_id: 37, @@ -10183,6 +10246,9 @@ mod tests { add_building_dispatch_strip_descriptor_labels: vec![], add_building_dispatch_strip_records_with_trigger_kind: 0, add_building_dispatch_strip_records_missing_trigger_kind: 0, + add_building_dispatch_strip_signature_families: vec![], + add_building_dispatch_strip_condition_tuple_families: vec![], + add_building_dispatch_strip_signature_condition_clusters: vec![], records: vec![crate::SmpLoadedPackedEventRecordSummary { record_index: 0, live_entry_id: 35, @@ -10288,6 +10354,9 @@ mod tests { add_building_dispatch_strip_descriptor_labels: vec![], add_building_dispatch_strip_records_with_trigger_kind: 0, add_building_dispatch_strip_records_missing_trigger_kind: 0, + add_building_dispatch_strip_signature_families: vec![], + add_building_dispatch_strip_condition_tuple_families: vec![], + add_building_dispatch_strip_signature_condition_clusters: vec![], records: vec![crate::SmpLoadedPackedEventRecordSummary { record_index: 0, live_entry_id: 38, @@ -10402,6 +10471,9 @@ mod tests { add_building_dispatch_strip_descriptor_labels: vec![], add_building_dispatch_strip_records_with_trigger_kind: 0, add_building_dispatch_strip_records_missing_trigger_kind: 0, + add_building_dispatch_strip_signature_families: vec![], + add_building_dispatch_strip_condition_tuple_families: vec![], + add_building_dispatch_strip_signature_condition_clusters: vec![], records: vec![crate::SmpLoadedPackedEventRecordSummary { record_index: 0, live_entry_id: 39, @@ -10524,6 +10596,9 @@ mod tests { add_building_dispatch_strip_descriptor_labels: vec![], add_building_dispatch_strip_records_with_trigger_kind: 0, add_building_dispatch_strip_records_missing_trigger_kind: 0, + add_building_dispatch_strip_signature_families: vec![], + add_building_dispatch_strip_condition_tuple_families: vec![], + add_building_dispatch_strip_signature_condition_clusters: vec![], records: vec![crate::SmpLoadedPackedEventRecordSummary { record_index: 0, live_entry_id: 40, @@ -10635,6 +10710,9 @@ mod tests { add_building_dispatch_strip_descriptor_labels: vec![], add_building_dispatch_strip_records_with_trigger_kind: 0, add_building_dispatch_strip_records_missing_trigger_kind: 0, + add_building_dispatch_strip_signature_families: vec![], + add_building_dispatch_strip_condition_tuple_families: vec![], + add_building_dispatch_strip_signature_condition_clusters: vec![], records: vec![crate::SmpLoadedPackedEventRecordSummary { record_index: 0, live_entry_id: 41, @@ -10732,6 +10810,9 @@ mod tests { add_building_dispatch_strip_descriptor_labels: vec![], add_building_dispatch_strip_records_with_trigger_kind: 0, add_building_dispatch_strip_records_missing_trigger_kind: 0, + add_building_dispatch_strip_signature_families: vec![], + add_building_dispatch_strip_condition_tuple_families: vec![], + add_building_dispatch_strip_signature_condition_clusters: vec![], records: vec![crate::SmpLoadedPackedEventRecordSummary { record_index: 0, live_entry_id: 36, @@ -10899,6 +10980,9 @@ mod tests { add_building_dispatch_strip_descriptor_labels: vec![], add_building_dispatch_strip_records_with_trigger_kind: 0, add_building_dispatch_strip_records_missing_trigger_kind: 0, + add_building_dispatch_strip_signature_families: vec![], + add_building_dispatch_strip_condition_tuple_families: vec![], + add_building_dispatch_strip_signature_condition_clusters: vec![], records: vec![crate::SmpLoadedPackedEventRecordSummary { record_index: 0, live_entry_id: 9, @@ -11076,6 +11160,9 @@ mod tests { add_building_dispatch_strip_descriptor_labels: vec![], add_building_dispatch_strip_records_with_trigger_kind: 0, add_building_dispatch_strip_records_missing_trigger_kind: 0, + add_building_dispatch_strip_signature_families: vec![], + add_building_dispatch_strip_condition_tuple_families: vec![], + add_building_dispatch_strip_signature_condition_clusters: vec![], records: vec![crate::SmpLoadedPackedEventRecordSummary { record_index: 0, live_entry_id: 11, @@ -11201,6 +11288,9 @@ mod tests { add_building_dispatch_strip_descriptor_labels: vec![], add_building_dispatch_strip_records_with_trigger_kind: 0, add_building_dispatch_strip_records_missing_trigger_kind: 0, + add_building_dispatch_strip_signature_families: vec![], + add_building_dispatch_strip_condition_tuple_families: vec![], + add_building_dispatch_strip_signature_condition_clusters: vec![], records: vec![crate::SmpLoadedPackedEventRecordSummary { record_index: 0, live_entry_id: 12, @@ -11307,6 +11397,9 @@ mod tests { add_building_dispatch_strip_descriptor_labels: vec![], add_building_dispatch_strip_records_with_trigger_kind: 0, add_building_dispatch_strip_records_missing_trigger_kind: 0, + add_building_dispatch_strip_signature_families: vec![], + add_building_dispatch_strip_condition_tuple_families: vec![], + add_building_dispatch_strip_signature_condition_clusters: vec![], records: vec![crate::SmpLoadedPackedEventRecordSummary { record_index: 0, live_entry_id: 13, @@ -11440,6 +11533,9 @@ mod tests { add_building_dispatch_strip_descriptor_labels: vec![], add_building_dispatch_strip_records_with_trigger_kind: 0, add_building_dispatch_strip_records_missing_trigger_kind: 0, + add_building_dispatch_strip_signature_families: vec![], + add_building_dispatch_strip_condition_tuple_families: vec![], + add_building_dispatch_strip_signature_condition_clusters: vec![], records: vec![crate::SmpLoadedPackedEventRecordSummary { record_index: 0, live_entry_id: 13, @@ -11567,6 +11663,9 @@ mod tests { add_building_dispatch_strip_descriptor_labels: vec![], add_building_dispatch_strip_records_with_trigger_kind: 0, add_building_dispatch_strip_records_missing_trigger_kind: 0, + add_building_dispatch_strip_signature_families: vec![], + add_building_dispatch_strip_condition_tuple_families: vec![], + add_building_dispatch_strip_signature_condition_clusters: vec![], records: vec![crate::SmpLoadedPackedEventRecordSummary { record_index: 0, live_entry_id: 18, @@ -11684,6 +11783,9 @@ mod tests { add_building_dispatch_strip_descriptor_labels: vec![], add_building_dispatch_strip_records_with_trigger_kind: 0, add_building_dispatch_strip_records_missing_trigger_kind: 0, + add_building_dispatch_strip_signature_families: vec![], + add_building_dispatch_strip_condition_tuple_families: vec![], + add_building_dispatch_strip_signature_condition_clusters: vec![], records: vec![crate::SmpLoadedPackedEventRecordSummary { record_index: 0, live_entry_id: 19, @@ -11797,6 +11899,9 @@ mod tests { add_building_dispatch_strip_descriptor_labels: vec![], add_building_dispatch_strip_records_with_trigger_kind: 0, add_building_dispatch_strip_records_missing_trigger_kind: 0, + add_building_dispatch_strip_signature_families: vec![], + add_building_dispatch_strip_condition_tuple_families: vec![], + add_building_dispatch_strip_signature_condition_clusters: vec![], records: vec![crate::SmpLoadedPackedEventRecordSummary { record_index: 0, live_entry_id: 14, @@ -11924,6 +12029,9 @@ mod tests { add_building_dispatch_strip_descriptor_labels: vec![], add_building_dispatch_strip_records_with_trigger_kind: 0, add_building_dispatch_strip_records_missing_trigger_kind: 0, + add_building_dispatch_strip_signature_families: vec![], + add_building_dispatch_strip_condition_tuple_families: vec![], + add_building_dispatch_strip_signature_condition_clusters: vec![], records: vec![crate::SmpLoadedPackedEventRecordSummary { record_index: 0, live_entry_id: 16, @@ -12036,6 +12144,9 @@ mod tests { add_building_dispatch_strip_descriptor_labels: vec![], add_building_dispatch_strip_records_with_trigger_kind: 0, add_building_dispatch_strip_records_missing_trigger_kind: 0, + add_building_dispatch_strip_signature_families: vec![], + add_building_dispatch_strip_condition_tuple_families: vec![], + add_building_dispatch_strip_signature_condition_clusters: vec![], records: vec![crate::SmpLoadedPackedEventRecordSummary { record_index: 0, live_entry_id: 18, @@ -12130,6 +12241,9 @@ mod tests { add_building_dispatch_strip_descriptor_labels: vec![], add_building_dispatch_strip_records_with_trigger_kind: 0, add_building_dispatch_strip_records_missing_trigger_kind: 0, + add_building_dispatch_strip_signature_families: vec![], + add_building_dispatch_strip_condition_tuple_families: vec![], + add_building_dispatch_strip_signature_condition_clusters: vec![], records: vec![crate::SmpLoadedPackedEventRecordSummary { record_index: 0, live_entry_id: 52, @@ -12229,6 +12343,9 @@ mod tests { add_building_dispatch_strip_descriptor_labels: vec![], add_building_dispatch_strip_records_with_trigger_kind: 0, add_building_dispatch_strip_records_missing_trigger_kind: 0, + add_building_dispatch_strip_signature_families: vec![], + add_building_dispatch_strip_condition_tuple_families: vec![], + add_building_dispatch_strip_signature_condition_clusters: vec![], records: vec![crate::SmpLoadedPackedEventRecordSummary { record_index: 0, live_entry_id: 21, @@ -12333,6 +12450,9 @@ mod tests { add_building_dispatch_strip_descriptor_labels: vec![], add_building_dispatch_strip_records_with_trigger_kind: 0, add_building_dispatch_strip_records_missing_trigger_kind: 0, + add_building_dispatch_strip_signature_families: vec![], + add_building_dispatch_strip_condition_tuple_families: vec![], + add_building_dispatch_strip_signature_condition_clusters: vec![], records: vec![crate::SmpLoadedPackedEventRecordSummary { record_index: 0, live_entry_id: 22, @@ -12437,6 +12557,9 @@ mod tests { add_building_dispatch_strip_descriptor_labels: vec![], add_building_dispatch_strip_records_with_trigger_kind: 0, add_building_dispatch_strip_records_missing_trigger_kind: 0, + add_building_dispatch_strip_signature_families: vec![], + add_building_dispatch_strip_condition_tuple_families: vec![], + add_building_dispatch_strip_signature_condition_clusters: vec![], records: vec![crate::SmpLoadedPackedEventRecordSummary { record_index: 0, live_entry_id: 23, @@ -12557,6 +12680,9 @@ mod tests { add_building_dispatch_strip_descriptor_labels: vec![], add_building_dispatch_strip_records_with_trigger_kind: 0, add_building_dispatch_strip_records_missing_trigger_kind: 0, + add_building_dispatch_strip_signature_families: vec![], + add_building_dispatch_strip_condition_tuple_families: vec![], + add_building_dispatch_strip_signature_condition_clusters: vec![], records: vec![crate::SmpLoadedPackedEventRecordSummary { record_index: 0, live_entry_id: 24, @@ -12668,6 +12794,9 @@ mod tests { add_building_dispatch_strip_descriptor_labels: vec![], add_building_dispatch_strip_records_with_trigger_kind: 0, add_building_dispatch_strip_records_missing_trigger_kind: 0, + add_building_dispatch_strip_signature_families: vec![], + add_building_dispatch_strip_condition_tuple_families: vec![], + add_building_dispatch_strip_signature_condition_clusters: vec![], records: vec![crate::SmpLoadedPackedEventRecordSummary { record_index: 0, live_entry_id: 29, @@ -12826,6 +12955,9 @@ mod tests { add_building_dispatch_strip_descriptor_labels: vec![], add_building_dispatch_strip_records_with_trigger_kind: 0, add_building_dispatch_strip_records_missing_trigger_kind: 0, + add_building_dispatch_strip_signature_families: vec![], + add_building_dispatch_strip_condition_tuple_families: vec![], + add_building_dispatch_strip_signature_condition_clusters: vec![], records: vec![crate::SmpLoadedPackedEventRecordSummary { record_index: 0, live_entry_id: 27, @@ -12983,6 +13115,9 @@ mod tests { add_building_dispatch_strip_descriptor_labels: vec![], add_building_dispatch_strip_records_with_trigger_kind: 0, add_building_dispatch_strip_records_missing_trigger_kind: 0, + add_building_dispatch_strip_signature_families: vec![], + add_building_dispatch_strip_condition_tuple_families: vec![], + add_building_dispatch_strip_signature_condition_clusters: vec![], records: vec![ crate::SmpLoadedPackedEventRecordSummary { record_index: 0, @@ -13531,6 +13666,9 @@ mod tests { add_building_dispatch_strip_descriptor_labels: vec![], add_building_dispatch_strip_records_with_trigger_kind: 0, add_building_dispatch_strip_records_missing_trigger_kind: 0, + add_building_dispatch_strip_signature_families: vec![], + add_building_dispatch_strip_condition_tuple_families: vec![], + add_building_dispatch_strip_signature_condition_clusters: vec![], records: vec![crate::SmpLoadedPackedEventRecordSummary { record_index: 0, live_entry_id: 71, @@ -13733,6 +13871,9 @@ mod tests { add_building_dispatch_strip_descriptor_labels: vec![], add_building_dispatch_strip_records_with_trigger_kind: 0, add_building_dispatch_strip_records_missing_trigger_kind: 0, + add_building_dispatch_strip_signature_families: vec![], + add_building_dispatch_strip_condition_tuple_families: vec![], + add_building_dispatch_strip_signature_condition_clusters: vec![], records: vec![crate::SmpLoadedPackedEventRecordSummary { record_index: 0, live_entry_id: 72, @@ -13880,6 +14021,9 @@ mod tests { add_building_dispatch_strip_descriptor_labels: vec![], add_building_dispatch_strip_records_with_trigger_kind: 0, add_building_dispatch_strip_records_missing_trigger_kind: 0, + add_building_dispatch_strip_signature_families: vec![], + add_building_dispatch_strip_condition_tuple_families: vec![], + add_building_dispatch_strip_signature_condition_clusters: vec![], records: vec![crate::SmpLoadedPackedEventRecordSummary { record_index: 0, live_entry_id: 73, @@ -14026,6 +14170,9 @@ mod tests { add_building_dispatch_strip_descriptor_labels: vec![], add_building_dispatch_strip_records_with_trigger_kind: 0, add_building_dispatch_strip_records_missing_trigger_kind: 0, + add_building_dispatch_strip_signature_families: vec![], + add_building_dispatch_strip_condition_tuple_families: vec![], + add_building_dispatch_strip_signature_condition_clusters: vec![], records: vec![crate::SmpLoadedPackedEventRecordSummary { record_index: 0, live_entry_id: 74, @@ -14173,6 +14320,9 @@ mod tests { add_building_dispatch_strip_descriptor_labels: vec![], add_building_dispatch_strip_records_with_trigger_kind: 0, add_building_dispatch_strip_records_missing_trigger_kind: 0, + add_building_dispatch_strip_signature_families: vec![], + add_building_dispatch_strip_condition_tuple_families: vec![], + add_building_dispatch_strip_signature_condition_clusters: vec![], records: vec![crate::SmpLoadedPackedEventRecordSummary { record_index: 0, live_entry_id: 25, @@ -14304,6 +14454,9 @@ mod tests { add_building_dispatch_strip_descriptor_labels: vec![], add_building_dispatch_strip_records_with_trigger_kind: 0, add_building_dispatch_strip_records_missing_trigger_kind: 0, + add_building_dispatch_strip_signature_families: vec![], + add_building_dispatch_strip_condition_tuple_families: vec![], + add_building_dispatch_strip_signature_condition_clusters: vec![], records: vec![crate::SmpLoadedPackedEventRecordSummary { record_index: 0, live_entry_id: 26, @@ -14510,6 +14663,9 @@ mod tests { add_building_dispatch_strip_descriptor_labels: vec![], add_building_dispatch_strip_records_with_trigger_kind: 0, add_building_dispatch_strip_records_missing_trigger_kind: 0, + add_building_dispatch_strip_signature_families: vec![], + add_building_dispatch_strip_condition_tuple_families: vec![], + add_building_dispatch_strip_signature_condition_clusters: vec![], records: vec![crate::SmpLoadedPackedEventRecordSummary { record_index: 0, live_entry_id: 19, @@ -14624,6 +14780,9 @@ mod tests { add_building_dispatch_strip_descriptor_labels: vec![], add_building_dispatch_strip_records_with_trigger_kind: 0, add_building_dispatch_strip_records_missing_trigger_kind: 0, + add_building_dispatch_strip_signature_families: vec![], + add_building_dispatch_strip_condition_tuple_families: vec![], + add_building_dispatch_strip_signature_condition_clusters: vec![], records: vec![crate::SmpLoadedPackedEventRecordSummary { record_index: 0, live_entry_id: 20, @@ -14740,6 +14899,9 @@ mod tests { add_building_dispatch_strip_descriptor_labels: vec![], add_building_dispatch_strip_records_with_trigger_kind: 0, add_building_dispatch_strip_records_missing_trigger_kind: 0, + add_building_dispatch_strip_signature_families: vec![], + add_building_dispatch_strip_condition_tuple_families: vec![], + add_building_dispatch_strip_signature_condition_clusters: vec![], records: vec![crate::SmpLoadedPackedEventRecordSummary { record_index: 0, live_entry_id: 24, @@ -14927,6 +15089,9 @@ mod tests { add_building_dispatch_strip_descriptor_labels: vec![], add_building_dispatch_strip_records_with_trigger_kind: 0, add_building_dispatch_strip_records_missing_trigger_kind: 0, + add_building_dispatch_strip_signature_families: vec![], + add_building_dispatch_strip_condition_tuple_families: vec![], + add_building_dispatch_strip_signature_condition_clusters: vec![], records: vec![crate::SmpLoadedPackedEventRecordSummary { record_index: 0, live_entry_id: 21, @@ -15097,6 +15262,9 @@ mod tests { add_building_dispatch_strip_descriptor_labels: vec![], add_building_dispatch_strip_records_with_trigger_kind: 0, add_building_dispatch_strip_records_missing_trigger_kind: 0, + add_building_dispatch_strip_signature_families: vec![], + add_building_dispatch_strip_condition_tuple_families: vec![], + add_building_dispatch_strip_signature_condition_clusters: vec![], records: vec![crate::SmpLoadedPackedEventRecordSummary { record_index: 0, live_entry_id: 22, @@ -15208,6 +15376,9 @@ mod tests { add_building_dispatch_strip_descriptor_labels: vec![], add_building_dispatch_strip_records_with_trigger_kind: 0, add_building_dispatch_strip_records_missing_trigger_kind: 0, + add_building_dispatch_strip_signature_families: vec![], + add_building_dispatch_strip_condition_tuple_families: vec![], + add_building_dispatch_strip_signature_condition_clusters: vec![], records: vec![crate::SmpLoadedPackedEventRecordSummary { record_index: 0, live_entry_id: 23, @@ -15352,6 +15523,9 @@ mod tests { add_building_dispatch_strip_descriptor_labels: vec![], add_building_dispatch_strip_records_with_trigger_kind: 0, add_building_dispatch_strip_records_missing_trigger_kind: 0, + add_building_dispatch_strip_signature_families: vec![], + add_building_dispatch_strip_condition_tuple_families: vec![], + add_building_dispatch_strip_signature_condition_clusters: vec![], records: vec![crate::SmpLoadedPackedEventRecordSummary { record_index: 0, live_entry_id: 25, @@ -15484,6 +15658,9 @@ mod tests { add_building_dispatch_strip_descriptor_labels: vec![], add_building_dispatch_strip_records_with_trigger_kind: 0, add_building_dispatch_strip_records_missing_trigger_kind: 0, + add_building_dispatch_strip_signature_families: vec![], + add_building_dispatch_strip_condition_tuple_families: vec![], + add_building_dispatch_strip_signature_condition_clusters: vec![], records: vec![crate::SmpLoadedPackedEventRecordSummary { record_index: 0, live_entry_id: 17, @@ -15690,6 +15867,9 @@ mod tests { add_building_dispatch_strip_descriptor_labels: vec![], add_building_dispatch_strip_records_with_trigger_kind: 0, add_building_dispatch_strip_records_missing_trigger_kind: 0, + add_building_dispatch_strip_signature_families: vec![], + add_building_dispatch_strip_condition_tuple_families: vec![], + add_building_dispatch_strip_signature_condition_clusters: vec![], records: vec![crate::SmpLoadedPackedEventRecordSummary { record_index: 0, live_entry_id: 7, @@ -15906,6 +16086,9 @@ mod tests { add_building_dispatch_strip_descriptor_labels: vec![], add_building_dispatch_strip_records_with_trigger_kind: 0, add_building_dispatch_strip_records_missing_trigger_kind: 0, + add_building_dispatch_strip_signature_families: vec![], + add_building_dispatch_strip_condition_tuple_families: vec![], + add_building_dispatch_strip_signature_condition_clusters: vec![], records: vec![crate::SmpLoadedPackedEventRecordSummary { record_index: 0, live_entry_id: 7, diff --git a/crates/rrt-runtime/src/smp.rs b/crates/rrt-runtime/src/smp.rs index dbb17ff..4a37a43 100644 --- a/crates/rrt-runtime/src/smp.rs +++ b/crates/rrt-runtime/src/smp.rs @@ -3988,6 +3988,12 @@ pub struct SmpLoadedEventRuntimeCollectionSummary { #[serde(default)] pub add_building_dispatch_strip_records_missing_trigger_kind: usize, #[serde(default)] + pub add_building_dispatch_strip_signature_families: Vec, + #[serde(default)] + pub add_building_dispatch_strip_condition_tuple_families: Vec, + #[serde(default)] + pub add_building_dispatch_strip_signature_condition_clusters: Vec, + #[serde(default)] pub control_lane_notes: Vec, #[serde(default)] pub records: Vec, @@ -9989,6 +9995,54 @@ fn parse_event_runtime_collection_summary_with_tag_width( .collect::>(); add_building_dispatch_strip_descriptor_labels.sort_unstable(); add_building_dispatch_strip_descriptor_labels.dedup(); + let mut add_building_dispatch_strip_signature_families = records + .iter() + .filter(|record| { + record.grouped_effect_rows.iter().any(|row| { + opcode_reaches_world_apply_compact_runtime_effect_dispatch_strip(row.opcode) + && compact_event_dispatch_add_building_descriptor_id(row.descriptor_id) + }) + }) + .map(|record| { + compact_event_signature_family_from_notes(&record.notes) + .unwrap_or_else(|| "unknown-signature-family".to_string()) + }) + .collect::>(); + add_building_dispatch_strip_signature_families.sort_unstable(); + add_building_dispatch_strip_signature_families.dedup(); + let mut add_building_dispatch_strip_condition_tuple_families = records + .iter() + .filter(|record| { + record.grouped_effect_rows.iter().any(|row| { + opcode_reaches_world_apply_compact_runtime_effect_dispatch_strip(row.opcode) + && compact_event_dispatch_add_building_descriptor_id(row.descriptor_id) + }) + }) + .map(|record| { + compact_event_dispatch_condition_tuple_family_from_summary_rows( + &record.standalone_condition_rows, + ) + }) + .collect::>(); + add_building_dispatch_strip_condition_tuple_families.sort_unstable(); + add_building_dispatch_strip_condition_tuple_families.dedup(); + let mut add_building_dispatch_strip_signature_condition_clusters = records + .iter() + .filter(|record| { + record.grouped_effect_rows.iter().any(|row| { + opcode_reaches_world_apply_compact_runtime_effect_dispatch_strip(row.opcode) + && compact_event_dispatch_add_building_descriptor_id(row.descriptor_id) + }) + }) + .map(|record| { + compact_event_dispatch_signature_condition_cluster_from_summary_rows( + compact_event_signature_family_from_notes(&record.notes).as_deref(), + &record.standalone_condition_rows, + ) + }) + .collect::>(); + add_building_dispatch_strip_signature_condition_clusters.sort_unstable(); + add_building_dispatch_strip_signature_condition_clusters.dedup(); let mut mutation_candidate_unknown_descriptor_ids = records .iter() .flat_map(|record| record.grouped_effect_rows.iter()) @@ -10120,6 +10174,18 @@ fn parse_event_runtime_collection_summary_with_tag_width( "decoded Add Building descriptor labels present in the 0x00431b20 dispatch strip = {:?}", add_building_dispatch_strip_descriptor_labels )); + control_lane_notes.push(format!( + "Add Building signature families present in the 0x00431b20 dispatch strip = {:?}", + add_building_dispatch_strip_signature_families + )); + control_lane_notes.push(format!( + "Add Building condition-tuple families present in the 0x00431b20 dispatch strip = {:?}", + add_building_dispatch_strip_condition_tuple_families + )); + control_lane_notes.push(format!( + "Add Building signature/condition clusters present in the 0x00431b20 dispatch strip = {:?}", + add_building_dispatch_strip_signature_condition_clusters + )); if add_building_dispatch_strip_records_with_trigger_kind == 0 { control_lane_notes.push( "every currently decoded Add Building dispatch-strip row still has null trigger kind, so the missing control-lane mapping remains the blocker above the already-grounded add-building descriptor bridge".to_string(), @@ -10157,6 +10223,9 @@ fn parse_event_runtime_collection_summary_with_tag_width( add_building_dispatch_strip_descriptor_labels, add_building_dispatch_strip_records_with_trigger_kind, add_building_dispatch_strip_records_missing_trigger_kind, + add_building_dispatch_strip_signature_families, + add_building_dispatch_strip_condition_tuple_families, + add_building_dispatch_strip_signature_condition_clusters, control_lane_notes, records, }); @@ -10173,6 +10242,40 @@ fn compact_event_dispatch_add_building_descriptor_id(descriptor_id: u32) -> bool (503..=613).contains(&descriptor_id) } +fn compact_event_signature_family_from_notes(notes: &[String]) -> Option { + notes.iter().find_map(|note| { + note.strip_prefix("compact signature family = ") + .map(ToString::to_string) + }) +} + +fn compact_event_dispatch_condition_tuple_family_from_summary_rows( + rows: &[SmpLoadedPackedEventConditionRowSummary], +) -> String { + if rows.is_empty() { + return "[]".to_string(); + } + let parts = rows + .iter() + .map(|row| match &row.metric { + Some(metric) => format!("{}:{}:{}", row.raw_condition_id, row.subtype, metric), + None => format!("{}:{}", row.raw_condition_id, row.subtype), + }) + .collect::>(); + format!("[{}]", parts.join(",")) +} + +fn compact_event_dispatch_signature_condition_cluster_from_summary_rows( + signature_family: Option<&str>, + rows: &[SmpLoadedPackedEventConditionRowSummary], +) -> String { + format!( + "{} :: {}", + signature_family.unwrap_or("unknown-signature-family"), + compact_event_dispatch_condition_tuple_family_from_summary_rows(rows) + ) +} + fn known_special_condition_label_for_compact_descriptor_id( descriptor_id: u32, ) -> Option<&'static str> { @@ -23066,6 +23169,21 @@ mod tests { .expect("non-direct event runtime collection summary should parse"); assert_eq!(summary.add_building_dispatch_strip_record_indexes, vec![0]); + assert_eq!( + summary.add_building_dispatch_strip_signature_families, + vec!["nondirect-ge1e-h0001-ffff-0004-0000-0200-p0000-0000-0000-ffff".to_string()] + ); + assert_eq!( + summary.add_building_dispatch_strip_condition_tuple_families, + vec!["[-1:4]".to_string()] + ); + assert_eq!( + summary.add_building_dispatch_strip_signature_condition_clusters, + vec![ + "nondirect-ge1e-h0001-ffff-0004-0000-0200-p0000-0000-0000-ffff :: [-1:4]" + .to_string() + ] + ); assert_eq!( summary.add_building_dispatch_strip_descriptor_labels, vec!["Add Building Port01".to_string()] @@ -23088,6 +23206,21 @@ mod tests { "decoded Add Building descriptor labels present in the 0x00431b20 dispatch strip = [\"Add Building Port01\"]", ) })); + assert!(summary.control_lane_notes.iter().any(|line| { + line.contains( + "Add Building signature families present in the 0x00431b20 dispatch strip = [\"nondirect-ge1e-h0001-ffff-0004-0000-0200-p0000-0000-0000-ffff\"]", + ) + })); + assert!(summary.control_lane_notes.iter().any(|line| { + line.contains( + "Add Building condition-tuple families present in the 0x00431b20 dispatch strip = [\"[-1:4]\"]", + ) + })); + assert!(summary.control_lane_notes.iter().any(|line| { + line.contains( + "Add Building signature/condition clusters present in the 0x00431b20 dispatch strip = [\"nondirect-ge1e-h0001-ffff-0004-0000-0200-p0000-0000-0000-ffff :: [-1:4]\"]", + ) + })); assert!(summary.control_lane_notes.iter().any(|line| { line.contains("every currently decoded Add Building dispatch-strip row still has null trigger kind") })); @@ -25872,6 +26005,9 @@ mod tests { add_building_dispatch_strip_descriptor_labels: vec![], add_building_dispatch_strip_records_with_trigger_kind: 0, add_building_dispatch_strip_records_missing_trigger_kind: 0, + add_building_dispatch_strip_signature_families: vec![], + add_building_dispatch_strip_condition_tuple_families: vec![], + add_building_dispatch_strip_signature_condition_clusters: vec![], control_lane_notes: vec![], records: build_unsupported_event_runtime_record_summaries(&[1, 3, 5], "test summary"), }); diff --git a/docs/rehost-queue.md b/docs/rehost-queue.md index 5b23f3d..181312e 100644 --- a/docs/rehost-queue.md +++ b/docs/rehost-queue.md @@ -301,6 +301,18 @@ Working rule: `add_building_dispatch_strip_records_missing_trigger_kind` counts, so inspected maps can now show whether `Add Building` rows are present and still null-trigger without a separate cluster pass + - that add-building subset is structured one layer deeper now too: + the per-map summary and the compact-dispatch cluster/counts reports both surface + add-building signature families, condition-tuple families, and combined + signature/condition clusters, so the remaining trigger-kind/source question can compare exact + compact subfamilies instead of only raw descriptor hits + - the first concrete add-building cluster split is now visible too: + targeted map inspections show `Texas Tea.gmp` carrying a one-row `Port01` cluster on + signature family `nondirect-ge1e-h0001-0007-0000-6d00-0200-p0000-0000-0000-ffff` with + condition family `[7:0]`, while `Alternate USA.gmp` carries repeated three-row + `FarmGrain`/`Logging Camp` clusters on `nondirect-ge34-h0002-0007-0004-73|75|7b|85...` with + condition family `[7:4,42:0]`; that narrows the remaining trigger-kind/source question to a + small set of compact subfamilies rather than a single undifferentiated add-building carrier - the same probe now narrows the candidate runtime-effect set too: it reports which decoded records already carry grouped opcodes in the grounded `0x00431b20` dispatch strip; real `War Effort.gmp` currently narrows that to record indexes