forgecad-verify-mujoco — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited forgecad-verify-mujoco (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
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.
rm -rf /tmp/forgecad-mjcf && mkdir -p /tmp/forgecad-mjcf
forgecad export mjcf path/to/model.forge.js --output /tmp/forgecad-mjcfscene.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:
uv 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-gridUse --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.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.