- _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>
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>
- _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>
- _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>
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>
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>
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>
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>
- _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>
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>
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>
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>
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>
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>
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>
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>
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>
_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>
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>
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>
_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>
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>
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>
_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>
_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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>