Recover transparent geometry submit (+1,285 meaningful code, zero exact losses); reconcile COMMON ownership and Q10 85+EXT1 credit, actions/main data, and separately disclosed denominator corrections. Preserve canonical-only repairs and all held research. C09 is ordinary disclosed cleanup, not a claim of proven scaffolding intent. Clean rebuild, 1,663 tests, parks, audits, provider links and independent EXT1 check pass. Local reconciliation only.
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.
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>
Structural lane batch 5: zero-credit fuzzy improvement to
_ai_debug_render_actor (24,976 B, still residual); zero regressions.
- Fixes a real defect: the headspace vision cone used the vertical sine
and cosine arrays swapped (January computes i/j from the cosine and k
from the sine).
- Buffer types and scopes follow the debug build's RTC records and
January's slots: textbuffer[1024], tempbuf[80], shared ring/height
loop indices, and one block-scoped offset_point in the paths block.
- Exact-equal instructions rise from 6,181 to 6,472 of 6,662. Frame,
slot set and relocation multiset now all match January. What remains
is x87 operand staging and one tail merge.
Gate: ninja PASS, stable diff 0 gained / 0 regressions, parks 112/0/0,
pytest 1152 passed / 5 skipped / 26 subtests.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A source-correctness landing under the standing "correct source beats a
misleading byte score" ruling. The function stays residual and this is not
scoreboard movement - though here every key improves as well: padded size
25024 -> 25008 against 24976, REAL regions 529 -> 340, and the frame now
matches January exactly, sub esp,0x80c -> 0x810.
Each defect was confirmed by its own January byte window becoming register-blind
identical, and by leave-one-out (dropping any one raises the blind region count).
V1 a real UNINITIALISED READ. January passes lea [ebp-8] and lea [ebp-4] as the
full and partial vision-distance out-pointers and reads [ebp+edx-8] in the
second loop nest: it is ONE real[2] array. Our full_distance_reference[1] was
never written. Fixing it is what brings the frame to 0x810.
P2 an UNREACHABLE ARM. January's je 0x5c5f from both the render_paths_current
test and the has-path test lands on the "following path" status text, so it
sits outside that block; our "no current path" else could never run.
N1 normalize2d writes straight into desired_facing's own cells before the > 0
test, spelled as at actor_combat.c:2304 and eight other AI sites.
X four cross blocks read p0.x, not p1.x (fld [ebp-0x18]): p0.x = p0.x - 0.2f.
P1 the paths block indexes steps by the short local, not the char field.
SR1 the avoidance-objects loop addresses through an element pointer, as at
actor_moving.c:903.
FA2 the flying-axes blocks use the existing __inline helpers scale_vector3d and
point_from_line3d in January's term-major order. These are ordinary calls to
existing helpers, which house rule 13 permits; nothing is written out.
Disclosure the verifier required: FA2 adds twelve (real_point3d *) casts on the
point_from_line3d arguments. All twelve are strip-test inert - the section is
byte-identical with them removed - and the cast is the tree-wide idiom.
Verified: full ninja green; 11,060 function rows and 1,706 section rows diffed
board-wide, 0 worse; ai_debug 59/1 unchanged; no symbol added or removed; the
pre-existing _point_from_line3d guard finding stays at exactly one; parks 181
active / 0 stale / 0 invalid; fake_match_scan 0 findings.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Owner ruling 2026-09-20: land it and re-baseline the fuzzy floor; correct source
outweighs a misleading byte score; grant zero exact credit and document the
backend artifact.
ZERO exact credit. The function stays residual at 24,976 padded bytes and this
is not scoreboard movement.
ai_debug.c:1100 and :1110 had their colour arguments swapped relative to
January. Verified from January's bytes before landing: January pins the color
local in EBX for the whole loop body, selecting white, yellow or aqua at 0x5a7,
0x5c5 and 0x5cd, then pushes EBX at the first site and _global_real_argb_blue at
the second - the latter immediately followed by push 0x3f800000, the 1.f
argument of render_debug_vector. Our source had them exactly reversed. The fix
takes a 480-byte window from 431 differing bytes to 13.
The floor is numerically worse: padded size goes from 24976 to 25024 and REAL
regions from 495 to 529. That previous size equality was never a match - it was
the padding coincidence recorded in wave C, whose "the code length comes back"
claim was already retracted. The new number is an honest floor measured against
correct source. No sibling moved; ai_debug is 59/60 before and after.
The 48 bytes are NOT caused by the colour fix. They are an independent
branch-shortening FIXPOINT, and that is the reusable finding: of the eight
branches where January emits SHORT and we emit NEAR, five have final spans
comfortably inside +/-127, and for one of them January's span and ours are the
identical 123 bytes. Three seed branches one byte over the line block the other
five. It is the largest byte family in the function, has no known source lever,
and is invisible to every region metric - trap #6 at scale. It also explains the
non-additive sizes earlier waves measured.
Corollary that changes the plan here: the 4-byte-short frame is currently paying
for the branch tax, so correcting it in isolation makes the function +39 rather
than +12. No future wave should attack the frame on its own.
Verified: full ninja green, halobetacache 1,460,468 / 7,301 unchanged by this
commit, parks 181 active / 0 stale / 0 invalid.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
None of these three close a function. The board metric is unchanged at
1,458,814 / 7,300 and none of this is scoreboard movement.
_ai_debug_render_actor - binds actor->input.position.head_position to a named
local, which is the recorded accessor-binding law: the inline field reference
folds the offset destructively, while binding it forces the non-destructive
form. It emits January's fsubr [ebx+4] / fsubr [ebx+8] for the first time and
recovers 6 real bytes. Wave E's refutation of the "this family needs a header
prerequisite" claim stands - point_from_line3d and scale_vector3d are already
__inline in real_math.h and already called this way in this file.
_actor_move_vector_avoidance - relocation COUNT goes 140 to 135, which is
January's exactly, and relocation identity goes 5 differing rows to 2. REAL
regions 200 to 180, register-and-frame-blind 100 to 84, frame 0x60ec to 0x60e4
against January's 0x60e0. Key 3 moved AWAY and by more than the padded figure
shows - real-code distance went from +47 to -87 - which is acceptable only
because relocation identity outranks padded size in the lane's ordered key. The
verifier required that disclosure survive into any summary, and it does.
_ai_communication_event - closes 80 of the 176 missing bytes, from 7888 to 7968
against 8064, by writing the actor_get plus actor_type_get_race sequence we were
missing entirely. The separate 72-byte block remains header-blocked on
game_allegiance_get_incidents and was left strictly alone: no header edit and no
consumer-local prototype.
Verified: full ninja green, parks 181 active / 0 stale / 0 invalid, exactly one
gate row moved per unit with none lost, forbid-guards exit 0 on all three units,
fake_match_scan 0 findings on all three files.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
ai_debug _code_00039990 EXACT 848
ai_communication _ai_communication_get_player_rating EXACT 832
source/ai/ai_debug goes 58/60 to 59/60; source/ai/ai_communication 44/48 to
45/48. halobetacache 1,448,422 -> 1,450,093 (7,295 -> 7,297).
Both land as DISCLOSED INFERRED constructs under the owner's standing rule -
TU-private, descriptively named, carrying a comment that says plainly the shape
is inferred from January's bytes and not attested, with the measurement table
that forced it - and both reach STRICT EXACT, which the owner set as the bar.
_code_00039990. The residual was one parenthesised group at a call argument.
I did NOT land the proposer's bare `(point_height+0.15f)`: its adversarial
verifier surveyed all 477 non-vendored .c files and found a whole-argument
parenthesised SUM occurs ZERO times in the tree, and corrected the proposer's
claim that it was "attested 11 times" - the cited ai_debug.c:1722-1724 sites
parenthesise the OPERANDS and leave the top-level sum bare, which is the shape
that does not match. Nine spellings reach exact; I took the one the owner's
ruling names, a TU-private macro `ai_debug_attractor_label_height(height)`,
which also gives the bare 0.15f a name it did not have.
_ai_communication_get_player_rating. Binding the two real_point3d endpoints to
named const pointers before the vector is taken fixes the order in which the
compiler squares the components: an address-of expression and a pointer value
are different operand forms here. CORRECTED BEFORE LANDING - the verifier found
a real error in the comment text that would have shipped: its first row claimed
the untouched spelling already squares k,i,j when it measures k,j,i, which would
have told a future reader the change was unnecessary. Table fixed and
re-verified EXACT.
A park retired: _ai_communication_get_player_rating was parked
`instruction-scheduling`. parked.json 183 -> 182, no other entry touched, never
re-serialized.
Guard note: `--forbid-emitted-symbol _point_from_line3d` exits 1 on ai_debug
both BEFORE and AFTER this change - that file genuinely calls the helper, so the
COMDAT is the known systemic extra-COMDAT gap and not a regression. On
ai_communication it exits 0 before and after. Checked both ways rather than
assumed.
Verified: ninja exit 0; stable_verdicts gained 5 / 5,920 padded bytes with
REGRESSIONS 0; parked 182 active / 0 stale / 0 invalid; audit 0 contradicted /
0 revoked; fake_match_scan 0 findings on both files; diff --check clean.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Three more zero-credit fidelity landings. All three functions remain residual,
so this banks ZERO strict bytes.
ai_debug _ai_debug_render_actor (24,976 B, a third of the portfolio)
FOUR target-proven reconstruction defects plus the NULL-deref fix:
- a wrong constant, 1.6f where January pushes 1.f (immediate census
T14/O13 and T1/O2, the one surviving 1.6f at a site that matches)
- alignment_vector_3d built from control.current_fire_target_aim_vector
instead of output.animation.alignment_vector promoted to 3D with k=0
(+0x6ec is the impulse BOTH builds test, so +0x6f0/+0x6f4 is the 2D
alignment vector, and the local NAME corroborates it)
- p1 taken from control.desired_aiming_vector instead of burst_origin
(+0x64c burst_initial_position is lea'd by both builds for the
preceding line; +0x658 is the adjacent member. Plotting a unit
DIRECTION as a world point in a Burst Geometry block was just wrong)
- an if/else with an inner ternary that made VC7 cross-jump two copies
of the same five-argument render_debug_vector call; one call with a
nested ternary reproduces January three-arm colour block and REMOVES
a duplicated call from our source
frame sub esp 0x81c to 0x80c against January 0x810, i.e. +12 to -4;
relocations 1905 = target; regions 252 to 206; census 58/2 with the whole
per-function gate table byte-identical to pristine.
actor_moving _actor_move_update size 3120 to 3136 = target, relocation
TYPE sequence from about 20 mismatched rows to zero, byte-LCS unmatched
target bytes 455 to 232, regions 142 to 103.
actor_moving _actor_move_vector_avoidance hand-rolled cross-product math
replaced by the existing cross_product3d helper; regions 236 to 227.
TWO CORRECTIONS TO MY OWN RECORD, both from the adversarial verifiers:
1. I wrote that the four fixes make "the code length come back" so the section
is 24,976 again. It does not. January code ends at 0x5ffd with 12 bytes of
trailing pad; pristine and the landing end at 0x6009 with none. Both sections
are 24,976 only because January padding absorbs the difference, which is an
arithmetic coincidence and exactly the padding trap this lane keeps warning
about. The landing stands on the defect fixes and the region and instruction
evidence, NOT on the padded-size argument. Real code is still 12 bytes long.
2. The seed I wrote for that agent was wrong: "January has 31 dword slots and
the candidate has 30, diff the SETS". Both frames are DENSE, so a set diff
localises nothing; January simply has one more granule. The agent said so and
worked from invariant multiset censuses instead.
Verified: ninja exit 0; halobetacache 1,448,422 / 1,770,166 (7,295 / 7,574)
unchanged as expected; stable_verdicts REGRESSIONS 0; parked 183 / 0 / 0; the
--forbid-emitted-symbol _point_from_line3d guard exits 0; diff --check clean.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Ten residuals decoded in parallel, each on its own scratch copy, every proposed
landing re-measured by an adversarial verifier and a third time by the
orchestrator against the pristine tree. Targets were picked by the board
censuses added earlier this session.
EXACT, +1,817 meaningful bytes / +2 functions / 0 regressions:
source/ai/actor_firing_position _pre_evaluator_attack 1120 B
26/27 -> 27/27, THE WHOLE OBJECT CLOSES
source/ai/ai_debug _code_0003a910 704 B
57/60 -> 58/60
_pre_evaluator_attack was the +12 frame class, and the census called it: the
function homed twelve bytes more than January with [ebp-0x40] never referenced
at all - the elided-aggregate-member signature. The cause was a hand-expanded
library idiom, scale_vector3d + add_vectors3d + a real_vector3d temporary,
where January writes point_from_line3d in place. That spelling, casts included,
is verbatim real_math.c:2536 inside point_to_line_distance_squared3d, and the
change is a net deletion. Frames now agree at sub esp,0x34; relocdiff 39/39,
0 differing rows. The verifier confirmed the patched function's RAW bytes are
identical to January's, not merely equal under the normalized hash.
_code_0003a910 is target-proven: January emits ONE fdivr against 1.0f and THREE
fmul, so `scale = 1.0f/vertex_count` then three `*= scale` is its source, not a
rounding liberty; three `/=` divides would emit three fdivs. vehicle_stuck in
units/vehicles.c writes the same centroid the same way.
Landed at explicitly ZERO credit, because both functions remain residual and
both verifiers were emphatic that a residual's potential is not a realized
gain:
ai_debug _ai_debug_render_actor a real off-by-one CORRECTED
actor_perception _actor_perception_update an invented macro replaced by
real_math.h's genuine helper
The render_actor fix is a defect, not byte-steering: `switch (target_type-1)`
with case labels that are the enumerators and _actor_target_none == 0 dispatches
every type onto the previous colour and sends _actor_target_damaging_enemy into
the asserting default arm. January proves the compiler subtracts 1 itself
(`dec eax` where we emitted `add eax,-2`).
A park retired. _pre_evaluator_attack was parked `unclassified`; the frame
census contradicted that class and was right. parked.json 184 -> 183 entries,
no other entry touched, never re-serialized. First park retired by the census;
it says 35 more carry the same kind of evidence.
HELD, not landed, and both are deliberate:
_ai_test_line_of_sight drops an initialiser January lacks, which is
byte-proven, but lands an uninitialised read on a function that stays
residual - the same class as the owner's standing hold on
_actor_emotion_update's out-of-bounds read, and worth zero credit.
_actor_perception_refresh gates strictly EXACT at 2,416 bytes, the biggest
win this wave found, but needs a macro we would be inventing. A five-way
strip test shows ONLY the full canonical macro expansion ((a) * (a))
reaches January - four simpler spellings all stay residual - and neither
of its two hunks works alone. That cuts both ways and the ruling is the
owner's, not a lane orchestrator's. Full evidence in the wave report.
Negatives worth more than some landings: _encounter_create, 23 shapes, no
landing - its -4 frame is not a missing local but which pointer wins EBX, and
the previous wave's "spill slot" reading is refuted by `count` at [ebp-8].
_prop_get_active_by_unit_index, 60 gated builds mapping the entire reachable
image of a 144-byte function to three hashes, January's not among them - a
whole-function ECX/EDX two-colouring. Both agents also caught metric traps
where a shape matches January's instruction count by coincidence while
diverging earlier.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Zero strict bytes, zero regressions; the largest structural recovery in the lane.
_ai_communication_finished goes from 912 bytes / 29 relocations / 305
instructions to 1568 / 86 / 482 against January 1584 / 87 / 484, and objdiff from
42.12 to 91.44 percent. The remaining gap is 16 bytes and ONE relocation, down
from 672 bytes and 58 relocations. All 44 exact siblings preserved.
Found by a per-function string-literal relocation diff over all 34 Lane A
residuals: this function references zero string literals where January references
sixteen, no Lane A unit emits a string absent from the January image, and 32 of
34 residuals have exactly matching string sets. January .rdata supplied the exact
texts, the prologue supplied the 0x650 frame and the [ebp-0x450] message buffer,
and the call sites supplied the asymmetric sprintf-then-csstrcat idiom. Every
debug guard resolved to a real named field of the existing struct ai_debug_state,
so no new type, header, name or declaration was needed.
Also lands ai_debug.c:2281 "has_approach_point>0" -> "has_approach_point" (the
field is a boolean); section size stays at January exact 24976 and differing
regions go 1452 -> 1451.
Rejected from the same candidate: writing the ai_communication_event is-reply
player_rating as a 2.0f literal moves relocations 319 -> 318 against 336 and
instructions 2280 -> 2278 against 2353, i.e. structurally away on both counts.
The rejected-hypotheses file had recorded that probe as never compiled; it is now
compiled and negative.
config/parked.json: one entry re-baselined with refreshed measurements and a new
reopening condition. No park retired, none unrelated touched.
Verification: build unchanged at 1,444,193/1,770,166 (7,292/7,574);
stable_verdicts diff vs the frozen baseline gained 1 / 224 bytes / 0 regressions;
parks 184/0/0; admission 19/0/8/0; fake scan 0 findings in the changed files;
point guard passes; git diff --check clean.
Co-Authored-By: Claude Opus 5 <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.
Wave n2 of the next-150K lane.
- actor_perception _actor_perception_refresh_test_object (+1744).
- ai_debug _code_00041220 (+2336): closed by spelling January's counting loop as
a while loop with the initialiser before it instead of a for with an empty
body. It also carries a names-only rename packet: config/symbols.json line 654
and the three C identifiers become _ai_debug_render_encounter, which is house
rule 7 (no code_<address> names). The name is authenticated by the January map
atlas (scratch/atlas/ai_debug.obj.txt line 44, "00041220 fuzzy ai_debug.obj
_ai_debug_render_encounter"), whose offsets for this object cross-validate
against symbols.json (_ai_debug_dispose_from_old_map 226736, _ai_debug_drawstack
235808, _ai_debug_render 269120), and corroborated by caller topology
(_ai_debug_render passes ai_debug.selected_squad_index), the encounter_* callee
set and the firing-position assert literal. No PDB public exists at 266784,
consistent with the static. The rename carries no additional byte credit.
Rejected and not landed: devices _device_frontfacing (exact, but a live standing
hold) and the decals _debug_decals relabel (symbols.json line 22482 has no object
at 4414816; the worker's own proposal is to delete that entry, which is a config
question, not a landing).
Full ninja, parks 274 active / 0 stale / 0 invalid, stable diff vs
scratch/opus5-next150-before.json: gained 7 / 6,832 padded, regressions 0; fake
scan 0 leads.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Replaces the placeholder ai_debug_actor_record fields and the 0x7D384 block with struct firing_position / firing_position_evaluation_context (layout proven by the retained offset asserts) and renames the consumers in ai_debug.c and actor_firing_position.c (names only). Consumer audit: all 27 ai_debug.h includers rebuilt; 0 strict regressions; the speech-timer park flips to its previously proven second flag-neutral load order (re-measured, evidence appended).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Retain 18 strict exact-function gains across Actions, Actor Combat, Decals, Game Engine, Object Lights, and Bipeds after removing donor bodies that regressed exact objects, emitted unowned code, or violated source-credibility rules. Name authenticated private symbols, move declarations to owner headers, record honest residual parks, and preserve units.obj at 189/189.