Commit Graph
332 Commits
Author SHA1 Message Date
MrBruh 1bcd57afe4 Merge branch 'bnunu:main' into main 2026-09-28 14:46:17 +13:00
Jonas Volman 59757f4263 Reconcile approved type ownership, static locals and source disclosures
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.
2026-09-27 05:17:27 -07:00
MrBruh 5389a16360 Merge branch 'bnunu:main' into main 2026-09-27 23:57:12 +13:00
Jonas Volman 7b51e0bac5 Reconcile approved private player API correction and exact debit 2026-09-27 02:50:59 -07:00
MrBruh b0e3bc96e3 Fix framerate-dependent timing 2026-09-27 19:23:44 +13:00
Jonas VolmanandClaude Opus 5.5 eb0c5a26db Port: keep game_engine_get_place's team mask in range
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>
2026-09-26 10:18:07 -07:00
Jonas VolmanandClaude Opus 5.5 6651db882e Port: raise the game engine to 128 players
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>
2026-09-26 10:18:07 -07:00
Jonas VolmanandClaude Opus 5.5 db207ea1a4 Networking: 128 players on up to 128 machines in the native builds
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>
2026-09-26 10:18:07 -07:00
MrBruh a06ef74eec Detach framerate from gameplay simulation 2026-09-26 21:49:07 +12:00
MrBruh ebb0eac50b Port decomp to Linux 2026-09-26 12:15:09 +12:00
Jonas VolmanandClaude Opus 5.5 4f236e9f2c R3 prerequisites: HCEX allegiance incident enum owner; zero-count authentic real_math.h content
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>
2026-09-24 18:56:58 -07:00
Jonas VolmanandClaude Opus 5.5 b993052102 R2 batch 3: first-party function names and storage from the completeness-critic routes
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>
2026-09-24 16:59:40 -07:00
Jonas VolmanandClaude Opus 5.5 6e3e2d35e4 Batch 4b: admit rasterizer_xbox_dynavobgeom; object_damage_body exact; reviewed storage packets
- rasterizer_xbox_dynavobgeom (admission, reviewer-amended): genuine shared
  declarations replace the caller-local debug-options, window and pixel-shader
  views; /Od-attested vector_from_points3d/dot_product3d calls and HCEX locals
  in the unlit draw; the HCEX function-static `warned` latch; MAX() for the
  /Od ?: store; nine D3DINLINE wrappers static per cachebeta; rejection retired.
- damage (reviewer B+): _object_damage_body exact (1360); four statics per
  cachebeta; park retired. The AOE header-helper form (patch A) stays held.
- players: January-static storage (3 rows) plus the COMMON tentative
  definitions of players_globals/team_data (January linker_common records).
- hs: 839 January-static storage flags and the /Od-attested static helper
  hs_enumerate_scenario_data replacing 11 hand expansions (reviewer-amended;
  the real_random_range cleanup stays held with the P1 class).
- hs_scenario_definitions: first-party static byte_swap_script_syntax_data.
- player_profile (HCEX profile_color_table) and main (/Od main_exit shape):
  reviewed zero-credit packets; three parks re-baselined.

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

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

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

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

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

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

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

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-23 20:42:50 -07:00
Jonas Volman c6ffbffc77 player profile: restore value-return color API 2026-09-23 15:33:14 -07:00
Jonas Volman b0992d0ebe Admit nine verified Halo object closures 2026-09-23 14:25:38 -07:00
Jonas VolmanandClaude Opus 5.5 f04103c28f Admit action_flee, action_guard and aim_assist objects
Whole-object admission of three objects whose functions were already
strict exact (13/13, 15/15, 16/16). No new code bytes are credited.

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

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

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

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-23 11:58:39 -07:00
Jonas Volman 7222f2fd53 Reconcile Claude structural lane into canonical 2026-09-23 07:50:16 -07:00
Jonas VolmanandClaude Opus 5.5 70e1a15b69 Return uncompressed vectors by value and match reload/index-buffer code
Structural lane batch 6: +1,632 padded / +1,590 meaningful bytes strict
exact (4 functions), zero stable-verdict regressions across the full
board (the header consumer sweep).

- rasterizer_geometry.h/.c: uncompress_int32_to_real_vector3d returns
  real_vector3d by value. The debug build shows the struct-return copy
  at all 16 call sites, and HCEX lists a single parameter. Callers in
  rasterizer.c, rasterizer_lights.c and rasterizer_xbox_lights.c assign
  the result directly and drop their scratch buffers. Exact:
  _compress_real_vector3d_to_int32 and _clamp. The parked
  _rasterizer_sun_glow_draw is re-measured (same size, fuzzy
  95.815 -> 95.817).
- game/players.h: declare players_debug_render(void), a public players.c
  function that render_debug.c called undeclared (C4013). Disclosure: the
  by-value prototype drops one declared name, which alone flips
  _rasterizer_frame_statistics_draw's field-load order. This genuine
  missing prototype restores that TU's name count. Both edits are
  independently evidenced and landed together; the full build shows no
  regression.
- weapons.c: _weapon_magazine_finish_reload reads magazine->rounds_loaded
  (/Od 0x6a4590).
- rasterizer_xbox_hardware_geometry.c: _rasterizer_triangle_buffer_new
  follows the debug build (0x7eaca0), including the index-buffer Unlock
  with its HRESULT check. This removes the _ReadWriteBarrier/pragma/goto
  steering.
- parked.json: unpark the three newly exact parked functions.

