Commit Graph
2290 Commits
Author SHA1 Message Date
Jonas VolmanandClaude Opus 5 cf097d7f70 Wave 7: four functions strict exact (hud_unit, flags, path, motion_sensor)
- _hud_render_unit_interface (3,504 B): January's local-player re-read for
  the HUD state, flag-macro draw flags, advancing shield color pointer,
  named auxiliary panel, direct flash-time indexing (park reopen)
- _flag_render_proper: loop counters reset in the for-initializers
- _path_state_begin: single exit, distance_squared3d + square_root, a
  destination pointer shared by the helper and the error text (park reopen)
- _blip_begin: January's caller pushes a zero second argument the callee
  never reads; the parameter is added with a provisional name and comment
  (park reopen). The caller park _render_motion_sensor is re-measured
  (non-exact before and after).

Rejected: _render_debug_trigger_volumes (duplicated arm stores), leaf_map
rows (owner-declined P7 projection_from_vector3d body),
_closest_point_to_attractor (point_from_line3d COMDAT).
Stable diff vs 9062b1e96: 0 regressions; parks 230 -> 226.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-16 15:55:20 -07:00
Jonas VolmanandClaude Opus 5 223ab6f08d bitmap_utilities.h: own the color structs and public prototypes (_bitmap_2d_smooth strict exact)
Header packet (house rule 9): struct rgb_color, hsv_color, argb_color and
union real_hsv_color move from bitmap_utilities.c into their owner header
with prototypes for the six public conversion functions January defines
externally and that had no prototype anywhere. Measured board-wide (full
ninja + stable diff over bitmap_extract, bitmap_utilities, hud_draw,
hud_nav_points, object_lights): +1 function, 0 regressions.

_bitmap_2d_smooth: shared short x/y, coefficient read after the pixel
load, inline rounding/shift expression. The untouched fuzzy park
_bitmap_3d_smooth is re-measured (1792/28 before and after, objdiff
78.03 -> 78.04). Parks 231 -> 230.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-16 15:43:52 -07:00
Jonas VolmanandClaude Opus 5 2ba3ea7cee Wave 6: four functions strict exact (actor_combat, bitmap_utilities)
- _actor_start_burst: burst geometry in its own block, negate_vector3d
  instead of hand-written negation stores (select-any _negate_vector3d
  COMDAT disclosed, laws_w3 A30 class), same capped-radius arithmetic
- _actor_combat_reaim_grenade: block-scoped 2D aim vector and a named
  within_aiming_angle predicate (park reopen)
- _actor_combat_find_nearby_target: clamps the miss_distance parameter
  directly (park reopen)
- _bitmap_2d_sharpen: short loop bounds, natural kernel order, and the
  cast-free match_assert texts January's literals carry (park reopen;
  no exact row traded, unlike the declined cast trade)

Rejected: _breakable_surface_effect (renamed local copies of
point_from_line3d / projection_from_vector3d evading two holds).
Stable diff: 0 regressions; parks 234 -> 231.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-16 15:43:05 -07:00
Jonas VolmanandClaude Opus 5 0e65f0f8be Wave 8: three functions strict exact (main, observer)
- _main_load_last_solo_map: MIN clamp on the terminator index (house rule 18)
- _main_get_window_count: named single-window predicate and a PIN of the
  local player count (reopens its park)
- _observer_update_command: timer/last-timer/flag pointer walk mirroring
  the exact sibling observer_update_velocities (reopens its park)

Rejected: _observer_update_positions (same-value carrier copy of
remaining_time), _main_crash (January writes through a null pointer),
_effect_generate_part (mismatched csprintf varargs).
Stable diff: 0 regressions; parks 236 -> 234.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-16 15:23:27 -07:00
Jonas VolmanandClaude Opus 5 64fd27d28c Nest shader radiosity/physics properties: transparent group draw strict exact
shader_definitions.h: struct shader_base holds a radiosity block (flags,
detail level, power, emitted and tint colors) and a physics block (flags,
material type) at unchanged offsets. January's assert literals spell
shader_transparent_generic->shader.radiosity.flags and the chicago twin.
shaders.c follows the rename at its two lit-flag tests.

_rasterizer_transparent_geometry_group_draw (15,120 B) is strict exact:
widget groups via the NULL-shader render_proc union, stage-lerp component
loops, the chicago extra-layer loop kept as January's never-advancing
loop under a BUG comment, match_vassert defaults. Owner flag: two colour
component loops (debug rescale, external colour) are code-neutral where
they sit and were chosen to match the glass texscale operand order;
component loops are proven elsewhere in the same function.

Board-wide: full ninja + stable diff, +1 function, 0 regressions. The one
drift is the fuzzy park __rasterizer_model_transparent_geometry_submit
(non-exact before and after, objdiff 89.129 -> 89.008), re-measured.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-16 13:59:48 -07:00
Jonas VolmanandClaude Opus 5 6bcdbba5a6 Name _net_startup_debug from the Halo CE map files (strict exact)
symbols.json renames _code_00070420 in place to _net_startup_debug, the
name the 2001-09-25 cachebeta_xbe map lists as the first function of
transport_endpoint_set_winsock.obj (retail cache_exe: @net_startup_debug@4).
January's body is a bare ret; the C definition sits in January object
order before transport_endpoint_set_get_next_index, with its prototype in
transport.h. Full ninja + stable diff over all 13 transport.h consumers:
+1 function, 0 regressions, no park drift.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-16 13:57:37 -07:00
Jonas VolmanandClaude Opus 5 abfb9abfed transport_endpoint.h: January field and parameter widths (4 functions strict exact)
Header packet measured board-wide (every consumer, full ninja + stable
diff): 0 exact functions lost, no park drift outside the reopened four.
- struct transport_endpoint flags is a char: January's flag tests narrow
  the shifted value as a signed char
