From f7a2342a7c98a014e2fe6779f062d4724d230599 Mon Sep 17 00:00:00 2001 From: Jan Petykiewicz Date: Tue, 21 Apr 2026 17:56:53 -0700 Subject: [PATCH] Promote candidate table row families into export --- .../rt3-1.06/candidate-table-named-runs.json | 98 ++++++- ...ect-kind8-tier2-named-availability-note.md | 12 +- .../src/app/runtime_scan/candidate_table.rs | 256 ++++++++++++++++++ ...ntime-roots-camera-and-support-families.md | 14 +- 4 files changed, 370 insertions(+), 10 deletions(-) diff --git a/artifacts/exports/rt3-1.06/candidate-table-named-runs.json b/artifacts/exports/rt3-1.06/candidate-table-named-runs.json index 914ecef..8425ed8 100644 --- a/artifacts/exports/rt3-1.06/candidate-table-named-runs.json +++ b/artifacts/exports/rt3-1.06/candidate-table-named-runs.json @@ -2301,5 +2301,101 @@ } ] } - ] + ], + "files_with_port01_11_run_at_45_55_count": 37, + "files_with_warehouse01_11_run_at_56_66_count": 37, + "port00_warehouse00_row_pair_map_counts": { + "35/43": 30, + "10/18": 7 + }, + "port00_warehouse00_row_pair_map_paths": { + "35/43": [ + "rt3_wineprefix/drive_c/rt3/maps/Alternate USA.gmp", + "rt3_wineprefix/drive_c/rt3/maps/Argentina Opens Up.gmp", + "rt3_wineprefix/drive_c/rt3/maps/Britain.gmp", + "rt3_wineprefix/drive_c/rt3/maps/British Isles.gmp", + "rt3_wineprefix/drive_c/rt3/maps/California Island.gmp", + "rt3_wineprefix/drive_c/rt3/maps/Chicago to New York.gmp", + "rt3_wineprefix/drive_c/rt3/maps/Coast to Coast.gmp", + "rt3_wineprefix/drive_c/rt3/maps/Dutchlantis.gmp", + "rt3_wineprefix/drive_c/rt3/maps/East of Mississippi.gmp", + "rt3_wineprefix/drive_c/rt3/maps/Eastern Canada.gmp", + "rt3_wineprefix/drive_c/rt3/maps/Eastern China.gmp", + "rt3_wineprefix/drive_c/rt3/maps/France.gmp", + "rt3_wineprefix/drive_c/rt3/maps/Germantown.gmp", + "rt3_wineprefix/drive_c/rt3/maps/Greenland Growing.gmp", + "rt3_wineprefix/drive_c/rt3/maps/Ireland.gmp", + "rt3_wineprefix/drive_c/rt3/maps/Japan Trembles.gmp", + "rt3_wineprefix/drive_c/rt3/maps/Louisiana.gmp", + "rt3_wineprefix/drive_c/rt3/maps/Mexico.gmp", + "rt3_wineprefix/drive_c/rt3/maps/Mississippi Valley.gmp", + "rt3_wineprefix/drive_c/rt3/maps/New Beginnings.gmp", + "rt3_wineprefix/drive_c/rt3/maps/Orient Express.gmp", + "rt3_wineprefix/drive_c/rt3/maps/Pacific Coastal.gmp", + "rt3_wineprefix/drive_c/rt3/maps/Pacific NW.gmp", + "rt3_wineprefix/drive_c/rt3/maps/Poland.gmp", + "rt3_wineprefix/drive_c/rt3/maps/Russia.gmp", + "rt3_wineprefix/drive_c/rt3/maps/South East Australia.gmp", + "rt3_wineprefix/drive_c/rt3/maps/South East USA.gmp", + "rt3_wineprefix/drive_c/rt3/maps/Southern Pacific.gmp", + "rt3_wineprefix/drive_c/rt3/maps/Spanish Mainline.gmp", + "rt3_wineprefix/drive_c/rt3/maps/Third Republic.gmp" + ], + "10/18": [ + "rt3_wineprefix/drive_c/rt3/maps/Crossing the Alps.gmp", + "rt3_wineprefix/drive_c/rt3/maps/East Coast, USA.gmp", + "rt3_wineprefix/drive_c/rt3/maps/Germany.gmp", + "rt3_wineprefix/drive_c/rt3/maps/Go West!.gmp", + "rt3_wineprefix/drive_c/rt3/maps/Rhodes Unfinished.gmp", + "rt3_wineprefix/drive_c/rt3/maps/State of Germany.gmp", + "rt3_wineprefix/drive_c/rt3/maps/War Effort.gmp" + ] + }, + "numbered_port_warehouse_trailer_family_map_counts": { + "0x00000001": 28, + "0x00000000": 9 + }, + "numbered_port_warehouse_trailer_family_map_paths": { + "0x00000001": [ + "rt3_wineprefix/drive_c/rt3/maps/Alternate USA.gmp", + "rt3_wineprefix/drive_c/rt3/maps/Argentina Opens Up.gmp", + "rt3_wineprefix/drive_c/rt3/maps/California Island.gmp", + "rt3_wineprefix/drive_c/rt3/maps/Chicago to New York.gmp", + "rt3_wineprefix/drive_c/rt3/maps/Coast to Coast.gmp", + "rt3_wineprefix/drive_c/rt3/maps/Crossing the Alps.gmp", + "rt3_wineprefix/drive_c/rt3/maps/Dutchlantis.gmp", + "rt3_wineprefix/drive_c/rt3/maps/East of Mississippi.gmp", + "rt3_wineprefix/drive_c/rt3/maps/Eastern Canada.gmp", + "rt3_wineprefix/drive_c/rt3/maps/Eastern China.gmp", + "rt3_wineprefix/drive_c/rt3/maps/France.gmp", + "rt3_wineprefix/drive_c/rt3/maps/Germantown.gmp", + "rt3_wineprefix/drive_c/rt3/maps/Go West!.gmp", + "rt3_wineprefix/drive_c/rt3/maps/Japan Trembles.gmp", + "rt3_wineprefix/drive_c/rt3/maps/Louisiana.gmp", + "rt3_wineprefix/drive_c/rt3/maps/Mexico.gmp", + "rt3_wineprefix/drive_c/rt3/maps/Mississippi Valley.gmp", + "rt3_wineprefix/drive_c/rt3/maps/New Beginnings.gmp", + "rt3_wineprefix/drive_c/rt3/maps/Orient Express.gmp", + "rt3_wineprefix/drive_c/rt3/maps/Pacific Coastal.gmp", + "rt3_wineprefix/drive_c/rt3/maps/Pacific NW.gmp", + "rt3_wineprefix/drive_c/rt3/maps/Poland.gmp", + "rt3_wineprefix/drive_c/rt3/maps/Rhodes Unfinished.gmp", + "rt3_wineprefix/drive_c/rt3/maps/Russia.gmp", + "rt3_wineprefix/drive_c/rt3/maps/South East Australia.gmp", + "rt3_wineprefix/drive_c/rt3/maps/South East USA.gmp", + "rt3_wineprefix/drive_c/rt3/maps/Southern Pacific.gmp", + "rt3_wineprefix/drive_c/rt3/maps/Third Republic.gmp" + ], + "0x00000000": [ + "rt3_wineprefix/drive_c/rt3/maps/Britain.gmp", + "rt3_wineprefix/drive_c/rt3/maps/British Isles.gmp", + "rt3_wineprefix/drive_c/rt3/maps/East Coast, USA.gmp", + "rt3_wineprefix/drive_c/rt3/maps/Germany.gmp", + "rt3_wineprefix/drive_c/rt3/maps/Greenland Growing.gmp", + "rt3_wineprefix/drive_c/rt3/maps/Ireland.gmp", + "rt3_wineprefix/drive_c/rt3/maps/Spanish Mainline.gmp", + "rt3_wineprefix/drive_c/rt3/maps/State of Germany.gmp", + "rt3_wineprefix/drive_c/rt3/maps/War Effort.gmp" + ] + } } diff --git a/artifacts/exports/rt3-1.06/runtime-effect-kind8-tier2-named-availability-note.md b/artifacts/exports/rt3-1.06/runtime-effect-kind8-tier2-named-availability-note.md index b954b44..4ee08e6 100644 --- a/artifacts/exports/rt3-1.06/runtime-effect-kind8-tier2-named-availability-note.md +++ b/artifacts/exports/rt3-1.06/runtime-effect-kind8-tier2-named-availability-note.md @@ -79,9 +79,11 @@ Taken together they keep the current frontier narrow and concrete: families remain binding-only canonical stems rather than stock numbered assets. - `event-effects-building-bindings.json` is still the checked event-side naming surface that proves those numbered `Port%02d` / `Warehouse%02d` families matter to runtime dispatch. -- `candidate-table-named-runs.json` now shows the shipped `37` probe-bearing maps split into two - stable `00`-row families while keeping `Port01..11` fixed at rows `45..55` and - `Warehouse01..11` fixed at rows `56..66` in every probe-bearing map. +- `candidate-table-named-runs.json` now carries those stable families explicitly: + `port00_warehouse00_row_pair_map_counts` keeps the `35/43 -> 30 maps` versus `10/18 -> 7 maps` + split visible directly, `port00_warehouse00_row_pair_map_paths` keeps the carrier maps checked + in, and the same export also keeps `files_with_port01_11_run_at_45_55_count = 37` plus + `files_with_warehouse01_11_run_at_56_66_count = 37` across the whole probe-bearing corpus. So the open question is no longer whether the numbered families exist in stock assets, bindings, or shipped candidate tables. The real remaining question is which earlier seed/projection seam @@ -243,6 +245,10 @@ So the surviving frontier is narrower again: `0x00438c70` allocates the live candidate pool through `0x004131f0` and the auxiliary/source pool through `0x0041aa50`, and both constructors tail directly into the same fixed tagged-import families rooted at `0x005c93fc` and `.\Data\BuildingTypes\` +- the trailer split is checked in directly too: the same export's + `numbered_port_warehouse_trailer_family_map_counts` keeps the `0x00000001 -> 28 maps` versus + `0x00000000 -> 9 maps` split on the fixed `Port01..11` / `Warehouse01..11` rows visible without + reopening per-map samples - but the still-missing owner is the earlier non-stock writer or restore-time projection seam that makes some live candidates reach those later consumers with nonzero `[candidate+0xba/+0xbb]` despite the observed all-zero BCA corpus diff --git a/crates/rrt-cli/src/app/runtime_scan/candidate_table.rs b/crates/rrt-cli/src/app/runtime_scan/candidate_table.rs index 24a1fff..e3193d7 100644 --- a/crates/rrt-cli/src/app/runtime_scan/candidate_table.rs +++ b/crates/rrt-cli/src/app/runtime_scan/candidate_table.rs @@ -61,10 +61,26 @@ pub(crate) struct RuntimeCandidateTableNamedRunScanReport { pub(crate) files_with_any_numbered_port_runs_count: usize, pub(crate) files_with_any_numbered_warehouse_runs_count: usize, pub(crate) files_with_both_numbered_run_families_count: usize, + pub(crate) files_with_port01_11_run_at_45_55_count: usize, + pub(crate) files_with_warehouse01_11_run_at_56_66_count: usize, + pub(crate) port00_warehouse00_row_pair_map_counts: BTreeMap, + pub(crate) port00_warehouse00_row_pair_map_paths: BTreeMap>, + pub(crate) numbered_port_warehouse_trailer_family_map_counts: BTreeMap, + pub(crate) numbered_port_warehouse_trailer_family_map_paths: BTreeMap>, pub(crate) skipped_file_count: usize, pub(crate) samples: Vec, } +#[derive(Debug, Default)] +struct RuntimeCandidateTableNamedRunAggregates { + files_with_port01_11_run_at_45_55_count: usize, + files_with_warehouse01_11_run_at_56_66_count: usize, + port00_warehouse00_row_pair_map_counts: BTreeMap, + port00_warehouse00_row_pair_map_paths: BTreeMap>, + numbered_port_warehouse_trailer_family_map_counts: BTreeMap, + numbered_port_warehouse_trailer_family_map_paths: BTreeMap>, +} + pub(crate) fn scan_candidate_table_headers( root_path: &Path, ) -> Result<(), Box> { @@ -193,6 +209,7 @@ pub(crate) fn scan_candidate_table_named_runs( .iter() .filter(|sample| !sample.port_runs.is_empty() && !sample.warehouse_runs.is_empty()) .count(); + let aggregates = build_named_run_aggregates(&samples); let report = RuntimeCandidateTableNamedRunScanReport { root_path: root_path.display().to_string(), @@ -201,6 +218,15 @@ pub(crate) fn scan_candidate_table_named_runs( files_with_any_numbered_port_runs_count, files_with_any_numbered_warehouse_runs_count, files_with_both_numbered_run_families_count, + files_with_port01_11_run_at_45_55_count: aggregates.files_with_port01_11_run_at_45_55_count, + files_with_warehouse01_11_run_at_56_66_count: aggregates + .files_with_warehouse01_11_run_at_56_66_count, + port00_warehouse00_row_pair_map_counts: aggregates.port00_warehouse00_row_pair_map_counts, + port00_warehouse00_row_pair_map_paths: aggregates.port00_warehouse00_row_pair_map_paths, + numbered_port_warehouse_trailer_family_map_counts: aggregates + .numbered_port_warehouse_trailer_family_map_counts, + numbered_port_warehouse_trailer_family_map_paths: aggregates + .numbered_port_warehouse_trailer_family_map_paths, skipped_file_count, samples, }; @@ -386,3 +412,233 @@ pub(crate) fn load_candidate_table_named_run_scan_sample( warehouse_runs, }) } + +fn build_named_run_aggregates( + samples: &[RuntimeCandidateTableNamedRunScanSample], +) -> RuntimeCandidateTableNamedRunAggregates { + let mut aggregates = RuntimeCandidateTableNamedRunAggregates::default(); + + for sample in samples { + if find_named_run(&sample.port_runs, "Port01", "Port11", 45, 55, 11).is_some() { + aggregates.files_with_port01_11_run_at_45_55_count += 1; + } + if find_named_run( + &sample.warehouse_runs, + "Warehouse01", + "Warehouse11", + 56, + 66, + 11, + ) + .is_some() + { + aggregates.files_with_warehouse01_11_run_at_56_66_count += 1; + } + + if let (Some(port00_run), Some(warehouse00_run)) = ( + find_named_run_by_names(&sample.port_runs, "Port00", "Port00", 1), + find_named_run_by_names(&sample.warehouse_runs, "Warehouse00", "Warehouse00", 1), + ) { + let row_pair_key = + format!("{}/{}", port00_run.start_index, warehouse00_run.start_index); + *aggregates + .port00_warehouse00_row_pair_map_counts + .entry(row_pair_key.clone()) + .or_insert(0) += 1; + aggregates + .port00_warehouse00_row_pair_map_paths + .entry(row_pair_key) + .or_default() + .push(sample.path.clone()); + } + + if let (Some(port_run), Some(warehouse_run)) = ( + find_named_run(&sample.port_runs, "Port01", "Port11", 45, 55, 11), + find_named_run( + &sample.warehouse_runs, + "Warehouse01", + "Warehouse11", + 56, + 66, + 11, + ), + ) { + let port_signature = trailer_signature(port_run); + let warehouse_signature = trailer_signature(warehouse_run); + let trailer_family_key = if port_signature == warehouse_signature { + port_signature + } else { + format!("port={port_signature} | warehouse={warehouse_signature}") + }; + *aggregates + .numbered_port_warehouse_trailer_family_map_counts + .entry(trailer_family_key.clone()) + .or_insert(0) += 1; + aggregates + .numbered_port_warehouse_trailer_family_map_paths + .entry(trailer_family_key) + .or_default() + .push(sample.path.clone()); + } + } + + for paths in aggregates + .port00_warehouse00_row_pair_map_paths + .values_mut() + { + paths.sort(); + } + for paths in aggregates + .numbered_port_warehouse_trailer_family_map_paths + .values_mut() + { + paths.sort(); + } + + aggregates +} + +fn find_named_run<'a>( + runs: &'a [RuntimeCandidateTableNamedRun], + first_name: &str, + last_name: &str, + start_index: usize, + end_index: usize, + count: usize, +) -> Option<&'a RuntimeCandidateTableNamedRun> { + runs.iter().find(|run| { + run.first_name == first_name + && run.last_name == last_name + && run.count == count + && run.start_index == start_index + && run.end_index == end_index + }) +} + +fn find_named_run_by_names<'a>( + runs: &'a [RuntimeCandidateTableNamedRun], + first_name: &str, + last_name: &str, + count: usize, +) -> Option<&'a RuntimeCandidateTableNamedRun> { + runs.iter().find(|run| { + run.first_name == first_name && run.last_name == last_name && run.count == count + }) +} + +fn trailer_signature(run: &RuntimeCandidateTableNamedRun) -> String { + run.distinct_trailer_hex_words.join("|") +} + +#[cfg(test)] +mod tests { + use super::{ + RuntimeCandidateTableNamedRun, RuntimeCandidateTableNamedRunScanSample, + build_named_run_aggregates, + }; + + #[test] + fn builds_named_run_aggregate_split_fields() { + let samples = vec![ + RuntimeCandidateTableNamedRunScanSample { + path: "Louisiana.gmp".to_string(), + profile_family: "unknown".to_string(), + source_kind: "map-fixed-catalog-range".to_string(), + observed_entry_count: 67, + port_runs: vec![ + sample_run("Port00", "Port00", 35, 35, 1, vec!["0x00000001"]), + sample_run("Port01", "Port11", 45, 55, 11, vec!["0x00000001"]), + ], + warehouse_runs: vec![ + sample_run("Warehouse00", "Warehouse00", 43, 43, 1, vec!["0x00000001"]), + sample_run("Warehouse01", "Warehouse11", 56, 66, 11, vec!["0x00000001"]), + ], + }, + RuntimeCandidateTableNamedRunScanSample { + path: "State of Germany.gmp".to_string(), + profile_family: "unknown".to_string(), + source_kind: "map-fixed-catalog-range".to_string(), + observed_entry_count: 67, + port_runs: vec![ + sample_run("Port00", "Port00", 10, 10, 1, vec!["0x00000000"]), + sample_run("Port01", "Port11", 45, 55, 11, vec!["0x00000000"]), + ], + warehouse_runs: vec![ + sample_run("Warehouse00", "Warehouse00", 18, 18, 1, vec!["0x00000000"]), + sample_run("Warehouse01", "Warehouse11", 56, 66, 11, vec!["0x00000000"]), + ], + }, + ]; + + let aggregates = build_named_run_aggregates(&samples); + + assert_eq!(aggregates.files_with_port01_11_run_at_45_55_count, 2); + assert_eq!(aggregates.files_with_warehouse01_11_run_at_56_66_count, 2); + assert_eq!( + aggregates + .port00_warehouse00_row_pair_map_counts + .get("35/43"), + Some(&1) + ); + assert_eq!( + aggregates + .port00_warehouse00_row_pair_map_counts + .get("10/18"), + Some(&1) + ); + assert_eq!( + aggregates + .numbered_port_warehouse_trailer_family_map_counts + .get("0x00000001"), + Some(&1) + ); + assert_eq!( + aggregates + .numbered_port_warehouse_trailer_family_map_counts + .get("0x00000000"), + Some(&1) + ); + assert_eq!( + aggregates + .port00_warehouse00_row_pair_map_paths + .get("35/43") + .cloned() + .unwrap_or_default(), + vec!["Louisiana.gmp".to_string()] + ); + assert_eq!( + aggregates + .numbered_port_warehouse_trailer_family_map_paths + .get("0x00000000") + .cloned() + .unwrap_or_default(), + vec!["State of Germany.gmp".to_string()] + ); + } + + fn sample_run( + first_name: &str, + last_name: &str, + start_index: usize, + end_index: usize, + count: usize, + distinct_trailer_hex_words: Vec<&str>, + ) -> RuntimeCandidateTableNamedRun { + RuntimeCandidateTableNamedRun { + prefix: first_name + .trim_end_matches(|ch: char| ch.is_ascii_digit()) + .to_string(), + start_index, + end_index, + count, + first_name: first_name.to_string(), + last_name: last_name.to_string(), + start_offset: 0, + end_offset: 0, + distinct_trailer_hex_words: distinct_trailer_hex_words + .into_iter() + .map(str::to_string) + .collect(), + } + } +} diff --git a/docs/control-loop-atlas/runtime-roots-camera-and-support-families.md b/docs/control-loop-atlas/runtime-roots-camera-and-support-families.md index d0b477d..8d464d6 100644 --- a/docs/control-loop-atlas/runtime-roots-camera-and-support-families.md +++ b/docs/control-loop-atlas/runtime-roots-camera-and-support-families.md @@ -1246,12 +1246,14 @@ families. The root scan narrows the real corpus for that question too. `runtime scan-candidate-table-headers rt3_wineprefix/drive_c/rt3/maps` shows `37` probe-bearing shipped maps and `4` skips, while the - narrower `runtime scan-candidate-table-named-runs` command shows two stable `00`-row families - across those `37` probe-bearing maps: `30` maps keep `Port00` / `Warehouse00` at rows `35` / - `43`, while `7` maps move just those two `00` rows earlier to `10` / `18`; the - `Port01..11` and `Warehouse01..11` runs stay fixed at rows `45..55` and `56..66` in every - probe-bearing map. Trailer families split independently too: `28` maps keep the numbered rows - on trailer `0x00000001`, while `9` maps keep the same row layout but zero the same trailers. + narrower `runtime scan-candidate-table-named-runs` command now keeps those aggregates explicit + too: `port00_warehouse00_row_pair_map_counts` records the two stable `00`-row families across + those `37` probe-bearing maps as `35/43 -> 30 maps` and `10/18 -> 7 maps`, while + `files_with_port01_11_run_at_45_55_count = 37` and + `files_with_warehouse01_11_run_at_56_66_count = 37` keep the `Port01..11` / `Warehouse01..11` + runs fixed at rows `45..55` and `56..66` in every probe-bearing map. Trailer families split + independently too: `numbered_port_warehouse_trailer_family_map_counts` keeps the fixed numbered + rows on `0x00000001 -> 28 maps` versus `0x00000000 -> 9 maps`. The checked-in evidence join is explicit now too: `artifacts/exports/rt3-1.06/building-type-sources.json` still bounds the stock side to bare `port` / `warehouse`, `artifacts/exports/rt3-1.06/event-effects-building-bindings.json` keeps