Commit Graph
2400 Commits
Author SHA1 Message Date
Jonas Volman 20dd67c063 Add isolated Xbox link probe and repair private helper ownership 2026-09-24 13:27:04 -07:00
Jonas Volman f6d00a8c1d Reconcile Claude fifty-object lane with canonical
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.
2026-09-24 07:20:01 -07:00
Jonas VolmanandClaude Opus 5.5 cdc8ebd3fe Batch 5b: reviewed zero-credit storage and provider hygiene
- geometry: drop the NODUP hand copy of plane2d_distance_to_point, so the
  header inline is used (selection byte only; removes a latent
  collision_bsp<->geometry LNK2005).
- collision_bsp: collision_bsp_usage_times is file-static (cachebeta publics).
- rasterizer_lights P1: HCEX file statics with January's .bss layout (the
  load-bearing `= {0}` follows the VC7 initialised-statics law and precedent);
  lands atomically with its 6 symbols.json rows.
- motion_sensor: .bss symbol layout fix (object_audit 44/2 -> 44/0).
- rasterizer_xbox_models: five D3D wrapper rows static.

All byte- and credit-neutral (gated with batch 5a); objects stay incomplete
on residual functions and held owner items.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-24 04:58:59 -07:00
Jonas VolmanandClaude Opus 5.5 466698b85a Batch 5a: admit hud_unit via a hud_draw.h check_stack_buffer header inline
January's 26 stack-sentinel sites in hud_draw, hud_unit, hud_nav_points,
hud_weapon and motion_sensor share one inlined shape. Both asserts at each site
carry one line literal (a macro). January's 48-byte _check_stack_buffer has no
relocations anywhere, and the Sept-2001 map flags the helper as an inline COMDAT
('i hud_draw.obj'). hud_draw.h now carries the STACK_BUFFER constants, the
unchanged check_stack_buffer body as a header __inline, and the sentinel macro
match_assert_stack_frame (descriptive name: neither the /Od build nor HCEX has
the sentinel). The invented corrupt_stack_found/stack_buffer_checked gotos in
hud_unit are gone, and hud_nav_points and hud_weapon use the macro too (exact
callers). motion_sensor keeps its copy: its sentinel callers are residual, so a
new COMDAT there would break rule (i).

hud_unit (reviewer-amended 01RS + 02-04R): first-party names and storage; the
_fast_ftol rejection is retired (identical copy, pair links pass both ways).

DISCLOSED for an owner ruling: P7 drops rasterizer_xbox_models' dead
#include "interface/hud_draw.h" (project commit 635bd83d; no name used; raw-
and warning-inert). It is load-bearing only as declared-name shielding: the
inline adds ~9 names, which flips __rasterizer_model_transparent_geometry_submit.

Gate (full ninja, objdiff 3.3.1, 23 hud_draw.h consumers): Halo objects 378 ->
379; stable diff unchanged, 0 regressions; parks 86/0/0; admission 11/0/2/0;
pytest 1157 passed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-24 04:58:59 -07:00
Jonas VolmanandClaude Opus 5.5 6e3e2d35e4 Batch 4b: admit rasterizer_xbox_dynavobgeom; object_damage_body exact; reviewed storage packets
- rasterizer_xbox_dynavobgeom (admission, reviewer-amended): genuine shared
  declarations replace the caller-local debug-options, window and pixel-shader
  views; /Od-attested vector_from_points3d/dot_product3d calls and HCEX locals
  in the unlit draw; the HCEX function-static `warned` latch; MAX() for the
  /Od ?: store; nine D3DINLINE wrappers static per cachebeta; rejection retired.
- damage (reviewer B+): _object_damage_body exact (1360); four statics per
  cachebeta; park retired. The AOE header-helper form (patch A) stays held.
- players: January-static storage (3 rows) plus the COMMON tentative
  definitions of players_globals/team_data (January linker_common records).
- hs: 839 January-static storage flags and the /Od-attested static helper
  hs_enumerate_scenario_data replacing 11 hand expansions (reviewer-amended;
  the real_random_range cleanup stays held with the P1 class).
- hs_scenario_definitions: first-party static byte_swap_script_syntax_data.
- player_profile (HCEX profile_color_table) and main (/Od main_exit shape):
  reviewed zero-credit packets; three parks re-baselined.

