{
  "schema_version": "1",
  "id": "genesis-panda-joint-servo",
  "name": "Genesis Panda joint-servo",
  "summary": "Genesis Panda joint-servo. Bounded, source-pinned simulation with an explicit task contract and retained fixed-case outcomes.",
  "capabilities": [
    "simulation",
    "bounded-json",
    "genesis",
    "joint-servo"
  ],
  "aliases": [
    "panda",
    "genesis",
    "joint-servo"
  ],
  "source": {
    "repository": "https://github.com/Genesis-Embodied-AI/genesis-world",
    "commit": "a5c4e9a73aca221fa26e611281f2696c5f8b0ca8",
    "archive_url": "https://codeload.github.com/Genesis-Embodied-AI/genesis-world/tar.gz/a5c4e9a73aca221fa26e611281f2696c5f8b0ca8",
    "archive_sha256": "851d0970b921ee1b5182f62c544f432600153efccc127db059d5f5e46d9ac719",
    "archive_bytes": 88116919,
    "authors": [
      "Original genesis-world contributors; preserve all pinned source and asset notices"
    ],
    "paths": [
      "LICENSE",
      "pyproject.toml",
      "examples/rigid/control_franka.py",
      "genesis/__init__.py",
      "genesis/engine/entities/rigid_entity/rigid_entity.py",
      "genesis/assets/xml/franka_emika_panda/panda.xml"
    ]
  },
  "license": {
    "spdx": "Apache-2.0",
    "url": "https://github.com/Genesis-Embodied-AI/genesis-world/blob/a5c4e9a73aca221fa26e611281f2696c5f8b0ca8/LICENSE",
    "verified": true,
    "scope": "Pinned first-party code terms. Preserve all upstream notices; robot assets and dependencies retain their separate licenses. Hub-authored wrapper is MIT."
  },
  "compatibility": [
    {
      "runtime": "genesis",
      "runtime_version": "1.4.4",
      "robot": "panda",
      "controller": "joint-servo",
      "observation": "privileged_simulator_state",
      "os": "linux",
      "architecture": "x86_64",
      "python": "3.11",
      "status": "hub_verified"
    }
  ],
  "observation": {
    "required": [
      "simulator_state"
    ],
    "privileged_state": true,
    "description": "Privileged simulator observations and goal/state feedback. No physical sensor validation."
  },
  "requirements": {
    "python": ">=3.11,<3.12",
    "packages": [
      "DracoPy==2.2.0",
      "OpenEXR==3.5.2",
      "Pillow==11.3.0",
      "PyGEL3D==0.8.2",
      "PyOpenGL==3.1.10",
      "av==18.1.0",
      "coacd==1.0.14",
      "fast_simplification==0.2.0",
      "freetype-py==2.5.1",
      "frozendict==2.4.7",
      "genesis-world==1.4.4",
      "gs-madrona==0.0.10",
      "libigl==2.6.3",
      "moviepy==2.2.1",
      "mujoco==3.16.0",
      "numba==0.68.0",
      "numpy==1.26.4",
      "opencv-python==4.11.0.86",
      "psutil==7.2.2",
      "py-cpuinfo==9.0.0",
      "pycollada==0.9.3",
      "pydantic==2.14.1",
      "pyglet==2.1.19",
      "pygltflib==1.16.0",
      "pymeshlab==2025.7.post1",
      "pysplashsurf==0.14.1.0",
      "quadrants==1.3.3",
      "rtree==1.4.1",
      "scikit-image==0.26.0",
      "tetgen==0.8.2",
      "torch==2.8.0",
      "trimesh==5.1.1",
      "vtk==9.7.1",
      "xacro==2.1.1",
      "z3-solver==4.15.4.0",
      "zstandard==0.25.0"
    ],
    "hardware": [
      "Linux x86_64; CUDA GPU; see retained receipt for the exact host environment"
    ],
    "rendering": "Headless. EGL libraries are required for MuJoCo imports; PushT uses SDL dummy video. No interactive display.",
    "api_keys": [],
    "network": [
      "Pinned source archive during preparation",
      "PyPI dependencies during explicit installation"
    ],
    "dependency_lock": "Direct runtime versions are pinned and measured. The receipt retains the complete environment freeze; prepare records the installed environment. System drivers are separate host requirements. Some pinned dependencies ship source distributions; explicit dependency installation and build tools may be required."
  },
  "invocation": {
    "entrypoint": "python run.py",
    "argv": [
      "{python}",
      "{recipe_dir}/run.py",
      "--source-dir",
      "{source_dir}",
      "--example"
    ],
    "inputs": {
      "seed": 0,
      "joint_offset_rad": 0.08
    },
    "outputs": {
      "format": "single JSON object",
      "payload_selector": "outputs",
      "schema": {
        "type": "object",
        "required": [
          "arm_joint_positions_rad",
          "target_arm_joint_positions_rad",
          "finger_error_m",
          "movement_m",
          "max_joint_error_rad",
          "cuda_simulation",
          "steps"
        ],
        "properties": {
          "arm_joint_positions_rad": {
            "type": "array",
            "minItems": 7,
            "maxItems": 7,
            "items": {
              "type": "number",
              "minimum": -10,
              "maximum": 10
            },
            "x-unit": "rad",
            "x-order": [
              "joint1",
              "joint2",
              "joint3",
              "joint4",
              "joint5",
              "joint6",
              "joint7"
            ]
          },
          "target_arm_joint_positions_rad": {
            "type": "array",
            "minItems": 7,
            "maxItems": 7,
            "items": {
              "type": "number",
              "minimum": -10,
              "maximum": 10
            },
            "x-unit": "rad",
            "x-order": [
              "joint1",
              "joint2",
              "joint3",
              "joint4",
              "joint5",
              "joint6",
              "joint7"
            ]
          },
          "finger_error_m": {
            "type": "number",
            "minimum": 0,
            "maximum": 1,
            "x-unit": "m"
          },
          "movement_m": {
            "type": "number",
            "minimum": 0,
            "maximum": 50,
            "x-unit": "m"
          },
          "max_joint_error_rad": {
            "type": "number",
            "minimum": 0,
            "maximum": 50,
            "x-unit": "rad"
          },
          "cuda_simulation": {
            "type": "boolean"
          },
          "steps": {
            "type": "integer",
            "minimum": 1,
            "maximum": 1000
          }
        },
        "additionalProperties": false
      }
    },
    "example": "Prepare explicitly; run --example or replace it with --input TASK.json. --describe reads the bounded contract without running simulation."
  },
  "interface": {
    "version": "1",
    "kind": "controller",
    "abstraction_level": 1,
    "execution_domain": "simulation",
    "language": "python",
    "input_transport": "json_file_or_inline",
    "output_transport": "json_stdout",
    "output_selector": "outputs",
    "conventions": {
      "linear_unit": "m",
      "angular_unit": "rad",
      "time_unit": "s",
      "coordinate_frame": "right_handed_world_xyz; +z_up",
      "joint_order": "joint1, joint2, joint3, joint4, joint5, joint6, joint7; finger errors are separate metric distances",
      "quaternion_order": "not_used"
    },
    "input_schema": {
      "type": "object",
      "required": [
        "seed",
        "joint_offset_rad"
      ],
      "properties": {
        "seed": {
          "type": "integer",
          "minimum": 0,
          "maximum": 10000
        },
        "joint_offset_rad": {
          "type": "number",
          "minimum": -0.15,
          "maximum": 0.15,
          "x-unit": "rad"
        }
      },
      "additionalProperties": false
    },
    "output_schema": {
      "type": "object",
      "required": [
        "arm_joint_positions_rad",
        "target_arm_joint_positions_rad",
        "finger_error_m",
        "movement_m",
        "max_joint_error_rad",
        "cuda_simulation",
        "steps"
      ],
      "properties": {
        "arm_joint_positions_rad": {
          "type": "array",
          "minItems": 7,
          "maxItems": 7,
          "items": {
            "type": "number",
            "minimum": -10,
            "maximum": 10
          },
          "x-unit": "rad",
          "x-order": [
            "joint1",
            "joint2",
            "joint3",
            "joint4",
            "joint5",
            "joint6",
            "joint7"
          ]
        },
        "target_arm_joint_positions_rad": {
          "type": "array",
          "minItems": 7,
          "maxItems": 7,
          "items": {
            "type": "number",
            "minimum": -10,
            "maximum": 10
          },
          "x-unit": "rad",
          "x-order": [
            "joint1",
            "joint2",
            "joint3",
            "joint4",
            "joint5",
            "joint6",
            "joint7"
          ]
        },
        "finger_error_m": {
          "type": "number",
          "minimum": 0,
          "maximum": 1,
          "x-unit": "m"
        },
        "movement_m": {
          "type": "number",
          "minimum": 0,
          "maximum": 50,
          "x-unit": "m"
        },
        "max_joint_error_rad": {
          "type": "number",
          "minimum": 0,
          "maximum": 50,
          "x-unit": "rad"
        },
        "cuda_simulation": {
          "type": "boolean"
        },
        "steps": {
          "type": "integer",
          "minimum": 1,
          "maximum": 1000
        }
      },
      "additionalProperties": false
    },
    "preconditions": [
      "Use the exact recorded source, Linux Python 3.11 environment and pinned direct packages.",
      "No physical robot, network actuation or external robot credentials."
    ],
    "postconditions": [
      "All reported checks must be true and all output numbers finite.",
      "Success covers the declared goal and frozen cases, not arbitrary tasks or physical hardware."
    ],
    "failure_codes": [
      "invalid_input_or_environment",
      "execution_failed",
      "task_failed"
    ],
    "composition": {
      "depends_on": [],
      "automatic_frame_conversion": false,
      "automatic_hardware_execution": false
    },
    "origin_reference_ids": [
      "genesis-examples-examples-rigid-control-franka-py"
    ],
    "origin_relationship": "prepared_from_the_same_pinned_model; inspect the declared controller and goal; no physical compatibility is inferred"
  },
  "completion": {
    "success_condition": "All declared goal and finite-state checks pass; exit 0 with task_complete. CUDA dynamic simulation after reset. PD tracking below 0.04 rad and nontrivial hand motion; IK variant also requires final hand position error below 15 mm. Source example kinematic visualization is adapted to real simulation stepping.",
    "timeout_seconds": 600,
    "failure_modes": [
      "Invalid input or source checksum",
      "Different pinned package version",
      "Unavailable runtime/driver",
      "Goal not reached within bounded steps"
    ],
    "stop_condition": "Terminate the adapter at the recorded timeout. No physical hardware is opened."
  },
  "preparation": {
    "recipe_path": "recipes/genesis-panda-joint-servo",
    "requirements_file": "recipes/genesis-panda-joint-servo/requirements.txt",
    "install_argv": [
      "{python}",
      "-m",
      "pip",
      "install",
      "-r",
      "{recipe_dir}/requirements.txt"
    ],
    "execution_separate": true,
    "files": {
      "run.py": "# Hub-authored adapter: MIT. Upstream source/models retain their original licenses.\n\"\"\"Source template for standalone, bounded JSON recipe adapters (MIT, Hub authors).\n\nThe generator embeds this template and a reviewed backend in each published\nrecipe. Importing this template does not import or execute upstream source.\n\"\"\"\nimport argparse\nimport contextlib\nimport hashlib\nimport importlib.util\nimport io\nimport json\nimport math\nimport os\nfrom pathlib import Path\nimport random\nimport sys\n\n\nclass ContractError(ValueError):\n    pass\n\n\ndef validate_data(value, schema, path='$'):\n    \"\"\"Supported, published JSON Schema subset; bool is never a number.\"\"\"\n    kind = schema.get('type')\n    checks = {'object': lambda: isinstance(value, dict), 'array': lambda: isinstance(value, list),\n              'number': lambda: type(value) in (int, float) and math.isfinite(value),\n              'integer': lambda: type(value) is int, 'string': lambda: isinstance(value, str),\n              'boolean': lambda: isinstance(value, bool), 'null': lambda: value is None}\n    if kind and (kind not in checks or not checks[kind]()):\n        raise ContractError(path + ': expected ' + str(kind))\n    if 'enum' in schema and value not in schema['enum']:\n        raise ContractError(path + ': unsupported value')\n    if type(value) in (int, float):\n        if not math.isfinite(value) or value < schema.get('minimum', value) or value > schema.get('maximum', value):\n            raise ContractError(path + ': outside numeric bounds')\n    if isinstance(value, dict):\n        if len(value) > 32: raise ContractError(path + ': too many keys')\n        for name in schema.get('required', []):\n            if name not in value: raise ContractError(path + '.' + name + ': required')\n        props = schema.get('properties', {})\n        for name, item in value.items():\n            if name not in props and schema.get('additionalProperties') is False:\n                raise ContractError(path + '.' + name + ': unknown field')\n            validate_data(item, props.get(name, {}), path + '.' + name)\n    elif isinstance(value, list):\n        if not schema.get('minItems', 0) <= len(value) <= schema.get('maxItems', 4096):\n            raise ContractError(path + ': invalid array length')\n        for i, item in enumerate(value): validate_data(item, schema.get('items', {}), path + '[' + str(i) + ']')\n    elif isinstance(value, str) and len(value) > schema.get('maxLength', 4096):\n        raise ContractError(path + ': string too long')\n\n\ndef verify_source(root, spec):\n    root = Path(root).resolve()\n    for name, expected in spec['source_hashes'].items():\n        target = root / name\n        if target.is_symlink() or not target.resolve().is_relative_to(root) or not target.is_file():\n            raise ContractError('Pinned source missing or outside source root: ' + name)\n        if hashlib.sha256(target.read_bytes()).hexdigest() != expected:\n            raise ContractError('Pinned source checksum changed: ' + name)\n    return root\n\n\ndef load_upstream(root, relative):\n    \"\"\"Only a generator-pinned path is accepted; never a path from task input.\"\"\"\n    target = root / relative\n    for directory in [root, root / 'PathPlanning', target.parent]:\n        sys.path.insert(0, str(directory))\n    module_spec = importlib.util.spec_from_file_location('rsh_upstream', target)\n    module = importlib.util.module_from_spec(module_spec)\n    module_spec.loader.exec_module(module)\n    if hasattr(module, 'show_animation'): module.show_animation = False\n    return module\n\n\ndef clean_json(value):\n    if hasattr(value, 'tolist'): return clean_json(value.tolist())\n    if isinstance(value, dict): return {k: clean_json(v) for k,v in value.items()}\n    if isinstance(value, (tuple, list)): return [clean_json(v) for v in value]\n    if hasattr(value, 'item'): return clean_json(value.item())\n    if isinstance(value, float) and not math.isfinite(value): raise ContractError('Non-finite output')\n    return value\n\n\ndef adapter_main(spec, backend):\n    parser = argparse.ArgumentParser(description=spec['name'])\n    parser.add_argument('--source-dir')\n    group = parser.add_mutually_exclusive_group(required=True)\n    group.add_argument('--input', type=Path, help='UTF-8 JSON file; no code or paths inside task input')\n    group.add_argument('--input-json', help='Inline JSON task input')\n    group.add_argument('--example', action='store_true', help='Run the declared example input')\n    group.add_argument('--describe', action='store_true', help='Read the contract without importing upstream code')\n    args = parser.parse_args()\n    try:\n        if args.describe:\n            print(json.dumps({'skill_id': spec['id'], 'interface': spec['interface'], 'example_input': spec['example']}, allow_nan=False))\n            return 0\n        if args.input:\n            with args.input.open('rb') as stream: raw=stream.read(65537)\n        else: raw=args.input_json.encode() if args.input_json else None\n        if raw is not None and len(raw) > 65536: raise ContractError('Input exceeds 64 KiB')\n        data = json.loads(raw) if raw is not None else spec['example']\n        validate_data(data, spec['interface']['input_schema'])\n        if not args.source_dir: raise ContractError('--source-dir is required for execution')\n        root = verify_source(args.source_dir, spec)\n        os.environ['MPLBACKEND'] = 'Agg'\n        os.environ.setdefault('OMP_NUM_THREADS', '1')\n        random.seed(data.get('seed', 0))\n        # Upstream diagnostic prints do not contaminate the machine response.\n        with contextlib.redirect_stdout(sys.stderr):\n            outputs, checks = backend(root, data, spec)\n        outputs, checks = clean_json(outputs), clean_json(checks)\n        validate_data(outputs, spec['interface']['output_schema'])\n        if not checks or not all(type(v) is bool for v in checks.values()): raise ContractError('Invalid postcondition report')\n        ok = all(checks.values())\n        print(json.dumps({'schema_version':'1','skill_id':spec['id'],'status':'task_complete' if ok else 'task_failed',\n            'success':ok,'outputs':outputs,'checks':checks,'execution_domain':spec['interface']['execution_domain'],\n            'source_commit':spec['source_commit'],'interface_version':'1','hardware_execution':False}, allow_nan=False, separators=(',',':')))\n        return 0 if ok else 1\n    except (ContractError, ValueError, OSError, ImportError) as error:\n        print(json.dumps({'schema_version':'1','skill_id':spec['id'],'status':'failed','success':False,\n            'reason_code':'invalid_input_or_environment','message':str(error),'hardware_execution':False}, allow_nan=False))\n        return 2\n    except Exception as error:\n        print(json.dumps({'schema_version':'1','skill_id':spec['id'],'status':'failed','success':False,\n            'reason_code':'execution_failed','message':str(error)[:1000],'hardware_execution':False}, allow_nan=False))\n        return 1\n\n\n\"\"\"MIT: Genesis Panda PD control and IK-to-dynamic-servo adaptation.\"\"\"\ndef mainstream_backend(root,data,spec):\n    import importlib.metadata\n    import numpy as np\n    import torch\n    sys.path.insert(0,str(root))\n    import genesis as gs\n    for pin in spec['packages']:\n        name,version=pin.split('==')\n        installed=importlib.metadata.version(name).split('+')[0]\n        if installed!=version:raise ContractError('Pinned package version differs: '+name)\n    for relative in ['genesis/__init__.py','genesis/engine/entities/rigid_entity/rigid_entity.py']:\n        installed=Path(gs.__file__).parent/Path(relative).relative_to('genesis')\n        if installed.read_bytes()!=(root/relative).read_bytes():raise ContractError('Installed Genesis code differs: '+relative)\n    gs.init(backend=gs.gpu,precision='32',logging_level='error',seed=data['seed'])\n    scene=gs.Scene(sim_options=gs.options.SimOptions(dt=.01),show_viewer=False)\n    scene.add_entity(gs.morphs.Plane())\n    model=root/'genesis/assets/xml/franka_emika_panda/panda.xml'\n    robot=scene.add_entity(gs.morphs.MJCF(file=str(model)));scene.build()\n    joints=['joint'+str(i) for i in range(1,8)]+['finger_joint1','finger_joint2']\n    indices=[robot.get_joint(name).dofs_idx_local[0] for name in joints]\n    robot.set_dofs_kp(np.array([4500,4500,3500,3500,2000,2000,2000,100,100]),indices)\n    robot.set_dofs_kv(np.array([450,450,350,350,200,200,200,10,10]),indices)\n    robot.set_dofs_force_range(np.array([-87,-87,-87,-87,-12,-12,-12,-100,-100]),np.array([87,87,87,87,12,12,12,100,100]),indices)\n    home=np.array([0,-.5,0,-1.8,0,1.4,.6,.04,.04]);robot.set_dofs_position(home,indices)\n    robot.control_dofs_position(home,indices)\n    for _ in range(100):scene.step()\n    def cpu(value):return value.detach().cpu().numpy()\n    initial=cpu(robot.get_link('hand').get_pos()).copy()\n    if spec['operation']=='cartesian_ik':\n        target=initial+np.asarray(data['target_offset_m'])\n        desired=cpu(robot.inverse_kinematics(link=robot.get_link('hand'),pos=target))\n    else:\n        desired=cpu(robot.get_dofs_position()).copy();desired[indices[0]]+=data['joint_offset_rad'];target=None\n    robot.control_dofs_position(desired)\n    for _ in range(700):scene.step()\n    final=cpu(robot.get_link('hand').get_pos());actual=cpu(robot.get_dofs_position());joint_error=float(np.max(np.abs(actual[indices[:7]]-desired[indices[:7]])))\n    finger_error=float(np.max(np.abs(actual[indices[7:]]-desired[indices[7:]])))\n    movement=float(np.linalg.norm(final-initial));gpu=bool(torch.cuda.is_available() and robot.get_dofs_position().is_cuda)\n    outputs={'arm_joint_positions_rad':actual[indices[:7]].tolist(),'target_arm_joint_positions_rad':desired[indices[:7]].tolist(),\n             'max_joint_error_rad':joint_error,'finger_error_m':finger_error,'movement_m':movement,'cuda_simulation':gpu,'steps':800}\n    checks={'joint_goal_reached':joint_error<.04,'finger_goal_reached':finger_error<.005,'nontrivial_motion':movement>.015,\n            'finite_state':bool(np.isfinite(actual).all()),'cuda_simulation':gpu}\n    if target is not None:\n        error=float(np.linalg.norm(final-target));outputs.update(final_xyz_m=final.tolist(),target_xyz_m=target.tolist(),error_m=error)\n        checks['cartesian_goal_reached']=error<.015\n    return outputs,checks\n\nSPEC = json.loads('{\"id\":\"genesis-panda-joint-servo\",\"name\":\"Genesis Panda joint-servo\",\"backend\":\"genesis\",\"operation\":\"joint-servo\",\"adapter_template\":\"genesis_servo\",\"interface\":{\"version\":\"1\",\"kind\":\"controller\",\"abstraction_level\":1,\"execution_domain\":\"simulation\",\"language\":\"python\",\"input_transport\":\"json_file_or_inline\",\"output_transport\":\"json_stdout\",\"output_selector\":\"outputs\",\"conventions\":{\"linear_unit\":\"m\",\"angular_unit\":\"rad\",\"time_unit\":\"s\",\"coordinate_frame\":\"right_handed_world_xyz; +z_up\",\"joint_order\":\"joint1, joint2, joint3, joint4, joint5, joint6, joint7; finger errors are separate metric distances\",\"quaternion_order\":\"not_used\"},\"input_schema\":{\"type\":\"object\",\"required\":[\"seed\",\"joint_offset_rad\"],\"properties\":{\"seed\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":10000},\"joint_offset_rad\":{\"type\":\"number\",\"minimum\":-0.15,\"maximum\":0.15,\"x-unit\":\"rad\"}},\"additionalProperties\":false},\"output_schema\":{\"type\":\"object\",\"required\":[\"arm_joint_positions_rad\",\"target_arm_joint_positions_rad\",\"finger_error_m\",\"movement_m\",\"max_joint_error_rad\",\"cuda_simulation\",\"steps\"],\"properties\":{\"arm_joint_positions_rad\":{\"type\":\"array\",\"minItems\":7,\"maxItems\":7,\"items\":{\"type\":\"number\",\"minimum\":-10,\"maximum\":10},\"x-unit\":\"rad\",\"x-order\":[\"joint1\",\"joint2\",\"joint3\",\"joint4\",\"joint5\",\"joint6\",\"joint7\"]},\"target_arm_joint_positions_rad\":{\"type\":\"array\",\"minItems\":7,\"maxItems\":7,\"items\":{\"type\":\"number\",\"minimum\":-10,\"maximum\":10},\"x-unit\":\"rad\",\"x-order\":[\"joint1\",\"joint2\",\"joint3\",\"joint4\",\"joint5\",\"joint6\",\"joint7\"]},\"finger_error_m\":{\"type\":\"number\",\"minimum\":0,\"maximum\":1,\"x-unit\":\"m\"},\"movement_m\":{\"type\":\"number\",\"minimum\":0,\"maximum\":50,\"x-unit\":\"m\"},\"max_joint_error_rad\":{\"type\":\"number\",\"minimum\":0,\"maximum\":50,\"x-unit\":\"rad\"},\"cuda_simulation\":{\"type\":\"boolean\"},\"steps\":{\"type\":\"integer\",\"minimum\":1,\"maximum\":1000}},\"additionalProperties\":false},\"preconditions\":[\"Use the exact recorded source, Linux Python 3.11 environment and pinned direct packages.\",\"No physical robot, network actuation or external robot credentials.\"],\"postconditions\":[\"All reported checks must be true and all output numbers finite.\",\"Success covers the declared goal and frozen cases, not arbitrary tasks or physical hardware.\"],\"failure_codes\":[\"invalid_input_or_environment\",\"execution_failed\",\"task_failed\"],\"composition\":{\"depends_on\":[],\"automatic_frame_conversion\":false,\"automatic_hardware_execution\":false}},\"example\":{\"seed\":0,\"joint_offset_rad\":0.08},\"source_hashes\":{\"LICENSE\":\"43070e2d4e532684de521b885f385d0841030efa2b1a20bafb76133a5e1379c1\",\"pyproject.toml\":\"9bfad1a08ba311c27a5c755bee1c4a5d9c4b363dbc3134a96c2f82f9a4f03db6\",\"examples/rigid/control_franka.py\":\"4a17abd38dad0dfaee43a2a43450cf902487a21ddf3d2386873346e194924c2c\",\"genesis/__init__.py\":\"c54d4997ad438981108c42c59d8fbd2036ca52107c4120c9b471cecae118633c\",\"genesis/engine/entities/rigid_entity/rigid_entity.py\":\"62898c01e530fb8de1f8c90e7bc4607d2280c1c52202b579aeb3ef17addbc017\",\"genesis/assets/xml/franka_emika_panda/panda.xml\":\"e502e07fcef6219024be02dfb9cd65d5c194b4767adf381ca51f10172ff8a32d\"},\"summary\":\"Genesis Panda joint-servo. Bounded, source-pinned simulation with an explicit task contract and retained fixed-case outcomes.\",\"observation_description\":\"Privileged simulator observations and goal/state feedback. No physical sensor validation.\",\"goal_scope\":\"CUDA dynamic simulation after reset. PD tracking below 0.04 rad and nontrivial hand motion; IK variant also requires final hand position error below 15 mm. Source example kinematic visualization is adapted to real simulation stepping.\",\"timeout_seconds\":600,\"source_commit\":\"a5c4e9a73aca221fa26e611281f2696c5f8b0ca8\",\"packages\":[\"DracoPy==2.2.0\",\"OpenEXR==3.5.2\",\"Pillow==11.3.0\",\"PyGEL3D==0.8.2\",\"PyOpenGL==3.1.10\",\"av==18.1.0\",\"coacd==1.0.14\",\"fast_simplification==0.2.0\",\"freetype-py==2.5.1\",\"frozendict==2.4.7\",\"genesis-world==1.4.4\",\"gs-madrona==0.0.10\",\"libigl==2.6.3\",\"moviepy==2.2.1\",\"mujoco==3.16.0\",\"numba==0.68.0\",\"numpy==1.26.4\",\"opencv-python==4.11.0.86\",\"psutil==7.2.2\",\"py-cpuinfo==9.0.0\",\"pycollada==0.9.3\",\"pydantic==2.14.1\",\"pyglet==2.1.19\",\"pygltflib==1.16.0\",\"pymeshlab==2025.7.post1\",\"pysplashsurf==0.14.1.0\",\"quadrants==1.3.3\",\"rtree==1.4.1\",\"scikit-image==0.26.0\",\"tetgen==0.8.2\",\"torch==2.8.0\",\"trimesh==5.1.1\",\"vtk==9.7.1\",\"xacro==2.1.1\",\"z3-solver==4.15.4.0\",\"zstandard==0.25.0\"]}')\n\nif __name__ == \"__main__\":\n    raise SystemExit(adapter_main(SPEC, mainstream_backend))\n",
      "requirements.txt": "DracoPy==2.2.0\nOpenEXR==3.5.2\nPillow==11.3.0\nPyGEL3D==0.8.2\nPyOpenGL==3.1.10\nav==18.1.0\ncoacd==1.0.14\nfast_simplification==0.2.0\nfreetype-py==2.5.1\nfrozendict==2.4.7\ngenesis-world==1.4.4\ngs-madrona==0.0.10\nlibigl==2.6.3\nmoviepy==2.2.1\nmujoco==3.16.0\nnumba==0.68.0\nnumpy==1.26.4\nopencv-python==4.11.0.86\npsutil==7.2.2\npy-cpuinfo==9.0.0\npycollada==0.9.3\npydantic==2.14.1\npyglet==2.1.19\npygltflib==1.16.0\npymeshlab==2025.7.post1\npysplashsurf==0.14.1.0\nquadrants==1.3.3\nrtree==1.4.1\nscikit-image==0.26.0\ntetgen==0.8.2\ntorch==2.8.0\ntrimesh==5.1.1\nvtk==9.7.1\nxacro==2.1.1\nz3-solver==4.15.4.0\nzstandard==0.25.0\n",
      "LICENSE": "MIT License\n\nCopyright (c) 2026 Superfast Robotics\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n",
      "LICENSE_SCOPE.md": "# Prepared execution adapter license\n\nThe Hub-authored adapter files in this recipe are MIT licensed; see LICENSE.\nThe source checkout is a separately pinned upstream work. Its original license,\ncopyright and required notices remain applicable. The catalog record's license\ndescribes that upstream source, not a replacement for this adapter's license.\nSeparately licensed dependencies, models, weights, data, firmware and services\nretain their own terms. An adapter's successful simulation or computation does\nnot grant rights to those assets or establish physical robot compatibility.\n"
    }
  },
  "evidence": {
    "level": "task_complete",
    "verified_by": "Hub finite-case Lambda execution harness",
    "date": "2026-10-20",
    "environment": {
      "scope": "simulation",
      "physical_robot": false,
      "platforms": [
        "linux"
      ]
    },
    "commands": [
      "python tools/verify_runtime_expansion.py --backend genesis --source-cache SOURCE_CACHE --output OUTPUT"
    ],
    "result": "All 3 frozen cases completed against this exact adapter and source.",
    "artifacts": [
      "https://raw.githubusercontent.com/Superfast-Robotics/robot-skill-hub/f97266a5cdd2c600cd376397a54892f08290df20/evidence/runtime/diverse-sim-v1/genesis-panda-joint-servo.json"
    ],
    "runtime_verification": "task_complete",
    "contributor_reported": null,
    "hub_verification": {
      "runtime": "task_complete",
      "scope": "simulation",
      "adapter_sha256": "a7e24ef3e6bb98a841b01a1033722c8cc947684d9646535fdc215b86d84cd642",
      "source_commit": "a5c4e9a73aca221fa26e611281f2696c5f8b0ca8",
      "record_version": "1.0.0",
      "case_count": 3,
      "retained_failed_cases": 0
    }
  },
  "maintenance": {
    "record_version": "1.0.0",
    "last_checked": "2026-10-20",
    "upstream_status": "immutable_source_and_explicit_dependencies"
  },
  "contribution": {
    "allowed_paths": [
      "catalog/records/genesis-panda-joint-servo.json",
      "recipes/genesis-panda-joint-servo/run.py",
      "recipes/genesis-panda-joint-servo/requirements.txt",
      "docs/recipes/genesis-panda-joint-servo.md"
    ],
    "instructions": "Change the runtime expansion manifest/template, regenerate, and rerun all frozen cases. Preserve source/model/checkpoint licenses and distinguish simulation from hardware."
  }
}
