Narrow peer-site replay owner questions

This commit is contained in:
Jan Petykiewicz 2026-04-18 18:30:28 -07:00
commit d96bc47a98
2 changed files with 41 additions and 20 deletions

View file

@ -4084,9 +4084,13 @@ fn build_periodic_company_service_trace_report(
.to_string(), .to_string(),
"0x0040d540 weighted region-to-company proximity scorer with pending-bonus context" "0x0040d540 weighted region-to-company proximity scorer with pending-bonus context"
.to_string(), .to_string(),
"0x0040f6d0 subtype-1 placed-structure constructor writing linked peer id via 0x00481390"
.to_string(),
"0x00481390 / 0x00480210 subtype-1 linked-site allocation and constructor".to_string(), "0x00481390 / 0x00480210 subtype-1 linked-site allocation and constructor".to_string(),
"0x00480710 linked-site runtime side-buffer and route-entry-anchor refresh owner" "0x00480710 linked-site runtime side-buffer and route-entry-anchor refresh owner"
.to_string(), .to_string(),
"0x0040df27 / 0x0040e00a / 0x0040edf6 concrete linked-site side-refresh callers of 0x00480710"
.to_string(),
"0x0048abc0 / 0x00493cf0 route-entry-anchor rebind and synthesis strip".to_string(), "0x0048abc0 / 0x00493cf0 route-entry-anchor rebind and synthesis strip".to_string(),
"0x0047dda0 linked-peer route-entry-anchor validator".to_string(), "0x0047dda0 linked-peer route-entry-anchor validator".to_string(),
"0x00420030 / 0x00420280 peer-site boolean/selector pair over the placed-structure collection".to_string(), "0x00420030 / 0x00420280 peer-site boolean/selector pair over the placed-structure collection".to_string(),
@ -4095,8 +4099,8 @@ fn build_periodic_company_service_trace_report(
"0x00409950 linked-transit roster sibling owner".to_string(), "0x00409950 linked-transit roster sibling owner".to_string(),
]; ];
let next_owner_questions = vec![ let next_owner_questions = vec![
"Which rebuild or restore owner re-seeds the live peer-site backing-record selector at [site+0x04] once the direct 0x36b1 load and 0x4a9d side-buffer load complete, now that 0x0047efe0 and 0x0047fd50 both consume that lane directly?".to_string(), "Which non-hook post-load owner actually replays the subtype-1 linked-site constructor path for existing saves, now that 0x00480210 is grounded as the writer of linked-peer row [peer+0x04] = anchor-site id and 0x0040f6d0 is grounded as the writer of anchor-site [site+0x2a8] via 0x00481390?".to_string(),
"How far do the subtype-1 linked-site constructor strip 0x0040f6d0 -> 0x00481390 -> 0x00480210 and the refresh/rebind strip 0x00480710 -> 0x0048abc0 / 0x00493cf0 replay [site+0x2a8] and [peer+0x08] shelllessly after load?".to_string(), "How far do the concrete side-refresh callers 0x0040df27 / 0x0040e00a / 0x0040edf6 rerun 0x00480710 -> 0x0048abc0 / 0x00493cf0 shelllessly after load, and do they suffice to rebuild [peer+0x08] without replaying the full constructor family?".to_string(),
"Which persisted linkage fields behind 0x0047efe0, [region+0x2a4], and [region+0x276] are sufficient to rehost the 0x004014b0 proximity-and-news branch without shell state?".to_string(), "Which persisted linkage fields behind 0x0047efe0, [region+0x2a4], and [region+0x276] are sufficient to rehost the 0x004014b0 proximity-and-news branch without shell state?".to_string(),
"Which infrastructure consumer above the grounded 0x38a5 seam actually drives the linked-transit branch that 0x00409950 follows?".to_string(), "Which infrastructure consumer above the grounded 0x38a5 seam actually drives the linked-transit branch that 0x00409950 follows?".to_string(),
]; ];
@ -4211,15 +4215,17 @@ fn build_periodic_company_service_trace_report(
"0x00425b90 pending-bonus/company-state gate", "0x00425b90 pending-bonus/company-state gate",
"0x0040d360 region type/class filter", "0x0040d360 region type/class filter",
"0x0040d540 weighted region-to-company proximity scorer", "0x0040d540 weighted region-to-company proximity scorer",
"0x0040f6d0 subtype-1 placed-structure constructor",
"0x00481390 / 0x00480210 subtype-1 linked-site allocation and constructor", "0x00481390 / 0x00480210 subtype-1 linked-site allocation and constructor",
"0x00480710 linked-site runtime side-buffer and route-entry-anchor refresh owner", "0x00480710 linked-site runtime side-buffer and route-entry-anchor refresh owner",
"0x0040df27 / 0x0040e00a / 0x0040edf6 linked-site side-refresh callers",
"0x0048abc0 / 0x00493cf0 route-entry-anchor rebind and synthesis strip", "0x0048abc0 / 0x00493cf0 route-entry-anchor rebind and synthesis strip",
"0x0047dda0 linked-peer route-entry-anchor validator", "0x0047dda0 linked-peer route-entry-anchor validator",
"0x00420030 / 0x00420280 peer-site boolean/selector pair", "0x00420030 / 0x00420280 peer-site boolean/selector pair",
"0x00406050 city-connection bonus/news sibling owner", "0x00406050 city-connection bonus/news sibling owner",
], ],
&[ &[
"Direct disassembly now shows this branch iterating the live class-0 region collection, skipping regions with pending amount [region+0x276], reusing the center-cell token gate 0x0041f6e0 -> 0x0042b2d0, reusing the linked-region status branch 0x0047de00 -> 0x0040c990, checking candidate reachability through 0x004801a0, consulting the placed-structure peer-site boolean/selector pair 0x00420030 / 0x00420280 over 0x006cec20, scoring regions against company proximity and aging through 0x0040d540 and 0x0040cac0, and then publishing the winning linked company id from [region+0x2a4]. The remaining peer-site identity gap is now narrower too: [site+0x04] is a live backing-record selector consumed by 0x0047efe0 and 0x0047fd50, [site+0x2a8] is still the linked peer id written by the subtype-1 construction strip 0x0040f6d0 -> 0x00481390 -> 0x00480210, and [peer+0x08] remains the route-entry anchor id validated by 0x0047dda0 and rebound through 0x00480710 -> 0x0048abc0 / 0x00493cf0.", "Direct disassembly now shows this branch iterating the live class-0 region collection, skipping regions with pending amount [region+0x276], reusing the center-cell token gate 0x0041f6e0 -> 0x0042b2d0, reusing the linked-region status branch 0x0047de00 -> 0x0040c990, checking candidate reachability through 0x004801a0, consulting the placed-structure peer-site boolean/selector pair 0x00420030 / 0x00420280 over 0x006cec20, scoring regions against company proximity and aging through 0x0040d540 and 0x0040cac0, and then publishing the winning linked company id from [region+0x2a4]. The remaining peer-site identity gap is now narrower too: the linked-peer row's [peer+0x04] is written by 0x00480210 as the anchor-site id, the anchor-site row's [site+0x2a8] is written by 0x0040f6d0 after 0x00481390 returns the linked peer id, and [peer+0x08] remains the route-entry anchor id validated by 0x0047dda0 and rebound through 0x00480710 -> 0x0048abc0 / 0x00493cf0.",
], ],
)); ));
SmpPeriodicCompanyServiceTraceEntry { SmpPeriodicCompanyServiceTraceEntry {
@ -4253,7 +4259,7 @@ fn build_periodic_company_service_trace_report(
"Direct disassembly now closes the negative persistence side too: the direct 0x36b1 per-record callbacks serialize the shared base scalar triplets rooted at [this+0x206/+0x20a/+0x20e] plus the subordinate payload callback strip, while the 0x4a9d/0x4a3a/0x4a3b side-buffer owner only persists route-entry lists, three byte arrays, five proximity buckets, and the sampled-cell list. That means neither checked-in save owner seam currently persists the core peer-site identity fields [site+0x04], [site+0x2a8], or [peer+0x08] directly.".to_string(), "Direct disassembly now closes the negative persistence side too: the direct 0x36b1 per-record callbacks serialize the shared base scalar triplets rooted at [this+0x206/+0x20a/+0x20e] plus the subordinate payload callback strip, while the 0x4a9d/0x4a3a/0x4a3b side-buffer owner only persists route-entry lists, three byte arrays, five proximity buckets, and the sampled-cell list. That means neither checked-in save owner seam currently persists the core peer-site identity fields [site+0x04], [site+0x2a8], or [peer+0x08] directly.".to_string(),
); );
notes.push( notes.push(
"So the acquisition frontier is no longer a generic near-city owner gap or a collection-identity question. The next non-hook target is the rebuild strip that repopulates those peer-site identity fields shelllessly: the subtype-1 linked-site constructor 0x0040f6d0 -> 0x00481390 -> 0x00480210, the linked-site side-buffer and route-entry-anchor refresh owner 0x00480710, the route-entry rebind/synthesis pair 0x0048abc0 / 0x00493cf0, and whichever upstream owner re-seeds the live backing-record selector [site+0x04] before 0x00420030 / 0x00420280 / 0x0047efe0 / 0x0047fd50 consume it.".to_string(), "The rebuild strip is narrower now too. 0x00480210 seeds the linked-peer row [peer+0x04] from the anchor-site id argument, 0x0040f6d0 writes the anchor-site linked peer id back into [site+0x2a8] after 0x00481390 returns, and the later side-refresh callers 0x0040df27 / 0x0040e00a / 0x0040edf6 rerun 0x00480710 to refresh [peer+0x08] through 0x0048abc0 / 0x00493cf0. So the next non-hook target is not a generic field writer hunt; it is whichever post-load owner replays those constructor or refresh paths for existing saves.".to_string(),
); );
SmpPeriodicCompanyServiceTraceReport { SmpPeriodicCompanyServiceTraceReport {
@ -25914,7 +25920,7 @@ mod tests {
let trace = build_periodic_company_service_trace_report(&analysis); let trace = build_periodic_company_service_trace_report(&analysis);
assert_eq!(trace.selected_company_id, Some(7)); assert_eq!(trace.selected_company_id, Some(7));
assert_eq!(trace.atlas_candidate_consumers.len(), 7); assert_eq!(trace.atlas_candidate_consumers.len(), 7);
assert_eq!(trace.known_bridge_helpers.len(), 20); assert_eq!(trace.known_bridge_helpers.len(), 22);
assert_eq!(trace.next_owner_questions.len(), 4); assert_eq!(trace.next_owner_questions.len(), 4);
assert_eq!(trace.companies.len(), 1); assert_eq!(trace.companies.len(), 1);
assert!(trace.atlas_candidate_consumers.iter().any(|line| { assert!(trace.atlas_candidate_consumers.iter().any(|line| {
@ -25923,13 +25929,13 @@ mod tests {
&& line.contains("peer-site boolean/selector pair") && line.contains("peer-site boolean/selector pair")
})); }));
assert!(trace.next_owner_questions.iter().any(|line| { assert!(trace.next_owner_questions.iter().any(|line| {
line.contains("[site+0x04]") line.contains("0x00480210")
&& line.contains("0x0047efe0") && line.contains("[peer+0x04]")
&& line.contains("0x0047fd50") && line.contains("[site+0x2a8]")
})); }));
assert!(trace.next_owner_questions.iter().any(|line| { assert!(trace.next_owner_questions.iter().any(|line| {
line.contains("0x0040f6d0 -> 0x00481390 -> 0x00480210") line.contains("0x0040df27 / 0x0040e00a / 0x0040edf6")
&& line.contains("[site+0x2a8]") && line.contains("0x00480710")
&& line.contains("[peer+0x08]") && line.contains("[peer+0x08]")
})); }));
let acquisition_branch = trace.companies[0] let acquisition_branch = trace.companies[0]
@ -25983,6 +25989,18 @@ mod tests {
.iter() .iter()
.any(|line| line.contains("0x00480710") && line.contains("route-entry-anchor")) .any(|line| line.contains("0x00480710") && line.contains("route-entry-anchor"))
); );
assert!(
trace
.known_bridge_helpers
.iter()
.any(|line| line.contains("0x0040f6d0") && line.contains("0x00481390"))
);
assert!(
trace
.known_bridge_helpers
.iter()
.any(|line| line.contains("0x0040df27 / 0x0040e00a / 0x0040edf6"))
);
let city_branch = trace.companies[0] let city_branch = trace.companies[0]
.branches .branches
.iter() .iter()

View file

@ -45,8 +45,8 @@ Working rule:
`0x0042b2d0`, the optional company filter through `0x0047efe0`, the station-or-transit gate `0x0042b2d0`, the optional company filter through `0x0047efe0`, the station-or-transit gate
`0x0047fd50`, and the status branch `0x0047de00 -> 0x0040c990` `0x0047fd50`, and the status branch `0x0047de00 -> 0x0040c990`
- `0x0047efe0` and `0x0047fd50` both consume `[site+0x04]` as the live backing-record selector - `0x0047efe0` and `0x0047fd50` both consume `[site+0x04]` as the live backing-record selector
- the subtype-`1` constructor strip `0x0040f6d0 -> 0x00481390 -> 0x00480210` is still the only - `0x00480210` writes linked-peer row `[peer+0x04]` from the anchor-site id argument
grounded writer of linked peer id `[site+0x2a8]` - `0x0040f6d0 -> 0x00481390` writes the anchor-site linked peer id back into `[site+0x2a8]`
- `0x0047dda0` consumes `[peer+0x08]` as the linked route-entry anchor id - `0x0047dda0` consumes `[peer+0x08]` as the linked route-entry anchor id
- `0x00480710 -> 0x0048abc0 / 0x00493cf0` is the linked-site refresh and route-entry rebind or - `0x00480710 -> 0x0048abc0 / 0x00493cf0` is the linked-site refresh and route-entry rebind or
synthesis strip above that anchor lane synthesis strip above that anchor lane
@ -56,16 +56,19 @@ Working rule:
five proximity buckets, and the sampled-cell list five proximity buckets, and the sampled-cell list
- the winning linked company id comes from `[region+0x2a4]` - the winning linked company id comes from `[region+0x2a4]`
So the next owner question is no longer “what does the acquisition branch do?” but “which So the next owner question is no longer “what does the acquisition branch do?” but “which
rebuild owner repopulates the live peer-site identity lanes `[site+0x04]`, `[site+0x2a8]`, and post-load owner replays the subtype-`1` constructor or linked-site refresh paths for existing
`[peer+0x08]` once those two save-owner seams finish?” saves once those two save-owner seams finish?”
- Make the next static/rehost slice the peer-site rebuild seam above persistence, not another save - Make the next static/rehost slice the peer-site rebuild seam above persistence, not another save
scan: scan:
- rehost or bound how far `0x0040f6d0 -> 0x00481390 -> 0x00480210` already recreates linked - find which post-load non-hook owner actually replays
peer id `[site+0x2a8]` and route-entry anchor `[peer+0x08]` `0x0040f6d0 -> 0x00481390 -> 0x00480210` for existing saves, now that the concrete writes to
- rehost or bound how `0x00480710 -> 0x0048abc0 / 0x00493cf0` refreshes or synthesizes the `[peer+0x04]` and `[site+0x2a8]` are grounded
linked route-entry anchor after load - bound how far the concrete side-refresh callers
- find the first upstream non-hook owner that reseeds `[site+0x04]` before `0x0040df27 / 0x0040e00a / 0x0040edf6 -> 0x00480710 -> 0x0048abc0 / 0x00493cf0`
`0x00420030 / 0x00420280 / 0x0047efe0 / 0x0047fd50` consume it refresh or synthesize `[peer+0x08]` after load
- find the first upstream post-load owner that reseeds `[site+0x04]` before
`0x00420030 / 0x00420280 / 0x0047efe0 / 0x0047fd50` consume it, if that owner is distinct
from the constructor replay path
- Use the higher-layer probes as the standard entry point for the current blocked frontier instead - Use the higher-layer probes as the standard entry point for the current blocked frontier instead
of generic save scans: of generic save scans:
`runtime inspect-periodic-company-service-trace <save.gms>`, `runtime inspect-periodic-company-service-trace <save.gms>`,