# Original Thargoid panel published cache This is static PE/ActionScript evidence and a private allocated-memory fixture. No game was started, attached to, queried over a network, or modified. No original update, callback, metadata loader, or HTTP function is invoked by the adapter. Runtime freshness and current live contents remain unverified. ## Original UI and DS contract `artifacts/galaxy-marker-research/map-as/scripts/components/leftHandPanels/GMThargoidWarComponent.as` binds `Signals`, `States`, `ProbedSystems`, `HarvestedSystems`, `ControlledSystems`, and the separate `recoverySystemCount`. `AntiXenoSignalButton.as` separately consumes `affectedSystemsCount` and `isRoutePlotted`. Selecting an entry calls `OnAntiXenoSignalSelected(id)` or `OnAntiXenoSuggestedSystemSelected(id)`; the adapter does not send either callback. Original old-build DS generator `3AA9F20`, retained in `artifacts/navigation-target-qa-20261021/decompiled/solo-3aa9f20.c`, reads these exact published interfaces: | UI value | Original source | | --- | --- | | States 33–36 | interface virtual +18(state) | | Recovery count 37 | same getter, a separate UI property | | Signals | interface virtual +20() returning a 32-byte vector header; each row is 16 bytes | | Recommended Probed/Harvested/Controlled | virtual +28(state33/34/35), five fixed 16-byte slots per state | The main map constructor `3A05660` binds its +290 source from the dynamic component ID at global `5F5428C`. Component constructor `3A0E740` installs the source interface at base+70, primary vtable old `55276E8`, component vtable +8 old `5527718`, published interface old `55278C0`. Owner is base+10. Original interface getter `3A4C0C0` returns that same dynamic ID; it is not a guessed numeric component enum. Published getter `3A565B0` returns count `base+318+4*(state-33)` only for states33–38. Getter `EC00F0` returns `base+510`, and getter `3A57E40` returns `base+330+50*(state-33)`. Original state names are independently declared in `factions/consts/FactionStates.as`: 33 Probing, 34 Harvest, 35 Controlled, 36 Stronghold, 37 Recovery, 38 Pseudo_HumanControlled. The UI presents states33–36, with 37 separately; the adapter preserves all six original counters without relabelling 38 as another war state. ## Meaning of the rows Original parser `3A6E3E0` parses the `systems` dictionary. Keys are decimal real system addresses. It adds a signal when raw state is36 or the original Titan flag is set. Signal row+0 is that address, row+8 is `state==36`; the remaining bytes are padding and are not interpreted. The DS displays the translated key `Maps_AntiXeno_Panel_Signal_System{address}` and appends `Maps_AntiXeno_Panel_Signal_Destroyed` exactly when that boolean is false. The callback `id` is the signal's original array index, not its 55-bit address. Recommended slots contain the real system address and the original `progress` float at +8. The original parser considers only strict `0 < progress < 1`, keeps five entries per state in descending progress order, and the DS `3A161C0` stops at the first zero address. Its callback id is `(state << 8) | rank`. The adapter copies those three published lists, preserves their order and progress, and never synthesizes recommendations from a public catalogue or current view filtering. `affectedSystemsCount` comes from the existing generic metadata lookup `39BED80`: it returns hash node+10, the DS requires descriptor+1D0, and sums descriptor+1C8/+1CC (`stronghold_controlled_systems` / `stronghold_attacked_systems`). The adapter traverses the two existing maps read-only and leaves the value null when unavailable, malformed, changed during copying, or overflowing. It never requests that descriptor. ## Readiness and completeness Original component ready predicate `3A62630` requires base+1A2 and +1A3 together in the relevant original mode. Response handler `3A2B090` sets +1A3 after response completion even when the HTTP result fails or the parse is unsuccessful. Therefore neither flag, nor an empty vector, proves that all current war information is available. The managed snapshot preserves `metadataObserved` and `responseObserved`. State counts are null until both flags are set. Positive existing signals/recommendations can remain useful while either flag is false, but they must be presented as unverified original cached data. Even with both flags set, `complete` remains false; a zero count is an original cache value, not an exhaustive world assertion. There is no proven total-system-count/completeness field. Recommendation length (maximum five per group) and signal length must never substitute for original state totals. ## Current ED5A compatibility `research/galaxy_thargoid_compatibility.py` regenerates `artifacts/galaxy-query-research/thargoid-account-sources/compatibility.json` from exact full old/new image hashes. Six complete relevant functions match normalized instruction bytes; constructor references close all six interface vtable bindings. Four actual published leaf getters are additionally verified through RET. Current vtables used by the adapter are `55276B8`, `55276E8`, and `5527890`; dynamic ID global `5F5428C` is unchanged. This is a bounded extension to the runtime-neutral compatibility evidence, not a hook-installation approval or change to the shared profile/hash. The parser is a genuine changed body: old `3A6E3E0` → new `3A6E340` is uniquely called from the fully matched response handler `3A2B090` → `3A2AFF0`. It has 613 versus611 instructions: stack locals moved and one duplicate JSON cleanup call+lea was removed. All 25 instructions referring to its published member range +318..528 match exactly. Whole-body equivalence is deliberately not asserted; the adapter never calls this parser. ## Implementation and fixture `native/ManagedPlugin/Navigation.GalaxyAccountThargoid.cs` adds an owning-thread-only read adapter, validates all relevant source vtables/owner, bounds vector sizes, validates addresses and original boolean/progress fields, and checks source bytes again before publishing. No negative account or world facts are inferred from missing entries. `Navigation.GalaxyAccountThargoidTests.cs` exports `XFENavigationGalaxyThargoidSelfTest`, expected mask65535, covering real 55-bit addresses, callback ids, source order, readiness/unknown counts, empty partial results, owner/vtable guards, malformed counts/flags/addresses/duplicates, invalid progress/order, zero-slot termination, optional metadata and byte-for-byte read-only behavior. Isolated build: `dotnet publish native/ManagedPlugin/Standalone/Standalone.csproj -c Release --artifacts-path artifacts/galaxy-thargoid-tests`. Fixture runner: `research/Invoke-GalaxyThargoidFixture.ps1`. Results live under `artifacts/galaxy-thargoid-tests/thargoid-selftest.json`; loading that private test DLL is limited to its allocated-memory self-test export. It is never installed into the game.