Ground infrastructure child construction strip
This commit is contained in:
parent
a6ace52588
commit
e80f7333f0
3 changed files with 156 additions and 78 deletions
|
|
@ -1989,7 +1989,8 @@ pub struct SmpSavePlacedStructureDynamicSideBufferDominantProfileSpanClassSummar
|
|||
#[serde(default)]
|
||||
pub sample_rows: Vec<SmpSavePlacedStructureDynamicSideBufferDominantProfileSpanSample>,
|
||||
#[serde(default)]
|
||||
pub name_pair_summaries: Vec<SmpSavePlacedStructureDynamicSideBufferDominantProfileSpanNamePairSummary>,
|
||||
pub name_pair_summaries:
|
||||
Vec<SmpSavePlacedStructureDynamicSideBufferDominantProfileSpanNamePairSummary>,
|
||||
#[serde(default)]
|
||||
pub compact_prefix_pattern_summaries:
|
||||
Vec<SmpSavePlacedStructureDynamicSideBufferDominantProfileSpanPrefixSummary>,
|
||||
|
|
@ -4296,9 +4297,11 @@ fn build_infrastructure_asset_trace_report(
|
|||
"0x004a2c80/0x004a34e0 paired upstream infrastructure composition choosers with decoded DT/ST table families plus BallastCap/Overpass literals".to_string(),
|
||||
"0x0048a340 infrastructure chooser selector setter for [0x226]/[0x219]/[0x251]/bit 0x20".to_string(),
|
||||
"0x0048a6c0 per-entry serializer for outer child-count / primary-child prelude and child payload callbacks".to_string(),
|
||||
"0x00490960 infrastructure child constructor / selector propagator".to_string(),
|
||||
"0x00455a40 raw vtable slot +0x44 dispatch wrapper".to_string(),
|
||||
"0x00455a50 raw vtable slot +0x40 dispatch wrapper with global bridge reset".to_string(),
|
||||
"0x004559d0 tagged child payload serializer for 0x55f1/0x55f2/0x55f3".to_string(),
|
||||
"0x00490200 infrastructure seeded-lane route/link comparator".to_string(),
|
||||
"0x00518140 indexed_collection_resolve_live_entry_payload_pointer_by_live_id".to_string(),
|
||||
"0x005181f0 indexed_collection_unlink_non_direct_live_entry".to_string(),
|
||||
"0x00518260 indexed_collection_link_non_direct_live_entry".to_string(),
|
||||
|
|
@ -4313,7 +4316,7 @@ fn build_infrastructure_asset_trace_report(
|
|||
"0x0048e140 / 0x0048e160 / 0x0048e180 route-entry resolver helpers".to_string(),
|
||||
];
|
||||
let next_owner_questions = vec![
|
||||
"With 0x00491c60, 0x0048a6c0, 0x00455a40, and 0x004559d0 now grounded as the full write-side dispatch chain for the `0x38a5/0x38a6/0x38a7` family, how do the selector values set by 0x0048a340 surface in the seeded string lanes [this+0x206/+0x20a/+0x20e], the vtable slot +0x4c serializer, and the trailing 0x52ec50 footer path before the grounded pure bridge-section class 0x0002/0xff reaches the two-child clone-path above 0x0048a1e0 and 0x0048dcf0?".to_string(),
|
||||
"With 0x00491c60, 0x0048a6c0, 0x00490960, 0x00455a40, and 0x004559d0 now grounded as the full child-construction and write-side dispatch chain for the `0x38a5/0x38a6/0x38a7` family, which chooser branches feed 0x00490960 its caller-supplied stem and selector arguments before they surface in the seeded lanes [this+0x206/+0x20a/+0x20e], the slot +0x4c serializer, and the trailing 0x52ec50 footer path?".to_string(),
|
||||
"Inside the grounded overpass/ballast branch ([this+0x226]==3) of the paired chooser siblings, when do the fixed BallastCap and Overpass literals (0x5cb138/0x5cb150 and 0x5cb168/0x5cb180) fire, and does the pure BallastCap class 0x0055/0x00 stay a boundary artifact or become a real outer prelude consumed by 0x0048dcf0?".to_string(),
|
||||
"Which 0x38a5 embedded name-pair groups survive into the per-child vtable +0x40 payload callbacks dispatched through 0x00455a50?".to_string(),
|
||||
"Is cached primary-child slot [this+0x248] the first owner-visible bridge from the restored child stream into route-entry rebuild once the bridge two-child class is isolated?".to_string(),
|
||||
|
|
@ -4351,6 +4354,9 @@ fn build_infrastructure_asset_trace_report(
|
|||
"direct disassembly now also shows 0x0048a6c0 serializing the outer per-record prelude directly: it writes the current child count as a u16, writes the saved primary-child ordinal byte derived from [this+0x248], and then serializes each child through 0x00455a40".to_string(),
|
||||
"local .rdata at 0x005cfd00 now also proves the missing write-side slot directly: for Infrastructure children, 0x00455a40 lands on vtable slot +0x44 = 0x004559d0, alongside +0x40 = 0x00455fc0, +0x48 = 0x00455870, and +0x4c = 0x00455930".to_string(),
|
||||
"direct disassembly now also shows 0x004559d0 writing 0x55f1, serializing the three string lanes [this+0x206/+0x20a/+0x20e], writing 0x55f2, dispatching slot +0x4c, re-entering 0x52ec50, and then writing the closing 0x55f3 tag".to_string(),
|
||||
"direct disassembly now also shows the paired chooser siblings calling 0x00490960 directly on the child-construction side, alongside 0x0048a340, 0x0048f4c0, and 0x00490200".to_string(),
|
||||
"direct disassembly now also shows 0x00490960 copying selector fields into the child object ([this+0x219], [this+0x251], bit 0x20 in [this+0x24c], and [this+0x226]), allocating a fresh 0x23a Infrastructure child, seeding it through 0x00455b70 with caller-supplied stem input plus fixed literal Infrastructure at 0x005cfd74, attaching it through 0x005395d0, seeding position lanes through 0x00539530/0x0053a5b0, and optionally caching it as primary child in [this+0x248]".to_string(),
|
||||
"direct disassembly now also shows 0x00490200 reading the seeded lanes [this+0x206/+0x20a/+0x20e] back through the live route collection at 0x006cfca8, classifying peer relationships with [this+0x216/+0x218/+0x201/+0x202], and therefore acting as a route/link comparator above the same child payload fields that 0x004559d0 later serializes".to_string(),
|
||||
"the chooser tables now decode to concrete asset families too: 0x621a44/0x621a54 feed BridgeST caps/sections, 0x621a64 feeds TunnelST cap/section variants, 0x621a74/0x621a84 feed BridgeDT caps/sections, and 0x621a94 feeds TunnelDT variants; fixed literals 0x5cb138/0x5cb150 are BallastCapDT/ST and 0x5cb168/0x5cb180 are OverpassDT/ST".to_string(),
|
||||
"the top-level chooser branches are grounded now too: [this+0x226]==1 routes bridge families, [this+0x226]==2 routes tunnel families, [this+0x226]==3 routes overpass/ballast families, and bit 0x20 in [this+0x24c] selects the cap-oriented side over the section-oriented side inside those DT/ST siblings".to_string(),
|
||||
"direct disassembly now also shows 0x0048a340 as the exact chooser-state setter: its dword argument writes [this+0x226], its next two byte arguments write [this+0x219] and [this+0x251], and its final byte argument toggles bit 0x20 in [this+0x24c]".to_string(),
|
||||
|
|
@ -4682,10 +4688,10 @@ fn build_infrastructure_asset_trace_report(
|
|||
"the smaller attach primitive 0x00490a3c no longer looks like the semantic fork by itself: it just allocates one literal Infrastructure child, seeds it through 0x455b70 with caller-provided stem input, attaches it through 0x5395d0, seeds position lanes through 0x539530/0x53a5b0, and optionally caches it as primary child".to_string(),
|
||||
],
|
||||
blockers: vec![
|
||||
"how the selector values written through the exact setter 0x0048a340 to [this+0x226]/[this+0x219]/[this+0x251]/bit 0x20 surface in the concrete 0x004559d0 child payload serializer through the seeded string lanes [this+0x206/+0x20a/+0x20e], slot +0x4c, and the trailing 0x52ec50 footer path, and therefore in the save-side 0x38a5 compact-prefix and name-pair classes, especially the bridge-only 0x0002/0xff class and the BallastCap-only 0x0055/0x00 class, now that [this+0x252] is partly grounded as the suspension-cap radius/handedness selector".to_string(),
|
||||
"which exact chooser branches and caller-supplied stem arguments feed 0x00490960 before the exact setter 0x0048a340 values ([this+0x226]/[this+0x219]/[this+0x251]/bit 0x20) surface in the concrete 0x004559d0 child payload serializer through the seeded lanes [this+0x206/+0x20a/+0x20e], slot +0x4c, and the trailing 0x52ec50 footer path, and therefore in the save-side 0x38a5 compact-prefix and name-pair classes, especially the bridge-only 0x0002/0xff class and the BallastCap-only 0x0055/0x00 class, now that [this+0x252] is partly grounded as the suspension-cap radius/handedness selector".to_string(),
|
||||
"how the payload streams reached through 0x00518380 -> 0x00518140 align with the embedded 0x55f1 name-pair groups and compact-prefix regimes surfaced by the save-side probe".to_string(),
|
||||
"how the observed 0x55f3-to-next-0x55f1 gaps partition between the two 0x52ebd0 flag bytes and the next-record prelude now that 0x0048a6c0 is grounded as the writer for the outer child-count / primary-child prelude".to_string(),
|
||||
"which fields written through the grounded 0x004559d0 -> slot +0x4c -> 0x52ec50 chain retain the 0x38a5 embedded name-pair semantics before route/local-runtime follow-ons take over".to_string(),
|
||||
"which fields written through the grounded 0x00490960 -> 0x004559d0 -> slot +0x4c -> 0x52ec50 chain retain the 0x38a5 embedded name-pair semantics before route/local-runtime follow-ons take over".to_string(),
|
||||
],
|
||||
},
|
||||
SmpServiceConsumerHypothesis {
|
||||
|
|
@ -4797,7 +4803,7 @@ fn build_infrastructure_asset_trace_report(
|
|||
),
|
||||
];
|
||||
let notes = vec![
|
||||
"Infrastructure asset trace now makes the side-buffer-versus-triplet split explicit: owner seam identity is grounded, the pure bridge-only 0x0002/0xff candidate class is grounded save-side, the upstream chooser above the child attach path is grounded as paired DT/ST siblings at 0x004a2c80 and 0x004a34e0 with decoded Bridge/Tunnel/BallastCap/Overpass families, grounded top-level branch meaning, and grounded bridge/tunnel material selector roles, and the writer side is now grounded through 0x00491c60, 0x0048a6c0, 0x00455a40, and concrete child serializer 0x004559d0; the remaining unknown is how those selector values surface in the seeded string lanes, slot +0x4c payload, and trailing footer path inside the save-side classes.".to_string(),
|
||||
"Infrastructure asset trace now makes the side-buffer-versus-triplet split explicit: owner seam identity is grounded, the pure bridge-only 0x0002/0xff candidate class is grounded save-side, the upstream chooser above the child attach path is grounded as paired DT/ST siblings at 0x004a2c80 and 0x004a34e0 with decoded Bridge/Tunnel/BallastCap/Overpass families, grounded top-level branch meaning, grounded bridge/tunnel material selector roles, and a concrete child-construction/write-side chain through 0x00490960, 0x00491c60, 0x0048a6c0, 0x00455a40, and 0x004559d0; the remaining unknown is which chooser branches and caller-supplied stem values feed that chain before the seeded lanes, slot +0x4c payload, and trailing footer path collapse into the save-side classes.".to_string(),
|
||||
if st_only_name_pair_corpus {
|
||||
"The current save-side side-buffer corpus is ST-only, so this trace directly exercises the ST chooser sibling while the DT sibling remains grounded statically but unexercised in this save.".to_string()
|
||||
} else {
|
||||
|
|
@ -13217,13 +13223,11 @@ fn parse_save_placed_structure_dynamic_side_buffer_probe(
|
|||
row.secondary_name.clone(),
|
||||
child_count_candidate,
|
||||
saved_primary_child_byte_candidate,
|
||||
row_index
|
||||
.checked_sub(1)
|
||||
.and_then(|previous_index| {
|
||||
payload_envelope_rows
|
||||
.get(previous_index)
|
||||
.and_then(|row| row.profile_chunk_len_to_next_name_or_end)
|
||||
}),
|
||||
row_index.checked_sub(1).and_then(|previous_index| {
|
||||
payload_envelope_rows
|
||||
.get(previous_index)
|
||||
.and_then(|row| row.profile_chunk_len_to_next_name_or_end)
|
||||
}),
|
||||
))
|
||||
})
|
||||
.collect::<Vec<_>>();
|
||||
|
|
@ -13279,8 +13283,10 @@ fn parse_save_placed_structure_dynamic_side_buffer_probe(
|
|||
.then_with(|| right_key.cmp(left_key))
|
||||
})
|
||||
.map(|(value, count)| (*value, *count));
|
||||
let mut name_prelude_pattern_groups =
|
||||
BTreeMap::<(u16, u8), Vec<(usize, Option<String>, Option<String>, Option<usize>)>>::new();
|
||||
let mut name_prelude_pattern_groups = BTreeMap::<
|
||||
(u16, u8),
|
||||
Vec<(usize, Option<String>, Option<String>, Option<usize>)>,
|
||||
>::new();
|
||||
for (
|
||||
name_tag_relative_offset,
|
||||
primary_name,
|
||||
|
|
@ -13398,8 +13404,7 @@ fn parse_save_placed_structure_dynamic_side_buffer_probe(
|
|||
)
|
||||
.take(8)
|
||||
.collect::<Vec<_>>();
|
||||
let mut name_prelude_profile_span_groups =
|
||||
BTreeMap::<usize, Vec<(u16, u8)>>::new();
|
||||
let mut name_prelude_profile_span_groups = BTreeMap::<usize, Vec<(u16, u8)>>::new();
|
||||
for (_, _, _, child_count_candidate, saved_primary_child_byte_candidate, previous_span) in
|
||||
&name_prelude_candidate_rows
|
||||
{
|
||||
|
|
@ -13420,7 +13425,9 @@ fn parse_save_placed_structure_dynamic_side_buffer_probe(
|
|||
*pattern_counts
|
||||
.entry((*child_count_candidate, *saved_primary_child_byte_candidate))
|
||||
.or_default() += 1;
|
||||
*child_count_counts.entry(*child_count_candidate).or_default() += 1;
|
||||
*child_count_counts
|
||||
.entry(*child_count_candidate)
|
||||
.or_default() += 1;
|
||||
*saved_primary_counts
|
||||
.entry(*saved_primary_child_byte_candidate)
|
||||
.or_default() += 1;
|
||||
|
|
@ -13436,9 +13443,7 @@ fn parse_save_placed_structure_dynamic_side_buffer_probe(
|
|||
|((child_count_candidate, saved_primary_child_byte_candidate), count)| {
|
||||
SmpSavePlacedStructureDynamicSideBufferNamePreludeCandidatePattern {
|
||||
child_count_candidate: *child_count_candidate,
|
||||
child_count_candidate_hex: format!(
|
||||
"0x{child_count_candidate:04x}"
|
||||
),
|
||||
child_count_candidate_hex: format!("0x{child_count_candidate:04x}"),
|
||||
saved_primary_child_byte_candidate:
|
||||
*saved_primary_child_byte_candidate,
|
||||
saved_primary_child_byte_candidate_hex: format!(
|
||||
|
|
@ -13483,8 +13488,8 @@ fn parse_save_placed_structure_dynamic_side_buffer_probe(
|
|||
})
|
||||
.take(8)
|
||||
.collect::<Vec<_>>();
|
||||
let name_prelude_candidate_summary =
|
||||
Some(SmpSavePlacedStructureDynamicSideBufferNamePreludeCandidateSummary {
|
||||
let name_prelude_candidate_summary = Some(
|
||||
SmpSavePlacedStructureDynamicSideBufferNamePreludeCandidateSummary {
|
||||
row_count_with_candidate_window: name_prelude_candidate_rows.len(),
|
||||
unique_candidate_pattern_count: name_prelude_candidate_pattern_counts.len(),
|
||||
dominant_child_count_candidate: dominant_name_prelude_child_count
|
||||
|
|
@ -13492,11 +13497,10 @@ fn parse_save_placed_structure_dynamic_side_buffer_probe(
|
|||
dominant_child_count_candidate_count: dominant_name_prelude_child_count
|
||||
.map(|(_, count)| count)
|
||||
.unwrap_or_default(),
|
||||
dominant_saved_primary_child_byte_candidate:
|
||||
dominant_name_prelude_saved_primary.map(|(value, _)| value),
|
||||
dominant_saved_primary_child_byte_candidate: dominant_name_prelude_saved_primary
|
||||
.map(|(value, _)| value),
|
||||
dominant_saved_primary_child_byte_candidate_hex:
|
||||
dominant_name_prelude_saved_primary
|
||||
.map(|(value, _)| format!("0x{value:02x}")),
|
||||
dominant_name_prelude_saved_primary.map(|(value, _)| format!("0x{value:02x}")),
|
||||
dominant_saved_primary_child_byte_candidate_count:
|
||||
dominant_name_prelude_saved_primary
|
||||
.map(|(_, count)| count)
|
||||
|
|
@ -13526,9 +13530,7 @@ fn parse_save_placed_structure_dynamic_side_buffer_probe(
|
|||
primary_name: primary_name.clone(),
|
||||
secondary_name: secondary_name.clone(),
|
||||
child_count_candidate: *child_count_candidate,
|
||||
child_count_candidate_hex: format!(
|
||||
"0x{child_count_candidate:04x}"
|
||||
),
|
||||
child_count_candidate_hex: format!("0x{child_count_candidate:04x}"),
|
||||
saved_primary_child_byte_candidate:
|
||||
*saved_primary_child_byte_candidate,
|
||||
saved_primary_child_byte_candidate_hex: format!(
|
||||
|
|
@ -13540,7 +13542,8 @@ fn parse_save_placed_structure_dynamic_side_buffer_probe(
|
|||
},
|
||||
)
|
||||
.collect(),
|
||||
});
|
||||
},
|
||||
);
|
||||
let dominant_profile_span_class_summary = dominant_profile_chunk_len
|
||||
.map(|(dominant_profile_span_len, _)| {
|
||||
let dominant_rows = embedded_name_rows
|
||||
|
|
@ -24385,35 +24388,50 @@ mod tests {
|
|||
assert!(trace.side_buffer_present);
|
||||
assert_eq!(trace.triplet_alignment_overlap_count, 0);
|
||||
assert_eq!(trace.known_owner_bridge_fields.len(), 7);
|
||||
assert_eq!(trace.known_bridge_helpers.len(), 19);
|
||||
assert_eq!(trace.known_bridge_helpers.len(), 21);
|
||||
assert_eq!(trace.next_owner_questions.len(), 4);
|
||||
assert!(trace
|
||||
.next_owner_questions
|
||||
.iter()
|
||||
.any(|line| line.contains("selector values set by 0x0048a340")
|
||||
assert!(trace.next_owner_questions.iter().any(|line| {
|
||||
line.contains("0x00490960")
|
||||
&& line.contains("0x004559d0")
|
||||
&& line.contains("0x0002/0xff")
|
||||
&& line.contains("two-child clone-path")));
|
||||
assert!(trace
|
||||
.known_bridge_helpers
|
||||
.iter()
|
||||
.any(|line| line.contains("0x004a2c80/0x004a34e0")
|
||||
&& line.contains("[this+0x206/+0x20a/+0x20e]")
|
||||
&& line.contains("0x52ec50")
|
||||
}));
|
||||
assert!(trace.known_bridge_helpers.iter().any(
|
||||
|line| line.contains("0x004a2c80/0x004a34e0")
|
||||
&& line.contains("paired upstream infrastructure composition choosers")
|
||||
&& line.contains("BallastCap/Overpass")));
|
||||
assert!(trace
|
||||
.known_bridge_helpers
|
||||
.iter()
|
||||
.any(|line| line.contains("0x0048a340")
|
||||
&& line.contains("[0x226]/[0x219]/[0x251]/bit 0x20")));
|
||||
assert!(trace
|
||||
.known_bridge_helpers
|
||||
.iter()
|
||||
.any(|line| line.contains("0x00455a40") && line.contains("slot +0x44")));
|
||||
assert!(trace
|
||||
.known_bridge_helpers
|
||||
.iter()
|
||||
.any(|line| line.contains("0x004559d0")
|
||||
&& line.contains("0x55f1/0x55f2/0x55f3")));
|
||||
&& line.contains("BallastCap/Overpass")
|
||||
));
|
||||
assert!(
|
||||
trace
|
||||
.known_bridge_helpers
|
||||
.iter()
|
||||
.any(|line| line.contains("0x0048a340")
|
||||
&& line.contains("[0x226]/[0x219]/[0x251]/bit 0x20"))
|
||||
);
|
||||
assert!(
|
||||
trace
|
||||
.known_bridge_helpers
|
||||
.iter()
|
||||
.any(|line| line.contains("0x00455a40") && line.contains("slot +0x44"))
|
||||
);
|
||||
assert!(
|
||||
trace
|
||||
.known_bridge_helpers
|
||||
.iter()
|
||||
.any(|line| line.contains("0x004559d0") && line.contains("0x55f1/0x55f2/0x55f3"))
|
||||
);
|
||||
assert!(
|
||||
trace
|
||||
.known_bridge_helpers
|
||||
.iter()
|
||||
.any(|line| line.contains("0x00490960") && line.contains("selector propagator"))
|
||||
);
|
||||
assert!(
|
||||
trace
|
||||
.known_bridge_helpers
|
||||
.iter()
|
||||
.any(|line| line.contains("0x00490200") && line.contains("route/link comparator"))
|
||||
);
|
||||
assert_eq!(trace.candidate_consumer_hypotheses.len(), 3);
|
||||
assert_eq!(
|
||||
trace.candidate_consumer_hypotheses[0].status,
|
||||
|
|
@ -24440,28 +24458,34 @@ mod tests {
|
|||
trace.candidate_consumer_hypotheses[0]
|
||||
.evidence
|
||||
.iter()
|
||||
.any(|line| line.contains("[this+0x226]==1 routes bridge families")
|
||||
&& line.contains("[this+0x226]==2 routes tunnel families")
|
||||
&& line.contains("[this+0x226]==3 routes overpass/ballast families")
|
||||
&& line.contains("bit 0x20 in [this+0x24c]"))
|
||||
.any(
|
||||
|line| line.contains("[this+0x226]==1 routes bridge families")
|
||||
&& line.contains("[this+0x226]==2 routes tunnel families")
|
||||
&& line.contains("[this+0x226]==3 routes overpass/ballast families")
|
||||
&& line.contains("bit 0x20 in [this+0x24c]")
|
||||
)
|
||||
);
|
||||
assert!(
|
||||
trace.candidate_consumer_hypotheses[0]
|
||||
.evidence
|
||||
.iter()
|
||||
.any(|line| line.contains("0x0048a340 as the exact chooser-state setter")
|
||||
&& line.contains("[this+0x226]")
|
||||
&& line.contains("[this+0x219]")
|
||||
&& line.contains("[this+0x251]")
|
||||
&& line.contains("[this+0x24c]"))
|
||||
.any(
|
||||
|line| line.contains("0x0048a340 as the exact chooser-state setter")
|
||||
&& line.contains("[this+0x226]")
|
||||
&& line.contains("[this+0x219]")
|
||||
&& line.contains("[this+0x251]")
|
||||
&& line.contains("[this+0x24c]")
|
||||
)
|
||||
);
|
||||
assert!(
|
||||
trace.candidate_consumer_hypotheses[0]
|
||||
.evidence
|
||||
.iter()
|
||||
.any(|line| line.contains("[this+0x219] indexes Steel/Stone/Wood tables")
|
||||
&& line.contains("value 2 takes the special suspension-cap path")
|
||||
&& line.contains("[this+0x251] selects Brick versus Concrete"))
|
||||
.any(
|
||||
|line| line.contains("[this+0x219] indexes Steel/Stone/Wood tables")
|
||||
&& line.contains("value 2 takes the special suspension-cap path")
|
||||
&& line.contains("[this+0x251] selects Brick versus Concrete")
|
||||
)
|
||||
);
|
||||
assert!(
|
||||
trace.candidate_consumer_hypotheses[0]
|
||||
|
|
@ -24485,9 +24509,11 @@ mod tests {
|
|||
trace.candidate_consumer_hypotheses[0]
|
||||
.evidence
|
||||
.iter()
|
||||
.any(|line| line.contains("bridge-only two-child class is now grounded save-side")
|
||||
&& line.contains("0x0002")
|
||||
&& line.contains("BridgeSTWood_Section.3dp"))
|
||||
.any(
|
||||
|line| line.contains("bridge-only two-child class is now grounded save-side")
|
||||
&& line.contains("0x0002")
|
||||
&& line.contains("BridgeSTWood_Section.3dp")
|
||||
)
|
||||
);
|
||||
assert!(
|
||||
trace.candidate_consumer_hypotheses[0]
|
||||
|
|
@ -24506,6 +24532,32 @@ mod tests {
|
|||
&& line.contains("0x52ec50")
|
||||
&& line.contains("0x55f3"))
|
||||
);
|
||||
assert!(
|
||||
trace.candidate_consumer_hypotheses[0]
|
||||
.evidence
|
||||
.iter()
|
||||
.any(|line| line.contains("chooser siblings calling 0x00490960 directly")
|
||||
&& line.contains("0x0048a340")
|
||||
&& line.contains("0x0048f4c0")
|
||||
&& line.contains("0x00490200"))
|
||||
);
|
||||
assert!(
|
||||
trace.candidate_consumer_hypotheses[0]
|
||||
.evidence
|
||||
.iter()
|
||||
.any(|line| line.contains("0x00490960 copying selector fields into the child object")
|
||||
&& line.contains("0x00455b70")
|
||||
&& line.contains("0x005cfd74")
|
||||
&& line.contains("[this+0x248]"))
|
||||
);
|
||||
assert!(
|
||||
trace.candidate_consumer_hypotheses[0]
|
||||
.evidence
|
||||
.iter()
|
||||
.any(|line| line.contains("0x00490200 reading the seeded lanes")
|
||||
&& line.contains("0x006cfca8")
|
||||
&& line.contains("[this+0x216/+0x218/+0x201/+0x202]"))
|
||||
);
|
||||
assert!(
|
||||
trace.candidate_consumer_hypotheses[0]
|
||||
.evidence
|
||||
|
|
@ -24534,14 +24586,12 @@ mod tests {
|
|||
&& line.contains("paired DT/ST siblings at 0x004a2c80 and 0x004a34e0")
|
||||
&& line.contains("grounded top-level branch meaning")
|
||||
&& line.contains("grounded bridge/tunnel material selector roles")
|
||||
&& line.contains("writer side is now grounded through 0x00491c60, 0x0048a6c0, 0x00455a40, and concrete child serializer 0x004559d0")
|
||||
&& line.contains("concrete child-construction/write-side chain through 0x00490960")
|
||||
&& line.contains("0x004559d0")
|
||||
}));
|
||||
assert!(trace
|
||||
.notes
|
||||
.iter()
|
||||
.any(|line| line.contains("ST-only")
|
||||
&& line.contains("ST chooser sibling")
|
||||
&& line.contains("DT sibling remains grounded statically")));
|
||||
assert!(trace.notes.iter().any(|line| line.contains("ST-only")
|
||||
&& line.contains("ST chooser sibling")
|
||||
&& line.contains("DT sibling remains grounded statically")));
|
||||
assert!(
|
||||
trace.candidate_consumer_hypotheses[0]
|
||||
.evidence
|
||||
|
|
|
|||
|
|
@ -3057,6 +3057,19 @@ The low helper strip beneath that shared family is tighter now too: `0x0052ecd0`
|
|||
then closes `0x55f3`. So the remaining infrastructure problem is row-to-record mapping inside
|
||||
the `0x38a5` stream and which chooser/seed values reach those string lanes and footer bytes, not
|
||||
identifying the per-child loader family.
|
||||
The source side is tighter now too. The paired chooser siblings already bounded above this seam
|
||||
call `0x00490960` directly beside `0x0048a340/0x0048f4c0/0x00490200`, and `0x00490960` copies
|
||||
selector fields into the child object (`[this+0x219]`, `[this+0x251]`, bit `0x20` in
|
||||
`[this+0x24c]`, and `[this+0x226]`), allocates a fresh `0x23a` `Infrastructure` child, seeds it
|
||||
through `0x00455b70` with caller-supplied stem input plus fixed literal `Infrastructure` at
|
||||
`0x005cfd74`, attaches it through `0x005395d0`, seeds position lanes through
|
||||
`0x00539530/0x0053a5b0`, and can cache it as primary child in `[this+0x248]`. The sibling
|
||||
`0x00490200` then reads the same seeded lanes `[this+0x206/+0x20a/+0x20e]` back through the live
|
||||
route collection at `0x006cfca8`, compares them against the current owner using
|
||||
`[this+0x216/+0x218/+0x201/+0x202]`, and behaves like a route/link comparator layered above the
|
||||
same child payload fields that `0x004559d0` later serializes. So the remaining infrastructure
|
||||
problem is which chooser branches feed `0x00490960` which stem/selector tuples for each
|
||||
grounded save-side class, not where the child payload lanes come from at all.
|
||||
The smaller attach helper `0x00490a3c` is now bounded too: it conditionally allocates one
|
||||
`Infrastructure` child from a caller-supplied payload stem, attaches it to the current owner, and
|
||||
then seeds three caller-supplied position lanes through `0x00539530` and `0x0053a5b0`. The
|
||||
|
|
|
|||
|
|
@ -83,6 +83,21 @@ Working rule:
|
|||
dispatch slot `+0x4c`, run `0x0052ec50`, and close `0x55f3`. So the remaining infrastructure
|
||||
frontier is no longer “which slot does `0x00455a40` jump to?”; it is which chooser/seed values
|
||||
reach those string lanes and the trailing footer path.
|
||||
- That source side is narrower now too: direct disassembly shows the paired chooser siblings
|
||||
calling `0x00490960` directly beside `0x0048a340/0x0048f4c0/0x00490200`, and `0x00490960`
|
||||
copies selector fields into the child object (`[this+0x219]`, `[this+0x251]`, bit `0x20` in
|
||||
`[this+0x24c]`, and `[this+0x226]`), allocates a fresh `0x23a` `Infrastructure` child, seeds it
|
||||
through `0x00455b70` with caller-supplied stem input plus fixed literal `Infrastructure` at
|
||||
`0x005cfd74`, attaches it through `0x005395d0`, seeds position lanes through
|
||||
`0x00539530/0x0053a5b0`, and can cache it as primary child in `[this+0x248]`. The remaining
|
||||
problem is no longer “where do the child payload lanes come from?” but “which chooser branches
|
||||
feed `0x00490960` which caller stem and selector tuple for each grounded save-side class?”.
|
||||
- The sibling `0x00490200` is tighter now too: it reads the seeded lanes
|
||||
`[this+0x206/+0x20a/+0x20e]` back through the live route collection at `0x006cfca8`, compares
|
||||
them against the current owner using `[this+0x216/+0x218/+0x201/+0x202]`, and behaves like a
|
||||
route/link comparator layered above the same child payload lanes that `0x004559d0` later
|
||||
serializes. So the next infrastructure pass should treat `0x00490960` as the source owner and
|
||||
`0x00490200` as a consumer of the same seeded lanes, not as separate unexplained seams.
|
||||
- The smaller helper `0x00490a3c` is narrower now too: it allocates one literal `Infrastructure`
|
||||
child, seeds it through `0x00455b70` with caller-provided stem input, attaches it through
|
||||
`0x005395d0`, seeds position lanes through `0x00539530/0x0053a5b0`, and optionally caches it as
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue