# Original ten-service query facts This is an offline source/own-memory implementation. No game function, network request, settings setter or live process is invoked. ## Source and exact meaning Services is saved visualisation ID11, constructor old`3AD17F0` and vtable`552DFE0`. Its classification getter`+50=3B26860` resolves type global`5F856E8` from the original registry and calls that service's `+50` with the exact system address. It does not take station observations from a public catalogue. The unrelated `3AD1F00` is Civilization ID10. The actual service provider is old constructor`1DD2560`, main/secondary/typed vtables`5242418/5242460/5242560`, with typed interface at component`+58`. Registration`1E2A6F0` returns that interface; the actual type leaf is`1E11180`. Typed`+50=1E22170` looks up an existing dense hash map at interface`+118`. The map header has count`+8`, capacity`+10`, storage`+18`; occupied bits precede sixteen-byte records at `storage+(((capacity>>3)+7)&~7)`. Records hold the full64-bit address at0 and six service bytes at8. `644BD0` performs linear probing with the same low-bit address hash. No getter or loader is called by the port. The original classifier's ten-entry jump table at`3B269D4` proves: | Explicit original index | Original key | Six-byte condition | | --- | --- | --- | | 0 | materialTraderRaw | byte2 ==1 | | 1 | materialTraderManufactured | byte2 ==2 | | 2 | materialTraderEncoded | byte2 ==3 | | 3 | materialTraderXeno | byte2 ==4 | | 4 | techBrokerHuman | byte3 ==1 | | 5 | techBrokerGuardian | byte3 ==2 | | 6 | interstellarFactors | byte1 !=0 | | 7 | blackMarket | byte0 !=0 | | 8 | carrierVendor | byte4 !=0 | | 9 | modulepacks | byte5 !=0 | The adapter returns all ten bits at once, independent of the game's previous `ServicesOption` setting. Tool selection and multi-selection use these exact indices. Unknown trader/broker byte values match no subtype, exactly as the original equality comparisons do. Nonzero boolean bytes are accepted, not restricted to1. ## Initialization, absence and ownership `1E22170` explicitly writes six zero bytes when its key is absent. Its typed`+8` readiness method is a constant true leaf, not a network-completion flag. This port conservatively keeps the constructor's all-zero count/capacity/storage state unknown. It recognizes an absent row only after a structurally valid initialized table and stable repeated header/occupancy checks, returning `mask=0,defaulted=true`. This is the original cached predicate's default, **not** a claim that a complete survey has proved the galaxy contains no such service. No global completeness is exposed. Positive rows retain `defaulted=false`; actual zero summaries are distinct from missing-key defaults. Typed owner/vtable/getter checks, owning-thread/context/PID/image/entity/origin gates, registry re-resolution, copied-byte/key re-reads and bounded probing reject stale, malformed or moved sources. Missing/invalid sources remain null. The initialized map is read without calling its lazy path or original getter. ## Current client pairing `research/Trace-GalaxyServiceFacts.py` pins the old6891 and currentED5A image hashes, uniquely matches the complete constructor1163B, summary getter141B and classifier372B, and derives current vtables from paired constructor operands. It then verifies actual typed slots0/8/50 and their complete leaf bodies. Current vtables are`52423E8/5242430/5242530`, type leaf`1E110C0`, getter`1E220B0`, constructor`1DD24A0`; the type global remains`5F856E8`. Proof is `artifacts/galaxy-query-research/service-facts/compatibility.json`. A normalized registration leaf is nonunique, so no standalone match for that short helper is published; current ownership instead comes from the uniquely paired constructor and actual typed table. ## Integration and tests Native API: `TryReadGalaxyServiceFacts(GalaxyFilterContext,nuint registry,ulong address,out GalaxyServiceFact?)`, with `GalaxyServiceFact(ushort mask,bool defaulted)`. Requested wire data is either `services:null` or `services:{mask,defaulted}`. Core uses `ServiceMask`, `ServicesRequested` and `ServicesDefaulted`; explicit original unknown cannot fall back to an older public positive. A known zero cannot be restored by `IncludeUnknown` or a public query receipt. Explicit tool-only service choices keep independent positive public observations; an original mask never invents their absence. No selection uses the game's saved index. `GalaxyServiceFactsSelfTest` expects255 and exercises every actual field/selection, boolean bytes, initialized absence, uninitialized unknown, unknown subtype codes, typed owner guards, malformed tables,64-bit keys/collisions and no-write behavior. The source-linked `research/GalaxyServiceFactsProbe` executes only own-allocation copies with a bounded memory host: eight consecutive runs returned255, with no AOT build or game access. Four focused `GalaxyOriginalServicesTests` cover all ten indices, OR selections, aliases, original positive/zero/unknown precedence and tool-extension separation. Live runtime and UI acceptance remain separate.