11 KiB
widgets.obj exact-match log
Target and standard
- January 14, 2002 Xbox target, XDK 3911 CL 13.00.9254.1.
- Flags:
/O2 /Oy- /DDEBUG /Dxbox. - Admission requires strict function bytes, relocation identity, target-owned data, symbol ownership, whole-project build, and regression gates.
- HCEA/PDB material is used only as a semantic and naming hypothesis. January disassembly and COFF metadata are authoritative.
Recovered ownership and layouts
- Eleven functions, 1,632 padded code bytes.
- Seven target-owned string COMDATs, 239 bytes total.
- One external writable table,
_data_0030b2b0, exactly 200 bytes and 37 DIR32 relocations. - No target-owned BSS.
struct widget_type_definitionis 0x28 bytes: group tag, lighting byte, padding, then eight callback pointers.struct widget_datumis 0x0C bytes: datum header, type, type datum index, and next link.struct object_definition_widgetis 0x20 bytes and begins with a tag reference.- The five descriptor records are flag, antenna, glow, light volume, and lightning. Glow, light volume, and lightning have null update callbacks.
Proven source architecture
_code_001257a0is the privatewidget_type_definition_get(short)helper. It follows the exactactor_types.cpattern: a source-static helper retained out of line with a private register ABI and inlined into callers.- Its exact assertion is from lowercase
c:\halo\source\objects\widgets\widget_types.h, line 150. - Direct widgets assertions use uppercase
c:\halo\SOURCE\objects\widgets\widgets.cat lines 46, 55, 190, and 241. - Typed
object_get,object_definition_get,TAG_BLOCK_GET_ELEMENT, andwidget_getaccessors preserve Berth's type-access rules.
Experiment 1: faithful January/HCEA topology
The first implementation reconstructed all functions and the table as readable C. Strict results:
| Function | Target/base size | Relocs | Result |
|---|---|---|---|
code_001257a0 |
64/64 | 5/5 | exact |
widgets_initialize |
176/176 | 16/16 | exact |
widgets_initialize_for_new_map |
96/96 | 7/7 | exact |
widgets_dispose_from_old_map |
96/96 | 7/7 | exact |
widgets_dispose |
80/80 | 5/5 | exact |
widgets_delete |
256/256 | 14/14 | exact |
widgets_update |
96/96 | 5/5 | exact |
tag_group_to_widget_type |
48/48 | 1/1 | non-exact return-local shape |
widgets_new |
384/368 | 15/15 | non-exact loop width/branch shape |
widgets_need_lighting |
128/128 | 7/7 | non-exact result-live-range shape |
widgets_render |
208/224 | 13/15 | duplicate widget_get in loop update |
Accepted lessons: the helper architecture, assertion spelling, lifecycle loops, delete topology, update loop, aggregate table, and callback prototypes are all proven exact.
Rejected/changed shapes:
- Direct early returns in
tag_group_to_widget_typedid not retain the target's separateNONEresult register. - A
longouter widget-reference index omitted the target'smovsxshort-loop behavior. - A
forupdate expression that calledwidget_getrepeated the datum lookup and added two forbidden relocations inwidgets_render. - Failure-first source ordering in
widgets_newinverted the target branch; success-first source order is the next measured shape.
Experiment 2: result locals and loop topology
- A separate
result = NONElocal closedtag_group_to_widget_typeexactly. - A separate boolean result local closed
widgets_need_lightingexactly. - Reusing the already-loaded widget datum for the linked-list advance removed the second
datum_getand closedwidgets_renderexactly. - A short outer counter and success-first callback branch brought
widgets_newto the exact 384-byte size and 15-relocation set. Its residual was traced to aforloop initializing the counter before the empty-block test. January testscountfirst, then enters a short-indexdo/while; that topology is measured next.
Experiment 3: shrink the widget-block pointer lifetime
- Replacing the
forloop with an explicit nonempty guard and short-indexdo/whileretained the exact 384-byte size and 15-relocation identity set, but the namedwidget_referencespointer remained live in EDI. - January instead retains the object-definition result and repeatedly derives its
widgetsblock. This shortens the derived pointer lifetime, permits VC7 to spill it at[ebp-0x14], and shrink-wraps EDI to the nonempty path. - The HCEA topology independently corroborates an object-definition local, direct block expressions, and an explicitly narrowed short increment. These are hypotheses only until the January strict comparator accepts them.
Experiment 4: initialize the index before the nonempty guard
- After removing the named block pointer, bytes from the loop body at
+0x50through the return became instruction-identical. The sole residual was the guard preheader at+0x34..+0x4f. - January stores the zero index before the empty-block branch. Moving only that initialization before the guard removed the candidate's entry jump and made
_widgets_newexact: 384/384 bytes, 15/15 relocation identities, normalized SHA-2560ae3ea3a2443....
Final strict result
- All 11 functions are exact: 1,632/1,632 padded code bytes.
_data_0030b2b0is exact: 200/200 bytes, 37/37 relocations, normalized SHA-256106dfc2b8ac744be4212214fb0dd59f4b7d371210130d3b4769837d04cb53c66.- All seven target-owned string COMDATs are exact: 239/239 bytes and zero relocations.
- No target-owned BSS exists.
- The table and string owner symbols retain external linkage. The source-static private helper follows the already-proven
actor_types.cpattern and produces exact function bytes plus relocation identity. - The full 467-object
halobetacache_buildcompleted successfully after admission. - Semantic reporting accepted 3,160 exact functions with zero unit errors; project progress reported
widgets.objas the 268th matching Halo object. - All 149 tooling unit tests pass,
config.jsonparses successfully, the admission audit reports no new candidate or revocation involving this object, andgit diff --checkis clean. - A final house-rule audit confirmed multiline parameters, typed accessors, explicit final returns, one-return control flow, and no forbidden assembly, volatile, undefined behavior, forced bytes, or alignment directives.
Reopen discipline
Every subsequent source-shape change is measured against all eleven functions and the data table. An exact sibling regression is rejected immediately. No asm, volatile, byte forcing, undefined behavior, compiler-flag changes, or speculative casts are permitted.
Independent current-campaign admission audit (2026-08-13)
This result was transplanted onto the then-current campaign tip a489a651
and treated as untrusted. The lane rebuilt the object from source using XDK
3911 CL.Exe 13.00.9254.1 with the unchanged /O2 /Oy- /DDEBUG /Dxbox
flags, enumerated every external target-owned COFF section, and compared each
with tools/coff_compare.py::section_infos_equal.
All 19/19 owned sections pass strictly: eleven functions, seven string COMDATs, and the writable descriptor table. Function evidence from the fresh build is:
| function | padded bytes | relocations | normalized SHA-256 |
|---|---|---|---|
_tag_group_to_widget_type |
48 | 1 | c089e765e2a986e1d8ac5dfae2d280e1cd04dcec2e07dde023ddc022f1be0f07 |
_code_001257a0 |
64 | 5 | afe03eb995375857cdb5f1b85ba80cdc3b75af37179de4862878a79d3b4e58a7 |
_widgets_initialize |
176 | 16 | affe7b6f639b587c4de2df2e146f54462d999bd7966f76662aebeab9a8b03964 |
_widgets_initialize_for_new_map |
96 | 7 | e69d20511ff0ea54b864a578b9d5c7b04914f9dbdc35ad5290696b4fe5aa981b |
_widgets_dispose_from_old_map |
96 | 7 | 31193c6b1563f03260791fdf314871227affe7b3cf5d6f28dc789615dea02b06 |
_widgets_dispose |
80 | 5 | 3af29e1353d3ccff3397275468220fe952200cd230b114f9dec646abcbee7f29 |
_widgets_new |
384 | 15 | 0ae3ea3a2443cfee8d983a83b0072fc3ff258192e9ed026f5ef527370ed1715e |
_widgets_delete |
256 | 14 | 9153a10bbabd49f69b75dd1851b16af843a624f9bd0603192b25e9944a9a831e |
_widgets_need_lighting |
128 | 7 | 22378cfaec31c2370ca7ccddc4d8e4775c0d172b29b9d48dc45a50ceb91e32b4 |
_widgets_render |
208 | 13 | 4d10821c50de57264e12b10b750a9ceff104eb4c98587db2db5c93523b7a06f3 |
_widgets_update |
96 | 5 | e6ac57dbe6e8956068013d021080f4a5e52a900209bd03244ee43cabf237331a |
The seven strings total 239 bytes and have no relocations. The externally
owned _data_0030b2b0 is 200 bytes with 37 relocations and normalized SHA-256
106dfc2b8ac744be4212214fb0dd59f4b7d371210130d3b4769837d04cb53c66.
There is no target-owned BSS.
Shared-header blast radius
The reconstruction adds layouts and prototypes to eight shared headers. A
transitive include-graph walk found 78 affected C translation units, much
more than the obvious widget family. To make the regression test independent
of the old report, the lane created and fully built a clean pre-change worktree
at a489a651, then fully built the candidate worktree. For every affected
object it compared every target-owned section that was strict-exact before the
change against the January target again after the change, and separately
compared owner storage/type/value metadata.
The result was 1,710 prior-exact owned sections retained, zero strict regressions, and zero symbol-metadata drifts. The only gains were the 19 widgets sections listed above. Raw whole-object hashes were deliberately not used: the absolute worktree paths stored in debug information make raw COFF files differ without changing target-owned program sections.
Plainly: the headers provide names and layouts to the compiler, but do not alter any previously accepted machine code or data. The widgets object itself now reproduces every instruction, callback-table pointer, string, relocation destination/addend, size, and owner in the January object.
Current house/Berth and original-bug audit
- parameters and no-argument
voidlists use one item per line; - every void function ends in an explicit
return;, and each function has one return where the measured control flow permits it; - object access uses the established typed
object_getmacro, widget access useswidget_get, tag-block access usesTAG_BLOCK_GET_ELEMENT, and object definition access usesobject_definition_get; there are no raw repeated casts aroundobject_getortag_get; - structures and named constants replace raw offsets and unexplained values;
- no assembly,
volatile,__forceinline, undefined behavior, byte forcing, compiler-flag change, alignment pragma, or direct-offset field access is present; - the audit found no preserved original bug requiring a warning/fix comment. No behavior was silently corrected or modernized.
Final current-campaign gates
- full
ninja halobetacache_build: passed (466 build edges); ninja progress: exactly the expected one-object gain over the clean pre-change baseline, from 257 to 258/468 Halo objects; 3203/7574 functions and 360534/1770166 code bytes credited, with no revocation;tools.audit_semantic_matches: 11/11 widgets functions accepted from both ordinary objdiff and independentsemantic-coffevidence, zero unit errors;- transitive-header audit: 78 translation units, 1,710 previously exact owned sections retained, zero strict regressions, zero ownership drifts;
python -m unittest discover -s tools -p 'test_*.py' -v: 173/173 passed;git diff --checkand JSON parsing: clean.