Expose save-side placed-structure triplets
This commit is contained in:
parent
49ee76ef2a
commit
2d6efc7c59
3 changed files with 101 additions and 2 deletions
|
|
@ -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,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue