Independently gate storage + K, OQ-4 P-a/P-b1, four static-local packets and comment-only disclosures. Preserve all 7641 exact owner rows, 71 valid parks and 1161 passing tests; code/data credit unchanged. G and game_engine admission remain held because current canonical loses populate_statistic_buffer. Existing collision static-local repair is not duplicated. No donor tree, held candidate, scorer or private asset imported.
The 128-bit team mask is indexed by team; a player whose team is not
set (NONE) would read and write outside it, where the 32-bit mask only
shifted. Such a player now counts on its own.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Native builds (HALO_LINUX) size the multiplayer game engine for
HALO_PORT_MAXIMUM_NETWORK_PLAYERS; the matching build keeps the January
text in #else branches and stays byte-identical.
- game_engine.c: MULTIPLAYER_MAXIMUM_PLAYERS follows the port limit; the
postgame statistic buffers hold an entry per player; global_goal has a
slot per player (slayer kill-in-order uses the absolute player index)
and the goal loops are bounded by the array instead of the address of
global_variant; game_engine_get_place uses a 128-bit team mask;
places past the 16th get code-generated English ordinals in the HUD
score messages, scoreboard and postgame instead of asserting or
clamping to "16th"; a free-for-all team is the player's absolute index.
- slayer, oddball, king, race: per-team and per-player score arrays follow
the port limit (oddball's ball arrays stay at 16); January size asserts
are kept for the matching build. Race reads the lap flags of the player
rather than of the player's team index.
- game_allegiance.c: a team past the 10-team table is not its own enemy,
like teams 0..9, so a free-for-all suicide no longer scores as a kill.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The Xbox game allows 16 players on 4 machines (4 split screen players
each). The native builds raise both limits to 128, keeping 4 players per
machine, and leave the byte-matching build unchanged: every change is
under HALO_LINUX (the MSVC objects compare identical).
- Limits: every local copy of the player and machine limits, and the
bare 4s and 16s that stood for them, follow halo_port_limits.h. The
player data array, the machine-to-player table (and its reset) and the
per-tick update arrays grow with them.
- Records: the copies of struct network_game agree on the larger layout
and check it against halo_port_limits.h; maximum_player_count becomes
a byte (128 does not fit a signed char); network_player_is_valid
checks the machine against the machine limit, not the split screen
one; a machine's input carries MAXIMUM_LOCAL_PLAYERS actions (16/4
would have become 128/128).
- Protocol: a message holds at most 4095 bytes (its header has a 12-bit
length), so the 13 KB game settings record is sent in 3.5 KB pieces
that clients reassemble; the per-tick update of 128 players (3,857
bytes) fits. Buffers and the packet codec's limits grow to match, and
the game search uses protocol version 2 so these builds and the Xbox
game never see each other's games.
- Connections: the host accepts a client connection per machine (the
split screen count stood in for it), FD_SETSIZE is 256, stream writes
send all of a message or drop a peer that stops reading instead of
corrupting the stream, and the input and update queues are larger.
- Host: lobby changes are sent at most every 250 ms instead of on every
change (a full lobby would otherwise send ~650 MB), in-game joins wait
in a queue instead of being dropped, the random name and colour
pickers stop looping forever once names or colours run out, machines
get 60 s to load a map, and the debug dump lists only the slots in
use (128 empty slots took seconds to log).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Zero credit; both packets passed adversarial review and are byte-inert on
their complete consumer lists.
- game_allegiance.h owns the allegiance incident constants in HCEX's form
(unnamed enum, no count); game_allegiance.c's private enum with the
unattested tag and count is removed. 12 consumers are raw-identical apart
from C1 $L jump-table label renumbering in 5 objects (not scored).
- real_math.h P1a:
- seven assert macro families recovered from January string literals and
validated by converting hand expansions at 16 January sites;
- the nonuniform_cubic_spline body is replaced by the January-exact glow.c
body (this removes an uninitialised read);
- path_obstacle_avoidance loses its TU-local duplicate macro.
The complete 273-consumer list shows 0 changed rows. The count-selected
transport_endpoint.h hunk is held for the owner (review_real_math_h_real_math_P1).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Zero credit; every packet was independently adversarially reviewed (22/22 approved).
- critic_3: 72 renames of placeholder/invented static function names across 20
objects to first-party names. Each rename has Sept-2001 linker-map alignment
(cachebeta xbe / retail cache exe, several also Aug-2001), relocation-masked
body identity and matching callers; cachebeta publics show every row was a
January static. hs's radiosity_hack_{start,save,find_point}_evaluate pairing
is proven by the Sept .rdata hs_function_definition pointers; players'
create_weapon also matches HCEX.pdb. Objects: ai_debug (reviewer-amended: a
dead stub removed, its comment re-attached), transport_endpoint_winsock,
transport_endpoint_set_winsock (+ parked.json key renames), profile,
progress_bar, network_connection, saved_game_files, rasterizer_xbox_profile,
xbox_sound_cache, game_engine_king, players, hs, hs_runtime, main, decals,
rasterizer_lights, rasterizer_xbox_dynavobgeom,
rasterizer_xbox_environment_fog, rasterizer_xbox_hardware_bitmaps,
render_cameras.
- hs_compile: whitespace_characters, eol_characters and hs_type_primitive_parsers
are external (cachebeta publics, HCEX DataIsGlobal); hs_compile_finish is
static with a TU-local prototype (no public; HCEX static function).
- bink_playback: bink_playback_idle -> bink_playback_update__internal
(first-party). The bink_decompress_audio_frame rename is NOT landed: it needs
an added call whose position is unattested, the same class canonical held for
hardware_geometry in 4d1ebf17.
Gate (full ninja, objdiff 3.3.1): objects 383, code 1,577,237, data 2,586,915
(all unchanged); stable diff 0 regressions; parks 83/0/0; admission 11/0/2/0;
fake scan 26; pytest 1161 passed; diff --check clean.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 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>
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>
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>
Structural lane batch 6: +1,632 padded / +1,590 meaningful bytes strict
exact (4 functions), zero stable-verdict regressions across the full
board (the header consumer sweep).
- rasterizer_geometry.h/.c: uncompress_int32_to_real_vector3d returns
real_vector3d by value. The debug build shows the struct-return copy
at all 16 call sites, and HCEX lists a single parameter. Callers in
rasterizer.c, rasterizer_lights.c and rasterizer_xbox_lights.c assign
the result directly and drop their scratch buffers. Exact:
_compress_real_vector3d_to_int32 and _clamp. The parked
_rasterizer_sun_glow_draw is re-measured (same size, fuzzy
95.815 -> 95.817).
- game/players.h: declare players_debug_render(void), a public players.c
function that render_debug.c called undeclared (C4013). Disclosure: the
by-value prototype drops one declared name, which alone flips
_rasterizer_frame_statistics_draw's field-load order. This genuine
missing prototype restores that TU's name count. Both edits are
independently evidenced and landed together; the full build shows no
regression.
- weapons.c: _weapon_magazine_finish_reload reads magazine->rounds_loaded
(/Od 0x6a4590).
- rasterizer_xbox_hardware_geometry.c: _rasterizer_triangle_buffer_new
follows the debug build (0x7eaca0), including the index-buffer Unlock
with its HRESULT check. This removes the _ReadWriteBarrier/pragma/goto
steering.
- parked.json: unpark the three newly exact parked functions.
Gate: ninja PASS, parks 109/0/0, admission 0 contradicted/0 revoked,
provider link PASS, casts and fake scan unchanged, pytest 1152 passed /
5 skipped / 26 subtests.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Structural lane batch 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>
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.
New strict exact (unit :: function, padded bytes):
game/player_control :: _player_control_modify_desired_angles 1584
ai/actor_combat :: _actor_aim_projectile 720
memory/stack_memory_pool:: _stack_memory_pool_allocate 640
memory/stack_memory_pool:: _stack_memory_pool_resize_block 192
ai/action_vehicle :: _action_vehicle_setup_impromptu 464
scenario/wind :: _wind_variance_initialize 384
ai/actions :: _actors_searching_same_position 320
ai/action_converse :: _action_converse_perform 256
game/game_engine_race :: _race_engine_get_score 224
Function boards now complete: action_converse 9/9, wind 9/9, stack_memory_pool
33/33, game_engine_race 36/36, player_control 49/49 (objects NOT marked Matching:
whole-object data/ownership audit not done; player_control .rdata is owner-held).
Method. Every closure started from the SOURCE SHAPE read out of the first-party
unoptimised /Od + /RTC build (halo_cache_symbols.exe, scratch/orch/odbuild.py)
and was then confirmed against January's own bytes before it was relied on
(double attestation); none is a spelling search.
- _player_control_modify_desired_angles: both autolevel products are
`error * K * magnitude3d(v)`; three lines, no local, cast or parenthesis.
- _actor_aim_projectile: weapon_vector is scoped to its own inner block, the dot
product is tested directly (no `alignment` local), and the three debug-info
stores follow January's order (flag first). Reviewer strip tests: block alone,
order alone and alignment-drop alone are each residual; only the combination
is exact.
- _stack_memory_pool_allocate: result zeroed before the 0x342 assert, ONE return,
positive guard with the assert in the else, in-place size arithmetic. The
worker's unattested `last_block` pointer local was REMOVED by the reviewer; the
/Od arm spelling lands instead.
- _stack_memory_pool_resize_block: body untouched. The static helper
stack_memory_pool_dispose_block takes (pool, reference), as /Od pushes them and
as the callee forwards them to valid_block(pool, reference).
- _action_vehicle_setup_impromptu: passes state_data->attempt_distance /
->continue_distance (the fields just stored) instead of the parameters.
- _wind_variance_initialize: block-local `word control_point_indices[4]` assigned
inside the innermost axis loop; name and size from the /Od RTC descriptor.
- _actors_searching_same_position: four pointer locals, result = FALSE after the
four calls, if / else-if arms assigning result, one return. Requires
actor_get_pursuit_location (baseline exact, STILL exact 64) to read
uncover.pursuit_location through its own union member in a second arm, as /Od
has it. The evade-direction enum gains its two real middle constants; values
are unchanged (_actor_evade_random is still 4).
- _action_converse_perform: REMOVES a pre-existing `true_value` dummy local from
production. `in_range = TRUE` is assigned in two arms (if / else-if): /Od has two
distinct stores, impossible from one `||` statement, and January has
`mov ebx,1` with two bl stores each with two in-edges. One return.
- _race_engine_get_score: a `score` accumulator assigned on both arms with ONE
return (single-exit law); team_index/laps/flags_touched are block locals of
the non-team arm.
Orchestrator overrides of reviewer-approved text (not landed, zero credit lost
beyond what is listed under HELD):
- action_vehicle: the reviewer's landing.c also rewrote _find_destination with 16
NEW 3D->2D view casts. Owner ruling 2026-09-21 keeps rule 24 strict for new
representation-punning casts, so only the two-line exact closure lands.
- actions: _actor_action_try_to_dive (720, exact in scratch) needs ONE new view
cast -> HELD. _actor_action_handle_vehicle_entry's fuzzy rewrite introduced an
empty `if` arm holding only a `//` comment (new fake_match_scan lead the
reviewer missed) -> reverted to production.
Config: config/parked.json - six entries REMOVED (now exact):
_action_converse_perform, _wind_variance_initialize, _actor_aim_projectile,
_actors_searching_same_position, _player_control_modify_desired_angles,
_race_engine_get_score. No header, symbols.json, flag or tool change.
Verification (tip of the following fuzzy commit): full ninja all_source progress
semantic_progress pass, Code 1446706 -> 1451421, 7297 -> 7306 functions.
stable_verdicts vs the FROZEN baseline: gained 15 / 7568 bytes, regressions 0.
All 11,060 function and 1,706 section report rows: 0 lost 100%, 0 missing.
Parks 174 active / 0 stale / 0 invalid. Admission audit 23 / 0 / 8 / 0.
Guard, ownership, fake scan, line endings, new-punning-cast screen: clean on
every landed file. git diff --check clean.
Reviewer: independent adversarial agent per unit, ACCEPT_EXACT for all nine;
orchestrator re-gated every file through scratch/orch/land.py.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
New strict exact (unit :: function, padded bytes, relocations):
game/aim_assist :: _local_player_aim_assist 368 12
game/game_engine_king :: _king_calculate_hill_state 448 32
units/unit_dialogue :: _unit_describe_speech 272
units/unit_dialogue :: _unit_make_damage_sound 784
units/biped_limp_noodle:: _biped_limp_noodle_relax_nodes_onto_environment 256
units/vehicles :: _create_ghost_effect 656
game_engine_king is now 29/29 on the function board (object NOT admitted: its
.bss naming is owner-held and its .data is blocked, see below).
Evidence per function:
- _local_player_aim_assist: the later Win32 /Od build (halo_cache_symbols.exe
fn 0x589420) and its RTC descriptor attest, independently of any compile, the
result local initialised first with ONE return, the nested
player_control_get_zoom_level argument, the real subtract_vectors3d call with
RTC names velocity/target_velocity/magnetism_velocity, and two STORED pointer
locals. /Od neither invents locals nor inlines. Closed on the first compile
after the evidence; every element strip-tested alone -> residual.
- _king_calculate_hill_state: the LAW Z negative-set member. January has ONE
hill_controlled_count == HILL_CONTROL_TIME test at the bottom, not three; the
team arm counts red/blue with the uncontrolled arm in the middle; each arm owns
its data_iterator. That restores the two missing _king_globals references and
January's pinned zero register with no zero-store steering.
- _unit_describe_speech: the one board function whose loop differs by pure shape
(January top-tested). A done-flag `while (!done)` loop, the Marathon idiom.
- _unit_make_damage_sound: single-exit law (January 1 ret, ours had 2); the body
is guarded by dialogue_index != NONE instead of an early return.
- _biped_limp_noodle_relax_nodes_onto_environment: accessor-binding law - the
object_get() result is bound to a local (non-destructive lea), as January does.
- _create_ghost_effect: the marker count is TWO shorts summed in the loop test
(hover_marker_count from the call, jet_marker_count = 0). First-party
attestation: the later unoptimised debug build (halo_cache_symbols.exe fn
0x8f5530) stores the call result to one short, zero-initialises a SECOND
short, then marker_index, and its loop test is movsx idx / movsx a / movsx b /
add / cmp; the sibling create_pelican_effect (0x8f5c90) has the same three
slots with the second one counting "jet thrusters". January's store order
(`mov [ebp-4],0` then the call result) is exactly that. The zero-valued local
is therefore an attested source variable, not a steering dummy; without it the
body is the old residual. Flagged in the handoff for owner awareness.
Zero-credit riders in the same files (no credit claimed):
- vehicles.c _update_alien_fighter_physics_new: credible restructure with scoped
blocks and real names; still residual [relocs 33!=32, sha]. The reviewer
measured `real const` thrust locals as byte-neutral, so the plain literals land.
- game_engine_king.c: adds the MISSING `struct game_engine king_engine` table
(declared in the header, referenced from game_engine_list.c, defined nowhere).
136 bytes, 0 content bytes differ from January, 23/23 relocations identical.
objdiff still scores the section <100%: January leaves the "king" literal
undefined in this object and `$`-literal relocations match only by combined
address (same cause as race_engine). Correct source, zero data credit.
Config: config/parked.json - four entries REMOVED (now exact):
_king_calculate_hill_state, _biped_limp_noodle_relax_nodes_onto_environment,
_unit_describe_speech, _unit_make_damage_sound. Parks 184 -> 180, 0 stale, 0
invalid. No header, symbols.json, flag, tool or semantic-override change.
Verification: full ninja all_source progress semantic_progress pass (Code
1443979 -> 1446706, 7291 -> 7297 functions). stable_verdicts vs the frozen
baseline: gained 6 / 2784 bytes, regressions 0. Row diff of all 11,060 function
and 1,706 section report rows: 0 rows lost 100%. Admission audit 19/0/8/0.
_point_from_line3d guard, ownership (newly defined symbols vs January) and
fake_match_scan: clean on every changed file. git diff --check clean.
Reviewer: an independent adversarial agent re-gated every candidate from
scratch and returned ACCEPT_EXACT for all six; orchestrator re-verified.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Identical text to claude/data-section-credit-20260920 for these six files
(git diff against that branch is empty), so the two branches merge cleanly.
ZERO Lane B credit is claimed: the five data sections belong to the data lane.
Taken deliberately because three of the hunks change relocation IDENTITIES
that Lane B code residuals need before they can ever gate exact:
action_vehicle.c 0.1225f -> 0.35f*0.35f (__real@3dfae147, January's
folded product) - _action_vehicle_find_destination
collision_debug.c assert text count<=14 - _collision_debug_render
path_structure_bsp.c assert spacing - _structure_test_line2d
and three are the .bss layout law (= 0 / = FALSE on debug globals):
player_control.c, collisions.c, bipeds.c
Units/functions: none change verdict. Strict meaningful +0, padded +0.
Fuzzy: none. Data: +489 B (116+300+43+26+4), credited to the data lane.
Stable regression: scratch/lane_b_before.json -> lane_b_w0.json, 0 regressions,
0 gains. Lane inventory row-diff: 0 losses, 0 moves. Parks 0 stale / 0 invalid.
Full ninja all_source progress semantic_progress: pass
(Code 1443979 / 1770166, 7291 / 7574; Data 2360994 -> 2361483).
Config/header changes: none. Reviewer: data lane's own verification; re-verified
here by full build and row diff.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Owner ruling 2026-09-20: approve with full sweep - land the prototype and the
decoded block only after all 12 consumers, ownership, guard, full build and
zero-regression checks pass. All passed.
game_allegiance_get_incidents is defined in game_allegiance.c and called from
nowhere, and was declared in no header - a genuine omission, since every sibling
function of that file is declared in game_allegiance.h in exactly this style. The
declaration is placed between game_team_is_ally and game_allegiance_provoke,
matching the definition order in the .c.
The caller is the block decoded from January's _ai_communication_event at
0x3c1-0x409: when ai_debug.print_allegiance is set and the allegiance still
holds, it prints the incident count against the threshold, substituting 999 for
a NONE threshold. It sits inside if (observed) where broken is in scope; the
argument order is fixed by January's reuse of the cause_team slot at 0x40c.
WHY IT PAYS. objdiff credits a data section all-or-nothing, and
ai_communication's 11,600-byte .rdata sat at 99.5% purely because this block's
two string literals were never emitted. Data moves 2,364,914 -> 2,376,514,
exactly the +11,600 measured beforehand on a scratch candidate.
_ai_communication_event stays residual - 16 bytes short instead of 96, 335 of
336 relocations - so the code metric is unchanged at 1,460,468 / 7,301.
THE SWEEP, as required:
full board 11,060 function rows and 1,706 section rows diffed before/after:
0 worse, 0 vanished, 0 new; 3 better (the target function, and
ai_communication .rdata 99.51 -> 100.00 and .text 94.90 -> 95.24)
consumers strict gate rows for all 12 files that include the header:
exactly one row moved, the target, and it improved; no EXACT lost
guard --forbid-emitted-symbol _point_from_line3d identical on all 12
ownership the change newly defines exactly two symbols, both string literals
that January's ai_communication.obj also defines, and newly
references one, which January's object also references - CLEAN
build full ninja green; parks 181 active / 0 stale / 0 invalid;
fake_match_scan 0 findings; no C4013 implicit declarations
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
- _collision_bsp_test_vector_recursive: reads the leaf flags through the
typed tag-block macro inline (HCEA spelling)
- _collision_surface_find_closest_point2d: vector_from_points2d and
cross_product2d replace hand-expanded math, as the exact sibling
collision_surface_test_point2d does
- _ai_communication_update_speech_timers: includes the owner header
cseries/errors.h for error() and names the timer label
- _cached_map_file_read_header: the exact wait helper snapshots the
completion flag before returning, reproducing January's double volatile
load at both inlined sites; the still-parked _cache_files_open_cache_files
is re-measured (closer, non-exact)
- _update_client_local_ticks: countdown tick loop and a machine_index
local passed to both server calls (January calls the build helper out of
line, which a literal 0 argument does not reproduce; disclosed)
- _rasterizer_sort_external: plain indexed loops; the object's eight
file-private globals are static, as only this object uses them
Stable diff: 0 regressions; admission 28 candidates / 0 contradicted;
active parks 201 -> 195.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
- _game_load: drops the carrier locals from the Stian lift and reads the
module-state game_globals directly (HCEA body minus its later precache
call); game_globals is file-static, as only game.obj references it in
January, with the matching in-place "static": true in symbols.json
(same form as _game_allegiance_globals)
- _circle_tangents: ratio computed then clamped in place with MIN (HCEA
form)
- _circular_queue_dequeue_data: contiguous size before the read-offset
working copy inside the success block; the worker's hand-expanded
circular_queue_size copy was removed in review and is not needed
Stable diff: 0 regressions; admission 23 candidates / 0 contradicted;
active parks 209 -> 206.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
- _render_debug_add_cache_entry: success-first single exit, string case
if/else, one case body per debug type as January emits them
- _ctf_engine_weapon_update: long return-team locals from the owner team
field (January's 32-bit movsx locals)
- _action_uncover_perform: timeslice-block locals, one evaluation-mode
store (removes HEAD's duplicated arm stores), field-order target stores
- _row_dither: indexed channel loops with PIN clamps replace pointer
cursors and a hand-written ternary clamp
- _lruv_debug_to_file: removes a goto web; MIN(9999, age) and the
NULL-name fallback in the fprintf arguments (integer compare order
disclosed; constant-first MIN is attested in Bungie source)
- _action_guard_perform: short firing-position index matching the
actor_select_firing_position return type
render_debug, game_engine_ctf, action_uncover, bitmaps_quantitize,
lruv_cache and action_guard are now all-function exact.
Stable diff: 0 regressions; active parks 219 -> 213.
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>
_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>
Wave w2 landing, adversarially verified. park reopens: _update_queues_reset_and_fill_with_lies, _update_client_get_maximum_possible_server_time. 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: _update_server_globals and _update_client_globals gain "static": true. 2 park(s) removed.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Wave w2 landing, adversarially verified. park reopens: _get_local_player_input_blob, _player_control_initialize_for_new_map. 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: _player_control_globals gains "static": true (source now defines it static; header extern dropped in the prerequisite commit). 2 park(s) removed.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
January's player_control_globals pointer is private to player_control.obj (no other object references it; the dependent player_control.c commit makes it static, matching storage class 3 in config/symbols.json). The extern is removed so the static definition does not follow an external declaration (C4211).
Header prerequisite for the wave w2 player_control reopen. Consumers (21): player_control plus ai_debug, bored_camera, director, editor_flying_camera, following_camera, player_effects, aim_assist, game, game_engine, players, hs_library_external, input_abstraction, first_person_weapons, hud, hud_draw, hud_weapon, interface, motion_sensor, ui_widget, main; verifier shadow-header check gave identical gate rows and tinfo for all 20 others. Live full ninja + stable sweep with the dependent commits: 0 regressions.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Wave w2 landing, adversarially verified. park reopens: _game_statistics_record_kill. 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 w1 landing, adversarially verified. park reopens: _unit_should_autopick_weapon, _players_compute_combined_pvs, _player_teleport_on_bsp_switch, _players_reconnect_to_structure_bsp. Full build of the combined batch: 54 strict gains / 29,440 padded, 0 regressions, parks 355/0/0. 4 park(s) removed.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Wave w1 landing, adversarially verified. exact: _multiplayer_message; park reopens: _game_engine_get_place, _find_closest_player_index. Full build of the combined batch: 54 strict gains / 29,440 padded, 0 regressions, parks 355/0/0. 2 park(s) removed.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Wave w1 landing, adversarially verified. exact: _find_aim_assist_targets. Full build of the combined batch: 54 strict gains / 29,440 padded, 0 regressions, parks 355/0/0.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The player_action local is scoped to its only use and the copies follow January store order. 1 park(s) removed. Adversarially verified (wave D park re-investigation); full build of the combined wave D set: 0 regressions, parks 402/0/0.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Criterion met: the game_engine same-TU call graph is complete (180/180 written). netgame_flag_verify_team_exists uses the single-flag lookup January calls. 1 park removed; +1 exact (640 padded). Full build of the combined reopen set: 0 regressions, parks 451/0/0.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
January sign-extends local_player_triggered_switch (signed 4-bit field, none = NONE). Header change and its dependent players.c statements are one measured packet: 74 players.h includers rebuilt, +1 exact (816 padded), 0 regressions, parks clean.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
actor_firing_blindly (actors.h), player_aim_projectile (aim_assist.h), projectile_kill_tracer (projectiles.h), unit_adjust_projectile_ray (units.h) and the remaining weapon datum flag bits. Removes the verbatim duplicate collision_surface_polygon prototype from collision_bsp.h; without that cleanup the two added declarations regress units::_unit_preprocess_node_orientations (declaration-count sensitivity, bisected). Full build with the weapons body: 0 regressions, parks clean.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>