diff --git a/crates/rrt-runtime/src/smp.rs b/crates/rrt-runtime/src/smp.rs index 28d45c9..8662239 100644 --- a/crates/rrt-runtime/src/smp.rs +++ b/crates/rrt-runtime/src/smp.rs @@ -9520,6 +9520,9 @@ fn parse_event_runtime_collection_summary_with_tag_width( control_lane_notes.push( "direct disassembly now grounds that as a real loader boundary: 0x0042db20 allocates linked 0x1e/0x28 row nodes from the 0x4e9a slice and leaves [event+0x7ee..0x80f] to the separate 0x0042e050 full-event clone path, so missing trigger-kind bytes on this family are not just a parser gap".to_string(), ); + control_lane_notes.push( + "the checked 0x0042e050 caller census is narrow too: current direct caller 0x004dba23 sits under the event-editor duplication path rather than 0x00433130 load, so ordinary 0x4e9a restore is not currently grounded to inherit trigger/control bytes through that deep-copy seam".to_string(), + ); } if records_with_trigger_kind != 0 { control_lane_notes.push(format!( @@ -9778,6 +9781,9 @@ fn parse_nondirect_event_runtime_record_summary( notes.push( "direct disassembly of 0x0042db20 now grounds that absence too: this loader allocates 0x1e-byte standalone-condition nodes and 0x28-byte grouped-row nodes from the 0x4e9a slice, but does not materialize the compact control lane [event+0x7ee..0x80f] or a trigger-kind byte for this non-direct row family".to_string(), ); + notes.push( + "the adjacent deep-copy seam is bounded too: current direct caller census shows 0x0042e050 reached from editor duplication at 0x004dba23, not from the ordinary 0x00433130 load path, so this non-direct row family is not currently grounded to inherit trigger/control bytes during restore through that helper".to_string(), + ); let decoded_conditions = decode_real_condition_rows(&standalone_condition_rows, None); @@ -22326,6 +22332,9 @@ mod tests { .iter() .any(|line| { line.contains("0x0042db20 allocates linked 0x1e/0x28 row nodes") }) ); + assert!(summary.control_lane_notes.iter().any(|line| { + line.contains("0x004dba23 sits under the event-editor duplication path") + })); assert!(summary.control_lane_notes.iter().any(|line| { line.contains("0x00431b20 dispatch-strip opcodes present in decoded grouped rows = [4]") })); @@ -22359,6 +22368,9 @@ mod tests { .iter() .any(|line| { line.contains("does not materialize the compact control lane") }) ); + assert!(record.notes.iter().any(|line| { + line.contains("0x0042e050 reached from editor duplication at 0x004dba23") + })); assert!( record .notes diff --git a/docs/rehost-queue.md b/docs/rehost-queue.md index f6dde2c..ad65494 100644 --- a/docs/rehost-queue.md +++ b/docs/rehost-queue.md @@ -349,6 +349,14 @@ Working rule: `records_with_trigger_kind = 0`. That means the next non-hook pass on this branch is no longer “do ordinary loaded rows reach `0x00431b20`?”; it is “where is trigger-kind represented or bypassed for those already-decoded ordinary compact rows?” + - the adjacent control-lane inheritance path is narrower now too: + direct disassembly shows `0x0042db20` loading only the linked `0x1e`/`0x28` row bodies from + `0x4e9a`, while the separate deep-copy helper `0x0042e050` copies text bands plus the full + `[event+0x7ee..0x7fa]` block. Current caller census shows that deep-copy seam reached from the + event-editor duplication path at `0x004dba23`, not from the ordinary `0x00433130` restore + strip. So the next non-hook question is not “maybe load inherits trigger kind through + 0x0042e050”; it is which other ordinary owner, if any, seeds `[event+0x7ef]` for these + already-decoded non-direct rows. - the positive-path caller census is effectively boxed in now too: direct `0x0040ef10` callers are the create-side pair `0x00403ef3 / 0x00404489`, the transport tuple pair `0x0046f073 / 0x004707ff`, and the already-ruled-down live controller