Files
Cesarus85--mjolnir-vr/docs/object_matching_logs/data_encoding_obj.md
T

23 KiB
Raw Blame History

data_encoding.obj exact-match strategy log

Current disposition (2026-08-11): strict-exact and admitted. The historical fixed-point analysis below is retained because it documents the 17 rejected source families that preceded the provenance breakthrough.

Scope and provenance

  • Translation unit: source/memory/data_encoding.c
  • Target: build/split/source/memory/data_encoding.obj, split from the January 2002 cachebeta.exe
  • Candidate: build/base/source/memory/data_encoding.obj
  • Compiler: Xbox XDK 3911 VC7 (xbox/bin/vc7/CL.Exe, version 13.00.9254.1)
  • Required flags: /nologo /c /O2 /Oy- /DDEBUG /Dxbox, with the repository include paths generated by configure.py
  • Starting revision: codex/campaign-integration at 8cf2d5444
  • Comparator: tools/coff_compare.py at 8cf2d5444, including the hardened pairwise relocation resolver for code and non-code sections
  • Target topology evidence: the January public symbols and addresses recorded at the head of data_encoding.c; older source/PDB material is a hypothesis source only and does not override the January object.

The isolated lane was configured from the repository generator. It uses the same checked-in source/configuration, shared read-only XDK 3911 junction, local cachebeta.exe, csplit.exe, and objdiff-cli.exe; no compiler flag or target object was changed.

Validated baseline

Command:

ninja build\base\source\memory\data_encoding.obj build\split\source\memory\data_encoding.obj
python tools\coff_compare.py build\split\source\memory\data_encoding.obj build\base\source\memory\data_encoding.obj <all 16 function symbols>

The hardened baseline is 15/16 strict exact, with 3,296/3,296 padded function bytes. All 14 target-owned non-code sections are strict exact: 459/459 .rdata bytes, zero relocations. The candidate additionally emits the buffer, buffer_size>=0, and count>=0 assertion literals in separate COMDATs; csplit does not assign those deduplicated literals to this target object, so they are compiler metadata/ownership differences rather than owned target data.

Ordinary objdiff reports _data_decode_memory at 66.56% in the local objdiff 3.3.1 build (earlier campaign handoff: approximately 66.64%). Ordinary objdiff is diagnostic only; strict status comes from the hardened comparator.

Function inventory

Function Padded size T/B Relocs T/B Normalized SHA-256 Status
_data_encode_new 112/112 9/9 8768c68e1dd89e978d0ae821e3599c950e6bc795d64bc23baef5d32486755250 exact
_data_encode_memory 304/304 17/17 aeaf7eb5fddeb848adc29cfd6c46546c90c32c0981b02f0f430cd511286b7aaf exact
_data_encode_integer 256/256 10/10 a960315a739a4230040a899eee18700f8685df0ca0d4111043e68e8e9b2cdf79 exact
_data_encode_structures 256/256 14/14 d0e427473335d5a915239ee2e3230b578142375541b1afda95fa477ad302ce45 exact
_data_encode_array 576/576 43/43 7e3569e19e98be057aeb330fe1973dfc2afe7e13e8e49f66c61f8ed1d4971b6b exact
_data_encode_string 160/160 6/6 c18aa3a96c57cd1d10274595fc7573898f2e7f77c8e58f574b567351a692405b exact
_data_decode_new 112/112 9/9 f0dea9eac3ff40d6f0da3dc2ead78ee450e3b920a592869c288c27cf1bb7a78d exact
_data_decode_structures 240/240 13/13 0db6222030d5655dfaada7a01714785744db752226b2d6bd63a3c1b9703e1033 exact
_data_decode_memory 304/304 19/19 T eb39377415e6c3e07f763e8f0f42f6ecafaf61acc0fab30fbc06062b9dc465d8; B 9c154cab347995fa1eb87ee6b088615f4347de7947058d8336212577bfbc3cc7 residual
_data_decode_byte 112/112 4/4 91f5ba7bc99766592386506f438136daff739b16a34d0151810d759d89122d96 exact
_data_decode_short 128/128 5/5 6cc7704a74a9b48b8af5b860054bbe2ee2bee0b06fb8dc7a4a30e4611ef34118 exact
_data_decode_long 128/128 5/5 276c5b1dd2ccedc8e0807a589a4d11a699b213b4468a60d5a2ffca02bd540320 exact
_data_decode_int64 48/48 1/1 c805dccfc68c675dcfa56b15147f6009a559a3a433d23df1ac21097e37960e4d exact
_data_decode_integer 112/112 7/7 2f9457b0cc9adc7f20a16b38881f7d52612e1b24ce15a4ddd754e85b3de0766e exact
_data_decode_array 368/368 31/31 93eb0427d2cb6c8818cdccb5031169e42c9a2461c00022f6dc29343ead57d74c exact
_data_decode_string 80/80 0/0 a19f040eff69a02e0703f67d49921b998501ed6e80d63327f349cbee99a1515c exact

