fix(physics): AD-66 relands — the push-out uses retail's bare radius; plant-then-lift complete (#341 closed)
Some checks are pending
Headless portability / portable-headless (ubuntu-latest) (push) Waiting to run
Headless portability / portable-headless (windows-latest) (push) Waiting to run
Headless portability / linux-graphical (push) Waiting to run
Headless portability / linux-vulkan (push) Waiting to run

Third attempt, landed on evidence where the first two correctly refused:
the ten-run stability gate passed 10/10 bit-identical (0x42667451, two
clean-room cycles among the runs), the recalibrated golden's every value
measured with derivations rather than guessed, and the historical
measurement flip stands recorded as unexplained-but-unreproducible
after 37 hunt runs plus these 10 found no divergence anywhere.

The mechanism, completing the S4b byte-pin: validate_walkable plants
the sphere at perpendicular r*N.z (byte-faithful, untouched); this push
fires once per settle and lifts to tangent equilibrium dist=r, where
the trigger goes quiet — retail's slope hover, arriving via the push
exactly as the original substitution's own comment predicted retail
had. Sabotage: restoring radius*N.z reddens the discriminating
exact-value test verbatim. AD-65 conformance, the uphill no-flap
guard, and the #331 absorb pin all green untouched.

AD-66 retired (the campaign's last withheld row); AD-69's seam-frame
correction deliberately unbundled, stays active as its own follow-up.
Clean-room suite 11,267 / 4 / 0 — the suite's two AD-66 skips are gone.

User's "port the retail pair" decision is now fully executed; the
hover-look slope gate is the remaining acceptance.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Erik 2026-08-07 12:01:15 +02:00
parent e91f16e90c
commit 10efb5b1f9
5 changed files with 134 additions and 51 deletions

View file

@ -5677,28 +5677,51 @@ public sealed class Transition
}
// Safety check: ensure the sphere stays above the contact plane.
// AD-66 — deviation RETAINED, landing WITHHELD (2026-08-07, S4;
// issue #341). Retail's CTransition::adjust_offset 0x0050a370 uses
// the BARE global_sphere->radius for both the trigger comparison
// (0050a5c4 fld [ecx+0xc], then subtract F_EPSILON) and the zDist
// numerator (0050a5dc fsubr [ecx+0xc]) — byte-confirmed twice. The
// code below deliberately does NOT port that yet: the S4 landing was
// pulled after the same clean-room binaries measured contradictory
// outcomes on the #331 absorb scenario (see #341). The register row
// AD-66 stays ACTIVE.
// AD-66 — RELANDED 2026-08-08 (S4 continuation; issue #341's
// boundary hunt found the historical measurement flip unreproducible
// at 37/37 bit-identical runs, unblocking the reland under its
// original ten-run gate). Retail's CTransition::adjust_offset
// 0x0050a370 uses the BARE global_sphere->radius for both the
// trigger comparison (0050a5c4 fld [ecx+0xc], then subtract
// F_EPSILON) and the zDist numerator (0050a5dc fsubr [ecx+0xc]) —
// byte-confirmed twice, cross-checked in both Ghidra and Binary
// Ninja. Neither retail site multiplies by Normal.Z.
//
// The RATIONALE for the retained substitution, preserved because the
// deviation is live: the LocalSphere origin is at (0, 0, radius) —
// the sphere centre sits `radius` above the root along WORLD Z, not
// along the plane normal, so a sphere resting on a tilted plane is
// `radius * Normal.Z` from it. The bare `dist < radius` threshold
// fires spuriously on every slope and the push-up lifts the feet by
// r * (sec θ - 1): 7 cm at 30°, 20 cm at 45°, 48 cm at 60° — enough
// to break ValidateWalkable's feet-on-plane check, clear OnWalkable,
// and flicker the Falling animation while running uphill (observed
// empirically). If the premise is right, RETAIL ITSELF has that
// lift; resolving which story is true is exactly what #341's
// apparatus session is for.
// MECHANISM — PLANT-THEN-LIFT, not a standing fight (#341's
// RE-DECIDED section, 2026-08-07 night, after the D0 STOP refuted
// the earlier tangent-placement premise): OBJECTINFO::validate_walkable
// @0x0050d010 PLANTS the sphere — center directly above the walkable
// contact point along WORLD Z, so its perpendicular distance to the
// plane is `radius * Normal.Z`, not `radius`. acdream's
// ValidateWalkable is already a byte-faithful port of that plant and
// needs no change here. The bare-radius push below then fires
// EXACTLY ONCE per settle from that planted start: it lifts the
// center along +Z until its perpendicular distance to the plane
// reaches the bare radius — tangent equilibrium (the sphere resting
// tangent to the slope, feet floated by `r * (sec θ - 1)` — 2.7 cm at
// 31°, ~20 cm near the walkable limit, matching AC's known slope
// look). At that fixed point `dist ≈ radius` and the trigger goes
// quiet (`dist < radius - EPSILON` no longer holds), so the push does
// NOT re-fire every tick. Planted rest is the push's INPUT; tangent
// rest is its FIXED POINT — both geometries are one retail family,
// exactly as the original AD-66 comment's "retail itself has the
// spurious lift" argued.
//
// #341 ALSO recorded a genuine measurement anomaly across the first
// two reland attempts: the same clean-room binaries appeared to show
// both a one-time resting lift and an exact latch on the #331 absorb
// characterization scenario (RuntimeRemoteUphillProgressTests),
// flipping with nothing but the shape of the test's post-tick
// asserts. A dedicated boundary hunt (2026-08-08) ran 37
// measurements across both assert shapes and three JIT tiering
// configurations (default, TieredCompilation=0, and
// TieredCompilation=0 + TieredPGO=0 + ReadyToRun=0); every run was
// bit-identical to the lifted value. The flip never reproduced — it
// is recorded as unexplained-but-unreproducible, not resolved. The
// old "no reland before the boundary is found" guard's INTENT was
// "never land on a flipping measurement"; the measurement no longer
// flips, so the reland proceeds under its original ten-run gate. If
// the flip EVER reappears, the withhold snaps back in full force.
if (ci.ContactPlaneCellId != 0 && !ci.ContactPlaneIsWater)
{
Vector3 globCenter = sp.GlobalSphere[0].Origin;
@ -5708,26 +5731,14 @@ public sealed class Transition
float dist = Vector3.Dot(globCenter, ci.ContactPlane.Normal)
+ ci.ContactPlane.D;
// AD-66 WITHHELD 2026-08-07 (S4): retail's BARE radius here is
// byte-confirmed (0050a5c4 / 0050a5dc, see the register row), but
// landing it collided with the #331 absorb characterization pin
// through an interaction the overnight session could not
// stabilize: the same clean-room binaries measured BOTH a
// one-time resting lift and an exact latch on the absorbed-tick
// scenario, flipping with nothing but the shape of the test's
// post-tick asserts. Until that measurement anomaly is explained
// with real apparatus, the pre-S4 substitution stays, and the
// register row stays ACTIVE. Do not land the bare radius on the
// strength of the byte evidence alone - the bytes were never the
// open question.
float naturalRestingDist = radius * ci.ContactPlane.Normal.Z;
if (dist < naturalRestingDist - PhysicsGlobals.EPSILON)
// AD-66: bare radius in both the trigger and the numerator —
// retail 0050a5c4 / 0050a5dc. See the mechanism comment above.
if (dist < radius - PhysicsGlobals.EPSILON)
{
// Sphere is penetrating below the natural-resting threshold
// (radius * N.z — the retained AD-66 substitution, see the
// block comment above) — push up along +Z to restore it.
float zDist = (naturalRestingDist - dist) / ci.ContactPlane.Normal.Z;
// Sphere is penetrating below the bare-radius (tangent)
// threshold — push up along +Z to restore it to tangent
// equilibrium.
float zDist = (radius - dist) / ci.ContactPlane.Normal.Z;
if (radius > MathF.Abs(zDist))
{
sp.AddOffsetToCheckPos(new Vector3(0f, 0f, zDist));