# Controlled stop jerk-limited trajectory

Controlled stop jerk-limited trajectory. Parameterized bounded JSON adapter; numerical operation, no hardware execution.

Record version: `1.0.0` · Hub commit: `39b06d7a6016edcea27e348e49ffd86f29ec1811`

## Executable interface

```json
{
  "version": "1",
  "kind": "trajectory_generator",
  "abstraction_level": 0,
  "execution_domain": "computation",
  "language": "python",
  "input_transport": "json_file_or_inline",
  "output_transport": "json_stdout",
  "conventions": {
    "linear_unit": "m",
    "angular_unit": "rad",
    "time_unit": "s",
    "coordinate_frame": "independent_axes_in_input_array_order",
    "joint_order": "input_array_order",
    "quaternion_order": "not_used"
  },
  "input_schema": {
    "type": "object",
    "required": [
      "current_position",
      "current_velocity",
      "current_acceleration",
      "target_position",
      "target_velocity",
      "target_acceleration",
      "max_velocity",
      "max_acceleration",
      "max_jerk",
      "dt",
      "coordinate_type",
      "stop_time"
    ],
    "additionalProperties": false,
    "properties": {
      "current_position": {
        "type": "array",
        "minItems": 1,
        "maxItems": 8,
        "items": {
          "type": "number",
          "minimum": -10,
          "maximum": 10
        },
        "x-unit": "coordinate_type:m_or_rad",
        "x-frame": "independent_axes_in_input_array_order",
        "description": "current_position; units=coordinate_type:m_or_rad; frame=independent_axes_in_input_array_order"
      },
      "current_velocity": {
        "type": "array",
        "minItems": 1,
        "maxItems": 8,
        "items": {
          "type": "number",
          "minimum": -10,
          "maximum": 10
        },
        "x-unit": "coordinate_type:m/s_or_rad/s",
        "x-frame": "independent_axes_in_input_array_order",
        "description": "current_velocity; units=coordinate_type:m/s_or_rad/s; frame=independent_axes_in_input_array_order"
      },
      "current_acceleration": {
        "type": "array",
        "minItems": 1,
        "maxItems": 8,
        "items": {
          "type": "number",
          "minimum": -10,
          "maximum": 10
        },
        "x-unit": "coordinate_type:m/s^2_or_rad/s^2",
        "x-frame": "independent_axes_in_input_array_order",
        "description": "current_acceleration; units=coordinate_type:m/s^2_or_rad/s^2; frame=independent_axes_in_input_array_order"
      },
      "target_position": {
        "type": "array",
        "minItems": 1,
        "maxItems": 8,
        "items": {
          "type": "number",
          "minimum": -10,
          "maximum": 10
        },
        "x-unit": "coordinate_type:m_or_rad",
        "x-frame": "independent_axes_in_input_array_order",
        "description": "target_position; units=coordinate_type:m_or_rad; frame=independent_axes_in_input_array_order"
      },
      "target_velocity": {
        "type": "array",
        "minItems": 1,
        "maxItems": 8,
        "items": {
          "type": "number",
          "minimum": -10,
          "maximum": 10
        },
        "x-unit": "coordinate_type:m/s_or_rad/s",
        "x-frame": "independent_axes_in_input_array_order",
        "description": "target_velocity; units=coordinate_type:m/s_or_rad/s; frame=independent_axes_in_input_array_order"
      },
      "target_acceleration": {
        "type": "array",
        "minItems": 1,
        "maxItems": 8,
        "items": {
          "type": "number",
          "minimum": -10,
          "maximum": 10
        },
        "x-unit": "coordinate_type:m/s^2_or_rad/s^2",
        "x-frame": "independent_axes_in_input_array_order",
        "description": "target_acceleration; units=coordinate_type:m/s^2_or_rad/s^2; frame=independent_axes_in_input_array_order"
      },
      "max_velocity": {
        "type": "array",
        "minItems": 1,
        "maxItems": 8,
        "items": {
          "type": "number",
          "minimum": -10,
          "maximum": 10
        },
        "x-unit": "coordinate_type:m/s_or_rad/s",
        "x-frame": "independent_axes_in_input_array_order",
        "description": "max_velocity; units=coordinate_type:m/s_or_rad/s; frame=independent_axes_in_input_array_order"
      },
      "max_acceleration": {
        "type": "array",
        "minItems": 1,
        "maxItems": 8,
        "items": {
          "type": "number",
          "minimum": -10,
          "maximum": 10
        },
        "x-unit": "coordinate_type:m/s^2_or_rad/s^2",
        "x-frame": "independent_axes_in_input_array_order",
        "description": "max_acceleration; units=coordinate_type:m/s^2_or_rad/s^2; frame=independent_axes_in_input_array_order"
      },
      "max_jerk": {
        "type": "array",
        "minItems": 1,
        "maxItems": 8,
        "items": {
          "type": "number",
          "minimum": -10,
          "maximum": 10
        },
        "x-unit": "coordinate_type:m/s^3_or_rad/s^3",
        "x-frame": "independent_axes_in_input_array_order",
        "description": "max_jerk; units=coordinate_type:m/s^3_or_rad/s^3; frame=independent_axes_in_input_array_order"
      },
      "dt": {
        "type": "number",
        "minimum": 0.01,
        "maximum": 0.05,
        "x-unit": "s",
        "x-frame": "independent_axes_in_input_array_order",
        "description": "dt; units=s; frame=independent_axes_in_input_array_order"
      },
      "coordinate_type": {
        "type": "string",
        "enum": [
          "revolute_rad",
          "linear_m"
        ],
        "x-unit": "dimensionless",
        "x-frame": "independent_axes_in_input_array_order",
        "description": "coordinate_type; units=dimensionless; frame=independent_axes_in_input_array_order"
      },
      "stop_time": {
        "type": "number",
        "minimum": 0.1,
        "maximum": 2,
        "x-unit": "s",
        "x-frame": "independent_axes_in_input_array_order",
        "description": "stop_time; units=s; frame=independent_axes_in_input_array_order"
      }
    }
  },
  "output_schema": {
    "type": "object",
    "required": [
      "time_s",
      "position",
      "velocity",
      "acceleration",
      "coordinate_type",
      "duration_s"
    ],
    "additionalProperties": false,
    "properties": {
      "time_s": {
        "type": "array",
        "minItems": 2,
        "maxItems": 3000,
        "items": {
          "type": "number",
          "minimum": 0,
          "maximum": 150
        },
        "x-unit": "s",
        "x-frame": "independent_axes_in_input_array_order",
        "description": "time_s; units=s; frame=independent_axes_in_input_array_order"
      },
      "position": {
        "type": "array",
        "minItems": 2,
        "maxItems": 3000,
        "items": {
          "type": "array",
          "minItems": 1,
          "maxItems": 8,
          "items": {
            "type": "number",
            "minimum": -10000,
            "maximum": 10000
          }
        },
        "x-unit": "coordinate_type:m_or_rad",
        "x-frame": "independent_axes_in_input_array_order",
        "description": "position; units=coordinate_type:m_or_rad; frame=independent_axes_in_input_array_order"
      },
      "velocity": {
        "type": "array",
        "minItems": 2,
        "maxItems": 3000,
        "items": {
          "type": "array",
          "minItems": 1,
          "maxItems": 8,
          "items": {
            "type": "number",
            "minimum": -1000,
            "maximum": 1000
          }
        },
        "x-unit": "coordinate_type:m/s_or_rad/s",
        "x-frame": "independent_axes_in_input_array_order",
        "description": "velocity; units=coordinate_type:m/s_or_rad/s; frame=independent_axes_in_input_array_order"
      },
      "acceleration": {
        "type": "array",
        "minItems": 2,
        "maxItems": 3000,
        "items": {
          "type": "array",
          "minItems": 1,
          "maxItems": 8,
          "items": {
            "type": "number",
            "minimum": -1000,
            "maximum": 1000
          }
        },
        "x-unit": "coordinate_type:m/s^2_or_rad/s^2",
        "x-frame": "independent_axes_in_input_array_order",
        "description": "acceleration; units=coordinate_type:m/s^2_or_rad/s^2; frame=independent_axes_in_input_array_order"
      },
      "coordinate_type": {
        "type": "string",
        "enum": [
          "revolute_rad",
          "linear_m"
        ],
        "x-unit": "dimensionless",
        "x-frame": "independent_axes_in_input_array_order",
        "description": "coordinate_type; units=dimensionless; frame=independent_axes_in_input_array_order"
      },
      "duration_s": {
        "type": "number",
        "minimum": 0,
        "maximum": 150,
        "x-unit": "s",
        "x-frame": "independent_axes_in_input_array_order",
        "description": "duration_s; units=s; frame=independent_axes_in_input_array_order"
      }
    }
  },
  "preconditions": [
    "Ruckig Community 0.19.4; no cloud client, IK, collision or physical control.",
    "All axes share coordinate_type; m or rad and corresponding derivatives per second.",
    "Velocity/stop modes do not guarantee target position. Maximum 3000 online cycles or 30 s offline trajectory."
  ],
  "postconditions": [
    "All declared checks must pass and all outputs must be finite.",
    "Success applies only to this operation and model, not higher-level task completion."
  ],
  "failure_codes": [
    "invalid_input_or_environment",
    "execution_failed",
    "task_failed"
  ],
  "composition": {
    "depends_on": [],
    "automatic_frame_conversion": false,
    "automatic_hardware_execution": false
  },
  "output_selector": "outputs",
  "origin_reference_ids": [
    "ruckig-examples-06-stop-py"
  ],
  "origin_relationship": "adapted_from; inspect declared model and inputs, not original robot compatibility"
}
```