- set_endpoint_blocking takes a long blocking parameter: January reads a
  32-bit argument and connect_endpoint pushes it with movzx
- endpoint_blocking gains its owner prototype and returns boolean
TU: endpoint_readable single exit, set_endpoint_blocking stores the
ioctlsocket result it tests, connect_endpoint tests connect()'s result
and refills the fd_set inside the wait loop.
Newly exact: _endpoint_listening, _endpoint_readable, _set_endpoint_blocking,
_connect_endpoint. Parks 240 -> 236.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-16 13:56:03 -07:00
Jonas VolmanandClaude Opus 5 4d6c7f99c3 Wave 5: eleven functions strict exact (vehicles, networking)
Owner-unblocked units, reviewed reconstructions, each strict exact in its
whole-TU gate with zero inherited losses, guard passing, no new owners:
- vehicles: _vehicle_update with cross/dot helpers on the object fields
  (removes two invented static carriers), vehicle-type switch, PIN
- network_connection: read_unreliable/read_reliable single-exit bodies
  with January's literals (including the '#d' typo) and a reset flag,
  read assert text, get_address per-path clears, idle and
  idle_server_reliable_endpoint (six park reopens)
- transport_endpoint_winsock: connect_endpoint_async, write_to_endpoint,
  read_from_endpoint single-exit results (three park reopens)
- transport_endpoint_set_winsock: remove_endpoint_from_set single exit

Rejected: _poll_endpoint_set (negative-result clamp chosen to steer block
order), _add_endpoint_to_set (identical FD_SET branches),
_action_obey_command_begin (redundant store), _actor_action_try_to_dive
(units.h prototype contradicting its definition).
Stable diff vs 9062b1e96: 0 regressions; parks 250 -> 240.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-16 13:55:03 -07:00
Jonas VolmanandClaude Opus 5 efb4624aa0 Wave 4: two functions strict exact (particle_systems, stack_walk_windows)
- _particle_system_update: single state loop with in-loop state
  definition, January's 16-bit particle cursor and post-delete next read,
  pointer-walk variable lerp, match_assert with January's text/line; the
  block-top NULL initializer of transition_state_variables follows the
  admitted conditional-initializer form (laws_w2 A10), disclosed
- _load_symbol_table: loop-control flag instead of while(TRUE)/break,
  natural fgets loop, per-arm error handling, January statement order

Rejected in review (point_from_line3d COMDAT hold): _infection_swarm_control,
_weather_particle_update_physics. Stable diff vs 9062b1e96: 0 regressions.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-16 13:17:35 -07:00
Jonas VolmanandClaude Opus 5 c2593b885a Wave 3: eight functions strict exact (screen_effect object complete)
Reviewed reconstructions, each strict exact in its whole-TU gate with
zero inherited losses, guard passing and no new owners:
- rasterizer_xbox_screen_effect (13/13): complete per-arm shader setups,
  load-before-call locals, January assert texts, PIN clamp; screen_flash
  projection spelling and the defined inverse-pixel default arm
- hs_compile: _hs_parse_begin (per-branch result type; January's extra
  sprintf name argument kept with a BUG comment), _hs_parse_cond_recursive
  (single exit; January's always-true negation test kept with a BUG
  comment, byte-proven and recorded in HCEA)
- geometry: definitions in January object order (assert lines ascend),
  duplicate prototype removed, _get_edge_vertex single exit
- render_cameras: view_to_screen and build_frustum_bounds simplifications
- sound_manager: _sound_dispose_from_old_map loop-exit flag

Rejected in review: _encounter_test_rule (redundant default stores),
_render_camera_mirror (point_from_line3d COMDAT), _sound_set_definition_end
(prototype contradicting its definition).
Stable diff vs 9062b1e96: 0 regressions; parks 255 -> 250.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-16 13:06:38 -07:00
Jonas VolmanandClaude Opus 5 42f5730143 Unblocked reserved units: six networking functions strict exact
Owner lifted the reservation on the concurrent-work units for this
isolated lane. Per-function donor harvest (upstream punpckhdq PR50 and
the unmerged root/publish-opus5-safe-20260913 reconciliation), each
landed as a house-rule-clean minimum body, strict exact in its whole-TU
gate with zero inherited losses:
- transport_network_available: boolean result declared and initialized
  from the link-status mask (January masks the byte result)
- transport_nonce_is_equal: boolean comparison of the memcmp result,
  keeping the owner void const * prototype
- winsock_error_to_string: January's switch case order
- read_endpoint: single-exit result with one error store
- network_connection_connected/disconnect: boolean expressions over the
  client-flag and endpoint tests

Donor steering forms were not imported (boolean truncation casts,
byte * parameters). Stable diff vs 9062b1e96: 0 regressions; parks
261 -> 255.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-16 11:44:16 -07:00
Jonas VolmanandClaude Opus 5 d6df15102d Wave 1: four functions strict exact (moving, decals, ui_widget, projectiles)
Reviewed reconstructions, each strict exact in its whole-TU gate with
zero inherited losses, guard passing and no new owners:
- _actor_move_initialize: short sense-ray index (as the sibling loop)
  and direct indexed stores instead of per-iteration pointer aliases
- _decal_sprite_get_bounds: edge-relative (0.0f - registration) extents,
  matching the adjacent (x1 - registration - x0) extent spelling
- _search_and_replace: single-exit result instead of an early return
- _projectile_accelerate: rotation axis/magnitude scoped to the spin
  block (reopens its park)