Gate: ninja PASS, parks 109/0/0, admission 0 contradicted/0 revoked,
provider link PASS, casts and fake scan unchanged, pytest 1152 passed /
5 skipped / 26 subtests.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-23 06:36:08 -07:00
Jonas VolmanandClaude Opus 5.5 6eb9cb7626 Match aim projectile, obstacle avoidance and six HUD/AI functions
Structural lane batch 1: +8,512 padded / +8,459 meaningful bytes strict
exact (8 functions), zero stable-verdict regressions.

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

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

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-23 04:19:08 -07:00
Jonas Volman 7d3c53c83d Admit five Halo objects after ownership checks 2026-09-23 04:13:22 -07:00
Jonas Volman 4f4c85021d Reconcile Lane C with canonical house-rule audit
Integrate verified source and data progress; exclude unproven COMMON ownership, held UB/asm forms, and address-named data credit. Stable sweep: 23 exact functions gained, zero lost.
2026-09-22 23:12:40 -07:00
Jonas Volman a01115aaf5 Integrate verified Claude Lane B campaign
# Conflicts:
#	config/parked.json
2026-09-21 20:20:30 -07:00
Jonas VolmanandClaude Fable 5.1 d57ba30c0d Lane B wave 2: nine strict-exact functions (+4,715 meaningful / +4,784 padded)
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>
2026-09-21 11:10:49 -07:00
Jonas VolmanandClaude Fable 5.1 01e16607f0 Lane B wave 1: six strict-exact functions (+2,727 meaningful / +2,784 padded)
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>
2026-09-21 07:26:50 -07:00
Jonas VolmanandClaude Fable 5.1 7583df5d62 Lane B prerequisite: take the data lane's hunks in six Lane B files
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>
2026-09-21 02:27:48 -07:00
Jonas VolmanandClaude Opus 5 264ddd8a3a Declare game_allegiance_get_incidents and restore its caller: +11,600 data bytes
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>
2026-09-20 21:07:11 -07:00
Jonas Volman 6130661c95 Reconcile final Astra campaign (+4073 bytes) 2026-09-20 10:52:50 -07:00
Jonas Volman 37d513310b Reconcile evidence-backed 10K exact batch 2026-09-19 23:12:42 -07:00
Jonas VolmanandClaude Opus 5 2f24377a5a Wave 19: six parks reopened as strict exact (collision_bsp, comms, caches)
- _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>
2026-09-16 22:11:55 -07:00
Jonas VolmanandClaude Opus 5 bf0f4cc7df Wave 18: three parks reopened as strict exact (game, path_obstacles, circular_queue)
- _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>
2026-09-16 21:23:47 -07:00
Jonas VolmanandClaude Opus 5 5c3ea7ab29 Wave 16: six parks reopened as strict exact (six objects complete)
- _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>
2026-09-16 20:12:07 -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 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 4a846e7146 player_queues_new: 2 function(s) strict exact
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>
2026-09-14 07:48:12 -07:00
Jonas VolmanandClaude Opus 5 57121f73f6 player_control: 2 function(s) strict exact
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>
2026-09-14 07:48:11 -07:00
Jonas VolmanandClaude Opus 5 596e7f2fb2 game_allegiance: 2 function(s) strict exact
Wave w2 landing, adversarially verified. park reopens: _game_allegiance_broken, _game_allegiance_create. 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: _game_allegiance_globals gains "static": true. 2 park(s) removed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-14 07:48:10 -07:00
Jonas VolmanandClaude Opus 5 1839ef1680 player_control.h: drop the extern for the file-private player_control_globals
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>
2026-09-14 07:47:46 -07:00
Jonas VolmanandClaude Opus 5 f764cdf19d game_statistics: 1 function(s) strict exact
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>
2026-09-14 07:39:41 -07:00
Jonas VolmanandClaude Opus 5 78819760c1 game_engine_king: 2 function(s) strict exact
Wave w2 landing, adversarially verified. park reopens: _find_hill, _king_engine_post_rasterize. Full ninja build and per-function stable_verdicts sweep: 0 regressions. 2 park(s) removed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-14 07:39:39 -07:00
Jonas VolmanandClaude Opus 5 ba5f668a1f players: 4 function(s) strict exact
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>
2026-09-14 02:50:58 -07:00
Jonas VolmanandClaude Opus 5 4916e70a06 game_engine: 3 function(s) strict exact
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>
2026-09-14 02:50:57 -07:00
Jonas VolmanandClaude Opus 5 b0cb3bd3b8 aim_assist: 1 function(s) strict exact
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>
2026-09-14 02:50:57 -07:00
Jonas VolmanandClaude Opus 5 b165cbf8b1 player_control: reopen handle_one_player_input exact
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>
2026-09-13 23:09:02 -07:00
Jonas VolmanandClaude Opus 5 5266233aae game_engine: reopen verify_current_map via find_netgame_flag
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>
2026-09-13 21:26:08 -07:00
Jonas VolmanandClaude Opus 5 8f41149c57 Make the local-player triggered switch nibble signed; players_update_after_game exact
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>
2026-09-13 19:58:23 -07:00
Jonas VolmanandClaude Opus 5 a7d0d43883 Declare the weapon trigger graph's cross-object callees in their owner headers
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>
2026-09-13 19:47:36 -07:00
Jonas VolmanandClaude Opus 5 b66439f1ef players: re-fetch unit accessor closes examine_nearby_item
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 19:39:15 -07:00