Gate (full ninja, objdiff 3.3.1): Halo objects 377 -> 378; stable diff +1
strict / 1,360 padded, 0 regressions; parks 86/0/0; admission 11/0/3/0; fake
scan 26; pytest 1157 passed; diff --check clean.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-24 02:26:05 -07:00
Jonas VolmanandClaude Opus 5.5 f7cd2e722e Batch 4a: admit player_ui and sound_manager with their shared-header packets
player_ui (header prerequisite + admission; reviewer-amended):
- game_engine.h: the opaque game_variant view becomes the recovered January
  layout (universal/ctf/slayer/oddball/king/race variant members, HCEX names
  where January's offsets attest them); member renames across the game
  engine variants, network managers and playlist_profile.
- player_ui.h: player_ui_get_edit_playlist_profile returns struct game_variant *;
  ui_widget_game_data_input_functions adopts it (reviewer patch 07 removes the
  two C4133 warnings the worker's packet introduced).
- player_ui.c drops its partial playlist_profile view; symbols.json names
  player1_profile_path; rejection retired; status Matching.

sound_manager (shared header sound_definitions.h, 18 consumers):
- sound_definition_find_pitch_range_by_pitch takes HCEX `short old_range_index`
  with the /Od 0x877810 single-exit body (prototype and definition together).
- update_channel_for_looping_sound (1360) and sound_set_definition_end (208) are
  exact in the /Od-attested shape; 45 static flags per cachebeta publics; parks
  retired; status Matching.

Gate (full ninja, objdiff 3.3.1): Halo objects 375 -> 377; stable diff +2
strict / 1,568 padded, 0 regressions across both header consumer sets; parks
87/0/0; admission 11/0/4/0; fake scan 26 (unchanged); pytest 1157 passed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-24 02:21:50 -07:00
Jonas VolmanandClaude Opus 5.5 b9a8d587a0 Batch 3: admit twelve objects; four exact functions; verified storage and data fixes
Objects admitted (Halo 363 -> 375), each with an independent adversarial review:
units (first-party names incl. the reviewer-corrected unit_vectors_are_valid, 49
static flags, '$'-defect data entry), collision_debug (/Od helper calls),
render_objects (b807f9f6 provider packet), editor_flying_camera
(_editor_camera_set_position_and_roll 432, storage + grouped entry re-pin),
rasterizer_xbox_shadows (shadow_model_draw 688), cache_files_windows
(open_cache_files 752), light_volumes (light_volume_render 912, reviewer-amended
/Od declaration order), actor_firing_position, path, biped_limp_noodle (HCEX file
statics), leaf_map and model_animations (/Od helper calls replace hand expansions).

Zero-credit/data: path_structure_bsp HCEX tables (+200 data), hud_nav_points
storage, first_person_weapons patch A (park re-baselined).

Gate (full ninja, objdiff 3.3.1): stable diff +4 strict / 2,784 padded, 0
regressions; parks 89/0/0; admission 11/0/5/0; fake scan 26 (new lead is the
/Od-attested empty then-arm in the still-parked fpw update); pytest 1157 passed;
diff --check clean. Ledger: docs/object_matching_logs/claude_fifty_objects_20260925.md
(adds the Layer 2 owner-ruling disclosure, tallies and held items).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-23 23:53:28 -07:00
Jonas VolmanandClaude Opus 5.5 b807f9f61d Header prerequisites: objects.h __FILE__ provider packet and path.h HCEX field
objects.h: both bounding-sphere inline assertions report OBJECTS_H_FILE, which
defaults to January's relative "..\objects\objects.h". object_lights defines the
absolute spelling first, as January's string census shows. action_vehicle loses
its NODUP hand copy of object_get_bounding_sphere, so the header inline is the only
definition. render_objects' lighting_storage becomes the static local of
object_get_cached_render_lighting (symbols.json).

path.h: the opaque __unknown140A0[0x5C] span is HCEX's `struct path_result
result`, and path.c stores through the field instead of a punning cast.

Consumer sweep (full ninja, objdiff 3.3.1): stable diff shows 0 regressions and no
moved rows beyond the batch-1/Layer-2 gains. Parks 93/0/0, admission 15/0/7/0,
pytest 1157 passed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-23 23:42:16 -07:00
Jonas Volman 641e146696 Reconcile dynavobgeom owner types and count fastcall functions 2026-09-23 20:54:37 -07:00
Jonas VolmanandClaude Opus 5.5 931ed8dc2b Layer 2: /Od-attested real_math.h helper bodies and provider hand-copy removal
Shared-header prerequisite packet:
- real_math.h: distance2d/distance3d become square_root(distance_squared*(a,b))
  (/Od build, no local); project_point2d takes short mapping locals and a
  single ?: store (/Od-attested, equal to January's selected copy);
  lock/unlock_global_random_seed move from the 2026-09-04 reconstruction
  header random_math.h into real_math.h's existing RANDOM_MATH.C prototype
  section (main.c calls them without random_math.h).
- action_vehicle, path_obstacles, decals drop their '#define x x_inline'
  renames and hand-written NODUP helper copies; the header inlines now emit
  byte-identical copies of January's selected sections.
- object_lights and players adopt the /Od caller spellings (0x5d0d50).
Full ninja + rename-stable 8,245-function diff: +2 exact
(_player_set_action_result, _convex_hull2d_perimeter; park retired),
0 regressions. _ai_test_line_of_sight park remeasured (size/relocations
unchanged, fuzzy 97.98 -> 97.92).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-23 20:46:43 -07:00
Jonas VolmanandClaude Opus 5.5 bf937aac0f Batch 1: admit files_windows and objects; five exact functions
- files_windows: _file_get_size strict exact from the /Od single-exit
  result and file_error's named GetLastError() local; park retired.
- objects: Layer 1 helper-provider repair (action_charge, player_control,
  bored_camera, path_obstacles, decals use the genuine real_math.h
  inlines instead of hand-written NODUP copies; every provider row
  unchanged, emitted COMDATs byte-identical to January's selected copies,
  pair links pass both orders) plus the pinned objects_update data entry.
- Exact functions: _dead_camera_new, _actor_perception_refresh_danger_zone,
  _actor_look_idle_find_prop, _texture_cache_steal_memory.
- Zero-credit PDB/HCEX ownership corrections: profile, transport endpoint,
  actor_firing_position, game_engine, real_math, model_animations.

Halo objects 361 -> 363, code +2,769 meaningful bytes, data +1,530,
stable diff +5 functions / 0 regressions, parks 94/0/0, pytest green.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-23 20:42:50 -07:00
Jonas Volman a595bbc2b7 models: restore exact BSS default ownership 2026-09-23 18:59:38 -07:00
Jonas Volman e208c87ba6 ai: restore attested quantized pathfinding tables 2026-09-23 18:44:52 -07:00
Jonas Volman 3da50d630b hs: restore separate external-global definitions and owner 2026-09-23 18:40:22 -07:00
Jonas Volman d99a8658b8 hs: normalize standalone scenario initializer layout 2026-09-23 18:35:45 -07:00
Jonas Volman c5fe0f4036 hs: restore separate scenario data definitions and owner 2026-09-23 18:35:45 -07:00
Jonas Volman 5019c1861a camera: recover private editor state and three exact functions 2026-09-23 16:51:11 -07:00
Jonas Volman d90c9508a6 effects: recover weather particle physics inline helper calls 2026-09-23 16:28:41 -07:00
Jonas Volman 975d4a0bf5 structures: match fog-plane debug helper schedule 2026-09-23 16:14:51 -07:00
Jonas VolmanandClaude Opus 5.5 e942f3385c Own realcmp in real_math.h and match convex_hull2d (770 meaningful bytes)
realcmp appears in January's own assert strings in four objects
(actors, actor_moving, matrix_math, biped_limp_noodle), so it is a
shared Bungie math macro. Define it once in real_math.h's macros
section, using an existing blank line so no header line number moves.
Blank the four identical TU-local copies in actors.c, actor_looking.c
(with its now-stale comment), matrix_math.c and biped_limp_noodle.c.
They are blanked, not deleted, so no __LINE__ moves.
realcmp_epsilon is untouched.

_convex_hull2d returns to direct points[index] indexing. The /Od build
(0x6b9250) reads the parameter array at every site ([eax+edx*8+4]),
with no pointer locals. It uses realcmp at the two degeneracy tests.
The function is now strict exact: 784 padded / 770 meaningful bytes,
25 relocations, normalized sha256
49124afa1d48d20fe6b36cd5c98861de7d27d9ec0109cf7d8dba8812c5464e77. With
the plain fabs(...) < _real_epsilon spelling it is not exact, so the
genuine macro is load-bearing. No new view cast, no new helper
definitions (nothing to link). _convex_polygon2d_clip_to_plane is not
pursued.

The now-stale _convex_hull2d park is retired with
tools.campaign.unpark --write (1 removed, 102 retained).

Verification: full ninja; all 273 real_math.h consumers rebuilt with
no C4005/C4013; stable diff vs frozen 8,245-function baseline
+2 (_collision_debug_render 4,192, _convex_hull2d 784 padded) and 0
regressions; parks 102/0/0; admission audit 13/0/7/0; fake-match scan
unchanged on all six files; python -m pytest -q tools 1154 passed;
git diff --check clean. objdiff 3.3.1 as canonical.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-23 15:58:34 -07:00
Jonas VolmanandClaude Opus 5.5 5671843f57 Match collision_debug_render (4,182 meaningful bytes)
_collision_debug_render is now strict exact: 4,192 padded / 4,182
meaningful bytes, 278 relocations, normalized sha256
5a365dfa90e8300c345e596646f4d2a0be40c6a2527b4b15e747a3de364990d3.
The source is the structural lane's /Od-guided reconstruction,
re-gated on 188d6c1b.

- Locals take the first-party RTC names (point, vector, vector_result,
  collision_point, rotation_matrix, rotated_points, cube_vector,
  textstring, position/velocity/new_*, o, p, i, j, k, bounds, v,
  test_center). The RTC-recorded 2048-byte textstring replaces the
  earlier 1000-byte buffer and its "bug" comment.
- The invented collision_debug_spray_globals aggregate becomes three
  file-static arrays: collision_debug_spray_normals, _points and
  _hit_flags. symbols.json carries the matching three-way static split.
  Evidence for three separate variables:
  - January's module-140 .bss contribution is exactly normals + points
    + hit_flags + the four scalars;
  - the relocation addends are +0, +0x3840 and +0x7080;
  - the /Od build addresses the three arrays separately and
    non-contiguously;
  - one aggregate loses 2 of the 278 relocations.
  csplit output changes only collision_debug.obj.
- New helper COMDATs: _point_from_line3d, _scale_vector3d,
  _add_vectors3d and _set_real_vector3d. Each is byte-identical to
  January's selected copy (action_charge, actor_combat, actions), no
  object defines any of them NODUP any more, and all pair-link in both
  input orders. This follows the owner's 5e81dabf precedent for
  all-inlined TUs (biped_limp_noodle, actor_type_infection).
- New point/vector cast at add_vectors3d(&point, &vector, &point): the
  /Od build passes the 12-byte `point` local as argument 1 and 3 at
  0x7b0c5c. It is byte-inert (stripped: still EXACT, same sha). The
  cube-vertex cast was already present.

Function credit only. The object is not marked Matching.
_collision_debug_cube_vertices is static in source and in January
(absent from cachebeta.pdb publics) but still external in symbols.json.
That is a separate, pre-existing ownership follow-up.

Verification: full ninja (objdiff 3.3.1, as canonical); stable diff vs
frozen 8,245-function baseline +1 / 4,192 padded bytes, 0
regressions; parks 103/0/0; admission audit 13/0/7/0 (no new
contradiction); fake-match scan 0 -> 0; python -m pytest -q tools
1154 passed; git diff --check clean.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-23 15:58:34 -07:00
Jonas Volman ed3e308af0 bitmaps: restore exact ARGB inline color helper and owner API 2026-09-23 15:54:31 -07:00
Jonas Volman f2f880f9c0 physics: match breakable surface effect with authentic inline helpers 2026-09-23 15:40:32 -07:00
Jonas Volman c6ffbffc77 player profile: restore value-return color API 2026-09-23 15:33:14 -07:00
Jonas Volman f21e001f74 weapons: match trigger projectile inline schedule 2026-09-23 15:24:06 -07:00
Jonas VolmanandClaude Opus 5.5 2c7f73b9ad Close ui_widget_event_handler_functions after static ownership fix
All 100 functions were strict exact and the 934-byte .data section was
identical to January's: same payload, flags and resolved destinations
for all 228 relocations. But 98 handler functions,
event_handler_function_list and new_campaign_profile_name were external
in our source. cachebeta.pdb publics show all 100 were file-static in
January, and no other January object references them. Adding `static`
to their prototypes and definitions keeps every function strict exact.
All 452 January symbols now match, and the .bss is identical.

The object also emits the three stock D3D SDK .rdata tables. Each is
byte-identical to January's selected copy (rasterizer_xbox_decals,
progress_bar, headers) and pair-links in both orders, like the 54
already-admitted objects that emit them. The rasterizer_xbox_profile
hold additionally rests on that object's own shared-declaration debt.

One pinned entry in config/semantic_data_matches.json.
- Canonical scorer (objdiff 3.3.1): credits 934 data bytes and clears
  one more revoked row (4 -> 3).
- Pinned objdiff 3.6.0: a verified no-op.
- No code bytes, no config status change.

Verification: full ninja; stable diff vs frozen 8,245-function baseline
0 gained / 0 regressions; parks 103/0/0; fake-match scan 0 -> 0;
pytest 1154 passed; git diff --check clean.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-23 14:43:01 -07:00
Jonas VolmanandClaude Opus 5.5 7d92f97c9f Correct objects.obj private symbol ownership (zero credit)
cachebeta.pdb publics show 31 objects.obj symbols were file-static in
January, and no other January object references any of them. Only
symbols.json and our source disagreed with January.
- 29 functions were already static in our source; their symbols.json
  entries gain "static": true.
- object_memory_release_procs becomes static.
- object_update becomes static, and its public prototype leaves the
  shared objects.h. It is defined before every use in objects.c.

objects now matches January in all 225 symbols, all 121 functions stay
strict exact, and its 1,530-byte .data section is identical. It is
still held: five candidate-only helper COMDATs conflict with
hand-written NODUP providers (path_obstacles, action_charge,
player_control, bored_camera). It also emits the three stock D3D SDK
tables that keep rasterizer_xbox_profile held. No
semantic_data_matches entry, no credit.

Verification: full ninja (the objects.h edit rebuilt its 92
consumers); stable diff vs frozen 8,245-function baseline 0 gained /
0 regressions; parks 103/0/0; fake-match scan 0 -> 0; pytest 1154
passed; git diff --check clean.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-23 14:43:00 -07:00
Jonas VolmanandClaude Opus 5.5 2535f91a79 Close five objects after correcting January symbol ownership
Each of actor_types, recorded_animation_definitions,
model_animation_definitions, sound_classes and object_types had strict
exact functions and a .data section byte-identical to January's: same
payload, flags and resolved relocation destinations. But each also had
private symbols whose storage disagreed with January. cachebeta.pdb
publics are the independent truth: none of the corrected symbols is
public, and no other January object references them.

- actor_types: the address-named accessor and table become
  actor_type_definition_get and actor_type_definitions, both static.
  January's own assert strings name the table, and the Halo CE atlas
  names the accessor at the same 0x140-byte span.
- recorded_animation_definitions: byte_swap_recording is static.
- model_animation_definitions: the seven *_animation_list_entries
  arrays are static beside their public animation_list wrappers.
- sound_classes: _code_001b84c0 is sound_class_datum_get (static). The
  atlas mapping is anchored on six exact sound_classes names.
- object_types: bss_00456e98 is processed_bsp_flags (static), the
  object's only file static in HCEX.pdb.
- items: drop the hand-written NODUP valid_real_matrix4x3 and
  valid_real_vector3d_axes3 copies (bodies identical to real_math.h).
  items genuinely uses them, and all 18 items rows are unchanged. This
  lets object_types' candidate-only copies pair-link. All eight
  object_types helper COMDATs are byte-identical to January's selected
  copies.

Five pinned entries in config/semantic_data_matches.json.
- Canonical scorer (objdiff 3.3.1): credits 6,656 data bytes and clears
  5 more revoked admission rows (9 -> 4).
- Pinned objdiff 3.6.0: already fully matched (verified no-ops).
- No code bytes, no config status change.

Verification: full ninja; stable diff vs frozen 8,245-function
baseline 0 gained / 0 regressions; parks 103/0/0; whole-object audit
PASS, PDB-storage 0 disagreements and provider links PASS for all five;
fake-match scan unchanged (0 -> 0) on all six changed sources; pytest
1154 passed; git diff --check clean.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-23 14:42:52 -07:00
Jonas Volman b0992d0ebe Admit nine verified Halo object closures 2026-09-23 14:25:38 -07:00
Jonas VolmanandClaude Opus 5.5 59925575f1 Match action_vehicle_find_destination and admit action_vehicle
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>
2026-09-23 11:58:45 -07:00
Jonas VolmanandClaude Opus 5.5 f04103c28f Admit action_flee, action_guard and aim_assist objects
Whole-object admission of three objects whose functions were already
strict exact (13/13, 15/15, 16/16). No new code bytes are credited.

Symbol ownership (January cachebeta.pdb publics, no cross-TU refs):
- symbols.json marks _action_flee_find_flee_position,
  _action_flee_current_position_exposed, _action_flee_at_flee_position
  and _action_guard_speak_post_combat static, matching January's
  storage class.
- aim_assist.c: compute_composite_attenuation is public in January, so
  drop `static` from its prototype and definition.

Genuine helper-provider repairs (selected-provider LNK2005 fixes):
- actor_moving.c drops its hand-written NODUP arccosine and the
  arccosine_inline rename; the one acos site becomes
  arccosine(facing_dot). The /Od build (halo_cache_symbols.exe) calls
  an actor_moving-local arccosine COMDAT at exactly this site
  (0x465510 -> 0x46d330), and January's actor_moving owns _arccosine.
  All 36 actor_moving rows are unchanged, including the 2,752-byte
  _actor_move_calculate_movement and _arccosine.
- path_obstacles.c drops its hand-written NODUP set_real_point2d and
  rename; its project_point3d copy now calls set_real_point2d as the
  real_math.h inline does. All 16 rows unchanged.
After both, no object on the board defines _arccosine or
_set_real_point2d NODUP.

Verification: full ninja; stable diff gained 0 / regressions 0;
parks 103 active / 0 stale / 0 invalid; admission audit 39 candidates,
0 contradicted, 0 revoked; object audit PASS and selected-provider link
PASS (both orders) for all three; fake scan and castcheck unchanged;
pytest 1154 passed; halobetacache linked files 332 -> 335.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-23 11:58:39 -07:00
Jonas Volman 63e8dd7a3b Close eleven Halo objects with verified source and data ownership 2026-09-23 11:55:28 -07:00
Jonas Volman 5e81dabff0 Close five Halo objects with verified shared-helper ownership 2026-09-23 10:38:14 -07:00
Jonas Volman 7222f2fd53 Reconcile Claude structural lane into canonical 2026-09-23 07:50:16 -07:00
Jonas VolmanandClaude Opus 5.5 70e1a15b69 Return uncompressed vectors by value and match reload/index-buffer code
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>
2026-09-23 06:36:08 -07:00
Jonas VolmanandClaude Opus 5.5 c789bec003 Correct ai_debug actor rendering scopes and vision-cone trig
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>
2026-09-23 05:31:57 -07:00
Jonas VolmanandClaude Opus 5.5 cfa201763e Match active camouflage, particle and shadow-begin rendering
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>
2026-09-23 05:28:15 -07:00
Jonas VolmanandClaude Opus 5.5 6eb9cb7626 Match aim projectile, obstacle avoidance and six HUD/AI functions
Structural lane batch 1: +8,512 padded / +8,459 meaningful bytes strict
exact (8 functions), zero stable-verdict regressions.

- aim_assist.c: _player_aim_projectile (Lane B body). The debug build
  calls set_real_point3d with the three x+i sums; the pin_normal_to_cone3d
  prototype now comes from the focused real_math_cones.h. The object stops
  emitting _add_vectors3d and _distance3d and emits only the coalescing
  _set_real_point3d, byte-identical to January's copy.
- path_obstacle_avoidance.c: _path_avoid_obstacles single-exit body
  (Lane B). Its only blocker, the _debug_path/_debug_obstacles static
  relabel, landed canonically in 4f4c8502.
- actor_perception.c: _actor_perception_friend_prop_is_attacking
  (single exit, /Od 0x472cb0) and _actor_situation_update (/Od statement
  order at 0x478d33).
- ui_widget.c: _display_error (/Od 0x65f2e0 shape) and
  _widget_instance_text_box_is_focused (/Od 0x66c190 list arm).
- hud_weapon.c: _render_grenade_hud (parent index in its own local,
  /Od 0x639128).
- hud_messaging.c: _hud_messaging_update from /Od 0x62cb90 (wchar_t[256]
  buffer gives the 0x2a0 frame), plus two relocs.json retargets of a
  one-before alias to _button_mappings-18.
- parked.json: unpark the three newly exact parked functions.
- docs: machine-readable manifest and the owner-decision packet.

Gate: ninja PASS, parks 121/0/0, admission 0 contradicted/0 revoked,
selected-provider link PASS on every touched unit, punning casts and
fake-scan leads unchanged, pytest 1152 passed / 5 skipped / 26 subtests.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-23 04:19:08 -07:00
Jonas Volman 7d3c53c83d Admit five Halo objects after ownership checks 2026-09-23 04:13:22 -07:00
Jonas Volman 806d2ee241 Merge branch 'claude/lane-d-refresh-20260922' into jonas/exact-pilots 2026-09-23 01:33:23 -07:00
Jonas Volman 575e5a6c77 Admit five more exact Halo objects with owner cleanup 2026-09-23 01:16:04 -07:00
Jonas VolmanandClaude Opus 5.5 a9e23674b6 Replace invented detail-object globals with real file statics
Lane D refresh packet 7: +80 padded bytes strict exact;
structure_detail_objects.obj is now a whole-object match (15/15 functions,
.text/.rdata/.bss all 100%). Zero stable-verdict regressions.

The production `struct detail_object_globals debug_detail_objects`
aggregate and its `#define detail_object_global_runtime_data` alias were
invented. HCEA (DIA2Dump on the structure_detail_objects compiland) lists
the file statics detail_object_global_runtime_data (struct pointer),
fudge_vector (uchar), fudge_offset and final_offset (float), with
debug_detail_objects as a separate global; January's own assert string
uses the bare name detail_object_global_runtime_data. The source now
declares those statics in January's .bss order (initialised, so VC7 keeps
declaration order) and _structure_detail_objects_initialize stores through
the global directly, as the debug build does.

- symbols.json: four "static": true entries after _debug_detail_objects
  (line insertion only).
- parked.json: unpark _structure_detail_objects_initialize.

Gate: ninja PASS, parks 124 active / 0 stale / 0 invalid, admission 0
contradicted / 0 revoked, fake scan 0 leads.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-23 01:15:55 -07:00
Jonas VolmanandClaude Opus 5.5 dc58693c9f Match stack walk, main render and small systems functions
Lane D refresh packet 4: systems, +3,984 padded bytes strict exact
(11 functions), zero stable-verdict regressions; stack_walk_windows.obj is
now a whole-object code match (16/16).

- stack_walk_windows.c: _walk_up, _is_valid_ebp, _walk_stack,
  _walk_stack_context and _stack_walk_with_context exact. The debug build
  attests `if (ignore_levels) while (--ignore_levels) walk_up();`, the
  global re-reads and the four instruction-byte locals.
- main.c: _compute_subframe_counts (debug-build byte local and ?: column
  test) and _main_game_render (PIN, goto-free player-window assignment).
- bink_playback.c: _bink_draw_frame (the ((index+1)&2) corner idiom used by
  interface.c and hud_draw.c; debug locals scoped to the debug block).
- draw_string.c: _parse_string; styled_font_get takes (font_index, style)
  per the debug build's parameter homes.
- prime_numbers.c: _primegen as a plain sieve.
- transport_endpoint_set_winsock.c: _add_endpoint_to_set single exit.
  fake_match_scan flags its listening-bit test as identical branches; the
  debug build has two separate FD_SET expansions under the same test and
  January's bytes carry the test, so the shape is original (commented).
  _poll_endpoint_set moves to the target's 560-byte size (fuzzy 72.3% ->
  98.5%); its park is re-measured in place.
