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.
Independently verified donors 8202ac13 and a448c595. Natural single-exit bitmap tail and first-party-correlated outer-arm width stores yield 714 meaningful / 736 padded bytes with zero inherited exact losses. Retire precisely their two freshly exact scheduling parks. No whole-object admission, helper/storage changes or new policy exception.
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Owner ruling 2026-09-25 narrowly reopens the fighter on new first-party and
link evidence. The hand-written 2D yaw expression becomes cross_product2d
over the two /Od-attested 3D-to-2D views. The body is debug exact, verbatim
in Oct-2001 2276P and matches the Sept-2001 cache.exe map body. The new
SELECT_ANY _cross_product2d now passes the selected-provider link against
actor_combat. +1,088 padded; vehicles 38/39.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Approved packets, no owner ruling needed:
- real_math.h plane3d_negate gets its attested body (negate_vector3d plus
the d term; /Od 0x56d630 and the HCEX_Release line table), together with
the render_objects /Od shadow-volume plane pair and the bipeds genuine
helper calls. _biped_find_nearby_support_surface is now exact (+544). A
467-unit header review lost 0 exact rows. The bipeds park is retired, and
render_cameras _render_camera_build_frustum is refreshed to
3408/112/d42e420f (target unchanged).
- biped_falling_danger, update_airborne, snap_facing, update_moving and
fudge_vectors become file-static, as the Sept-2001 map STATIC list and the
retail private ABI show. Their prototypes leave bipeds.h and symbols.json
marks them static. This is zero credit; bipeds pdb_storage goes to 0. The
parked ai _ai_test_ballistic_line_of_fire is rebaselined for the resulting
declaration-count drift; no exact row is lost.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
All packets passed a precedent audit and an independent adversarial review.
No object changes status.
- Storage per cachebeta publics (source static + symbols.json rows):
- bink_playback: four globals;
- weapons: 11 rows + weapon_magazine_finish_reload;
- object_lights: 4 helpers; should_render_lights is the /Od-attested call and
its prototype leaves the public header;
- vehicles: _update_turret_physics;
- weather_particle_systems: one_over_char_max is external (cachebeta public,
HCEX Global); its globals are static;
- rasterizer_xbox_debug: 8 D3DINLINE wrapper rows (already Matching: audit
FAIL(8) -> PASS, pdb 8 -> 0).
- draw_string: the invented external draw_string_globals aggregate (pads, blob,
#define aliases) becomes four HCEX-attested file statics in /Od declaration
order with = { 0 } (a595bbc2 precedent); typed multitexture params.
- render_debug: three rule-6 hand expansions become real point_from_line3d
calls (ruling #1/#2); the opaque vehicle view gives way to struct
vehicle_datum + vehicle_datum_try_and_get; the six debug_* toggles become
tentative definitions (COMMON evidence).
- vehicles: the TU-wide REAL_MATH_EXTERNAL_POINT_FROM_LINE3D define is gone and
the pathfinding hand expansion becomes the genuine call (ruling #1).
- rasterizer_xbox_profile V1R (reviewer-amended): byte-inert /Od parameter
order, the BUG marker comment, detail_objects via the rasterizer_xbox.h API,
and a rejection text that keeps the SDK-table policy question open.
- semantic_data_matches.json: single-section '$'-defect entries with
allow_incomplete_unit for projectiles _projectile_update_section (1,548 B) and
object_lights _lights_section (1,541 B) (leaf_map / editor_flying_camera /
race precedents).
Gate (full ninja, objdiff 3.3.1): objects 384 (unchanged), code unchanged,
data +3,089; stable diff 0 regressions; parks 83/0/0; admission 10/0/2/0; fake
scan 26; pytest 1159 passed; diff --check clean.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
realcmp appears in January's own assert strings in four objects
(actors, actor_moving, matrix_math, biped_limp_noodle), so it is a
shared Bungie math macro. Define it once in real_math.h's macros
section, using an existing blank line so no header line number moves.
Blank the four identical TU-local copies in actors.c, actor_looking.c
(with its now-stale comment), matrix_math.c and biped_limp_noodle.c.
They are blanked, not deleted, so no __LINE__ moves.
realcmp_epsilon is untouched.
_convex_hull2d returns to direct points[index] indexing. The /Od build
(0x6b9250) reads the parameter array at every site ([eax+edx*8+4]),
with no pointer locals. It uses realcmp at the two degeneracy tests.
The function is now strict exact: 784 padded / 770 meaningful bytes,
25 relocations, normalized sha256
49124afa1d48d20fe6b36cd5c98861de7d27d9ec0109cf7d8dba8812c5464e77. With
the plain fabs(...) < _real_epsilon spelling it is not exact, so the
genuine macro is load-bearing. No new view cast, no new helper
definitions (nothing to link). _convex_polygon2d_clip_to_plane is not
pursued.
The now-stale _convex_hull2d park is retired with
tools.campaign.unpark --write (1 removed, 102 retained).
Verification: full ninja; all 273 real_math.h consumers rebuilt with
no C4005/C4013; stable diff vs frozen 8,245-function baseline
+2 (_collision_debug_render 4,192, _convex_hull2d 784 padded) and 0
regressions; parks 102/0/0; admission audit 13/0/7/0; fake-match scan
unchanged on all six files; python -m pytest -q tools 1154 passed;
git diff --check clean. objdiff 3.3.1 as canonical.
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:
ai/actor_type_flood :: _actor_type_flood_desire_shamble 1296 (object now 2/2)
units/vehicles :: _update_human_plane_physics 928
ai/path_smoothing :: _find_tangent_point 336 (object now 6/6)
OWNER ADMISSION (2026-09-21), quoted: "Sufficient: admit the class. Require a
genuine shared-header __inline, byte-identical COMDAT, strict-exact caller, full
ownership/build sweep, and zero regressions. No hand expansions."
Each landing newly emits ONE header-inline COMDAT that January's split credits
to another object. Conditions verified per landing by scratch/orch/admit_check.py:
_real_random_range 32 B math/real_math.h January owner ai/action_alert byte-identical
_interpolate_scalar 64 B math/real_math.h January owner game/player_control byte-identical
_set_real_point2d 32 B math/real_math.h January owner ai/path_obstacles byte-identical
All three callers are strict exact; no hand expansion is used anywhere in them.
The evidence the owner accepted:
(1) Compiler (scratch/orch/inline_lab.py): VC7 13.00.9254 with the campaign's
real flags (/O2 /Oy- /DDEBUG /Dxbox) emits the out-of-line COMDAT for a
non-static __inline whose EVERY call site inlined, and emits nothing when
the inline is unused - so emission implies use in that TU.
(2) January's own image (scratch/orch/inline_owner_census.py): of 104
header-inline COMDATs, 65 are owned - per January's PDB section
contributions - by an object that holds ZERO references to them (e.g.
_cross_product2d in actor_combat.obj). Owners cluster at the earliest
link-order TUs, as "folded survivor = first emitter" predicts. The split's
single definition is therefore a link-fold artifact, not evidence that the
other TUs did not emit the COMDAT.
Source evidence (all read from the first-party /Od build first, then confirmed
in January's bytes):
- _actor_type_flood_desire_shamble: result/switching flags zeroed at the top, all
six `result = FALSE` arms, chain-assigned counters, `--timer == 0`, per-arm
two-argument helper calls, MAX with double evaluation; `< 15.0f` confirmed by
January's `test ah,5`. real_random_range is byte-REQUIRED (a hand expansion
measures 1280 != 1296; January shows the inlined parameter temporaries).
- _update_human_plane_physics: uses the real interpolate_scalar helper.
- _find_tangent_point: every call is a real real_math.h helper including
set_real_point2d; store-by-store spellings are residual and worse than baseline.
Held alongside (NOT landed): _update_alien_fighter_physics_new (1,088, exact in
scratch) - needs a NEW 3D->2D view cast whose site is not /Od-attested; owner:
"keep the fighter held".
Config: config/parked.json - _actor_type_flood_desire_shamble entry removed
(now exact). Parks 173 / 0 / 0. No header, symbols.json, flag or tool change.
Verification: full ninja all_source progress semantic_progress pass (Code
1451421 -> 1453966, 7306 -> 7309). stable_verdicts vs the FROZEN baseline:
gained 18 / 10128 bytes, regressions 0. All 11,060 function and 1,706 section
report rows: 0 lost 100%, 0 missing. Guard, fake scan, line endings and the
new-punning-cast screen clean. git diff --check clean.
Reviewer: independent adversarial agents confirmed each body EXACT and credible
and held them ONLY on the ownership question the owner has now ruled on.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
ZERO exact credit. Better-evidenced source retained per house rule 11; none of
these functions is parked, so no park entry moves.
- ai/actor_type_infection.c _infection_swarm_control (3,616 B): partial rewrite
from January's bytes. Baseline was 256 bytes short with a wrong frame and a
wrong constant multiset (missing 1.0f, -1/15, (double)1e-4f, +/-pi/2; an extra
_normalize3d call). Now residual [sha] ONLY: size 3616 == 3616 and relocations
104 == 104. Side effect: the unit's .rdata section (228 B) now matches January
(data +228, not counted as Lane B code credit). Adds the include of
ai_scenario_definitions.h for the _ai_atom_move_facing_* enum the recovered
obey-facing switch needs (no header edited).
- units/bipeds.c _biped_update_moving (4,080 B): four in-function corrections,
each read from January: `0.01f` not the double `0.01` (January's constant is
__real@3f847ae140000000 = (double)0.01f); `!(fabs(dyaw) < _real_epsilon)`;
the two ground_tangential_* stores in January's order; no (short) cast on
actor_index. The reviewer measured the worker's file-scope `realcmp` macro as
byte-inert and it was DROPPED (strip test). Still residual [size, sha].
- physics/physics.c _physics_update_old (5,168 B): rotation_axis is assigned
immediately before normalize3d, after object_translate - a store cannot cross
a call, so its position relative to the call IS January's statement order.
The reviewer REJECTED the rest of the physics candidate (21
PHYSICS_POINT_FROM_LINE3D macro sites and body rewrites) pending an owner
ruling; only this two-line change lands.
Verification: same full build and sweeps as the preceding strict commit -
0 exact regressions, 0 report rows lost, parks 180 / 0 / 0.
Reviewer: independent adversarial agent, ACCEPT_FUZZY_ZERO_CREDIT for each;
partial-landing files produced by the reviewers and re-verified by the
orchestrator (unitcheck NO LOSS, guard, ownership, fake scan, line endings).
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>
Integrate six accepted exact functions, two whole-object admissions, evidence-backed zero-credit source corrections, owner-header cleanup, and curated campaign records. Preserve zero regressions and exclude generated scratch archives from canonical history.
Owner-unblocked units, reviewed reconstructions, each strict exact in its
whole-TU gate with zero inherited losses, guard passing, no new owners:
- vehicles: _vehicle_update with cross/dot helpers on the object fields
(removes two invented static carriers), vehicle-type switch, PIN
- network_connection: read_unreliable/read_reliable single-exit bodies
with January's literals (including the '#d' typo) and a reset flag,
read assert text, get_address per-path clears, idle and
idle_server_reliable_endpoint (six park reopens)
- transport_endpoint_winsock: connect_endpoint_async, write_to_endpoint,
read_from_endpoint single-exit results (three park reopens)
- transport_endpoint_set_winsock: remove_endpoint_from_set single exit
Rejected: _poll_endpoint_set (negative-result clamp chosen to steer block
order), _add_endpoint_to_set (identical FD_SET branches),
_action_obey_command_begin (redundant store), _actor_action_try_to_dive
(units.h prototype contradicting its definition).
Stable diff vs 9062b1e96: 0 regressions; parks 250 -> 240.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Header packet from wave w3b (adversarially verified). action_flee.c called unit_start_running_blindly (units.c) and unit_is_speaking (unit_dialogue.c) through C4013 implicit declarations. Their genuine owner prototypes are added to units.h under prototypes/UNITS.C and prototypes/UNIT_DIALOGUE.C. With them, the parked _action_flee_perform (864, body unchanged since its w2 re-measure) is strict exact and unparked. Both prototypes are required together: the first alone regresses units::_unit_preprocess_node_orientations by declaration count (measured).
Live tree: full ninja + whole-board stable sweep +1 gained / 0 regressions (units.obj unchanged). The already-fuzzy ai_communication park _ai_communication_update_speech_timers (672/43) returns to its documented alternate hash under the new declaration count and is re-measured with appended evidence; parks 279/0/0.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Header packet from wave w3 (adversarially verified). bipeds.c called unit_animation_start_action, unit_cause_player_melee_damage, unit_update_animation (units.c owners) and weapon_stop_reload, weapon_prevents_melee_attack (weapons.c owners) through C4013 implicit declarations. Their genuine owner prototypes are added to units.h (with a struct unit_animation_update_data forward declaration) and weapons.h. With them, _biped_update (1120) is strict exact: January's case block order (moving arms before idle), the 0.1f*0.1f throttle literal (3c23d70b), and direct stores to player_melee_ticks / player_melee_attack_tick with a short melee_speedup_ticks. The header and source land in one commit because the header alone moves the parked _biped_update hash (the ninja park check would fail on an intermediate commit).
Consumer blast (76 units compiled H vs P, including units.c, vehicles.c, weapons.c): only bipeds::_biped_update and the non-exact unparked physics::_physics_update_old hash changed. Live tree: full ninja + whole-board stable sweep +1 gained / 0 regressions; park removed; parks 284/0/0.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Header packet P4 (150K lane). January's only external caller, ai_script.obj, tests the result with a full 32-bit cmp eax,-1 (no sign extension); the short prototype produced cmp ax,0xffff. The owner prototype and the bipeds.c definition now return long and the unevidenced (short) cast is dropped; declaration count unchanged, callee bytes unchanged. _ai_scripting_teleport_starting_location_private (288) becomes strict exact with an untouched body, so its park (premise: the widening perturbs consumers) is removed.
Consumers: 23 bipeds.h includers, shadow-compiled H vs P (0 losses). Live tree: full ninja + stable_verdicts sweep +1 gained / 0 regressions; parks 290/0/0.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Wave w2 landing, adversarially verified. park reopens: _biped_fix_position. Full ninja build and per-function stable_verdicts sweep: 0 regressions. 1 park(s) removed.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
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>