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>