- parked.json: unpark the six newly exact parked functions; refresh
  _poll_endpoint_set.

Gate: ninja PASS, parks 134 active / 0 stale / 0 invalid, admission 0
contradicted / 0 revoked, castcheck clean; fake scan adds only the
adjudicated identical-branches lead.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-23 01:09:42 -07:00
Jonas VolmanandClaude Opus 5.5 0a571b3398 Match script, particle and structure functions
Lane D refresh packet 3: HS, effects and structures, +6,896 padded bytes
strict exact (9 functions), zero stable-verdict regressions.

- hs_compile.c: _hs_add_script exact as a goto-free single-exit function.
  The worker's discarded hs_function_get call in hs_compile_postprocess
  (fuzzy only; the debug build shows a dead local, not a bare call) is not
  landed.
- hs_runtime.c: _hs_global_reconcile_read/_write exact. The debug build
  repeats the external/internal index test inside the external arm; it is
  written with this file's own if/else index idiom instead of the worker's
  invented macro name.
- contrails.c: _contrail_add_points exact (contrail_scale_value helper,
  corrected indentation).
- particle_systems.c: _particle_system_new_particle_jet, _render and
  _update_particle_default exact. The debug build attests the one-field
  variables walk (RTC size 4), the render if-block scope and the two-argument
  local_random_range call.
