- PhysicsArms: per side 2.0 kg upper arm + 1.2 kg forearm RigidBody3D PD-chasing their
analytic 2-bone IK pose, solved per physics tick from the physical chest shoulders to the
physical hands; no joints (Box3D has no usable shoulder/wrist joint; AGENTS forbids joints
between tracked bodies). Budgets from a 60 kg mass stat: hand 90 < forearm 180 < upper
arm 360 < chest 2400 N. Owns calibration + reach budget (moved from BodyRig); 1 m snap,
non-finite reset, BodyMath.RotationError servo.
- Layer 5 = player arms (mask 1); props/table/floor masks include it; no self-collision.
- BodyRig: visuals only, arms drawn shoulder -> physical elbow -> wrist.
- ArmSpike: track gap 0, swing lag <= 6 cm, arm pushes prop with hand clear, forearm blocked
by bar without tunneling and quiet when pinned, teleport snap, NaN reset — PASS x3.
- CollapseSpike now runs the full body (49/49 x3); all six spikes PASS x3.
- HANDOFF/AGENTS: Stage 2 entry (item 10), layers, tuning table, Stage 2b next steps.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- BodyMath.RotationError: atan2-based shortest-arc error (no NaN, no GetAxis gain collapse
inside 0.16 deg); used by PhysicsTorso orientation servo and PhysicsHands rotation lock
- BodyMath.ResetIfNonFinite escape hatch on torso + hands
- PhysicsHands.Drive extracted (static) so spikes run the real hand chase
- CollapseSpike: deterministic repro (slow yaw drift across a parked chest, 7/40 NaN on old
code) + solver-stacking scenarios (seated chest in table, two-hand-welded 50 kg anvil,
real PropShop) — 49/49 clean after fix, x3; all other spikes PASS x3
- Failure brief RESOLUTION section; HANDOFF/AGENTS updated
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>