Split HALO_ANDROID into HALO_ARM64_GUEST, HALO_GLES and HALO_ANDROID
Conflict resolved: main's render-target eviction and mip composites are kept, with the PR's HALO_GLES guard on the ES blit fallback after them.
25 notes ("left unassigned only by this default arm ... approval pending,
2026-09-27 audit") argued that a variable was never read unset. Where the
arm ends in system_exit they were right and simply go. A release build's
assertions return, though, so where the arm only asserts the variable now
starts with a value (a Custom Edition map's HUD data can reach hud_draw's).
A failed map precache reads as failed.
rasterizer_debug_drawing_begin had two declarations, one with an argument
its definition never takes; it now has one, and the port's macro papering
over the mismatch is gone.
(cherry picked from commit 74f8a048e4c3cc7dbc4b050dd41a8bae912bb367)
HALO_ANDROID meant three things at once. The port's code now names each:
HALO_ARM64_GUEST for the ILP32 AArch64 guest's code paths (the inline
assembly's C, the bss pragmas, the CRT's), HALO_GLES for the OpenGL ES
renderer (its GL header and function list, shaders and capabilities), and
HALO_ANDROID for the app alone (its display, input, files and lifecycle).
The Android build defines all three, so nothing changes for it, nor for
Linux and Windows, which define none. A build for another platform can
then take one part without the others: the ES renderer, or the guest's
ABI, without the Android app.
port/android/README.md also no longer says that the widescreen changes are
in #ifdef HALO_ANDROID: none have been since 50eae19b.
The Silent Cartographer with 32x co-op enemies (484 actors) went from 53
to about 97 fps on the Linux PC, with the same game and the same picture:
cluster list removals start where the reference was put, full data arrays
are not walked again, object lighting keeps each cluster's drawn lights
and passes over far ones without their distance, the per-texture profile
timer only runs while something reads it, and the renderer binds streams
once per draw, caches its texture, target and shader lookups, and no
longer makes Mesa's GL thread wait on large uploads or visibility tests.
Import only independently reviewed production changes. Preserve canonical physics and virtual-keyboard repairs; keep B3 and all unresolved holds out.
Record exactly four approved canary debits (6987 meaningful bytes), six Halo admissions and two revocations. Keep vendor ioinit/storage work separate. Full build, 8252-row sweep, 1318 tests, park/admission/fake audits and 621-object binding pass within approved debit bounds.
Do not publish donor research dumps or private assets. README and unrelated user research remain untouched. See frontier_publication_reconciliation_20260927.md for complete evidence limits and accounting.
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.
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>
- _shader_transparent_chicago_create: per-map shader_map_verify(map,
map_index) call as in the exact generic sibling (January's inlined
TRUE-returning verify leaves its store in the loop tail) (park reopen)
- _complete_key_exchange: plain short packet locals replace a long/short
union type-pun (park reopen)
- _debug_realloc: parameter-home reuse and a block-local old_header,
both proven by January's frame (park reopen)
- _lra_allocate: single-exit size check and a conditional round-up
`size = (size & 3) ? (size | 3) + 1 : size` (disclosed) (park reopen)
- _game_state_open_persistent_storage: single-exit success flag (park reopen)
- _progress_bar_create_noise_texture: symbols.json renames _code_000d16d0
in place (static) to the name the 2001-09-25 Xbox linker maps give; an
empty static step called from progress_bar_setup (call position
inferred from map order; the call is required for emission)
Stable diff: 0 regressions; active parks 206 -> 201.
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>
- _hs_compile_and_evaluate: calls the real static hs_compile_source_error
helper with no source file instead of a hand-written copy (January
inlines the helper here, leaving its dead loop's alignment pad), reuses
the expression parameter; formerly recorded as unreachable
- _inverse_kinematics_adjust_matrices: named squared upper-arm length and
consistent basis-row locals (park reopen)
- _actor_stimulus_prop_acknowledged: MAX clamps, DATUM_INDEX_TO_ABSOLUTE_INDEX,
January's ternary polarity (park reopen)
- _lrar_allocate: found-flag loop allocating inside the fitting arm, as the
sibling _lra_allocate (park reopen)
- _prop_add: reads the dead field back and binds the actor lookup
- _director_script_camera: real director_set_camera helper call and the
admitted bare director_get validation (park reopen)
Stable diff: 0 regressions; active parks 213 -> 209.
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>
Port the reviewed initializer-order closure from af728895 onto campaign base a0bad121. Promote only source/memory/hashtable after strict 10/10 code, target-owned data/ownership, full Halo+libcmt build, semantic, regression, test, and policy gates.