## Exact environment

| Runtime | Robot | Controller | Observation | OS | Python | Evidence |
| --- | --- | --- | --- | --- | --- | --- |
| ruckig 0.19.4 | independent-axes | json-contract-v1 | explicit-json-input | windows x86_64 | >=3.10,<3.11 | task_complete |

All inputs and outputs follow interface v1. Simulation adapters query exact synthetic simulator state; no perception or physical sensor compatibility.

Compatibility status: **hub_verified**. An environment match does not establish task completion. Runtime verification: **task_complete**.

## Source and license

- Repository: https://github.com/pantor/ruckig
- Source commit: `a8db97a4e9c55e5160a3855f739fa3b270df8e4c` (no tag)
- Original authors: Lars Berscheid and Ruckig contributors
- License: [MIT](https://github.com/pantor/ruckig/blob/a8db97a4e9c55e5160a3855f739fa3b270df8e4c/LICENSE)
- Source archive SHA256: `2a935bfbe02f9236ecd138aee13b52fef2a43e67853179b727d394508ef98b08`
- Upstream files: `LICENSE`, `examples/06_stop.py`
- Upstream contribution rules: https://github.com/pantor/ruckig

## Find, inspect, prepare

```sh
python /PATH_TO_SKILL/scripts/rsh.py find "trajectory_generator" --runtime ruckig --runtime-version 0.19.4 --robot independent-axes --json
python /PATH_TO_SKILL/scripts/rsh.py inspect ruckig-stop-trajectory --json
python /PATH_TO_SKILL/scripts/rsh.py prepare ruckig-stop-trajectory --project ./experiment --expected-source-commit a8db97a4e9c55e5160a3855f739fa3b270df8e4c --expected-record-version 1.0.0 --plan --json
```

Remove `--plan` to download the checksum-verified pinned source and create an isolated project environment. Preparation returns the remaining configuration. Dependency installation is an explicit `--install-deps` step; it can execute package build hooks. Robot simulation is a separate command returned by prepare, never run by find/inspect.

Direct package pins: `ruckig==0.19.4`.

Runtime dependency versions are pinned for the supported Python 3.10 x86_64 CPU environments and checked against execution receipts. Platform-specific wheel hashes are not represented as a universal artifact lock; prepare captures pip freeze.

Hardware: x86_64 CPU; no GPU or robot required.

Rendering: No display. Matplotlib Agg for numerical imports; PyBullet DIRECT for simulation..

External API keys: none.

## Invocation contract

Entrypoint: `python run.py`.

```json
{
  "argv": [
    "{python}",
    "{recipe_dir}/run.py",
    "--source-dir",
    "{source_dir}",
    "--example"
  ],
  "inputs": {
    "current_position": [
      0,
      0,
      0.5
    ],
    "current_velocity": [
      0.3,
      -0.2,
      0.1
    ],
    "current_acceleration": [
      0,
      0,
      0
    ],
    "target_position": [
      1,
      -0.5,
      0.25
    ],
    "target_velocity": [
      0,
      0,
      0
    ],
    "target_acceleration": [
      0,
      0,
      0
    ],
    "max_velocity": [
      1,
      1,
      1
    ],
    "max_acceleration": [
      2,
      2,
      2
    ],
    "max_jerk": [
      4,
      4,
      4
    ],
    "dt": 0.01,
    "coordinate_type": "revolute_rad",
    "stop_time": 0.5
  },
  "outputs": {
    "format": "single JSON object on stdout",
    "payload_selector": "outputs",
    "schema": {
      "type": "object",
      "required": [
        "time_s",
        "position",
        "velocity",
        "acceleration",
        "coordinate_type",
        "duration_s"
      ],
      "additionalProperties": false,
      "properties": {
        "time_s": {
          "type": "array",
          "minItems": 2,
          "maxItems": 3000,
          "items": {
            "type": "number",
            "minimum": 0,
            "maximum": 150
          },
          "x-unit": "s",
          "x-frame": "independent_axes_in_input_array_order",
          "description": "time_s; units=s; frame=independent_axes_in_input_array_order"
        },
        "position": {
          "type": "array",
          "minItems": 2,
          "maxItems": 3000,
          "items": {
            "type": "array",
            "minItems": 1,
            "maxItems": 8,
            "items": {
              "type": "number",
              "minimum": -10000,
              "maximum": 10000
            }
          },
          "x-unit": "coordinate_type:m_or_rad",
          "x-frame": "independent_axes_in_input_array_order",
          "description": "position; units=coordinate_type:m_or_rad; frame=independent_axes_in_input_array_order"
        },
        "velocity": {
          "type": "array",
          "minItems": 2,
          "maxItems": 3000,
          "items": {
            "type": "array",
            "minItems": 1,
            "maxItems": 8,
            "items": {
              "type": "number",
              "minimum": -1000,
              "maximum": 1000
            }
          },
          "x-unit": "coordinate_type:m/s_or_rad/s",
          "x-frame": "independent_axes_in_input_array_order",
          "description": "velocity; units=coordinate_type:m/s_or_rad/s; frame=independent_axes_in_input_array_order"
        },
        "acceleration": {
          "type": "array",
          "minItems": 2,
          "maxItems": 3000,
          "items": {
            "type": "array",
            "minItems": 1,
            "maxItems": 8,
            "items": {
              "type": "number",
              "minimum": -1000,
              "maximum": 1000
            }
          },
          "x-unit": "coordinate_type:m/s^2_or_rad/s^2",
          "x-frame": "independent_axes_in_input_array_order",
          "description": "acceleration; units=coordinate_type:m/s^2_or_rad/s^2; frame=independent_axes_in_input_array_order"
        },
        "coordinate_type": {
          "type": "string",
          "enum": [
            "revolute_rad",
            "linear_m"
          ],
          "x-unit": "dimensionless",
          "x-frame": "independent_axes_in_input_array_order",
          "description": "coordinate_type; units=dimensionless; frame=independent_axes_in_input_array_order"
        },
        "duration_s": {
          "type": "number",
          "minimum": 0,
          "maximum": 150,
          "x-unit": "s",
          "x-frame": "independent_axes_in_input_array_order",
          "description": "duration_s; units=s; frame=independent_axes_in_input_array_order"
        }
      }
    }
  }
}
```

Success: Exit 0, status=task_complete, success=true, finite outputs satisfying interface.output_schema and all declared numerical/model checks. This is not a physical robot or general task-success claim.

Timeout: 30 seconds. Caller must terminate the separate adapter process after 30 seconds; adapters bound iterations/scene steps and close simulation clients.

Failures: Invalid or oversized JSON; Source checksum mismatch; Unavailable pinned dependency; No valid path or postcondition failure; Execution exceeding the declared bounded algorithm budget.

## Actual evidence

Three frozen positive cases passed against this exact adapter; see per-case receipts. This does not estimate general accuracy.

Reviewer: Hub maintainer runtime harness · 2026-10-19.

Commands/checks actually performed:

- python tools/verify_executable_recipes.py --source-cache SOURCE_CACHE --output OUTPUT --backend ruckig

Submitted evidence and hub verification remain separate. A schema check, PR creation or merge does not establish task success or publication.

## Reusable fixes

Preserve upstream origin/license and interface semantics. Edit the finite manifest/templates and regenerate; record new exact-byte evidence for behavior changes.

# Controlled stop jerk-limited trajectory

Parameterized adaptation of `examples/06_stop.py` from https://github.com/pantor/ruckig at `a8db97a4e9c55e5160a3855f739fa3b270df8e4c`. Original authors: Lars Berscheid and Ruckig contributors. Upstream license: MIT. Source license and all notices remain in the prepared checkout; the Hub adapter is MIT.

Use the record interface for input/output schemas, units, frames, prerequisites and failures. `--describe` reads the contract; `--example` runs the declared case. Replace `--example` with `--input TASK.json` for a different input. This adapter does not command physical hardware.