Owned non-code inventory

All rows are .rdata, have equal target/base size, zero relocations, and strict-equal normalized hashes.

Owner literal (abbreviated where mangled) Size SHA-256
source path c:\halo\SOURCE\memory\data_encoding.c 38 ac45863b58782998f06cb76da1351037cf0159cf84cfec4bd847608fee673c7c
encoder state assertion 79 4c493fd06ea83ac5ad038620f75e473ad22e9ce29b855d6ee1ca403b382f0f0c
maximum_value>0 16 882e4a931d94220788dcec61f1eba5637173959aa0f731442bb8c3d272175a7c
bs_definition 14 eba14beb7acb02e162f68248bed2808506799bb99b058f968196e698270f0a6c
source_structures 18 184b611e452e730136a62c03caae0f6a95c0a06e3fe4a44fc102205d73bcee76
element_count<=UNSIGNED_SHORT_MAX 34 8cf0d82bca902627da4f2f1a6698e6dc974e96718e775c291e07b0dc49565196
element_count<=UNSIGNED_CHAR_MAX 33 16178348f414a11c23324da5743a39b6b3ed634afa7c8a7ed25c54f35ebde403
element_count>=0 17 74e3fcb64e369c70c9d31a2c84f4c9b16504e31f50efc7aa1e560d68b9f734bb
source_array 13 39cdb9d7009172e6efa42cf694dedd287c41eac4467a37afb9ce41af15cb22f9
string-buffer bounds assertion 50 c93b160e3929d1b5c6af9360f6462f200045d8a87cab4e344bb063486cfec125
structure_count>=0 19 4503f200e32141fa94a71eab30a9e2007d290f3962461e83e9f9a2e33271ea9b
decoder state assertion 80 fb5b4e55dd29f1c0c7ca225e0a1bf51b1cfadc7b58b764967d378665f186c2e3
maximum_element_count>0 24 2825bf6555d95f6799775dbb605de1404e3f1470c603665d7bff2144bb5b5e77
element_count_reference 24 8be5ee77e570517b19ff1edfaa15cbea510c24a9f7311f44982721b8e31b4f60

Residual detail

  • Meaningful target code size: 295 bytes; padded section: 304 bytes.
  • First normalized byte divergence: +0x4.
    • Target begins push ebp; mov ebp,esp; push ebx; push esi; mov esi,[ebp+8]; push edi; xor edi,edi.
    • Baseline begins push ebp; mov ebp,esp; push ebx; mov ebx,[ebp+8]; push esi; xor esi,esi; push edi.
  • The target owns state in ESI, the returned memory in EDI, and memory_size/the partial-width count path in EBX/BX.
  • The baseline owns state in EBX, returned memory in ESI, and memory_size in EDI, using EAX plus LEA for the scaled-count cases.
  • The first strict relocation divergence is relocation 10: the default-case source-path relocation is at target +0xA6 versus base +0xAA. Relocations 11-12 inherit the four-byte drift; switch-table destinations also differ at relocations 15-18. Counts and relocation kinds/semantic callees agree.
  • Normalized differing bytes: 114 across the 304-byte padded section.