Rejected in review: _render_ui_widgets and _render_ui_widgets_postgame
(exact only with duplicated identical should_render arms).
Stable diff vs 9062b1e96: 23 functions gained, 0 regressions; parks 261.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-16 11:36:32 -07:00
Jonas VolmanandClaude Opus 5 e30b1f3584 Wave 2: nine functions strict exact (players, game_engine, aim_assist)
Reviewed source reconstructions, each strict exact in its whole-TU gate
with zero inherited losses, guard passing and no new owners:
- players: single-case powerup switches with the default camo-regrowth
  cause, a short-index powerup loop, set_action_result single-exit flag,
  the byte-proven vehicle re-fetch in examine_nearby_vehicle (cascades
  examine_nearby_objects through the private register convention)
- game_engine: generate_title_string per-arm usnprintf calls (two
  physical calls in January, matching the sibling team arms);
  should_spawn_player applies the respawn-slot gate once after the
  decision chain (reopens its park)
- aim_assist: compute_attenuation is an external inline COMDAT in
  January (storage class 2); compute_target reads the forwarded
  target->distance and binds the unit definition

Rejected in review: _eat_my_shorts (identical-outcome branch).
Stable diff: 0 regressions; parks 263 -> 262.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-16 11:32:34 -07:00
Jonas VolmanandClaude Opus 5 51c94f13e5 Harvest per-function donor bodies: 11 functions strict exact
Per-function transplant of historical and worktree donor bodies into the
current tree (whole-blob mining had rejected them for unrelated losses).
Each landing is the minimum hunk, strict exact in its whole-TU gate with
zero inherited losses, and reviewed for house rules and hard holds:
- helper spellings replace hand-expanded math (_device_frontfacing,
  _point_in_triangle3d, _actor_look_valid_aim/look_vector)
- _pill_test_vector3d normalizes directly into the output normal
- natural control-flow/declaration forms reopen five parks
  (_structure_cluster_mark/unmarked, __rasterizer_widget_draw_sprite2d,
  _rasterizer_set_model_skinning, _ai_handle_editing)
- two byte-proven non-UB original bugs kept under the documented
  original-bug policy with BUG comments (_ai_handle_editing unscaled
  csmemmove counts, _ai_scripting_follow_target_ai repeated name)

Stable diff vs 9062b1e96: +11 functions, 0 regressions; parks 268 -> 263.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-16 10:37:04 -07:00
Jonas VolmanandClaude Opus 5 26601453ef Land the final Tier B wave: three structural park reopens (+477 meaningful)
The owner-authorized final implementation wave worked only the ten Tier B
functions of the research campaign, each a structural defect confirmed by two
independent lenses; census first, five evidence-driven shapes at most, stop at
allocation, scheduling or x87 ties. Three closed, seven did not.

- hud _temporary_hud_draw_reticle: January does a SIGNED `% 16` (`and eax,
  0x8000000f; jns; dec; or -16; inc`) where ours did `and eax,0xf`. NUMBEROF
  yields size_t, so `next_point_index % NUMBEROF(points)` was an unsigned modulo;
  a signed named count NUMBER_OF_TEMPORARY_HUD_RETICLE_POINTS sizes the array and
  bounds the loop. It fixes the type, not a cast. The three point stores become
  one set_real_point3d call (laws_w2 A4).
- weapons _weapon_can_be_fired: single-exit form (A3). It writes `result = FALSE`
  in two arms, which I tested against the identical-fake-branch prohibition: the
  merged `if (age >= 1.0f || chain)` spelling is residual, while January emits a
  SEPARATE physical FALSE exit for the age test (`jne; pop edi; xor al,al; pop esi;
  pop ebp; ret` at 0x35-0x3c) before game_engine_running is ever called. Two
  distinct rejection blocks is laws_w3 A26's admission criterion, unlike the
  rejected _bink_query_analog_controller_buttons, whose edges share one block.
- rasterizer_transparent_geometry _rasterizer_transparent_geometry_initialize:
  single exit `success = success && aux_buffer()`. Semantics are unchanged; the
  error block is the last statement before the call, so the short-circuit sits
  exactly where the early return did.

All three parks removed. Not closed and reported in the wave ledgers:
_path_state_traverse, _flag_update, _bitmap_2d_sharpen, _light_volume_render,
_actor_stimulus_prop_acknowledged, _stack_memory_pool_allocate,
_particle_system_new_particle_jet.

Full ninja, parks 268 active / 0 stale / 0 invalid, stable diff vs
scratch/opus5-next150-before.json: gained 15 / 9,504 padded, regressions 0;
fake_match_scan 0 leads on all three files, matching HEAD.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-16 08:49:04 -07:00
Jonas VolmanandClaude Opus 5 6d6529d987 Land two owner-ruled closures: debug player text extent and RGB pixel helper
Both admitted by explicit owner rulings on 2026-09-16; each lands as the minimum
hunk after a whole-TU gate, and neither involves undefined behaviour or steering.

render_debug _render_debug_player (+266, park reopened and removed). LAW D, from
the research campaign's frame study, proves January's `sub esp,0x404` cannot come
from a dead local or any other declaration - a dead whole object costs 0 frame -
and only a declared text extent of 1025-1028 yields it. Written in the house
idiom as a named capacity plus its terminator, added to the file's existing
constants enum rather than a new block: `MAXIMUM_RENDER_DEBUG_PLAYER_TEXT_LENGTH =
1024` and `char text[MAXIMUM_RENDER_DEBUG_PLAYER_TEXT_LENGTH + 1]`. The tree
already uses `[X_LENGTH+1]` string buffers 70+ times. This ruling supersedes the
pre-LAW-D park rejection of enlarging the buffer. Whole-TU gate 34 -> 35 with only
this row changing; the sibling park _render_debug_add_cache_entry is unchanged; the
added enumerator shifted no declaration-count-keyed row; fake scan 0 leads.

