{
  "schema": "niua.urdf-oracle/v1",
  "measured": "2026-10-15",
  "contract": "urdf.sim-ready@1",
  "tools": {
    "mujoco": "3.16.0",
    "yourdfpy": "0.0.60",
    "trimesh": "4.10.0"
  },
  "method": {
    "fixtures": "Our own 6-axis desk arm (tools/urdf-sim-ready/build_fixtures.py), 5 good robots and 8 broken copies with one break each; expected.json lists the intended verdict.",
    "gate": "niua-gate run_check against urdf.sim-ready@1 (examples/gate_check.rs).",
    "yourdfpy": "URDF.load with meshes and collision meshes, then validate(); flagged means it raised or validate() returned false.",
    "mujoco": "MjModel.from_xml_path on the URDF with meshdir set to the bundle's meshes; flagged means it did not compile."
  },
  "broken": 8,
  "flagged": {
    "gate": 8,
    "yourdfpy": 1,
    "mujoco": 2
  },
  "rows": [
    {
      "fixture": "bad_identity_inertia.zip",
      "expected": "fail",
      "gate": "fail",
      "gate_rules": "inertial.tensor_valid",
      "yourdfpy": "ok",
      "mujoco": "compiles"
    },
    {
      "fixture": "bad_inverted_limits.zip",
      "expected": "fail",
      "gate": "fail",
      "gate_rules": "joints.limits",
      "yourdfpy": "invalid",
      "mujoco": "compiles"
    },
    {
      "fixture": "bad_missing_collision.zip",
      "expected": "fail",
      "gate": "fail",
      "gate_rules": "collision.on_visual_links",
      "yourdfpy": "ok",
      "mujoco": "compiles"
    },
    {
      "fixture": "bad_missing_mesh.zip",
      "expected": "fail",
      "gate": "fail",
      "gate_rules": "meshes.resolve",
      "yourdfpy": "ok",
      "mujoco": "compiles"
    },
    {
      "fixture": "bad_mm_scale.zip",
      "expected": "fail",
      "gate": "fail",
      "gate_rules": "scale.metres",
      "yourdfpy": "ok",
      "mujoco": "compiles"
    },
    {
      "fixture": "bad_triangle_inequality.zip",
      "expected": "fail",
      "gate": "fail",
      "gate_rules": "inertial.tensor_valid",
      "yourdfpy": "ok",
      "mujoco": "error: Error: inertia must satisfy A + B >= C; use 'balanceinertia' to fix"
    },
    {
      "fixture": "bad_two_roots.zip",
      "expected": "fail",
      "gate": "fail",
      "gate_rules": "tree.valid",
      "yourdfpy": "ok",
      "mujoco": "compiles"
    },
    {
      "fixture": "bad_zero_mass.zip",
      "expected": "fail",
      "gate": "fail",
      "gate_rules": "inertial.mass_positive",
      "yourdfpy": "ok",
      "mujoco": "error: Error: mass and inertia of moving bodies must be larger than mjMINVAL"
    },
    {
      "fixture": "good_arm.zip",
      "expected": "pass",
      "gate": "pass",
      "gate_rules": "-",
      "yourdfpy": "ok",
      "mujoco": "compiles"
    },
    {
      "fixture": "good_arm_mm_scaled.zip",
      "expected": "pass",
      "gate": "pass",
      "gate_rules": "-",
      "yourdfpy": "ok",
      "mujoco": "compiles"
    },
    {
      "fixture": "good_arm_xmlns_xacro.zip",
      "expected": "pass",
      "gate": "pass",
      "gate_rules": "-",
      "yourdfpy": "ok",
      "mujoco": "compiles"
    },
    {
      "fixture": "good_cartpole.urdf",
      "expected": "pass",
      "gate": "pass",
      "gate_rules": "-",
      "yourdfpy": "ok",
      "mujoco": "compiles"
    },
    {
      "fixture": "good_pendulum.urdf",
      "expected": "pass",
      "gate": "pass",
      "gate_rules": "-",
      "yourdfpy": "ok",
      "mujoco": "compiles"
    }
  ]
}
