# Input, Save/Load, and Simulation: Event Editors, CompanyDetail, and LoadScreen ### Event Editors and Scenario Action Windows The event side is tighter too: that `0x00433130` pass in turn materializes each live event record through `scenario_event_refresh_runtime_record_from_packed_state` `0x0042db20`. Current shell-side xrefs now tighten that event branch too: the first rebuilt linked row family under `0x0042db20` aligns with the standalone condition list later queried by `EventConditions.win`, while the second rebuilt family aligns with the four grouped effect lists later deep-copied through `scenario_event_clone_runtime_record_deep_copy` `0x0042e050` during event duplication and effect staging. The condition side is tighter now too: the tiny helper cluster `0x0042df30/0x0042df70/0x0042dfb0/0x0042dff0` is no longer just "some adjacent list scans". Current evidence bounds it as four predicates over the standalone `0x1e`-row condition list, testing class bits `0x01`, `0x02`, `0x04`, or any of those bits in the static table `0x005f3e04 + id*0x81`, with special fallback checks through event fields `[event+0x7f9]`, `[event+0x7fa]`, and `[event+0x7f0] == 0x63`. The shell side is tighter too: vtable slot `0x005d0cd8` now binds `shell_event_conditions_window_handle_message` `0x004d59e0`, and vtable slot `0x005d0cf8` binds `shell_event_effects_window_handle_message` `0x004d7060`. The effects side is tighter too: the lower helper trio is no longer anonymous. `0x004d5d00` now reads as the effect-type selector refresh under control family `0x4fb2`, `0x004d5f50` reads as the selected effect parameter-row repaint, `0x004d6090` is the heavier staged-effect editor refresh over the `0x4fc7/0x4fce/0x4ff6/0x4ff9/0x4ffc/0x5041/0x5044/0x5046/0x5047` bands, and `0x004d67f0` commits the current editor state back into the staged effect row at `[this+0x78]`. The verb side is tighter now too: `shell_open_event_conditions_modal_and_return_result` `0x004d9dc0` and `shell_open_event_effects_modal_and_return_result` `0x004d9e40` are the shared modal openers above the two editor windows; `0x004da640`, `0x004da700`, and `0x004d9ed0` now read as the add, edit, and remove verbs for standalone condition rows; `0x004da7c0`, `0x004da860`, and `0x004da920` are the matching add, edit, and remove verbs for grouped effect rows; and `0x004d8120` is now the heavier condition-row list panel refresh those condition-side verbs re-enter after mutation. The conditions-side refresh split is tighter too: `0x0042d700` aggregates standalone condition-list class or modifier flags, `0x0042d740` aggregates grouped effect-row type flags for one selected grouped list, `0x004d9970` owns the condition-class summary and grouped-row status bands, `0x004d77b0` owns the grouped summary-band affordance gate for `0x4fed..0x4ff0` when selector `0x5000` lands on `0x5002`, `0x004d9d10` owns the smaller grouped-effect territory-target affordance on control `0x500b`, `0x004d9f50` owns the selected-event mode strip and summary text panels, and `0x004d9390` is the mode-dependent detail-row switch beneath that strip. `0x004da0f0` is tighter too: selector `0x5001` now has the strongest current RT3.lng fit as the condition-side `Test against...` mode above `0x004d9970`, while selector `0x5002` has the strongest current fit as the grouped-effect-side `Apply effects...` mode. That `0x5002` branch now clearly builds control `0x5014` from RT3.lng `1160..1164` as `to the company/player/player (i.e. chairman)/territory for which the condition is TRUE` before enabling the adjacent `0x5005`, `0x500a`, and `0x5014..0x501c` family. The strongest current RT3.lng fit for the remaining visible target-scope strip is now `0x5015 = to the whole game`, `0x5016..0x5018 = to all/human/AI companies`, `0x5019 + 0x500b = to territories`, and `0x501a..0x501c = to all/human/AI players`; the grouped effect-row type mask matches that split directly through bits `0x08`, `0x01`, `0x04`, and `0x02`. The selected-event strip is tighter now too: `0x004db120` is the broader selected-event repaint and navigation refresh above those smaller helpers, `0x004db520` and `0x004db5e0` are the previous and next selected-event stepping verbs, `0x004db8b0` is the add-or-clone event modal helper, `0x004dba90` is the rename verb, `0x004d9360` is the delete verb, `0x004db6a0` is the live selected-event id setter behind control `0x4e84`, and `0x004db6f0` is the callback-binding plus pending-selection bootstrap path that seeds the strip during window bring-up. The larger dispatcher at `0x004dbb80` now makes the strip explicit: `0x4e85..0x4e8a` are previous, next, add blank, clone selected, rename, and delete event, while the later grouped band commits current summary state through `0x004d8d50` before changing grouped selector `[this+0x9c]` via `0x004dbf93`. The selection bootstrap side is tighter too: `0x004daf40` is now the placeholder reset helper for the selected-event summary controls `0x4eaf`, `0x4eac`, `0x4ed9`, `0x4edb`, and `0x4fdf..0x4fe2`. The grouped target-scope side is tighter too: `0x004d8ea0` now reads as the commit helper for current selected-event text panels before selection or grouped-action changes, `0x004d8d50` now records the hidden selector family `0x5006..0x500e -> 0..8`, and `0x004dab60` projects that ordinal one-to-one onto the visible grouped-effect target-scope display strip `0x5014..0x501c`. That split is firmer now: `0x5006..0x500e` are the canonical hidden selectors that get stored into `[event + group + 0x7fb]`, while `0x5014..0x501c` are the visible mirror rows republished from that same ordinal rather than a second independently named selector family. The grouped row and stored-summary refresh side is tighter too: `0x004d88f0` is now the selected grouped-effect row-list renderer for `0x4ed5`, formatting the grouped `0x28`-byte rows through RT3.lng `1154..1159`, and `0x004da9a0` is the current grouped-summary-state republisher that reloads `0x500a`, `0x500b`, and visible action selection `0x5014..0x501c` from `[event + group + ...]` before tailing back into `0x004da0f0`, `0x004dbfca` as the grouped target-scope mode selector that persists the chosen control id into `0x00622074`, with `0x5001/0x5002` now strongest-fit as `Test against...` and `Apply effects...`, `0x004dbeeb` as the pending shared summary-text triplet publish helper for `0x4eac/0x4ed9/0x4edb`, `0x004d91e0` as the selected-event summary-header and grouped-mode commit helper above `0x004d8d50`, and `0x004dbe7a` as the narrower `0x4ec6/0x4ec7` choice-event single-player-only warning modal branch rooted at RT3.lng `3887`. The remaining gaps on this lane are narrower again because the grouped-band `0x4dc09c` table now closes one earlier overclaim: controls `0x5001/0x5002` are the only `0x4fed..0x501c` entries that route into `0x004dbfca` on the `0xcf` side, while visible rows `0x5014..0x501c` only route to the smaller `0x004d9d10` affordance path and the rest of `0x4ff1..0x5013` are default no-ops. The open question is therefore no longer whether those visible target-scope rows are direct selector verbs; current evidence says they are not. The local slot records are rooted at `[world+0x69d8]`, `[slot+0x01]` polarity and the external role gate at `[world+0x0bc3+slot*9]` are now grounded, and `[slot+0x03]` now looks like the distinguished primary-human-seat marker because current grounded writes seed it only on slot zero and later logic moves it solely by whole-record compaction. The open question is no longer whether the seeded trio lands in the visible shell company roster; current evidence says it does, and ordinary `Start New Company` now looks like a fresh-company allocator through `start_new_company_dialog_commit_create_company` and `start_new_company_request_create_company`, not like the path that claims one of the seeded named railroads. The immediate post-roster station branch is now clearly separate: current grounded resource names and handlers put mode `8` on `StationDetail.win`, mode `5` on `StationList.win`, and the subordinate modal selector helper on `StationPick.win` through `shell_station_pick_window_open_modal_and_return_selected_station_id` above `shell_station_pick_window_construct`. The company-side ownership question has therefore moved down a layer rather than staying open. We now have a recovered `CompanyDetail.win` owner family through `shell_company_detail_window_refresh_controls`, `shell_company_detail_window_construct`, and `shell_company_detail_window_handle_message`; the same owner now has one broader bounded read-side lane too, because control `0x9470` uses `shell_company_detail_render_financial_history_panel` to draw the five-step Revenue or Expenses or Interest or Profit or Lifetime strip, sibling control `0x9471` reuses `shell_format_company_financial_summary_card` through `shell_company_detail_render_company_summary_card`, controls `0x947d` and `0x947e` now ground a bond maturity and repay panel through `shell_company_detail_render_bond_maturity_and_repay_panel`, control `0x9488` now grounds the debt or credit or rate summary block through `shell_company_detail_render_debt_credit_and_rate_summary_panel`, control `0x948a` now grounds the share-value and dividend-payout block through `shell_company_detail_render_share_value_and_dividend_summary_panel`, while the broader six-row per-share stock-data family is now bounded under `shell_format_company_stock_data_panel`, and the adjacent territory selector lane is bounded through `shell_company_detail_select_territory_access_row`, `shell_company_detail_render_territory_access_row`, `shell_company_detail_sync_selected_territory_from_picker`, and `shell_company_detail_refresh_selected_territory_access_summary`; the first finance-action layer beneath it is bounded through the bond, stock-issue, stock-buyback, and dividend-rate helpers; the territory-access side is bounded too through `shell_company_detail_refresh_selected_territory_access_summary`, `shell_company_detail_buy_territory_access_rights_flow`, and the underlying company access-rights helpers; and the full takeover and merger vote-result lane is now grounded through `shell_resolve_chairmanship_takeover_vote_and_commit_outcome`, `shell_present_chairmanship_takeover_vote_outcome_dialog`, `shell_resolve_merger_vote_and_commit_outcome`, and `shell_present_merger_vote_outcome_dialog`. The remaining company-side uncertainty is therefore narrower than before: the broader support and valuation side is now tighter too because `company_compute_cached_recent_per_share_performance_subscore`, `company_compute_five_year_weighted_shareholder_return`, and `company_compute_public_support_adjusted_share_price_scalar` bound the recent per-share performance and investor-support/share-price blend beneath those vote resolvers; the recent per-share feeder now has a grounded four-lane tail too, with current partial-year weight `(5 * [world+0x0f]) - 5`, prior full-year weights `48/36/24/12` on `0x1f/0x1e`, dividend non-decline pair weights `9/8/7/6` on `0x20`, lane weights `40/10/20/30`, the startup age ramp `0/0/0/100 -> 25/25/35/100 -> 50/50/65/100 -> 75/75/85/100 -> 100/100/100/100`, a strongest-lane `*1.25` boost, a weakest-lane `*0.8` reduction, and separate bounded-intermediate versus final difficulty applications under `0x005f33b8`; the next consumer `0x00424fd0` is also tighter now, with the young-company interpolation against `[company+0x57]`, caller pressure clamped to `[-0.2, 0.2]`, one `(shares / 20000)^0.33` share-count growth term, and the later threshold ladder `0.6 / 0.45 / 0.3 / 1.7 / 2.5 / 4.0 / 6.0` before the issue-`0x37` multiplier, `scenario_state_compute_issue_opinion_multiplier` now bounds the next layer of optional company, chairman, and territory-specific opinion overrides on the active scenario state, and the broader stat-reader family around `company_read_control_transfer_metric_slot` and `company_read_year_or_control_transfer_metric_value` is no longer just a merger-premium helper. Current grounded callers show the same metric family feeding the annual shareholder-revolt and creditor-liquidation lane surfaced by localized ids `300..304`, while the debt-side shell and bond lane now separately close `0x38` as `Credit Rating` and `0x39` as `Prime Rate`. That means the remaining gap is now mostly gone on the UI side too: issue `0x37` is already bounded to the same investor-confidence family as the equity-support and governance-pressure paths, and current grounded UI evidence still stops at the investor-attitude sentence family rather than one standalone caption. The calendar side is tighter now too: `[world+0x15]` is the absolute counter for the same mixed-radix `12 x 28 x 3 x 60` year-plus-subfield tuple packed by `0x0051d3c0` and unpacked by `0x0051d460`, not just a vague “calendar-like” blob. The `TrackLay.win` family now clearly owns `Lay single track.` `Lay double track.` and `Bulldoze` as its three primary modes, its bridge selector, its wrapped frequency preferences, and a strongly aligned pair of `Auto-Hide Trees During Track Lay` and `Auto-Show Grade During Track Lay` toggles; the `StationPlace.win` family now clearly owns its six top-level category buttons, the station-style scroller, and the station-rotation controls. The older `Building placement center` string 671 no longer looks like a live StationPlace control label in the current recovered flow, because the active constructor, preview, refresh, and dispatcher paths all use neighboring ids such as 669 and 2208 without a direct recovered lookup of 671. On save or load the broad serialize-versus-restore split is now grounded, the non-Quicksave `.gmp/.gmx/.gmc/.gms` families are separated, and the auxiliary `.gmt` path is at least bounded to the preview-surface side owner. The higher-value shell-facing gap has therefore shifted upward to the remaining semantics of the post-load generation phases, the later recurring structure-population cadence, the deeper vote-weight formulas inside takeover and merger resolution, and the still-open meaning of the packed simulation calendar tuple. ### CompanyDetail and Section Ownership The shell detail family now has an explicit section-selector lane in addition to the read-side panels already mapped. Controls `0x9472..0x9475` directly select the four visible CompanyDetail sections through `0x006cfe60`, `0x9476..0x9479` are the companion visual controls for that same tab strip, and section `0` is now bounded more tightly as the chairman or governance slice around the portrait-backed chairman band on `0x9480` plus the dynamic overview widget `0x947f`. That widget is no longer just a vague status line: the section-0 refresh binds it through a dedicated stack-built dynamic text path, and the strongest current shared formatter candidate is `shell_format_company_governance_and_economy_status_panel` at `0x004e5cf0`, which first renders a five-line company-metric preamble through localized ids `1211..1215`: `Revenues` from slot `0x2c`, `Profits` from slot `0x2b`, `Load miles hauled` from slot `0x17`, `Revenue per load mile` from the derived `slot 0x2c / slot 0x17` branch, and `Average speed` from slot `0x26` rendered through `1216` `%1 m.p.h.`. It then splits the governance summary more concretely: no linked chairman emits `3045`, wholly owned companies emit `3046` for the scenario-selected chairman or `3047` for another linked chairman, and investor-owned companies emit the investor-attitude lines `3048/3049` with one adjective from the table at `0x00622170`. That branch is no longer using unnamed helpers either: `company_get_linked_chairman_profile_record` `0x00426ef0` resolves the linked chairman profile and `chairman_profile_owns_all_company_shares` `0x004768c0` is the full-ownership test behind the `3046/3047` split. The salary side is tighter too: the formatter computes one signed delta from `[company+0x14f]` and `[company+0x0d59]`, then chooses `3050..3052` for the scenario-selected chairman or `3053..3055` for another linked chairman depending on whether that delta is negative, positive, or zero. The bonus line is narrower still: it only appears when the display year matches `[company+0x34f]`, using amount `[company+0x353]` with `3056` or `3057`. It then appends the `1218` `Economy status - %1.` tail caption and stages the adjacent selected-company report or list help-title pairs `1219/1220` `Income Statement`, `1221/1222` `Balance Sheet`, `1223/1224` `Haulage Report`, `1225/1226` `Stock Report`, `1227/1228` `Train List`, `1229/1230` `Station List`, `1231/1232` `Industry List`, and `1233/1234` `Cargo List`. Current evidence still does not recover separate `CompanyDetail.win` action controls for that strip under `shell_company_detail_window_handle_message`, so it currently reads as staged overview text or help content rather than as a closed launcher family. The direct `0x947f` formatter call is still indirect, but the widget boundary is tighter too: the generic shell helpers `shell_control_refresh_matching_dynamic_text_payload` `0x00540a47` and `shell_control_release_dynamic_text_payload` `0x005639d2` now show that type `0x6f` controls free or swap one heap-backed text payload and then short-circuit as a special dynamic-text case, which strengthens the reading of `0x947f` as a display-only overview widget rather than a normal callback control. One adjacent boundary is tighter now too: the broader overview wrapper at `shell_render_company_overview_panel_header_and_optional_change_affordance` `0x004e5a80` owns the fallback no-company texts `1210`, `3043`, and `3888`, styles controls `0x3f06` and `0x3f07`, and on the narrower selected-company branch appends `3044` `Click to change company name and logo.` plus the neighboring `1941` `Change` affordance before falling through into the shared `0x004e5cf0` text body. That keeps the name/logo affordance outside the ordinary `CompanyDetail.win` action dispatcher and makes the `0x947f` alignment cleaner. The message-side action band is tighter too: `0x94b5` grounds territory-access purchase, `0x94b6` grounds bankruptcy, `0x94cf..0x94d2` ground bond issue, stock issue, stock buyback, and dividend-rate changes, `0x9493` routes into the destructive company-clear helper that deactivates the selected company and clears chairman/share links, `0x94d6` grounds bankruptcy, `0x94d7..0x94da` ground bond issue, stock issue, stock buyback, and dividend-rate changes, `0x94db` grounds merger, `0x94dc` grounds resignation, and `0x9538` grounds chairmanship takeover. The finance-side dialog family is tighter too: the bond-issue lane now has the dedicated modal renderer `shell_company_detail_render_issue_bond_offer_dialog` `0x004c3560` for underwriter terms `968..972`, the stock-issue lane has `shell_company_detail_render_issue_stock_offer_dialog` `0x004c3b50` for the staged offer lines `975..978`, and the buyback lane has `shell_company_detail_render_stock_buyback_offer_dialog` `0x004c4300` for broker lines `981..984`. The compact summary card on sibling control `0x9471` is tighter too: `shell_format_company_financial_summary_card` at `0x004bfb30` now clearly renders `Cash:`, `Revenue:`, and `Profits:` from company slots `0x0d`, `0x2c`, and `0x2b`, rather than one looser unnamed finance block. The dividend lane is now split the same way: `shell_company_detail_setup_dividend_rate_adjust_controls` `0x004c4c70` binds the paired adjust controls `0x99e8` and `0xc0f9`, `shell_company_detail_render_change_dividend_rate_dialog` `0x004c4e30` renders localized ids `988..990`, and `shell_company_detail_handle_change_dividend_rate_dialog_message` `0x004c5140` clamps the staged dividend rate against `company_compute_board_approved_dividend_rate_ceiling` `0x00426260` and raises localized id `991` when the board refuses a higher dividend, all before the existing company commit path. All four finance verbs now converge through the shared callback-driven modal opener `shell_open_custom_modal_dialog_with_callbacks` `0x004c98a0`, which is also reused by the multiplayer staged text-entry lane. The front controls in section `0` are tighter too: `0x948b` is a tutorial-guarded escape or back control that shows localized id `3724` `This option is disabled in the tutorial.` before falling back to the shell detail-manager escape path, `0x9491` and `0x9492` only restyle the paired visuals `0x948f` and `0x9490`, and `0x9494` opens localized id `3635` `Enter the amount that your company's cash should be` and writes the accepted value directly into the selected company cash pair. The neighboring debt section is tighter now too: controls `0x947d` and `0x947e` no longer read as one-off bond widgets, but as the owners of two repayable bond-slot row bands, `0x94e8..0x950f` and `0x9510..0x9537`. Those row controls now clearly converge on the same repayment path in the message dispatcher: they reject unaffordable repayment through localized id `2990`, open the early-repayment confirmation rooted at `2991`, and then either commit through `company_repay_bond_slot_and_compact_debt_table` `0x00423d70` or package the request through the multiplayer shell transport. The render-side owner is tighter too: `shell_company_detail_render_bond_maturity_and_repay_panel` formats `Due %1` and `Repay this bond.` for the selected debt slot while the tiny binder `shell_company_detail_bind_bond_row_band_for_active_panel` switches between the two row bands. Current `0xcb` dispatch does not treat `0x948f`, `0x9490`, `0x94d4`, or `0x94d5` as standalone action cases. The message-side jump table now makes that passive/action split explicit too: in the dispatch byte map rooted at `0x004c6640`, controls `0x94d6..0x94dc` map to cases `0x06..0x0c`, control `0x9538` maps to case `0x0d`, and the neighboring companion rows `0x94d4` and `0x94d5` stay on the default path. The refresh-side ownership is tighter too: the helper now explicitly loops over `0x94d4..0x9537` as the selected-company-owned band and over `0x9538..0x959b` as the linked-chairman-owned band, and those two loops do not use the same style polarity. `0x94d4..0x9537` take style `0x65` when the selected company matches the scenario-selected company and `0x87` when it differs, while `0x9538..0x959b` take style `0x87` when the selected company's linked chairman matches the scenario-selected chairman and `0x65` otherwise. The selected-company action side is tighter now too: scenario toggle `0x006cec78+0x4a8f` re-enables bankruptcy `0x94d6` together with passive companion row `0x94d4`, `+0x4a8b` re-enables issue bonds `0x94d7` together with passive companion row `0x94d5`, `+0x4a87` re-enables stock issue and stock buyback `0x94d8..0x94d9`, `+0x4a93` re-enables dividend `0x94da` together with the same passive companion row `0x94d5`, `+0x4adb` re-enables merger `0x94db`, `+0x4acb` re-enables resignation `0x94dc`, and `+0x4acf` re-enables chairmanship takeover `0x9538`. That makes `0x94d4/0x94d5` read more like passive companion or heading widgets than hidden verbs. The constructor boundary is tighter too: current `CompanyDetail.win` setup still only binds explicit callbacks for `0x9470`, `0x9471`, `0x947d`, `0x947e`, and `0x948c..0x948e`, not for the wider section-0 row bands. That keeps the remaining `0x94d4..0x959b` content looking more like resource-defined display rows that are gated and restyled by refresh than like individually code-rendered widgets. That leaves the main remaining CompanyDetail-specific shell edge at the exact `0x947f` formatter binding plus the still-unsplit render-side governance rows inside `0x94d4..0x959b`. ### Adjacent LoadScreen.win Report Family The neighboring shell lane around controls `0x3ef6..0x4073` is now separated from `CompanyDetail` instead of being treated as one more extension of the `0x947f` overview path. The real outer owner is `shell_load_screen_window_construct` `0x004ea620`, which binds `LoadScreen.win`, randomizes the `LoadScreen%d.imb` background family, stores the singleton at `0x006d10b0`, and seeds the first visible page-strip controls. Above the older page-specific work, the real message owner is now `shell_load_screen_window_handle_message` `0x004e3a80`: it owns page id `[this+0x78]`, page-local substate `[this+0x7c]`, page-kind `[this+0x80]`, current company `[this+0x88]`, current chairman profile `[this+0x8c]`, display year `[this+0x9c]`, and the page-local report row latch `[this+0x118]`, then fans back into the shared selector `shell_load_screen_select_page_subject_and_refresh` `0x004e2c10`, the company-step helper `0x004e3a00`, and narrower page branches such as `0x004e45d0`. The matching render-side owner is now bounded too: `shell_load_screen_render_active_page_panel` at `0x004ea060` formats the common heading and panel frame, then switches on page id `[this+0x78]` and hands control down into the active page body. That older branch is now demoted to what it actually is: `shell_load_screen_profile_stock_holdings_page_handle_message`, the page-specific handler beneath the stock-holdings slice. Inside that same family, `shell_load_screen_render_profile_stock_holdings_summary_panel` at `0x004e5300` grounds the selected-profile holdings page: it resolves the current chairman profile from `[this+0x8c]`, renders the top summary rows `1204` `Stock Value:`, `1205` `Total Assets:`, and `1206` `Stock Holdings:`, then walks the active company roster and formats one row per positive holding through `1201` `Click to view details on %1.`, `1207` `%1 Shares`, and `1208` `%1 Value`, falling back to `1209` `None` when no positive holdings survive. It also appends `3029` `Click to change player name and portrait.` plus the adjacent `1941` `Change` affordance only when the rendered profile matches the scenario-selected chairman. The earlier pages are tighter now too: `0x004e68e0` is the selected-company financial ranking page using the active company roster plus `1235..1245` for revenue, profit, cash, track mileage, and report affordances; and `0x004e6ef0` is the active-chairman wealth ranking page using the chairman profile collection plus `1237`, `1241`, `1246..1250` for cash, stock, total, and purchasing-power style comparisons. The later sibling renderers are broader than that one holdings page now too: `0x004e7670` is the selected-company train list page using `1235..1267`, `0x004e8270` is the selected-company building list page using `1268..1278`, `0x004e8bb0` is the selected-company station list page using `1279..1288`, and `0x004e9460` is the map-wide cargo list page using `1289..1298` over the live candidate collection rather than one company roster. The last broad early-page owner is tighter now too: `0x004e9b20` is the shared multi-year company report-table renderer for page `4` `Income Statement`, page `5` `Balance Sheet`, and page `6` `Haulage Report`, all driven from `0x004ea060` with one caller-supplied mode byte and yearly company rows built through `company_read_year_or_control_transfer_metric_value`. The row families are bounded too: income-statement rows `1301..1315`, balance-sheet rows `2816` and `1317..1322`, and haulage-report rows `1323..1335`. The only special rows inside that family are now tighter too: `0x00425880` and `0x004258c0` provide the negative-cash and positive-cash interest-rate inserts for the `%1/%2` placeholders in strings `2815` and `2816`, so they are no longer anonymous private math blobs. The adjacent early siblings are tighter now too: `0x004e5130` is the selected-company `Stock Data` page wrapper that falls back through `1299` and otherwise reuses `0x004c0160` to render the `Largest Shareholders`, `Shares`, and `Per Share Data` family; `0x004e6ef0` is the `Player List` page; `0x004e5300` is the `Player Detail` holdings page; and `0x004e51ea` is the `Game Status` briefing panel that pulls current scenario briefing text from the live scenario text store and appends the `1772/1773` `Briefing` affordance. The active-page renderer at `0x004ea060` is now tighter too because its 13-byte page descriptor table at `0x006220a0` has been decoded directly as `{ page kind, title string id, `0x3ef8` backlink page, selected-company-header flag }`. The currently grounded rendered title order is: `XXX`, `COMPANY OVERVIEW`, `COMPANY LIST`, `INCOME STATEMENT`, `BALANCE SHEET`, `HAULAGE REPORT`, `STOCK DATA`, `PLAYER LIST`, `PLAYER DETAIL`, `GAME STATUS`, `TRAIN LIST`, `TRAIN DETAIL`, `STATION LIST`, `STATION DETAIL`, `CARGO LIST`, and `INDUSTRY LIST`. Its live body bindings are now bounded too: page `0` falls back to `1203` `Unable to display page`, page `1` is the company overview wrapper, page `2` is the company list page, pages `3..5` are income statement, balance sheet, and haulage report, page `6` is stock data, page `7` is player list, page `8` is player detail, page `9` is game status, page `0x0a` is train list, page `0x0b` currently falls back to `1203`, page `0x0c` is station list, page `0x0d` currently falls back to `1203`, page `0x0e` is cargo list, and page `0x0f` is industry list. The row-click path is tighter now too: player-list rows re-enter page `8` directly, but train, station, and industry rows leave `LoadScreen.win` through the shell detail-panel manager at `0x004ddbd0` instead of switching to title-table pages `0x0b` or `0x0d`. Page `0` is tighter now too: its descriptor is kind `0`, title `1200` `XXX`, backlink `0`, and header flag `0`, and no current post-constructor selector path has been recovered for it. The descriptor side now also bounds the only known reverse route for the dormant detail titles: `0x3ef8` is the table-driven backlink affordance, so if page `0x0b` or `0x0d` were ever selected, the known reverse path would return to train-list page `0x0a` or station-list page `0x0c` respectively rather than through a separate detail-only owner. The launcher side is tighter too: current grounded `shell_open_or_focus_load_screen_page` callers cover pages `1`, `2`, `3`, `4`, `5`, `6`, `7`, `9`, `0x0a`, `0x0c`, `0x0e`, and `0x0f`, and no current recovered opener or row-click route selects `0x0b` or `0x0d`. So the `LoadScreen.win` family now has a much cleaner shape: one outer message owner `0x004e3a80`, one active-page render owner `0x004ea060`, and then the narrower page-specific handlers and renderers beneath them. The launcher side is tighter now too: `0x004e4ee0` is the shared open-or-focus ledger-page owner above this family. Outside sandbox it either re-enters `shell_load_screen_select_page_subject_and_refresh` on the live runtime at `0x006d10a8` or allocates that transient runtime, seeds it through `0x004e4b10`, and enters the visible modal loop; inside sandbox it raises localized id `3899` `The ledger is not available in sandbox mode.` instead. The direct shell-command strip above that opener is now explicit too: `0x00440700..0x0044086e` are just tiny `scenario-present -> open page` wrappers for pages `1`, `3`, `4`, `5`, `6`, `0x0a`, `0x0c`, `0x0f`, `0x0e`, `2`, `7`, and `9` respectively. So the recovered launcher range is no longer only “callers of `0x004e4ee0`” in the abstract; each of those small shell-command stubs now just forwards one fixed page id into the shared opener. instead. That narrows the remaining `LoadScreen.win` gap again: `TRAIN DETAIL` and `STATION DETAIL` now read as dormant title-table entries unless some still-unrecovered nonstandard selector reaches them. The live auto-load boundary is tighter now too: hook-driven `shell_transition_mode(4, 0)` now completes old-mode teardown, reconstructs and republishes `LoadScreen.win`, and returns cleanly, but the later post-transition service ticks still keep `[0x006cec78] = 0`, `[shell_state+0x0c]` on the same `LoadScreen.win` singleton, and `[LoadScreen.win+0x78] = 0` through at least counts `2..8`. So the next runtime edge is no longer the old mode-`4` teardown or publish band; it is the `LoadScreen.win` message owner `0x004e3a80` itself, because later service alone is not promoting the plain load screen into the separate startup-runtime object path. One later runtime probe did not actually reach that edge: the `0x004e3a80` hook installed, but the run never produced any ready-count, staging, transition, post-transition, or load-screen-message lines, only ordinary shell node-vcall traffic. So that result is now treated as a gate-or-cadence miss rather than as evidence against the `LoadScreen.win` message path itself. The newer shell-state service trace tightens it again: on a successful staged run the later service ticks do execute in `mode_id = 4`, but the `0x004e3a80` message hook still stays silent while the state remains frozen in the plain `LoadScreen.win` shape. So the next runtime boundary is now the shell-runtime prime call `0x00538b60` beneath `shell_state_service_active_mode_frame` `0x00482160`, not the message owner alone. The first direct `0x00538b60` probe run is not trustworthy yet, though: it stopped immediately after the first shell-state service-entry line, before any ready-count or runtime-prime entry logs. So that result is currently treated as probe validation work, not as a real boundary move inside RT3. The static service branch is conditional too: `0x00482160` only enters `0x00538b60` when `[shell_state+0xa0] == 0`, so silence from the runtime-prime hook does not yet prove the shell stops before that call unless the service-entry logs also show the `+0xa0` gate open. The newer run now closes that condition: `[shell_state+0xa0]` is `0`, and the `0x00538b60` runtime-prime hook enters and returns cleanly. The newer run closes the next owner too: `0x00520620` `shell_service_frame_cycle` also enters and returns cleanly on the same frozen mode-`4` path, and the logged fields match its generic branch rather than a startup-promotion lane (`[+0x1c] = 0`, `[+0x28] = 0`, `flag_56 = 0`, `[+0x58]` pulsed then cleared, and `0x006cec78` stayed `0`). The static body under the same owner is tighter now too: `0x00538b60` first re-enters `0x0054f6a0`, refreshes the primary timed-text lane from `[owner+0x1c]` through `0x005386e0` when that deadline has expired, walks the registered shell-window list from tail `[owner+0x04]` backward through `+0x54` while servicing each node through `0x0053fda0` and `0x0051f1d0`, and only then conditionally presents the secondary and primary text lanes through `0x005519f0`. So the next runtime boundary under the same shell-state service pass is now one level deeper: the per-object service walker `0x0053fda0` beneath `0x00538b60`. The newer run closes that owner too: it enters and returns cleanly while servicing the `LoadScreen.win` object itself, with `field_1d = 1`, `field_5c = 1`, and a stable child list under `[obj+0x70/+0x74]`, and its first child-service vcall target at slot `+0x18` stays `0x005595d0`. Since `0x006cec78` still stays `0` through those clean object-service passes, the next runtime boundary is now the child-service target `0x005595d0`, not the higher object walker. The newer child-service run narrows that again: the first sixteen `0x005595d0` calls are stable child lanes under the same `LoadScreen.win` parent, with `[child+0x86]` pointing back to the load-screen object, `field_b0 = 0`, and a split where earlier children carry `flag_68 = 0x03` and return `4` while later siblings carry `flag_68 = 0x00` and return `0`. The static body matches that read too: `0x005595d0` is gated by `0x00558670` and then spends most of its work in draw or overlay helpers `0x54f710`, `0x54f9f0`, `0x54fdd0`, `0x53de00`, and `0x552560`, so it now reads as another presentation-side service lane rather than the missing startup-runtime promotion. The widened allocator-window trace then reconciled the runtime with the static mode-`4` branch one step further: the first transition-window allocation is `0x7c`, which matches the static pre-construct `0x48302a -> 0x53b070` alloc exactly, and the later `0x111/0x84/0x3a/0x25...` allocations all occur before `LoadScreen.win` construct returns, so they now read as constructor-side child or control setup. That means the allocator probe did not disprove the still-silent startup-runtime slice; it simply exhausted its log budget inside the constructor before the post-construct block. The later reset-at-return run is now the decisive one: after `LoadScreen.win` construct returns there are still no further allocator hits before publish and transition return, which matches the corrected jump-table decode because mode `4` does not own the `0x46c40 -> 0x4336d0 -> 0x438890` startup-runtime path.