diff --git a/crates/rrt-runtime/src/smp.rs b/crates/rrt-runtime/src/smp.rs index f72e926..17b45cb 100644 --- a/crates/rrt-runtime/src/smp.rs +++ b/crates/rrt-runtime/src/smp.rs @@ -9452,6 +9452,27 @@ fn parse_event_runtime_collection_summary_with_tag_width( .collect::>(); mutation_candidate_opcodes.sort_unstable(); mutation_candidate_opcodes.dedup(); + let mut mutation_candidate_descriptor_labels = records + .iter() + .flat_map(|record| record.grouped_effect_rows.iter()) + .filter(|row| { + opcode_reaches_world_apply_compact_runtime_effect_dispatch_strip(row.opcode) + }) + .filter_map(|row| row.descriptor_label.clone()) + .collect::>(); + mutation_candidate_descriptor_labels.sort_unstable(); + mutation_candidate_descriptor_labels.dedup(); + let mut mutation_candidate_unknown_descriptor_ids = records + .iter() + .flat_map(|record| record.grouped_effect_rows.iter()) + .filter(|row| { + opcode_reaches_world_apply_compact_runtime_effect_dispatch_strip(row.opcode) + && row.descriptor_label.is_none() + }) + .map(|row| row.descriptor_id) + .collect::>(); + mutation_candidate_unknown_descriptor_ids.sort_unstable(); + mutation_candidate_unknown_descriptor_ids.dedup(); let mut control_lane_notes = Vec::new(); if nondirect_compact_record_count != 0 && nondirect_compact_record_count == nondirect_compact_records_missing_trigger_kind @@ -9468,13 +9489,25 @@ fn parse_event_runtime_collection_summary_with_tag_width( } if !mutation_candidate_record_indexes.is_empty() { control_lane_notes.push(format!( - "records with grouped opcodes already in the 0x00431b20 mutation strip = {:?}", + "records with grouped opcodes already in the 0x00431b20 dispatch strip = {:?}", mutation_candidate_record_indexes )); control_lane_notes.push(format!( - "0x00431b20 mutation-strip opcodes present in decoded grouped rows = {:?}", + "0x00431b20 dispatch-strip opcodes present in decoded grouped rows = {:?}", mutation_candidate_opcodes )); + if !mutation_candidate_descriptor_labels.is_empty() { + control_lane_notes.push(format!( + "decoded grouped descriptor labels present in the 0x00431b20 dispatch strip = {:?}", + mutation_candidate_descriptor_labels + )); + } + if !mutation_candidate_unknown_descriptor_ids.is_empty() { + control_lane_notes.push(format!( + "grouped descriptor ids still missing checked-in labels in the 0x00431b20 dispatch strip = {:?}", + mutation_candidate_unknown_descriptor_ids + )); + } } return Some(SmpLoadedEventRuntimeCollectionSummary { @@ -22181,11 +22214,16 @@ mod tests { })); assert!(summary.control_lane_notes.iter().any(|line| { line.contains( - "records with grouped opcodes already in the 0x00431b20 mutation strip = [0]", + "records with grouped opcodes already in the 0x00431b20 dispatch strip = [0]", ) })); assert!(summary.control_lane_notes.iter().any(|line| { - line.contains("0x00431b20 mutation-strip opcodes present in decoded grouped rows = [4]") + line.contains("0x00431b20 dispatch-strip opcodes present in decoded grouped rows = [4]") + })); + assert!(summary.control_lane_notes.iter().any(|line| { + line.contains( + "decoded grouped descriptor labels present in the 0x00431b20 dispatch strip = [\"Company Variable 1\"]", + ) })); let record = summary .records diff --git a/docs/rehost-queue.md b/docs/rehost-queue.md index 4dbb38b..64d0447 100644 --- a/docs/rehost-queue.md +++ b/docs/rehost-queue.md @@ -254,9 +254,17 @@ Working rule: non-row-body control lane rather than the compact row framing itself - the same probe now narrows the candidate runtime-effect set too: it reports which decoded records already carry grouped opcodes in the grounded - `0x00431b20` mutation strip; real `War Effort.gmp` currently narrows that to record indexes - `[1, 9, 12, 13, 14, 15, 16, 17, 22]`, all through opcode `4`, so the next pass can focus on - that smaller subset instead of the full 24-row compact collection + `0x00431b20` dispatch strip; real `War Effort.gmp` currently narrows that to record indexes + `[1, 9, 12, 13, 14, 15, 16, 17, 22]`, all through opcode `4`, with descriptor labels + `Game Variable 1`, `Company Variable 1..4`, and `Player Variable 1`, so the next pass can + focus on that smaller subset instead of the full 24-row compact collection while avoiding the + earlier overclaim that opcode `4` alone already proves a placed-structure mutation row + - cross-map probing now gives a better static-analysis lead too: + `British Isles.gmp` shows no current `0x00431b20` dispatch-strip rows, `Germany.gmp` stays on + `Game Variable 1` plus `Company Variable 3..4`, while `Texas Tea.gmp` adds `Economic Status` + and one still-unlabeled grouped descriptor id `548`; that makes descriptor `548` plus the + `opcode 8` branch on record `7` the next concrete non-hook analysis target above the compact + runtime-event loader - the concrete owner strip above that bundle is grounded now too: `0x00433060` is the direct non-direct serializer loop that writes `0x4e99/0x4e9a/0x4e9b`, calls `0x00430d70` per live collection row, and sits beside the sibling `0x00433130` size/load