CARD L3 - cross-compiler bucket test with the HEK Sapien build (VC7.1) - written 2026-09-26 02:23:41 -0700
Worker H1. Data only (sapien.exe is read as bytes, never executed). Lab compiles use production VC7 only.

Disclosure: ONE exploratory VC7 compile preceded this card (L3_vc7hash_{objects,periodic,decals,hs}: the VC7
uninitialised-bucket order of four control name sets). Its result is recorded below as already-known, not predicted.

Facts found before this card (no compile):
- HEK sapien.exe (2004, linker 7.10; Rich header: 697 objects Utc1310_C build 3077 = VC7.1 13.10.3077) contains
  render_debug (the three cache strings). Its cache layout (tools/pefile_min.py, add_cache_string/entry code):
  entries 0xC9D0E0, strings 0xCA40E0, game_time 0xCA44E0, entry_count 0xCA44E4, string_offset 0xCA44E8,
  entry_overflow 0xCA44EA, string_overflow 0xCA44EB. Same widths and 4-byte short slots as January; ONLY the two
  arrays are swapped (January: strings then entries).
- Sapien order of statics whose names are AUTHENTIC (present in HCEX.pdb as SymTagData):
  objects.c: memory_pool < name_list < globals  (January: name_list < memory_pool < globals, i.e. '= 0' order)
  periodic_functions.c: periodic < transition < initialized (January: initialized < transition < periodic)
  VC7 uninitialised-bucket (name-hash) order of the same names: memory_pool < name_list < globals and
  periodic < transition < initialized  => Sapien == VC7 hash order in both (1/36 by chance).
- 9210 and 9254 produce the same hash order (150-name pool) - the hash is stable across VC7 builds.

Hypotheses:
H-a' VC7.1 orders zero-initialised statics by the SAME name hash as uninitialised ones (one hashed bucket).
H-b  VC7.1 keeps VC7's two buckets; Gearbox's 2004 source dropped the '= 0' initialisers in objects.c and
     periodic_functions.c.
PREDICTIONS:
R1 Over every January TU whose statics have AUTHENTIC (HCEX) names and whose January order is NOT the VC7 hash
   order (so January used '= 0'), Sapien's order equals the VC7 hash order in (nearly) all cases. Expect YES
   (H-a'), confidence medium.
R2 Over TUs whose January order already equals the VC7 hash order, Sapien equals it too. Expect YES.
R3 If R1 holds: January render_debug's order cannot be the hash order of its (unknown, but Sapien-shared) names,
   because Sapien shows entries before strings. Then January's entries (and every later object) is in the
   '= 0' bucket; strings alone may be either. Expect: this is the reading if names were unchanged 2002->2004.
Failure of R1 (Sapien keeps January's declaration order for authentic '= 0' sets) refutes H-a' and makes the
Sapien swap uninformative about January's buckets.
