12 KiB
players.obj strict-closeout strategy log
Baseline
- Lane:
codex/players-closeout-rootatcaa820ccd(0892e393b,86a73bc55,caa820ccd). - Toolchain and flags: repository XDK 3911 CL, unchanged
/O2 /Oy- /DDEBUG /Dxbox. - Strict comparator:
tools/coff_compare.section_infos_equalagainstbuild/split/source/game/players.obj. - Current result: 106/110 sections exact and 16,924/21,164 padded section
bytes exact.
- Functions: 66/70, 11,664/15,904 padded bytes.
- Data: 40/40, 5,260/5,260 padded bytes.
config/config.jsonremainsNonMatching.
| Residual | Target size/relocs | Target normalized SHA-256 | Current normalized SHA-256 | First meaningful divergence |
|---|---|---|---|---|
_code_000a9ff0 |
0x170 / 22 |
9e3ab79a5087c8d11b97f52c30afc3f596faa4aa6122480dc9f16d247be8ca9f |
d9ca587214fd10308b7a16a797d8a154102f2095fbf28324cb9e3e2da8d8483e |
+0x2E: January forms &iterator before homing the activation result; current CL homes EAX first. |
_code_000aa9e0 |
0x510 / 61 |
8bb48b429649a3afcd41cf238ca9b1d5dba0ff61e15f2205f72512918cad7c43 |
740c065b9b622d07827e6ae83ac2d79aeb3813a54bbf7b8a43c7c0c8f0e8b36f |
+0x5: January uses a 0x7C frame; current CL uses 0x78, then chooses a different local/register topology. |
_players_update_before_game |
0x6E0 / 101 |
8c92baaaebf7177d7bc54239c21b0923703a50f3ede19dca3a81a457f2860947 |
51c2c7b42d12188a024fac2a2c5d030c194d6a91be0b4e3d57bdd5efe1dd1c8c |
+0x62F: four register-encoding bytes; January uses EDX for the unit index and EAX for the next iterator address. |
_players_update_after_game |
0x330 / 52 |
af64f40efdb1be0cd2754ada85b34acecdd4480a39c73b5a9ef2938c2c1d315b |
6c0d80f1ab3c18aa8447682e0e9e7365486c42df02072c1a24c729a54306d7b7 |
+0x74 branch displacement; the causal difference begins at +0x18C, where January assigns EDI to the BSP loop index and EBX to the element pointer, opposite current CL. |
Bounded source experiments
All experiments retained the ABI and flags and were rebuilt as the single
build/base/source/game/players.obj target. Unless marked accepted, the source
was reverted after measurement.
| Function | Evidence-based source shape | Strict outcome | Status |
|---|---|---|---|
_code_000a9ff0 |
Fold activation-result assignment into data_iterator_new's second argument with a comma expression. |
0x170 / 22; canonicalized to current hash d9ca5872...; same +0x2E scheduling window. |
Reverted |
_code_000aa9e0 |
Split the unit-index/biped aggregate into independent typed locals. | 0x510 / 61; hash 0d30bbd7f96442016f38bdfc9c200999b37e61291f2c7d401786153f876f2b3b; frame remained 0x78, unit and biped homes moved to -0x10/-0x14, not January's -0x14/-0x10. |
Reverted |
_code_000aa9e0 |
Extend the placement aggregate with the source-root pointer to model January's three adjacent homes. | 0x510 / 61; hash e79a85eafa5ab7123747724dc7b241a69307a6631c7a103edc09e4532161389a; recovered the 0x7C frame but placed the aggregate at -0x30, first differing home at +0x24. |
Reverted |
_code_000aa9e0 |
Wrap only the source-root pointer in a one-field struct, then in a one-element typed array. | Both scalarized to current 0x510 / 61 hash 740c065b...; no stack home or code change. |
Reverted |
_code_000aa9e0 |
Move the three-field placement aggregate after the matrix/vector locals. | Canonicalized to the same 0x510 / 61 hash e79a85e...; declaration position did not move the -0x30 aggregate home. |
Reverted |
_code_000aa9e0 |
Group the source-root and later source-biped pointers, then take a non-volatile typed address of the mutable source-unit parameter. | Both scalarized to current 0x510 / 61 hash 740c065b...; neither forced January's -0xC home. |
Reverted |
_code_000aa9e0 |
Materialize the initial biped_get result through a typed temporary before copying it to the placement state. |
Copy-before-result canonicalized to 740c065b...; result-before-copy moved xor bl,bl ahead of the call and produced hash 11d6457990632220105232975d079705b646a90e8f14c0bcb8369377236a0fa8. |
Reverted |
_players_update_before_game |
Move _ReadWriteBarrier() before the local unit-index assignment. |
0x6E0 / 101; hash af6add6c8b40f7ae93e5853584e2f075ce3a52c88707cddefbe94c5a6543cbf4; regressed from four to ten normalized bytes, first at +0x62B. |
Reverted |
_players_update_before_game |
Make the local unit index const. |
Canonicalized to current 0x6E0 / 101 hash 51c2c7b4...; same four bytes. |
Reverted |
_players_update_after_game |
Move the loop index and element-pointer declarations across inner/function scopes and reorder declarations. | Every form canonicalized to current 0x330 / 52 hash 6c0d80f1...; same EBX/EDI mirror. |
Reverted |
_players_update_after_game |
Remove the barrier after global_scenario_get. |
0x330 / 52; hash 20ac0c082a00bbe619f3f3c868fbc6c6933177c5ba04d1ad46ae3613be37f18d; regressed to the base-copy/add scenario-block expression and 373 normalized bytes. |
Reverted |
_players_update_after_game |
Move that barrier after the scenario block-address assignment. | 0x330 / 52; hash 0f8682e9333c2a6c9cdf18fae3a4a77cc7d36868cd0badb9069bec177c635c2b; retained a non-target copy/add sequence beginning at +0x184. |
Reverted |
No source experiment improved a strict section in this closeout pass. The
production source is restored to caa820ccd.
Park decisions and next leverage
_code_000a9ff0is parked as methodology class D (scheduler/lifetime). Twenty-one of 22 relocation addresses are exact; onlyplayer_datamoves three bytes inside the+0x2E..+0x39scheduling window, and all following instructions reconverge. Reopen only with provenance for the activation result/iterator statement shape._players_update_before_gameis parked as class C (register fixed point). All 101 relocation identities and addresses are exact. The only differences are four ModRM/register bytes at the finalunit_controland next-iterator sequence. Reopen only from a caller/compiler forced-register anchor._players_update_after_gameis parked as class C/D. All 52 relocation identities agree; 33 addresses are exact and the remaining addresses form two uniform drift plateaus (+1for six, then-5for thirteen) after the EBX/EDI loop mirror. Reopen only with source provenance that changes the loop index/element live-range weights while retaining the required post-scenario barrier shape._code_000aa9e0is parked as an unresolved class A/C boundary, not claimed as a proven compiler-only tie. All 61 relocation identities and the0x510padded size agree, but only 20 relocation addresses are exact and the target's opening0x7Cframe/local homes remain unrecovered. January homesplayer,player_unit_index,biped, andsource_root_objectat-0x8,-0x14,-0x10, and-0xC; current CL uses a0x78frame and keeps the source-root pointer in ESI. Reopen only with new donor/PDB/local-variable provenance or a legal-C source form that recovers all four homes; more declaration/aggregate permutations are not evidence-based.- A strict completion still requires all four current hashes to equal their target hashes plus a fresh 110-section sweep. Equal size/relocation count is not match credit.
Do not repeat
_code_000a9ff0: explicit iterator pointer, result temporary, result/iterator aggregate, comma-expression assignment, or compiler barrier around the activation call. These retain the same store/load/LEA schedule or regress it._players_update_before_game: directplayer->unit_index, barrier removal or relocation,const/register, pointer aliases, and declaration-order changes. The four-byte baseline is best._players_update_after_game: barrier removal/relocation, declaration-scope permutations,registerhints, and equivalentfordeclaration placement. Keep the barrier immediately afterglobal_scenario_get._code_000aa9e0: independent unit/biped locals, a three-field placement aggregate in either declaration region, one-/two-field source-pointer wrappers, a non-volatile source-parameter alias, an initial biped temporary, declaration reordering, and volatile pointer/parameter access. Volatile forms are also barred by current methodology.- Do not change optimization flags, add inline assembly/object patches, accept
fuzzy objdiff percentages, or mark the TU
Matchingbefore the hardened 110-section gate passes.
2026-07-29 isolated follow-up
The collision-safe follow-up is preserved on codex/players-final-four as
source checkpoint 576d93f33 and full ledger commit 8dad10254. The source
checkpoint is deliberately not integrated here because players.obj
remains incomplete; these measurements prevent later lanes from repeating the
same work.
- P01: rewriting the final iterator loop from
whileto explicitforproduced no bytes and was reverted. - P02: a Players-only
longdeclaration forobjects_get_activating_cluster_indexmodeled January's measured cross-TU return-ABI bug and reduced_code_000a9ff0from 287 to 11 normalized differing bytes. The lane labels the preserved bug and documents the corrected-build fix. - P03: moving the activation-result declaration before the iterator had no effect and was reverted.
- P04: the HCEA-PDB-backed
player_teleport_internallocal topology retained0x510/61 and reduced_code_000aa9e0to 929 normalized differing bytes. - P05: restoring the scenario barrier, two BSP counters, and measured loop
topology retained
0x330/52 and reduced_players_update_after_gameto 222 normalized differing bytes. - P06/P07: the historical 877-byte teleport candidate was reproduced, but it
depended on an unproven
volatilepointer-store expression used only as a codegen lever. It was rejected under campaign policy; the clean PDB-backed P04 form was restored. - P08: recovered field/flag names and compile-time January layout assertions were byte-neutral across the whole TU.
Final isolated-lane gate: 106/110 sections, 66/70 functions, and 40/40 data sections exact. The four residuals retain equal padded size and relocation count but receive no exact credit:
| Function | Size / relocs | Candidate SHA-256 | Differing bytes |
|---|---|---|---|
_code_000a9ff0 |
0x170 / 22 |
d9ca587214fd10308b7a16a797d8a154102f2095fbf28324cb9e3e2da8d8483e |
11 |
_code_000aa9e0 |
0x510 / 61 |
d833e6d8f06cfdb556417d852c6a0717eecfdb2726f11a92d9241c15b363bbb0 |
929 |
_players_update_after_game |
0x330 / 52 |
6c0d80f1ab3c18aa8447682e0e9e7365486c42df02072c1a24c729a54306d7b7 |
222 |
_players_update_before_game |
0x6E0 / 101 |
51c2c7b42d12188a024fac2a2c5d030c194d6a91be0b4e3d57bdd5efe1dd1c8c |
4 |
P20 compiler-provenance and patch-level falsification
The January cachebeta.pdb module stream for
\halo\objects\halobetacache\players.obj contains a 60-byte
S_COMPILE2_ST record. Its front-end and back-end version triples are both
13.0.9254, followed by the producer string
Microsoft (R) Optimizing Compiler. This is target-authored evidence that the
TU was compiled with the same numbered VC7 build used by the campaign.
The unchanged retained source was then compiled once under the only two distinct local VC7 compiler binaries:
| Compiler | _code_000a9ff0 |
_code_000aa9e0 |
_players_update_before_game |
_players_update_after_game |
|---|---|---|---|---|
13.00.9254.1 |
d9ca5872... |
d833e6d8... |
51c2c7b4... |
6c0d80f1... |
13.00.9210 |
d9ca5872... |
d833e6d8... |
51c2c7b4... |
6c0d80f1... |
All four normalized candidate hashes were byte-identical across compiler binaries. The older 9210 compiler therefore supplies no code-generation control for this TU, while the target record materially weakens the hypothesis that an unidentified compiler build explains the residuals.
Disposition: no source retained and no exact credit. Do not repeat a local
compiler census or download nominally different 3911 kits without first
proving that their CL.Exe hash is new. The remaining reopen conditions are
authentic January/cross-build statement topology or a focused legal-C control
that changes the measured register/lifetime window without moving any exact
relocation.