From b06abb24a7c7ed8df55d949015267321d76a7852 Mon Sep 17 00:00:00 2001 From: Jan Petykiewicz Date: Fri, 17 Apr 2026 11:26:07 -0700 Subject: [PATCH] Tighten static cargo and selection context proofs --- README.md | 12 +- .../event-effects-cargo-bindings.json | 7 + crates/rrt-cli/src/main.rs | 10 + crates/rrt-runtime/src/import.rs | 51 +++- crates/rrt-runtime/src/smp.rs | 70 +++++- docs/README.md | 9 +- docs/runtime-rehost-plan.md | 9 +- ...election-only-context-overlay-fixture.json | 47 ++++ ...-event-selection-only-context-overlay.json | 10 + ...ent-selection-only-context-save-slice.json | 45 ++++ ...stock-prices-shell-save-slice-fixture.json | 39 ++++ ...d-event-stock-prices-shell-save-slice.json | 219 ++++++++++++++++++ 12 files changed, 508 insertions(+), 20 deletions(-) create mode 100644 fixtures/runtime/packed-event-selection-only-context-overlay-fixture.json create mode 100644 fixtures/runtime/packed-event-selection-only-context-overlay.json create mode 100644 fixtures/runtime/packed-event-selection-only-context-save-slice.json create mode 100644 fixtures/runtime/packed-event-stock-prices-shell-save-slice-fixture.json create mode 100644 fixtures/runtime/packed-event-stock-prices-shell-save-slice.json diff --git a/README.md b/README.md index 2bb2abd..cbb2e70 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,8 @@ save-slice fixtures without overlay snapshots when that context is present; raw still does not reconstruct those company/chairman collections automatically, but it now does reconstruct selection-only company/chairman context from the fixed save-side `0x32c8` world block. Those raw selected ids can flow through save-slice export/import and override overlay-backed base -selection even while the full raw rosters remain absent. A checked-in +selection even while the full raw rosters remain absent, and a tracked overlay fixture now pins +that selection-only override path explicitly. A checked-in `EventEffects` export now exists too in `artifacts/exports/rt3-1.06/event-effects-table.json`, and a checked-in semantic closure layer now exists beside it in `artifacts/exports/rt3-1.06/event-effects-semantic-catalog.json`. Recovered @@ -44,7 +45,8 @@ company-governance scalar effect surface: descriptor `56` `Credit Rating` and descriptor `57` `Prime Rate` execute from ordinary real packed rows, while adjacent recovered finance/control-transfer descriptors such as `55` `Stock Prices` and `58` `Merger Premium` now land on explicit shell-owned parity instead of anonymous unmapped -descriptor residue. The recovered whole-game scalar economy/performance strip `59..104` now has a +descriptor residue, and tracked shell-owned fixtures now pin both finance rows explicitly. The +recovered whole-game scalar economy/performance strip `59..104` now has a bounded runtime landing surface too: representative descriptors import into `RuntimeState.world_scalar_overrides` through stable normalized keys such as `world.build_stations_cost`, `world.track_maintenance_cost`, `world.all_engine_speeds`, and @@ -59,8 +61,10 @@ event-owned cargo override state, and the grounded named cargo-production strip imports into named cargo production overrides too. The named cargo-price strip `106..176` remains explicit `blocked_evidence_blocked_descriptor` parity until descriptor ordering is pinned more strongly, but the semantic catalog now gives that band stable `Named Cargo Price Slot N` -labels instead of anonymous `Unknown Cargo Price` residue. The add-building strip `503..519` is -now explicitly classified as recovered +labels instead of anonymous `Unknown Cargo Price` residue. The checked-in static corpora now make +that boundary more explicit too: the broader 1.06 CargoTypes corpus has `51` names and the 1.05 +corpus has `41`, so neither static set closes the `71`-row named price strip on its own. The +add-building strip `503..519` is now explicitly classified as recovered shell-owned descriptor parity rather than generic unresolved residue. The first grounded condition-side unlock now exists for negative-sentinel `raw_condition_id = -1` company scopes, and the first ordinary nonnegative condition batch now executes too: numeric-threshold company diff --git a/artifacts/exports/rt3-1.06/event-effects-cargo-bindings.json b/artifacts/exports/rt3-1.06/event-effects-cargo-bindings.json index f3e8f15..38aa06f 100644 --- a/artifacts/exports/rt3-1.06/event-effects-cargo-bindings.json +++ b/artifacts/exports/rt3-1.06/event-effects-cargo-bindings.json @@ -1,7 +1,14 @@ { "binding_catalog_version": 1, + "static_corpus_counts": { + "named_cargo_price_row_count": 71, + "named_cargo_production_row_count": 50, + "rt3_cargo_types_count": 51, + "rt3_105_cargo_types_count": 41 + }, "notes": [ "Named cargo production bindings are grounded from the checked-in 1.06 CargoTypes corpus and the candidate-loader evidence that live cargo names are materialized in lexicographic order.", + "The checked-in static CargoTypes corpora do not close the named cargo price strip by themselves: the broader rt3 corpus has 51 names, the rt3_105 corpus has 41 names, and neither matches the 71-row named price band.", "The named production strip has 50 rows, so the checked-in binding covers the 50-name lexicographic corpus used by the grounded 1.06 runtime baseline and leaves the named cargo price strip unresolved.", "Rock remains outside the grounded 50-row production strip in this batch." ], diff --git a/crates/rrt-cli/src/main.rs b/crates/rrt-cli/src/main.rs index 3661f58..c9ff173 100644 --- a/crates/rrt-cli/src/main.rs +++ b/crates/rrt-cli/src/main.rs @@ -4548,9 +4548,15 @@ mod tests { .join( "../../fixtures/runtime/packed-event-company-governance-condition-save-slice-fixture.json", ); + let selection_only_context_overlay_fixture = PathBuf::from(env!("CARGO_MANIFEST_DIR")) + .join( + "../../fixtures/runtime/packed-event-selection-only-context-overlay-fixture.json", + ); let credit_rating_descriptor_save_fixture = PathBuf::from(env!("CARGO_MANIFEST_DIR")).join( "../../fixtures/runtime/packed-event-credit-rating-descriptor-save-slice-fixture.json", ); + let stock_prices_shell_save_fixture = PathBuf::from(env!("CARGO_MANIFEST_DIR")) + .join("../../fixtures/runtime/packed-event-stock-prices-shell-save-slice-fixture.json"); let merger_premium_shell_save_fixture = PathBuf::from(env!("CARGO_MANIFEST_DIR")).join( "../../fixtures/runtime/packed-event-merger-premium-shell-save-slice-fixture.json", ); @@ -4651,8 +4657,12 @@ mod tests { .expect("overlay-backed company governance condition fixture should summarize"); run_runtime_summarize_fixture(&company_governance_condition_save_fixture) .expect("save-slice-backed company governance condition fixture should summarize"); + run_runtime_summarize_fixture(&selection_only_context_overlay_fixture) + .expect("overlay-backed selection-only save context fixture should summarize"); run_runtime_summarize_fixture(&credit_rating_descriptor_save_fixture) .expect("save-slice-backed credit-rating descriptor fixture should summarize"); + run_runtime_summarize_fixture(&stock_prices_shell_save_fixture) + .expect("save-slice-backed shell-owned stock-prices fixture should summarize"); run_runtime_summarize_fixture(&merger_premium_shell_save_fixture) .expect("save-slice-backed shell-owned merger-premium fixture should summarize"); run_runtime_summarize_fixture(&investor_confidence_condition_save_fixture) diff --git a/crates/rrt-runtime/src/import.rs b/crates/rrt-runtime/src/import.rs index 62428ec..7e20114 100644 --- a/crates/rrt-runtime/src/import.rs +++ b/crates/rrt-runtime/src/import.rs @@ -4238,6 +4238,41 @@ mod tests { } } + fn real_stock_prices_shell_row( + value: i32, + ) -> crate::SmpLoadedPackedEventGroupedEffectRowSummary { + crate::SmpLoadedPackedEventGroupedEffectRowSummary { + group_index: 0, + row_index: 0, + descriptor_id: 55, + descriptor_label: Some("Stock Prices".to_string()), + target_mask_bits: Some(0x0b), + parameter_family: Some("company_finance_shell_scalar".to_string()), + grouped_target_subject: Some("company".to_string()), + grouped_target_scope: Some("selected_company".to_string()), + opcode: 3, + raw_scalar_value: value, + value_byte_0x09: 0, + value_dword_0x0d: 0, + value_byte_0x11: 0, + value_byte_0x12: 0, + value_word_0x14: 0, + value_word_0x16: 0, + row_shape: "scalar_assignment".to_string(), + semantic_family: Some("scalar_assignment".to_string()), + semantic_preview: Some(format!("Set Stock Prices to {value}")), + recovered_cargo_slot: None, + recovered_cargo_class: None, + recovered_cargo_label: None, + recovered_locomotive_id: None, + locomotive_name: None, + notes: vec![ + "descriptor is recovered in the checked-in effect table as shell_owned parity" + .to_string(), + ], + } + } + fn real_deactivate_player_row( enabled: bool, ) -> crate::SmpLoadedPackedEventGroupedEffectRowSummary { @@ -7179,8 +7214,11 @@ mod tests { standalone_condition_row_count: 0, standalone_condition_rows: Vec::new(), negative_sentinel_scope: None, - grouped_effect_row_counts: vec![1, 0, 0, 0], - grouped_effect_rows: vec![real_merger_premium_shell_row(25)], + grouped_effect_row_counts: vec![2, 0, 0, 0], + grouped_effect_rows: vec![ + real_stock_prices_shell_row(120), + real_merger_premium_shell_row(25), + ], decoded_conditions: Vec::new(), decoded_actions: Vec::new(), executable_import_ready: false, @@ -8494,6 +8532,15 @@ mod tests { .and_then(|summary| summary.records[0].import_outcome.as_deref()), Some("blocked_evidence_blocked_descriptor") ); + assert_eq!( + import + .state + .packed_event_collection + .as_ref() + .and_then(|summary| summary.records[0].grouped_effect_rows.first()) + .and_then(|row| row.descriptor_label.as_deref()), + Some("Named Cargo Price Slot 1") + ); } #[test] diff --git a/crates/rrt-runtime/src/smp.rs b/crates/rrt-runtime/src/smp.rs index 9d3ab6c..9f2e380 100644 --- a/crates/rrt-runtime/src/smp.rs +++ b/crates/rrt-runtime/src/smp.rs @@ -11852,17 +11852,32 @@ mod tests { } #[test] - fn classifies_shell_owned_finance_descriptor_from_checked_in_effect_table() { - let metadata = - real_grouped_effect_descriptor_metadata(58).expect("descriptor metadata should exist"); - - assert_eq!(metadata.label, "Merger Premium"); - assert_eq!(metadata.parameter_family, "company_finance_shell_scalar"); + fn classifies_shell_owned_finance_descriptors_from_checked_in_effect_table() { + let stock_prices = + real_grouped_effect_descriptor_metadata(55).expect("descriptor metadata should exist"); + assert_eq!(stock_prices.label, "Stock Prices"); assert_eq!( - real_grouped_effect_runtime_status_name(metadata.runtime_status), + stock_prices.parameter_family, + "company_finance_shell_scalar" + ); + assert_eq!( + real_grouped_effect_runtime_status_name(stock_prices.runtime_status), "shell_owned" ); - assert!(!metadata.executable_in_runtime); + assert!(!stock_prices.executable_in_runtime); + + let merger_premium = + real_grouped_effect_descriptor_metadata(58).expect("descriptor metadata should exist"); + assert_eq!(merger_premium.label, "Merger Premium"); + assert_eq!( + merger_premium.parameter_family, + "company_finance_shell_scalar" + ); + assert_eq!( + real_grouped_effect_runtime_status_name(merger_premium.runtime_status), + "shell_owned" + ); + assert!(!merger_premium.executable_in_runtime); } #[test] @@ -12065,6 +12080,18 @@ mod tests { assert!(metadata.executable_in_runtime); } + #[test] + fn looks_up_named_cargo_price_slot_descriptor_metadata() { + let metadata = + real_grouped_effect_descriptor_metadata(106).expect("descriptor metadata should exist"); + + assert_eq!(metadata.label, "Named Cargo Price Slot 1"); + assert_eq!(metadata.target_mask_bits, 0x08); + assert_eq!(metadata.parameter_family, "cargo_price_scalar"); + assert_eq!(metadata.runtime_key, None); + assert!(!metadata.executable_in_runtime); + } + #[test] fn looks_up_runtime_variable_descriptor_metadata() { let metadata = @@ -12201,6 +12228,33 @@ mod tests { ); } + #[test] + fn parses_named_cargo_price_row_with_stable_slot_label() { + let row_bytes = build_real_grouped_effect_row(RealGroupedEffectRowSpec { + descriptor_id: 106, + raw_scalar_value: 140, + opcode: 3, + value_byte_0x09: 0, + value_dword_0x0d: 0, + value_byte_0x11: 0, + value_byte_0x12: 0, + value_word_0x14: 0, + value_word_0x16: 0, + locomotive_name: None, + }); + + let row = parse_real_grouped_effect_row_summary(&row_bytes, 0, 0, None) + .expect("row should parse"); + + assert_eq!(row.descriptor_id, 106); + assert_eq!( + row.descriptor_label.as_deref(), + Some("Named Cargo Price Slot 1") + ); + assert_eq!(row.recovered_cargo_label, None); + assert_eq!(row.parameter_family.as_deref(), Some("cargo_price_scalar")); + } + #[test] fn looks_up_recovered_locomotive_policy_descriptor_metadata() { let metadata = diff --git a/docs/README.md b/docs/README.md index 62dc874..837abe9 100644 --- a/docs/README.md +++ b/docs/README.md @@ -99,7 +99,8 @@ The highest-value next passes are now: present; raw `.gms` inspection/export still does not reconstruct full company/chairman rosters, but it now does reconstruct selection-only company/chairman context from the fixed save-side `0x32c8` world block, so overlay imports can reuse base rosters while honoring raw save-native - selected company/chairman ids + selected company/chairman ids, and a tracked overlay fixture now pins that selection-only + override path explicitly - a checked-in `EventEffects` export now exists at `artifacts/exports/rt3-1.06/event-effects-table.json`, and a checked-in semantic closure layer now exists at `artifacts/exports/rt3-1.06/event-effects-semantic-catalog.json` @@ -111,7 +112,7 @@ The highest-value next passes are now: `Prime Rate` - adjacent recovered finance/control-transfer descriptors such as `55` `Stock Prices` and `58` `Merger Premium` now land on explicit shell-owned descriptor parity instead of generic unmapped - descriptor residue + descriptor residue, with tracked fixtures now pinning both finance rows explicitly - the recovered whole-game scalar economy/performance strip `59..104` now has a bounded runtime landing surface too: representative rows execute into `RuntimeState.world_scalar_overrides` through stable normalized keys such as `world.build_stations_cost` and @@ -127,7 +128,9 @@ The highest-value next passes are now: - the named cargo-price strip `106..176` remains explicit `blocked_evidence_blocked_descriptor` parity until descriptor ordering is pinned more strongly, but the checked-in semantic catalog now gives that band stable `Named Cargo Price Slot N` - labels instead of anonymous `Unknown Cargo Price` residue + labels instead of anonymous `Unknown Cargo Price` residue; the checked-in static CargoTypes + corpora also make the current limit explicit because the broader 1.06 corpus has `51` names and + the 1.05 corpus has `41`, while the named price strip still spans `71` descriptors - the add-building strip `503..519` is now explicitly classified as recovered shell-owned parity, with tracked fixture coverage, instead of generic unresolved descriptor residue - widen real packed-event executable coverage descriptor by descriptor after identity, target mask, diff --git a/docs/runtime-rehost-plan.md b/docs/runtime-rehost-plan.md index 53b55ed..49c848b 100644 --- a/docs/runtime-rehost-plan.md +++ b/docs/runtime-rehost-plan.md @@ -61,7 +61,8 @@ Implemented today: without overlay snapshots when the checked-in documents include that context, while raw `.gms` inspection/export still leaves full company/chairman rosters absent; the grounded raw-save tranche now covers only selection-only company/chairman context from the fixed `0x32c8` world - block, which overlay import can use to replace selected ids while preserving base rosters + block, which overlay import can use to replace selected ids while preserving base rosters; a + tracked overlay fixture now pins that selection-only override path explicitly - a checked-in `EventEffects` export now exists too at `artifacts/exports/rt3-1.06/event-effects-table.json`, and a checked-in semantic closure layer now exists at `artifacts/exports/rt3-1.06/event-effects-semantic-catalog.json` @@ -73,7 +74,7 @@ Implemented today: `Prime Rate` now import through ordinary company target lowering - adjacent recovered finance/control-transfer descriptors such as `55` `Stock Prices` and `58` `Merger Premium` now land on explicit shell-owned descriptor parity instead of generic unmapped - descriptor buckets + descriptor buckets, with tracked fixtures now pinning both finance rows explicitly - the recovered whole-game scalar economy/performance strip `59..104` now has a bounded runtime landing surface too: representative descriptors import as `SetWorldScalarOverride` and land in `RuntimeState.world_scalar_overrides` @@ -88,7 +89,9 @@ Implemented today: - the named cargo-price strip `106..176` now sits on explicit `blocked_evidence_blocked_descriptor` parity instead of generic unmapped-descriptor frontier; the checked-in semantic catalog now at least gives that band stable `Named Cargo Price Slot N` - labels instead of anonymous `Unknown Cargo Price` residue + labels instead of anonymous `Unknown Cargo Price` residue, and the checked-in static CargoTypes + corpora now make the evidence gap explicit because they cover `51` names in the broader 1.06 + install and `41` in the 1.05 install while the named price strip still spans `71` descriptors - the add-building strip `503..519` is now explicitly classified as recovered shell-owned parity with tracked fixture coverage, not generic unresolved descriptor residue - a minimal event-owned train surface and an opaque economic-status lane now exist in runtime diff --git a/fixtures/runtime/packed-event-selection-only-context-overlay-fixture.json b/fixtures/runtime/packed-event-selection-only-context-overlay-fixture.json new file mode 100644 index 0000000..ee6cd4c --- /dev/null +++ b/fixtures/runtime/packed-event-selection-only-context-overlay-fixture.json @@ -0,0 +1,47 @@ +{ + "format_version": 1, + "fixture_id": "packed-event-selection-only-context-overlay-fixture", + "source": { + "kind": "captured-runtime", + "description": "Fixture proving selection-only raw save company/chairman context overrides base selected ids without replacing base rosters." + }, + "state_import_path": "packed-event-selection-only-context-overlay.json", + "commands": [ + { + "kind": "service_trigger_kind", + "trigger_kind": 7 + } + ], + "expected_summary": { + "calendar_projection_source": "base-snapshot-preserved", + "calendar_projection_is_placeholder": false, + "company_count": 2, + "chairman_profile_count": 2, + "selected_chairman_profile_id": 2, + "packed_event_collection_present": false, + "event_runtime_record_count": 0, + "total_event_record_service_count": 0, + "total_trigger_dispatch_count": 1 + }, + "expected_state_fragment": { + "selected_company_id": 2, + "selected_chairman_profile_id": 2, + "companies": [ + { + "company_id": 1 + }, + { + "company_id": 2 + } + ], + "chairman_profiles": [ + { + "profile_id": 1 + }, + { + "profile_id": 2 + } + ], + "event_runtime_records": [] + } +} diff --git a/fixtures/runtime/packed-event-selection-only-context-overlay.json b/fixtures/runtime/packed-event-selection-only-context-overlay.json new file mode 100644 index 0000000..0cb94e4 --- /dev/null +++ b/fixtures/runtime/packed-event-selection-only-context-overlay.json @@ -0,0 +1,10 @@ +{ + "format_version": 1, + "import_id": "packed-event-selection-only-context-overlay", + "source": { + "description": "Overlay import document proving selection-only save-native company/chairman context can override base selected ids while preserving base rosters.", + "notes": [] + }, + "base_snapshot_path": "packed-event-chairman-overlay-base-snapshot.json", + "save_slice_path": "packed-event-selection-only-context-save-slice.json" +} diff --git a/fixtures/runtime/packed-event-selection-only-context-save-slice.json b/fixtures/runtime/packed-event-selection-only-context-save-slice.json new file mode 100644 index 0000000..2b1dbbd --- /dev/null +++ b/fixtures/runtime/packed-event-selection-only-context-save-slice.json @@ -0,0 +1,45 @@ +{ + "format_version": 1, + "save_slice_id": "packed-event-selection-only-context-save-slice", + "source": { + "description": "Tracked save-slice document carrying raw-save-derived selection-only company/chairman context without reconstructed rosters.", + "original_save_filename": "captured-selection-only-context.gms", + "original_save_sha256": "selection-only-context-sample-sha256", + "notes": [ + "tracked as JSON save-slice document rather than raw .smp", + "pins the selection-only company/chairman context boundary from the fixed 0x32c8 world block" + ] + }, + "save_slice": { + "file_extension_hint": "gms", + "container_profile_family": "rt3-105-save-container-v1", + "mechanism_family": "rt3-105-save-post-span-bridge-v1", + "mechanism_confidence": "mixed", + "trailer_family": "rt3-105-save-trailer-v1", + "bridge_family": "rt3-105-save-post-span-bridge-v1", + "profile": null, + "candidate_availability_table": null, + "named_locomotive_availability_table": null, + "locomotive_catalog": null, + "cargo_catalog": null, + "company_roster": { + "source_kind": "save-direct-world-block-company-selection-only", + "semantic_family": "scenario-selected-company-context", + "observed_entry_count": 0, + "selected_company_id": 2, + "entries": [] + }, + "chairman_profile_table": { + "source_kind": "save-direct-world-block-chairman-selection-only", + "semantic_family": "scenario-selected-chairman-context", + "observed_entry_count": 0, + "selected_chairman_profile_id": 2, + "entries": [] + }, + "special_conditions_table": null, + "event_runtime_collection": null, + "notes": [ + "selection-only save-native company/chairman context without reconstructed raw rosters" + ] + } +} diff --git a/fixtures/runtime/packed-event-stock-prices-shell-save-slice-fixture.json b/fixtures/runtime/packed-event-stock-prices-shell-save-slice-fixture.json new file mode 100644 index 0000000..29d9844 --- /dev/null +++ b/fixtures/runtime/packed-event-stock-prices-shell-save-slice-fixture.json @@ -0,0 +1,39 @@ +{ + "format_version": 1, + "fixture_id": "packed-event-stock-prices-shell-save-slice-fixture", + "source": { + "kind": "captured-runtime", + "description": "Fixture pinning the explicit shell-owned descriptor frontier for recovered Stock Prices rows." + }, + "state_save_slice_path": "packed-event-stock-prices-shell-save-slice.json", + "commands": [ + { + "kind": "service_trigger_kind", + "trigger_kind": 7 + } + ], + "expected_summary": { + "calendar_projection_source": "default-1830-placeholder", + "calendar_projection_is_placeholder": true, + "company_count": 2, + "chairman_profile_count": 2, + "packed_event_collection_present": true, + "packed_event_record_count": 1, + "packed_event_decoded_record_count": 1, + "packed_event_parity_only_record_count": 1, + "packed_event_blocked_shell_owned_descriptor_count": 1, + "event_runtime_record_count": 0, + "total_event_record_service_count": 0, + "total_trigger_dispatch_count": 1 + }, + "expected_state_fragment": { + "packed_event_collection": { + "records": [ + { + "import_outcome": "blocked_shell_owned_descriptor" + } + ] + }, + "event_runtime_records": [] + } +} diff --git a/fixtures/runtime/packed-event-stock-prices-shell-save-slice.json b/fixtures/runtime/packed-event-stock-prices-shell-save-slice.json new file mode 100644 index 0000000..f9e3dfd --- /dev/null +++ b/fixtures/runtime/packed-event-stock-prices-shell-save-slice.json @@ -0,0 +1,219 @@ +{ + "format_version": 1, + "save_slice_id": "packed-event-stock-prices-shell-save-slice", + "source": { + "description": "Tracked save-slice document pinning a recovered shell-owned Stock Prices descriptor.", + "original_save_filename": "captured-stock-prices-shell.gms", + "original_save_sha256": "stock-prices-shell-sample-sha256", + "notes": [ + "tracked as JSON save-slice document rather than raw .smp", + "pins the explicit shell-owned descriptor frontier for recovered company finance rows" + ] + }, + "save_slice": { + "file_extension_hint": "gms", + "container_profile_family": "rt3-classic-save-container-v1", + "mechanism_family": "classic-save-rehydrate-v1", + "mechanism_confidence": "grounded", + "trailer_family": null, + "bridge_family": null, + "profile": null, + "candidate_availability_table": null, + "named_locomotive_availability_table": null, + "cargo_catalog": null, + "special_conditions_table": null, + "event_runtime_collection": { + "source_kind": "packed-event-runtime-collection", + "mechanism_family": "classic-save-rehydrate-v1", + "mechanism_confidence": "grounded", + "container_profile_family": "rt3-classic-save-container-v1", + "metadata_tag_offset": 28864, + "records_tag_offset": 29120, + "close_tag_offset": 29632, + "packed_state_version": 1001, + "packed_state_version_hex": "0x000003e9", + "live_id_bound": 75, + "live_record_count": 1, + "live_entry_ids": [ + 75 + ], + "decoded_record_count": 1, + "imported_runtime_record_count": 0, + "records": [ + { + "record_index": 0, + "live_entry_id": 75, + "payload_offset": 29122, + "payload_len": 120, + "decode_status": "parity_only", + "payload_family": "real_packed_v1", + "trigger_kind": 7, + "active": null, + "marks_collection_dirty": null, + "one_shot": false, + "compact_control": { + "mode_byte_0x7ef": 6, + "primary_selector_0x7f0": 99, + "grouped_mode_0x7f4": 2, + "one_shot_header_0x7f5": 1, + "modifier_flag_0x7f9": 1, + "modifier_flag_0x7fa": 0, + "grouped_target_scope_ordinals_0x7fb": [ + 0, + 1, + 2, + 3 + ], + "grouped_scope_checkboxes_0x7ff": [ + 1, + 0, + 1, + 0 + ], + "summary_toggle_0x800": 1, + "grouped_territory_selectors_0x80f": [ + -1, + 10, + -1, + 22 + ] + }, + "text_bands": [], + "standalone_condition_row_count": 0, + "standalone_condition_rows": [], + "negative_sentinel_scope": null, + "grouped_effect_row_counts": [ + 1, + 0, + 0, + 0 + ], + "grouped_effect_rows": [ + { + "group_index": 0, + "row_index": 0, + "descriptor_id": 55, + "descriptor_label": "Stock Prices", + "target_mask_bits": 11, + "parameter_family": "company_finance_shell_scalar", + "opcode": 3, + "raw_scalar_value": 120, + "value_byte_0x09": 0, + "value_dword_0x0d": 0, + "value_byte_0x11": 0, + "value_byte_0x12": 0, + "value_word_0x14": 0, + "value_word_0x16": 0, + "row_shape": "scalar_assignment", + "semantic_family": "scalar_assignment", + "semantic_preview": "Set Stock Prices to 120", + "locomotive_name": null, + "notes": [ + "descriptor recovered in the checked-in effect table as shell_owned parity" + ] + } + ], + "decoded_conditions": [], + "decoded_actions": [], + "executable_import_ready": false, + "notes": [ + "stock-prices descriptor is recovered but remains shell-owned parity" + ] + } + ] + }, + "notes": [ + "recovered shell-owned company-finance descriptor sample" + ], + "company_roster": { + "source_kind": "tracked-save-slice-company-roster", + "semantic_family": "save-slice-runtime-company-context", + "observed_entry_count": 2, + "selected_company_id": 1, + "entries": [ + { + "company_id": 1, + "active": true, + "controller_kind": "human", + "current_cash": 150, + "debt": 80, + "credit_rating_score": 650, + "prime_rate": 5, + "available_track_laying_capacity": 6, + "track_piece_counts": { + "total": 20, + "single": 5, + "double": 8, + "transition": 1, + "electric": 3, + "non_electric": 17 + }, + "linked_chairman_profile_id": 1, + "book_value_per_share": 2620, + "investor_confidence": 37, + "management_attitude": 58, + "takeover_cooldown_year": 1839, + "merger_cooldown_year": 1838 + }, + { + "company_id": 2, + "active": true, + "controller_kind": "ai", + "current_cash": 90, + "debt": 40, + "credit_rating_score": 480, + "prime_rate": 6, + "available_track_laying_capacity": 2, + "track_piece_counts": { + "total": 8, + "single": 2, + "double": 2, + "transition": 0, + "electric": 1, + "non_electric": 7 + }, + "linked_chairman_profile_id": 2, + "book_value_per_share": 1400, + "investor_confidence": 22, + "management_attitude": 31, + "takeover_cooldown_year": null, + "merger_cooldown_year": null + } + ] + }, + "chairman_profile_table": { + "source_kind": "tracked-save-slice-chairman-profile-table", + "semantic_family": "save-slice-runtime-chairman-context", + "observed_entry_count": 2, + "selected_chairman_profile_id": 1, + "entries": [ + { + "profile_id": 1, + "name": "Chairman One", + "active": true, + "current_cash": 500, + "linked_company_id": 1, + "company_holdings": { + "1": 1000 + }, + "holdings_value_total": 700, + "net_worth_total": 1200, + "purchasing_power_total": 1500 + }, + { + "profile_id": 2, + "name": "Chairman Two", + "active": true, + "current_cash": 250, + "linked_company_id": 2, + "company_holdings": { + "2": 900 + }, + "holdings_value_total": 600, + "net_worth_total": 900, + "purchasing_power_total": 1100 + } + ] + } + } +}