23 KiB
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 2002cachebeta.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 byconfigure.py - Starting revision:
codex/campaign-integrationat8cf2d5444 - Comparator:
tools/coff_compare.pyat8cf2d5444, 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.
- Target begins
- The target owns
statein ESI, the returnedmemoryin EDI, andmemory_size/the partial-widthcountpath in EBX/BX. - The baseline owns
statein EBX, returnedmemoryin ESI, andmemory_sizein 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
+0xA6versus 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
8cf2d5444as 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_memoryimproves 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:
- January/October source or PDB local-variable provenance showing declaration order, explicit register hints, or an intermediate count/memory-size local;
- a same-XDK strict-exact donor with the target ESI/EDI/EBX allocation and partial-BX switch shape;
- 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-256eb39377415e6c3e07f763e8f0f42f6ecafaf61acc0fab30fbc06062b9dc465d8;- all 15 sibling functions remain strict-exact, giving 16/16 functions and 3,296/3,296 padded function bytes;
- all 14 January-owned
.rdatasections 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_memorycontributes 295 meaningful bytes from its strict 304-byte section and all 19 relocations. - Admission audit: no candidate, contradiction, or revocation for
source/memory/data_encodingafter 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
unittesttests 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_memorysection is 304/304 bytes with 19/19 exact relocation records and normalized SHA-256eb39377415e6c3e07f763e8f0f42f6ecafaf61acc0fab30fbc06062b9dc465d8. - All fourteen target-owned
.rdataCOMDATs 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, anddata_packet_groups. The final comparison reports zerochanged_nonexactfunctions 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_sizepath is the original shipped defect proven above; the productionBUG (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.