hud_draw _real_rgb_color_to_pixel32 (+181, previously unwritten). A genuine
bitmaps_inlines.h color-conversion helper, admitted under house rule 10. The owner
ruling rests on affirmative hand-written-assembly evidence in January's bytes -
dword fistp and fmul on non-top x87 stack slots (fmul st(3),st(0)) - not merely on
asm being able to force a match. The permission covers this one body only; it does
not authorize _real_argb_color_to_pixel32, _fast_ftol_C or assembly elsewhere.
Whole-TU gate 20 -> 21 exact, including _hud_draw_meter, which calls it three
times. fake_match_scan: 3 leads, 2 of them pre-existing at HEAD (the naked
get_return_eip); the only new lead is this admitted block.

Full ninja, parks 271 active / 0 stale / 0 invalid, stable diff vs
scratch/opus5-next150-before.json: gained 12 / 8,992 padded, regressions 0.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-16 07:43:21 -07:00
Jonas VolmanandClaude Opus 5 417fc10e48 Land the research campaign's two Tier A closures (+1,184 meaningful)
Both come from LAW M8, measured by the corpus-scale x87 study: for the
displacement-0 term of an inlined helper on &x->field arguments, VC7 loads first
the operand with the smaller IL-local ordinal (mod 8), so one real local too many
or too few flips it. The same study proved source operand order is INERT for a
bare product (p->a*p->b compiles identically to p->b*p->a), so the R3 operand
swap was never just inadmissible - it never worked. These fixes change the local
set, not the operand order.

- player_effects _player_effect_start (735, park reopened and removed): the three
  field stores relative.i/j/k = dot_product3d(...) become one
  set_real_vector3d(&relative, dot, dot, dot) call (laws_w2 A4 helper routing).
  The park's criterion - natural same-compiler evidence for the final commutative
  operand order - is satisfied by M8.
- actor_moving _actor_get_stopping_distances (449): the `long vehicle_driver_type`
  local and its range test become a switch over the two driver enum constants
  (M8, plus A9 switch width). Semantics are unchanged: _hovering_ground (2) and
  _nondirectional_ground (3) are adjacent in actors.h, so the range and the two
  cases select exactly the same values, and the same TU already switches on
  actor->input.vehicle_driver_type at line 3190. M8 is the new law that lifts this
  row's do-not-repeat tag.

Verified independently of the study: each whole-TU gate changes exactly one row
(residual -> EXACT) with every other exact row intact, the _point_from_line3d
guard passes, player_effects' other two parks are unchanged, and fake_match_scan
reports 0 leads. Full ninja, parks 272 active / 0 stale / 0 invalid, stable diff
vs scratch/opus5-next150-before.json: gained 10 / 8,528 padded, regressions 0.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-16 03:36:41 -07:00
Jonas VolmanandClaude Opus 5 9470345c00 Match the bink allocator under the owner's one-site int 3 ruling
_bink_alloc@4 (+494 meaningful). Three hunks, each measured necessary:

- The two match_dassert sites inside the function become match_vassert. The
  d-family is a project convenience wrapper (docs/assertions.md), not a claim
  about January's text, and the wrapper auto-inlines the small static predicate
  where January calls it out of line.
- A `boolean can_allocate` holds the three-operand guard chain. laws_w2 A13: the
  helper inlines at 0, 1 or 2 && operands and declines at 3, and with the boolean
  the assert line anchors 735/759/786/787/799 and January's ja/jge/jne polarity
  put the failure arm first.
- One unit-local `__asm { int 3 }` in the failure arm, admitted by an explicit
  owner ruling as a helper under house rule 10.

Evidence for the trap, as the ruling requires it be documented: a capstone census
over all 833 January split objects finds exactly four in-body int3 corpus-wide,
and exactly one in Halo source - this site at 0xd1; the other three are vendor
(binkxbox, d3d8, xapilib). A control replacing the trap with __debugbreak() gives
147 instructions with the int3 relocated from 0xd1 to 0xd4 (it sinks past
`pop edi; mov eax,esi`), and a control with no trap is 496/52 [sha] with a
one-instruction shift through the rest of the body - so the intrinsic provably
cannot pin the trap and only inline assembly reproduces January's placement.
This ruling covers that one instruction only; all allocator logic stays in C.

I verified the minimum-hunk requirement myself rather than assuming it: the trap
alone gives 496 [size 512!=496, relocs 51!=52], trap plus the vassert conversions
gives 480/51, so the boolean is load-bearing for the missing relocation and the
size. fake_match_scan reports the expected single inline-assembly review lead.

Full ninja, parks 273 active / 0 stale / 0 invalid, stable diff vs
scratch/opus5-next150-before.json: gained 8 / 7,328 padded, regressions 0; owner
census adds nothing and correctly drops the 'end bink_alloc' literal January
does not own.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-16 01:32:46 -07:00
Jonas VolmanandClaude Opus 5 927d135ecb Recover a missing fade relocation in the looping-sound refresh (zero credit)
Wave n3a targeted the 43 eligible parked rows that still carry a structural gap,
on the evidence that all five wave n1 landings were parks whose recorded premise
did not survive a census. In already-mined units the hypothesis did not pay: no
strict exact function, and the verifiers rejected reopens in s3tc (3),
motion_sensor, bink_playback (2).

Landed at ZERO credit, both strictly closer and both still parked:
- _sound_refresh_looping: the park text blamed a compiler-merged duplicate fade
  call tail. The relocation census refutes that - it was a source defect. Removing
  the fade_in_time phi local recovers January's fourth _sound_start_fade
  relocation, so relocations are now exact at 43/43, size moves 1088 -> 1120
  against January's 1136, and alndiff regions drop 74 -> 37.
- _update_channel_for_looping_sound: size and relocations now both January-exact
  at 1360/61; the residual is [sha] only.

The verifier removed two defective hunks from the submitted refresh body before
accepting; the corrected body is byte-identical to the submission.

Full ninja, parks 274 active / 0 stale / 0 invalid, stable diff vs
scratch/opus5-next150-before.json: gained 7 / 6,832 padded, regressions 0; fake
scan 0 leads.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-15 23:40:34 -07:00
Jonas VolmanandClaude Opus 5 6ebd05a964 Match the perception object test and name the encounter debug renderer
Wave n2 of the next-150K lane.

