Expose save-side placed-structure triplets

This commit is contained in:
Jan Petykiewicz 2026-04-18 22:16:57 -07:00
commit 2d6efc7c59
3 changed files with 101 additions and 2 deletions

View file

@ -3611,6 +3611,12 @@ pub struct SmpSavePlacedStructureNonzeroCompanionNamePairSummaryEntry {
pub count: usize,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct SmpSavePlacedStructurePolicyTrailingWordSummaryEntry {
pub policy_trailing_word_hex: String,
pub count: usize,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct SmpPeriodicCompanyServiceTraceReport {
pub profile_family: String,
@ -3647,6 +3653,9 @@ pub struct SmpPeriodicCompanyServiceTraceReport {
pub peer_site_selector_candidate_saved_companion_byte_summaries:
Vec<SmpSavePlacedStructureProfileCompanionByteSummaryEntry>,
#[serde(default)]
pub peer_site_selector_candidate_saved_policy_trailing_word_summaries:
Vec<SmpSavePlacedStructurePolicyTrailingWordSummaryEntry>,
#[serde(default)]
pub peer_site_selector_candidate_saved_nonzero_companion_name_pair_summaries:
Vec<SmpSavePlacedStructureNonzeroCompanionNamePairSummaryEntry>,
#[serde(default)]
@ -4428,6 +4437,37 @@ fn summarize_peer_site_selector_candidate_saved_companion_bytes(
summaries
}
fn summarize_peer_site_selector_candidate_saved_policy_trailing_words(
analysis: &SmpSaveCompanyChairmanAnalysisReport,
) -> Vec<SmpSavePlacedStructurePolicyTrailingWordSummaryEntry> {
let Some(triplets) = analysis.placed_structure_record_triplets.as_ref() else {
return Vec::new();
};
let mut grouped = BTreeMap::<String, usize>::new();
for entry in &triplets.entries {
*grouped
.entry(entry.policy_trailing_word_hex.clone())
.or_insert(0) += 1;
}
let mut summaries = grouped
.into_iter()
.map(|(policy_trailing_word_hex, count)| {
SmpSavePlacedStructurePolicyTrailingWordSummaryEntry {
policy_trailing_word_hex,
count,
}
})
.collect::<Vec<_>>();
summaries.sort_by(|left, right| {
right.count.cmp(&left.count).then_with(|| {
left.policy_trailing_word_hex
.cmp(&right.policy_trailing_word_hex)
})
});
summaries.truncate(8);
summaries
}
fn summarize_peer_site_selector_candidate_saved_nonzero_companion_name_pairs(
analysis: &SmpSaveCompanyChairmanAnalysisReport,
) -> Vec<SmpSavePlacedStructureNonzeroCompanionNamePairSummaryEntry> {
@ -4510,6 +4550,8 @@ fn build_periodic_company_service_trace_report(
summarize_peer_site_selector_candidate_saved_footer_padding(analysis);
let peer_site_selector_candidate_saved_companion_byte_summaries =
summarize_peer_site_selector_candidate_saved_companion_bytes(analysis);
let peer_site_selector_candidate_saved_policy_trailing_word_summaries =
summarize_peer_site_selector_candidate_saved_policy_trailing_words(analysis);
let peer_site_selector_candidate_saved_nonzero_companion_name_pair_summaries =
summarize_peer_site_selector_candidate_saved_nonzero_companion_name_pairs(analysis);
let peer_site_restore_input_fields = vec![
@ -4975,7 +5017,7 @@ fn build_periodic_company_service_trace_report(
);
if !peer_site_selector_candidate_saved_payload_summaries.is_empty() {
notes.push(format!(
"The periodic-company trace now also carries a compact save-side summary of the tagged 0x5dc1 placed-structure profile payload/status pairs already parsed from the 0x36b1 triplet seam; dominant current pair is {} / {} x{}, dominant adjacent payload delta is {:?}, dominant post-secondary byte is {:?}, and dominant pre-footer padding len is {:?}.",
"The periodic-company trace now also carries a compact save-side summary of the tagged 0x5dc1 placed-structure profile payload/status pairs already parsed from the 0x36b1 triplet seam; dominant current pair is {} / {} x{}, dominant adjacent payload delta is {:?}, dominant post-secondary byte is {:?}, dominant fixed-policy trailing word is {:?}, and dominant pre-footer padding len is {:?}.",
peer_site_selector_candidate_saved_payload_summaries[0].profile_payload_dword_hex,
peer_site_selector_candidate_saved_payload_summaries[0].profile_status_kind,
peer_site_selector_candidate_saved_payload_summaries[0].count,
@ -4985,6 +5027,9 @@ fn build_periodic_company_service_trace_report(
peer_site_selector_candidate_saved_companion_byte_summaries
.first()
.map(|entry| entry.companion_byte_hex.as_str()),
peer_site_selector_candidate_saved_policy_trailing_word_summaries
.first()
.map(|entry| entry.policy_trailing_word_hex.as_str()),
peer_site_selector_candidate_saved_footer_padding_summaries
.first()
.map(|entry| entry.padding_len)
@ -5004,6 +5049,19 @@ fn build_periodic_company_service_trace_report(
notes.push(
"Direct disassembly now also separates the narrower peer-class gate from that payload residue: 0x0047fd50 resolves the linked peer through [site+0x04], reads candidate class byte [candidate+0x8c], and returns true only for values 0/1/2 while rejecting 3/4 and above. That means the newly isolated post-secondary byte is not the already-grounded station-or-transit class gate itself; it remains a separate saved discriminator above the restored name-pair payload.".to_string(),
);
if let (Some(dominant_companion), Some(dominant_trailing_word)) = (
peer_site_selector_candidate_saved_companion_byte_summaries.first(),
peer_site_selector_candidate_saved_policy_trailing_word_summaries.first(),
) {
notes.push(format!(
"The same focused 0x36b1 triplet probe now also keeps the fixed-policy trailing word narrow at {} x{} while the profile side stays dominated by companion byte {} and payload/status pair {} / {}. Together that keeps the checked-in triplet seam looking like local structure/profile state rather than the missing acquisition owner-company lane [site+0x276] or cached tri-lane [site+0x310/+0x338/+0x360].",
dominant_trailing_word.policy_trailing_word_hex,
dominant_trailing_word.count,
dominant_companion.companion_byte_hex,
peer_site_selector_candidate_saved_payload_summaries[0].profile_payload_dword_hex,
peer_site_selector_candidate_saved_payload_summaries[0].profile_status_kind,
));
}
notes.push(
"The replay strip is tighter now too. 0x00444690 is the current late world bring-up caller of 0x004133b0, that outer owner drains queued site ids through 0x0040e450 and then sweeps every live placed structure through 0x0040ee10, and 0x0040ee10 itself reaches 0x0040edf6 -> 0x00480710 plus the later 0x0040e360 follow-on. A separate runtime path at 0x004160aa also re-enters 0x0040ee10 later. So [peer+0x08] replay is no longer the open question, and [site+0x04] is no longer an owner mystery either: the local linked-site helper strip seeds [site+0x3cc/+0x3d0] from 0x62b2fc / 0x62b268, reaches the save-backed 0x0045c150 / 0x0045c310 owner directly, that owner fills [owner+0x23e/+0x242] from tagged payload 0x5dc1, and 0x0045c36e then feeds [owner+0x23e] through 0x00456100 -> 0x00455b70 -> 0x0052edf0 into [site+0x04]. The remaining non-hook target is now the smaller shellless-simulation question: which subset of those persisted site/peer fields is actually sufficient to run 0x004014b0 and its city-connection sibling without shell state.".to_string(),
);
@ -5027,6 +5085,7 @@ fn build_periodic_company_service_trace_report(
peer_site_selector_candidate_saved_payload_delta_summaries,
peer_site_selector_candidate_saved_footer_padding_summaries,
peer_site_selector_candidate_saved_companion_byte_summaries,
peer_site_selector_candidate_saved_policy_trailing_word_summaries,
peer_site_selector_candidate_saved_nonzero_companion_name_pair_summaries,
peer_site_restore_input_fields,
peer_site_runtime_input_fields,
@ -28021,6 +28080,15 @@ mod tests {
trace.peer_site_selector_candidate_saved_companion_byte_summaries[0].companion_byte_hex,
"0x00"
);
assert_eq!(
trace.peer_site_selector_candidate_saved_policy_trailing_word_summaries[0]
.policy_trailing_word_hex,
"0x0101"
);
assert_eq!(
trace.peer_site_selector_candidate_saved_policy_trailing_word_summaries[0].count,
2
);
assert_eq!(
trace.peer_site_selector_candidate_saved_nonzero_companion_name_pair_summaries[0]
.primary_name,