Original current trade-flow cache and publisher
This is read-only evidence from the pinned 6891F70A021FA9F3A0E00458C284F48D1226E68AE7FC02AD48081AED47857E93 image. It does not certify the updated runtime image or a live cache. The implemented TRD history layer remains separate; none of these findings turn that history into current trade routes.
Cache, time and expiry
3C12700 registers TradeRoutesCache (string 5538608, descriptor 5FDBDB0, size 160); factory 3C0EDD0 calls 3AD9300. The interface is object +58, old vtable 552EBD0, and its type getter 3B12EE0 returns 5F856E0. The existing Navigation.GalaxyAccountTradeData.cs copies the owned timestamp map only. It does not currently export the route map or a current TTL.
The constructor binds a real clock through 5F05CA8 at object +80. Its interface vtable is 5134AE0; slot +28 is 9A6DE0, which atomically reads the interface's +1F8 unsigned 64-bit value. The actual clock constructor 99F1A0 writes this table at 99F252; destructor 9A0F30 writes it at 9A0F59. The independently paired ED5A constructor/destructor operands and actual type-getter/table lookup agree, including the fact that this clock table remains at the same RVA. This permits a same-clock comparison without assigning a guessed DateTime epoch. The constructor derives two distinct durations from its actual configuration: +D0 = config[14] * 24 * 60 * 60 (expiry), and +D8 = config[10] * 24 * 60 * 60 (refresh age). These duration units are seconds; an actual configuration value must still be read rather than substituted.
3B55BB0 is a mutating acquire/refresh request and must never be invoked by a read-only adapter. It checks original service gates, finds the owned timestamp, and returns early while clock - refreshAge < timestamp. Otherwise it inserts the system address into the pending map at object +130. Pending is not equivalent to already owned flow data.
3B2ABE0 is the original remaining-lifetime getter. For an owned entry it rejects timestamp < clock - expiry and otherwise returns expiry - clock + timestamp. A pending entry without owned data returns the full configured expiry. The getter's original unsigned arithmetic is retained as evidence; a tool should not treat this pending result as permission to display nonexistent routes.
3B4E2A0 parses an original version-4 route response/cache. It requires a nonzero system address and accepts only timestamp <= clock and timestamp >= clock - expiry. It records owned timestamps at +110, the earliest loaded timestamp at +108, and updates the aggregate flow map at +E0. For each aggregate node:
| Offset | Original field |
|---|---|
+0 |
chained hash next |
+8 |
from system address |
+10 |
to system address |
+18 |
original interned commodity symbol token (u16) |
+20 |
NPC amount (float32) |
+24 |
player amount (float32) |
+28 |
original timestamp (u64) |
The original parser rejects equal endpoints, requires a nonzero commodity symbol, and accepts a finite bounded NPC amount under its original comparison. For the same (from, to, commodity) key, it replaces data only when the incoming timestamp is newer. A successful parse increments the object +100 revision. The field spellings and unsigned/signed types must be retained independently from commodity UIDs and market IDs.
Interface slots +68 (3AFA600) and +70 (3B06C00) are aggregate-map begin/end iterators. Slot +50 (3B33120) returns a keyed amount: mode 1 NPC, mode 2 player, mode 3 their sum. It does not itself check time. Continuous expiry cleanup is independently closed by 3AF8980: it computes unsigned cutoff = clock - lifetime; it returns without an expiry scan while cutoff <= earliestTimestamp(+108). Otherwise it removes owned rows whose timestamp is strictly below cutoff, increments revision for owned removals, and removes aggregate rows whose timestamp at +28 is strictly below cutoff. Equality with cutoff survives. Copying an aggregate map without this time rule must not be described as current data; the native reader now applies the same unsigned cutoff without mutating the original maps. In particular clock smaller than lifetime is not silently clamped to zero.
Map publisher and geometry entrance
GalaxyMapTradeRoutes is a different registered component (name 5538478, descriptor 5FDBBB0, size 210), factory 3C0E3C0 / constructor 3AC9700. Its old base/secondary/interface vtables are 552CE58 / 552CE88 / 552CF88. The interface getter 3B12E00 returns type 5F87B20. The constructor builds the independently proved 13 original commodity-parent rows and 123 commodity-leaf rows, preserving per-parent and per-leaf selection state.
3B92120 obtains the actual account TradeRoutesCache from the actual player registry. It rebuilds only when the original cache revision, trader-source selection or dirty flag changes. It enumerates the aggregate map, requires both the commodity leaf and its parent to be selected, computes the selected NPC/player/all amount, subtracts the same commodity's opposite-direction amount, and retains only directions with a positive difference. It then accumulates the original gross amount, not the difference, per (from, to, parent category) into the per-origin trade tree at object +160. Its default +190 = 4 limit retains four strongest category routes per origin. The tool implements that selection, but uses deterministic address/category tie ordering; original hash-iteration tie ordering is not asserted identical.
3AB9960 is the bounded frame consumer that calls 3B92120. It independently checks original game/view state, the TradeRoutes setting via interface +30, and original context state. It then walks actual loaded galaxy objects and calls 3B92B40 for eligible original objects before passing them to the actual route/hotspot renderer objects +1F0 and +1F8. This establishes a real geometry entrance without assuming coordinates from system addresses or drawing historical records as live routes.
The full C outputs use names decompiled/3b92b40.c, 3c05ba0.c, and 3c05320.c (no solo- prefix). 3B92B40 reads focus from the actual 5F05DCC camera interface slot +48. Independently closed getter F847C0 returns actual smoothed focus, not Eye or target. The observed frozen settings align with a 25 ly inner range and an additional 3 ly fade band, centered on that actual focus. Segment spacing is 3 ly and the count uses offset 2, clamped from 2 to 8. The amount parameter is grossAmount * 1.2f + .3f; final width semantics require the actual shader.
The original 3C05BA0 and 3C05320 consumers write 44-byte instances: two float3 endpoints, packed signed random direction, half2 amount/phase, half4 atlas coordinates, and packed RGBA. The packed source RGB is white, with the accumulated per-route fade in alpha. Category supplies atlas coordinates rather than an independently verified thirteen-RGB palette. The original resource references GalaxyMapResources/TradeRoute (16 by 13 atlas) and TradeRouteHotspot (4 by 4 atlas). These facts do not justify using the historical layer's colored arrowheads as the current layer's original appearance. The Map DP carries actual projected current routes; original source geometry and texture math are now implemented independently of the historical layer, with full rendering still explicitly false.
The original parent/leaf toggle setters 3B58D00 / 3B58E20 write their selection state and persist to the actual settings service, then mark the publisher dirty. The tool reproduces selection locally and never calls those setters. The actual publisher's short-token map at +140 resolves its u16 token to a +138 leaf row and original frozen symbol. Absent or unready binding leaves a null name. Original token values are retained in runtime records, while tool selection uses the actual symbol so a new process's intern table cannot silently select an unrelated reused token.
The saved parent and leaf namespaces are independently closed by Trace-OriginalTradeSettings.py: source constructor3AC9700 interns literal categories and commodities, holds them at base+200/+202, and calls its actual Settings interface's virtual1B0 with the original frozen name and default1. That Settings interface is oldVT52A0960; its type getter26008E0 reads the exact owner typeglobal5F05CE0. Slot1B0 is26069A0, which looks up the current selected preset's +138 namespace/leaf bool map and retains the caller default when no leaf is saved. Slot1A8 is2648750, the original mutating setter that the tool never invokes. Existing full readers2631820 and writer265AE40 explicitly load/store that exact +138 map under Root/VisibilityFlags. Thus paths VisibilityFlags/categories/Metals and VisibilityFlags/commodities/Gold are source-backed namespaces, not inferred market taxonomies. Import restores their independent parent/leaf sets; a disabled parent hides its routes but preserves each leaf state for later re-enabling. Unknown future names are kept raw and never assigned a guessed parent/UID.
Implemented read path and limits
Navigation.GalaxyCurrentTradeFlows.cs copies the real registered cache, real registered clock and optional real publisher definitions on the original owning thread. It verifies component tables, owners, current registry/entity/context, revision, chain bounds, unique keys and a stable private copy. Invalid source data remains unavailable. Zero amounts remain present so an old positive row cannot survive as current data. The snapshot has complete=false and retains the original clock, expiry/refresh seconds, revision, exact addresses, original commodity token/symbol, amounts and timestamp. It neither invokes refresh/acquisition nor sends a game network request.
The independent galaxy.tradeflows transport uses 16-row pages with a 48 KiB UTF-8 response budget. Addresses, original clock and row timestamps are exact decimal strings. Generation/entity/source/revision/expiry/refresh are fixed across a read; original clock can advance monotonically within that generation. The Core reader checks all rows against the final maximum clock's cutoff, rejecting an earlier page that expired during pagination. Explicit next offsets and null termination prevent accepting missing pages. Runtime context loss and failures clear the current layer; the historical TRD layer remains independent.
The native reader's eight private-allocation groups and wire regression are included in the parent-reported 496 passing native invocations. Eight Core pipe/domain regressions cover cross-page source changes, monotonic clocks, final expiry, future/boundary/expired timestamps, underflow, UTF-8, exact addresses above 2^53, zero/newer rows, opposite-direction commodity identity, original parents, four-strongest selection and actual-coordinate projection. Four additional Core tests validate the original assets, geometry/packing, source hash and focus boundary. These are fixture/offline checks, not live game or pixel-parity acceptance.
Original source mesh, atlases, animation and shader comparison
3C08CA0 constructs the actual route half4 STUV mesh from the source configuration's 16 segments: two side vertices and one centre per segment, followed by the final two side vertices. Its 50 vertices and 192 indices preserve the original shared seams and four triangles per segment. 3C09790 constructs the hotspot's four half4 corners at ±0.5 and index order 0,1,2,2,1,3. The instance writers use the original SIMD half converter (normal rounding with flushed subnormals) and nearest-even cvtps2dq for the packed signed midpoint and white/fade colour. Curve seed combines both halves of both exact system addresses and parent category, followed by original xorshift13/17/5 steps; it is neither a random new route nor a seed truncated to a JavaScript number.
The original callback table 5529CC0 contains frame consumer 3AB9960 and separate animation callback 3AB9B00. The latter reads its actual configuration field +5C (frozen root +CC, float0.6), scales frame delta and invokes 3C074B0 on the actual +1E8 timer object. That updater multiplies delta by float0.5, adds (.21875,.1875,.15625,.125) times delta to Timers0 and .09375 times delta to all Timers1 channels, then takes the per-channel fractional part. Original named timer wrappers publish those two vectors. The tool uses this same float32 update but starts from its own activation epoch; it does not pretend its phase is the original game's live phase.
Extract-GalaxyTradeEffects.py copies and disassembles only the four actual RouteInstances/RouteHotspotInstances VS/PS from already pinned Effects_Win64_SM50.arc. Build-OriginalGalaxyTrade.py copies the exact BC1 textures from resource19b9e393c96329f63707aeade6a46e8cf3b71398 and source FGM values. Native source format96 maps through the actual PE texture-format table to DXGI72, BC1_UNORM_SRGB; this is distinct from linear BC1. Route and hotspot are512×512, while the64×4 trail retains its authored256-byte row pitch/512-byte allocation. All payloads are SHA256 checked in the Core loader. The actual atlas images were inspected; colours are authored texture rows/cells, not guessed palette colours.
The Route VS implements a quadratic curve with original signed offset, camera-axis side vector, sine pinch, amount-derived half width and two independently scrolling atlas samples. Its PS multiplies the two sampled RGB/alpha contributions and the separate trail texture. Hotspot uses the original per-instance phase, tile spacing, opposing UV rotations and camera right/up quad. Its FGM gain2/width0.65 remains distinct from Route gain5/width1. Projection uses the same recovered Core camera lens as all other world passes. Both original PSs multiply only final RGB by cb1[90].y = gHDRScalingWrite, preserving instance alpha. Production supplies the shared scene Write through tradeProjection.y; source probes explicitly default to1.
research/GalaxyTradeShaderProbe links the production Trade graphics partial/HLSL, then renders the original four DXBC with identical44B buffers, half meshes, source textures, projection and controlled constants on WARP. Three cameras independently compare route and hotspot images (six cases). Maximum mean absolute RGB-channel-maximum difference is0.04260/255; maximum pixels differing by more than3/255 is4560/1440000 (0.317%). Each case draws13 route instances/104 hotspot instances; clearing the source resets both counts and animation. Raw captures/report are under artifacts/galaxy-trade-shader-validation; original-size PNGs, 2× detail and source-DXBC side-by-side/difference images are under work/visual/galaxy-trade-shader. These original images and details were actually viewed: authored coloured curved bands and small round hotspots remain visible, without substituted historical arrowheads.
The initial comparison fixes midpoint decode at2/-1 and shared multiplier1. A later independent source closure in Trace-OriginalGalaxyBlendApplication.py now proves the exact SourceAlpha/One/Add state for both programs: actual effect kind5 instructions read literal bank1 source4/destination1, copied by original 4FA720 -> 4FA280 -> 4FD1C0 from the serialized data, then interpreted by 4FBEC0 -> 516980 -> 513D70. This is not an inference from layer18. Source RGB-only Write is separately pinned by Trace-GalaxySourceHdrOutput.py. OriginalCurrentTradeGeometryRestored=true means source primitive/atlas math, while OriginalCurrentTradeFullRestored=false retains unresolved original live cell-load fade, absolute animation phase, normal decode constants, complete live exposure/LUT/bloom and real-process acceptance. The source25ly focus range plus3ly geometric fade is used, but a fully resolved tool endpoint does not certify the original cell-load alpha. Historical GPU/visual cuts retain their original controlled-source labels; the new blend/output proof is recorded separately.
Relevant decompiled functions and full assembly are retained under artifacts/galaxy-query-research/account-sources/{decompiled,assembly}. Reproduce leaf/table evidence with galaxy_trade_flow_evidence.py and fixed-image compatibility with galaxy_trade_flow_compatibility.py (11 bounded functions, 7 slots, independently paired constructor/destructor references).