Accepted controls

  • Keep the integrated source at 8cf2d5444 as the baseline. It is readable C and preserves all 15 strict-exact siblings plus all owned non-code data.
  • The recovered switch cases, assertions, overflow gate, byte-swap call, and offset update agree semantically and structurally with the January target.
  • No source change is accepted unless _data_decode_memory improves and the full 16-function plus 14-data-section sweep remains regression-free.

Experiment matrix

Historical objects and dirty worktrees were inventoried before new work. A scan of every available build/base/source/memory/data_encoding.obj found only the two normalized candidate hashes below; more than one hundred unrelated later worktrees all reproduce the canonical baseline hash.

In the table, 9c154cab... means the full canonical baseline hash 9c154cab347995fa1eb87ee6b088615f4347de7947058d8336212577bfbc3cc7.

ID Source shape Size T/B Relocs T/B Base hash / first divergence Siblings Decision
H00 Integrated natural decoder: memory = NULL, memory_size, direct switch and overflow gate 304/304 19/19 9c154cab...; +0x4; 114 differing bytes 15/15 exact retained baseline
H01 register long memory_size in the earlier encoder (data-encoding-closeout-current dirty tree), intended as a TU-wide allocation hint 304/304 19/19 unchanged 9c154cab...; +0x4 15/15 exact reverted; code-neutral and cannot affect the residual
H02 Invalid-size path reload memory_size = *(long volatile *)&count (data-decode-memory-closeout-2 dirty tree) 304/304 19/19 a85be189ba9066e2865595bdf359c1776697dc51e53db75b02b0175d5782d8c2; +0x5; 171 differing bytes; first relocation mismatch index 4 not better reverted; worsened and volatile forcing is prohibited
H03 data-encoding-closeout and data-encoding-final dirty worktrees 304/304 19/19 9c154cab...; no content diff (line-ending/timestamp only) 15/15 exact no experiment to preserve
E01 Declare memory_size before memory = NULL 304/304 19/19 unchanged 9c154cab...; +0x4; 114 differing bytes; first relocation mismatch 10 15/15 exact; data 14/14 reverted; declaration order is code-neutral
E02 Split void *memory; from memory = NULL; after both declarations 304/304 19/19 unchanged 9c154cab...; +0x4; 114 differing bytes; first relocation mismatch 10 15/15 exact; data 14/14 reverted; initializer spelling is code-neutral
E03 register void *memory = NULL 304/304 19/19 unchanged 9c154cab...; +0x4; 114 differing bytes; first relocation mismatch 10 15/15 exact; data 14/14 reverted; register hint is ignored for this already-register-resident local
E04 register long memory_size in the decoder 304/304 19/19 unchanged 9c154cab...; +0x4; 114 differing bytes; first relocation mismatch 10 15/15 exact; data 14/14 reverted; register hint is ignored
E05 register storage on the state parameter 304/304 19/19 unchanged 9c154cab...; +0x4; 114 differing bytes; first relocation mismatch 10 15/15 exact; data 14/14 reverted; register hint is ignored
E06 register storage on the count parameter, attempting to anchor BX before state 304/304 19/19 unchanged 9c154cab...; +0x4; 114 differing bytes; first relocation mismatch 10 15/15 exact; data 14/14 reverted; register hint is ignored
E07 Initialize memory_size = count before the switch and let case 1/default inherit it 304/304 19/19 7aec197e32f8b4791f940226f01426957e7a46f10c7309e29abe1a1c63a9ee25; +0x8; 243 differing bytes; first relocation mismatch 0 14/15 siblings exact (_data_decode_int64 also moved); data 14/14 reverted; substantially worse and violates sibling gate
E08 Add a local short element_count = count and use it after preserving the original count>=0 assertion 304/304 19/19 unchanged 9c154cab...; +0x4; 114 differing bytes; first relocation mismatch 10 15/15 exact; data 14/14 reverted; alias is fully coalesced
E09 Spell scaled counts as count*2, count*4, count*8 304/304 19/19 decoder unchanged 9c154cab...; +0x4; 114 differing bytes; first relocation mismatch 10 only 14/15 siblings exact: _data_decode_int64 moved despite unchanged decoder bytes; data 14/14 reverted; whole-TU compiler-state regression
E10 Swap structures/memory_size declarations in exact predecessor _data_decode_structures 304/304 19/19 unchanged 9c154cab...; +0x4; 114 differing bytes; first relocation mismatch 10 15/15 exact; data 14/14 reverted; predecessor order is code-neutral and does not move decoder allocation
E11 Split the exact predecessor’s structures = NULL initializer into a statement 304/304 19/19 unchanged 9c154cab...; +0x4; 114 differing bytes; first relocation mismatch 10 15/15 exact; data 14/14 reverted; no downstream allocation effect
E12 Initialize memory_size = count, use memory_size <<= 1/2/3, and let case 1 inherit the initializer 304/288 19/19 4760017a8585b2dc55a99aa83c2869c064be8c9c91bcd19719784a94e6820d16; +0x8; 229 differing bytes; first relocation mismatch 0 14/15 siblings exact (_data_decode_int64 moved); data 14/14 reverted; 16 bytes short and violates sibling gate
E13 Top-level const on the count definition parameter 304/304 19/19 unchanged 9c154cab...; +0x4; 114 differing bytes; first relocation mismatch 10 15/15 exact; data 14/14 reverted; ignored by codegen and VC7 warns C4028 against the header prototype
E14 Declare short element_count = count before both existing locals and use the alias after retaining the original count>=0 assertion 304/304 19/19 unchanged 9c154cab...; +0x4; 114 differing bytes; first relocation mismatch 10 15/15 exact; data 14/14 reverted; the alias is fully coalesced even when it leads the declaration list
E15 Combined donor-inspired shape: declare memory_size before memory, then split memory = NULL into a statement 304/304 19/19 unchanged 9c154cab...; +0x4; 114 differing bytes; first relocation mismatch 10 15/15 exact; data 14/14 reverted; the combined declaration/initializer spelling is also code-neutral
E16 Redundant memory_size = count initializer while retaining every switch assignment 304/304 19/19 unchanged 9c154cab...; +0x4; 114 differing bytes; first relocation mismatch 10 15/15 exact; data 14/14 reverted; dead initializer is eliminated before allocation
E17 Introduce decode_state = state before the existing locals and consistently use the alias 304/304 19/19 decoder code hash unchanged 9c154cab...; +0x4; 114 differing bytes; first relocation mismatch 1 only 12/15 siblings exact: _data_decode_byte, _data_decode_short, and _data_decode_long also moved; data 14/14 reverted; alias coalesces in the residual and causes a whole-TU compiler-state regression
E18 Remove the invented memory_size = count repair from the fatal default arm, matching the HCEA PPC invalid-path load; its exact-unique PDB record independently shows one long local 304/304 19/19 target/base eb39377415e6...; no divergence 15/15 siblings exact; data 14/14 accepted; closes the final function

