{
  "openapi": "3.1.0",
  "info": {
    "title": "RosieOS offline programming (OLP) server API",
    "version": "v1",
    "description": "The OLP server behind the offline programming app and the Steam Deck pendant: CAD and seam authoring, weld planning, the local simulator, cell targets and dense-execution machine control through rt-control. It has no authentication and is meant to be reached from the same host. Generated from the docs page https://advancedmetalresearch.com/docs/apis/olp-http (source: apis/olp-http.md), which cites the RosieOS source files it was written from. Routes the page lists only in a table have no body schemas. 52 operations.",
    "license": {
      "name": "Apache 2.0",
      "identifier": "Apache-2.0"
    }
  },
  "externalDocs": {
    "url": "https://advancedmetalresearch.com/docs/apis/olp-http"
  },
  "servers": [
    {
      "url": "http://127.0.0.1:8794/api/offline-programming/v1",
      "description": "Default listen address (serve --listen). Do not expose it on a network."
    }
  ],
  "security": [],
  "tags": [
    {
      "name": "Service"
    },
    {
      "name": "Authoring and planning"
    },
    {
      "name": "Cells and targets"
    },
    {
      "name": "Routes at a glance"
    },
    {
      "name": "Machine control"
    },
    {
      "name": "Local simulator"
    },
    {
      "name": "Program catalog"
    },
    {
      "name": "Legacy and disabled routes"
    }
  ],
  "paths": {
    "/health": {
      "get": {
        "summary": "Server status. Always 200.",
        "tags": [
          "Service"
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "description": "execution_enabled and connected_targets describe the legacy connected-execution path, not dense execution.",
        "externalDocs": {
          "url": "https://advancedmetalresearch.com/docs/apis/olp-http#service"
        },
        "operationId": "get_health"
      }
    },
    "/capabilities": {
      "get": {
        "summary": "Feature flags, schema offline-programming.capabilities.v1: whether the seam worker is wired (weld_planner.enabled), the local simulator's availability, and the planning flags.",
        "tags": [
          "Service"
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "externalDocs": {
          "url": "https://advancedmetalresearch.com/docs/apis/olp-http#service"
        },
        "operationId": "get_capabilities"
      }
    },
    "/robots": {
      "get": {
        "summary": "The robot descriptions this server can plan against: the workstation's own, plus any fetched from cells, by identity.",
        "tags": [
          "Service"
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "description": "problems names each description that failed to load. A 500 with robot_store_unreadable means the description directory itself could not be read.",
        "externalDocs": {
          "url": "https://advancedmetalresearch.com/docs/apis/olp-http#service"
        },
        "operationId": "get_robots"
      }
    },
    "/robots/capture-model": {
      "post": {
        "summary": "Compiles the URDF for a model at a given description and cell calibration, for recording a pose.",
        "tags": [
          "Service"
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "description": "Returns {\"urdf\": \"<xml>\", \"identity\": …}. A failure returns 400 {\"error\": \"…\"}. If the description is neither local, cached nor advertised by the selected cell: adopt the matching robot description before recording.",
        "externalDocs": {
          "url": "https://advancedmetalresearch.com/docs/apis/olp-http#service"
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "model_id": {
                    "type": "string",
                    "description": "Type: string. Robot model"
                  },
                  "robot_description_sha256": {
                    "type": "string",
                    "description": "Type: string. Description identity, sha256:<64 hex>"
                  },
                  "machine_planning_calibration_base64": {
                    "type": "string",
                    "description": "Type: string. The cell's machine_planning_calibration.json, base64. Empty uses the empty calibration."
                  }
                },
                "required": [
                  "model_id",
                  "robot_description_sha256"
                ]
              }
            }
          }
        },
        "operationId": "post_robots_capture_model"
      }
    },
    "/cadquery/topology": {
      "post": {
        "summary": "Forwards the body to the bounded CadQuery worker (one subprocess per request) and returns its JSON.",
        "tags": [
          "Authoring and planning"
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "description": "The worker operations are extract_topology, build_seam, build_sequence and tessellate. Error codes are the same set as the seam worker's, below.",
        "externalDocs": {
          "url": "https://advancedmetalresearch.com/docs/apis/olp-http#authoring-and-planning"
        },
        "operationId": "post_cadquery_topology"
      }
    },
    "/seam": {
      "post": {
        "summary": "Forwards the body to the seam worker, python -m seam_worker.workers --stdin, and returns its JSON.",
        "tags": [
          "Authoring and planning"
        ],
        "responses": {
          "200": {
            "description": "OK"
          },
          "400": {
            "description": "Error codes: invalid_request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "x-rosieos-error-codes": [
              "invalid_request"
            ]
          },
          "408": {
            "description": "Error codes: canceled",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "x-rosieos-error-codes": [
              "canceled"
            ]
          },
          "413": {
            "description": "Error codes: payload_too_large",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "x-rosieos-error-codes": [
              "payload_too_large"
            ]
          },
          "429": {
            "description": "Error codes: busy",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "x-rosieos-error-codes": [
              "busy"
            ]
          },
          "502": {
            "description": "Error codes: worker_failed, invalid_response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "x-rosieos-error-codes": [
              "worker_failed",
              "invalid_response"
            ]
          },
          "503": {
            "description": "Error codes: unavailable",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "x-rosieos-error-codes": [
              "unavailable"
            ]
          },
          "504": {
            "description": "Error codes: timeout",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "x-rosieos-error-codes": [
              "timeout"
            ]
          }
        },
        "description": "The body names the operation: {\"operation\": \"detect_joints\", …}. Operations: detect_joints, check_torch_fits, plan_torch_path, sample_seam_frames, build_plan_request. The response header X-Offline-Seam-Part identifies the part the answer is about.\n\nSee the weld program format for the operations' payloads.",
        "externalDocs": {
          "url": "https://advancedmetalresearch.com/docs/apis/olp-http#authoring-and-planning"
        },
        "x-rosieos-reasons": [
          {
            "code": "invalid_request",
            "http": 400,
            "meaning": "The worker refused the request"
          },
          {
            "code": "payload_too_large",
            "http": 413,
            "meaning": "Body over 12 MiB"
          },
          {
            "code": "busy",
            "http": 429,
            "meaning": "No worker free"
          },
          {
            "code": "canceled",
            "http": 408,
            "meaning": "The client went away"
          },
          {
            "code": "timeout",
            "http": 504,
            "meaning": "The worker ran out of time"
          },
          {
            "code": "unavailable",
            "http": 503,
            "meaning": "The worker's pixi environment is missing"
          },
          {
            "code": "worker_failed",
            "http": 502,
            "meaning": "The worker crashed or answered with invalid JSON"
          },
          {
            "code": "invalid_response",
            "http": 502,
            "meaning": "The worker crashed or answered with invalid JSON"
          }
        ],
        "operationId": "post_seam"
      }
    },
    "/weld-plan": {
      "post": {
        "summary": "Packs a .weldplan, sends it to the weld planner, and brings back the planner's result and the dense trajectory the robot will play. One plan at a time; up to 30 minutes.",
        "tags": [
          "Authoring and planning"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "result": {
                      "description": "The planner's result document, amr-weld-planner-v1.motion-plan-result.v1, unchanged. See the Weld planner HTTP API."
                    },
                    "weldplan_sha256": {
                      "description": "SHA-256 of the packed request"
                    },
                    "dense": {
                      "description": "The dense trajectory summary: digest, plan_id, samples, segments, robot_cell"
                    },
                    "dense_blob_base64": {
                      "description": "The .rdt bytes, base64, so the project keeps a copy"
                    }
                  },
                  "additionalProperties": true
                }
              }
            },
            "x-rosieos-documented-fields": [
              "result: The planner's result document, amr-weld-planner-v1.motion-plan-result.v1, unchanged. See the Weld planner HTTP API.",
              "weldplan_sha256: SHA-256 of the packed request",
              "dense: The dense trajectory summary: digest, plan_id, samples, segments, robot_cell",
              "dense_blob_base64: The .rdt bytes, base64, so the project keeps a copy"
            ]
          },
          "400": {
            "description": "Error codes: weld_plan_invalid",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "x-rosieos-error-codes": [
              "weld_plan_invalid"
            ]
          },
          "502": {
            "description": "Error codes: motion_plan_seam_refused, motion_plan_unjoined, motion_plan_no_trajectory, motion_plan_failed, motion_plan_invalid_response, dense_blob_unreachable",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "x-rosieos-error-codes": [
              "motion_plan_seam_refused",
              "motion_plan_unjoined",
              "motion_plan_no_trajectory",
              "motion_plan_failed",
              "motion_plan_invalid_response",
              "dense_blob_unreachable"
            ]
          },
          "503": {
            "description": "Error codes: seam_worker_unavailable, motion_origin_unavailable",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "x-rosieos-error-codes": [
              "seam_worker_unavailable",
              "motion_origin_unavailable"
            ]
          }
        },
        "description": "The server always asks the planner for weld and connecting trajectory optimisation, verification and a dense trajectory.",
        "externalDocs": {
          "url": "https://advancedmetalresearch.com/docs/apis/olp-http#authoring-and-planning"
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "program": {
                    "type": "object",
                    "description": "Type: object. A robot.v4.program.v2 document"
                  },
                  "tooling": {
                    "type": "object",
                    "description": "Type: object. The fitted torch, packed as tooling.json"
                  },
                  "step_base64": {
                    "type": "string",
                    "description": "Type: string. The workpiece STEP file, base64. Empty only when workpiece_absent is true."
                  },
                  "step_filename": {
                    "type": "string",
                    "description": "Type: string. Its file name"
                  },
                  "workpiece_absent": {
                    "type": "boolean",
                    "description": "Type: boolean. Plan with no workpiece"
                  },
                  "cell_id": {
                    "type": "string",
                    "description": "Type: string. The robot model whose description to plan against"
                  },
                  "free_space_backend": {
                    "type": "string",
                    "description": "Type: string. Passed to the planner: bspline, curobo or legacy"
                  },
                  "machine_planning_calibration_base64": {
                    "type": "string",
                    "description": "Type: string. Only read when no cell is connected. While a cell is selected, the server fetches the cell's own calibration."
                  },
                  "program_id": {
                    "type": "string",
                    "description": "Type: string. Stamped into the plan identity"
                  },
                  "program_digest": {
                    "type": "string",
                    "description": "Type: string. Echoed in the response"
                  },
                  "manifest_revision": {
                    "type": "integer",
                    "description": "Type: integer. Stamped into the plan identity"
                  },
                  "fixtures": {
                    "type": "object",
                    "description": "Type: object. Workcell bodies in the cell's world frame, packed as fixtures.json"
                  }
                },
                "required": [
                  "program",
                  "tooling",
                  "step_base64",
                  "cell_id"
                ]
              }
            }
          }
        },
        "x-rosieos-reasons": [
          {
            "code": "weld_plan_invalid",
            "http": 400,
            "meaning": "Invalid JSON, or missing STEP"
          },
          {
            "code": "seam_worker_unavailable",
            "http": 503,
            "meaning": "The seam worker or OFFLINE_PROGRAMMING_WELD_PLANNER_MOTION_ORIGIN is not configured"
          },
          {
            "code": "motion_origin_unavailable",
            "http": 503,
            "meaning": "The seam worker or OFFLINE_PROGRAMMING_WELD_PLANNER_MOTION_ORIGIN is not configured"
          },
          {
            "code": "motion_plan_seam_refused",
            "http": 502,
            "meaning": "One or more welds could not be planned"
          },
          {
            "code": "motion_plan_unjoined",
            "http": 502,
            "meaning": "The welds planned but the connecting moves did not"
          },
          {
            "code": "motion_plan_no_trajectory",
            "http": 502,
            "meaning": "No dense trajectory was produced; dense_error gives {reason, detail, segment_index}"
          },
          {
            "code": "motion_plan_failed",
            "http": 502,
            "meaning": "The planner call failed"
          },
          {
            "code": "motion_plan_invalid_response",
            "http": 502,
            "meaning": "The planner call failed"
          },
          {
            "code": "dense_blob_unreachable",
            "http": 502,
            "meaning": "The planner call failed"
          }
        ],
        "operationId": "post_weld_plan"
      }
    },
    "/weld-plan/export": {
      "post": {
        "summary": "Packs the same .weldplan without planning it. Same body as /weld-plan.",
        "tags": [
          "Authoring and planning"
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "description": "Returns the container bytes as an attachment named <program_id>.weldplan, with its hash in X-Weldplan-SHA256.",
        "externalDocs": {
          "url": "https://advancedmetalresearch.com/docs/apis/olp-http#authoring-and-planning"
        },
        "operationId": "post_weld_plan_export"
      }
    },
    "/targets": {
      "get": {
        "summary": "Lists the catalogue's cells with what each one reports about itself.",
        "tags": [
          "Cells and targets"
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "description": "A cell that cannot be used has backend: \"unreachable\" and a reason, for example cell_configuration_missing, cell_mode_mismatch or cell_unreachable.",
        "externalDocs": {
          "url": "https://advancedmetalresearch.com/docs/apis/olp-http#cells-and-targets"
        },
        "operationId": "get_targets"
      }
    },
    "/targets/select": {
      "post": {
        "summary": "Selects a cell. Stops and releases any session on the previous cell first.",
        "tags": [
          "Cells and targets"
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "description": "Returns {\"selected\": {cell_id, model_id}, \"target\": {…view…}}. Refusals, all 409: cell_switch_busy, cell_switch_while_playing, cell_model_mismatch, cell_id_unknown, cell_mode_mismatch (the cell's backend is not the requested mode), cell_previous_stop_failed, cell_backend_unavailable, cell_configuration_mismatch, cell_description_invalid, cell_backend_mismatch, cell_unreachable. Without a catalogue: 503 cell_catalogue_unavailable.",
        "externalDocs": {
          "url": "https://advancedmetalresearch.com/docs/apis/olp-http#cells-and-targets"
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "cell_id": {
                    "type": "string",
                    "description": "Type: string. A catalogue cell"
                  },
                  "model_id": {
                    "type": "string",
                    "description": "Type: string. One of that cell's models"
                  }
                },
                "required": [
                  "cell_id",
                  "model_id"
                ]
              }
            }
          }
        },
        "operationId": "post_targets_select"
      }
    },
    "/dense-execution/target": {
      "post": {
        "summary": "The Cells dialog's selection. Body {\"cell\": \"<id>\"}; an empty string clears the selection. Returns the dense-execution capabilities. Not fenced.",
        "tags": [
          "Cells and targets"
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "externalDocs": {
          "url": "https://advancedmetalresearch.com/docs/apis/olp-http#cells-and-targets"
        },
        "operationId": "post_dense_execution_target"
      }
    },
    "/dense-execution/cells": {
      "get": {
        "summary": "The registered cells, with reachability: {\"cells\": [{id, label, address, host, credential_ref, model_id, backend, configuration_digest, source, reachable, error}], \"active_cell\": \"…\"}.",
        "tags": [
          "Cells and targets"
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "description": "POST /dense-execution/cells only accepts a cell that matches a commissioned server-side binding (otherwise cell_not_commissioned or cell_binding_pinned). DELETE /dense-execution/cells/{id} always refuses with cell_commissioning_required, or dense_cell_active for the selected cell: commissioned cells are removed from the catalogue file, not from the UI.",
        "externalDocs": {
          "url": "https://advancedmetalresearch.com/docs/apis/olp-http#cells-and-targets"
        },
        "operationId": "get_dense_execution_cells"
      },
      "post": {
        "summary": "Cell registry",
        "tags": [
          "Routes at a glance"
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "x-rosieos-documented": "route table only; request and response bodies are not specified on the docs page",
        "operationId": "post_dense_execution_cells"
      }
    },
    "/dense-execution/capabilities": {
      "get": {
        "summary": "What the selected controller is and whether it is reachable.",
        "tags": [
          "Machine control"
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "description": "cell is the cell's pair ID. Joint and Cartesian jog and moves send it as target_id. rt_core.description is rt-control's Describe. reason explains an unreachable controller, for example rt_core_identity_mismatch.",
        "externalDocs": {
          "url": "https://advancedmetalresearch.com/docs/apis/olp-http#observe"
        },
        "operationId": "get_dense_execution_capabilities"
      }
    },
    "/dense-execution/status": {
      "get": {
        "summary": "The machine and session state. Takes no authority. Poll it.",
        "tags": [
          "Machine control"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "target": {
                      "description": "The selection this status belongs to. Use it for the fencing headers."
                    },
                    "armed": {
                      "description": "Armed, lease held and no refusal pending"
                    },
                    "robot_cell": {
                      "description": "Which robot the machine says it is. See Robot and cell identity."
                    },
                    "round_trip_ns": {
                      "description": "Measured round trip to rt-control, and the effective lease"
                    }
                  },
                  "additionalProperties": true
                }
              }
            },
            "x-rosieos-documented-fields": [
              "target: The selection this status belongs to. Use it for the fencing headers.",
              "session.id: The session to name in heartbeat, Play, jog and moves",
              "session.kind: authority (after Arm or Home), trajectory (after Load)",
              "session.state: idle, loaded, playing or stopped",
              "session.lease.held: OLP holds the rt-control lease",
              "session.stop_reason, last_error: Why the session stopped",
              "armed: Armed, lease held and no refusal pending",
              "robot_cell: Which robot the machine says it is. See Robot and cell identity.",
              "rt_core.status: rt-control's full status. See status.",
              "rt_core.events: Events since the last poll",
              "rt_core.refusal, refusal_kind: The last refused operation and which kind it was",
              "rt_core.inhibited, stop_uncertain, recovery_action: A Stop or Release was not confirmed. recovery_action says what to do: retry POST /dense-execution/stop.",
              "round_trip_ns, link_lease_ns: Measured round trip to rt-control, and the effective lease"
            ]
          }
        },
        "externalDocs": {
          "url": "https://advancedmetalresearch.com/docs/apis/olp-http#observe"
        },
        "operationId": "get_dense_execution_status"
      }
    },
    "/dense-execution/cell": {
      "get": {
        "summary": "The selected machine's robot identity, its machine_planning_calibration.json as base64, and its execution limits. This is what a plan request for this cell carries.",
        "tags": [
          "Machine control"
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "externalDocs": {
          "url": "https://advancedmetalresearch.com/docs/apis/olp-http#observe"
        },
        "operationId": "get_dense_execution_cell"
      }
    },
    "/dense-execution/telemetry/window": {
      "get": {
        "summary": "The newest seconds of the machine's telemetry ring, thinned.",
        "tags": [
          "Machine control"
        ],
        "parameters": [
          {
            "name": "seconds",
            "in": "query",
            "required": false,
            "description": "In (0, 30] Default: 3.",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "stride",
            "in": "query",
            "required": false,
            "description": "Keep every N-th record, 1–100 Default: 1.",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "description": "Returns {daemon_incarnation, configuration_sha256, cycle_period_ns, axis_count, stride, seconds, first_sequence, last_sequence, head_estimate, fetched_records, fetch_ms, records: [...]}. One second of 1 kHz telemetry is about 4.9 MB from the cell before thinning. Errors: 400 telemetry_window_invalid, 503 telemetry_unavailable, 409 telemetry_identity_changed.",
        "externalDocs": {
          "url": "https://advancedmetalresearch.com/docs/apis/olp-http#observe"
        },
        "operationId": "get_dense_execution_telemetry_window"
      }
    },
    "/dense-execution/home": {
      "post": {
        "summary": "Runs native Home and waits until Home is valid on the named axes. Acquires the lease if OLP does not hold it. Does not arm.",
        "tags": [
          "Machine control"
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "description": "Returns the status body. If an axis has a latched reference fault whose recovery is a reset, Home resets it first. Other latched faults refuse with rt_core_fault. Errors: 400 home_axes_invalid, 409 capability_unimplemented, and rt-control reasons.",
        "externalDocs": {
          "url": "https://advancedmetalresearch.com/docs/apis/olp-http#home"
        },
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "axes": {
                    "type": [
                      "integer",
                      "array"
                    ],
                    "description": "Type: integer array. Axis indices, 0–15, a subset of the cell's axis mask. Omit the body, or send [], to home every configured axis."
                  }
                }
              }
            }
          }
        },
        "operationId": "post_dense_execution_home"
      }
    },
    "/dense-execution/arm": {
      "post": {
        "summary": "{\"armed\": true} acquires the lease, enables and arms, and waits until every configured axis is ready. {\"armed\": false} runs Stop and Release.",
        "tags": [
          "Machine control"
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "description": "If a latched execution fault can be cleared by a reset (recovery class reset_clears or reset_after_condition_clears), Arm resets it first, then re-acquires and arms, so one Arm recovers the machine. Faults that need a re-Home or a restart are left to their refusal. Errors: 400 dense_arm_invalid, 409 rt_core_arm_refused, 409 rt_core_arm_timeout, and rt-control reasons such as control_already_owned or not_ready.",
        "externalDocs": {
          "url": "https://advancedmetalresearch.com/docs/apis/olp-http#arm-and-disarm"
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "armed": {
                    "type": "boolean",
                    "description": "Type: boolean. Arm or disarm"
                  }
                },
                "required": [
                  "armed"
                ]
              }
            }
          }
        },
        "operationId": "post_dense_execution_arm"
      }
    },
    "/dense-execution/heartbeat": {
      "post": {
        "summary": "Tells OLP a supervising client is still there. Send it at least every 5 s while OLP holds the lease. Not fenced.",
        "tags": [
          "Machine control"
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "description": "age_ms is how long the previous beat had stood. If no beat arrives for 5 s, OLP stops the machine with ui_heartbeat_lost, except while an accepted Cartesian move is finishing. Errors: 400 dense_session_required, 409 dense_session_mismatch.",
        "externalDocs": {
          "url": "https://advancedmetalresearch.com/docs/apis/olp-http#heartbeat"
        },
        "operationId": "post_dense_execution_heartbeat"
      }
    },
    "/dense-execution/load": {
      "post": {
        "summary": "Fetches a verified .rdt from the weld planner by digest, checks it, and prepares it on rt-control.",
        "tags": [
          "Machine control"
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "description": "Load runs these checks in order, before any byte reaches the robot:\n\n1. The identity matches the header (dense_identity_mismatch). 2. The plan's robot_cell matches the machine (robot_cell_missing, robot_cell_mismatch, robot_cell_unavailable). 3. Every configured axis has valid Home (home_required). 4. OLP acquires the lease and calls prepare_program. rt-control applies its admission checks. 5. The prepared identity, axis mask and process requirement match (program_identity_or_process_mismatch).\n\nOther errors: 400 dense_identity_invalid, 400 dense_trajectory_invalid, 404 dense_blob_not_found, 503 dense_blob_source_unavailable, 409 program_already_executing, and rt-control reasons with an optional limit_violation.",
        "externalDocs": {
          "url": "https://advancedmetalresearch.com/docs/apis/olp-http#load-play-stop"
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "trajectory_digest": {
                    "type": "string",
                    "description": "Type: string. sha256:<64 hex>. The server fetches GET /api/motion/dense/{digest} from the weld planner."
                  },
                  "plan_id": {
                    "type": "string",
                    "description": "Type: string. Must equal the .rdt header exactly"
                  },
                  "manifest_revision": {
                    "type": "integer",
                    "description": "Type: integer. Must equal the header. JSON integers."
                  },
                  "dry_run": {
                    "type": "boolean",
                    "description": "Type: boolean. Strip the torch bits and process markers before upload. The planner sets the torch bit on weld segments unless the program's execution_mode is dry_run, and a program that needs process outputs is refused, so set this for any planned weld program."
                  }
                },
                "required": [
                  "trajectory_digest",
                  "plan_id",
                  "manifest_revision"
                ]
              }
            }
          }
        },
        "operationId": "post_dense_execution_load"
      }
    },
    "/dense-execution/play": {
      "post": {
        "summary": "Starts the loaded program. Body {\"session_id\": \"…\"} from the Load answer. Waits until the machine is armed and every axis ready, then sends start_program. Returns the status body.",
        "tags": [
          "Machine control"
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "description": "Refused with control_session_stale unless the session is the loaded one and OLP holds the lease. Arm before Play.",
        "externalDocs": {
          "url": "https://advancedmetalresearch.com/docs/apis/olp-http#load-play-stop"
        },
        "operationId": "post_dense_execution_play"
      }
    },
    "/dense-execution/stop": {
      "post": {
        "summary": "Stops the machine now, then releases the lease. Needs no body and no fence. Retry it until it succeeds.",
        "tags": [
          "Machine control"
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "description": "note: \"nothing_held\" means there was nothing to stop. If Stop or Release cannot be confirmed, the answer is an error that still carries stopped, attempts and status, and further motion is blocked (rt_core_inhibited) until a Stop succeeds. A receipt does not prove the robot is standing still; see Software stops.",
        "externalDocs": {
          "url": "https://advancedmetalresearch.com/docs/apis/olp-http#load-play-stop"
        },
        "operationId": "post_dense_execution_stop"
      }
    },
    "/dense-execution/pause": {
      "post": {
        "summary": "Always refused on rt_core with capability_unimplemented. Use Stop.",
        "tags": [
          "Machine control"
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "externalDocs": {
          "url": "https://advancedmetalresearch.com/docs/apis/olp-http#load-play-stop"
        },
        "operationId": "post_dense_execution_pause"
      }
    },
    "/dense-execution/go-home": {
      "post": {
        "summary": "Always refused on rt_core with capability_unimplemented. Use Home, or a joint move.",
        "tags": [
          "Machine control"
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "externalDocs": {
          "url": "https://advancedmetalresearch.com/docs/apis/olp-http#load-play-stop"
        },
        "operationId": "post_dense_execution_go_home"
      }
    },
    "/dense-execution/jog/{action}": {
      "post": {
        "summary": "Holds one axis at a fraction of its described velocity. action is begin, update or end. Needs an armed session. GET /dense-execution/jog/state returns the current state.",
        "tags": [
          "Machine control"
        ],
        "parameters": [
          {
            "name": "action",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "enum": [
                "begin",
                "update",
                "end"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "description": "Send begin, then update every 50 ms while the operator holds the control, then end. An update may not change axis, direction or fraction; end the hold and begin a new one. Each update lives for the cell's jog input age (250 ms on a LAN cell). If updates stop, the jog ends with jog_input_deadline_expired and the axis ramps to a hold.\n\nErrors (409 unless noted): jog_session_stale, jog_mode_conflict (a move, a program or another hold is active), no_grant, jog_not_ready, invalid_axis_mask, 400 jog_invalid_vector, jog_input_deadline_expired, jog_transport_congested, dense_target_unavailable, and native jog reasons.",
        "externalDocs": {
          "url": "https://advancedmetalresearch.com/docs/apis/olp-http#joint-jog"
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "target_id": {
                    "type": "string",
                    "description": "Type: string. The cell's pair ID, capabilities.cell"
                  },
                  "session_id": {
                    "type": "string",
                    "description": "Type: string. status.session.id"
                  },
                  "revision": {
                    "type": "integer",
                    "description": "Type: integer. jog/state.revision. It advances when a jog ends or a move starts, so a late request from an old hold is refused."
                  },
                  "axis": {
                    "type": "integer",
                    "description": "Type: integer. Axis index, within the cell's axis mask"
                  },
                  "direction": {
                    "type": "integer",
                    "description": "Type: integer. 1 or -1"
                  },
                  "fraction": {
                    "type": "number",
                    "description": "Type: number. (0, 1]. The axis moves at fraction × max_velocity × 0.75."
                  }
                },
                "required": [
                  "target_id",
                  "session_id",
                  "revision",
                  "axis",
                  "direction",
                  "fraction"
                ]
              }
            }
          }
        },
        "operationId": "post_dense_execution_jog_action"
      }
    },
    "/dense-execution/move": {
      "post": {
        "summary": "Moves one or more joints by a bounded amount and returns when the move is done. Needs an armed session.",
        "tags": [
          "Machine control"
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "description": "Each joint follows its own trapezoid at fraction × max_velocity × 0.75 and fraction × its jog acceleration (or its described maximum acceleration, if lower). Shorter profiles are stretched so all joints start and finish together. The points are sampled at the core's cycle and sent with prepare_trajectory and start_trajectory. The target must be inside the joint's limits.\n\nErrors: joint_move_invalid, joint_move_limits, joint_move_units, joint_move_description_invalid, joint_move_too_many_points, joint_move_prepare_timeout, joint_move_prepare_busy, joint_move_interrupted, joint_move_completion_timeout, joint_move_feedback_invalid, client_disconnected, plus the joint jog errors. If the HTTP client disconnects, OLP stops the move.",
        "externalDocs": {
          "url": "https://advancedmetalresearch.com/docs/apis/olp-http#joint-move"
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "target_id": {
                    "description": "As for joint jog"
                  },
                  "axis": {
                    "type": "integer",
                    "description": "Type: integer. The joint, for a single-joint move"
                  },
                  "degrees": {
                    "type": "number",
                    "description": "Type: number, degrees. Signed relative move for a single joint. Non-zero."
                  },
                  "fraction": {
                    "type": "number",
                    "description": "Type: number. (0, 1] of each joint's velocity and acceleration"
                  },
                  "axes[]": {
                    "type": "array",
                    "description": "Type: array. A synchronised move of several joints. Each entry has axis and either degrees (relative, degrees) or position_rad (absolute, radians, from the held position). When present, it replaces axis and degrees."
                  }
                },
                "required": [
                  "target_id",
                  "axis",
                  "degrees",
                  "fraction"
                ]
              }
            }
          }
        },
        "operationId": "post_dense_execution_move"
      }
    },
    "/dense-execution/cartesian/{action}": {
      "post": {
        "summary": "Jogs the tool in the base or tool frame. action is start, intent, stop or halt (stop and halt both end the hold). Same session, revision and timing rules as joint jog. GET /dense-execution/cartesian/state returns the jog state.",
        "tags": [
          "Machine control"
        ],
        "parameters": [
          {
            "name": "action",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "enum": [
                "start",
                "intent",
                "stop",
                "halt"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "description": "OLP resolves the twist into joint velocities from the measured pose with robot-v4-cartesiand --resolve-only, then scales the whole vector so no joint exceeds fraction × max_velocity × 0.75. The twist sets the direction; the joint ceilings usually set the speed. A step that would leave a joint's limits within one input lifetime is refused with joint_limit.\n\nErrors: 400 cartesian_input_invalid, cartesian_resolver_unavailable, cartesian_resolver_invalid, cartesian_pose_stale, cartesian_axes_invalid, joint_limit, jacobian_gate, ik_no_solution, plus the joint jog errors.",
        "externalDocs": {
          "url": "https://advancedmetalresearch.com/docs/apis/olp-http#cartesian-jog"
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "target_id": {
                    "description": "As for joint jog"
                  },
                  "frame": {
                    "type": "string",
                    "description": "Type: string. base or tool"
                  },
                  "twist": {
                    "type": "number",
                    "description": "Type: 6 numbers. X, Y, Z in m/s (each |v| ≤ 1), RX, RY, RZ in rad/s (each |ω| ≤ π). At least one non-zero."
                  },
                  "fraction": {
                    "type": "number",
                    "description": "Type: number. (0, 1]"
                  }
                },
                "required": [
                  "target_id",
                  "frame",
                  "twist",
                  "fraction"
                ]
              }
            }
          }
        },
        "operationId": "post_dense_execution_cartesian_action"
      }
    },
    "/dense-execution/cartesian/move": {
      "post": {
        "summary": "Moves the tool a bounded distance along one axis of the base or tool frame, in a straight line, and returns when done.",
        "tags": [
          "Machine control"
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "description": "The resolver solves IK along the line at 1 mm or 0.25° spacing and checks each waypoint against joint limits and the singularity gate. OLP then times the path with a smooth (quintic) progress clock, so that no joint exceeds fraction × max_velocity × 0.75, reduced further near a singularity, or fraction × its acceleration limit. It sends the result as one trajectory. An accepted move finishes even if the HTTP client disconnects; Stop still cancels it.\n\nErrors: cartesian_input_invalid, cartesian_reach, ik_no_solution, joint_limit, cartesian_pose_stale, cartesian_resolver_invalid, joint_move_too_many_points, plus the joint move errors.",
        "externalDocs": {
          "url": "https://advancedmetalresearch.com/docs/apis/olp-http#cartesian-move"
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "target_id": {
                    "description": "As for joint jog"
                  },
                  "frame": {
                    "type": "string",
                    "description": "Type: string. base or tool"
                  },
                  "axis": {
                    "type": "integer",
                    "description": "Type: integer. 0–2 for X, Y, Z; 3–5 for RX, RY, RZ"
                  },
                  "distance_mm": {
                    "type": "number",
                    "description": "Type: number, mm. Non-zero for a linear axis, zero otherwise. At most 1,000 mm."
                  },
                  "angle_degrees": {
                    "type": "number",
                    "description": "Type: number, degrees. Non-zero for a rotary axis, zero otherwise. At most 180°."
                  },
                  "fraction": {
                    "type": "number",
                    "description": "Type: number. (0, 1]"
                  }
                },
                "required": [
                  "target_id",
                  "frame",
                  "axis",
                  "fraction"
                ]
              }
            }
          }
        },
        "operationId": "post_dense_execution_cartesian_move"
      }
    },
    "/dense-execution/cells/{id}": {
      "delete": {
        "summary": "Cell registry",
        "tags": [
          "Routes at a glance"
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "x-rosieos-documented": "route table only; request and response bodies are not specified on the docs page",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "operationId": "delete_dense_execution_cells_id"
      }
    },
    "/dense-execution/jog/state": {
      "get": {
        "summary": "Joint jog",
        "tags": [
          "Routes at a glance"
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "x-rosieos-documented": "route table only; request and response bodies are not specified on the docs page",
        "operationId": "get_dense_execution_jog_state"
      }
    },
    "/dense-execution/cartesian/state": {
      "get": {
        "summary": "Cartesian jog",
        "tags": [
          "Routes at a glance"
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "x-rosieos-documented": "route table only; request and response bodies are not specified on the docs page",
        "operationId": "get_dense_execution_cartesian_state"
      }
    },
    "/local-simulator/status": {
      "get": {
        "summary": "Simulator phase and readiness",
        "tags": [
          "Local simulator"
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "x-rosieos-documented": "route table only; request and response bodies are not specified on the docs page",
        "operationId": "get_local_simulator_status"
      }
    },
    "/local-simulator/start": {
      "post": {
        "summary": "Start or stop it. No request body.",
        "tags": [
          "Local simulator"
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "x-rosieos-documented": "route table only; request and response bodies are not specified on the docs page",
        "operationId": "post_local_simulator_start"
      }
    },
    "/local-simulator/stop": {
      "post": {
        "summary": "Start or stop it. No request body.",
        "tags": [
          "Local simulator"
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "x-rosieos-documented": "route table only; request and response bodies are not specified on the docs page",
        "operationId": "post_local_simulator_stop"
      }
    },
    "/local-simulator/plans": {
      "post": {
        "summary": "Plan a saved program against the simulator",
        "tags": [
          "Local simulator"
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "x-rosieos-documented": "route table only; request and response bodies are not specified on the docs page",
        "operationId": "post_local_simulator_plans"
      }
    },
    "/local-simulator/jog/start": {
      "post": {
        "summary": "Start or stop the preview jog runtime",
        "tags": [
          "Local simulator"
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "x-rosieos-documented": "route table only; request and response bodies are not specified on the docs page",
        "operationId": "post_local_simulator_jog_start"
      }
    },
    "/local-simulator/jog/stop": {
      "post": {
        "summary": "Start or stop the preview jog runtime",
        "tags": [
          "Local simulator"
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "x-rosieos-documented": "route table only; request and response bodies are not specified on the docs page",
        "operationId": "post_local_simulator_jog_stop"
      }
    },
    "/local-simulator/jog/intent": {
      "post": {
        "summary": "{mode: \"base\"|\"tool\"|\"joint\", axes: [6 values in -1..1], selectedJoint, speedScale: 0..1}",
        "tags": [
          "Local simulator"
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "x-rosieos-documented": "route table only; request and response bodies are not specified on the docs page",
        "operationId": "post_local_simulator_jog_intent"
      }
    },
    "/local-simulator/jog/state": {
      "get": {
        "summary": "Joints in rad, axis names, running flag",
        "tags": [
          "Local simulator"
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "x-rosieos-documented": "route table only; request and response bodies are not specified on the docs page",
        "operationId": "get_local_simulator_jog_state"
      }
    },
    "/local-simulator/jog/home": {
      "post": {
        "summary": "Home or halt the preview",
        "tags": [
          "Local simulator"
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "x-rosieos-documented": "route table only; request and response bodies are not specified on the docs page",
        "operationId": "post_local_simulator_jog_home"
      }
    },
    "/local-simulator/jog/halt": {
      "post": {
        "summary": "Home or halt the preview",
        "tags": [
          "Local simulator"
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "x-rosieos-documented": "route table only; request and response bodies are not specified on the docs page",
        "operationId": "post_local_simulator_jog_halt"
      }
    },
    "/local-simulator/jog/set-zero": {
      "post": {
        "summary": "{axisMask}",
        "tags": [
          "Local simulator"
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "x-rosieos-documented": "route table only; request and response bodies are not specified on the docs page",
        "operationId": "post_local_simulator_jog_set_zero"
      }
    },
    "/local-simulator/jog/step": {
      "post": {
        "summary": "{joint, deltaDeg} (degrees); answers 202",
        "tags": [
          "Local simulator"
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "x-rosieos-documented": "route table only; request and response bodies are not specified on the docs page",
        "operationId": "post_local_simulator_jog_step"
      }
    },
    "/programs": {
      "get": {
        "summary": "GET/POST /programs, GET/PUT /programs/{program_id} and GET /programs/{program_id}/revisions proxy to an external program catalog set with --program-catalog-origin.",
        "tags": [
          "Program catalog"
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "x-rosieos-documented": "named in prose only; request and response bodies are not specified on the docs page",
        "operationId": "get_programs"
      },
      "post": {
        "summary": "GET/POST /programs, GET/PUT /programs/{program_id} and GET /programs/{program_id}/revisions proxy to an external program catalog set with --program-catalog-origin.",
        "tags": [
          "Program catalog"
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "x-rosieos-documented": "named in prose only; request and response bodies are not specified on the docs page",
        "operationId": "post_programs"
      }
    },
    "/programs/{program_id}": {
      "get": {
        "summary": "GET/POST /programs, GET/PUT /programs/{program_id} and GET /programs/{program_id}/revisions proxy to an external program catalog set with --program-catalog-origin.",
        "tags": [
          "Program catalog"
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "x-rosieos-documented": "named in prose only; request and response bodies are not specified on the docs page",
        "parameters": [
          {
            "name": "program_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "operationId": "get_programs_program_id"
      },
      "put": {
        "summary": "GET/POST /programs, GET/PUT /programs/{program_id} and GET /programs/{program_id}/revisions proxy to an external program catalog set with --program-catalog-origin.",
        "tags": [
          "Program catalog"
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "x-rosieos-documented": "named in prose only; request and response bodies are not specified on the docs page",
        "parameters": [
          {
            "name": "program_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "operationId": "put_programs_program_id"
      }
    },
    "/programs/{program_id}/revisions": {
      "get": {
        "summary": "GET/POST /programs, GET/PUT /programs/{program_id} and GET /programs/{program_id}/revisions proxy to an external program catalog set with --program-catalog-origin.",
        "tags": [
          "Program catalog"
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "x-rosieos-documented": "named in prose only; request and response bodies are not specified on the docs page",
        "parameters": [
          {
            "name": "program_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "operationId": "get_programs_program_id_revisions"
      }
    },
    "/connect": {
      "post": {
        "summary": "- POST /connect, POST /execute and POST /teleop are retired and answer 403 {\"ok\": false, \"enabled\": false}.",
        "tags": [
          "Legacy and disabled routes"
        ],
        "responses": {
          "403": {
            "description": "Retired route",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "const": false
                    },
                    "enabled": {
                      "const": false
                    }
                  }
                }
              }
            }
          }
        },
        "x-rosieos-documented": "named in prose only; request and response bodies are not specified on the docs page",
        "deprecated": true,
        "operationId": "post_connect"
      }
    },
    "/execute": {
      "post": {
        "summary": "- POST /connect, POST /execute and POST /teleop are retired and answer 403 {\"ok\": false, \"enabled\": false}.",
        "tags": [
          "Legacy and disabled routes"
        ],
        "responses": {
          "403": {
            "description": "Retired route",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "const": false
                    },
                    "enabled": {
                      "const": false
                    }
                  }
                }
              }
            }
          }
        },
        "x-rosieos-documented": "named in prose only; request and response bodies are not specified on the docs page",
        "deprecated": true,
        "operationId": "post_execute"
      }
    },
    "/teleop": {
      "post": {
        "summary": "- POST /connect, POST /execute and POST /teleop are retired and answer 403 {\"ok\": false, \"enabled\": false}.",
        "tags": [
          "Legacy and disabled routes"
        ],
        "responses": {
          "403": {
            "description": "Retired route",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "const": false
                    },
                    "enabled": {
                      "const": false
                    }
                  }
                }
              }
            }
          }
        },
        "x-rosieos-documented": "named in prose only; request and response bodies are not specified on the docs page",
        "deprecated": true,
        "operationId": "post_teleop"
      }
    }
  },
  "x-rosieos-error-codes": [
    {
      "codes": [
        "dense_target_unavailable"
      ],
      "http": "503, 409",
      "meaning": "No cell selected, or the backend cannot do this"
    },
    {
      "codes": [
        "target_changed"
      ],
      "http": "409",
      "meaning": "The fencing headers name an old selection"
    },
    {
      "codes": [
        "ui_heartbeat_lost"
      ],
      "http": "409",
      "meaning": "OLP stopped the machine: no heartbeat for 5 s"
    },
    {
      "codes": [
        "rt_core_inhibited"
      ],
      "http": "409",
      "meaning": "A previous Stop or Release was not confirmed. Retry Stop."
    },
    {
      "codes": [
        "rt_core_identity_mismatch"
      ],
      "http": "409",
      "meaning": "Describe no longer matches the cell's pinned identity"
    },
    {
      "codes": [
        "rt_core_request_slow"
      ],
      "http": "409",
      "meaning": "rt-control did not answer within the call budget. The lease is kept; retry."
    },
    {
      "codes": [
        "rt_core_connection_reopened"
      ],
      "http": "409",
      "meaning": "The request was not sent; the client reconnected. Retry."
    },
    {
      "codes": [
        "rt_core_transport_lost",
        "rt_core_protocol_error",
        "rt_core_closed",
        "rt_core_cancelled",
        "rt_core_failure"
      ],
      "http": "409",
      "meaning": "Transport or protocol failures"
    },
    {
      "codes": [
        "rt_core_incarnation_changed",
        "rt_core_event"
      ],
      "http": "409",
      "meaning": "rt-control restarted, or an event (a fault, a lost grant, dropped events) ended the session"
    },
    {
      "codes": [
        "control_renewal_lost"
      ],
      "http": "409",
      "meaning": "Lease renewal failed; OLP stopped"
    },
    {
      "codes": [
        "control_session_stale"
      ],
      "http": "409",
      "meaning": "The session was stopped or replaced before this request ran"
    },
    {
      "codes": [
        "capability_unimplemented"
      ],
      "http": "409",
      "meaning": "Pause, go-home, or a missing rt-control capability"
    },
    {
      "codes": [
        "dense_session_required",
        "dense_session_mismatch"
      ],
      "http": "400, 409",
      "meaning": "Missing or unknown session_id"
    },
    {
      "codes": [
        "dense_internal"
      ],
      "http": "500",
      "meaning": "Unexpected server error"
    }
  ],
  "components": {
    "schemas": {
      "Error": {
        "type": "object",
        "properties": {
          "error": {
            "type": "string",
            "description": "Stable error code"
          },
          "detail": {
            "type": "string"
          }
        },
        "additionalProperties": true
      }
    }
  }
}
