# Scenario 5: two-block stacking

Public reproduction note: archive aliases and `SIMCOMPARE_ROOT` are portable placeholders; use your own archive and checkout locations. Private deployment identifiers are omitted.

The same scripted Panda controller and analytic pads as Scenario 4, now picking up a
40 mm / 100 g block, transferring it 100 mm and placing it on a second dynamic block.
The lower block is not anchored. No perception, object-aware corrective feedback,
learned policy, object weld or kinematic object motion is used. Joint feedback remains
active. All engines receive the same frozen target/feedforward tape for each offset.

## Shared protocol

Six seconds: close 0.3–0.8 s; lift 1–1.8 s; transfer 1.8–2.6 s; lower 2.6–3.4 s;
open 3.6–4.0 s; retract 4.2–4.8 s; continue to 6.0 s. Thus two seconds elapse after
full opening. Smooth joint-space motion through common IK waypoints; an 8 mm unloaded
release-clearance target leaves the loaded controller/contact dynamics to determine
actual placement. Gains, force limits, mass/inertia, friction and pad geometry are
unchanged from [the grasp protocol](../grasp/audit.md). No per-engine tuning.

Nominal X offsets from the support centre: 0, 16, 20 and 22 mm. The support is 40 mm
wide. The ideal static edge is therefore 20 mm for a perfectly upright, stationary
cube, but this is not an exact prediction for the moving compliant-contact system.
Both actual COM locations, orientations, contact forces and lower-block motion are logged.

The common fixed table is 0.8 × 0.6 × 0.05 m, enlarged from the initial diagnostic's
narrow tabletop so failed placements land and settle rather than falling out of view.
All reported trials use this same larger surface. Initial diagnostic files are retained.

## Controls: 40 attempted trials, 39 accepted traces

Per engine: four offset trials at dt 1 ms; two 20 mm trials with initial upper-block
perturbations (+1, −1, 0) mm / seed 1 and (−1, +1, 0) mm / seed 2; an exact seed-0 repeat;
a 0.5 ms step check with control still held at 1 kHz; unchanged-position seeds 1 and 2.
The last two isolate seed effects from the deliberately changed initial positions.
These are paired exploratory conditions, not samples estimating real-world success rates.

The Newton 0.5 ms trial was rejected: native cube–table contact-force export contains a
NaN at 5.29 s, and strict JSON serialization stopped rather than publishing it as a valid trace.
Its log and partial diagnostic recording are retained. The cause (solver state versus
force readback) is unresolved. It is not counted as a stacking failure or a completed
half-step validation; there is no zero substitution or accepted replacement run.

## Separate survival from settling

Both outcomes require the condition throughout the final 0.5 s, not just one image:

- **Stack survives:** upper COM lies within ±20 mm of support-local horizontal centre,
  relative height is 40 ± 5 mm, and each block's original Z axis is within 10° of upright.
- **Strictly settled:** additionally, upper-block speed remains below 1 cm/s and upward
  support contact force exceeds 0.05 N at every recorded step.

The strict criterion was defined first. The separate geometric criterion was added
during analysis because Newton could keep a stack standing while contact jitter
tripped the instantaneous speed/contact gate. We retain and report both rather than
label those stacks as toppled. This is exploratory, not preregistered. The orientation
requirement does not identify 90° cube rotations as equivalent. All recorded metrics
remain available in [metrics.json](metrics.json).

## Validation and visualization

Same imported mass/COM/full-inertia component gates (1e-6 absolute SI), initial and
per-step FK position gate (10 µm), arm-limit checks and canonical initial-penetration
check as the grasp fixture. The lower block participates in imported-property checks.
Each inter-block contact is exported once and applied with opposite signs to both
bodies. Contact extraction remains native, not inferred from acceleration.

Contact settings/precision are documented in the grasp audit. They are not equivalent
contact laws across engines. There is no complete independent native collision-margin
audit yet, so differences are not automatically engine bugs or accuracy differences.

Plots and metrics use all native steps. The 3D replay samples every 5 ms plus the endpoint
to keep browser payload manageable. Forces are actual samples, neither time-averaged nor
interpolated; a replay may omit a brief force peak shown in the full-rate plot. Gravity
and contact arrows keep 1 N = 5 cm. Paths track block COMs and the hand frame; joint
efforts stay in the raw traces, not converted into invented Cartesian motor forces.
Linear velocities are backward position differences; unused angular-velocity fields
are zero placeholders. Common meshes display native poses, not engine-rendered footage.

## Reproduction

Observed controls: the inward-X p2 perturbation preserves the stack in all engines;
outward-X p1 does not. Fixed-position seeds and repeat preserve the toppled outcome.
PhysX/CPU recorded frames repeat exactly. Genesis same-seed repeat is exact; seed-only
maximum cube path differences are below 0.00001 mm. Newton's same-seed maximum path
difference is 4.803 mm; seed-only comparisons are 6.911 and 6.693 mm. These are maximum
time-aligned trajectory differences from one baseline, not endpoint differences or
confidence intervals. No CPU/GPU causality conclusion follows from these observations.

state-of-robot-aug-2026/experiments/simcompare: stack_scene.py, stack_run.py,
stack_metrics.py, stack_report.py, setup/stack.py, setup/stack_seeds.py. Adapters are
generalized grasp_native.py / grasp_physx.py / grasp_run.py. Four shared target tapes:
assets/stack-reference-{00,16,20,22}.json, generated offline with remote MuJoCo 3.11.
Every trace stores scene and tape SHA hashes. Accepted raw data: output/archive-rigid/stack-02.
Initial interrupted narrow-table diagnostics: stack-01. No dependency versions changed.

No simulator or GPU is needed to rerun the local report from saved traces. CPU MuJoCo is
not ground truth; the study measures agreement, task sensitivity and repeatability,
not real-world physical accuracy.
