# Frozen multi-object sweep comparison

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

The user-approved diagonal pilot 07 is the scene-development source. This is
not a held-out task: layout and motion were developed using MuJoCo CPU. Earlier
pilots and their failures remain in the research archive.

## Shared inputs

- Panda with explicit 150 g rigid paddle, 220 mm wide; arm display meshes are
  non-colliding. Paddle collides with objects AND static obstacles.
- Fifteen bodies: spheres, cubes and cylinders. Density 500 kg/m³; nominal
  friction 0.5. No long bar, no deformables.
- 300 mm passage, 45-degree guide, 15 mm descending ramp, lowered tray.
- Same 12.5 s tape: raise/reposition, diagonal gather, rotate, forward downhill
  push, withdraw, settle. The exact pilot-07 reference arrays are reused.
- Explicit joint controller at 1 kHz; arm KP 4× and KD 2× the original rigid
  fixture, finger gains unchanged, original effort caps. Feedforward includes
  paddle mass and inertia. No object-aware decisions or per-engine gains.
- 1 ms physics steps. Three independent process executions with unchanged
  inputs and seed 0 per backend. These test repeatability, not seed robustness.

For portability, cylinders use the SAME 32-sided convex collision meshes in
all four runs. Their original analytic-cylinder mass/inertia is kept explicitly.
This is a declared approximation and differs from the analytic-cylinder CPU
pilot: the comparison CPU baseline must be rerun, never copied from that pilot.
Rendering uses the same polygonized geometry. Spheres remain analytic; ramps
and guides use shared convex polyhedra. Engines still cook/process those meshes
and solve contact differently.

## Routes and gates

MuJoCo CPU, Newton's MuJoCo-Warp solver on GPU, Genesis rigid GPU, and PhysX
CPU TGS via Isaac Sim, consistent with the earlier rigid-body study. The
deformable PhysX GPU route is not substituted into this comparison.

Frozen model/spec/reference hashes are checked at each run. Mass, COM and
inertia imports must match within 1e-6 SI; initial joint positions and native
FK must match; canonical initial penetration must stay below 1 µm. Native
state/force nonfiniteness, FK drift or arm-limit violation flag a failed trial.
Native collision-law equivalence is NOT implied by passing these gates.
The run driver stops on failed validation before repeating an invalid setup.
Setup repairs require a separately versioned run plan; do not rewrite failures.

## Recordings and interpretation

Native poses and contact readbacks are sampled every 5 ms; peak paddle force
and static-contact counters use every 1 ms. The body snapshots are post-step.
Force-readback timing differs slightly across APIs and is recorded with the
traces. Native force values are diagnostics, not a cross-engine validation of
physical contact forces. No runtime benchmark is inferred from this harness.

Collection is initially an object-centre-in-tray check, not a universal task
success or a proof of support. Preserve complete trajectories, objects left
on the table, falling objects, failed trials and tracking deviations. Report
repeat variability alongside inter-engine differences. Do not choose only the
most visually divergent replicate for publication.

Implementation: `sweep_compare_scene.py`, `sweep_compare_run.py`,
`sweep_genesis.py`, `sweep_physx.py`, existing `grasp_native.py`.
Supervisor driver: `setup/sweep_compare.py` and `.conf`.
Initial remote archive: `SIMCOMPARE_ROOT/results/sweep-compare-01`.
Frozen inputs: `SIMCOMPARE_ROOT/assets/sweep-frozen-01`.

## Published results and reproduction

All twelve trials completed the declared import and finite-state gates. Collection counts:
PhysX 9/9/9, MuJoCo CPU 10/10/10, Newton 11/8/7, Genesis 10/8/8.
These gates do not validate physical contact forces: Genesis paddle-contact peaks reach
6.37–7.52 kN and require investigation before physical interpretation.

The full research archive contains original recordings, frozen sources, environment locks,
and checksums. Deployment endpoints are omitted from this public copy.

Publisher: `publish_sweep_compare.py RESULTS FROZEN OUTPUT`. It verifies frozen hashes,
preserves all three repeats, and writes 20 ms sampled gzip replay bundles.
Original recordings remain at 5 ms; per-step audit peaks use 1 ms.

Newton returns zero-force candidate contact records. The raw contact-record counter
must not be interpreted as a count of physical wall impacts; use force-filtered records.
