rrt/docs/control-loop-atlas/multiplayer-session-and-transport-flow.md

98 KiB
Raw Permalink Blame History

Multiplayer Session and Transport Flow

  • Roots: multiplayer_window_init_globals at 0x004efe80, multiplayer_window_service_loop at 0x004f03f0, the Multiplayer.win session-event callback table built by multiplayer_register_session_event_callbacks at 0x0046a900, the active session-event transport object at 0x006cd970, the Multiplayer preview dataset object at 0x006cd8d8, and the lower pending-template and text-stream helpers around 0x00597880..0x0059caf0.
  • Trigger/Cadence: shell-owned Multiplayer.win frame service plus event-driven session callbacks and repeated transport pump steps.
  • Key Dispatchers: session-event wrappers for actions 1, 2, 4, 7, 8; multiplayer_register_session_event_callbacks; multiplayer_dispatch_requested_action; multiplayer_reset_preview_dataset_and_request_action; multiplayer_preview_dataset_service_frame; multiplayer_load_selected_map_preview_surface; multiplayer_flush_session_event_transport; multiplayer_transport_service_frame; multiplayer_transport_service_worker_once; multiplayer_transport_service_route_callback_tables; multiplayer_transport_service_status_and_live_routes; multiplayer_transport_text_stream_service_io; multiplayer_transport_dispatch_pending_template_node; multiplayer_transport_service_pending_template_dispatch_store.
  • State Anchors: live session globals at 0x006d40d0, active session-event transport object at 0x006cd970, status latch at 0x006cd974, session-event mode latch at 0x006cd978, retry counter at 0x006cd984, preview dataset object at 0x006cd8d8, preview-valid flag at 0x006ce9bc, staged preview strings at 0x006ce670 and [0x006cd8d8+0x8f48], Multiplayer.win backing block at 0x006d1270, selector-view store root at [transport+0xab4], selector-view generation counters at [transport+0xab8]..[transport+0xac0], selector-view backing arrays around [transport+0xad0]..[transport+0xae4], selector-view entry probe-request id at [entry+0x50], live-state gate at [entry+0x58], third-slot flag word at [entry+0x64], probe-schedule tick at [entry+0x68], last-success tick at [entry+0x6c], pending-probe latch at [entry+0x74], success generation at [entry+0x78], consecutive-failure counter at [entry+0x7c], rolling average at [entry+0x80], recent sample window at [entry+0x84..], bounded sample-count at [entry+0x94], total-success count at [entry+0x98], pending-template list at [transport+0x550], dispatch store at [worker+0x54c], and text-stream buffers rooted under [worker+0x1c].
  • The worker-owned text-stream seam is tighter now too: 0x59c670 constructs the two growable text buffers, 0x59c6c0 resolves the remote host and opens one keepalive TCP socket into [worker+0x1c], 0x59cbd0 formats transient command lines through the shared static builder at 0x00db8dd0, 0x59caf0 appends those lines plus CRLF, and 0x59cad0 services the resulting send/recv socket state. The current worker bring-up at 0x58f110 now reads cleanly through that strip: after store construction it opens the text stream, connects it to the caller host/port, and then emits either CRYPT des 1 %s or the fallback USRIP command into the send buffer. The mode-3 transport-text pair setter is tighter now too: 0x59ae20 takes the two payload strings under [msg+0x20], XORs each of them in place against the fixed repeating key band [transport+0x564] through 0x5a1050, seeds the paired RC4-style 0x102-byte stream-cipher states at [transport+0x242] and [transport+0x140] through 0x5a0d00, marks [transport+0x13c] active, and then refreshes the status line through 0x59caf0. The receive side is tighter now too: 0x59d210 peels one complete CRLF-delimited line out of the receive buffer, 0x59cec0 decodes that isolated line into the transient field band rooted at [worker+0x328..+0x344], 0x59cc30 splits any nick!user@host-style prefix into owned subfields, 0x59cdf0 tokenizes the later fields into the transient vector at [worker+0x348..+0x34c], and 0x59d400 returns the transient band only when one full line was successfully decoded.
  • Subsystem Handoffs: the Multiplayer.win initializer seeds the backing block at 0x006d1270, later reset paths construct the separate preview dataset at 0x006cd8d8, and the shell-owned active-mode frame services that dataset every frame through multiplayer_preview_dataset_service_frame. That preview side publishes roster and status controls through the Multiplayer window control paths, loads .gmt preview surfaces through multiplayer_load_selected_map_preview_surface, and is even reused by the map/save coordinators mode-11 .gmt path when the dataset already exists. The preview owner now has a tighter internal request split too. The fixed selector-descriptor list at [0x006cd8d8+0x8f28] is built through multiplayer_preview_dataset_append_named_callback_descriptor 0x00469930, whose current grounded owner is the fixed registration block multiplayer_preview_dataset_register_fixed_named_callback_descriptors_1_to_10 0x00473a60; the variable-size named UI-request list at [0x006cd8d8+0x8f2c] is built through multiplayer_preview_dataset_append_named_ui_request_record 0x00469a50; and the staged profile/path strings live at [0x006cd8d8+0x8e10] and [0x006cd8d8+0x8f48], with the broader action-2 staging path now bounded by multiplayer_preview_dataset_stage_profile_text_selected_path_and_sync_session_state 0x0046a030. The companion action-3 commit path is tighter too: multiplayer_preview_dataset_match_named_field_slot_copy_profile_text_and_probe_selection 0x0046a110 now sits directly above the lazily initialized 0x80 * 0x11c field-slot table at [0x006cd8d8+0x10], whose owner is multiplayer_preview_dataset_ensure_field_slot_table_initialized 0x0046a1a0. The shared submitter above those lists is now explicit too: multiplayer_preview_dataset_submit_transport_request 0x00469d30 accepts the callers request-id, selector, payload pointer and length, flag word, and optional auxiliary pointer, optionally allocates one sidecar object, and then either sends the request directly through the session-event transport or takes the slower packed branch through 0x00553000/0x00552ff0 into 0x00521dc0. One shell-side prompt owner above that submitter is now explicit too: shell_command_prompt_for_text_and_submit_selector1_multiplayer_transport_request_when_auxiliary_preview_ready 0x00441690 requires active scenario state, the auxiliary-preview-owner gate shell_has_auxiliary_preview_owner 0x00434050, and one live queued-preview record at [world+0x66ae], then opens prompt 0x0b6d and forwards the returned text through 0x00469d30 with selector 1, request id 0, flag 1, and a null auxiliary payload while the shell-global modal latch 0x0062be80 is held around the prompt. The constructor and teardown side are tighter now too. multiplayer_preview_dataset_construct_reset_globals_and_seed_callback_owners 0x0046be80 is the real reset owner above the action-2/3 branches in multiplayer_dispatch_requested_action: it re-enters the paired release body multiplayer_preview_dataset_release_owned_lists_transients_and_session_side_state 0x0046bc40, clears the surrounding launcher globals, allocates the field-slot table and the keyed request/descriptor owners, seeds the render target and staging buffers, and then calls multiplayer_preview_dataset_reset_global_callback_state_and_register_selector_handlers 0x00473280 plus the smaller fixed-name block multiplayer_preview_dataset_register_fixed_named_callback_descriptors_1_to_10 0x00473a60. That broader registration pass 0x00473280 now bounds the selector-handler family too: it zeroes the global scratch bands 0x006ce808..0x006ce994 and 0x006ce290, seeds default callback root [0x006cd8d8+0x08] with 0x0046f4a0, and populates the keyed selector table at [0x006cd8d8+0x04] through multiplayer_preview_dataset_register_selector_callback_if_absent 0x00468b10 for selectors 1..0x83. The concrete callback bodies under that table are tighter now too. The small split is real rather than guessed: 0x0046c390 is the direct control-0x109 publish leaf through 0x00469d30; 0x0046c3c0 is the fixed-session-token plus launch-latch arm path; and the large sibling 0x0046c420 is the real apply-owner for one incoming session payload slab copied into 0x006cec74 before the shell-refresh follow-ons. A second callback cluster now owns live session-entry flags instead of just relaying transport payloads: 0x0046c7c0 rewrites the elapsed-pair dwords [entry+0x54/+0x58], 0x0046c840 sets bit 0x08 in [entry+0x5c], 0x0046c870 toggles bit 0x01 from payload byte [msg+0x08], 0x0046cf10 sets bit 0x04, and 0x0046cf70 is the list-wide clear of that same bit-0x01 lane across every live session entry. The broader callback 0x0046c8c0 sits above those single-field leaves and applies either one or many embedded session-field update records before republishing the list. The pending-state side is separated now too: 0x0046cce0, 0x0046cd10, 0x0046ce90, and 0x0046d230 are the current small latch/state owners under 0x006cd91c, 0x006d1280, 0x006d1284, and 0x006ce9c8, while 0x0046cd30 and 0x0046ce10 are the paired current-session string/scalar submit-and-apply handlers over [entry+0x258c/+0x268c/+0x2690/+0x2694]. One neighboring cross-subsystem callback is tighter now too: 0x0046cf40 mirrors one remote late setup-preview/status payload block into [world+0x66be], the same world band later serialized and restored under bundle chunk ids 0x2ee0/0x2ee1 and re-normalized after restore through 0x0047bc80. The same callback table also owns one small fixed transfer-progress family rooted at 0x006ce2e8: 0x0046cfe0 allocates the first free 0x5c slot and optionally formats one label string, 0x0046d090 appends progress payload into the matched slot while publishing one percent string through 0x005387a0, and 0x0046d1d0 clears the finished slot and frees that optional label. On the release side, 0x0046bc40 now clearly owns the request-list, descriptor-list, semicolon-name, pooled-span, render-target, and auxiliary-owner teardown, while multiplayer_shutdown_preview_dataset_session_object_and_global_helper 0x0046c230 is the final wrapper that additionally drops the live session object at 0x006d40d0 and the shared helper at 0x00d973b4. The small tuple staging below that family is bounded too: multiplayer_preview_dataset_touch_current_session_year_bucket_and_return_staged_tuple 0x0046b6d0 now owns the keyed session-bucket touch under [session+0x2580] for the staged tuple at [0x006cd8d8+0x9048], and the companion multiplayer_preview_dataset_stage_optional_selected_token_from_source_ptr 0x0046d610 writes the optional derived token into [0x006cd8d8+0x8f38]. The next service layer under the same owner is tighter too: multiplayer_preview_dataset_prune_session_buckets_below_current_year_key 0x0046b910 now bounds the older keyed-bucket drain under [session+0x2580], while multiplayer_preview_dataset_service_current_session_buckets_and_publish_selector0x67 0x0046b9f0 owns the current-bucket walk, the local counters [+0x987c/+0x9890], and the later selector-0x67 publish branch back through 0x00469d30. Its local batch-publish child multiplayer_preview_dataset_publish_accumulated_selector0x71_record_batch 0x00473bf0 is now bounded too: it packages the fixed-width records at 0x006cd990, prefixes (0, count), sends them as selector 0x71, and then clears the live record count 0x006ce9a0. The immediate local helpers under that same band are now explicit too: 0x0046d260 is the fixed-record append primitive that grows 0x006cd990 up to 0x80 entries, while 0x0046d240 is the paired release of the optional selector-0x71 staging blob at 0x006ce994. The first fixed named-descriptor block under multiplayer_preview_dataset_register_fixed_named_callback_descriptors_1_to_10 0x00473a60 is tighter in the same way now. Its concrete roots 0x0046db10, 0x0046db50, 0x0046db90, 0x0046dbd0, 0x0046dd10, 0x0046de40, 0x0046de80, 0x0046e030, and 0x0046e250 all return small static records rooted at 0x006ce9dc..0x006cea3c; each record carries a leading tag byte plus the same derived world-year key from [0x006cec78+0x0d], while the heavier siblings add collection-backed totals from 0x0062be10, 0x006ceb9c, 0x0062b26c, 0x006cfca8, or 0x006cfcbc together with local overlay, geometry, or object-metric sample paths. The immediate helper strip beneath that same first named block is tighter now too. 0x0046d980 is the direct 0x006ceb9c name-to-index lookup over [entry+0x08], while 0x0046d9e0 is the heavier companion that first resolves the current live session from 0x006d40d0, matches that session-side string against the same 0x006ceb9c table, and returns the matching entry index or 0xff. Above those, 0x0046f8f0 resolves and validates one 0x0062be10 entry, then keeps it only when its profile-index field [entry+0x3b] equals the live-session-backed 0x006ceb9c index from 0x0046d9e0; and 0x0046f870 is the paired rounded-delta leaf that takes one float plus one collection byte index and writes the rounded positive/negative pair into metric ids 0x0f and 0x0d through 0x0042a040. So this first descriptor band is no longer just a bag of static record roots: it also owns a real local helper family for 0x006ceb9c name matching, live-session profile matching, and one narrow metric-pair apply path beneath the higher callback bodies. The next selector layer above that helper strip is tighter now too. Selector 0x12 is the small validate-or-error wrapper above selector 0x13, and selector 0x13 body 0x004706b0 resolves the same live-session company match, attempts the placed-structure apply path through 0x004197e0, 0x004134d0, 0x0040eba0, 0x0052eb90, and 0x0040ef10, and otherwise falls back to a hashed selector-0x6e publish over the first 0x1c payload bytes. The same pattern appears again one pair later: selector 0x16 is the thin validate-or-error wrapper above selector 0x17, and selector 0x17 consumes a count plus 0x33-stride adjunct record band, resolves one live train-side entry under 0x006cfcbc, re-enters 0x004a77b0, 0x0052e720, 0x0040eba0, 0x0052eb90, and 0x0040ef10, and again falls back to hashed selector 0x6e publish when the live apply path does not land. The later status pair is bounded too: selector 0x19 is another thin wrapper, and selector 0x1a either derives a status code from 0x0046ed30 and current live-session name matching or treats the four-byte payload directly as that status code before publishing localized status text 0x0b7f/0x0b80. One selector-pair above the metric leaf is now explicit too: the earlier front edge of the same callback table is tighter now too. Selector 0x02 compares staged profile text against the shell profile band at [0x006cec7c+0x11], can advance the requested-action fields 0x006d1280/0x006d1284, can queue selector 0x53, and on the success path syncs the larger shell profile block rooted at [0x006cec7c+0x44]. The next small strip is also grounded: selector 0x0a clears [world+0x19], seeds [world+0x66ae], mirrors peer byte [peer+0x2690] into named-profile byte [entry+0x15c], refreshes 0x006ce98c, and optionally republishes one local status path. Selector 0x0b is then the small token-staging wrapper above selector 0x0c, and selector 0x0c itself forwards one signed byte pair into 0x00434680 before adjusting dataset counter 0x006cd8e8. The other small early leaves are now bounded too: selector 0x0f pops one node from the current session queue at [session+0x64], publishes that node through 0x00469d30, and releases it; selector 0x10 looks one payload key up in the session-side store [session+0x60] and forwards the result plus dataset string root [0x006cd8d8+0x8f48] into 0x00521790. One selector-pair above the metric leaf is now explicit too: selector-0x15 body 0x00470950 consumes the same compact (float delta, company-index byte) payload shape, resolves the matching live-session company entry through 0x0046f8f0, submits selector 0x6b through 0x00469d30, and then immediately re-enters 0x0046f870 for the local apply. The neighboring name-match lane is now explicit too: selector-0x61 body 0x00472700 scans 0x0062be10 for a company-name match against the caller string at [payload+0x08] and then either submits selector 0x62 with the original payload or falls back to the paired error-style 0x21 branch. The next registered band around selectors 0x1c..0x5d is tighter now too. Selector-adjacent helpers 0x00470ed0 and 0x00470fa0 are the paired global preset passes beneath that strip: both walk the guarded named-profile table 0x006ceb9c, add opposite signed integer presets into qword field [profile+0x154] through 0x00476050, then walk 0x0062be10 and write opposite preset scalars into metric id 0x0d through 0x0042a040. Above them, selectors 0x1d, 0x1f, 0x21, 0x23, 0x25, 0x27, 0x29, 0x2b, 0x2d, 0x2f, 0x31, 0x33, 0x35, 0x37, and 0x39 are now explicit token-staging forwarders into selectors 0x1e, 0x20, 0x22, 0x24, 0x26, 0x28, 0x2a, 0x2c, 0x2e, 0x30, 0x32, 0x34, 0x36, 0x38, and 0x3a. The next live-train strip is also grounded: selectors 0x3b, 0x3d, 0x3f, 0x41, and 0x43 resolve live train ids from 0x006cfcbc, stage the current token, and republish into selectors 0x3c, 0x3e, 0x40, 0x42, and 0x44; selectors 0x3c, 0x3e, and 0x40 then dispatch directly into 0x004abd70, 0x004b2f00, and 0x004b3000, while selector 0x42 is the heavier train-adjunct branch through 0x004b2b70, 0x004b3160, 0x004b2c10, 0x004a9460, and 0x004ab980. The prompt or bitmap cluster is tighter too: selector 0x48 consumes one 12-byte record, either marks the current-session bit directly or opens localized prompt 0x0b81 through 0x00469a50 and callback 0x004719c0, and then republishes selector 0x49; selector 0x49 turns that 12-byte result into one keyed bitset object and republishes selector 0x47; selector 0x47 consumes the resulting ten-slot masks and drops straight into 0x004eb230 plus shell_resolve_merger_vote_and_commit_outcome 0x004ebd10. The same pattern repeats one size smaller for selectors 0x4c, 0x4d, and 0x4b: selector 0x4c consumes one 10-byte record, either marks the current-session bit directly or opens localized prompt 0x0b82 through 0x00469a50 and callback 0x00471d50, selector 0x4d folds that 10-byte result into the keyed bitset object, and selector 0x4b turns the resulting masks into one ten-dword cache setter at 0x0050c4e0 rooted at 0x006d1a08 plus the paired outcome resolver 0x0050c940. The direct setter strip after that is explicit too: selector 0x4f republishes selector 0x6f when the live session object exists and dataset gate 0x006cd91c is clear, selector 0x50 copies [dataset+0x9058] into [dataset+0x9054], selector 0x51 derives one small session-status code and either republishes selector 0x52 or shell control 0x109, selectors 0x55, 0x56, and 0x57 directly store dataset field 0x9860, a 0x006ceb9c inline name, and guard field [entry+0x1e1], selector 0x58 flushes the deferred 16-slot named-profile clear queue [dataset+0x9864..+0x9873], selector 0x59 derives one roster or capacity status and republishes selector 0x5a, selector 0x5b is another token-staging forwarder into selector 0x5c, selector 0x5c gates a 0x00493960 dispatch plus optional local 0x0046f870 apply, and selector 0x5d validates one payload string before republishing selector 0x5e. The next registered band around selectors 0x5e..0x7d is tighter too. Selector 0x5e updates the named-profile side table 0x006ceb9c, mirrors the same string into the resolved live session object, and when the session-side guard is active hashes that string back into [session+0x48] and dataset field [0x006cd8d8+0x8f48]; selector 0x5f then stages the current year-derived token and republishes into selector 0x60, whose body writes one guarded byte field into the same 0x006ceb9c entry family. The 0x62..0x64 strip forms the same kind of pair over 0x0062be10: selector 0x62 copies one fixed 0x32-byte band into the matched company entry, selector 0x63 rejects duplicate field-0x37 values before forwarding, and selector 0x64 applies that same dword field directly into the matched entry or one live fallback owner. The receive-side correction is explicit now too: selector 0x6b is the tiny local metric-apply wrapper 0x00472db0 -> 0x0046f870, selector 0x6c is the separate train-record wrapper 0x00472dc0 -> 0x0046d780, selector 0x6d formats localized status 0x0f4e into the grounded world outcome-text buffer [world+0x4b47], and selector 0x6e walks the current keyed bucket under [session+0x2580] and marks the first matching companion record by payload hash. The later wrappers are cleaner too: selectors 0x71, 0x73, 0x75, 0x77, 0x79, 0x7b, and 0x7d are all token-staging forwarders into selectors 0x72, 0x74, 0x76, 0x78, 0x7a, 0x7c, and 0x7e. Beneath them, selector 0x72 is the heavier counted live-world apply path over 0x0062b2fc, 0x0062b26c, and 0x0062bae0; selector 0x74 dispatches a resolved company-entry id into 0x0062b26c under the small latch 0x006ce9a8; selectors 0x76, 0x7a, and 0x7c resolve one company-style entry and then tail into narrower local handlers; and selector 0x78 is the broader projection-or-notify body over 0x0044b160, 0x00538e00, and the local-session refresh strip. The next adjacent owner 0x0046e5c0 is broader but still belongs to the same structural neighborhood: in mode 1 it serializes a dual-collection metric blob from 0x0062be10 and 0x006ceb9c, writing the two row counts into local header bytes and then packing one 0x24-stride band plus one 0x2c-stride band behind a 0x10-byte header; the opposite branch starts validating and applying those packed metrics back into live entries. So that first named block is no longer just a string-name registry; it already includes a real typed static-record family beneath the preview dataset, and it now sits directly beside one broader fixed-record callback-successor strip. Right after the selector-0x71 batch publisher, the local 0x005ce418 fixed-record family becomes explicit: 0x00473ce0 constructs one 0x187-byte record from two copied strings, shell-profile bytes [0x006cec78+0x0d/+0x0f/+0x11], owner field [this+0x04], and monotonic sequence dword [this+0x14] seeded from 0x006cea48; 0x00473dc0, 0x00473e70, 0x00473ee0, and 0x00473f30 are the max-sequence, min-sequence, previous-sequence, and next-sequence queries over the same live collection; 0x00473e20 is the boolean scan for any inactive record with a nonzero owner dword; and 0x00473f80 is the real allocator or constructor owner, trimming the collection down to 0x19 entries, allocating one live record through 0x00518900, and then dispatching the heavier constructor. So the callback registry now leads directly into a concrete preview-side fixed-record collection, not into another anonymous transport helper band. The broader snapshot/apply owner still sits over the same multiplayer collection state. In parallel, multiplayer_register_session_event_callbacks allocates and registers the separate session-event transport object at 0x006cd970. The shell-side bridge into that deeper transport cadence is now tighter: multiplayer_window_service_loop and neighboring reset or initializer branches call multiplayer_flush_session_event_transport, which forces one status flush and then drops into multiplayer_transport_flush_and_maybe_shutdown. That wrapper in turn runs multiplayer_transport_service_frame, the recurring pump that services one worker step through multiplayer_transport_service_worker_once, sweeps the transport-owned callback tables and field caches through multiplayer_transport_service_route_callback_tables, services both the auxiliary status route and the current live route through multiplayer_transport_service_status_and_live_routes, and then descends one layer farther into the shared GameSpy route helper multiplayer_gamespy_route_service_frame at 0x58d040. The transport also owns a separate selector-view sidecar beneath that route cadence. The reset and teardown side of that same outer transport is tighter now too. The bounded local callback-table attach validator 0x58d7e0 first clears selector registrations through multiplayer_transport_reset_selector_tables, then ensures the keyed selector-view store, and only then rebuilds the surrounding selector-view runtime through the auxiliary sidecar ensure owner 0x593fe0 before returning success. That sidecar seam is now explicit too: 0x593db0 hashes the ordered status-string pair (entry, entry+0x40) modulo the caller divisor, 0x593e40 compares that same ordered pair for keyed equality, 0x593ef0 is a real no-op release callback, and 0x593fb0 is the worker callback that resolves one selector-view entry through 0x594b40 and commits probe success through 0x593f00. One layer lower, 0x58d810 is the common runtime-reset strip that clears selector slots, releases the keyed selector-view store, clears the auxiliary selector-view sidecar rooted at [transport+0xac8], and forwards into the remaining route-mode-sensitive selector cleanup. That lower strip is no longer opaque either: 0x5955a0 is the bulk three-slot selector reset plus shared probe-marker clear, 0x594080 is the auxiliary selector-view sidecar release when the keyed store is unbound, and 0x595820 is the forced route-mode-0 cleanup that preserves selector slot 2 ownership across the reset. The next owner above that strip is now explicit too: 0x58de50 either latches deferred reset at [transport+0x1edc] while outstanding work remains or, once the transport is quiescent, clears [transport+0xab0], releases the live worker/runtime band through 0x58d860, and immediately pumps one more service step through 0x58d8d0(-1). The final destroy tail 0x58d8a0 then tears down queued work, active opcode records, the Winsock guard, and the remaining owned runtime strings before freeing the transport body. The constructor-side and shutdown-side owners are explicit now too. 0x58dc50 enters the Winsock 1.1 guard, allocates and zeroes the full 0x1ee4-byte transport body, seeds local IPv4 [transport+0x58], constructs the transient work-record collection, copies one caller-supplied 0x70-byte callback-vector/state seed block into [transport+0x178c..+0x17f8], then constructs the active opcode-record collection at [transport+0x17fc] through 0x592750 and the shared plus slot-local selector callback-name stores at [transport+0x18a8], [transport+0x1890..+0x1898], [transport+0x189c..+0x18a4], and [transport+0x18ac..+0x18b4] through 0x5966f0 before the object is considered live. The later callback-slot wrappers rooted at [transport+0x178c], [transport+0x17c0], [transport+0x17c4], and the sibling callback contexts near [transport+0x17f8] now make that copied band read as the constructor-side callback vector and companion state, not as a generic label blob. The paired runtime release strip 0x58d860 tears the worker down, clears the configured transport latches, releases the transient work-record side, reruns the selector/callback reset block, and clears [transport+0x180c], byte [transport+0x1810], and deferred-reset latch [transport+0x1edc]. Above that, 0x58de90 is the actual shutdown owner: it preserves the leading callback-vector dword at [transport+0x178c] across 0x58de50, disconnects the live route state, and then either marks deferred-close flag [transport+0x1ee0] while work remains or falls straight into final destroy owner 0x58d8a0, which also releases the selector callback-name store family through 0x5967f0. The adjacent route-mode text side is tighter too. 0x58db70 is the small selector-text helper that formats one caller mode string through the shared stack builder and sends it through selector slot 3 or 4, while the broader owner 0x58dfb0 sits above it and derives the live route-mode status from transport latches, refreshes the mode-string band [transport+0xad0/+0xadc], stores companion state at [transport+0xb34/+0xb40/+0xb44/+0xb54], and then either submits the richer selector-text route request through 0x593c40 or falls back to the probe/enqueue path 0x592a70. That same owner also participates in the current callback-table attach validation through 0x58d7e0, with disconnect fallback 0x58d830, and reuses the same immediate-drain context-id wait loop as 0x58df20. The selector-status side underneath those owners is tighter now too. 0x5951f0 is not just a generic transport pump: it builds up to three transient selector-mode strings from selector presence lanes [transport+0x384..+0x398] and status latches [transport+0xb40/+0xb44/+0xb54] plus [transport+0x180c], appending the letters s, r, h, g, and a into three local string bands and then hashing those bands through 0x594c40. It only emits the matching SETCHANKEY/SETCKEY lines through 0x58ece0 when the hashed mode state changed versus cached masks [transport+0x99c/+0x9a0/+0x9a4]. The adjacent cleanup sibling 0x5965d0 is concrete too: it optionally releases the status route through 0x597350, clears the h/g/r latch band [transport+0xb40/+0xb44/+0xb54], and then reruns 0x5951f0 so the emitted selector-mode text stays consistent with the cleared route state. The adjacent selector and callback-table owners are tighter now too. 0x58e100 is the fixed selector-2 status publisher: it only runs when transport latches [+0x60], [+0x48], [+0x398], and [+0xb40] are all live, falls back to 0x005c87a8 when the caller token is null, formats one line from the caller token plus [transport+0x282] and the current route IPv4 at [transport+0x54], sends that line through selector 2, sets [transport+0xb44] = 1, and then either nudges route-mode helper 0x595650(5) or falls into the auxiliary 0x597350 / 0x597370 branch. The adjacent dispatcher 0x596fd0 is now explicit too: it only exposes its built-in status-field strip when [transport+0x398] is live and the [transport+0xb44] or [transport+0xb38] gate allows it, then appends internal text [transport+0x79c], decimal state from [transport+0xac0], [transport+0xb48], and [transport+0xb3c], one static fallback token, or the boolean form of [transport+0xb4c]; outside those built-in ids it dispatches into the local status-route callback-vector lanes or falls back to the owner callback at [transport+0x17dc] with context [transport+0x17f8]. One level earlier, 0x58dce0 is now the setup-side sibling: it copies the local name into [transport+0x60], seeds the two status-text bands at [transport+0xad0/+0xadc], preserves those descriptor triplets only when selector-view result slot [transport+0xab0] is already live, copies the route-label buffers at [transport+0xb58/+0xb78], clears route-label state bytes [transport+0xb77/+0xb97], stores callback-table metadata at [transport+0xb98/+0xb9c], rebuilds the route callback-table family through 0x596090, and on success refreshes the current status text at [transport+0xaf4] before rerunning 0x5965d0(1). The same local pass also makes the negative boundary tighter: setup still touches the surrounding callback-table and replay-band fields without ever seeding a nonzero value into [transport+0x1778], so the local static seam is closed here: no ordinary constructor, reset, service, or callback-table owner in RT3.exe currently writes that sidecar, and the latest full-binary disassembly scan still finds only the 0x595bc0 read while the neighboring lifecycle fields [transport+0x177c/+0x1780/+0x1784/+0x178c/+0x17f8] do show normal constructor/reset/use sites. The producer therefore still looks upstream of this local cluster. Beside it, 0x58e200 is the broader callback-table attach or refresh owner: it seeds one immediate-drain context id, conditionally copies the local name into [transport+0x04], clears [transport], [transport+0x48], and [transport+0x1edc], stores follow-on callback fields [+0x4c/+0x5c], sets [transport+0x44] = 1, attaches the descriptor block through 0x593650, whose worker-side callback pair is now explicit too: 0x593610 republishes the staged work-record triplet through opcode-5 binding enqueue helper 0x592c40, while 0x593630 stores the incoming route scalar at [transport+0x54] and then forwards the caller text/buffer plus [transport+0x5c] into 0x597780, the fixed-template encoded route-scalar formatter beneath that attach path. On attach failure the outer owner falls through 0x58d860, dispatches the resolved binding through 0x592a40, and optionally reuses the same immediate-drain wait loop as the neighboring transport submit owners. The direct selector-text seam under those owners is explicit now too. 0x58e630 is just the current-local-name helper: it returns [transport+0x36c] while the worker root is live and otherwise falls back to 0x005c87a8. Above that, 0x58e7e0 is the real direct selector-text variant publisher under 0x58d9e0: it formats one line through [transport+0x1c] as PRIVMSG %s :%s, action-prefixed PRIVMSG, NOTICE %s :%s, UTM %s :%s, or ATM %s :%s depending on caller mode 0..4, then probes the matching registered-name entry through 0x59d7d0 and emits opcode 4 through 0x59b790 when that entry exists. The plain sibling branch is explicit now too: 0x58ea60 formats the same five selector-text variants through [transport+0x1c] but stops after appending the text line, without probing 0x59d7d0 or emitting opcode 4. The registered-name fastpath side is tighter at the same time: 0x58eb10 is just the null-worker guard above multiplayer_transport_find_registered_name_entry_and_optionally_return_bucket 0x59df60, which walks the worker-owned registered-name store at [worker+0x548] and can return both the matched entry and its owning bucket pointer. One level earlier, 0x58e510 is the broader fastpath owner under 0x593d60: when the caller text is null, empty, too long, or casefold-equal to current local name [transport+0x36c], it takes the immediate callback-style opcode-0x1b path through 0x598060 -> 0x59b790; otherwise it formats one local-name command through [transport+0x1c] using format 0x005e1c64, packages that request through 0x598280, and on either branch reuses the same 0x58e3f0 / Sleep(10) / 0x58e370 immediate-drain loop when requested. The route-request side beneath those owners is explicit too. 0x58e720 is the common submit root under 0x593bb0 and 0x593c40: it formats one local route line through [transport+0x1c], packages the caller route payload and callback triplet into a type-1 transient request through 0x5981b0, refreshes the registered-name side through 0x59d5b0, and when requested loops through 0x58e3f0, Sleep(10), and 0x58e370 until the request completes. That registered-name refresh path is tighter too: 0x59d5b0 builds one zeroed 0x1e0-byte stub from the caller string and appends it into the flat registered-name vector [transport+0x54c] through the shared generic_vector_push_back helper 0x59e4d0, while the smaller sibling 0x58e7a0 sits beside it as the selector-slot text and registered-name removal path. The selector-text submit owner itself is explicit now too: 0x593c40 is not just a generic “route request” wrapper. It rejects null, empty, or >= 0x101-byte text, falls back to fixed sample 0x005c87a8 when the caller sample pointer is null, allocates a type-2 transient work record through 0x5934e0, stores the selector id in work field +0x1c, refreshes selector-side naming through 0x59fc80/0x595140, and only then hands the request into 0x58e720 with callback 0x593bb0. under 0x5954b0 and formats one selector-slot line before removing the corresponding registered-name entry through 0x59d760. The selector callback-name side under the same reset tail is explicit now too: 0x596900 first walks the shared selector callback-name store at [transport+0x18a8] through the hashed-table reverse walk 0x58fa40 and callback 0x596840, pruning names that no longer correspond to any live selector-view entry or any of the three slot-specific callback stores rooted at [transport+0x1890/+0x1894/+0x1898]. It then services the slot-local callback collections at [transport+0x18ac/+0x18b0/+0x18b4], clearing inactive slots through the hashed-table clear helper 0x58fac0 and otherwise using 0x58fa40 plus callback 0x5968b0 to prune any shared names whose current selector-view entry no longer owns the current slot. The drain side itself is tighter too. 0x58e3f0 no longer just “notifies a small observer table”: its local child 0x58e310 walks the global (command-name, callback) table at 0x00629d58/0x00629d5c, compares the decoded command token at [line+0x14] through the shared casefolded compare 0x5a57cf, and on a match invokes the paired callback with the current decoded-line band in EDX and the transport pointer in ECX. multiplayer_transport_ensure_selector_view_store allocates the keyed selector-view store at [transport+0xab4], multiplayer_transport_find_selector_view_entry_by_name resolves entries from that store, multiplayer_transport_upsert_selector_name_entry marks per-slot activity and flags inside each entry, and multiplayer_transport_mark_selector_slot_views_dirty plus multiplayer_transport_reset_selector_view_entry_runtime_state manage the dirty or refresh fields at +0xa0, +0xa4, and +0xa8. That selector-view maintenance path is now split more cleanly too. The recurring owner is multiplayer_transport_service_selector_view_refresh_cycle, which first runs the fast deferred-probe lane: multiplayer_transport_collect_refreshable_selector_view_entries walks the store through multiplayer_transport_filter_insert_refreshable_selector_view_entry, which now shows that [entry+0x64] is not a generic flag bucket but the third selector-slot flag word, parallel to [entry+0x5c] and [entry+0x60]. In that collector, the g and a mode-letter bits produced by multiplayer_transport_parse_selector_mode_letters become mask 0x0c in the slot-local flag words, and any third-slot entry carrying those bits at [entry+0x64] is excluded from the refreshable set. Eligible entries then pass slot-aware retry timing on [entry+0x68], [entry+0x6c], [entry+0x78], and [entry+0x7c], after which the service loop schedules refresh probes through multiplayer_transport_schedule_selector_view_entry_refresh_probe. That fast lane is narrower now too: the entry-side match key [entry+0x50] is no longer just an opaque request field. The profile-key callback lanes feed multiplayer_transport_parse_selector_view_probe_marker, which decodes one local X%sX|%d marker into a probe request id plus displayed version/build integer, and multiplayer_transport_arm_selector_view_probe_tracking stores those into [entry+0x50] and [entry+0x54] before arming the live probe gate at [entry+0x58]. The current-selector callback root at 0x59f8b0 is now bounded as well: it resolves and upserts the active selector name, optionally reuses a cached username marker to arm probe tracking immediately, then submits the same profile-key bundle with selector context and forwards that selector through callback slot 17, with the status-route side able to force route-mode transitions 2 -> 3 -> 4 afterward. One layer lower, multiplayer_transport_handle_profile_key_query_result at 0x596970 now bounds the per-key result path itself. It treats username as the probe-marker field, b_flags as the selector mode-letter field, and (END) as a real sentinel that publishes a zeroed slot-22 payload instead of a marker pair. The same helper also hashes the selector-name, key-name, and resolved value text back into the caller table, so the profile-key bundle now looks like a real bounded handoff rather than an anonymous callback cloud. The owner above it is tighter too: 0x596da0 is now the real per-slot bundle submitter, not just a vague wrapper. For one active selector slot it first collects the slot-local key list from [transport+0x1890+slot*4] and issues the synchronous GETKEY query through 0x58ec50, using either the caller override or the slot name at [transport+0x80+slot*0x101]. When no override is supplied it then collects a second list from [transport+0x189c+slot*4], conditionally adds built-in username and b_flags, and sends the larger channel-key pair list through 0x58ef20 with callback 0x596ce0. That second-stage callback is now explicit too: the default-slot branch resolves the returned selector name back into one slot and then walks one selector-name pair array through 0x596b90 using the shared fallback text at 0x00629d54, while the selector-name-override branch uses the explicit override name and walks one parallel pair array through the same lower helper with publication enabled. The thin wrappers above the owner are now grounded accordingly: 0x596fa0 forwards one selector-name override, while 0x596fc0 forces the slot's fixed name. The adjacent rename helper 0x596c10 now also makes the selector callback-name maintenance side explicit: after a selector rename it walks the shared and slot-local callback stores and rewrites any callback-name entry whose primary text still matches the old selector name. One layer above the per-key helper, 0x596b10 now reads as the shared built-in key sweep: it tries the same result helper 0x596970 across the shared store [transport+0x18a8] and the three slot-local callback-name stores, stopping on the first success and then publishing callback slot 27 through 0x5931b0. The deferred callback shim multiplayer_transport_dispatch_selector_view_refresh_probe_result then walks the keyed store through multiplayer_transport_finish_selector_view_refresh_probe_if_matching, which only completes entries whose pending latch [entry+0x74] is still armed and whose parsed marker request id [entry+0x50] matches the finished request. A failed result -1 clears the pending latch and increments the consecutive-failure counter at [entry+0x7c]. A nonfailure result clears the pending latch, increments the success generation at [entry+0x78] and total-success count [entry+0x98], clears [entry+0x7c], stamps the last-success tick at [entry+0x6c], appends the returned sample into the short rolling history at [entry+0x84..], grows the bounded sample-count [entry+0x94] up to four, computes the current average into [entry+0x80], and then publishes that averaged ms sample through multiplayer_transport_enqueue_callback_slot24_record. So the publication boundary is explicit and the request-id ownership is explicit: [entry+0x80] now reads as the averaged millisecond probe sample and [entry+0x54] as the displayed version/build companion integer. The adjacent route-callback side is tighter too, but it is now kept separate: the staged route-callback path at 0x5958e0 and the later compatibility gate at multiplayer_transport_route_binding_matches_route_callback_descriptor_tuple 0x595d00 operate on a compact GameSpy-style server or route descriptor family with a primary endpoint tuple at [descriptor+0x00]/[+0x04], an optional secondary endpoint tuple at [descriptor+0x08]/[+0x0c], string-key lookups such as hostname and gamever, and numeric-key lookups such as numplayers, numservers, numwaiting, and gsi_am_rating. The route-binding side uses that descriptor family's primary dword and host-order port plus the optional secondary tuple against route-binding offsets +0x54/+0x58 and route word +0x30. The capacity-side gate above it is tighter now too: 0x595d60 first tries that tuple match against the current bound route at [transport+0x1ecc], and on success immediately falls into multiplayer_transport_invoke_bound_route_callback_if_present 0x592710, which simply calls the bound route's optional callback slot [binding+0x14] with companion argument [binding+0x18]. When the tuple does not match, the same gate instead compares descriptor fields maxplayers and numplayers; only a descriptor with spare capacity reaches that same callback handoff. The owner directly above that gate is explicit now too: 0x595dc0 first rejects when staged-route busy latch [transport+0x1e8c] or selector-slot object [transport+0x38c] is live, then reuses the same tuple-or-capacity result from 0x595d60; only a positive result lets it refresh selector state through 0x5973b0, reset selector slot 2 through 0x5954b0, stage the descriptor through 0x5958e0, and finally drop route mode back to 0 through 0x595650 when that staging path fails. That makes the seam read as one bounded ladder instead of three isolated helpers: descriptor tuple match or spare-capacity gate, optional bound-route callback handoff, then the busy-latch-screened route-transition owner above it. Current evidence now also closes the clone side of that staged path: 0x596270 copies the first nine dwords of the source staged callback payload, clears the intrusive next-link, and then replays the source keyed-property list through shim 0x596260, which simply reinserts each owned (key,value) pair into the clone's property store through 0x58d0f0, before the clone is stored at [transport+0xb50] for later callback publication. Current evidence still does not prove that descriptor tuple is the same field family as the selector-view marker companion integer at [entry+0x54]. The higher compact decode owners are tighter now too: 0x5907d0 is the route-callback receive owner for one fresh compact payload, with a concrete return split of 0 on malformed or undersized payloads, -1 on the special global descriptor, and the consumed byte count on successful decode through 0x58ff60; 0x590d00 is the keyed upsert-by-primary-endpoint lane that reuses an existing descriptor when possible, allocates only on miss, decodes in mode 0, and then publishes owner callback mode 1 before returning 0/4/5 for success, decode failure, or special-global rejection. The route-callback-table runtime above that decode side is tighter now too: multiplayer_transport_route_callback_table_construct 0x5905e0 seeds one transport-owned table block, multiplayer_transport_route_callback_table_release_decoded_schema_dictionary 0x5906f0 tears down the decoded schema dictionary rooted at [this+0x08], multiplayer_route_callback_runtime_acquire_shared_string_copy 0x590540 and multiplayer_route_callback_runtime_release_shared_string_copy 0x5905a0 now bound the shared string pool used by that decoded schema, and the higher bring-up owner 0x596090 now clearly splits between [transport+0xba4] with owner callback 0x595a40, the local field-cache family [transport+0x1724] seeded through 0x5a08f0/0x595b60 with fixed stem 0x00629d50, and [transport+0x1164] with owner callback 0x595bc0. The same constructor also builds the gsi_am_rating primary-endpoint table [transport+0x18bc] from local transport name [transport+0x60] plus suffix 0x005dccfc under callback 0x595e10, and seeds the queued descriptor family [transport+0x1e7c] through 0x5a08f0/0x595f70 with fixed stem 0x00629d54, while multiplayer_transport_route_callback_table_service_receive_decode_state_machine 0x5908c0 is the current live receive/decode state machine serviced by 0x591290 in table states 2/3. The callback-owner mode split above that runtime is now explicit too: append-notify 0x590370 publishes mode 0, compact upsert 0x590d00 publishes mode 1, remove-notify 0x590430 publishes mode 2, and the live receive/decode path 0x5908c0 publishes modes 6, 5, and 3. The route-handle lifecycle above that decode path is tighter now too: 0x590740 cleanly resets one table's live route plus decode-side runtime without destroying the outer object; 0x5907a0 is the broader destroy path that also releases the active descriptor collection; 0x590ed0 now reads as the real open-and-request owner rather than a generic connect wrapper: it bounds both caller route-name strings to 0x100 bytes, stores the caller route-mode or flag dword into [this+0x5b4], seeds one staged request with fixed selector bytes 2/1/3, appends [this+0x4a8], the route-label buffers [this+0x0c] and [this+0x2c], the local label band [this+0x6c], the caller route strings, the converted host-order route scalar, and two optional flag-driven branches, then sends that request through the live route handle at [this+0x4a0] before seeding state 3 and the staged receive buffer; 0x5911e0 is the state-2/3 live-socket service wrapper, and it is tighter now than a generic feed loop: once one full frame is buffered it switches on subtype byte [frame+0x02], using subtype 1 for 0x590c00 schema-dictionary rebuild, subtype 2 for 0x590d00 compact-descriptor upsert, subtype 3 for raw payload forward through 0x5b3216, and subtype 4 for 0x590cd0 descriptor removal by primary endpoint before compacting the tail back to the front of the receive buffer; 0x5912c0 is the one-shot send-with-reopen-retry helper; and 0x590ea0 is the shared disconnect publication and reset tail. The recurring service helper 0x591290 is tighter too: it now first clears the staged intrusive descriptor list through 0x590490 before entering the state-driven seed-or- receive branch. The upstream owners are tighter too: 0x5962e0 is now the field-subscription route-table opener above [transport+0xba4]: it clears prior field-subscription runtime, releases any live route on that table, builds the route label from either the optional suffix path or the default stem block, seeds the field-cache family [transport+0x1724] with fixed key ids 1 and 0x0b, appends per-field selector names from 0x00629958, and then opens the live route in mode 4 through 0x590ed0. Success seeds cached progress percentage [transport+0x1774] = 1 and immediately enqueues one mode-3 field snapshot through 0x592b50; failure falls back through the same clear path. 0x596530 is the gsi_am_rating reopen path above [transport+0x18bc], and that owner is tighter now too: when precondition [transport+0xba0] is clear it does not even attempt the reopen and instead stamps [transport+0x1ed4] = 1; otherwise it resets the am-rating route family, clears the callback table rooted at [transport+0x18bc], tries 0x590ed0(mode 4) from stored route label [transport+0x1ed0], and only on success sets [transport+0x1ec4] = 1 while clearing [transport+0x1ed4]. On that latter branch, 0x590dc0 is now bounded as the state-0 raw-endpoint seed pass over the live route handle, repeatedly pulling endpoint tuples through 0x58bc7e record type 0x1f3 before stamping descriptor flag byte 0x15 with 0x11. That makes the remaining source-flag meaning narrower too: current evidence now supports reading byte-0x15 bit 0x1 as a primary-endpoint-seed or endpoint-only marker. In the gsi_am_rating dispatcher, clear-bit descriptors can take the richer direct transition lane, while set-bit descriptors are staged through the queued enrichment path and still suppress that direct transition even after the ready bit arrives. The later modes in 0x595e10 are tighter now too: mode 3 forces route mode 2 only when the primary-endpoint table is empty, mode 4 stamps [transport+0x1ed4] = 1 and then picks route mode 1 or 3 based on whether deferred descriptor pointer [transport+0x1ed8] is null, and mode 5 mirrors staged companion dword [transport+0x490] into both [transport+0x54] and [transport+0x1724+0x24]. The adjacent capacity-descriptor side is tighter too: 0x595bc0 is now clearly the owner callback for the capacity-descriptor route callback table rooted at [transport+0x1164], not a direct transport method on ecx = transport. The route-callback-table constructor 0x5905e0 installs it with owner cookie transport, and the live route machinery later invokes it from append-notify 0x590370 and decode-service 0x5908c0/0x5911e0 with ecx = table object, the route descriptor or special decode frame on the stack, and the transport cookie on the stack. Inside that callback it still always reads [transport+0x1778] first. Modes 3/5 consume that sidecar immediately, while live mode 0 first resolves primary IPv4 plus hostname, numwaiting, maxwaiting, numservers, and numplayers through 0x58d1f0, 0x58d170, and 0x58d6d0, and only then forwards those live payload lanes together with the same sidecar triplet [+0x0c/+0x10/+0x18] into opcode-2 builder 0x592ae0. So mode 0 is not a sidecar-free fallback; it still requires the borrowed sidecar before it can publish the populated descriptor block. The replay-linked modes 3/5 instead enqueue an all-zero descriptor payload while preserving only that same borrowed callback-wrapper triplet and then unlinking the cached record through 0x5933a0; and its callback modes 1/2/6 are now explicit no-op fallthroughs. That sidecar at [transport+0x1778] is tighter now too: current evidence says it behaves as one cached pointer into the transient work-record family at [transport+0x1780], because every meaningful branch in 0x595bc0 reads the same +0x0c/+0x10/+0x18 metadata triplet and replay modes later consume the pointer through 0x5933a0. The negative result is stronger too: local text-side xrefs still show no direct store to [transport+0x1778], and a wider local sweep also failed to show any obvious lea-based replay-band writer. The transient-request lifecycle tightens that further: 0x593330/0x593370/0x593380/0x5934e0/0x5933a0 now fully bound [transport+0x1780], 0x1784, and 0x1788 without ever touching [transport+0x1778], and the neighboring active-opcode reset helper 0x5929a0 is likewise scoped only to [transport+0x17fc]. A broader constructor and teardown pass tightened that further too: 0x596090, 0x5961b0, and 0x5962e0 all touch the neighboring replay-band fields without ever seeding [transport+0x1778]. A full-binary literal-offset sweep tightens it further still: the only direct 0x1778 hit in RT3.exe is the read in 0x595bc0. One nearby ambiguity is now closed too: the mode-5 mirror path in 0x595a40 and 0x595e10 does not target [transport+0x1778]; it writes [transport+0x54] and mirrors the same staged route companion dword only into queue-side slot [transport+0x1724+0x24] through 0x005a0940. So the sidecar writer remains upstream of this leaf publisher. Mode 0 is now also tied more cleanly to the generic descriptor append-notify lane at 0x590370, while mode 2 stays outside this helper as the separate remove-notify-and-stage path at 0x590430. The opcode-2 payload boundary is tighter too: 0x592ae0 now grounds that payload as a seven-dword block with an owned string slot at +0x08, so live mode supplies a populated payload while modes 3 and 5 deliberately enqueue an all-zero payload and reuse only the wrapper-side sidecar metadata. Those two modes are tighter now too: they are the live receive-state owner callbacks emitted by 0x5911e0 -> 0x5908c0, not loose generic replay guesses. So those paths are better read as delayed metadata replays over one cached work record, not over a separate anonymous cache blob. The neighboring capacity-owner split is tighter now too: 0x595bc0 only stages descriptor records for modes 0, 3, and 5; the upstream route-callback-table owner still delivers modes 1, 2, and 6, but those are explicit no-ops in this capacity leaf. So the owner wiring itself is no longer the open edge; only the upstream sidecar producer remains unresolved. The neighboring work queue is tighter too: 0x593330/0x593370/0x593380 now bind [transport+0x1780] as the construct/clear/destroy owner family and explicitly treat [transport+0x1784] and [transport+0x1788] as the queued-work and completed-work counters beside that collection, while 0x5933a0, 0x5934e0, and 0x593570 ground the remove, allocate, and completion side over that same queue. The completion owner is tighter now too: 0x593570 clears in-flight latch [transport+0x44], stores the final attach result in [transport+0x48], stamps current route scalar [transport+0x50] from 0x58f450 on success, refreshes local name buffer [transport+0x04] from 0x58e630, republishes the staged metadata triplet through opcode-1 trigger wrapper 0x592a40, and only then unlinks the consumed work record. When validation of a nominal success fails through 0x58d7e0/0x58d810, the same owner still replays that callback trigger but also arms deferred reset latch [transport+0x1edc]. The small sibling 0x593400 is tighter too: it is a pure work-record uniqueness predicate over field +0x0c. Its caller is tighter now too: 0x58d720 is an immediate-drain quiescence gate over one transport context id, using 0x593400 for the queued work family at [transport+0x1780] and 0x592970 for the active opcode-record collection at [transport+0x17fc]. The strongest current read is that 0x5934c0 seeds that shared drain context id first, then the transport copies it into queued work field +0x0c and active opcode-record field +0x14 before the immediate-drain roots wait on one shared disappearance test rather than on a vague settle loop. The currently grounded roots are 0x58df20, the neighboring formatted selector-text publish path at 0x58dfb0, and callback-table registration at 0x58e200. The 0x58df20 owner is tighter now too: it seeds one shared context id through 0x5934c0, gives that same id plus the caller callback wrapper to the fastpath 0x593d60, and only when that fastpath declines does it fall back into 0x593170 using [transport+0x04] as the worker-side text base. Its immediate-drain tail is the same shared quiescence rule as the neighboring owners: pump 0x58d8d0(-1), then wait in 0x58d720 until the context id disappears from both queued work field +0x0c and active opcode-record field +0x14, then honor deferred-close state if [transport+0x1ee0] is armed and [transport+0x1808] has reached zero. The active-opcode side is tighter too: 0x5927b0 now bounds the per-record service-and-retire path, 0x592800 the wider context-or-idle sweep, 0x5929a0 the remove-by-opcode-type sweep, and 0x5929f0 the narrower opcode-3 field-snapshot removal keyed by the subscribed callback-pair payload. That also corrects 0x595b80, whose final cleanup is an active field-snapshot purge rather than a queued-work drain. The adjacent route-callback descriptor-table lifecycle is tighter too: 0x590410 now grounds [table+0x5bc] as the staged intrusive descriptor-list head, 0x590430 is the generic remove-notify-and-stage lane, 0x590490 releases the staged list, and 0x5904d0 releases the active descriptor collection before tearing that staged list down. That also makes the earlier 0x5962e0 “release active descriptors” step explicit. The callback-table attach side now constrains the same work-record metadata family a little further too: 0x593650 deliberately duplicates its first caller metadata dword into both fields +0x0c and +0x10, while carrying the second caller metadata dword in +0x18. The lower opcode wrappers are tighter now too: 0x592a40 turned out to be the explicit opcode-1 trigger wrapper whose constructor is a no-op and whose active-side service is 0x5913c0, while 0x592c40 is the real 0x08-byte explicit opcode-5 binding leaf. The earlier opcode-4 read was just the table-indexing mistake in 0x5928a0: selector 4 lands on the row at 0x5e2044, not the row at 0x5e2034. The producer side is tighter too: bound-route requests, selector-text route requests, and the type-9 text fastpath also stage that same triplet through 0x5934e0, and the fastpath shim 0x593d00 now gives the cleanest proof of the callback split by first copying the returned text into the transport-local name buffer at [transport+0x04], then only re-emitting the follow-on lane when +0x10 is nonnull, and finally forwarding (+0x10, +0x18, +0x0c) into 0x593170 as callback function, callback companion, and trailing drain context. So the replay-side triplet is clearly a broader transport callback-wrapper family, not one fixed route-only tuple. The nearby field-subscription side is tighter too: 0x592b50 now clearly uses [transport+0x1774] as a cached progress percentage under [transport+0xba4], and 0x5962e0 seeds that percentage to 1 just before the first immediate mode-3 snapshot. The nearby route-callback-table lifecycle is tighter now too: 0x596090 is now the real constructor-side owner for the full route-callback branch. It constructs [transport+0xba4] with callback 0x595a40, seeds the companion field-cache family [transport+0x1724] from fixed stem 0x00629d50, constructs [transport+0x1164] with callback 0x595bc0, builds one fixed 0x20-byte local route-label buffer from the current local transport name at [transport+0x60] plus format 0x005dccfc, constructs [transport+0x18bc] with callback 0x595e10 and that stack-built label, seeds queued descriptor family [transport+0x1e7c] through 0x595f70, clears staged payload slot [transport+0xb50], and then sets callback-plumbing latch [transport+0xba0] = 1. That constructor now reads cleanly as pure callback-table and cache bringup: it leaves the later live-route entry to the dedicated open or reopen owners 0x5962e0 and 0x596530 instead of trying to start either live route itself. One level lower, 0x5962e0 now reads as the field-subscription open owner rather than a vague route helper: it clears the old [transport+0xba4] runtime, rebuilds the route label from the optional caller suffix plus the fixed tail word at 0x005d0b78, materializes one callback-key buffer from the fixed stem 0x005e22a0..0x005e22b2, seeds fixed field ids 1 and 0x0b, appends per-field selector-name ids through 0x00629958, opens the live route in mode 4, and then seeds [transport+0x1774] = 1 before the first immediate field snapshot. 0x596210 is the recurring service sweep over those same three tables plus the field-cache and queued-descriptor families; 0x596060 is the explicit gsi_am_rating runtime-and-queue reset; 0x596530 is the reopen-from-stored-label sibling above that same am-rating table; and 0x5965a0 is the single-shot status-route connect latch that sets [transport+0xb40] before forwarding into 0x5973d0, leaving the rollback and clear path to 0x5965d0. The matching local cleanup is tighter too: 0x595b80 is now explicitly the field-subscription-side live-runtime reset plus field-cache clear plus active opcode-3 purge, 0x595ce0 resets only the capacity-descriptor route callback runtime at [transport+0x1164], 0x5961b0 is the full destroy-side owner over the three tables plus both descriptor caches, and 0x5962c0 is the explicit staged route-callback payload clear on [transport+0xb50]. The remaining gap on the capacity side is therefore narrower: the carried sidecar fields themselves now read more cleanly as the cached callback-wrapper triplet reused elsewhere (drain context id +0x0c, callback fn +0x10, callback companion +0x18), and the negative result is stronger too: nearby replay-band fields [transport+0x176c], [transport+0x1770], [transport+0x1774], [transport+0x177c], [transport+0x1780], and [transport+0x1784] all have direct local owners while [transport+0x1778] still appears only as the single read in 0x595bc0; even the broader callback-owner lifecycle now skips it while seeding, servicing, resetting, reopening, or tearing down those neighboring tables and caches. The constructor now closes that local search further: 0x58dc50 bulk-zeroes the full transport body and still never writes a nonzero value into [transport+0x1778] before later explicit neighbor initialization. The callback-binding owner stack now tightens that boundary too: 0x5934e0 stages the shared work-record metadata triplet, 0x593650 binds it into the callback-table worker path with one fixed second worker callback and one optional first worker callback gated by [transport+0x4c], and 0x593570 later consumes and republishes it, while [transport+0x1778] still appears only as the borrowed sidecar read in 0x595bc0. So this local ownership seam is closed: within the mapped transport cluster there is no remaining ordinary producer to find, and the remaining source now looks like an upstream callback or worker handoff rather than one missing field store in the local binary. The neighboring callback-vector strip is explicit now too: 0x597300 is a no-op owner-callback stub, 0x597303 is the validated-cookie event forwarder over callback slot [transport+0x17f0], and 0x597330 is the validated extended-payload forwarder over [transport+0x17f4]; both reuse the same owner context at [transport+0x17f8]. The adjacent staged-route capacity gate is tighter now too: 0x595d60 is not another live-route opener. It is the immediate bound-route fast path and capacity gate under gsi_am_rating. When the staged descriptor already matches the current live route through 0x595d00, it returns straight through 0x592710; otherwise it only reuses that same bound-route callback lane when numplayers < maxplayers. 0x595dc0 then uses that result exactly as the already-bound-or- capacity gate before it clears selector slot 2, stages route-callback payload through 0x5958e0, and only then re-enters route mode 0. The live-route connect owner is narrower in the same way: 0x597480 mirrors success into deferred route-status flag [transport+0x1ed8], and the later mode-4 branch in 0x595e10 is the place that actually consumes that flag to choose route mode 1 versus 3. The adjacent staged-route callback side is tighter too: 0x595860 is now bounded as the submit-result handler beneath 0x5958e0, and the old [transport+0xac0] ambiguity there is now gone. That branch is using the already-grounded third selector-generation counter at [0xac0] together with target [0xb48] to decide whether staged route-callback traffic can push the multiplayer route-mode ladder from 2 into 3 and later 4. The selector-view counter beneath that gate is tighter now too: 0x594e30 counts slot-2 entries whose flag dword carries bit 0x20, optionally filtered by the current transport name buffer. The selector-view mutation family under that same lane is tighter too: 0x594a30 is now the direct keyed-store remover, 0x594fb0 clears one selector-slot ownership pointer plus its slot-local flag dword and drops the whole entry when no slots remain, 0x595010 rekeys one selector-view entry under a new name while preserving the 0x40.. runtime band, and callback root 0x59f9c0 now reads as the sibling lane that clears one named selector-view slot, publishes callback slot 18, and may still re-enter the route-mode setter from the same slot-2 status and generation gates. The neighboring callback roots are tighter now too: 0x5950a0 clears one selector slot from every selector-view entry in the keyed store, 0x59fab0 is the rename or relabel sibling above 0x595010, 0x59faf0 updates one selector slot's fixed sample-text buffer and refreshes the active selector object when present, and 0x59fb60 replaces one selector slot's name set, requests the default profile-key bundle for that slot, and publishes callback slot 20. Slot 16 is tighter now too: current grounded caller 0x59f440 forwards the staged route-callback payload handle from [transport+0xb50] through 0x592ea0 just before route mode 5. The last adjacent callback root in that block is tighter now too: 0x59fbd0 is the built-in per-slot profile-key query sibling. It resolves the caller selector name into one slot index, forwards the caller trio into 0x596b90, and then publishes callback slot 28; that lower helper indexes one slot-specific built-in string pair from [transport+0x189c] and [transport+0x18ac], reuses the generic per-key handler 0x596970, and only republishes slot 28 when that lower query path succeeds. The descriptor-lane installer above those callback roots is explicit now too: 0x59fc80 zeroes one 0x30-byte callback table, stores the owner transport pointer at [table+0x2c], and installs the full second selector-descriptor callback vector 0x59f720/0x59f850/0x59f8b0/0x59f9c0/0x59fab0/0x59faf0/0x59fc50/0x59fc20/0x59fb60/ 0x59fbd0 used by the selector-text and selector-view request owners 0x593aa0 and 0x593c40. The two smaller helper slots in that same lane are now bounded as well: 0x59fc20 resolves the caller selector name and forwards one byte mask into multiplayer_transport_set_selector_presence_mask 0x594d00, while 0x59fc50 resolves that same selector name and publishes callback slot 12 through 0x592d70. The compact-header side is tighter now too: 0x58fe20 and 0x58ff20 now show that compact payloads always carry the primary IPv4 dword and that header bit 0x10 only gates whether the primary port word is inline or inherited from the owner default port. 0x58fe90 now validates the 0x40 inline keyed-property vector against the owner schema, and 0x58fe50 validates the signed-0x80 trailing string-pair tail before decode. 0x58ff60 then grounds bit 0x02 as the inline secondary IPv4 dword branch, bit 0x20 as the paired secondary-port word branch with owner-port fallback, bit 0x08 as the compact-header auxiliary inline dword stored at [descriptor+0x10], bit 0x40 as one inline keyed-property vector decoded through the property-store writers, and signed bit 0x80 as one trailing string-pair tail. The descriptor-state side is tighter now too: the shared queue helper at 0x005a09a0 stamps pending state 0x4 for the local field-cache family [transport+0x1724] and pending state 0x8 for the gsi_am_rating queued-descriptor family [transport+0x1e7c], while the adjacent active-send owner 0x005a07c0 now makes the fast path explicit instead of looking like a missing growth helper: it stamps the descriptor into the active list, timestamps [entry+0x1c], and immediately emits the mode-selected outbound query packet through the queue socket, with the secondary endpoint tuple [entry+0x08/+0x0c] only taking over when queue companion dword [queue+0x24] matches the primary dword and descriptor state bit 0x2 is live. The receive-side owner layer is tighter too: 0x005a0b40 drains queue socket [queue+0x20], matches inbound replies against the active list's primary or secondary endpoint tuples, and then routes the matched entry into 0x005a0a00 for queue mode 1 or 0x005a0ad0 for the alternate grounded mode. The broader maintenance pass 0x005a0c80 then adds the stale-active expiry sweep 0x005a0c00 and the pending-to-active promotion pass 0x005a0c50, so the ready-bit transition now reads as a full queue lifecycle instead of one isolated state-byte write. That makes the current transport-side tests cleaner: 0x58d1c0 is the field-cache ready gate, 0x58d1d0 is the gsi_am_rating queued-descriptor ready gate, and 0x58d230 is the remaining flag-byte split between direct primary-endpoint handling at [transport+0x18bc] and the queued path at [transport+0x1e7c]. That byte-0x14 story is no longer queue-only either: 0x58ff60 can also OR in bit 0x1 after the inline keyed-property vector and bit 0x2 after the signed string-pair tail. The flag-byte split is no longer purely behavioral either: current evidence now says byte [descriptor+0x15] bit 0x1 is a source-side descriptor header bit, explicitly seeded during the primary-endpoint table refresh around 0x590dc0 and preserved by the compact descriptor decode path at 0x58ff60, rather than a queue-generated runtime state. The gsi_am_rating dispatcher side is tighter too: that same bit no longer just looks like a direct-versus-queued routing split, because 0x595e10 also uses it to suppress the direct 0x595dc0 transition even after queued ready bit 0x2 is present. The descriptor body is tighter too: [descriptor+0x20] is now the intrusive next-link used by the transport-owned primary-endpoint list headed at [table+0x5bc], and [descriptor+0x1c] is now the special numeric scalar behind the current queryid/ping fallback pair. That special numeric path now has one clearer owner too: 0x58d6a0 lazily bootstraps the shared key dictionary at 0x00db8b48 for the grounded strings queryid and ping, using the local dereferenced-string hash, compare, and release callbacks 0x58d690, 0x58d070, and 0x58d090. The descriptor property-store seam is tighter in the same way now. The keyed store rooted at [descriptor+0x18] is allocated by 0x58d5b0 with explicit per-entry key callbacks: 0x58d550 releases the owned shared key/value string pair, 0x58d570 hashes the dereferenced key string through 0x58d510, and 0x58d580 compares two dereferenced keys through the shared locale-aware casefolded compare 0x5a57cf. The fixed-reply side above that store is no longer anonymous either: when queue mode-1 reply owner 0x5a0a00 sees descriptor flag bit 0x4 clear, it routes the payload into 0x58d3a0, which first consumes one backslash key/value prefix and then walks exactly two counted reply sections, each with its own NUL-stem dictionary; the later value strings are reinserted under synthetic decimal-suffixed keys built from those stems plus one running per-section index. The compact-header auxiliary inline dword at [descriptor+0x10] is tighter in a negative way too: local xref scans now only show it being preserved by later generic helpers like generic_record_0x1c_deep_copy_with_owned_string_at_0x08 0x591410 and the adjacent callback-marshaling wrappers 0x591480 and 0x591510, not read through any dedicated semantic accessor yet. The mode-5 tails in both callback families do not copy a descriptor-local field but instead mirror the transport-staged companion dword at [this+0x490] into [this+0x54] and queue-side slot [this+0x1724+0x24]. The gsi_am_rating maintenance lane is tighter now too: after pruning failed descriptors it sorts the surviving primary-endpoint table through 0x590310 in mode 1 with key gsi_am_rating, then selects the new head through 0x590480 before re-entering the route-transition path. The owner above that handoff is explicit now too: mode 2 in 0x595f70 requires current route mode 1, no live selector object at [transport+0x398], and no busy slot object at [transport+0x38c]; it refreshes every surviving endpoint entry's gsi_am_rating, forces route mode 2 when the table empties, and otherwise stages the fixed gsi_am_rating key for the current head entry before falling into 0x5958e0; only a submit failure drops that branch back to route mode 0, while success leaves the later 0x595860 callback to drive the 2 -> 3 -> 4 route-mode ladder. The same service loop also owns a slower sidecar lane keyed off [entry+0xa4]: multiplayer_transport_select_stale_selector_view_progress_entry walks the store through multiplayer_transport_pick_stale_selector_view_progress_entry, picks one stale entry whose progress latch [entry+0x9c] is clear and whose last progress tick [entry+0x70] is old enough, and then hands it to multiplayer_transport_stage_selector_view_progress_snapshot. That helper now looks more bounded too: it rebuilds the core X%sX marker text from [entry+0x50] through multiplayer_transport_format_selector_view_probe_marker_core, formats one PNG %s %d line around that marker and the entry-local averaged millisecond sample at [entry+0x80], appends bounded selector-slot PNG fragments for live overlapping slots, marks progress-snapshot state in flight at [entry+0x9c], and stamps both [entry+0x70] and the transport-wide throttle tick [transport+0xaec]. So the selector-view sidecar no longer looks like one undifferentiated refresh bucket: it has a faster deferred-probe lane plus a slower progress-snapshot lane, both still under the shell-owned multiplayer transport cadence. The two descriptor lanes installed by multiplayer_transport_submit_selector_text_route_request are tighter in the same family too: when the entry-local marker text at [entry+0x9ac] is empty, the request path falls back to multiplayer_transport_format_selector_view_probe_marker_fallback_with_fixed_template_0x5e2350 0x597710 before handing the text into 0x593c40. The parser split is explicit now too: multiplayer_transport_parse_selector_view_probe_marker 0x5977b0 consumes the wider X%sX|%d form, while multiplayer_transport_try_parse_selector_view_probe_marker_core 0x597860 only decodes the wrapped request-id from the shorter sentinel form and leaves any decimal tail to the caller. The linked pending-template strip is tighter in the same way: after multiplayer_transport_unlink_pending_template_node removes a node from the list rooted at [transport+0x550], it now tails into multiplayer_transport_release_pending_template_node 0x597960, which frees the node-owned payload graph, both selector strings, and the node body itself. The two descriptor lanes installed by multiplayer_transport_attach_callback_table_descriptor are now tighter too. The first lane rooted at 0x59f5c0 can arm deferred-close state on the owner transport and then forward through callback slot 23. The second lane is no longer just a loose selector-view bucket: multiplayer_transport_callback_dispatch_selector_name_payload_lane at 0x59f650 classifies selector payloads through multiplayer_transport_is_selector_control_line, routes @@@NFO control lines into multiplayer_transport_sync_selector_view_nfo_r_flag, and otherwise publishes either callback slot 13 or the split token-plus-tail callback slot 14 through multiplayer_transport_split_selector_payload_token_and_tail. That local @@@NFO helper is now bounded more tightly too: it only accepts lines ending in the literal X\ tail, searches for the field marker \$flags$\, and then sets or clears bit 0x2 in the third selector-slot flag word at [entry+0x64] depending on whether that field contains the letter r before the next backslash. The sibling multiplayer_transport_callback_dispatch_current_selector_payload_lane at 0x59f720 first resolves the active selector through 0x5951a0, then handles the current-selector variants of the same control vocabulary: @@@NFO continues into the same local r-flag sync helper, @@@GML plus mode-3/4 payloads feed the shared control-token helper multiplayer_transport_handle_gml_or_png_selector_control, and the remaining non-control payloads publish callback slot 9. That shared helper now narrows the GML and PNG split materially: when the token is GML and the tail is Disconnected, it requires the active selector-view entry to pass multiplayer_transport_selector_view_entry_has_gml_disconnect_gate, which currently means the entry participates in the third selector slot and has bit 0x20 set in [entry+0x64], before it forces one status-pump pass, emits callback slot 16, and re-enters route mode 5. Its sibling PNG branch resolves a named selector-view entry from the tail text and, when that entry overlaps the active selector-slot ownership, refreshes selector-view runtime state through 0x5948f0 and republishes callback slot 25. Alongside those dispatchers, one grounded branch at 0x59f560 still updates selector-view runtime state through 0x5948f0 and forwards the same selector-name pair through callback slot 25, while 0x59f850 resets selector text state through 0x5954b0, forwards through callback slot 19, and when selector 2 is active in a nonterminal route mode re-enters multiplayer_transport_set_route_mode with mode 1. The low-level route helper still looks like a two-part cycle: multiplayer_gamespy_route_service_retry_and_keepalive_timers handles challenge or retry pressure and periodic outbound control traffic around the master.gamespy.com, PING, natneg, localport, localip%d, and statechanged strings, while multiplayer_gamespy_route_drain_inbound_packets drains inbound datagrams and dispatches semicolon lines, backslash-delimited key bundles, and 0xfe 0xfd GameSpy control packets. The outbound side is tighter now too: 0x0058cd40 is the shared decimal-text appender beneath both the route builders and the shell-side status publishers; 0x0058c950 is the dedicated field-class-8 PING sender that refreshes [route+0xac]; and 0x0058cd70 is the broader mode-selected control-packet owner that appends localip%d, localport, optional statechanged, the route-name text, and then either the encoded three-slice suffix through 0x0058c300 or a bare terminator before sendto. The read side is tighter too: 0x0058f4e0 is the zero-timeout socket-readiness probe that multiplayer_gamespy_route_drain_inbound_packets uses immediately before recvfrom. The local control-payload seam is tighter now too: the immediate three-slice emitter wrapper 0x0058c300 packages predecoded slices as field classes 0, 1, and 2, while 0x0058c340 decodes one length-coded three-part payload and re-emits those slices through the shared packet-field builder 0x0058c0c0; that builder uses 0x0058c010 for the field header, 0x0058c030 for the encoded payload append, the RC4-style transform 0x0058bee0, the Base64-like text appender 0x0058be50, and the six-bit alphabet mapper 0x0058be20. The same local support strip also now includes 0x0058bcb0 for bounded control-id list append and 0x0058bce0 for bounded C-string append into the shared 0x800-byte text builders. The backslash-query side is tighter too: 0x0058c3e0 is the shared callback-driven field-group emitter that maps key ids through 0x00629958, appends the key stems into the same builder, and then dispatches value production through callback slots [route+0x88], [route+0x8c], and [route+0x90] before 0x0058c5c0 adds the final terminator. The transport-owned callback story is now narrower too. The shared route constructor multiplayer_gamespy_route_construct_and_seed_callback_vector seeds [route+0x88] through [route+0x9c] from the caller-supplied transport callback table, records the owner transport at [route+0x104], and explicitly zeroes [route+0xa0], [route+0xa4], and [route+0xd4] before any later patch-up. For the transport-owned status route, multiplayer_transport_try_connect_status_route then seeds the six-entry callback vector 0x596fd0/0x5970e0/0x597180/0x5971b0/0x597270/0x5972c0, chooses either default route id 0x1964 or the caller route id, copies stored route-label pointer [transport+0x9a8] into [transport+0xb3c], and patches [route+0xa0] through multiplayer_gamespy_route_set_extended_payload_callback to point at multiplayer_transport_forward_validated_extended_route_payload 0x00597330, which simply forwards the validated payload wrapper into the owner callback at [transport+0x17f4] with context [transport+0x17f8]; success also clears [transport+0xb38]. The adjacent owner strip is now explicit too: 0x597350 releases the auxiliary status route, 0x597370 services that route alone through the shared low-level tick helper, and 0x597380 is the broader recurring sweep that services both the status route and the current live route. The connect-side endpoint setup is tighter now too: 0x0058f540 resolves the current local hostname into one hostent, 0x0058bd50 copies up to five local IPv4 dwords from that hostent into the global table at 0x00db8a28, and 0x0058bd90 builds one sockaddr_in with AF_INET, htons(port), direct dotted-quad parse, and host-name fallback. In the grounded status-route path, multiplayer_transport_try_connect_status_route formats %s.master.gamespy.com, uses port 27900, and feeds that pair through 0x0058bd90 before the route opens its UDP handle. The local bind side is tighter too: 0x0058cb50 opens a UDP socket, retries a 0x64-wide local port range or an ephemeral bind through the same sockaddr helper, normalizes literal 127.0.0.1 to INADDR_ANY before bind, and returns both the live socket and chosen local port; 0x0058cc40 is the wrapper above it that hands that socket and port into multiplayer_gamespy_route_construct_and_seed_callback_vector and then marks [route+0xbc] = 1 on the resulting object. The startup or teardown calls around that path are now explicit too: 0x0058f470 is the local WSAStartup(0x0101, ...) guard and 0x0058f490 is the matching WSACleanup wrapper. The direct Winsock thunk strip under the same family is now mostly named too: 0x0058bc42/48/4e/54/5a/60/6c/72/78/7e/8a line up with gethostbyname, gethostname, closesocket, sendto, htons, htonl, socket, WSACleanup, WSAStartup, recvfrom, and bind, while 0x0058bc3c is the dotted-quad conversion thunk used under the localip%d builder path. The local-address selection side is narrower too: 0x0058d750 resolves the same hostent list and picks the first private or loopback IPv4 through 0x0058f580 before the transport-side bring-up path consumes it. The grounded live-route connect path at multiplayer_gamespy_udp_global_callback_worker_bootstrap now sits beside that route layer as a separate helper family rather than more route-object state. 0x0059fe30 resolves an optional host and port into a stack sockaddr_in, and 0x0059fe8e then opens the global UDP socket 0x00629f28, applies SO_REUSEADDR, and binds that prepared address. 0x005a0000 seeds the callback-state globals 0x00db9fd8..0x00db9ffc, allocates the timeout-registration vector 0x00db9ff0 and queued-callback vector 0x00db9fec, and optionally opens the socket immediately; 0x005a0120 is the matching shutdown path. The control-packet codec under that worker is explicit too: 0x0059fd00 accepts only fixed 0x91/0x01 packets with kind 1..3 and an optional trailing 0x18-byte payload, while 0x0059fdc0 emits that same 0x20-byte packet shape back through sendto. The kind handlers above it are now bounded as well: 0x005a0200 handles kind 1 by issuing the kind-2 reply and optionally staging one timeout-registration record, 0x005a02f0 handles kind 2 by resolving that staged registration, optionally emitting kind 3, and queuing the completed callback, and 0x005a03d0 is the shorter kind-3 completion path. 0x005a0440 is the dispatch switch over those three packet kinds. The receive and timeout side now reads coherently too: 0x005a0490 waits on the global socket, drains one datagram through recvfrom, timestamps it, decodes it, and dispatches it; 0x005a0550 then sweeps expired timeout-registration records from 0x00db9ff0, optionally queuing timeout callbacks through 0x0059fef0; and 0x0059ff70 drains and frees the queued callback vector 0x00db9fec. So 0x005a05d0 now reads cleanly as the one-shot service tick for the whole global UDP callback worker rather than another anonymous transport loop. One layer higher, 0x005a0600 is the synchronous send-side owner over that same worker: it emits the fixed kind-1 query packet, stages one timeout-registration record, and can then pump 0x005a05d0 plus Sleep(1) until the registration clears before draining the queued callbacks. The immediate queue-side support strip is explicit now too: 0x005a0700, 0x005a0720, 0x005a0740, 0x005a0760, and 0x005a07b0 are the append, prepend, pop, remove, and clear helpers for the intrusive list family that links nodes through offset +0x20, and 0x005a08f0 is the constructor-side queue bootstrap that opens the queue-owned UDP socket and clears the active and pending list roots. The grounded live-route connect path at multiplayer_transport_try_connect_live_route now matches the status-route side on the main callback seam: after a successful connect it also patches [route+0xa0] through 0x58bc90 -> 0x597330. The remaining negative boundary is narrower now: current local evidence still does not show matching post-construction writes to [route+0xa4] or [route+0xd4], and the higher route-mode state machine now looks consistent with that. multiplayer_transport_set_route_mode first applies one pre-dispatch gate: when a bound route still exists at [this+0x1ec8], requested mode 2, and selector slot 2 is not active, it submits one bound-route status request through 0x5959e0. That request itself is now narrower too: it derives one request token from the current binding through 0x5934c0, then forwards binding dword [route+0x2c], binding word [route+0x30], local counter [this+0xb48], and default sample text 0x005c87a8 into 0x593980 using completion callback 0x595980, and a submit failure immediately sets [this+0x1ed8] so the route-mode owner can fall back without waiting for the callback. That callback is tighter now too: nonzero results force mode 2 when [this+0xac0] <= 1 and otherwise promote through mode 3 or 4 according to [this+0xb48], while zero results set [this+0x1ed8] = 1 and then fall back through route mode 0 or 1 according to deferred am-rating latch [this+0x1ed4]. On success the route-mode setter stores the current mode at [this+0x18b8], mirrors mode changes into the bound-route callback lane through multiplayer_transport_enqueue_bound_route_mode_snapshot_opcode4_if_live 0x5932a0, and then runs one of the concrete branches: mode 0 releases the current live route, resets selector slot 2, and only when the am-rating route is not already live at [this+0x1ec4] tries to reopen the gsi_am_rating callback-table family through 0x596530; a failed reopen then falls back according to deferred route-status flag [this+0x1ed8]. Mode 1 conditionally reopens that am-rating family only when both [this+0x1ec4] and [this+0x1ed4] are clear and then, when no live route is present, tries to connect the live route through multiplayer_transport_try_connect_live_route 0x597480; once that family is already populated, the later callback-owner at 0x595f70 takes over by pruning stale entries, refreshing gsi_am_rating, selecting the current head endpoint, and staging the route-callback payload through 0x5958e0. Mode 2 first releases any stale live route through multiplayer_transport_release_live_route 0x5973b0 when status latch [this+0xb40] is clear, then resets the am-rating family and promotes a successful live-route connect into mode 1. Mode 3 resets the am-rating family, releases the live route through 0x5973b0, resets selector slot 2, and then tears down the current bound-route payload through multiplayer_transport_release_current_route_binding_detach_descriptor_callback_and_clear_slot 0x595620; mode 4 is the narrow status-route recovery retry; and mode 5 resets the am-rating family, releases the live route through 0x5973b0, and runs that same 0x595620 teardown path without the selector-slot reset. That helper is narrower than the older generic wording implied: it detaches the current binding from route-label object [this+0x1ed0] through 0x58f3c0, releases the staged bound-route callback payload at [this+0x1ec8] through 0x5933a0, and only then clears [this+0x1ec8]. The status-route connect path is tighter now too: 0x5973d0 seeds [this+0xaf4], uses the same six callback lanes, mirrors stored route label [this+0x9a8] into [this+0xb3c], patches the created route's extended-payload callback slot, and clears [this+0xb38] on success; when the caller route id is not -1 it also zero-extends the supplied route word before forwarding it into 0x58c9b0. The local status-route helper strip is explicit too: 0x597350 releases [this+0xaf0] through 0x58cfd0, 0x597370 services only that route through 0x58cf90, and 0x597380 is the broader two-route sweep that services [this+0xaf0] and [this+0x1ecc] through the common route-object service helper 0x58d040. The live-route connect path is tighter in the same way: 0x597480 builds one 0x20-byte local identifier from [this+0x60] plus suffix template 0x005dccfc, seeds the callback vector 0x596fd0/0x5970e0/0x597180/0x5971b0/0x597270/0x5972c0, and chooses either the default route id 0x1964 through 0x58cc40 or the binding-specific id in [binding+0x30] through 0x58c9b0; on the binding-specific path it also clears pending rebuild cookie [binding+0x34] and marks the constructed route live via [route+0xbc] = 1, while the success tail mirrors stored route label [this+0x9a8] into [this+0xb3c], patches [route+0xa0] through 0x58bc90 -> 0x597330, and clears live-route mode mask [this+0xb38]. The callback boundary is closed more tightly now too: current local evidence still does not show companion writes to [route+0xa4] or [route+0xd4] in either grounded transport-owned connect path, so the stable transitions still switch by releasing route objects or route bindings and rebuilding route state, not by mutating those optional callback slots in place. The parser behavior is now tighter as well: semicolon lines only dispatch when [route+0xd4] is non-null, and the subtype-6 raw fallback only dispatches when [route+0xa4] is non-null. For the currently grounded transport-owned status and live routes, those two branches therefore stay intentionally inactive and can cleanly no-op instead of implying a hidden mandatory transport callback path. Inside the packet parser, subtype 4 is no longer an unknown callback hop: after cookie validation it dispatches through [route+0x9c], which the transport-owned status and live routes seed to multiplayer_transport_handle_validated_route_cookie_event 0x005972c0. That helper either marks route progress and re-enters multiplayer_transport_set_route_mode, or forwards the event id plus payload into the owner callback at [transport+0x17f0] with context [transport+0x17f8]. The surrounding status-route callback vector is tighter now too: 0x005970e0 publishes either the active selector text or the averaged probe sample at [entry+0x80] and otherwise falls back to owner callback [transport+0x17e0]; 0x00597180 is a straight owner-forwarding lane through [transport+0x17e4]; 0x005971b0 seeds the local status-control id list and can then notify owner callback [transport+0x17e8]; and 0x00597270 returns the third selector-slot generation counter [transport+0xac0] on its bounded local branch before falling back to owner callback [transport+0x17ec]. Subtype 6 still validates the same cookie, dedupes one 32-bit cookie or packet id, and then dispatches the trailing payload through the natneg-or-raw callback layer rooted at [route+0xa0] and [route+0xa4]; for the grounded transport-owned status and live routes that currently means validated NATNEG-style payloads forward through 0x00597330 on [route+0xa0], while the raw fallback stays disabled because [route+0xa4] remains null. This separates the shell-frame preview refresh at 0x006cd8d8 from the actual transport cadence at 0x006cd970, and also separates that transport cadence from the lower GameSpy route-service and packet-parser layer beneath it.
  • Evidence: function-map.csv, pending-template-store-management.md, pending-template-store-functions.csv, plus objdump caller traces showing multiplayer_window_service_loop reaching multiplayer_flush_session_event_transport and the transport pump chain multiplayer_flush_session_event_transport -> multiplayer_transport_flush_and_maybe_shutdown -> multiplayer_transport_service_frame -> multiplayer_transport_service_worker_once -> multiplayer_transport_drain_request_text_queue.
  • Closure note: the older broad request-id question is now replaced by the grounded lane split already exposed above. multiplayer_dispatch_requested_action bounds the outer Multiplayer.win action family, while the concrete transport submit owners are the bound-route status lane 0x5959e0 -> 0x593980, the selector-text route-request lane 0x593c40, and the second selector-descriptor callback lane rooted at 0x59fc80. The preview-dataset reuse boundary is also closed at the current evidence level: beyond Multiplayer.win, the same owner family is reused by the .gmt save-mode hook in 0x00445de0, BuildingDetail.win auxiliary sync, Start New Company... side-owner submission, CompanyDetail.win async multiplayer actions, and dataset-side selector or update branches, but not by a broader ordinary world-service path.