The prior data-encoding-foundation, data-encoding-leaves, data-encoding-encode, data-encoding-closeout, data-encoding-closeout-current, data-encoding-final, and data-decode-memory-closeout-2 branches/worktrees were inspected. The untracked final-lane research scripts pointed to the analogous October function by its count>=0 assertion and expected address 0x11A430. A read-only Ghidra pass over the preserved October cachebeta.xbe confirmed the address and recovered the complete instruction topology. The October function uses the same ESI state, EDI zero/result, and EBX/BX size/count allocation as the January target, with the same relative switch blocks: case 1 at +0x82, the <<1, <<2, and <<3 cases at +0x87, +0x8E, and +0x96, default at +0x9E, and the post-call count reload at +0xB8. This rules out a January-only compiler accident and is strong evidence for a stable original source/lifetime shape.

A raw target-object census for the distinctive prologue 55 8B EC 53 56 8B 75 08 57 33 FF found five January functions. Four are unimplemented in this integration; the only reconstructed legal-C donor is _rasterizer_triangle_buffer_new on codex/hardware-geometry-leaves-14. Its current XDK 3911 candidate emits that exact ESI/EDI prologue from ordinary local declarations and an explicit zero assignment, proving the allocator topology is expressible in legal C. However, the donor is not strict exact as a whole (352/352 bytes, 24/24 relocations, target hash e90e066bbde0d04c87a43f665fcd7a131ff0e0d1c7a5354b82062ae5b822396c, candidate hash b0fdebbf1336f8336a37bb436ad10ea3ebbf9f105715dec74c87d16c283b457e), and it does not contain the decoder's partial-BX switch. It therefore does not meet reopen criterion 2 or justify copying its unrelated lifetime controls.

