diff --git a/crates/rrt-runtime/src/smp.rs b/crates/rrt-runtime/src/smp.rs index 015f034..9b2f6a4 100644 --- a/crates/rrt-runtime/src/smp.rs +++ b/crates/rrt-runtime/src/smp.rs @@ -3687,6 +3687,8 @@ pub struct SmpPeriodicCompanyServiceTraceReport { #[serde(default)] pub near_city_acquisition_tri_lane_runtime_writer_roles: Vec, #[serde(default)] + pub near_city_acquisition_tri_lane_direct_caller_families: Vec, + #[serde(default)] pub near_city_acquisition_projection_hypotheses: Vec, #[serde(default)] pub near_city_acquisition_remaining_owner_gaps: Vec, @@ -4684,6 +4686,13 @@ fn build_periodic_company_service_trace_report( "0x0041118aa/0x0041118f4 add into [site+0x360]".to_string(), "0x0040c9a0 later folds the tri-lane into [site+0x2b4/+0x2b8/+0x2bc] and clears the transient producer lanes".to_string(), ]; + let near_city_acquisition_tri_lane_direct_caller_families = vec![ + "0x0040fb70 is a small wrapper passing one candidate row plus the subject vtable slot +0x80 result and owner-present flag into 0x00412560".to_string(), + "0x004b4052 / 0x004b46ec are collection-wide 0x0040fb70 callers iterating 0x0062b26c candidate rows".to_string(), + "0x00401633 is an acquisition-adjacent 0x0040d540 caller that immediately feeds company stat-family 0x2329/0x0d".to_string(), + "0x0044b81a is an owner-company-aware 0x0040d540 caller that also reaches 0x0040cb70 and 0x00436590 news/event id 0x65".to_string(), + "0x004b70f5 / 0x004b7979 are broader 0x0040d540 callers routing through 0x004337a0 and downstream 0x00540120 / 0x00518140 state consumers".to_string(), + ]; let near_city_acquisition_projection_hypotheses = vec![ SmpServiceConsumerHypothesis { label: "site_owner_replay_from_post_load_refresh_self_id_reconstructible".to_string(), @@ -4798,10 +4807,20 @@ fn build_periodic_company_service_trace_report( .to_string(), "0x0040d450 owner-company-aware local scorer writing directly into [site+0x310] via 0x00455810/0x00455800/0x0044ad60 and 0x00436590 ids 0x66/0x68" .to_string(), + "0x0040fb70 small wrapper passing the subject vtable slot +0x80 result plus owner-present flag into 0x00412560" + .to_string(), "0x00412560 shared candidate/admissibility gate over 0x0062ba8c candidate rows and world date/flags before the tri-lane scoring loop" .to_string(), "0x00410b30..0x004118f4 broader candidate-processing loop writing [site+0x310/+0x338/+0x360] after 0x00412560" .to_string(), + "0x00401633 acquisition-adjacent 0x0040d540 caller immediately feeding company stat-family 0x2329/0x0d" + .to_string(), + "0x0044b81a owner-company-aware 0x0040d540 caller reaching 0x0040cb70 and 0x00436590 news/event id 0x65" + .to_string(), + "0x004b4052 / 0x004b46ec collection-wide 0x0040fb70 callers iterating 0x0062b26c candidate rows" + .to_string(), + "0x004b70f5 / 0x004b7979 broader 0x0040d540 callers routing through 0x004337a0 and downstream 0x00540120 / 0x00518140 state consumers" + .to_string(), "0x0040d360 placed-structure subtype-4 predicate over [candidate+0x32]" .to_string(), "0x0040d540 weighted region-to-company proximity scorer with pending-bonus context" @@ -5011,7 +5030,7 @@ fn build_periodic_company_service_trace_report( "0x00406050 city-connection bonus/news sibling owner", ], &[ - "Direct disassembly now shows this branch scanning the live placed-structure collection at 0x0062b26c for the best current acquisition target, rejecting sites whose owner field [site+0x276] is already nonzero, 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 candidate sites against company proximity and age through 0x0040d540 and 0x0040cac0, and then committing the chosen site through 0x004269b0. The peer-site selector seam itself is now grounded through the local helper strip: 0x0040cd70 seeds [site+0x3cc/+0x3d0] from 0x62b2fc / 0x62b268, 0x0040ceab and 0x0040d1a1 reach 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 the live backing-record selector [site+0x04]. The cached tri-lane is no longer a restore-only mystery either: 0x0040d450 and 0x00410b30..0x004118f4 now bound the live writer family above the shared 0x00412560 candidate/admissibility gate, while 0x0040c9a0 is the later accumulator/reset. The remaining linked-site field work is now about which persisted site/peer lanes are actually sufficient for shellless acquisition and city-connection behavior, not about who owns [site+0x04] or whether the tri-lane has live producers.", + "Direct disassembly now shows this branch scanning the live placed-structure collection at 0x0062b26c for the best current acquisition target, rejecting sites whose owner field [site+0x276] is already nonzero, 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 candidate sites against company proximity and age through 0x0040d540 and 0x0040cac0, and then committing the chosen site through 0x004269b0. The peer-site selector seam itself is now grounded through the local helper strip: 0x0040cd70 seeds [site+0x3cc/+0x3d0] from 0x62b2fc / 0x62b268, 0x0040ceab and 0x0040d1a1 reach 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 the live backing-record selector [site+0x04]. The cached tri-lane is no longer a restore-only mystery either: 0x0040d450 and 0x00410b30..0x004118f4 now bound the live writer family above the shared 0x00412560 candidate/admissibility gate, 0x0040fb70 is the small wrapper into that gate, and direct callers now separate acquisition-adjacent 0x0040d540 users like 0x00401633 / 0x0044b81a from broader sibling sweeps such as 0x004b4052 / 0x004b46ec / 0x004b70f5 / 0x004b7979. The remaining linked-site field work is now about which persisted site/peer lanes are actually sufficient for shellless acquisition and city-connection behavior, not about who owns [site+0x04] or whether the tri-lane has live producers.", ], )); SmpPeriodicCompanyServiceTraceEntry { @@ -5155,6 +5174,7 @@ fn build_periodic_company_service_trace_report( near_city_acquisition_tri_lane_live_owner_families, near_city_acquisition_tri_lane_candidate_gate_fields, near_city_acquisition_tri_lane_runtime_writer_roles, + near_city_acquisition_tri_lane_direct_caller_families, near_city_acquisition_projection_hypotheses, near_city_acquisition_remaining_owner_gaps, near_city_acquisition_region_lane_statuses, @@ -28079,7 +28099,7 @@ mod tests { let trace = build_periodic_company_service_trace_report(&analysis); assert_eq!(trace.selected_company_id, Some(7)); assert_eq!(trace.atlas_candidate_consumers.len(), 9); - assert_eq!(trace.known_bridge_helpers.len(), 63); + assert_eq!(trace.known_bridge_helpers.len(), 68); assert_eq!(trace.next_owner_questions.len(), 5); assert_eq!(trace.companies.len(), 1); assert_eq!( @@ -28204,6 +28224,12 @@ mod tests { .len(), 5 ); + assert_eq!( + trace + .near_city_acquisition_tri_lane_direct_caller_families + .len(), + 5 + ); assert_eq!(trace.near_city_acquisition_projection_hypotheses.len(), 3); assert_eq!( trace.near_city_acquisition_projection_hypotheses[0].label, @@ -28545,6 +28571,44 @@ mod tests { .any(|line| line.contains("0x0040c9a0") && line.contains("[site+0x2b4/+0x2b8/+0x2bc]")) ); + assert!( + trace + .near_city_acquisition_tri_lane_direct_caller_families + .iter() + .any(|line| line.contains("0x0040fb70") + && line.contains("vtable slot +0x80") + && line.contains("owner-present flag") + && line.contains("0x00412560")) + ); + assert!( + trace + .near_city_acquisition_tri_lane_direct_caller_families + .iter() + .any(|line| line.contains("0x004b4052 / 0x004b46ec") + && line.contains("0x0062b26c")) + ); + assert!( + trace + .near_city_acquisition_tri_lane_direct_caller_families + .iter() + .any(|line| line.contains("0x00401633") && line.contains("0x2329/0x0d")) + ); + assert!( + trace + .near_city_acquisition_tri_lane_direct_caller_families + .iter() + .any(|line| line.contains("0x0044b81a") + && line.contains("0x00436590") + && line.contains("0x65")) + ); + assert!( + trace + .near_city_acquisition_tri_lane_direct_caller_families + .iter() + .any(|line| line.contains("0x004b70f5 / 0x004b7979") + && line.contains("0x004337a0") + && line.contains("0x00540120 / 0x00518140")) + ); assert!( trace .near_city_acquisition_remaining_owner_gaps @@ -28800,6 +28864,14 @@ mod tests { && line.contains("[site+0x310]") && line.contains("0x00436590")) ); + assert!( + trace + .known_bridge_helpers + .iter() + .any(|line| line.contains("0x0040fb70") + && line.contains("vtable slot +0x80") + && line.contains("0x00412560")) + ); assert!( trace .known_bridge_helpers @@ -28813,6 +28885,32 @@ mod tests { && line.contains("[site+0x310/+0x338/+0x360]") && line.contains("0x00412560") )); + assert!( + trace + .known_bridge_helpers + .iter() + .any(|line| line.contains("0x00401633") && line.contains("0x2329/0x0d")) + ); + assert!( + trace + .known_bridge_helpers + .iter() + .any(|line| line.contains("0x0044b81a") + && line.contains("0x00436590") + && line.contains("0x65")) + ); + assert!( + trace + .known_bridge_helpers + .iter() + .any(|line| line.contains("0x004b4052 / 0x004b46ec") + && line.contains("0x0062b26c")) + ); + assert!(trace.known_bridge_helpers.iter().any(|line| { + line.contains("0x004b70f5 / 0x004b7979") + && line.contains("0x004337a0") + && line.contains("0x00540120 / 0x00518140") + })); assert!( trace .known_bridge_helpers diff --git a/docs/rehost-queue.md b/docs/rehost-queue.md index 3d1ea31..f9f60fc 100644 --- a/docs/rehost-queue.md +++ b/docs/rehost-queue.md @@ -169,6 +169,16 @@ Working rule: one owner-company-aware local scorer `0x0040d450`, the broader `0x00410b30..0x004118f4` candidate loop, and the later `0x0040c9a0` accumulator/reset + - direct caller families are now split explicitly too: + `0x0040fb70` is the small wrapper into `0x00412560`, + `0x004b4052 / 0x004b46ec` are collection-wide `0x0040fb70` census callers over + `0x0062b26c`, + `0x00401633` is an acquisition-adjacent `0x0040d540` caller that immediately feeds company + stat-family `0x2329/0x0d`, + `0x0044b81a` is an owner-company-aware `0x0040d540` caller that also reaches + `0x0040cb70` and news/event id `0x65`, + and `0x004b70f5 / 0x004b7979` are broader sibling `0x0040d540` callers routing through + `0x004337a0` and downstream `0x00540120 / 0x00518140` - the direct writer census now narrows the remaining owner-company question too: grounded `[site+0x276]` writes cluster under create-side and live mutation families such as `0x004269b0 / 0x00426a10`, the create-side `0x0040ef10 / 0x0040f6d0` strip, and the bulk