Land the research campaign's two Tier A closures (+1,184 meaningful)

Both come from LAW M8, measured by the corpus-scale x87 study: for the
displacement-0 term of an inlined helper on &x->field arguments, VC7 loads first
the operand with the smaller IL-local ordinal (mod 8), so one real local too many
or too few flips it. The same study proved source operand order is INERT for a
bare product (p->a*p->b compiles identically to p->b*p->a), so the R3 operand
swap was never just inadmissible - it never worked. These fixes change the local
set, not the operand order.

- player_effects _player_effect_start (735, park reopened and removed): the three
  field stores relative.i/j/k = dot_product3d(...) become one
  set_real_vector3d(&relative, dot, dot, dot) call (laws_w2 A4 helper routing).
  The park's criterion - natural same-compiler evidence for the final commutative
  operand order - is satisfied by M8.
- actor_moving _actor_get_stopping_distances (449): the `long vehicle_driver_type`
  local and its range test become a switch over the two driver enum constants
  (M8, plus A9 switch width). Semantics are unchanged: _hovering_ground (2) and
  _nondirectional_ground (3) are adjacent in actors.h, so the range and the two
  cases select exactly the same values, and the same TU already switches on
  actor->input.vehicle_driver_type at line 3190. M8 is the new law that lifts this
  row's do-not-repeat tag.

Verified independently of the study: each whole-TU gate changes exactly one row
(residual -> EXACT) with every other exact row intact, the _point_from_line3d
guard passes, player_effects' other two parks are unchanged, and fake_match_scan
reports 0 leads. Full ninja, parks 272 active / 0 stale / 0 invalid, stable diff
vs scratch/opus5-next150-before.json: gained 10 / 8,528 padded, regressions 0.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Jonas VolmanandClaude Opus 5 committed 2026-09-16 03:36:41 -07:00
1 parent 6e26c8ed93
commit 417fc10e48
3 files changed
+10 -26

No files matched your search

-19
View File
@@ -3022,25 +3022,6 @@
"objdiff_percent": 96.454544
}
},
{
"unit": "source/effects/player_effects",
"function": "_player_effect_start",
"class": "instruction-scheduling",
"evidence": "Fuzzy-parked under the current house rule after reconstructing the complete typed public damage-feedback entry point from January's ABI, assert, random-seed lock lifetime, definition fields, calls, branch topology, and indicator math, with the preserved Opus donor at 608c66380 and independent HCEA code at 570c83fd corroborating the behavior and semantic name. Target and candidate both occupy 736 padded bytes, contain 247 instructions, and carry the same 35 ordered relocation identities; objdiff reports 99.99187 percent similarity. The only instruction-byte difference is the interchangeable load side of one commutative multiplication in the inlined camera-left dot product. The source retains typed player, unit, object, tag, observer, sound, rumble, and math access; uses the authenticated bit-8 damage-indicator enum name; and keeps owner prototypes in player_effects.h and random_math.h. A shared owner-header enum insertion was rejected because a full rebuild reopened the protected units.obj node-orientation sentinel; the named constant is therefore TU-private. No raw offset, false type or prototype, representation pun, volatile/register forcing, barrier, pragma, assembly, fake dependency, forced inline, undefined behavior, or nonsensical branch is retained. Reopen only for authoritative January source/local records or natural same-compiler evidence for the final commutative operand order.",
"measurements": {
"target": {
"size": 736,
"relocation_count": 35,
"normalized_sha256": "33e471ae9bb2e73c5aaabb039c2c574847ed5f611ef728aefd5af9394e526b08"
},
"base": {
"size": 736,
"relocation_count": 35,
"normalized_sha256": "997d1f3474a758ef05783af0fb2927e46cf5e3e1505e340540f171b47ad13b21"
},
"objdiff_percent": 99.99187
}
},
{
"unit": "source/objects/damage",
"function": "_area_of_effect_cause_damage_to_object",
+6 -4
View File
@@ -1130,10 +1130,10 @@ void actor_get_stopping_distances(
if (actor->input.vehicle_index != NONE)
{
long vehicle_driver_type = actor->input.vehicle_driver_type;
if (vehicle_driver_type >= _actor_vehicle_driver_hovering_ground &&
vehicle_driver_type <= _actor_vehicle_driver_nondirectional_ground)
switch (actor->input.vehicle_driver_type)
{
case _actor_vehicle_driver_hovering_ground:
case _actor_vehicle_driver_nondirectional_ground:
{
struct unit_datum *vehicle = vehicle_get(actor->input.vehicle_index);
struct vehicle_definition *definition =
@@ -1145,6 +1145,8 @@ void actor_get_stopping_distances(
reference_speed = definition->maximum_forward_speed;
deceleration = definition->speed_acceleration;
stopping_deceleration = deceleration;
break;
}
}
}
else if (actor->meta.unit_index != NONE)
+4 -3
View File
@@ -1235,9 +1235,10 @@ void player_effect_start(
&delta);
cross_product3d(&camera->forward, &camera->up, &left);
relative.i = dot_product3d(&left, &delta);
relative.j = dot_product3d(&delta, &camera->forward);
relative.k = dot_product3d(&delta, &camera->up);
set_real_vector3d(&relative,
dot_product3d(&left, &delta),
dot_product3d(&delta, &camera->forward),
dot_product3d(&delta, &camera->up));
if (normalize3d(&relative) != 0.0f)
{