- structures.c: _structure_get_planar_fog exact (real scale_vector3d helper;
  flags/screen assigned in both arms per the debug build).
- structure_visibility.c: _portal_hull_from_points exact, single exit, real
  plane3d_distance_to_point helper. The unused BSP local stays a local
  (debug build) rather than a bare call.
- New COMDATs (_scale_vector3d, _local_random_range,
  _plane3d_distance_to_point) are byte-identical to January's single folded
  copies (all-inlined admission class).
- parked.json: unpark the four newly exact parked functions.

Gate: ninja PASS, parks 140 active / 0 stale / 0 invalid, admission 0
contradicted / 0 revoked, fake scan 0 leads, castcheck clean.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-23 01:07:36 -07:00
Jonas VolmanandClaude Opus 5.5 22e62492a8 Match game sound, sound manager and codec functions
Lane D refresh packet 2: sound, +5,088 padded bytes strict exact
(9 functions), zero stable-verdict regressions.

- game_sound.c: _compute_sound_obstruction, _game_sound_update and
  _update_potentially_audible_looping_sound exact. Uses the real
  unattached_looping_sound_stop and vector_from_points3d helpers; the
  duplicated `state = active` store in both refresh-state arms is attested
  by the debug build (strip test fails without it).
- sound_manager.c: _refresh_listener, _sound_find_like_channel,
  _sound_refresh_looping (single exit) and _update_channel_for_impulse_sound
  (sound_scale_value helper) exact. The worker's
  update_channel_for_looping_sound rewrite changed behaviour when a next
  definition exists but the permutation chain continues, and both (word)
  cast removals changed NONE from 65535 to -1; those two functions stay at
  baseline.
