Merge verified source, data and owner corrections from 4e84c212. Resolve overlapping HS/path symbols against canonical, retain the dynavobgeom ownership rejection, document Layer 2/P7 source-shape decisions, and preserve held research. Verified 14 exact functions, 17 new Halo objects, zero regressions under objdiff 3.3.1.
- docs/object_matching_logs/claude_fifty_objects_20260925_owner_queue.md: 14
held items, each apply-ready on cdc8ebd3 with measured unlocks (18 objects on
an all-yes; models and hs_scenario_definitions since superseded by canonical).
- Ledger final handoff: commit order, changed paths, target vs result (18 of
50), tallies, house-rule review, held items, process incidents, and the
trial merge against canonical dbcea3d6 (5 conflicting files, resolution
guidance, and the dynavobgeom / SDK-table policy conflict with its census).
- research/fifty_objects_20260925: waves 4-5 worker/reviewer ledgers, owner
queue packets with APPLY_ORDER, and the integrator kit.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Zero strict-exact functions and zero credited bytes; no production source change.
Documents the /Od-, HCEX- and law-attested source facts measured for
_decal_clip_to_surface (frame closed, one two-load swap left),
_decal_new_from_collision and _physics_update_old, the rejected probes,
and precise reopen criteria. Best candidates stay local in scratch/ledger.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Ledger for the revoked-data object closeout:
- 10 whole objects verified complete (459/833 under the canonical
objdiff 3.3.1 scorer, from 449/833);
- +9,910 data bytes, zero code bytes;
- three objects still revoked, with evidence and reopen criteria.
It also records three owner notes: canonical's stale objdiff 3.3.1
binary despite the v3.6.0 pin, the grouped-entry hazard under 3.6.0,
and the SDK-table precedent question.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Documentation only: no source, config, symbol or park change; 0 exact
functions gained or lost, 0 meaningful / 0 padded code bytes, 0 objects
admitted. path_smoothing stays blocked on actor_combat's NODUP
_cross_product2d.
The residual is decoded to one source fact.
- The /Od build initialises horizontal_aim_vector with an aggregate
copy: integer moves at 0x44ecc7, while float field stores in the same
function use movss. Spelling that view copy restores January's
register choices and slot ranking.
- The last 4 frame bytes come from C2 keeping an address-taken local
live until the end of its declaration scope. January's fild temp
overlays horizontal_aim_vector.j, so January declared it in a block
that closes before the rotation.
- A goto diagnostic proves the function then goes strict exact, but
that structure contradicts the /Od declaration order and would be
invented control flow. It is not landed.
The owner packet, reopen criterion and every measured shape are in
docs/object_matching_logs/claude_actor_aim_grenade_20260924.md.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Wave 2 of the limited object-closure lane. New code: 1 function,
1,232 padded / 1,225 meaningful bytes; action_vehicle closes at 17/17.
find_destination now uses the genuine real_math.h helpers the /Od build
(halo_cache_symbols.exe 0x4422a0) calls: distance3d, MAX, a pointer-
selected target copy, vector_from_points2d x4, dot_product2d,
point_from_line2d x2, magnitude_squared2d/3d, perpendicular2d,
negate_vector2d, normalize2d, vector_from_points3d, square_root,
point_from_line3d x3, scale_vector3d, and a single success flag. Local
names come from the /Od RTC descriptor. The statement list is Lane B's
diag_inline.c donor.
- Drop the REAL_MATH_EXTERNAL_POINT_FROM_LINE3D guard for this TU.
January's action_vehicle holds an UNDEF reference to
_point_from_line3d, so this is within owner ruling 1. The emitted
COMDAT is section-identical to January's action_charge copy.
- _scale_vector3d is a new all-inlined COMDAT (ruling 5). Its caller is
strict exact and the section is identical to January's copy.
- Drop the hand-written NODUP point_from_line2d and its rename. The
header inline now supplies the exact, January-owned _point_from_line2d,
and no object on the board defines it NODUP.
- 18 view casts, admitted under ruling 6. Each is attested at its own
/Od call site (quoted in the ledger). The strip test is byte-inert:
with all 18 removed the function is still EXACT and section-identical.
Verification: full ninja; stable diff gained 1 / 1,232 bytes,
regressions 0; parks 103/0/0; admission audit 39 candidates,
0 contradicted, 0 revoked; object audit PASS; selected-provider link
PASS (both orders, 21 surplus symbols); pytest 1154 passed;
halobetacache linked files 335 -> 336. Ledger:
docs/object_matching_logs/claude_object_closure_20260924.md.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Structural lane batch 6: +1,632 padded / +1,590 meaningful bytes strict
exact (4 functions), zero stable-verdict regressions across the full
board (the header consumer sweep).
- rasterizer_geometry.h/.c: uncompress_int32_to_real_vector3d returns
real_vector3d by value. The debug build shows the struct-return copy
at all 16 call sites, and HCEX lists a single parameter. Callers in
rasterizer.c, rasterizer_lights.c and rasterizer_xbox_lights.c assign
the result directly and drop their scratch buffers. Exact:
_compress_real_vector3d_to_int32 and _clamp. The parked
_rasterizer_sun_glow_draw is re-measured (same size, fuzzy
95.815 -> 95.817).
- game/players.h: declare players_debug_render(void), a public players.c
function that render_debug.c called undeclared (C4013). Disclosure: the
by-value prototype drops one declared name, which alone flips
_rasterizer_frame_statistics_draw's field-load order. This genuine
missing prototype restores that TU's name count. Both edits are
independently evidenced and landed together; the full build shows no
regression.
- weapons.c: _weapon_magazine_finish_reload reads magazine->rounds_loaded
(/Od 0x6a4590).
- rasterizer_xbox_hardware_geometry.c: _rasterizer_triangle_buffer_new
follows the debug build (0x7eaca0), including the index-buffer Unlock
with its HRESULT check. This removes the _ReadWriteBarrier/pragma/goto
steering.
- parked.json: unpark the three newly exact parked functions.
Gate: ninja PASS, parks 109/0/0, admission 0 contradicted/0 revoked,
provider link PASS, casts and fake scan unchanged, pytest 1152 passed /
5 skipped / 26 subtests.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Structural lane batch 5: zero-credit fuzzy improvement to
_ai_debug_render_actor (24,976 B, still residual); zero regressions.
- Fixes a real defect: the headspace vision cone used the vertical sine
and cosine arrays swapped (January computes i/j from the cosine and k
from the sine).
- Buffer types and scopes follow the debug build's RTC records and
January's slots: textbuffer[1024], tempbuf[80], shared ring/height
loop indices, and one block-scoped offset_point in the paths block.
- Exact-equal instructions rise from 6,181 to 6,472 of 6,662. Frame,
slot set and relocation multiset now all match January. What remains
is x87 operand staging and one tail merge.
Gate: ninja PASS, stable diff 0 gained / 0 regressions, parks 112/0/0,
pytest 1152 passed / 5 skipped / 26 subtests.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Structural lane batch 4: config only, +2,272 padded bytes strict exact
(_render_debug_profile), no source change, zero regressions. The scorer
already credited the row, so objdiff progress is unchanged.
_render_debug_profile reads values[index-1].enabled and .frame_value.
January addresses them 3 and 8 bytes before _profile_graph_values, and
csplit named the preceding _profile_graph_value_count. Retarget
relocations 847565/847576 to _profile_graph_values with addends -3/-8.
Gate: ninja PASS, parks 112/0/0, pytest 1152 passed / 5 skipped / 26
subtests.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Structural lane batch 3: +4,128 padded / +4,101 meaningful bytes strict
exact (3 functions), zero stable-verdict regressions.
- rasterizer_xbox_active_camouflage.c: _rasterizer_active_camouflage_draw.
The debug build (0x7cd9c0) writes each normal/hyper-stealth blend as one
(1-p)*base + p*hyper expression. The texture-animation vertex constants
are a block-scoped aggregate initializer, so both constant arrays share
a slot as in January.
- render_particles.c: _render_particles. The draw pass indexes
group_particle_counts[group_index] with a short loop, and the inner loop
is while (particle_count-- > 0), advancing the particle at the body end
and before the delete-path continue (/Od 0x84f800).
- rasterizer_xbox_shadows.c: __rasterizer_environment_shadow_begin. The
debug build's boolean success = TRUE is returned once, and the
translation terms use dot_product3d (/Od 0x80d870; HCEX array name
vsh_constants__screenproj).
Rule-24 disclosure (owner per-site admission, 2026-09-21): two new
(real_vector3d const *)&shadow_matrix->position casts, one per
dot_product3d call. The /Od build calls dot_product3d at 0x80db50 and
0x80dbc2 with the matrix position. Deleting both casts leaves the
function strict exact, and point/vector share the three-real layout.
parked.json: unpark _render_particles and __rasterizer_environment_shadow_begin.
The owner packet gains the aggregate 3D->2D view-copy question.
Gate: ninja PASS, parks 112/0/0, admission 0 contradicted/0 revoked,
provider link PASS, fake scan unchanged, pytest 1152 passed / 5 skipped
/ 26 subtests.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Structural lane batch 2: config only, +4,544 padded bytes strict exact
(7 functions), no source change, zero stable-verdict regressions. The
semantic scorer already credited these rows, so objdiff progress is
unchanged; the gain is in strict section_infos_equal verdicts.
Each relocation addresses the same image location in both objects, but
csplit named the neighbouring image symbol. Retarget to the owning symbol
with the addend VC7 emits (relocs.json line surgery, same class as
1b439d04 / 79096027):
- _collision_log_get_current_user: _global_current_collision_users-2
- _get_mutex_from_pool: _thread_globals+1580 (one-past-the-end bound)
- _bitmap_sharpen: _bitmap_sharpen_negative_table-2
- _player_profile_update_cache_for_nwide_list, _3wide_list_update,
_1wide_list_update: _cached_player_profile+156 (pointer compare
against the end of the cache)
- _splitscreen_pregame_status_screen_update:
_local_player_controller_bitmap_frames+26
parked.json: remove the seven now-exact csplit-relocation-alias parks.
Gate: ninja PASS, parks 114/0/0, admission 0 contradicted/0 revoked,
pytest 1152 passed / 5 skipped / 26 subtests.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>