Do-not-repeat list

  • Do not retry H01/H02 or spelling-only versions that compile to their hashes.
  • Do not perturb any of the 15 exact siblings to influence this function.
  • Do not use inline assembly, volatile forcing, undefined behavior, aliasing violations, object-byte patches, compiler pragmas, or flag changes.
  • Do not accept equal size, equal relocation count, ordinary objdiff percentage, or semantic plausibility as exactness.
  • Do not chase non-owned candidate-only assertion COMDATs as target data.

Historical residual classification (superseded)

Measured facts show matching padded size, relocation count, operations, assertions, calls, jump-table cardinality, and behavior, but different callee-saved register ownership, partial-width count handling, scaled-count instruction selection, and a four-byte default-block drift. Direct declaration orders, split/redundant initializers, register hints, local aliases, expression spellings, and exact-predecessor perturbations either collapse to the same bytes or regress code/strict siblings. The independent October binary confirms that the target allocation was stable, while the only legal-C prologue donor is neither strict exact nor a partial-BX analogue. This residual is therefore parked as a private register-allocation and source-lifetime fixed point (class C), not accepted as matching.

Historical reopen criteria (satisfied)

Reopen only with one of:

  1. January/October source or PDB local-variable provenance showing declaration order, explicit register hints, or an intermediate count/memory-size local;
  2. a same-XDK strict-exact donor with the target ESI/EDI/EBX allocation and partial-BX switch shape;
  3. a legal-C, defined-behavior source control demonstrated to move the first divergence without regressing siblings.

Historical disposition (superseded)

Parked at 15/16 strict-exact functions and 14/14 strict-exact owned non-code sections. The natural integrated C remains the least invasive, regression-free candidate. The TU is not eligible for Matching while _data_decode_memory remains non-exact.

2026-08-11 provenance breakthrough and closure

The HCEA RELEASE_CACHE PDB provides an exact-unique cross-build mapping for data_decode_memory. It records the cross-build parameter shape (data_encoding_state *state, short count, long code) and exactly one local, long size; January disassembly independently proves the argument widths. The actual HCEA PPC body loads that uninitialized stack local on the invalid selector path, and a later HCEA reconstruction documents the same defect. All known January callers use only -8, -4, -2, or 1. January remains the byte oracle, but the combined provenance made the omission evidence-backed rather than speculative.

The reconstruction reference is surreptitiousresearch/halocea@0dadebb5671751b8730110f90bf6c10df5f6312c, src/data_decode_memory.c; it is corroboration only, not the byte oracle.