- actor_perception _actor_perception_refresh_test_object (+1744).
- ai_debug _code_00041220 (+2336): closed by spelling January's counting loop as
  a while loop with the initialiser before it instead of a for with an empty
  body. It also carries a names-only rename packet: config/symbols.json line 654
  and the three C identifiers become _ai_debug_render_encounter, which is house
  rule 7 (no code_<address> names). The name is authenticated by the January map
  atlas (scratch/atlas/ai_debug.obj.txt line 44, "00041220 fuzzy ai_debug.obj
  _ai_debug_render_encounter"), whose offsets for this object cross-validate
  against symbols.json (_ai_debug_dispose_from_old_map 226736, _ai_debug_drawstack
  235808, _ai_debug_render 269120), and corroborated by caller topology
  (_ai_debug_render passes ai_debug.selected_squad_index), the encounter_* callee
  set and the firing-position assert literal. No PDB public exists at 266784,
  consistent with the static. The rename carries no additional byte credit.

Rejected and not landed: devices _device_frontfacing (exact, but a live standing
hold) and the decals _debug_decals relabel (symbols.json line 22482 has no object
at 4414816; the worker's own proposal is to delete that entry, which is a config
question, not a landing).

Full ninja, parks 274 active / 0 stale / 0 invalid, stable diff vs
scratch/opus5-next150-before.json: gained 7 / 6,832 padded, regressions 0; fake
scan 0 leads.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-15 22:42:41 -07:00
Jonas VolmanandClaude Opus 5 034141b121 Recover the wind sampler's integer sign-clear under an explicit owner ruling
_wind_variance_get (+224). January spills the scaled real, clears its sign bit
with a 32-bit `and dword ptr [ebp+0xc],0x7fffffff`, reloads it as a float and
takes the low byte. No floating spelling produces that: the previous fabs() body
canonicalises to x87 fabs at 208 bytes. The recovered source is a block-local
`union { real value; long bits; }` sign-clear, the two-member form that matches
the three existing in-tree precedents (path_obstacle_avoidance, render_cameras,
rasterizer_xbox_water, the last of which is an accepted strict-exact landing).

The owner lifted the 2026-08-31 "inactive union member" hold for this function
only, and the ledger records that supersession. Landed as the minimum function
hunk: no linkage change, no rename-define removal, no type or initializer edits,
and _wind_variance_initialize is untouched at its parked base 400/9.

Verified independently: whole-TU gate 8 exact / 1 residual with every baseline
row intact, guard passed, parkcheck clean apart from the reopened row, owner
census 0 added / 0 removed, fake scan 0 leads. Full ninja, parks 274 active /
0 stale / 0 invalid, stable diff vs scratch/opus5-next150-before.json: gained 5 /
2,752 padded, regressions 0.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-15 21:52:23 -07:00
Jonas VolmanandClaude Opus 5 3083f800b5 Reopen four parks: detail objects, character draw, hud sound and bink cache
Wave n1 of the next-150K lane (fresh structural portfolio at ae10935da).

- structures _structure_render_detail_objects (+1136): reopened with the natural
  array initializer, which the w2 verifier asked for when it rejected the
  hand-written a[0]=0/memset expansion (R6).
- draw_string _bitmap_draw_character (+944).
- hud_sounds _hud_play_sound (+352): closed by removing the one-use index alias
  and reading sound_indices directly (A5), NOT by the volatile/goto body that the
  park record shows was deliberately replaced.
- bink_playback _bink_free_texture_cache (+96): the park premise was the repo's
  own match_dassert wrapper; the user-supplied Bungie random_math.c spells the
  same two sites vassert, and the tree is 874 match_vassert to 14 match_dassert.
- structures _structure_get_planar_fog: zero-credit remeasure. Adding the
  discarded fog-plane lookup January provably executes (its 15th
  _tag_block_get_element_with_size relocation at +0x16d) closes both structural
  tags; 448/448 and 15/15, residual now one register-naming window.

Rejected by the verifiers and not landed: _bink_alloc@4 (exact only with an __asm
block in a pool allocator - house rule 10 allows asm only for evidenced
helper/math routines), the progress_bar _code_000d16d0 rename (standing hold),
and the _portal_hull_from_points remeasure. wind _wind_variance_get is HELD for an
owner ruling (see its ledger).

Full ninja, parks 274 active / 0 stale / 0 invalid, stable diff vs
scratch/opus5-next150-before.json: gained 4 / 2,528 padded, regressions 0; fake
scan 0 leads.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-15 21:43:58 -07:00
Jonas VolmanandClaude Opus 5 ae10935da6 Match action_vehicle seat evaluation and reopen the input_xbox analog park
Wave w3d batch 1 (the structural retarget: census the frame, the [ebp+/-N] slots
and the relocations before proposing any shape).

- action_vehicle _action_vehicle_evaluate_seat (+976): the unit called
  vehicle_specific_definition_get through a C4013 implicit declaration; including
  its genuine owner units/vehicle_definitions.h fixes the call, and January's
  single-exit shape puts the three seat points in the taken branch's own block
  instead of behind an early return.
- input_xbox _input_update_analog_button_state (+48): park reopened and removed.
- effects _effect_allowed_by_environment and _effect_generate_particles: coupled
  A8 callee/caller re-baseline, ZERO credit. Both are now January-exact in padded
  size (and relocation count for the caller) and stay parked and fuzzy; the
  remeasures carry dated evidence in config/parked.json.

Full ninja, parks 277 active / 0 stale / 0 invalid, stable diff vs
scratch/claude250k-start.json: gained 3 / 1,824 bytes, regressions 0; fake scan
0 leads.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-15 20:14:01 -07:00
Jonas VolmanandClaude Opus 5 1881e718b7 Match player_effects screen flash and complete a particle system render body
_player_effect_get_screen_flash (800) becomes strict exact by binding
effect->screen_flash to a local definition pointer used six times, which is the
A5 counter-law form: January re-reads the field through one base rather than
re-forming the address at each of the six uses.

particle_systems _particle_system_render is landed as a complete credible body at
ZERO credit (still residual); the rejected _particle_system_update hunks were
removed from the landable. Wave w3c batch 2 (8 groups, 31,392 spendable padded
bytes) produced no other strict gain; the s3tc _RGBToColor/_DecodeBlockRGB reopen
was rejected by the verifier.

Full ninja, parks 280/0/0, stable diff vs scratch/claude250k-start.json:
gained 1 / 800 bytes, regressions 0; fake scan 0 leads.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-15 18:05:56 -07:00
Jonas VolmanandClaude Opus 5 aa2ada3f52 Complete game_engine title string body (zero credit) and record wave w3c batch 1
_game_engine_generate_title_string was structurally incomplete (1088/70 against
January's 1152/73) and skipped January's common null-termination tail on an
unrecognised win result. The rewritten single-exit body reaches January's size,
relocation count and frame layout with two team-name wchar_t[8] buffers instead
of the union spelling, and 391/391 instructions with one transposed push. It is
still [sha] residual, so it carries ZERO byte credit; the reopen criterion is in
the ledger.

Wave w3c batch 1 (8 groups, 36,384 spendable padded bytes) landed no strict exact
function. The per-object ledgers record the measured blockers, the rejected
_bitmap_2d_smooth reopen (it loses the exact _bitmap_2d_uncompress_from_mipmap
row) and the proposals raised. Full ninja, parks 280/0/0, stable diff vs
scratch/claude250k-start.json: gained 0, regressions 0; fake scan 0 leads.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-15 16:25:03 -07:00
Jonas VolmanandClaude Opus 5 b9030877e2 units.h: owner prototypes for unit_start_running_blindly and unit_is_speaking (action_flee: 1 function strict exact)
Header packet from wave w3b (adversarially verified). action_flee.c called unit_start_running_blindly (units.c) and unit_is_speaking (unit_dialogue.c) through C4013 implicit declarations. Their genuine owner prototypes are added to units.h under prototypes/UNITS.C and prototypes/UNIT_DIALOGUE.C. With them, the parked _action_flee_perform (864, body unchanged since its w2 re-measure) is strict exact and unparked. Both prototypes are required together: the first alone regresses units::_unit_preprocess_node_orientations by declaration count (measured).

Live tree: full ninja + whole-board stable sweep +1 gained / 0 regressions (units.obj unchanged). The already-fuzzy ai_communication park _ai_communication_update_speech_timers (672/43) returns to its documented alternate hash under the new declaration count and is re-measured with appended evidence; parks 279/0/0.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-14 14:46:34 -07:00
Jonas VolmanandClaude Opus 5 8468de1baf collision_usage: retain verified credible source at zero credit
Wave w3b landing, adversarially verified. _collision_log_get_current_user takes January's single-exit short-return form (law A3(c); C4244 at both callers) and is now code-identical to January; the only strict difference is a csplit negative-index relocation alias (_global_current_collision_users-2 == _collision_usage_current+2974), so its park is re-measured and reclassified csplit-relocation-alias (validated by tools.parked_functions). Zero strict credit. Full ninja build and stable sweep: 0 regressions.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-14 14:45:21 -07:00
Jonas VolmanandClaude Opus 5 75e3c4b95a rasterizer_text: 1 function(s) strict exact
Wave w3 landing, adversarially verified. exact: _cache_hardware_format_character. Full ninja build and per-function stable_verdicts sweep: 0 regressions.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-14 14:45:21 -07:00
Jonas VolmanandClaude Opus 5 2716e61191 lightning: 1 function(s) strict exact
Wave w3 landing, adversarially verified. park reopens: _lightning_offset_marker_position. Full ninja build and per-function stable_verdicts sweep: 0 regressions. 1 park(s) removed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-14 14:45:20 -07:00
Jonas VolmanandClaude Opus 5 6555f3d0e6 particles: 2 function(s) strict exact
Wave w3 landing, adversarially verified. exact: _particle_update_physics; park reopens: _particle_next_frame. Full ninja build and per-function stable_verdicts sweep: 0 regressions. 1 park(s) removed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-14 14:45:19 -07:00
Jonas VolmanandClaude Opus 5 57fc56c467 bitmap_extract: 1 function(s) strict exact
Wave w3 landing, adversarially verified. park reopens: _extract_sprites. Full ninja build and per-function stable_verdicts sweep: 0 regressions. 1 park(s) removed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-14 14:45:17 -07:00
Jonas VolmanandClaude Opus 5 082f9171b6 units.h/weapons.h: owner prototypes for biped_update callees (bipeds: 1 function strict exact)
Header packet from wave w3 (adversarially verified). bipeds.c called unit_animation_start_action, unit_cause_player_melee_damage, unit_update_animation (units.c owners) and weapon_stop_reload, weapon_prevents_melee_attack (weapons.c owners) through C4013 implicit declarations. Their genuine owner prototypes are added to units.h (with a struct unit_animation_update_data forward declaration) and weapons.h. With them, _biped_update (1120) is strict exact: January's case block order (moving arms before idle), the 0.1f*0.1f throttle literal (3c23d70b), and direct stores to player_melee_ticks / player_melee_attack_tick with a short melee_speedup_ticks. The header and source land in one commit because the header alone moves the parked _biped_update hash (the ninja park check would fail on an intermediate commit).

Consumer blast (76 units compiled H vs P, including units.c, vehicles.c, weapons.c): only bipeds::_biped_update and the non-exact unparked physics::_physics_update_old hash changed. Live tree: full ninja + whole-board stable sweep +1 gained / 0 regressions; park removed; parks 284/0/0.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-14 13:03:31 -07:00
Jonas VolmanandClaude Opus 5 d792053746 projectiles: 1 function(s) strict exact
Wave w3 landing, adversarially verified. park reopens: _projectile_aim_ballistic. Full ninja build and per-function stable_verdicts sweep: 0 regressions. 1 park(s) removed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-14 13:01:58 -07:00
Jonas VolmanandClaude Opus 5 ec177ec2fc decals: retain verified credible source at zero credit
Wave w3 landing, adversarially verified. zero-credit fuzzy: _decal_new_from_collision. Full ninja build and per-function stable_verdicts sweep: 0 regressions.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-14 13:01:57 -07:00
Jonas VolmanandClaude Opus 5 c2b7503514 actor_perception: 1 function(s) strict exact
Wave w3 landing, adversarially verified. park reopens: _actor_situation_combat_status_update; zero-credit fuzzy: _prop_status_refresh, _actor_situation_update. Full ninja build and per-function stable_verdicts sweep: 0 regressions. 1 park(s) removed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-14 13:01:56 -07:00
Jonas VolmanandClaude Opus 5 901a6ae738 actor_moving: 3 function(s) strict exact
Wave w3 landing, adversarially verified. exact: _actor_move_avoidance_setup, _actor_move_try_evasion_direction, _actor_move_try_evasion_vector. Full ninja build and per-function stable_verdicts sweep: 0 regressions.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-14 13:01:55 -07:00
Jonas VolmanandClaude Opus 5 7f529504c8 actor_looking: 1 function(s) strict exact
Wave w3 landing, adversarially verified. park reopens: _actor_look_decode_direction. Full ninja build and per-function stable_verdicts sweep: 0 regressions. 1 park(s) removed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-14 13:01:53 -07:00
Jonas VolmanandClaude Opus 5 71e4a5a771 weapons: retain verified credible source at zero credit
Packet P2 dependent: write the previously unwritten _weapon_place (208/4 fuzzy, sha-only residual from weapon_index/EBX liveness) using the scenario_weapon_datum owner type: clamp magazine 0 rounds to the definition maxima, set at-rest / cannot-be-garbage / does-not-accelerate flags, lift a non-at-rest weapon by 0.05. Zero strict credit. Full ninja build and stable sweep: 0 regressions.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-14 09:02:41 -07:00
Jonas VolmanandClaude Opus 5 cc93a1fd1c scenario_definitions.h: add scenario weapon datum owner types
Header packet P2 (150K lane, admitted at zero credit). Adds struct scenario_object_permutation {change_colors[4]; region_permutations[8]; unused2[2]} and struct scenario_weapon_datum {object; permutation; short rounds_total; short rounds_loaded; word flags; word pad; unused[3]} plus the scenario weapon flag enum (_weapon_created_at_rest_bit, _weapon_obsolete_bit, _weapon_does_accelerate_bit). Owner and field names from the HCEX SHIP PDB weapons.obj compiland; layout and bits proven by January _weapon_place (rounds_total word at +0x48, rounds_loaded +0x4A, flag byte tests of bit 0 and bit 2 at +0x4C, magazine element 0x70).

55 transitive consumers shadow-compiled: 0 strict changes. Live tree: full ninja + stable sweep 0 gained / 0 regressions; the already-fuzzy encounters park _encounter_update_respawn toggles back to its original 704/27 hash (declaration count) and is re-measured with appended evidence.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-14 09:02:40 -07:00
Jonas VolmanandClaude Opus 5 7fe3891c3e weather_particle_systems: 1 function(s) strict exact
Packet P6 dependent: #include "bitmaps/bitmaps.h" gives weather_particle_systems.c the genuine rgb_colors_interpolate declaration (CL /Zs /W3 C4013 at HEAD; missing-prototype law A7). With the real_math.h named result, _weather_particle_system_new_particle (704) is strict exact. Full ninja build and stable sweep: 0 regressions.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-14 08:59:15 -07:00
Jonas VolmanandClaude Opus 5 21c41cb4bd real_math.h: real_local_random_range stores its result before returning (glow: 1 function strict exact)
Header packet P6 (150K lane). A site scan of every January split object finds all inline real_local_random_range sites (get_global_local_random_seed_address followed by real_seed_random_range); at 9 of them (weather new_particle x2, weather update_physics, glow trailing_particle_new x2, decals x2, particle_systems new_particles, dead_camera) January defers the fstp past unrelated integer work, which only the named-result spelling reproduces; no accepted-exact site contradicts it. No declaration added.

All 572 cl edges shadow-compiled H vs P: +1 (_glow_trailing_particle_new 608, park removed) / 0 losses. Live tree: full ninja + stable sweep with the dependent weather commit +2 gained / 0 regressions. Two already-fuzzy parks (_bitmap_group_add_bitmap 992/59, __rasterizer_model_draw 5168/348) re-measured for the header-inline hash flip with appended evidence.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-14 08:59:14 -07:00
Jonas VolmanandClaude Opus 5 2ac274833b path.h: obstacle_from_disc returns short (path_obstacle_avoidance: 1 function strict exact)
Header packet P5 (150K lane). January's inlined copy in _path_add_steps loads and stores the helper value as 16 bits (mov dx,word [ebx+ecx*8+0xa]; mov word [ebp-0x10],dx) with a dword NONE arm, and the out-of-line _obstacle_from_disc widens an int-typed ?: (movsx eax,word [eax+2] / or eax,-1). The owner prototype and definition now return short, the definition is the single ?: expression, and the redundant (short) cast in path_new is dropped. Declaration count unchanged.

Consumers: 56 transitive path.h includers shadow-compiled H vs P (+1 / 0 losses). Live tree: full ninja + stable sweep +1 gained (_path_add_steps 816, park removed) / 0 regressions; parks 289/0/0.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-14 08:37:51 -07:00
Jonas VolmanandClaude Opus 5 ac4ff3d922 actions.h: declare actor_action_set_default_state in its owner (ai_script: 1 function strict exact)
Header packet P3 (150K lane, amended form). January's public _actor_action_set_default_state (actions.obj) has one external C caller, ai_script.obj, whose CL /Zs /W3 census showed a C4013 implicit declaration (VC7 emitted movsx esi,si that January lacks). The prototype, identical to the actions.c definition, moves into actions.h 'prototypes/ACTIONS.C' next to actor_action_get_default_state, and the actions.c-local copy is removed. To keep the declaration count seen by units.c (which reaches actions.h via ai/actors.h) unchanged, the verbatim duplicate void ai_reconnect_to_structure_bsp(void) prototype is removed from ai_runtime.h; ai/ai.h:108 remains its owner declaration. Without that amendment units::_unit_preprocess_node_orientations regresses (measured).

Shadow blast over all 446 units at ea9175577: +1 / 0 losses. Live tree at 276b0368f: full ninja + stable sweep +1 gained (_ai_scripting_set_current_state 160) / 0 regressions; one already-fuzzy encounters park (_encounter_update_respawn, 704/27) re-measured for the declaration-count hash flip with appended evidence.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-14 08:08:50 -07:00
Jonas VolmanandClaude Opus 5 276b0368fe bipeds.h: biped_approximate_surface_index returns long (ai_script: 1 function strict exact)
Header packet P4 (150K lane). January's only external caller, ai_script.obj, tests the result with a full 32-bit cmp eax,-1 (no sign extension); the short prototype produced cmp ax,0xffff. The owner prototype and the bipeds.c definition now return long and the unevidenced (short) cast is dropped; declaration count unchanged, callee bytes unchanged. _ai_scripting_teleport_starting_location_private (288) becomes strict exact with an untouched body, so its park (premise: the widening perturbs consumers) is removed.

Consumers: 23 bipeds.h includers, shadow-compiled H vs P (0 losses). Live tree: full ninja + stable_verdicts sweep +1 gained / 0 regressions; parks 290/0/0.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-14 08:07:38 -07:00
Jonas VolmanandClaude Opus 5 6a473f30d3 leaf_map: retain verified credible source at zero credit
Wave w1 Batch B (adversarially verified): _leaf_map_build_portals_from_leaf is now resolved-address identical to January (480/17, objdiff 100%); the only strict difference is a csplit one-past-the-end relocation alias, so its park is re-measured and reclassified csplit-relocation-alias (validated by tools.parked_functions). Zero strict credit. Full ninja build and stable sweep: 0 regressions.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-14 07:53:18 -07:00
Jonas VolmanandClaude Opus 5 789e992a6c particle_systems: 1 function(s) strict exact
Wave w1 Batch B (adversarially verified, held for config): _particle_system_new_particles (848) exact. The .rdata blob _rdata_0025a6b8 is split into January's HCEX-PDB-named file statics system_update_functions, particle_creation_functions, particle_update_functions and seconds_per_tick (layout and element counts identical; January relocations new_particles+0x2c7 -> +8, update+0xff -> +0, update+0x617 -> +0x14, jet -> _ground_error+4), with the PDB-public ground_error defined here. symbols.json lines edited in place. Full ninja build and stable sweep: 0 regressions.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-14 07:53:16 -07:00
Jonas VolmanandClaude Opus 5 8015c91127 path: 1 function(s) strict exact
Wave w1 Batch B (adversarially verified, held for config): the address-named 16-byte stub _code_0004c7b0 is January's private path_heap_verify (Bungie's 2001-09-25 Xbox linker map, same link slot between path_state_reset and path_heap_bubble_up; not a January PDB public, so static). Its TRUE body is inlined at the heap insert/pop entry and exit checks, following path_obstacle_avoidance.c's heap_verify. symbols.json line renamed in place with "static": true. Full ninja build and stable sweep: 0 regressions.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-14 07:52:54 -07:00
Jonas VolmanandClaude Opus 5 858bde2b53 rasterizer_xbox: 1 function(s) strict exact
Wave w2 landing, adversarially verified. park reopens: __rasterizer_window_begin. Requires in-place config/symbols.json linkage/label lines (included in this commit); full ninja build and per-function stable_verdicts sweep: 0 regressions. symbols.json: _suppress_window_begin_end and _previous_window_index gain "static": true (file-local globals no longer defeat alias analysis). 1 park(s) removed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-14 07:48:16 -07:00
Jonas VolmanandClaude Opus 5 a25da8b810 rasterizer_cinematics: 4 function(s) strict exact
Wave w2 landing, adversarially verified. park reopens: _rasterizer_screen_effects_initialize_for_new_map, _rasterizer_screen_effect_set_convolution, _rasterizer_screen_effect_set_filter, _rasterizer_screen_effect_set_video. Requires in-place config/symbols.json linkage/label lines (included in this commit); full ninja build and per-function stable_verdicts sweep: 0 regressions. symbols.json: _cinematic_screen_effect_globals gains "static": true. 4 park(s) removed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-14 07:48:14 -07:00
Jonas VolmanandClaude Opus 5 6493ad3b5f geometry: 3 function(s) strict exact
Wave w2 landing, adversarially verified. park reopens: _build_torus, _convex_hull3d_begin, _geosphere_new. Requires in-place config/symbols.json linkage/label lines (included in this commit); full ninja build and per-function stable_verdicts sweep: 0 regressions. symbols.json: insert the static label _geosphere_primitive_triangles at 2597632 (the source-owned static short const table that follows _geosphere_primitive_vertices). 3 park(s) removed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-14 07:48:13 -07:00