- sound_dsound_xbox.c: _channel_queue_packet exact (statement order).
- ima_adpcm.c: _decompress_ima_adpcm_audio_data exact (separate
  remaining-sample counter).
- parked.json: unpark the six newly exact parked functions.

Gate: ninja PASS, parks 144 active / 0 stale / 0 invalid, admission 0
contradicted / 0 revoked, fake scan 0 leads, castcheck clean.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-23 01:06:52 -07:00
Jonas VolmanandClaude Opus 5.5 6099e659e2 Match item and projectile update objects
Lane D refresh packet 1: items and projectiles, +9,856 padded bytes strict
exact (4 functions), zero stable-verdict regressions.

- items.c: _item_update exact. Removes the invented storage unions and
  punning casts; uses real point_from_line3d/dot_product3d helpers and
  scoped locals. January items.obj references _point_from_line3d out of
  line, so the COMDAT emission meets the owner ruling.
- projectiles.c: _projectile_update, _projectile_collision and
  _projectile_collision_test_line exact. Debug-build (/Od) attested shapes:
  the detonation-timer case fall-through, the `(moved = TRUE) &&` condition
  and the duplicate magnitude_squared3d call. January projectiles.obj
  references _point_from_line3d and _collision_test_line out of line; both
  COMDATs are byte-identical to January's folded copies.
- parked.json: unpark _item_update (now exact).

Gate: ninja PASS, parks 150 active / 0 stale / 0 invalid, admission 0
contradicted / 0 revoked, fake scan 0 leads, castcheck clean.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-23 01:06:10 -07:00
Jonas Volman 71d3507b31 Admit five exact Halo objects with rasterizer ownership cleanup 2026-09-23 00:54:07 -07:00
Jonas Volman 95f68ad3ce Admit five strict-exact Halo objects after ownership audit 2026-09-23 00:25:44 -07:00
Jonas Volman 4f4c85021d Reconcile Lane C with canonical house-rule audit
Integrate verified source and data progress; exclude unproven COMMON ownership, held UB/asm forms, and address-named data credit. Stable sweep: 23 exact functions gained, zero lost.
2026-09-22 23:12:40 -07:00
Jonas Volman a01115aaf5 Integrate verified Claude Lane B campaign
# Conflicts:
#	config/parked.json
2026-09-21 20:20:30 -07:00