Ground infrastructure child serializer dispatch

This commit is contained in:
Jan Petykiewicz 2026-04-18 15:25:21 -07:00
commit a6ace52588
3 changed files with 94 additions and 22 deletions

View file

@ -4267,6 +4267,7 @@ fn build_infrastructure_asset_trace_report(
.iter()
.any(|summary| summary.primary_name.contains("DT"));
let atlas_candidate_consumers = vec![
"0x00491c60 infrastructure tagged side-buffer serializer owner".to_string(),
"0x00493be0 infrastructure tagged side-buffer collection load owner".to_string(),
"0x004a2c80 infrastructure composition chooser owner (DT family)".to_string(),
"0x004a34e0 infrastructure composition chooser sibling (ST family)".to_string(),
@ -4291,8 +4292,13 @@ fn build_infrastructure_asset_trace_report(
];
let known_bridge_helpers = vec![
"0x00493be0 tagged 0x38a5/0x38a6/0x38a7 collection load owner".to_string(),
"0x00491c60 tagged 0x38a5/0x38a6/0x38a7 collection serializer owner".to_string(),
"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(),
"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(),
"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(),
@ -4307,7 +4313,7 @@ fn build_infrastructure_asset_trace_report(
"0x0048e140 / 0x0048e160 / 0x0048e180 route-entry resolver helpers".to_string(),
];
let next_owner_questions = vec![
"With [this+0x219] now grounded as the bridge-material selector (steel/stone/suspension/wood) and [this+0x251] grounded as the tunnel-material selector (brick/concrete), how do those selector values surface in the save-side `0x38a5` compact-prefix classes before the grounded pure bridge-section class 0x0002/0xff reaches the two-child clone-path above 0x0048a1e0 and 0x0048dcf0?".to_string(),
"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(),
"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(),
@ -4340,9 +4346,14 @@ fn build_infrastructure_asset_trace_report(
"atlas already bounds these helpers under the literal Infrastructure owner".to_string(),
"the side-buffer corpus is disjoint from the placed-structure triplet corpus, so a separate child/rebuild family is more plausible than a compact alias".to_string(),
"direct disassembly now shows 0x00493be0 opening tag family 0x38a5/0x38a6/0x38a7, reading one shared dword into the owner-local 0x90/0x94 lane, iterating each live collection entry, and dispatching every loaded infrastructure record through 0x0048dcf0 before the later follow-on owners run".to_string(),
"direct disassembly now also shows 0x00491c60 as the serializer sibling of 0x00493be0: it writes tags 0x38a5/0x38a6/0x38a7, serializes the shared owner-local dword from [this+0x90], iterates live entries through 0x00518380/0x00518140, and dispatches each entry to 0x0048a6c0".to_string(),
"direct disassembly now also grounds paired upstream chooser siblings: 0x004a2c80 routes the DT family and 0x004a34e0 routes the ST family, with both repeatedly calling 0x0048a1e0 and branching on child type codes at [this+0x226], selector bytes at [this+0x219]/[this+0x251]/[this+0x252], bit 0x20 in [this+0x24c], and follow-on owners 0x0048a340/0x0048f4c0/0x00490200/0x00490960".to_string(),
"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(),
"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(),
"the material selectors are grounded now too: in the bridge branch, [this+0x219] indexes Steel/Stone/Wood tables directly while value 2 takes the special suspension-cap path through [this+0x252]; in the tunnel branch, [this+0x251] selects Brick versus Concrete while the cap/section split comes from bit 0x20 choosing the base versus +0x8 table entry".to_string(),
"the [this+0x252] selector is partially grounded now too: when [this+0x219]==2, the chooser jump tables dispatch fixed BridgeDT/BridgeST suspension-cap literals for R10, L10, 12, 14, 16, and 18 variants instead of using the general Bridge* table families".to_string(),
side_buffer
@ -4665,16 +4676,16 @@ fn build_infrastructure_asset_trace_report(
.unwrap_or_else(|| {
"no live-entry payload-start summary was available for the outer prelude".to_string()
}),
"local .rdata at 0x005cfd00 now also proves the infrastructure child table uses the shared tagged callback strip directly: slot +0x40 = 0x455fc0, slot +0x48 = 0x455870, and slot +0x4c = 0x455930".to_string(),
"local .rdata at 0x005cfd00 now also proves the infrastructure child table uses the shared tagged callback strip directly: slot +0x40 = 0x455fc0, slot +0x44 = 0x4559d0, slot +0x48 = 0x455870, and slot +0x4c = 0x455930".to_string(),
"direct disassembly now shows 0x0048a1e0 cloning the first child triplet bands through 0x52e880/0x52e720, destroying the prior child, seeding a new literal Infrastructure child through 0x455b70 with payload seed 0x5c87a8, attaching through 0x5395d0 or 0x53a5d0, and republishing the two bands through 0x52e8b0/0x530720".to_string(),
"direct disassembly now also shows the outer owner at 0x0048dcf0 reading a child count plus optional primary-child ordinal from the tagged stream through 0x531150, zeroing [this+0x08], dispatching each fresh child through 0x455a50 -> vtable slot +0x40, culling ordinals above 5, and restoring cached primary-child slot [this+0x248] from the saved ordinal".to_string(),
"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 now-grounded bridge material selector [this+0x219] and tunnel material selector [this+0x251] surface 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 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(),
"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 the first 0x38a6 record head is grounded as child_count=1, saved_primary_child_byte=0xff, first 0x55f1 at +0x3".to_string(),
"which restored child fields or grouped rows retain the 0x38a5 embedded name-pair semantics before route/local-runtime follow-ons take over".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(),
],
},
SmpServiceConsumerHypothesis {
@ -4691,11 +4702,11 @@ fn build_infrastructure_asset_trace_report(
],
evidence: vec![
"atlas already bounds the serializer/load strip around the Infrastructure owner and the same 0x55f1/0x55f2/0x55f3 tag family".to_string(),
"local .rdata at 0x005cfd00 now proves the infrastructure child vtable points straight at 0x455fc0/0x455870/0x455930 for the load, triplet-restore, and serializer slots".to_string(),
"local .rdata at 0x005cfd00 now proves the infrastructure child vtable points straight at 0x455fc0/0x4559d0/0x455870/0x455930 for the load, tagged serializer, triplet-restore, and scalar serializer slots".to_string(),
"the save-side side-buffer carries embedded dual-name rows plus compact prefixes, which is compatible with a serializer-side bridge".to_string(),
],
blockers: vec![
"which exact 0x38a5 rows belong to shared 0x55f1/0x55f2/0x55f3 child records versus outer collection metadata".to_string(),
"which exact 0x38a5 rows belong to shared 0x55f1/0x55f2/0x55f3 child records versus outer collection metadata, now that the concrete write-side slot +0x44 serializer is grounded as 0x004559d0".to_string(),
],
},
SmpServiceConsumerHypothesis {
@ -4786,7 +4797,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, and the upstream chooser above the child attach path is now grounded as paired DT/ST siblings at 0x004a2c80 and 0x004a34e0 with decoded Bridge/Tunnel/BallastCap/Overpass families, grounded top-level bridge/tunnel/overpass-ballast branch meaning, and grounded bridge/tunnel material selector roles; the remaining unknown is how those selector values surface in 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, 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(),
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 {
@ -24374,12 +24385,13 @@ 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(), 14);
assert_eq!(trace.known_bridge_helpers.len(), 19);
assert_eq!(trace.next_owner_questions.len(), 4);
assert!(trace
.next_owner_questions
.iter()
.any(|line| line.contains("[this+0x219] now grounded as the bridge-material selector")
.any(|line| line.contains("selector values set by 0x0048a340")
&& line.contains("0x004559d0")
&& line.contains("0x0002/0xff")
&& line.contains("two-child clone-path")));
assert!(trace
@ -24388,6 +24400,20 @@ mod tests {
.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")));
assert_eq!(trace.candidate_consumer_hypotheses.len(), 3);
assert_eq!(
trace.candidate_consumer_hypotheses[0].status,
@ -24419,6 +24445,16 @@ mod tests {
&& 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]"))
);
assert!(
trace.candidate_consumer_hypotheses[0]
.evidence
@ -24439,8 +24475,8 @@ mod tests {
trace.candidate_consumer_hypotheses[0]
.blockers
.iter()
.any(|line| line.contains("bridge material selector [this+0x219]")
&& line.contains("tunnel material selector [this+0x251]")
.any(|line| line.contains("exact setter 0x0048a340")
&& line.contains("[this+0x226]/[this+0x219]/[this+0x251]/bit 0x20")
&& line.contains("[this+0x252]")
&& line.contains("0x0002/0xff")
&& line.contains("0x0055/0x00"))
@ -24453,6 +24489,23 @@ mod tests {
&& line.contains("0x0002")
&& line.contains("BridgeSTWood_Section.3dp"))
);
assert!(
trace.candidate_consumer_hypotheses[0]
.evidence
.iter()
.any(|line| line.contains("slot +0x44 = 0x004559d0")
&& line.contains("+0x40 = 0x00455fc0")
&& line.contains("+0x4c = 0x00455930"))
);
assert!(
trace.candidate_consumer_hypotheses[0]
.evidence
.iter()
.any(|line| line.contains("0x004559d0 writing 0x55f1")
&& line.contains("[this+0x206/+0x20a/+0x20e]")
&& line.contains("0x52ec50")
&& line.contains("0x55f3"))
);
assert!(
trace.candidate_consumer_hypotheses[0]
.evidence
@ -24477,11 +24530,11 @@ mod tests {
&& line.contains("previous live id"))
);
assert!(trace.notes.iter().any(|line| {
line.contains("0x0002/0xff candidate class is grounded save-side")
line.contains("pure bridge-only 0x0002/0xff candidate class is grounded save-side")
&& line.contains("paired DT/ST siblings at 0x004a2c80 and 0x004a34e0")
&& line.contains("grounded top-level bridge/tunnel/overpass-ballast branch meaning")
&& line.contains("grounded top-level branch meaning")
&& line.contains("grounded bridge/tunnel material selector roles")
&& line.contains("BallastCap/Overpass")
&& line.contains("writer side is now grounded through 0x00491c60, 0x0048a6c0, 0x00455a40, and concrete child serializer 0x004559d0")
}));
assert!(trace
.notes

View file

@ -3032,6 +3032,12 @@ The low helper strip beneath that shared family is tighter now too: `0x0052ecd0`
longer “what do these bytes mean?” but “how do those already-grounded selector values surface in
the save-side `0x38a5` classes, especially the `0x0002 / 0xff` bridge class and the
`0x0055 / 0x00` BallastCap class?”.
The exact setter seam is grounded now too: direct disassembly of `0x0048a340` shows its dword
argument writing `[this+0x226]`, its next two byte arguments writing `[this+0x219]` and
`[this+0x251]`, and its final byte argument toggling bit `0x20` in `[this+0x24c]`. So the
remaining infrastructure selector problem is no longer about hidden intermediate state; it is
specifically how those already-grounded setter values are serialized or rebuilt into the
save-side `0x38a5` prefix classes.
One selector byte is partly grounded now too: when `[this+0x219]==2`, the chooser jump tables
stop using the general bridge families and instead route `[this+0x252]` through fixed
`BridgeDT/BridgeST` suspension-cap literals for `R10`, `L10`, `12`, `14`, `16`, and `18`.
@ -3044,9 +3050,13 @@ The low helper strip beneath that shared family is tighter now too: `0x0052ecd0`
with `DT` still grounded statically but not yet exercised by the current save corpus.
The child loader family is explicit now too: local `.rdata` at `0x005cfd00` proves the
`Infrastructure` child vtable uses the shared tagged callback strip directly, with
`+0x40 = 0x00455fc0`, `+0x48 = 0x00455870`, and `+0x4c = 0x00455930`. So the remaining
infrastructure problem is row-to-record mapping inside the `0x38a5` stream, not identifying the
per-child loader family.
`+0x40 = 0x00455fc0`, `+0x44 = 0x004559d0`, `+0x48 = 0x00455870`, and `+0x4c = 0x00455930`.
Direct disassembly of `0x004559d0` now closes the concrete write-side chain behind raw wrapper
`0x00455a40`: it writes `0x55f1`, serializes the string lanes
`[this+0x206/+0x20a/+0x20e]`, writes `0x55f2`, dispatches slot `+0x4c`, runs `0x0052ec50`, and
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 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

View file

@ -75,11 +75,14 @@ Working rule:
through a fixed literal when absent and defaulting the third lane back to the first string when
absent. So the next pass should stay focused on payload-stream grouping and tagged value roles,
not on rediscovering a missing third-string encoding.
- The child loader identity is closed now too: local `.rdata` at `0x005cfd00` proves the
- The child loader identity is tighter now too: local `.rdata` at `0x005cfd00` proves the
`Infrastructure` child vtable uses the shared tagged callback strip directly, with
`+0x40 = 0x00455fc0`, `+0x48 = 0x00455870`, and `+0x4c = 0x00455930`. So the remaining
infrastructure frontier is row-to-record mapping inside `0x38a5`, not “which loader family does
this child use?”.
`+0x40 = 0x00455fc0`, `+0x44 = 0x004559d0`, `+0x48 = 0x00455870`, and `+0x4c = 0x00455930`.
Direct disassembly of `0x004559d0` then shows the concrete write-side chain for the child
payload: write `0x55f1`, serialize string lanes `[this+0x206/+0x20a/+0x20e]`, write `0x55f2`,
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.
- 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
@ -183,6 +186,12 @@ Working rule:
longer “what do these bytes mean?” but “how do those already-grounded selector values surface in
the save-side `0x38a5` classes, especially the `0x0002 / 0xff` bridge class and the
`0x0055 / 0x00` BallastCap class?”.
- The exact setter seam is grounded now too: direct disassembly of `0x0048a340` shows its dword
argument writing `[this+0x226]`, its next two byte arguments writing `[this+0x219]` and
`[this+0x251]`, and its final byte argument toggling bit `0x20` in `[this+0x24c]`. So the
remaining infrastructure selector problem is no longer about hidden intermediate state; it is
specifically how those already-grounded setter values are serialized or rebuilt into the
save-side `0x38a5` prefix classes.
- One selector byte is partly grounded now too: when `[this+0x219]==2`, the chooser jump tables
stop using the general bridge families and instead route `[this+0x252]` through fixed
`BridgeDT/BridgeST` suspension-cap literals for `R10`, `L10`, `12`, `14`, `16`, and `18`.