Removing only the fallback memory_size = count assignment after the fatal assertion and system_exit(-1) reproduces January exactly:

  • _data_decode_memory: 304/304 padded bytes, 19/19 relocations, normalized SHA-256 eb39377415e6c3e07f763e8f0f42f6ecafaf61acc0fab30fbc06062b9dc465d8;
  • all 15 sibling functions remain strict-exact, giving 16/16 functions and 3,296/3,296 padded function bytes;
  • all 14 January-owned .rdata sections remain strict-exact, totaling 459 bytes with zero relocations.

This is admitted under the original-bug policy, not as a general undefined- behavior codegen technique. January's otherwise anomalous post-fatal reload, the instruction-identical October topology, the exact-unique HCEA PDB local record, and the HCEA PPC invalid-path load corroborate the omission. The production comment identifies the defect. A corrected build should initialize memory_size before leaving the invalid-code case; the former defined fallback is measured above as H00 and differs in 114 normalized byte positions despite matching size and relocation count.

Independent bounded safety variants confirm that exactness is specific to the recovered omission: memory_size = count restores candidate hash 9c154cab... with 114 differing bytes; a zero initializer produces a 288-byte function; an explicit default zero produces 304 bytes with 94 differing positions; and an immediate return NULL produces 304 bytes with 166 differences. These are documented with the complete source-shape matrix in research/data_decode_memory_codegen/REPORT.md.

Final admission gates

  • XDK/Ninja translation-unit rebuild: exit 0.
  • Consolidated halobetacache_build: exit 0.
  • Hardened semantic audit: all 16 functions are in the accepted ledger; _data_decode_memory contributes 295 meaningful bytes from its strict 304-byte section and all 19 relocations.
  • Admission audit: no candidate, contradiction, or revocation for source/memory/data_encoding after the Matching label.
  • Post-admission ninja progress: Halo 263/468 objects, 3,133/7,574 functions, 366,428/1,770,166 code bytes, and 45.65% data.
  • Tooling regression suite: 149/149 unittest tests pass.

2026-08-13 independent admission revalidation

The completed object was independently transplanted after the separately verified data_packets.obj admission, onto campaign base 5b2fbf0ff8782dc0899038e330125f1accfa1508. The current configured XDK 3911 compiler reports VC7 13.00.9254.1 and uses unchanged /O2 /Oy- /DDEBUG /Dxbox flags.

  • All sixteen functions are strict-exact: 3,296/3,296 padded code bytes. The final _data_decode_memory section is 304/304 bytes with 19/19 exact relocation records and normalized SHA-256 eb39377415e6c3e07f763e8f0f42f6ecafaf61acc0fab30fbc06062b9dc465d8.
  • All fourteen target-owned .rdata COMDATs are semantically and ownership-exact: 459/459 bytes and zero relocations. The three candidate-only assertion COMDATs are unchanged from the clean campaign baseline and remain known select-any ownership artifacts.
  • The clean pre-change regression manifest covered data_encoding, data_packets, and data_packet_groups. The final comparison reports zero changed_nonexact functions in every unit. Its only non-green records are the reviewed Matching/semantic-ledger changes, the four newly exact functions across the two admitted objects, and compiler-local $L... movement inside those newly exact sections; external symbols and owned data are unchanged.
  • The consolidated build, semantic report, and progress gate pass with zero unit errors. The current tooling suite passes 173/173 tests.
  • The closing edit introduces no assembly, force-inlining, alignment directive, magic offset, raw tag/object access, compiler flag, or comparison exception. The uninitialized memory_size path is the original shipped defect proven above; the production BUG (original) comment names the safe repair explicitly.

2026-08-30 source-credibility revalidation

The later credibility audit removed the encoder's volatile parameter type-pun, volatile array-pointer qualifier, register hint, redundant count alias, and invented fatal-edge fallback assignment. Ordinary direct C remains strict exact across all 16 functions and all owned data. The evidence, bounded experiment matrix, hashes, and validation are recorded in data_encoding_obj_jonas_credibility_cleanup_20260830.md.