Actual original commodity UID definitions
Static source image: 6891f70a021fa9f3a0e00458c284f48d1226e68ae7fc02ad48081aed47857e93. Current ED5A source bindings are independently paired by galaxy_commodity_compatibility.py; the sidecar is artifacts/galaxy-query-research/commodity-tree/compatibility.json. Its fourteen complete bodies, eleven bound virtual slots and two name/category leaves are read-only offline evidence. Runtime acceptance remains separate.
Original 3A603C0 publishes PlayerData/CommodityList from the actually registered enumeration type 5F05CE8 and definition type 5F05C34. The current map constructor binds these dependencies independently; they are not market files, market IDs or the frozen TradeRoutes thirteen-parent tree.
| Source | Pinned binding | Current independently matched binding | Pure container |
|---|---|---|---|
| Enumeration | ctor 1DD20C0, tables 5241918/5241948/5241A48, registration 1E2A6C0 |
tables 52418E8/5241918/5241A18 |
interface+58 / object+B0 open hash; key node+8 uint32; publisher kind node+14 int32 |
| Definitions | ctor 1B29840, tables 5219630/5219660/5219760, registration 1B3C0B0 |
tables 5219600/5219630/5219730 |
lookup 1B31E60 reads interface+160 / object+1B8 open hash; key node+8 uint32; value node+10 inline |
Both registrations expose object+58 interfaces. 1DF3740/1E08E20 are the exact begin/end enumeration methods. Hashing uses the original uint32 multiply/xor sequence and sentinel buckets. 1B3B800 leaves object+284 zero while building and sets it to1 only after the definition build.
The active enumeration's loaded gate is independently closed through its
resource callback, not guessed from another class with a similar layout.
Secondary-vtable resource initialiser 1E28E90 uses 5F85C40; static initialiser
0BF140 installs the preceding resource vtable 523FF58. Its callback
1DA7760 subtracts60 from the resource handle and jumps to 1DF25B0, restoring
the actual enumeration object. Only a successful response sets object+A8=1,
clears the B0 hash and synchronously calls 1E34530 to parse all rows. The
owning-thread reader requires A8=1 and stable source bytes, so a structurally
valid initial empty hash does not masquerade as a loaded empty catalogue.
The poller and parser have complete independently matched ED5A bodies. Source
evidence is in balance-provider-evidence.json, enum-resource-owner-refs.json
and enum-resource-descriptor-refs.json. No callback, loader or network method
is invoked by the adapter.
1B3AC10 returns the definition+8 FGDK name reference. 1B39630 follows definition+60 → reference+8 with low two tag bits cleared → frozen+30 → string+8 UTF8 category. The reader copies those exact chains with bounded UTF8, validates source tables and owners, hash count/buckets/keys and final byte stability, and never calls the original lookup (which would adjust reference counts or log a miss).
Original publisher rules remain distinct from definition identity. Kind1 is included. Kind2 requires the actual selected actor's cargo predicate; other kinds are excluded. The read-only adapter selects the original kind3 actor with the already verified priority rule and copies its actual cargo interface: rows are stride60 at interface+388/count+380. Predicate3A2F7A0 compares the exact FGDK definition name through1EC2CA0, cargo row+8 against the original5F05E70 scope getter+68, and requires row+28==-1. Getter2560FD0 reads scope+160, falls back to+138 for all-ones, and the original publisher then maps all-ones to owner0. No FID number, Journal cargo or mission title supplies these values. A known empty valid actor/cargo table can prove false; malformed or unbound context stays null. The copy rechecks actor rows, life, registry bindings, scope and cargo bytes. Missing definitions contribute unresolvedCount and do not become fabricated names, inferred catalogue rows or confirmed absence. The local enumeration and definition loaded gates are now explicit; complete=false still avoids claiming a complete account/server or final ship-filtered UI when cargo context or definitions are unresolved.
Original settings slot31 is CommodityIndex, confirmed by 3B3ED60's actual instruction 3B3FB4A: mov edx,1F before settings getter+1F0. Saved signed or unsigned32 values resolve only against the actual source UID. Zero is not a proven sentinel and is accepted; FFFFFFFF is the original invalid lookup value. An observed Market.json numeric ID never supplies a missing UID. A known symbol/name alias may provide a label, while the actual definition supplies its parent. Unknown parents remain unknown. Pending imports can resolve after the runtime source becomes available; manual edits clear the pending UID so refresh cannot overwrite the user's selection.
Slot32 CommodityPriceMode is read by 3B3DF50 and clamped0..3. In the actual regional balance classifier 3B27B00, positive balance selects Import, negative selects Export; mode1 excludes Export and mode2 excludes Import. Modes0/3 allow both signs, with additional zero/unknown ImportNothing/ExportNothing branches. The current import restores only the verified single-direction1/2 mappings. It retains0/3 explicitly and does not pretend public station supply/demand is the original regional balance source.
Native own-allocation and wire fixtures cover real UID671333304, uint values above Int32, zero/high IDs, actual category tags, source readiness/ownership, kind2 unknown and the separate exact owner/cargo predicate, missing definitions, malformed maps/strings, serialization and no writes. Core tests cover stable multi-page identity, context changes, unsupported completeness claims, exact saved UID resolution independent of Market IDs, parent provenance, deferred selection and manual edits. Final live and visual acceptance remain separate.