Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Verify a ForgeCAD MJCF export in MuJoCo with dynamics, contacts, controls, joint travel, and rendered evidence before calling it simulation-ready.
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-08 | ✗→✓ | ▲ Improved | 101% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 52% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 122% | 0% |
| case-11 | ✗→✓ | ▲ Improved | -6% | 0% |
| case-12 | ✗→✓ | ▲ Improved | -1% | 0% |
Use this when forgecad export mjcf ... is part of the deliverable. A model is not sim-ready just because forgecad check simready passes or the MJCF file loads: it must be loaded in MuJoCo, stepped under gravity, driven with the intended controls, contact pairs inspected, and rendered from useful views.
Routing: geometry-only visual inspection -> forgecad-inspect-model; model authoring/API questions -> forgecad; building a new model -> forgecad-build-model.
bash rm -rf /tmp/forgecad-mjcf && mkdir -p /tmp/forgecad-mjcf forgecad export mjcf path/to/model.forge.js --output /tmp/forgecad-mjcf
scene.xml, not only the model XML, so the floor/camera/package context is included.xmat/xpos. Joint ref/default and connector frames can disagree with visual intuition.Sim.collider.none(...) just to make motion pass. If full visual mesh contact is unstable, use a physically defensible simplified collider or proxy and state what physical surface it represents.This skill ships a MuJoCo smoke verifier:
bashuv run --python 3.11 --with mujoco --with pillow \ python <this-skill-dir>/scripts/mujoco_verify.py /tmp/forgecad-mjcf \ --settle-seconds 2 \ --seconds 8 \ --actuator drum_velocity=-0.75 \ --watch-joint drum_joint \ --expect-drive-cycles drum_joint=-0.06:-0.03 \ --expect-final-qvel drum_joint=-0.02:0.02 \ --render-dir /tmp/forgecad-mjcf/verify \ --camera-preview-grid
Use --actuator name=value more than once for multi-actuator models. Use --expect-drive-cycles joint=min:max to assert signed final-minus-settled revolute travel in cycles/turns. Use --expect-drive-delta joint=min:max when you want raw MuJoCo qpos units instead. Use --expect-final-qvel joint=min:max to assert terminal velocity when the mechanism should stop or continue at a bounded speed. The script prints JSON with root drift, initial-to-final joint delta, post-settle drive delta, derived cycle counts, final velocities, expectation ranges, and top contact pairs, then writes PNG frames if --render-dir is supplied.
Prefer explicit travel envelopes over loose "it moved" checks:
When rendered orientation matters, start with --camera-preview-grid, open camera_preview_grid.png, pick the azimuth that shows the mechanism face or contact interface, then rerun with --camera-azimuth <deg> and any needed --camera-lookat, --camera-distance, or --camera-elevation adjustment. For mechanism evidence, prefer front/front-quarter views for user-facing GIFs and add a side/contact view only when it explains a collision better.
Rendering -> Contact points and Contact forces; use the right-side perturb/visualization panels if available in your build.contype="0" conaffinity="0" and cannot support anything; collision geoms are usually group 3.Report the exact export command, the MuJoCo command/script, key numeric results, the most important contact pairs, and the rendered image paths. Say what was not verified. Never say "sim-ready" when only forgecad run, forgecad check simready, or a successful export was executed.
Other measured skills in the registry, with their headline benchmark lift.