{
  "openapi": "3.0.3",
  "info": {
    "title": "Qualia API",
    "version": "qualia.v1",
    "description": "The Qualia API, defined in protobuf as `qualia.v1`. Every resource lives under `/v1/accounts/{account}`, where `{account}` is your account id, a lowercase UUID.\n\n**Base URL:** `https://junction-api.qualiastudios.dev`\n\nAuthenticate with an API key in the `X-API-Key` header. Create one in **Settings** in the [Qualia dashboard](https://junction.qualiastudios.dev). `GET` calls need the key's `data:read` scope; every other call needs `data:write`.\n\nEvery call is also served over Connect at `POST /qualia.v1.<Service>/<Method>`.\n\nA call the API refuses returns the gRPC code name in upper case, for example `{\"code\": \"NOT_FOUND\", \"message\": \"…\", \"retryable\": false, \"details\": []}`. Another account's resources answer `NOT_FOUND`. `retryable` is true for `ABORTED`, `UNAVAILABLE`, `RESOURCE_EXHAUSTED`, `DEADLINE_EXCEEDED` and `CANCELED`.\n\nA request the gateway stops before it reaches the API has a different body: `{\"detail\": \"…\"}`. For example: a missing or invalid API key (`401`), a key without the scope or the resources the call needs (`403` or `404`), an environment closed to you (`403`), or a body over the size limit (`413`). Read `code` if the body has one, otherwise `detail`.\n\n**OpenAPI document:** [https://junction-docs.qualiastudios.dev/api/qualia-v1/openapi.json](https://junction-docs.qualiastudios.dev/api/qualia-v1/openapi.json)"
  },
  "servers": [
    {
      "url": "https://junction-api.qualiastudios.dev"
    }
  ],
  "paths": {
    "/v1/accounts/{account}/checkPolicies/{checkPolicy}": {
      "get": {
        "tags": [
          "Checks"
        ],
        "description": "Reads the effective policy and its source for each scheduler half.",
        "operationId": "Checks_GetAutomaticCheckPolicy_Account",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "checkPolicy",
            "in": "path",
            "description": "The checkPolicy id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.AutomaticCheckPolicy"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      },
      "patch": {
        "tags": [
          "Checks"
        ],
        "description": "Updates only the selected halves; an inherit value removes that override.",
        "operationId": "Checks_UpdateAutomaticCheckPolicy_Account",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "checkPolicy",
            "in": "path",
            "description": "The checkPolicy id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "updateMask",
            "in": "query",
            "description": "The halves to change: heuristic, graph, or both. Omitted halves stay put.\n A selected field set to SETTING_UNSPECIFIED clears its override.",
            "schema": {
              "type": "string",
              "format": "field-mask"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/qualia.v1.AutomaticCheckPolicy"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.AutomaticCheckPolicy"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/checks": {
      "get": {
        "tags": [
          "Checks"
        ],
        "description": "Lists the checks.",
        "operationId": "Checks_ListChecks",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "pageSize",
            "in": "query",
            "description": "At most this many; 0 means 100, the maximum is 1000.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "pageToken",
            "in": "query",
            "description": "From a previous response's next_page_token.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.ListChecksResponse"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/checks/{check}": {
      "get": {
        "tags": [
          "Checks"
        ],
        "description": "Gets one check.",
        "operationId": "Checks_GetCheck",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "check",
            "in": "path",
            "description": "The check id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.Check"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/checks/{check}/referenceRanges": {
      "get": {
        "tags": [
          "Checks"
        ],
        "description": "Lists a check's reference ranges. The check may be `-` to list every\n check's.",
        "operationId": "Checks_ListReferenceRanges",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "check",
            "in": "path",
            "description": "The check id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "pageSize",
            "in": "query",
            "description": "At most this many; 0 means 100, the maximum is 1000.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "pageToken",
            "in": "query",
            "description": "From a previous response's next_page_token.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "filter",
            "in": "query",
            "description": "AIP-160 filter. Fields: interface_hash, robot, metric.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.ListReferenceRangesResponse"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/checks/{check}/referenceRanges/{referenceRange}": {
      "get": {
        "tags": [
          "Checks"
        ],
        "description": "Gets one reference range.",
        "operationId": "Checks_GetReferenceRange",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "check",
            "in": "path",
            "description": "The check id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "referenceRange",
            "in": "path",
            "description": "The referenceRange id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.ReferenceRange"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/checks/{check}/referenceRanges/{referenceRange}:confirm": {
      "post": {
        "tags": [
          "Checks"
        ],
        "description": "Replaces a reference range's confirmed bounds, or clears the confirmation.",
        "operationId": "Checks_ConfirmReferenceRange",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "check",
            "in": "path",
            "description": "The check id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "referenceRange",
            "in": "path",
            "description": "The referenceRange id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/qualia.v1.ConfirmReferenceRangeRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.ReferenceRange"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/checks/{check}/results": {
      "get": {
        "tags": [
          "Checks"
        ],
        "description": "Lists a check's results. The check may be `-` to list every check's.",
        "operationId": "Checks_ListCheckResults",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "check",
            "in": "path",
            "description": "The check id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "pageSize",
            "in": "query",
            "description": "At most this many; 0 means 100, the maximum is 1000.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "pageToken",
            "in": "query",
            "description": "From a previous response's next_page_token.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "filter",
            "in": "query",
            "description": "AIP-160 filter. Fields: dataset, episode, state, reach.robot,\n reach.longest_seconds. `dataset` and `episode` take `=` only, ANDed at\n the top level, and choose the scope: `dataset = \"<dataset>\"` lists that\n dataset's handheld and egocentric episodes that carry hand poses on its\n target robot (or the robots `reach.robot` names) at the dataset's\n current reach key (ReachStatus.current_key), reporting NOT_RUN for what\n is not yet computed under it, or, while nothing in the scope has a\n settled result under that key, at the key of the dataset's last finished\n run where that run stored results on the target robot (the last solve,\n under settings since changed; CheckResult.reach.key says which);\n `episode = \"<episode>\"` narrows that to one episode as its dataset sees\n it. Without either, every stored result of the account's workspace at\n each robot's current config, the newest key of each pair.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.ListCheckResultsResponse"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/checks/{check}/results/{result}": {
      "get": {
        "tags": [
          "Checks"
        ],
        "description": "Gets one result: the newest stored for the pair at the robot's current\n model config (a dataset's own key is ListCheckResults'), NOT_RUN when\n there is none; reading queues nothing.",
        "operationId": "Checks_GetCheckResult",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "check",
            "in": "path",
            "description": "The check id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "result",
            "in": "path",
            "description": "The result id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.CheckResult"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/checks/{check}/results/{result}:readReachTrace": {
      "get": {
        "tags": [
          "Checks"
        ],
        "description": "Read one result's bounded sampled solver joint trace. The key must still\n be current for the episode's target robot and settings (or be the key\n ReadReachTracesRequest.expected_key also admits); a stale key is\n FAILED_PRECONDITION, and a trace that could not be read just now is\n UNAVAILABLE. `max_frames` is at most 512 (0 means 512).",
        "operationId": "Checks_ReadReachTrace",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "check",
            "in": "path",
            "description": "The check id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "result",
            "in": "path",
            "description": "The result id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "expectedKey",
            "in": "query",
            "description": "The key from CheckResult.reach.trace. A stale trace is refused.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "maxFrames",
            "in": "query",
            "description": "At most 512 samples. 0 means the maximum.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "dataset",
            "in": "query",
            "description": "Current dataset scope whose settings and pose/calibration identity must\n still produce expected_key; this prevents reading an old shared result\n after placement changes in an upload or any member of a merged dataset.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.ReadReachTraceResponse"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/checks/{check}/runs": {
      "get": {
        "tags": [
          "Checks"
        ],
        "description": "Lists a check's runs, newest first, in the caller's workspace. The check\n may be `-` to list every check's.",
        "operationId": "Checks_ListCheckRuns",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "check",
            "in": "path",
            "description": "The check id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "pageSize",
            "in": "query",
            "description": "At most this many; 0 means 100, the maximum is 1000.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "pageToken",
            "in": "query",
            "description": "From a previous response's next_page_token.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "filter",
            "in": "query",
            "description": "AIP-160 filter. Fields: dataset (a name, `=` and `!=`: a merged\n dataset's name lists its own runs and its uploads'), state, create_time.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.ListCheckRunsResponse"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/checks/{check}/runs/{run}": {
      "get": {
        "tags": [
          "Checks"
        ],
        "description": "Gets one run. NOT_FOUND outside the caller's workspace, and under\n another check than the one it ran.",
        "operationId": "Checks_GetCheckRun",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "check",
            "in": "path",
            "description": "The check id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "run",
            "in": "path",
            "description": "The run id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.CheckRun"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/checks/{check}/runs/{run}:cancel": {
      "post": {
        "tags": [
          "Checks"
        ],
        "description": "Cancels a running VLM or heuristic run: its pipeline run is\n cancelled, which releases the credits it reserved, and the run ends\n FAILED with \"cancelled by\" who asked. A VLM run still QUEUED behind\n another ends so at once: it never starts and reserves nothing. Episodes\n it had not read keep their issues. The check may be `-`: a run's id\n names one run. Needs what RunCheck needs (a write on the dataset).\n FAILED_PRECONDITION for a run that has ended, one still starting its\n pipeline run (ask again in a few seconds) and any other check's run. A\n pipeline cancel that answered late or failed but took ends the run all\n the same. UNAVAILABLE when the pipeline could not be reached or did not\n answer in time and the run does not read cancelled after: it still runs;\n ask again. ABORTED when another cancel or end of a queued run keeps it\n busy: nothing changed; ask again. NOT_FOUND outside the caller's\n workspace.",
        "operationId": "Checks_CancelCheckRun",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "check",
            "in": "path",
            "description": "The check id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "run",
            "in": "path",
            "description": "The run id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/qualia.v1.CancelCheckRunRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.CheckRun"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/checks/{check}:run": {
      "post": {
        "tags": [
          "Checks"
        ],
        "description": "Runs a check over a dataset again; `checks/-` runs the dataset's default\n set (an upload runs episode-rules, a mixture runs mixture; reach is never\n in it, name `checks/reach`). Answers as soon as the run is accepted,\n naming the checks started;\n they run in the background. Their findings land as issues, and a\n finding no longer raised is dismissed as RESOLVED. INVALID_ARGUMENT,\n before anything starts, when the check does not apply to the dataset\n (MIXTURE on an upload, EPISODE_RULES on a mixture, REACH on a dataset\n with no target robot, or one whose target robot is in another workspace,\n VLM when no selected episode has a published task) or the\n selection matches no episode. VLM is FAILED_PRECONDITION on a\n deployment with no VLM check pipeline. On a merged dataset VLM and REACH\n are one run over its own episodes, and the other\n checks run in each upload it holds, one run per upload, the selection\n split by upload; either way the findings are issues of the upload that\n holds each episode, named under the merged dataset. `model` chooses the\n VLM check's model; with `validate_only` nothing starts and the response\n carries the estimate.\n Each run is a CheckRun (`check_runs`): GetCheckRun says where it stands.\n A person's `checks/vlm` while a run of it is on the dataset (an automatic\n run after preparation, or a person's, running or\n queued) waits its turn: its run is recorded QUEUED behind the\n newest such run (`queued_behind`, `queued_reason`) and starts when that\n one ends, reserving only then. Runs queued on one dataset start in the\n order they were asked for. An estimate is never refused for a run in\n flight. A retry with the first call's request_id is answered with its\n receipt.\n\n `checks/reach` is the Run solver press, and it is recorded before the\n answer: the dataset's settings (reach_settings, else the target robot's\n defaults) and the robot's config make the run's key, every episode that\n already has a succeeded result under that key is answered from it (the\n other episodes, failed ones included, are queued), and the run, counted\n in ReachRun, is what GetReachStatus reports. The RunCheck operation ends\n when the work is queued; the run's own progress is the ReachRun. On a\n merged dataset the press is one run over all its episodes, every\n upload's, on its own settings. Succeeded results under its current full\n reach key answer it from storage; separate pre-merge TCP solves can\n have different calibration identities.\n FAILED_PRECONDITION, before anything is queued, on a server where the\n reach check is switched off (nothing would run the work), and for\n `checks/reach` when the target robot has no solver (there is no default\n one, and the dataset's own reach_settings do not give the robot one; a\n `validate_only` press is refused too).",
        "operationId": "Checks_RunCheck",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "check",
            "in": "path",
            "description": "The check id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/qualia.v1.RunCheckRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.RunCheckResponse"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/datasets": {
      "get": {
        "tags": [
          "Datasets"
        ],
        "description": "Lists the datasets of one account (uploads, mixtures and merged datasets).\n An upload that was merged into another dataset (`merged_dataset` is set) is\n left out, unless the filter restricts `slug` to one value (`slug = \"...\"`),\n which is how a page finds a dataset by the name a version cites; `readers`\n to one mixture (`readers = \"...\"`), since a source can pin one of a\n merged-away upload's tags; or `merged_dataset` to one merged dataset,\n which lists the uploads it holds (its history).",
        "operationId": "Datasets_ListDatasets",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "pageSize",
            "in": "query",
            "description": "At most this many datasets; 0 means 100, the maximum is 500.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "pageToken",
            "in": "query",
            "description": "From a previous response's next_page_token.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "filter",
            "in": "query",
            "description": "AIP-160 filter. A merged-away upload is left out unless `slug`, `readers`\n or `merged_dataset` is restricted to one value with `=` (see\n ListDatasets). Fields: kind\n (UPLOAD, MIXTURE or MERGED), state, labels.task, labels.robot,\n labels.operator, labels.method, tags (e.g. `tags : \"umi\"`),\n labels.methods (legacy alias for tags),\n labels.scene, source_robot, target_robot,\n linked_task (e.g. `linked_task = \"accounts/a/tasks/t\"`; `\"\"` for unlinked),\n robot_interface.interface_hash, create_time, update_time, slug, display_name (`:`\n substring), `merged_dataset` (the merged dataset that holds an upload, e.g.\n `merged_dataset = \"accounts/a/datasets/m\"`), and `reads` (datasets a\n mixture reads, e.g. `reads = \"accounts/a/datasets/b\"`), `readers`\n (datasets read by a mixture).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "orderBy",
            "in": "query",
            "description": "\"update_time desc\" (default), \"create_time\", \"display_name\", \"state\".",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.ListDatasetsResponse"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "Datasets"
        ],
        "description": "Creates a mixture. Its sources are added with Mixtures.BatchCreateSources\n (several at once, resolved together) or Mixtures.CreateSource; a mixture\n with no sources reads nothing.",
        "operationId": "Datasets_CreateDataset",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "requestId",
            "in": "query",
            "description": "Idempotency key (AIP-155): a retry with the same id within 24 hours\n returns the first call's result instead of creating a second one.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/qualia.v1.Dataset"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.Dataset"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/datasets/{dataset}": {
      "get": {
        "tags": [
          "Datasets"
        ],
        "description": "Gets one dataset. Of a handheld upload it also says where its poses are\n (poses_at, poses_calibration), which List does not.",
        "operationId": "Datasets_GetDataset",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.Dataset"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "Datasets"
        ],
        "description": "Deletes a mixture, or retires an upload or a merged dataset: it leaves\n every list and its episodes leave every mixture, but nothing is erased,\n and versions that pin its episodes keep resolving. A merged dataset is\n retired with the uploads it holds, which then answer\n NOT_FOUND; an upload bound to append to it that it does not hold (not\n appended yet, or taken back out before merges were final) is unbound.\n Refused with FAILED_PRECONDITION while another mixture reads it by name\n (for a merged dataset, also a pin of one of its uploads' tags; any other\n source left on one of them reads nothing and does not hold it); a\n mixture that reads it through a label source stops reading it. An upload\n merged into another is not deleted on its own (FAILED_PRECONDITION naming\n the merged dataset). A dataset whose episodes are references of Tasks\n (Dataset.task_references) is refused too unless sent with force, which\n removes those references.",
        "operationId": "Datasets_DeleteDataset",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "etag",
            "in": "query",
            "description": "The dataset's current etag, when the caller wants the guard.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "force",
            "in": "query",
            "description": "Delete it even though its episodes are references of Tasks\n (Dataset.task_references), removing those references; the Tasks stay.\n Without it, such a dataset is refused (FAILED_PRECONDITION). Reingests\n and the ingest report live under uploads and are never deleted here.",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {}
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      },
      "patch": {
        "tags": [
          "Datasets"
        ],
        "description": "Edits display_name, description, labels, source_robot, target_robot or\n reach_settings. Emits DATASET_UPDATED (and TARGET_ROBOT_CHANGED for\n target_robot). Saving reach_settings starts nothing: the next RunCheck on\n `checks/reach` uses it, and until then the stored results stay as they are.\n A merged dataset's source_robot, target_robot and reach_settings are\n written to each upload it holds that differs (each records its own events;\n a source robot is the upload's explicit assignment). Its tags, labels,\n compatibility collection axes and linked_task are stored on C alone. An upload merged into another is written\n through it: any edit of one is FAILED_PRECONDITION naming the merged\n dataset.",
        "operationId": "Datasets_UpdateDataset",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "updateMask",
            "in": "query",
            "description": "Which fields to change: display_name, description, tags (custom edits\n with unchanged derived classifications), labels (not a mixture),\n labels.methods (legacy six-method projection), source_robot (not a\n mixture), target_robot, reach_settings (replace as a whole), linked_task\n (not a mixture). A merged dataset's collection tags and labels are its\n own; source_robot, target_robot and reach_settings also change its uploads.\n \"*\", or no mask, preserves an absent/default empty repeated field; use\n the exact tags mask to deliberately clear customs. Change reserved\n classifications through their metadata paths instead.",
            "schema": {
              "type": "string",
              "format": "field-mask"
            }
          },
          {
            "name": "humanMethodsOnly",
            "in": "query",
            "description": "With the exact labels.methods mask, replace only umi/teleop/egocentric\n on the selected dataset, preserving its other collection tags. The\n supplied methods must contain only that human subset; [] deliberately\n records Unknown and suppresses inference. Independent-axis aliases are\n retained through the canonical collection set. A merged dataset changes\n only its own tags. Clients must observe all three optional axis fields\n in a server reply before using this intent: older servers may ignore this\n flag and would treat the list as a full replacement.",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "relinkEpisodes",
            "in": "query",
            "description": "With linked_task in the mask, on an upload or a merged dataset\n (the takes of every upload it holds): the takes that link the\n dataset's previous Task themselves drop that link and read the new one.\n Takes linking any other task keep their link. Without it, only the takes\n with no link of their own follow the change. Count them first with\n SummarizeEpisodes,\n `linked_task = \"<previous>\" AND linked_task_inherited = false`.",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/qualia.v1.Dataset"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.Dataset"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/datasets/{dataset}/cameraLags": {
      "get": {
        "tags": [
          "Datasets"
        ],
        "description": "Reads per-camera lag estimates and current stamp offsets for an upload,\n or every upload held by a merged dataset. Untrusted estimates are reported\n but never applied implicitly.",
        "operationId": "Datasets_GetCameraLags",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.CameraLags"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/datasets/{dataset}/checkPolicies/{checkPolicy}": {
      "get": {
        "tags": [
          "Checks"
        ],
        "description": "Reads the effective policy and its source for each scheduler half.",
        "operationId": "Checks_GetAutomaticCheckPolicy_Dataset",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "checkPolicy",
            "in": "path",
            "description": "The checkPolicy id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.AutomaticCheckPolicy"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      },
      "patch": {
        "tags": [
          "Checks"
        ],
        "description": "Updates only the selected halves; an inherit value removes that override.",
        "operationId": "Checks_UpdateAutomaticCheckPolicy_Dataset",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "checkPolicy",
            "in": "path",
            "description": "The checkPolicy id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "updateMask",
            "in": "query",
            "description": "The halves to change: heuristic, graph, or both. Omitted halves stay put.\n A selected field set to SETTING_UNSPECIFIED clears its override.",
            "schema": {
              "type": "string",
              "format": "field-mask"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/qualia.v1.AutomaticCheckPolicy"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.AutomaticCheckPolicy"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/datasets/{dataset}/checks": {
      "get": {
        "tags": [
          "Checks"
        ],
        "description": "Lists the catalog's checks as one dataset sees them: every\n active check version, grouped by category in the order returned, each\n with whether it can run on this dataset now and its latest completed\n result here. A check that cannot run is listed with the reason, never\n left out. NOT_FOUND outside the caller's workspace.",
        "operationId": "Checks_ListDatasetChecks",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "pageSize",
            "in": "query",
            "description": "At most this many; 0 means 100, the maximum is 1000.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "pageToken",
            "in": "query",
            "description": "From a previous response's next_page_token.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.ListDatasetChecksResponse"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/datasets/{dataset}/checks/{check}/findings": {
      "get": {
        "tags": [
          "Checks"
        ],
        "description": "Lists the findings catalog checks wrote on a dataset, newest first: one\n per check, episode and finding key per run. The check may be `-` for\n every check's. Findings written before the catalog (templates)\n are listed under the check their template maps to, with `legacy` set.\n\n By default only the findings that stand: for each check and episode,\n those of the newest run of that check (by start) that read the episode\n at its linked revision, the Task and revision its link carries\n (Episode.linked_task_revision: its own link's, else its dataset's).\n Publishing a newer revision changes nothing; after a relink an episode\n has none until a run reads the new revision. A draft link carries no\n revision, nor does an episode with no link: there a finding stands while\n its Task is published at the revision it read (a draft's until the Task\n is first published), and one whose Task the workspace no longer has has\n no newer revision. Under any link only the linked Task's findings stand:\n a link moved to another Task, published or not, leaves none until a run\n reads that Task. A finding with no Task has no revision. A heuristic\n check has no Task revision: its findings are its issues, each as its\n newest run left it. The filter `all_revisions = true` lists every run's\n findings.",
        "operationId": "Checks_ListCheckFindings",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "check",
            "in": "path",
            "description": "The check id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "pageSize",
            "in": "query",
            "description": "At most this many; 0 means 100, the maximum is 1000.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "pageToken",
            "in": "query",
            "description": "From a previous response's next_page_token.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "filter",
            "in": "query",
            "description": "AIP-160 filter. Fields: check_run, episode (names, `=`), verdict, and\n all_revisions (`true` lists superseded runs' findings too; default\n `false`: only the findings that stand). Terms join with AND.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.ListCheckFindingsResponse"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/datasets/{dataset}/checks:run": {
      "post": {
        "tags": [
          "Checks"
        ],
        "description": "Runs catalog checks over a dataset as one run: the union of\n `check_ids`, `categories` and `all`, deduplicated, on the episodes of\n `selection`, sampled to `max_episodes`. The selection is resolved and\n pinned before the estimate (check versions, Task revisions, episodes),\n and the run reads exactly what was pinned. One model call per episode\n reads every selected VLM check. An episode a check cannot read (no\n published Task for a Task check) is skipped for that check, never\n passed. `all` and a category take the checks that can run and list the\n rest in `skipped_checks`. INVALID_ARGUMENT, before anything starts, for\n an empty selection, an unknown check id or category, a named check that\n cannot run on this dataset, a selection none of whose checks can run, or\n when no episode is eligible for any selected check;\n FAILED_PRECONDITION on a deployment with no checks runner, and, for a\n person's run, while a selected check is still running on this dataset:\n the message names that run, which DatasetCheck.running_check_run also\n lists. An estimate (`validate_only`) is answered either way. A retry with\n the first call's request_id is answered with its run, not refused. With\n `validate_only` nothing starts and nothing is reserved: the response\n carries the resolved selection and pipeline-api's bound for it, the\n same bound a run reserves. A run needs `max_cost` at or above that\n bound. Each run is a CheckRun under `checks/vlm`.",
        "operationId": "Checks_RunDatasetChecks",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/qualia.v1.RunDatasetChecksRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.RunDatasetChecksResponse"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/datasets/{dataset}/episodes": {
      "get": {
        "tags": [
          "Episodes"
        ],
        "description": "Lists the episodes of a dataset in recording order (for a mixture: its\n pool, source by source). `parent` may be `accounts/a/datasets/-` to read\n across every dataset of the account (ExploreLake's successor).",
        "operationId": "Episodes_ListEpisodes",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "pageSize",
            "in": "query",
            "description": "At most this many episodes; 0 means 100, the maximum is 1000.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "pageToken",
            "in": "query",
            "description": "From a previous response's next_page_token.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "filter",
            "in": "query",
            "description": "AIP-160 filter. e.g. `state = UNREVIEWED AND open_issue_codes:\"jerky\"`,\n `note_codes:\"graph_outcome\"`, `methods:\"umi\"`, `version = \"1.0\"`,\n `metrics.duration_seconds < 20`,\n `viewed = false`, `linked_task_inherited = false`, `draft = true`\n (takes with a draft, Episode.draft).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "orderBy",
            "in": "query",
            "description": "\"index\" (default: recording order, source by source in a mixture),\n \"record_time\", \"metrics.<field> desc\", \"open_issue_count desc\".",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "view",
            "in": "query",
            "description": "EPISODE_VIEW_ANALYSIS adds each episode's Episode.analysis, its\n channels' progress only: a channel's curves are GetEpisode's. It signs\n no posters (Episode.posters is empty): a reader of every take's profile\n shows few posters, and reads those with GetEpisode.",
            "schema": {
              "enum": [
                "EPISODE_VIEW_UNSPECIFIED",
                "EPISODE_VIEW_BASIC",
                "EPISODE_VIEW_ANALYSIS"
              ],
              "type": "string",
              "format": "enum"
            }
          },
          {
            "name": "version",
            "in": "query",
            "description": "Read as this version froze it: a tag, `stable`, `v0` or a\n digest prefix; empty or `head` reads the episode as it is now. The list\n holds that version's episodes, each with the fields, trim and subtasks of\n the revision it pinned (task and tags as its snapshot froze them, also\n for an episode never edited); standing, decision, issues and markers are\n current. A version the dataset does not have is NOT_FOUND.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.ListEpisodesResponse"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/datasets/{dataset}/episodes/{episode}": {
      "get": {
        "tags": [
          "Episodes"
        ],
        "description": "Gets one episode as its parent dataset sees it.",
        "operationId": "Episodes_GetEpisode",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "episode",
            "in": "path",
            "description": "The episode id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "view",
            "in": "query",
            "description": "EPISODE_VIEW_ANALYSIS adds Episode.analysis with every channel's\n autocorrelation and alignment curves.",
            "schema": {
              "enum": [
                "EPISODE_VIEW_UNSPECIFIED",
                "EPISODE_VIEW_BASIC",
                "EPISODE_VIEW_ANALYSIS"
              ],
              "type": "string",
              "format": "enum"
            }
          },
          {
            "name": "version",
            "in": "query",
            "description": "Read as this version froze it: a tag, `stable`, `v0` or a\n digest prefix; empty or `head` reads the episode as it is now. Its\n fields, trim and subtasks are the revision that version pinned (task and\n tags as its snapshot froze them; markers are current), and `revision` and\n `etag` name it, so an edit sent with them is refused once the episode has\n moved on. NOT_FOUND when the version does not hold it.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.Episode"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      },
      "patch": {
        "tags": [
          "Episodes"
        ],
        "description": "Deprecated: use UpdateEpisodes with one edit, which this now runs. Kept for one release for clients built before it.\n Edits task, instruction, method, methods, scene, tags or outcome, which\n writes one episode revision and emits EPISODE_EDITED, or draws trim or\n subtasks on the take's draft, as UpdateEpisodes does. Edits are the\n take's own and read the same from every scope.",
        "operationId": "Episodes_UpdateEpisode",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "episode",
            "in": "path",
            "description": "The episode id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "updateMask",
            "in": "query",
            "description": "Which fields to change: task, instruction, method, methods, scene, tags,\n outcome, trim, subtasks. Use methods to explicitly replace or clear tags;",
            "schema": {
              "type": "string",
              "format": "field-mask"
            }
          },
          {
            "name": "requestId",
            "in": "query",
            "description": "Optional UUID4 identifying this logical edit. Reusing it with the same\n caller and request returns the original result; different input conflicts.\n When absent, each call starts a new logical edit.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/qualia.v1.Episode"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.Episode"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/datasets/{dataset}/episodes/{episode}/draft": {
      "get": {
        "tags": [
          "Episodes"
        ],
        "description": "The take's draft, through any dataset that reads the take. NOT_FOUND\n when it has none.",
        "operationId": "Episodes_GetEpisodeDraft",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "episode",
            "in": "path",
            "description": "The episode id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.EpisodeDraft"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "Episodes"
        ],
        "description": "Discards the take's draft. Idempotent when it has none. Refused as\n UpdateEpisodeDraft refuses.",
        "operationId": "Episodes_DeleteEpisodeDraft",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "episode",
            "in": "path",
            "description": "The episode id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "etag",
            "in": "query",
            "description": "When set, refuses (ABORTED) if the draft changed since it was read.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {}
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      },
      "patch": {
        "tags": [
          "Episodes"
        ],
        "description": "Saves the take's draft as drawn: replaces the drawing and its base, or\n creates the draft (allow_missing). The person holding the take's live\n edit lease saves it, and so does any caller with write access, a person\n or an API key, while no other person holds one; another person's live\n lease is FAILED_PRECONDITION, naming them. A stale etag is ABORTED (read\n the draft again); a drawing past the bounds is INVALID_ARGUMENT. Nothing\n is applied: the dataset's head keeps the take as it is.",
        "operationId": "Episodes_UpdateEpisodeDraft",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "episode",
            "in": "path",
            "description": "The episode id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "allowMissing",
            "in": "query",
            "description": "Create the draft when the take has none; without it, NOT_FOUND.",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/qualia.v1.EpisodeDraft"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.EpisodeDraft"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/datasets/{dataset}/episodes/{episode}/revisions": {
      "get": {
        "tags": [
          "Episodes"
        ],
        "description": "An episode's edits, newest first, then the recording as revision 0; an\n episode nobody edited lists nothing. The history is the take's: the same\n through any dataset that holds it.",
        "operationId": "Episodes_ListEpisodeRevisions",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "episode",
            "in": "path",
            "description": "The episode id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "pageSize",
            "in": "query",
            "description": "At most this many; 0 means 50, the maximum is 500.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "pageToken",
            "in": "query",
            "description": "From a previous response's next_page_token.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "revisions",
            "in": "query",
            "description": "Optional exact revisions (at most two, nonnegative). Cannot be combined\n with page_token. Missing revisions are omitted, never replaced by head.",
            "schema": {
              "type": "array",
              "items": {
                "type": "integer",
                "format": "int32"
              }
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.ListEpisodeRevisionsResponse"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/datasets/{dataset}/episodes/{episode}:acquireEpisodeLease": {
      "post": {
        "tags": [
          "Episodes"
        ],
        "description": "Takes the take's edit lease for the caller and this tab. A\n lease is per take: it holds through every dataset that reads it. One\n lease per person: when the caller already holds it, the tab joins it and\n it is renewed. It lapses 30 s after the last renewal. FAILED_PRECONDITION,\n \"episode is being edited by <name> until <time>\", when another person\n holds a live one; GetEpisode's `lease` names them.",
        "operationId": "Episodes_AcquireEpisodeLease",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "episode",
            "in": "path",
            "description": "The episode id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/qualia.v1.AcquireEpisodeLeaseRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.AcquireEpisodeLeaseResponse"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/datasets/{dataset}/episodes/{episode}:locate": {
      "get": {
        "tags": [
          "Episodes"
        ],
        "description": "Where one episode sits in a filtered, ordered list of its dataset: its\n position and neighbours, for \"12 / 340\" and prev / next in the studio. NOT_FOUND when the filter excludes it.",
        "operationId": "Episodes_LocateEpisode",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "episode",
            "in": "path",
            "description": "The episode id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "filter",
            "in": "query",
            "description": "Same language as ListEpisodes.filter.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "orderBy",
            "in": "query",
            "description": "Same values as ListEpisodes.order_by.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "pageSize",
            "in": "query",
            "description": "The page size the returned page_token is for; same rules as\n ListEpisodes.page_size. Pass the same value to ListEpisodes.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "version",
            "in": "query",
            "description": "Locate it in the list as this version froze it, the one\n ListEpisodes.version reads: that version's episodes, in its order. Same\n values as ListEpisodes.version; pass the same value to ListEpisodes.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.LocateEpisodeResponse"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/datasets/{dataset}/episodes/{episode}:markViewed": {
      "post": {
        "tags": [
          "Episodes"
        ],
        "description": "Records that the caller opened an episode. Idempotent.\n Viewed is kept per person, so an API key gets FAILED_PRECONDITION.",
        "operationId": "Episodes_MarkEpisodeViewed",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "episode",
            "in": "path",
            "description": "The episode id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/qualia.v1.MarkEpisodeViewedRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.MarkEpisodeViewedResponse"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/datasets/{dataset}/episodes/{episode}:releaseEpisodeLease": {
      "post": {
        "tags": [
          "Episodes"
        ],
        "description": "Takes this tab off the caller's lease, and ends the lease when it was\n the last tab. Idempotent: no lease, or another person's, is left as is.",
        "operationId": "Episodes_ReleaseEpisodeLease",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "episode",
            "in": "path",
            "description": "The episode id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/qualia.v1.ReleaseEpisodeLeaseRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.ReleaseEpisodeLeaseResponse"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/datasets/{dataset}/episodes/{episode}:renewEpisodeLease": {
      "post": {
        "tags": [
          "Episodes"
        ],
        "description": "Renews the caller's lease for 30 s more. NOT_FOUND when it lapsed, was\n taken over, or this tab released it: acquire again or show view only.",
        "operationId": "Episodes_RenewEpisodeLease",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "episode",
            "in": "path",
            "description": "The episode id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/qualia.v1.RenewEpisodeLeaseRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.RenewEpisodeLeaseResponse"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/datasets/{dataset}/episodes/{episode}:sampleSeries": {
      "get": {
        "tags": [
          "Episodes"
        ],
        "description": "The episode's joint series: each state and action channel sampled evenly\n over the take's current content: the joints drawer's charts, and the\n arm's motion the camera lag drawer sets each camera's offset against.\n Its window says where those samples sit in the episode's recording.\n A handheld take resolved at its TCP also has the hands' TCP poses, when\n streams names TCP.\n A take in no published version yet answers unpublished, with no\n channels; FAILED_PRECONDITION means the published content cannot be\n sampled (a column type it cannot read, say).",
        "operationId": "Episodes_SampleEpisodeSeries",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "episode",
            "in": "path",
            "description": "The episode id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "maxPoints",
            "in": "query",
            "description": "Samples to return at most, 2 to 2000; 400 when unset. A take with fewer\n frames returns every frame. The first and last frame are always samples.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "streams",
            "in": "query",
            "description": "The vectors to sample, each at most once; STATE and ACTION when empty\n (TCP only when named). A take whose action cannot be read still answers\n for its state alone, and one with no TCP (not a handheld take resolved at\n its TCP) answers for the rest without it.",
            "schema": {
              "type": "array",
              "items": {
                "enum": [
                  "STREAM_UNSPECIFIED",
                  "STATE",
                  "ACTION",
                  "TCP"
                ],
                "type": "string",
                "format": "enum"
              }
            }
          },
          {
            "name": "version",
            "in": "query",
            "description": "Read as this version froze it: a tag, `stable`, `v0` or a\n digest prefix; empty or `head` reads the episode as it is now. As\n GetEpisodeRequest.version: the series of the member that version holds.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.SampleEpisodeSeriesResponse"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/datasets/{dataset}/episodes/{episode}:signVideos": {
      "get": {
        "tags": [
          "Episodes"
        ],
        "description": "Signs the episode's camera videos for playback: one short-lived URI per\n camera, of the take's current content (the member of its upload's\n published version), and where that content sits in the episode's\n recording (window_start_seconds, window_end_seconds): after a trim the\n files play the kept stretch alone. Read it again once a URI expires. A\n take in no published version yet (a split child before its publish)\n answers unpublished, with no videos; FAILED_PRECONDITION means the\n published content cannot be signed (an object or storage missing).",
        "operationId": "Episodes_SignEpisodeVideos",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "episode",
            "in": "path",
            "description": "The episode id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "version",
            "in": "query",
            "description": "Read as this version froze it: a tag, `stable`, `v0` or a\n digest prefix; empty or `head` reads the episode as it is now. As\n GetEpisodeRequest.version: the videos of the member that version holds.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.SignEpisodeVideosResponse"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/datasets/{dataset}/episodes/{episode}:takeOverEpisodeLease": {
      "post": {
        "tags": [
          "Episodes"
        ],
        "description": "Replaces another person's live lease with the caller's, for this tab,\n and records EPISODE_LEASE_TAKEN (not undoable). Admins and owners only.\n With no live lease of another person it acquires, and records nothing.",
        "operationId": "Episodes_TakeOverEpisodeLease",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "episode",
            "in": "path",
            "description": "The episode id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/qualia.v1.TakeOverEpisodeLeaseRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.TakeOverEpisodeLeaseResponse"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/datasets/{dataset}/episodes/{episode}:unsplit": {
      "post": {
        "tags": [
          "Episodes"
        ],
        "description": "Discards the split drawn on an episode's draft, with the draft. With\n none drawn, removes children a split wrote and never published; a published split's pieces stay.",
        "operationId": "Episodes_UnsplitEpisode",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "episode",
            "in": "path",
            "description": "The episode id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/qualia.v1.UnsplitEpisodeRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.UnsplitEpisodeResponse"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/datasets/{dataset}/episodes:assignTask": {
      "post": {
        "tags": [
          "Episodes"
        ],
        "description": "Sets one task label on every selected episode of an upload in a single\n publication: all of them or none. Episodes whose task already\n reads that label are left as they are; the rest get one revision each and\n share one TASK_ASSIGNED event. Selection runs over the upload's episodes,\n which do not include the children of a split: a split parent takes the\n label, and its children take it with it in the same publication.\n Through a merged dataset the selection is split by the upload\n that holds each episode: one such publication per upload.",
        "operationId": "Episodes_AssignTask",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/qualia.v1.AssignTaskRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.AssignTaskResponse"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/datasets/{dataset}/episodes:batchSampleSeries": {
      "get": {
        "tags": [
          "Episodes"
        ],
        "description": "Several episodes' series at once, each as SampleEpisodeSeries samples it: what a dataset's trajectories read. The takes are read\n together, so the artifacts they share are opened once and their reads\n overlap; each take still answers on its own, so one that cannot be read\n fails alone. Up to 50 takes, each an episode of the parent, and 20000\n samples (the takes times max_points).",
        "operationId": "Episodes_BatchSampleEpisodeSeries",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "names",
            "in": "query",
            "description": "The takes, 1 to 50, each an episode of the parent:\n accounts/{account}/datasets/{dataset}/episodes/{episode}. Answered in\n this order.",
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          {
            "name": "maxPoints",
            "in": "query",
            "description": "As SampleEpisodeSeriesRequest.max_points, for every take. The takes\n times max_points (400 when unset) are at most 20000: 50 takes at 400, or\n 10 at 2000.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "streams",
            "in": "query",
            "description": "As SampleEpisodeSeriesRequest.streams, for every take.",
            "schema": {
              "type": "array",
              "items": {
                "enum": [
                  "STREAM_UNSPECIFIED",
                  "STATE",
                  "ACTION",
                  "TCP"
                ],
                "type": "string",
                "format": "enum"
              }
            }
          },
          {
            "name": "version",
            "in": "query",
            "description": "As SampleEpisodeSeriesRequest.version, for every take.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.BatchSampleEpisodeSeriesResponse"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/datasets/{dataset}/episodes:keep": {
      "post": {
        "tags": [
          "Episodes"
        ],
        "description": "Keeps episodes in the parent's scope, closing their open issues in that\n scope only. Through a mixture, episodes not KEPT upstream are\n skipped and upstream issues are never touched.",
        "operationId": "Episodes_KeepEpisodes",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/qualia.v1.KeepEpisodesRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.KeepEpisodesResponse"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/datasets/{dataset}/episodes:linkTaskLabels": {
      "post": {
        "tags": [
          "Episodes"
        ],
        "description": "Links the unlinked episodes, uploads and merged datasets of the caller's\n workspace whose free-text task label is a task's name (a merged\n dataset by its own labels.task, and never an upload a merge\n took, which keeps its Task, though its episodes are linked). Publishing a\n task links its exact matches on its own; this call previews them\n (validate_only) beside the near misses, labels that differ from the name\n only in case, spacing or punctuation, and links the labels the caller\n picks. A link already set, to this task or another, is never changed,\n and labels stay as they are. Each upload or merged dataset it links\n anything in records one TASK_ASSIGNED.",
        "operationId": "Episodes_LinkTaskLabels",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/qualia.v1.LinkTaskLabelsRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.LinkTaskLabelsResponse"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/datasets/{dataset}/episodes:reject": {
      "post": {
        "tags": [
          "Episodes"
        ],
        "description": "Rejects episodes in the parent's scope. In a mixture the reject is the\n mixture's; episodes not KEPT upstream are skipped.",
        "operationId": "Episodes_RejectEpisodes",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/qualia.v1.RejectEpisodesRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.RejectEpisodesResponse"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/datasets/{dataset}/episodes:reset": {
      "post": {
        "tags": [
          "Episodes"
        ],
        "description": "Withdraws the standing ruling made in the parent's scope, so the episode\n falls back to what stood before. Withdrawing a keep reopens the blocking\n issues that keep closed (RulingResult.reopened_issue_count).",
        "operationId": "Episodes_ResetEpisodes",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/qualia.v1.ResetEpisodesRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.ResetEpisodesResponse"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/datasets/{dataset}/episodes:restore": {
      "post": {
        "tags": [
          "Episodes"
        ],
        "description": "Puts back episodes ingest validation rejected, with a required reason. They become UNREVIEWED with their validation issues open.\n Upload scope only.",
        "operationId": "Episodes_RestoreEpisodes",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/qualia.v1.RestoreEpisodesRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.RestoreEpisodesResponse"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/datasets/{dataset}/episodes:reviewSuggestions": {
      "post": {
        "tags": [
          "Episodes"
        ],
        "description": "Settles every PROPOSED subtask span of one origin over the episodes a\n filter leaves: accept or reject in one call.",
        "operationId": "Episodes_ReviewSuggestions",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/qualia.v1.ReviewSuggestionsRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.ReviewSuggestionsResponse"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/datasets/{dataset}/episodes:split": {
      "post": {
        "tags": [
          "Episodes"
        ],
        "description": "Splits episodes at given cuts, around kept windows or at their markers: each split is drawn on the episode's draft\n (EpisodeDraft), its pieces the windows kept, each tagged with the labels\n of the markers that closed it, inside the window the draft keeps (else\n the episode's trim). No episode is made until a version is published\n from a Publish preview. An episode whose draft draws a split already is\n refused (marker cuts skip it); one another person is editing is left as\n it is and reported in `locked`.",
        "operationId": "Episodes_SplitEpisodes",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/qualia.v1.SplitEpisodesRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.SplitEpisodesResponse"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/datasets/{dataset}/episodes:summarize": {
      "get": {
        "tags": [
          "Episodes"
        ],
        "description": "Counts, facets and metric distributions over the episodes a filter leaves:\n what the filter chips, the status bar and the outlier cards read.",
        "operationId": "Episodes_SummarizeEpisodes",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "filter",
            "in": "query",
            "description": "Same language as ListEpisodes.filter.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "facets",
            "in": "query",
            "description": "Facet fields to count, e.g. \"state\", \"open_issue_codes\", \"note_codes\", \"task\",\n \"instruction\", \"tags\",\n \"operator\", \"method\", \"methods\", \"scene\", \"rig\", \"upload\", \"outcome\",\n \"linked_task\",\n \"metrics.quality_tier\", \"metrics.jerky\", \"viewed\", \"decision.actor.kind\".\n Empty means state only.",
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          {
            "name": "metrics",
            "in": "query",
            "description": "Metric fields to describe, e.g. \"metrics.duration_seconds\".",
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          {
            "name": "binCount",
            "in": "query",
            "description": "Histogram bins per metric; 0 means 30.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.SummarizeEpisodesResponse"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/datasets/{dataset}/episodes:update": {
      "post": {
        "tags": [
          "Episodes"
        ],
        "description": "Edits episodes of a dataset in one call: task, instruction,\n method, methods, scene, tags, outcome, trim, subtasks or linked_task,\n each edit with its own field mask and etag. All or nothing: every edit\n lands or none does, and the first invalid one is named in the error.\n A trim and subtasks are drawn on each take's draft (EpisodeDraft), as\n the studio draws them, and nothing reaches the dataset until a version is\n published from a Publish preview; the reply is each take as it reads,\n its `draft` showing what is drawn. Every other field is a label,\n published on the take: several label edits publish together, one\n revision per changed episode and one EPISODE_EDITED, so a hundred cost\n about what one does; they must all be held by one upload, and\n linked_task is edited one episode per call (AssignTask links many). A\n call of both is INVALID_ARGUMENT. One edit is what UpdateEpisode was.\n Edits are the take's own and read the same from every scope.",
        "operationId": "Episodes_UpdateEpisodes",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/qualia.v1.UpdateEpisodesRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.UpdateEpisodesResponse"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/datasets/{dataset}/ingestReport": {
      "get": {
        "tags": [
          "Datasets"
        ],
        "description": "The structured report an upload's ingest wrote (meta/ingest_report.json at\n the latest publication). NOT_FOUND when the upload has none;\n FAILED_PRECONDITION on a mixture.\n\n A merged dataset answers its uploads' reports folded into one,\n in the shape of an upload's: `sources` are those of its base upload (the\n first, in merge order, that holds the commonest time sync, named in\n `base`), `findings` are the processing findings of every upload rolled up\n by what they are about, each with the number of uploads it was found in,\n `sync_agreement` says how many uploads hold the base's time sync and how\n the others differ, and `uploads` counts the reports read, absent,\n unreadable and not yet read. The read is bounded in time: a call that\n finds uploads unread answers what it has and the next goes further.\n NOT_FOUND when none of its uploads has a report; UNAVAILABLE (try again)\n when nothing can be folded yet because an upload is still unread or a\n read of a report failed in a way a retry may mend.",
        "operationId": "Datasets_GetIngestReport",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.IngestReport"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/datasets/{dataset}/issues": {
      "get": {
        "tags": [
          "Issues"
        ],
        "description": "Lists the issues and notes of a dataset. For a mixture this is its own\n plus the upstream issues (its uploads', and any mixture's in between) on\n the episodes it reads; those keep their own names (their own dataset in\n the path) and are read-only here. Filter on `dataset` to narrow to one\n scope (a merged dataset's issues on its takes are stored in the uploads\n it holds). For a merged dataset it is the issues of every upload it holds\n and its own, all named under it.",
        "operationId": "Issues_ListIssues",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "pageSize",
            "in": "query",
            "description": "At most this many issues; 0 means 100, the maximum is 1000.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "pageToken",
            "in": "query",
            "description": "From a previous response's next_page_token.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "filter",
            "in": "query",
            "description": "AIP-160 filter. Fields: episode (a name, or \"\" for dataset-level), code,\n kind, state, blocks, author.kind, author.user, dataset (the scope),\n check (a check name: `check = \"accounts/{a}/checks/vlm\"`), recommended,\n create_time, and `episode_state` (the episode's standing\n here, e.g. `episode_state != REJECTED` hides what a reject answered).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "orderBy",
            "in": "query",
            "description": "\"create_time\" (default), \"create_time desc\", \"code\", \"episode\".",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.ListIssuesResponse"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "Issues"
        ],
        "description": "Raises an issue or writes a note, in a person's own words, on an episode\n or the whole dataset. A blocking issue raised on an episode a person\n ruled clears that ruling in this scope (withdrawing the issue restores\n it).",
        "operationId": "Issues_CreateIssue",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "requestId",
            "in": "query",
            "description": "Idempotency key (AIP-155): a retry with the same id within 24 hours\n returns the first call's result instead of creating a second one.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/qualia.v1.Issue"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.Issue"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/datasets/{dataset}/issues/{issue}": {
      "get": {
        "tags": [
          "Issues"
        ],
        "description": "Gets one issue.",
        "operationId": "Issues_GetIssue",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "issue",
            "in": "path",
            "description": "The issue id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.Issue"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "Issues"
        ],
        "description": "Withdraws a person's own issue or note. FAILED_PRECONDITION when others\n have replied, unless `force` also deletes their replies. Restores the\n ruling its raise cleared, when nothing has ruled since.",
        "operationId": "Issues_DeleteIssue",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "issue",
            "in": "path",
            "description": "The issue id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "force",
            "in": "query",
            "description": "Also delete replies other people wrote under it.",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {}
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      },
      "patch": {
        "tags": [
          "Issues"
        ],
        "description": "Edits a person's own text, body or moment, or converts any issue between\n issue and note with `blocks`.",
        "operationId": "Issues_UpdateIssue",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "issue",
            "in": "path",
            "description": "The issue id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "updateMask",
            "in": "query",
            "description": "Which fields to change: text, body, time_seconds (a person's own only),\n blocks (any).",
            "schema": {
              "type": "string",
              "format": "field-mask"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/qualia.v1.Issue"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.Issue"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/datasets/{dataset}/issues/{issue}/replies": {
      "get": {
        "tags": [
          "Issues"
        ],
        "description": "Lists the replies under an issue, oldest first.",
        "operationId": "Issues_ListReplies",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "issue",
            "in": "path",
            "description": "The issue id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "pageSize",
            "in": "query",
            "description": "At most this many replies; 0 means 100, the maximum is 500.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "pageToken",
            "in": "query",
            "description": "From a previous response's next_page_token.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.ListRepliesResponse"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "Issues"
        ],
        "description": "Replies under an issue or note. Emits REPLY_ADDED.",
        "operationId": "Issues_CreateReply",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "issue",
            "in": "path",
            "description": "The issue id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "requestId",
            "in": "query",
            "description": "Idempotency key (AIP-155): a retry with the same id within 24 hours\n returns the first call's result instead of creating a second one.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/qualia.v1.Reply"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.Reply"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/datasets/{dataset}/issues/{issue}/replies/{reply}": {
      "get": {
        "tags": [
          "Issues"
        ],
        "description": "Gets one reply.",
        "operationId": "Issues_GetReply",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "issue",
            "in": "path",
            "description": "The issue id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "reply",
            "in": "path",
            "description": "The reply id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.Reply"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "Issues"
        ],
        "description": "Deletes one's own reply. Emits REPLY_DELETED.",
        "operationId": "Issues_DeleteReply",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "issue",
            "in": "path",
            "description": "The issue id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "reply",
            "in": "path",
            "description": "The reply id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {}
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      },
      "patch": {
        "tags": [
          "Issues"
        ],
        "description": "Edits one's own reply. Emits REPLY_EDITED.",
        "operationId": "Issues_UpdateReply",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "issue",
            "in": "path",
            "description": "The issue id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "reply",
            "in": "path",
            "description": "The reply id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "updateMask",
            "in": "query",
            "description": "Which fields to change: text.",
            "schema": {
              "type": "string",
              "format": "field-mask"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/qualia.v1.Reply"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.Reply"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/datasets/{dataset}/issues:dismiss": {
      "post": {
        "tags": [
          "Issues"
        ],
        "description": "Dismisses issues by name or by filter, e.g. one kind on every episode at\n once. Only issues scoped to the parent: through a mixture,\n upstream issues are never matched by a filter and are refused\n (INVALID_ARGUMENT, not under parent) when named. No ruling moves. For a\n merged dataset the issues of the uploads it holds are its own to dismiss\n (by filter, or named under it as a read names them, or under their\n upload).",
        "operationId": "Issues_DismissIssues",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/qualia.v1.DismissIssuesRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.DismissIssuesResponse"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/datasets/{dataset}/issues:reopen": {
      "post": {
        "tags": [
          "Issues"
        ],
        "description": "Reopens dismissed issues scoped to the parent (same matching rule as\n DismissIssues). An episode a person ruled with a reopened issue becomes\n unreviewed again in that scope.",
        "operationId": "Issues_ReopenIssues",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/qualia.v1.ReopenIssuesRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.ReopenIssuesResponse"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/datasets/{dataset}/issues:summarize": {
      "get": {
        "tags": [
          "Issues"
        ],
        "description": "Counts per code and state over the same set ListIssues returns for the\n same parent and filter (for a mixture: its own plus upstream issues);\n `dataset = \"<parent>\"` in the filter narrows to the parent's own scope.\n The overview's issues table passes `dataset = parent` for the\n rows it offers actions on, since only those can be dismissed there.",
        "operationId": "Issues_SummarizeIssues",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "filter",
            "in": "query",
            "description": "Same language as ListIssues.filter.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.SummarizeIssuesResponse"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/datasets/{dataset}/mergeHistory": {
      "get": {
        "tags": [
          "Versions"
        ],
        "description": "Reads the merge and revert events for one dataset, newest first. A merge\n is final: the reverts recorded before then are history, and\n no entry can be reverted now.",
        "operationId": "Versions_GetMergeHistory",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.MergeHistory"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/datasets/{dataset}/preparation": {
      "get": {
        "tags": [
          "Datasets"
        ],
        "description": "What the newest prepare run did to an upload (every upload is prepared\n after it lands): the Task it matched and applied, or the Task it drafted;\n the takes it split; the dataset's own task names and the decisions a\n person made on them. A dataset with no run (a merged dataset, an upload\n before preparation existed) answers state NONE.",
        "operationId": "Datasets_GetPreparation",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.Preparation"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/datasets/{dataset}/preparation:confirmTaskStrings": {
      "post": {
        "tags": [
          "Datasets"
        ],
        "description": "Stores a person's decisions on the dataset's own task names: the full\n set, so a key not listed is cleared. Only a confirmable candidate of the\n newest run takes a decision; a blocked one (outcome words, a code, a name\n already applied as a task label) is FAILED_PRECONDITION. ABORTED when a\n newer run replaced the candidates the person saw. Nothing confirms\n automatically.",
        "operationId": "Datasets_ConfirmTaskStrings",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/qualia.v1.ConfirmTaskStringsRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.Preparation"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/datasets/{dataset}/reachStatus": {
      "get": {
        "tags": [
          "Checks"
        ],
        "description": "Where a dataset's reach check stands: the settings a RunCheck would use\n now, the key they make, and the dataset's runs. A merged dataset pressed\n before its press was one run holds that press in its uploads,\n one run each: until it has a run of its own (and a finished one), that\n press reads as one run, its counts summed, RUNNING while any part runs\n (REQUESTED while one waits), else FAILED with a failed part's note, else\n SUCCEEDED, its operation its first part's. Runs made before an upload\n joined this merged dataset are excluded. Writes nothing. NOT_FOUND\n outside the caller's workspace.",
        "operationId": "Checks_GetReachStatus",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.ReachStatus"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/datasets/{dataset}/reachStatus:cancel": {
      "post": {
        "tags": [
          "Checks"
        ],
        "description": "Stops the dataset's current press (REQUESTED or RUNNING), including its\n selected legacy group of per-upload runs, as CANCELLED. Independent\n presses on member uploads keep running.\n Takes not yet sent to the solver are dropped, op runs already on it are\n stopped (within a dispatcher tick or two), and takes already solved keep\n their results: a later RunCheck on `checks/reach` answers them from\n storage and queues the rest. A run whose takes are all answered ends\n SUCCEEDED instead. Answers the status as it reads after the cancel; with\n no run under way it changes nothing. Needs what RunCheck needs (a write\n on the dataset). NOT_FOUND outside the caller's workspace.",
        "operationId": "Checks_CancelReachStatus",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/qualia.v1.CancelReachStatusRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.ReachStatus"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/datasets/{dataset}/reingests/{reingest}": {
      "get": {
        "tags": [
          "Datasets"
        ],
        "description": "Where a re-ingest has got to, from durable state. It never retries or\n cancels the work. One step it does take: a re-ingest whose ingest\n committed while the server coordinating it was replaced is published by\n the read that finds it.",
        "operationId": "Datasets_GetReingest",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "reingest",
            "in": "path",
            "description": "The reingest id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.Reingest"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/datasets/{dataset}/reingests/{reingest}/notCarried": {
      "get": {
        "tags": [
          "Datasets"
        ],
        "description": "Exact durable losses of a successfully published re-cut, in old take\n number order. FAILED_PRECONDITION until an authenticated result exists.\n This read never dispatches, retries or publishes work.",
        "operationId": "Datasets_ListReingestNotCarried",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "reingest",
            "in": "path",
            "description": "The reingest id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "pageSize",
            "in": "query",
            "description": "Defaults to 100; maximum 1000.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "pageToken",
            "in": "query",
            "description": "A signed continuation from the previous page of this exact result.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.ListReingestNotCarriedResponse"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/datasets/{dataset}/reingests/{reingest}:cancelPoseMove": {
      "post": {
        "tags": [
          "Datasets"
        ],
        "description": "Stops one still-preparing pose move, fenced to the observed attempt.\n A preparation that already committed cannot be cancelled.",
        "operationId": "Datasets_CancelPoseMove",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "reingest",
            "in": "path",
            "description": "The reingest id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/qualia.v1.CancelPoseMoveRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {}
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/datasets/{dataset}/sources": {
      "get": {
        "tags": [
          "Mixtures"
        ],
        "description": "Lists a mixture's sources by position.",
        "operationId": "Mixtures_ListSources",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "pageSize",
            "in": "query",
            "description": "At most this many sources; 0 means 100, the maximum is 500.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "pageToken",
            "in": "query",
            "description": "From a previous response's next_page_token.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.ListSourcesResponse"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "Mixtures"
        ],
        "description": "Adds a source. FAILED_PRECONDITION when it would make the mixture read\n itself, the pin names no tag, or the dataset is an upload a merge took\n (name the merged dataset, which is read like any dataset);\n ALREADY_EXISTS when the same dataset or label is already a source. Emits\n SOURCE_ADDED.",
        "operationId": "Mixtures_CreateSource",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "requestId",
            "in": "query",
            "description": "Idempotency key (AIP-155): a retry with the same id within 24 hours\n returns the first call's result instead of creating a second one.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/qualia.v1.Source"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.Source"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/datasets/{dataset}/sources/{source}": {
      "get": {
        "tags": [
          "Mixtures"
        ],
        "description": "Gets one source.",
        "operationId": "Mixtures_GetSource",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "source",
            "in": "path",
            "description": "The source id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.Source"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "Mixtures"
        ],
        "description": "Removes a source. The mixture's rejects on its episodes are kept, in case\n it comes back. Emits SOURCE_REMOVED.",
        "operationId": "Mixtures_DeleteSource",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "source",
            "in": "path",
            "description": "The source id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {}
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      },
      "patch": {
        "tags": [
          "Mixtures"
        ],
        "description": "Changes how a source is followed. FAILED_PRECONDITION on a TASK_DELETED\n source's follow: remove it instead; and on the follow of a source left on\n an upload a merge took (a pin of its tag reads what it read;\n add its merged dataset to follow more). Emits SOURCE_FOLLOW_CHANGED.",
        "operationId": "Mixtures_UpdateSource",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "source",
            "in": "path",
            "description": "The source id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "updateMask",
            "in": "query",
            "description": "Which fields to change: follow, position.",
            "schema": {
              "type": "string",
              "format": "field-mask"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/qualia.v1.Source"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.Source"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/datasets/{dataset}/sources/{source}:bump": {
      "post": {
        "tags": [
          "Mixtures"
        ],
        "description": "Moves a pinned source to the newest stable tag of its dataset.\n FAILED_PRECONDITION when it is not pinned or already newest. Emits\n SOURCE_FOLLOW_CHANGED with bump = true.",
        "operationId": "Mixtures_BumpSource",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "source",
            "in": "path",
            "description": "The source id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/qualia.v1.BumpSourceRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.Source"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/datasets/{dataset}/sources:batchCreate": {
      "post": {
        "tags": [
          "Mixtures"
        ],
        "description": "Adds several sources at once, last and in the order given: all of them or\n none. The mixture is resolved once for all of them, so this is the call\n for a new mixture's sources. Refuses as CreateSource would (an upload a\n merge took included) for the first source it refuses, and\n INVALID_ARGUMENT when two of the requests read the same dataset or label.\n Emits SOURCE_ADDED for each, in order.",
        "operationId": "Mixtures_BatchCreateSources",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/qualia.v1.BatchCreateSourcesRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.BatchCreateSourcesResponse"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/datasets/{dataset}/versionPreviews": {
      "get": {
        "tags": [
          "Versions"
        ],
        "description": "Lists the caller's live preview of the dataset, if any, so a closed\n dialog picks it up again.",
        "operationId": "Versions_ListVersionPreviews",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "pageSize",
            "in": "query",
            "description": "At most this many; 0 means 10, the maximum is 10.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "pageToken",
            "in": "query",
            "description": "From a previous response's next_page_token.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.ListVersionPreviewsResponse"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "Versions"
        ],
        "description": "Previews the version an upload or a merged dataset would publish (\"Apply\n all\"): freezes the takes `include` picks, each with the edit drawn on\n it, and starts measuring them. Answers at once, MEASURING; read it again\n until READY. Supersedes the caller's MEASURING, READY or FAILED preview\n of the dataset; FAILED_PRECONDITION while the caller's preview of it is\n PUBLISHING. Writes nothing the dataset reads. With `validate_only`,\n writes nothing at all and answers the counts it would have (no name, no\n measurements), and needs only read access. FAILED_PRECONDITION for a\n mixture (CreateVersion tags its head).",
        "operationId": "Versions_CreateVersionPreview",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/qualia.v1.CreateVersionPreviewRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.VersionPreview"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/datasets/{dataset}/versionPreviews/{versionPreview}": {
      "get": {
        "tags": [
          "Versions"
        ],
        "description": "Gets a preview: how far it is, its counts, and, once READY, how it\n compares with the newest tag and what changed since it was made.",
        "operationId": "Versions_GetVersionPreview",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "versionPreview",
            "in": "path",
            "description": "The versionPreview id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.VersionPreview"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "Versions"
        ],
        "description": "Discards the caller's preview. FAILED_PRECONDITION once PUBLISHED (its\n tag keeps it) and while PUBLISHING.",
        "operationId": "Versions_DeleteVersionPreview",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "versionPreview",
            "in": "path",
            "description": "The versionPreview id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {}
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/datasets/{dataset}/versionPreviews/{versionPreview}/items": {
      "get": {
        "tags": [
          "Versions"
        ],
        "description": "A preview's windows, take by take, with what each measured: the\n numbers its charts draw. Paged.",
        "operationId": "Versions_ListVersionPreviewItems",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "versionPreview",
            "in": "path",
            "description": "The versionPreview id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "pageSize",
            "in": "query",
            "description": "At most this many windows; 0 means 500, the maximum is 2000.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "pageToken",
            "in": "query",
            "description": "From a previous response's next_page_token.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.ListVersionPreviewItemsResponse"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/datasets/{dataset}/versionPreviews/{versionPreview}:publish": {
      "post": {
        "tags": [
          "Versions"
        ],
        "description": "Publishes a READY preview of the caller's as tag `version_id` (\"Create\"\n in the dialog): cuts each edited take into new episodes beside it, then\n tags exactly the previewed episodes. Answers at once, PUBLISHING; read\n it again until PUBLISHED, or READY with `publish_error` when a take's\n recording or settings changed since it was made, or a take could not be\n cut (it is then listed as unprocessable: publish again to publish the\n rest). ALREADY_EXISTS when the tag is taken or being published;\n FAILED_PRECONDITION when it is not READY, or cannot be published as it\n stands. Emits VERSION_CREATED.",
        "operationId": "Versions_PublishVersionPreview",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "versionPreview",
            "in": "path",
            "description": "The versionPreview id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/qualia.v1.PublishVersionPreviewRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.VersionPreview"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/datasets/{dataset}/versions": {
      "get": {
        "tags": [
          "Versions"
        ],
        "description": "Lists a dataset's tags, newest first.",
        "operationId": "Versions_ListVersions",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "pageSize",
            "in": "query",
            "description": "At most this many tags; 0 means 50, the maximum is 500.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "pageToken",
            "in": "query",
            "description": "From a previous response's next_page_token.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "filter",
            "in": "query",
            "description": "AIP-160 filter. Fields: digest, create_time.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.ListVersionsResponse"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "Versions"
        ],
        "description": "Tags what the dataset yields now. ALREADY_EXISTS when the name is taken;\n FAILED_PRECONDITION when the dataset holds no episode at all, or while a\n trim of an episode it holds is still being applied, naming them; ABORTED when `version.digest` is set and head has moved. A\n head with every episode rejected is tagged: its version has\n `episode_count` 0, records why in its note, and training and export\n refuse it (FAILED_PRECONDITION).\n Reuses the dataset version whose episode-set digest equals head's, else\n pins one from head's exact member revisions (version_kind 'tag'). A merged\n dataset is tagged only when every upload it holds freezes the same training\n contract (see MergeDatasets): else FAILED_PRECONDITION naming two uploads\n and what differs. An upload merged into one is tagged no more\n (FAILED_PRECONDITION naming the merged dataset); its tags keep\n resolving. Emits VERSION_CREATED.",
        "operationId": "Versions_CreateVersion",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "versionId",
            "in": "query",
            "description": "The tag name: 1-64 characters of [0-9A-Za-z._-], starting with a letter\n or digit; not `stable` or `head`; not all hex. Unique per dataset.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "requestId",
            "in": "query",
            "description": "Idempotency key (AIP-155): a retry with the same id within 24 hours\n returns the first call's result instead of failing ALREADY_EXISTS.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/qualia.v1.Version"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.Version"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/datasets/{dataset}/versions/{version}": {
      "get": {
        "tags": [
          "Versions"
        ],
        "description": "Gets a tag, or resolves `stable`, `head`, a DatasetVersion id or a\n prefix.",
        "operationId": "Versions_GetVersion",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "version",
            "in": "path",
            "description": "The version id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.Version"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      },
      "patch": {
        "tags": [
          "Versions"
        ],
        "description": "Edits a tag's note. Emits VERSION_NOTE_EDITED.",
        "operationId": "Versions_UpdateVersion",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "version",
            "in": "path",
            "description": "The version id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "updateMask",
            "in": "query",
            "description": "Which fields to change: note.",
            "schema": {
              "type": "string",
              "format": "field-mask"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/qualia.v1.Version"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.Version"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/datasets/{dataset}/versions/{version}/materializations/{materialization}": {
      "get": {
        "tags": [
          "Versions"
        ],
        "description": "How far a tag's rendering is. FAILED_PRECONDITION when it failed for\n good (the message says why).",
        "operationId": "Versions_GetMaterialization",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "version",
            "in": "path",
            "description": "The version id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "materialization",
            "in": "path",
            "description": "The materialization id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.Materialization"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/datasets/{dataset}/versions/{version}/materializations/{materialization}/artifacts": {
      "get": {
        "tags": [
          "Versions"
        ],
        "description": "A rendered dataset's files in path order, each with a fresh signed URI.\n FAILED_PRECONDITION until the materialization has SUCCEEDED.",
        "operationId": "Versions_ListMaterializationArtifacts",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "version",
            "in": "path",
            "description": "The version id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "materialization",
            "in": "path",
            "description": "The materialization id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "pageSize",
            "in": "query",
            "description": "At most this many; 0 means 128, the maximum is 512.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "pageToken",
            "in": "query",
            "description": "From a previous response's next_page_token. A token from before a new\n renderer took over is refused (FAILED_PRECONDITION): list again from\n the start.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.ListMaterializationArtifactsResponse"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/datasets/{dataset}/versions/{version}/materializations/{materialization}:start": {
      "post": {
        "tags": [
          "Versions"
        ],
        "description": "Starts rendering a tag in the id's layout, or picks up the rendering\n already there: it never renders twice. Answers at once; read the\n materialization again until SUCCEEDED, then list its artifacts.\n FAILED_PRECONDITION for `head` (tag it first) and when the rendering\n failed for good (the message says why); UNAVAILABLE when the renderer\n cannot be reached (retry).",
        "operationId": "Versions_StartMaterialization",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "version",
            "in": "path",
            "description": "The version id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "materialization",
            "in": "path",
            "description": "The materialization id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/qualia.v1.StartMaterializationRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.Materialization"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/datasets/{dataset}/versions/{version}/sourceCommits": {
      "get": {
        "tags": [
          "Versions"
        ],
        "description": "Lists the repository commits a tag pins, ordered by upload, so a\n version can be traced to the repositories its episodes came from.\n INVALID_ARGUMENT for head, which pins none.",
        "operationId": "Versions_ListSourceCommits",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "version",
            "in": "path",
            "description": "The version id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "pageSize",
            "in": "query",
            "description": "At most this many commits; 0 means 100, the maximum is 500.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "pageToken",
            "in": "query",
            "description": "From a previous response's next_page_token.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.ListSourceCommitsResponse"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/datasets/{dataset}/versions:compare": {
      "get": {
        "tags": [
          "Versions"
        ],
        "description": "What came in, went out or changed revision between two refs of one\n dataset, and why. Paged over the changed episodes.",
        "operationId": "Versions_CompareVersions",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "base",
            "in": "query",
            "description": "The ref measured from: a tag, `stable` or a digest prefix. Empty\n means the newest tag (everything is new when there is none).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "target",
            "in": "query",
            "description": "The ref measured to; empty means `head`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "pageSize",
            "in": "query",
            "description": "At most this many changed episodes; 0 means 100, the maximum is 1000.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "pageToken",
            "in": "query",
            "description": "From a previous response's next_page_token.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.CompareVersionsResponse"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/datasets/{dataset}:copy": {
      "post": {
        "tags": [
          "Datasets"
        ],
        "description": "Copies a dataset (its current version, or one tagged version) into a\n workspace. The copy is a new dataset whose history starts at that\n version; it shares the source's content, so inside one organization no\n media bytes are written. Across organizations the caller needs Admin or\n Owner in the source organization.\n\n The dataset is found in the request's workspace. Copying into another\n workspace of the organization needs read on the source (Admin or Owner\n when the source workspace is private) and Contributor or higher on the\n target. PERMISSION_DENIED carries the reason code in `details`\n (`source_read`, `take_out_org`, `take_out_private`, `target_add`,\n `key_restricted`, `key_one_org`); NOT_FOUND for a dataset, version or\n target workspace the caller cannot see. Retrying with the same request_id\n returns the first result.",
        "operationId": "Datasets_CopyDataset",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/qualia.v1.CopyDatasetRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.TransferDatasetResponse"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/datasets/{dataset}:correctCameraLags": {
      "post": {
        "tags": [
          "Datasets"
        ],
        "description": "Corrects camera stamp offsets through a recorded corrective re-ingest.\n Explicit offsets are desired absolute values. A trusted legacy estimate on\n a zero-offset channel maps to -lag_ms. FAILED_PRECONDITION on a merged\n dataset (correct its uploads before they merge) and on an\n upload merged into one (naming it).",
        "operationId": "Datasets_CorrectCameraLags",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/qualia.v1.CorrectCameraLagsRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.CorrectCameraLagsResponse"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/datasets/{dataset}:move": {
      "post": {
        "tags": [
          "Datasets"
        ],
        "description": "Moves a dataset to another workspace of the same organization. It keeps\n its name, history and links. Needs Admin or Owner on the source workspace\n and Contributor or higher on the target (PERMISSION_DENIED with\n `take_out_workspace` or `target_add` in `details`). A move to another\n organization or into the workspace it is in is FAILED_PRECONDITION: copy\n it instead. FAILED_PRECONDITION too, naming them, while a mixture in the\n source workspace reads it or a mixture's sources would stay behind;\n ALREADY_EXISTS when its name is taken in the target.",
        "operationId": "Datasets_MoveDataset",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/qualia.v1.MoveDatasetRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.TransferDatasetResponse"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/datasets/{dataset}:readReachTraces": {
      "get": {
        "tags": [
          "Checks"
        ],
        "description": "Reads sampled posture traces for up to 32 results in one dataset under\n one reach key. The response preserves `names` order; stale, out-of-scope\n or momentarily unreadable rows carry a per-item state and no trace.\n `max_frames` is at most 512 (0 means 512).",
        "operationId": "Checks_ReadReachTraces",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "names",
            "in": "query",
            "description": "Between 1 and 32 unique accounts/{account}/checks/reach/results/{result}\n names, all for the target robot of dataset.",
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          {
            "name": "expectedKey",
            "in": "query",
            "description": "The current reach key shared by every requested result, or the key of\n the dataset's last finished run (ReachStatus.last_finished_run) where\n that run solved on the same robot config, placement and pose frame as a\n run would now, so its postures still fit the takes as drawn (only the\n solver or the walk changed since). Any other key is STALE.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "maxFrames",
            "in": "query",
            "description": "At most 512 samples per trace. 0 means the maximum.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.ReadReachTracesResponse"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/datasets/{dataset}:reingest": {
      "post": {
        "tags": [
          "Datasets"
        ],
        "description": "Upload only (MCAP): commits a new meta/ingest.toml and ingests the\n unchanged recordings again under it, publishing the upload's next\n generation. Returns once the work is admitted; the ingest\n takes minutes and is read with GetReingest. A config identical to the\n published one runs nothing and returns that publication, SUCCEEDED,\n with unchanged set.\n\n A config that declares `[episodes] spans` re-cuts the recordings at those\n windows. Episode ids follow position, so a re-cut renumbers every episode\n of the upload: it is FAILED_PRECONDITION, naming the counts, while any\n episode holds a person ruling, a person issue or note, a reach result, an\n edit or a split child.\n\n FAILED_PRECONDITION on a mixture, a non-MCAP upload, a merged dataset\n (re-ingest its uploads before they merge) and an upload merged\n into one (naming it; its GetReingest and GetIngestReport still answer);\n INVALID_ARGUMENT when the config does not parse.",
        "operationId": "Datasets_ReingestDataset",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/qualia.v1.ReingestDatasetRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.ReingestDatasetResponse"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/datasets/{dataset}:relinkTask": {
      "post": {
        "tags": [
          "Datasets"
        ],
        "description": "Moves an upload's or a merged dataset's Task link to the Task's newest\n published revision, and the links of its takes that name the\n same Task, then starts the checks a finished preparation starts: the\n heuristic checks and the graph check, as the caller, capped at max_cost.\n Publishing a revision relinks nothing and starts no check; this is how a\n dataset takes it up (Dataset.latest_task_revision above\n linked_task_revision). validate_only answers what it would relink and\n the graph run's credit bound, changing nothing. FAILED_PRECONDITION, in\n words and with nothing relinked, when nothing is linked or already at\n the newest revision, when the Task has no published revision, when\n max_cost is below the bound, or when a heuristic check it would rerun is\n still running on the dataset. A VLM run on the dataset refuses nothing:\n the graph run is queued behind it. ABORTED, nothing relinked, when what\n it read changed before it wrote: a link (another RelinkTask moved it, or\n UpdateDataset moved the dataset to another Task), the uploads a merged\n dataset holds, or the Task's newest revision (one was published since);\n ask again.",
        "operationId": "Datasets_RelinkTask",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/qualia.v1.RelinkTaskRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.RelinkTaskResponse"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/datasets/{dataset}:remapChannels": {
      "post": {
        "tags": [
          "Datasets"
        ],
        "description": "Maps native channel names onto canonical keys where the automatic\n grammar got them wrong or found none (a mapping lens), then\n derives the robot interface again. Renames add to the upload's earlier\n ones; a channel renamed again takes the newest key. A key another channel\n of the upload already holds is FAILED_PRECONDITION naming that channel\n (rename both to swap them), and nothing is written. FAILED_PRECONDITION\n on a mixture and on an upload merged into one (naming the dataset to use).\n\n On a merged dataset the renames are its own channel keys: the\n call writes one lens on each upload it holds that does not already key a\n channel as asked, in one transaction (DATASET_UPDATED on the merged\n dataset and on each upload it wrote), and derives their interfaces again\n after it commits, which Dataset.interface_settlement counts. A key that\n would give one upload two channels is FAILED_PRECONDITION naming the\n upload and the channel, and nothing is written on any upload; a name no\n upload has is INVALID_ARGUMENT. Sending the same renames again writes\n nothing.",
        "operationId": "Datasets_RemapDatasetChannels",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/qualia.v1.RemapDatasetChannelsRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.RemapDatasetChannelsResponse"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/datasets/{dataset}:removeMergedMember": {
      "post": {
        "tags": [
          "Datasets"
        ],
        "description": "Removes one upload from the CURRENT membership of a merged dataset.\n The upload becomes standalone again, with its data and rulings intact;\n the merged dataset retains its removal history and old versions. The final\n member cannot be removed; delete the dataset instead. ABORTED on a stale\n membership epoch.",
        "operationId": "Datasets_RemoveMergedDatasetMember",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/qualia.v1.RemoveMergedDatasetMemberRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.Dataset"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/datasets/{dataset}:resolvePoses": {
      "post": {
        "tags": [
          "Datasets"
        ],
        "description": "Resolves a handheld upload's poses at each hand's TCP (poses_at TCP), or\n undoes that (ROOT), by re-deriving the upload with the calibration. It\n adds the `<side>.tcp.*` channels beside the gripper root's `<side>.ee.*`,\n which stay exactly as they were.\n\n The work is accepted, not finished: it is a new publication of the whole\n upload, as long as the upload's video takes to check again, so the\n response says only that it started. Poll it through the sync-status route\n (GET /datasets/sync-status/{operation_id}) until it is finalized or\n failed; GetDataset then shows the new poses_at. The old version stays\n readable, and a version tag or pin cut earlier keeps the poses it had.\n Resolving again with a replaced calibration is the same call; the same\n calibration again, or ROOT on an upload not at the TCP, changes nothing\n and answers no_op.\n\n One re-derive of an upload runs at a time (this call, ReingestDataset and\n the dashboard's automatic resolve after a robot is picked all admit one).\n The same resolve asked while it runs answers the running operation, which\n is the one to poll; a different one (an undo of it, another calibration)\n is FAILED_PRECONDITION until it lands. There is no way to cancel one.\n\n Only the poses at the TCP are stored. What reads them is not part of this\n call: a reach check still walks the gripper root, and an export carries\n `<side>.ee.*` as before.\n\n FAILED_PRECONDITION unless the dataset is a LeRobot upload recorded on a\n handheld rig whose state ingest converted (or a raw MCAP recording with\n tracked poses); also on a mixture, a merged dataset (every\n upload of a merge sits at one frame, so resolve them before they merge)\n and an upload merged into one (naming it). The re-derive is built on the\n version that was current when it started, so it fails (the status route\n says so) when a review ruling or a trim lands first: resolve again.",
        "operationId": "Datasets_ResolvePoses",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/qualia.v1.ResolvePosesRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.ResolvePosesResponse"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/datasets/{dataset}:revertMerge": {
      "post": {
        "tags": [
          "Datasets"
        ],
        "description": "Always FAILED_PRECONDITION: a whole merge cannot be reverted.\n RemoveMergedDatasetMember returns an individual upload to standalone\n status. Kept until no client calls it.",
        "operationId": "Datasets_RevertMerge",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "description": "The dataset id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/qualia.v1.RevertMergeRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.RevertMergeResponse"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/datasets:merge": {
      "post": {
        "tags": [
          "Datasets"
        ],
        "description": "Merges compatible uploads into one dataset of its own, or adds uploads to\n a merged dataset. While held, uploads become its storage and\n leave ListDatasets. Individual uploads can be removed and returned to\n standalone status; a whole merge cannot be reverted. It\n is reviewed, versioned, edited and trained as one. Nothing the uploads\n hold is moved or rewritten: every episode keeps its `upload`, and every\n ruling, issue, note, tag and trim reads the same in the merged dataset. A\n ruling, an issue or an edit made through it lands in the upload that holds\n the episode (see Episode). A merged-away upload's reads keep answering\n (its versions resolve as `<slug>:<tag>`, its takes, issues, ingest report\n and re-ingests read); a write that names it is FAILED_PRECONDITION naming\n the merged dataset.\n\n Uploads are compatible when every episode of their current versions\n freezes the same training contract, as a version of them all must (and as\n materialize checks): the adapter's cameras and features, the native\n channel names in order (`channel_names`), one fps, and where their poses\n are (`poses_at`: ROOT or TCP, for every upload, since nothing corrects a\n merged dataset's poses afterwards; put them in one place with\n ResolvePoses first). What a write settles is asked instead: the canonical\n key of a native channel, the target robot, the source robot,\n and `reach_settings`, which every upload takes; and, when the merge makes\n a new merged dataset, its own `labels.method`, `labels.task`, `.robot`,\n `.operator`, `.scene` and `linked_task`, which it takes as its own while\n each upload keeps its own. Those five need no answer: left unanswered,\n each is the uploads' commonest value (an upload that has none left out, a\n tie to the first value in order: the smallest label, a Task by its id).\n Its collection tags are seeded from the initial uploads; a legacy Method\n answer changes only that initial contribution on C, preserving independent\n dimensions. An append (`merge_target`, automatic or not) asks nothing\n about method, the other labels or Task: C keeps its own collection set,\n including explicit Unknown, and each appended upload keeps its own. A preview (`validate_only`) returns\n every difference as a MergeConflict over the uploads and, with\n `merge_target`, the uploads it holds; the merge applies one\n MergeResolution per resolvable conflict in its transaction (see\n `resolutions`). Without resolutions any other such difference is refused\n as before. The rig is not compared. A difference in what training freezes\n is FAILED_PRECONDITION naming the field, as is an upload that is still\n uploading, a mixture, a merged dataset or already merged, and an upload a\n mixture follows (head or stable): remove that source, or pin one of the\n upload's tags, merge, then add the merged dataset as a source. A pin of\n one of its tags reads the same takes after the merge and does not hold\n it.\n A name under another account is INVALID_ARGUMENT, as for every name\n outside its parent; an upload that does not exist or is retired is\n NOT_FOUND. Nothing is written when any upload is refused.\n\n A merged dataset's collection metadata changes on C alone. Source robot,\n target robot and reach_settings still write to every upload it holds\n (UpdateDataset), and so do its channel keys (RemapDatasetChannels); what\n would re-derive its data (ReingestDataset, ResolvePoses, CorrectCameraLags)\n is corrected on the uploads before they merge. A\n label or Task mixture source matches it by its own labels and Task (a\n method source by its own method tags, and then reads all of it), and no\n longer matches the uploads it holds. It is deleted like any dataset,\n with the uploads it holds (DeleteDataset). Emits DATASETS_MERGED on the\n merged dataset, which is not undoable. Retrying with the same request_id\n returns the first result instead of merging again.",
        "operationId": "Datasets_MergeDatasets",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/qualia.v1.MergeDatasetsRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.MergeDatasetsResponse"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/events": {
      "get": {
        "tags": [
          "Events"
        ],
        "description": "Lists events, newest first, optionally grouped into sessions.",
        "operationId": "Events_ListEvents_Account",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "pageSize",
            "in": "query",
            "description": "At most this many events, or sessions when grouping; 0 means 100, the\n maximum is 500. TEAM_ACTIVITY defaults to 50, maximum 100.\n A page may hold fewer and still have a next one.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "pageToken",
            "in": "query",
            "description": "From a previous response's next_page_token, with the same parent,\n filter and grouping. Pages follow the record's sequence, so events\n recorded after the first page never shift a later one.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "filter",
            "in": "query",
            "description": "AIP-160 filter: comparisons joined by AND (or a space); OR and NOT are\n refused. Fields:\n\n - `subject`: a resource name; the event's subject, or one of its\n   `related` (`subject = \"accounts/a/datasets/d\"`).\n - `subject.name`, `subject.type`: the subject only.\n - `parent`: the parent's name.\n - `actor.user`, `actor.api_key`, `actor.agent`, `actor.kind` (PERSON,\n   SYSTEM, ...).\n - `action` (`\"qds.EPISODES_RULED\"`), `service` (`\"qds\"`), `operation`.\n - `create_time`, with `= < <= > >=` and an RFC 3339 time.\n - `sequence`, with `= < <= > >=`.\n\n With view TEAM_ACTIVITY only, each with `=` and at most once:\n\n - `verb`: the summary's verb (`verb = EDIT`, `verb = PROPOSE_SUBTASKS`,\n   `verb = ADD_INTEGRATION_KEY`). Activity reads qds and platform records.\n - `actor`: the summary's actor kind (PERSON, API_KEY, SERVICE, MODEL,\n   SYSTEM, UNKNOWN). Unlike `actor.kind`, the stored kind, a row a key\n   wrote is API_KEY and a check's proposals are SYSTEM.\n - `workspace`: a workspace id, quoted; an organization's list only.\n - `text`: case-insensitive substring of the subject's recorded label, on\n   any subject type (the summary shows it only for datasets); 3 to 256\n   characters.\n\n Strings are quoted. `=` is exact.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "grouping",
            "in": "query",
            "description": "How to group. Unset lists each event.",
            "schema": {
              "enum": [
                "GROUPING_UNSPECIFIED",
                "SESSIONS"
              ],
              "type": "string",
              "format": "enum"
            }
          },
          {
            "name": "view",
            "in": "query",
            "description": "Optional representation. Page tokens bind the view and its policy version.",
            "schema": {
              "enum": [
                "VIEW_UNSPECIFIED",
                "TEAM_ACTIVITY"
              ],
              "type": "string",
              "format": "enum"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.ListEventsResponse"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/events/{event}": {
      "get": {
        "tags": [
          "Events"
        ],
        "description": "Gets one event.",
        "operationId": "Events_GetEvent_Account",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "event",
            "in": "path",
            "description": "The event id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.Event"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/events/{event}:activityDetails": {
      "get": {
        "tags": [
          "Events"
        ],
        "description": "Reads bounded recorded targets after checking their current QDS access.",
        "operationId": "Events_ReadActivityDetails_Account",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "event",
            "in": "path",
            "description": "The event id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "pageSize",
            "in": "query",
            "description": "Default 50, maximum 100 targets.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "pageToken",
            "in": "query",
            "description": "Independent target cursor, bound to the event and Activity policy version.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.ReadActivityDetailsResponse"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/events/{event}:undo": {
      "post": {
        "tags": [
          "Events"
        ],
        "description": "Undoes an event. The service that wrote it does the undo, in its own\n transaction, and records it as a new event whose `undoes` is this\n event's id; the event itself never changes. Each event is undone at most\n once.\n\n FAILED_PRECONDITION, with the reason in the message, when the event is\n not `undoable` (its kind can't be undone, or this one was written so),\n when it was undone already, or when what it changed has changed since\n (an episode ruled or edited again, an issue edited or dismissed). ABORTED\n when the episodes it edited move while the undo runs: send it again.\n Needs `spaces:read` and `datasets:write` on the event's workspace (only\n qds events undo today); an event of the organization itself needs\n `spaces:read` and `spaces:members` on the organization. An API key needs\n `data:write`.",
        "operationId": "Events_UndoEvent_Account",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "event",
            "in": "path",
            "description": "The event id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/qualia.v1.UndoEventRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.UndoEventResponse"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/events:activityActors": {
      "get": {
        "tags": [
          "Events"
        ],
        "description": "Reads recorded person names for a bounded page of actions.",
        "operationId": "Events_ReadActivityActors_Account",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "events",
            "in": "query",
            "description": "At most 100 canonical event references.",
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.ReadActivityActorsResponse"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/events:activityFacets": {
      "get": {
        "tags": [
          "Events"
        ],
        "description": "Lists the values the TEAM_ACTIVITY list holds for a filter, with counts:\n the suggestions a search box offers under each key.",
        "operationId": "Events_ListActivityFacets_Account",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "filter",
            "in": "query",
            "description": "A ListEvents TEAM_ACTIVITY filter. The whole filter applies: after\n `verb = EDIT` the verbs are only EDIT.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.ListActivityFacetsResponse"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/rigs": {
      "get": {
        "tags": [
          "Rigs"
        ],
        "description": "Lists the account's rigs.",
        "operationId": "Rigs_ListRigs",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "pageSize",
            "in": "query",
            "description": "At most this many; 0 means 100, the maximum is 500.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "pageToken",
            "in": "query",
            "description": "From a previous response's next_page_token.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.ListRigsResponse"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "Rigs"
        ],
        "description": "Registers a rig. A `gripper` is INVALID_ARGUMENT here: set it with\n UpdateRig.",
        "operationId": "Rigs_CreateRig",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "requestId",
            "in": "query",
            "description": "Idempotency key (AIP-155): a retry with the same id within 24 hours\n returns the first call's result instead of creating a second one.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/qualia.v1.Rig"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.Rig"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/rigs/{rig}": {
      "get": {
        "tags": [
          "Rigs"
        ],
        "description": "Gets one rig.",
        "operationId": "Rigs_GetRig",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "rig",
            "in": "path",
            "description": "The rig id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.Rig"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "Rigs"
        ],
        "description": "Deletes a rig.",
        "operationId": "Rigs_DeleteRig",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "rig",
            "in": "path",
            "description": "The rig id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {}
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      },
      "patch": {
        "tags": [
          "Rigs"
        ],
        "description": "Edits a rig. An edit changes no dataset: ingest does not read this\n record. An upload is converted with the rig it declares (meta/ingest.toml\n [rig], else the built-in profile) and records that rig in its calibration\n document.\n\n Nobody edits the built-in UMI rig (FAILED_PRECONDITION), except to give it\n a gripper: with an update_mask of exactly `gripper` and a gripper set, the\n account gets its own copy of the rig (no calibration) carrying it, and the\n response is that copy, a different rig name from the request. The copy\n takes the built-in's place in the account's list. If the account already\n has its own rig with that key, ALREADY_EXISTS: set the gripper on that rig.",
        "operationId": "Rigs_UpdateRig",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "rig",
            "in": "path",
            "description": "The rig id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "updateMask",
            "in": "query",
            "description": "Which fields to change: display_name, robot, mounts, gripper. `*` is all of\n them, so an unset gripper clears the rig's. An empty gripper in the mask\n removes the design from the rig (the design itself stays; it is a robot).\n The calibration is set only by ImportCalibration.",
            "schema": {
              "type": "string",
              "format": "field-mask"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/qualia.v1.Rig"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.Rig"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/rigs/{rig}:importCalibration": {
      "post": {
        "tags": [
          "Rigs"
        ],
        "description": "Imports a handheld rig's TCP calibration from a tcp_calibration.json\n and stores it on the rig, replacing any earlier one. The server reads the\n file: each hand's `<side>.controller_to_tcp` needs `position_m` (three\n finite numbers) and `R` (a 3x3 rotation: finite, determinant within 0.01\n of 1, and orthonormal to 1e-3, a stricter check than the determinant\n alone); both hands are required, and other keys are ignored but the\n end-effector ones. When the file's `ee_frame` text names a link with\n `<side>` in it, and each hand has `controller_to_ee` and `ee_to_tcp` poses\n (passing the same checks) whose composition is its `controller_to_tcp`\n (within 1 mm and 1e-3 per rotation entry), the calibration also gets\n `ee_link` and `Hand.ee_to_tcp`. Otherwise it gets neither, with no error:\n display-only numbers never refuse a file, and everything ingest reads\n stands. A file that fails is INVALID_ARGUMENT, and the message names the\n field, e.g. \"left.controller_to_tcp.position_m must be three finite\n numbers\". FAILED_PRECONDITION on an arm rig. ABORTED when `etag` is stale.\n\n The calibration lives on a gripper (Robots.ImportGripperCalibration): one\n imported here is carried to the rig's `gripper` when that gripper stands\n for the rig's key or for none. A file that would reach no gripper (the rig\n has none, its gripper stands for another rig's key, or it is the built-in\n UMI rig) is FAILED_PRECONDITION and stores nothing: import it on the\n gripper, or set the rig's gripper first.",
        "operationId": "Rigs_ImportCalibration",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "rig",
            "in": "path",
            "description": "The rig id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/qualia.v1.ImportCalibrationRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.Rig"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/robots": {
      "get": {
        "tags": [
          "Robots"
        ],
        "description": "Lists the account's robots, oldest first (the first is the default\n target). Gripper designs and robot templates are left out: the filter\n `kind = GRIPPER` lists the grippers instead (the workspace-level ones, gripper\n templates and UMI rigs, which `gripper_tcp.rig_kind` tells apart, and the\n copies robots own, each named like its source; its `owner` is the robot that\n carries it), and `kind = ROBOT_TEMPLATE` the robot templates. Listing\n grippers makes nothing: a workspace with no UMI rig lists none.",
        "operationId": "Robots_ListRobots",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "pageSize",
            "in": "query",
            "description": "At most this many; 0 means 100, the maximum is 500.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "pageToken",
            "in": "query",
            "description": "From a previous response's next_page_token, taken with the same filter.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "filter",
            "in": "query",
            "description": "AIP-160 filter, one term on `kind`, by the Robot.Kind value name:\n `kind = ROBOT` or `kind = GRIPPER` (the name may be quoted). Empty lists\n robots only. Anything else is INVALID_ARGUMENT.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.ListRobotsResponse"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "Robots"
        ],
        "description": "Registers a robot, or, with kind GRIPPER and `owner`, an empty gripper that\n robot owns and carries (no mounts yet): import its URDF with\n PrepareRobotModelImport and ImportRobotModel. ALREADY_EXISTS when the owner\n owns a gripper already, FAILED_PRECONDITION when it carries one that it does\n not own, NOT_FOUND for an owner that is no robot of the workspace,\n INVALID_ARGUMENT for an `owner` on a robot. With kind ROBOT_TEMPLATE it\n registers a robot template to import a URDF into the same way; a template\n takes a `display_name` (unique among the workspace's templates, apart from\n its robots) and an optional `robot_type`, and INVALID_ARGUMENT for a\n `serial_number` or an `owner`. A gripper template is a kind GRIPPER robot\n with no `owner` and no `rig_key`; its name may not be a UMI rig key (see\n CopyGripperAsUmiRig).",
        "operationId": "Robots_CreateRobot",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "requestId",
            "in": "query",
            "description": "Idempotency key (AIP-155): a retry with the same id within 24 hours\n returns the first call's result instead of creating a second one.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/qualia.v1.Robot"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.Robot"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/robots/{robot}": {
      "get": {
        "tags": [
          "Robots"
        ],
        "description": "Gets one robot.",
        "operationId": "Robots_GetRobot",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "robot",
            "in": "path",
            "description": "The robot id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.Robot"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "Robots"
        ],
        "description": "Deletes a robot. FAILED_PRECONDITION while it has a model and `force` is\n not set. Datasets that named it keep the dangling reference (shown as a\n removed robot); the uploads played on a robot are listed with\n Datasets.ListDatasets filter `target_robot = \"...\"`. Deleting a gripper\n design clears Rig.gripper on every rig that points at it; the rigs using\n it are those Rigs.ListRigs returns with that `gripper`. Deleting a robot\n deletes the gripper it owns, files included. Deleting a gripper a robot owns\n removes that copy and its mount from its robot, as detaching it with\n SetRobotGripper does; the robot and other copies stay. A gripper a live\n dataset plays back with is FAILED_PRECONDITION to delete. Deleting a robot\n template needs no `force` and touches no rig: the rigs made from it keep their\n copy and lose `source_template`. Deleting a UMI rig is deleting a gripper;\n nothing makes it again.",
        "operationId": "Robots_DeleteRobot",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "robot",
            "in": "path",
            "description": "The robot id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "force",
            "in": "query",
            "description": "Also delete its model.",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {}
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      },
      "patch": {
        "tags": [
          "Robots"
        ],
        "description": "Edits display_name, robot_type or serial_number. Not the kind.",
        "operationId": "Robots_UpdateRobot",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "robot",
            "in": "path",
            "description": "The robot id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "updateMask",
            "in": "query",
            "description": "Which fields to change: display_name, robot_type, serial_number.",
            "schema": {
              "type": "string",
              "format": "field-mask"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/qualia.v1.Robot"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.Robot"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/robots/{robot}/model": {
      "get": {
        "tags": [
          "Robots"
        ],
        "description": "Gets a robot's model. NOT_FOUND only when the robot has no imported model\n and no import was ever started (fleet serves imported models only).\n Otherwise returns the model, possibly with no URDF yet, with its\n import_state, so a first import can be polled and a FAILED one is seen.",
        "operationId": "Robots_GetRobotModel",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "robot",
            "in": "path",
            "description": "The robot id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.RobotModel"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      },
      "patch": {
        "tags": [
          "Robots"
        ],
        "description": "Edits arms, solver, gripper, reach_base, mink_parameters or\n pyroki_parameters. A robot template takes `arms` and `reach_base` only:\n INVALID_ARGUMENT for a solver or parameters, since a template has none\n (they are set on the rig made from it), and for a gripper that differs from\n the stock jaw its model already has (the import guessed it): a client\n sending back what GetRobotModel returned is not refused. A MINK solver's links\n (shoulder_link, elbow_link, wrist_link, `{side}` read as left or right)\n must exist in the model's URDF: INVALID_ARGUMENT names the missing one.",
        "operationId": "Robots_UpdateRobotModel",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "robot",
            "in": "path",
            "description": "The robot id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "updateMask",
            "in": "query",
            "description": "Which fields to change: arms, solver (PYROKI, DLS or MINK; a solver cannot\n be cleared, so naming it with SOLVER_UNSPECIFIED is INVALID_ARGUMENT, while\n `*` with SOLVER_UNSPECIFIED leaves the solver as it is), gripper, reach_base\n (naming it with none sent clears it), mink_parameters (a MINK model needs\n them whole; INVALID_ARGUMENT says which one a request gets wrong),\n pyroki_parameters (a PYROKI model needs them whole, the same way; sent with\n `solver` PYROKI). Sending the parameters of another solver than the one the\n model ends with is INVALID_ARGUMENT; naming that path with none sent drops\n them (a model keeps only its own solver's).",
            "schema": {
              "type": "string",
              "format": "field-mask"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/qualia.v1.RobotModel"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.RobotModel"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/robots/{robot}/model:import": {
      "post": {
        "tags": [
          "Robots"
        ],
        "description": "Imports the uploaded URDF with its meshes, replacing any model. Returns\n at once with import_state PENDING; fleet then, in the background,\n resolves package:// paths, converts meshes to GLB, guesses arms from link\n names (CONVERTING), swaps the model in (READY) and starts fitting\n capsules. A robot's URDF with no link reached through three turning joints\n ends FAILED. A gripper design needs no arm, but at least one link, and\n ends FAILED when none of its visual meshes is in the upload (its fingers\n would draw as nothing). Poll GetRobotModel. FAILED_PRECONDITION while an\n import is PENDING or CONVERTING.",
        "operationId": "Robots_ImportRobotModel",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "robot",
            "in": "path",
            "description": "The robot id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/qualia.v1.ImportRobotModelRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.RobotModel"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/robots/{robot}/model:prepareImport": {
      "post": {
        "tags": [
          "Robots"
        ],
        "description": "Starts a model import: returns a short-lived signed URL to PUT the file\n to, and the object reference ImportRobotModel then takes. Nothing changes\n until the import.",
        "operationId": "Robots_PrepareRobotModelImport",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "robot",
            "in": "path",
            "description": "The robot id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/qualia.v1.PrepareRobotModelImportRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.PrepareRobotModelImportResponse"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/robots/{robot}/thumbnail": {
      "get": {
        "tags": [
          "Robots"
        ],
        "description": "Gets the bytes of a robot's thumbnail by its sha256. NOT_FOUND unless\n `sha256` is the robot's current `thumbnail_sha256`. The bytes behind a\n sha256 never change, so a client may cache them for good.",
        "operationId": "Robots_GetRobotThumbnail",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "robot",
            "in": "path",
            "description": "The robot id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "sha256",
            "in": "query",
            "description": "Robot.thumbnail_sha256.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.RobotThumbnail"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/robots/{robot}:copy": {
      "post": {
        "tags": [
          "Robots"
        ],
        "description": "Makes a new robot from an existing one, to try a change (another gripper, a\n mount, a jaw) without touching the original, and returns the copy. The\n source may be a robot template (kind ROBOT_TEMPLATE): that is how a rig is\n made, and the copy has `source_template` set to it; a template carries no\n solver, gripper, serial number or reach result, so the copy has none either\n (set them on the copy), `gripper` is ignored, and an unnamed copy is named\n like the template (templates and robots are named apart).\n\n The copy takes the source's robot type, URDF and meshes, arms (hand link,\n tool, start posture), solver, jaw, reach base and fitted capsules, and, with\n `gripper` KEEP, a gripper of its own copied from the one the source carries:\n its URDF, TCP, jaw and mounts as they are now. It is a snapshot and shares\n nothing with the source afterwards; until either is edited, the composed\n `tcp` of each arm and `config_digest` match the source's, but for\n `config_digest` of a robot with fitted capsules (the digest covers the\n capsules' path, which is the copy's own). The copy is named\n `display_name`, or \"<source> copy\"; a name the workspace has gets the next\n free \" (2)\", \" (3)\" ... suffix. The source's serial number, credentials,\n datasets played on it, reach results and history are not copied, and the copy\n is never the default target (that stays the oldest robot).\n\n NOT_FOUND for a robot of another workspace. FAILED_PRECONDITION when the\n source is a gripper design (a gripper is copied by attaching it:\n SetRobotGripper `copy_from`; a UMI rig is made by CopyGripperAsUmiRig), when\n its model or its carried gripper's is being imported, or while its capsules\n are being fitted: try again in a minute. ABORTED when the source changed while\n it was copied: try again. A retry with the same `request_id` returns the first\n call's copy. The copy's registration is recorded as an event whose subject is\n the copy and which names the source.",
        "operationId": "Robots_CopyRobot",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "robot",
            "in": "path",
            "description": "The robot id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/qualia.v1.CopyRobotRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.Robot"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/robots/{robot}:copyAsUmiRig": {
      "post": {
        "tags": [
          "Robots"
        ],
        "description": "Copies a gripper template into a UMI rig and returns the rig: a workspace-level\n gripper (kind GRIPPER, `gripper_tcp.rig_kind` \"umi-handheld\") that is a\n snapshot copy of the template's URDF, meshes, jaw and TCP as they are now,\n with `source_template` naming the template. It has no `rig_key`: a\n recording names it by its name or id (ComposeUploadRig `gripper`). It is a\n recording rig only once it has a tracker-to-TCP\n calibration: import tcp_calibration.json with ImportGripperCalibration. A\n workspace may have any number of UMI rigs; they are made from templates\n only, so no upload can be recorded on a rig no one made.\n\n Needs rigs:write on the organization as well as robots:write (a\n workspace-level gripper write). NOT_FOUND for a template of another\n workspace. FAILED_PRECONDITION when `name` is no gripper template (a robot,\n a robot template, a UMI rig or a robot's own gripper), when it\n has no URDF, or is being imported. INVALID_ARGUMENT for a name over 64\n characters or one a gripper may not have (a rig key such as\n \"umi-handheld\"). A name the workspace has gets the next free \" (2)\", \" (3)\"\n ... suffix. ABORTED when the template changed while it was copied: try again.\n A retry with the same `request_id` returns the first call's rig. The rig's\n registration is an event naming the template.",
        "operationId": "Robots_CopyGripperAsUmiRig",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "robot",
            "in": "path",
            "description": "The robot id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/qualia.v1.CopyGripperAsUmiRigRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.Robot"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/robots/{robot}:importGripperCalibration": {
      "post": {
        "tags": [
          "Robots"
        ],
        "description": "Replaces a gripper's TCPs with a tcp_calibration.json: each hand's\n `tracker_to_tcp`, and where the file also gives the TCP in the design's\n end-effector link (and the design's URDF has that link), the TCP in that\n link with where the tracker sits in it. The file is checked as\n Rigs.ImportCalibration checks it.",
        "operationId": "Robots_ImportGripperCalibration",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "robot",
            "in": "path",
            "description": "The robot id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/qualia.v1.ImportGripperCalibrationRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.Robot"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/robots/{robot}:setGripper": {
      "post": {
        "tags": [
          "Robots"
        ],
        "description": "Gives a robot a gripper, sets where its own gripper sits on each arm, or\n takes the gripper off, and returns the robot.\n\n A robot owns its gripper. `copy_from` attaches a copy of a gripper (its\n URDF, TCP and jaw as they are now: a snapshot, never re-synced) to a robot\n that carries none; the copy is the robot's own and editing it changes this\n robot only. `gripper` names the robot's own gripper, to set its mounts. A\n robot that carries a gripper never swaps it: copy the robot to try another\n gripper (FAILED_PRECONDITION). `gripper` naming a workspace-level\n gripper on a robot that carries none attaches a copy of it, like `copy_from`\n (until clients send `copy_from`). Neither field set takes the\n gripper off, which deletes the robot's own gripper and its files.\n\n NOT_FOUND for a gripper of another workspace, like any robot of one.\n FAILED_PRECONDITION when the named robot is not a gripper design, the robot\n is not a robot, it carries a gripper and another is asked for, `gripper`\n names another robot's own gripper (use `copy_from`), the source has no URDF\n or is being imported, a mount's hand has no TCP in a link yet (that link is\n what the mount places), or a baked mount's URDFs disagree; INVALID_ARGUMENT\n for a mount whose parent link the robot's URDF lacks or is not joined to the\n arm's hand link by fixed joints, or for both `gripper` and `copy_from`.",
        "operationId": "Robots_SetRobotGripper",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "robot",
            "in": "path",
            "description": "The robot id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/qualia.v1.SetRobotGripperRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.Robot"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/robots/{robot}:setGripperTcp": {
      "post": {
        "tags": [
          "Robots"
        ],
        "description": "Sets where the TCP is on a gripper design, by a 4x4 matrix per hand in the\n frame of one of the design's links, and returns the gripper. A hand that\n already resolves uploads (it has a `tracker_to_tcp`) moves with the TCP: its\n `tracker_to_tcp` becomes the tracker's pose in the link inverted, times the\n new TCP, so robots and uploads keep agreeing; a matrix equal to the stored\n one changes nothing. When the design's URDF was re-imported since the TCP\n was set (`stale`), the matrices are read in the new export's link frames:\n not a move, `tracker_to_tcp` stays as it is and the tracker's place in the\n link follows the new TCP, and every hand that has a TCP in a link must be\n named (FAILED_PRECONDITION otherwise), so no hand keeps a TCP from the old\n URDF. FAILED_PRECONDITION when such a hand's calibration does\n not say where its tracker sits in the link (import a newer one), the robot\n is not a gripper design or has no model, or the hand is in another link than\n the one it was set on (a hand keeps its link while the design's URDF has\n it); INVALID_ARGUMENT for a matrix that is not a finite rigid transform, a\n link the design's URDF lacks (or a `content` link that is not a string), or\n a `filename` that is not 1 to 256 characters without control characters. A\n single hand is accepted; uploads resolve only with both. ABORTED when `etag`\n is stale. The gripper's TCP is a workspace write: it never changes a Rig,\n whose calibration Rigs.ImportCalibration sets.",
        "operationId": "Robots_SetGripperTcp",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "robot",
            "in": "path",
            "description": "The robot id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/qualia.v1.SetGripperTcpRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.Robot"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/solverTemplates": {
      "get": {
        "tags": [
          "Robots"
        ],
        "description": "Lists the workspace's solver templates, oldest first.",
        "operationId": "Robots_ListSolverTemplates",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "pageSize",
            "in": "query",
            "description": "At most this many; 0 means 100, the maximum is 500.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "pageToken",
            "in": "query",
            "description": "From a previous response's next_page_token.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.ListSolverTemplatesResponse"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "Robots"
        ],
        "description": "Registers a solver template from a solver file and returns it. A solver\n template is a named solver choice with its parameters (a PyRoKi or Mink\n solver file, or a bare DLS), kept in the workspace to apply to any number\n of rigs: applying copies it into the rig (UpdateRobotModel with the\n template's solver and parameters), so the rig keeps its own and editing or\n deleting the template changes no rig. A template has no URDF; the Mink links\n are checked against a rig's URDF when it is applied, not here. Needs\n robots:write.\n\n INVALID_ARGUMENT for a solver that is not PYROKI, DLS or MINK, parameters\n that do not go with the solver (PyRoKi's and Mink's are checked whole, as\n UpdateRobotModel checks them; DLS has none, so parameters beside it are\n refused), a name that is empty or over 64 characters, or a name the\n workspace's solver templates have (ALREADY_EXISTS). A retry with the same\n `request_id` returns the first call's template.",
        "operationId": "Robots_CreateSolverTemplate",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "requestId",
            "in": "query",
            "description": "Idempotency key (AIP-155): a retry with the same id within 24 hours returns\n the first call's template instead of making a second one.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/qualia.v1.SolverTemplate"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.SolverTemplate"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/solverTemplates/{solverTemplate}": {
      "get": {
        "tags": [
          "Robots"
        ],
        "description": "Gets one solver template. NOT_FOUND for one of another workspace.",
        "operationId": "Robots_GetSolverTemplate",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "solverTemplate",
            "in": "path",
            "description": "The solverTemplate id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.SolverTemplate"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "Robots"
        ],
        "description": "Deletes a solver template. The rigs it was applied to keep their copy.\n Needs robots:delete, like deleting a robot. There is no update: delete\n and register it again.",
        "operationId": "Robots_DeleteSolverTemplate",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "solverTemplate",
            "in": "path",
            "description": "The solverTemplate id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {}
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/statuses": {
      "get": {
        "tags": [
          "Statuses"
        ],
        "description": "Lists running work (QUEUED, RUNNING) and work that ended within\n `recent`, most recently changed first. An organization's list holds\n every workspace's work and the organization's own.",
        "operationId": "Statuses_ListStatuses_Account",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "pageSize",
            "in": "query",
            "description": "At most this many; 0 means 100, the maximum is 500.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "pageToken",
            "in": "query",
            "description": "From a previous response's next_page_token, with the same parent,\n filter and recent. Pages follow the order at each read: work that\n changed in between may show on two pages or on neither, so a live view\n follows the events stream rather than re-paging.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "filter",
            "in": "query",
            "description": "AIP-160 filter. Fields: `state`, `kind` (enum names) and `service`,\n compared with `=` or `!=`, e.g. `state = QUEUED OR state = RUNNING` for\n what runs now, or `service = \"pipeline\" AND state != FAILED`. OR binds\n tighter than AND.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "recent",
            "in": "query",
            "description": "How far back ended work goes: FINISHED, FAILED and CANCELLED work that\n ended longer ago is left out. Running work is always in. Unset means 24\n hours; at most 90 days.",
            "schema": {
              "pattern": "^-?(?:0|[1-9][0-9]{0,11})(?:\\.[0-9]{1,9})?s$",
              "type": "string",
              "description": "Represents a a duration between -315,576,000,000s and 315,576,000,000s (around 10000 years). Precision is in nanoseconds. 1 nanosecond is represented as 0.000000001s"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.ListStatusesResponse"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/statuses/{statuse}": {
      "get": {
        "tags": [
          "Statuses"
        ],
        "description": "Gets one operation's status. An organization-level name reads any\n operation of the organization.",
        "operationId": "Statuses_GetStatus_Account",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "statuse",
            "in": "path",
            "description": "The statuse id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.Status"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/statuses/{statuse}:cancel": {
      "post": {
        "tags": [
          "Statuses"
        ],
        "description": "Asks the service that runs the work to stop it, and answers once it\n accepted. The status still reads as before: it turns CANCELLED when the\n service's OPERATION_CANCELLED reaches the record, a moment later.\n\n Needs `jobs:write` (a contributor and up) on the operation's\n workspace, whichever name asks: PERMISSION_DENIED otherwise. An API key\n needs `jobs:write`, as for `/v1/finetune/{job_id}/cancel`.\n\n FAILED_PRECONDITION when the work has ended, or when its kind cannot be\n cancelled; the message says which.",
        "operationId": "Statuses_CancelStatus_Account",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "statuse",
            "in": "path",
            "description": "The statuse id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/qualia.v1.CancelStatusRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.Status"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/tasks": {
      "get": {
        "tags": [
          "Tasks"
        ],
        "description": "Lists the account's tasks, newest first.",
        "operationId": "Tasks_ListTasks",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "pageSize",
            "in": "query",
            "description": "At most this many; 0 means 100, the maximum is 500.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "pageToken",
            "in": "query",
            "description": "From a previous response's next_page_token.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.ListTasksResponse"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "Tasks"
        ],
        "description": "Creates a task with a draft and nothing published.",
        "operationId": "Tasks_CreateTask",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "requestId",
            "in": "query",
            "description": "Idempotency key (AIP-155): a retry with the same id within 24 hours\n returns the first call's result instead of creating a second task.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/qualia.v1.Task"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.Task"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/tasks/{task}": {
      "get": {
        "tags": [
          "Tasks"
        ],
        "description": "Gets one task with its draft.",
        "operationId": "Tasks_GetTask",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "task",
            "in": "path",
            "description": "The task id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.Task"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "Tasks"
        ],
        "description": "Deletes a task and its revisions. Account owners only. Episodes and\n uploads linked to it (their linked_task) are unlinked; their labels stay.",
        "operationId": "Tasks_DeleteTask",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "task",
            "in": "path",
            "description": "The task id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "etag",
            "in": "query",
            "description": "When set, refuses (ABORTED) if the task changed since it was read.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "force",
            "in": "query",
            "description": "Delete its published revisions too. Without it, a task with any\n revision is refused (FAILED_PRECONDITION).",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {}
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      },
      "patch": {
        "tags": [
          "Tasks"
        ],
        "description": "Edits a task or saves its draft. Published revisions never change.",
        "operationId": "Tasks_UpdateTask",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "task",
            "in": "path",
            "description": "The task id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "updateMask",
            "in": "query",
            "description": "Which fields to change: display_name, draft, or one draft field as\n draft.<field> (e.g. draft.steps), which leaves the rest of the draft as\n stored. `draft` replaces the whole draft.",
            "schema": {
              "type": "string",
              "format": "field-mask"
            }
          },
          {
            "name": "personSet",
            "in": "query",
            "description": "Draft values the caller sets as a person in this update, stamped with\n their Actor: \"steps/<step id>/count\" or\n \"steps/<step id>/state_checks/<index>/numeric\" (index from 0, in the\n updated draft). Every path must name a value present after the update;\n the mask must cover draft or draft.procedure and task.etag must be set.\n Only a signed-in person may send it, not an API key. At most 64.",
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/qualia.v1.Task"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.Task"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/tasks/{task}/drafts": {
      "get": {
        "tags": [
          "TaskDrafts"
        ],
        "description": "Lists stored proposals for a Task.",
        "operationId": "TaskDrafts_ListTaskDrafts",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "task",
            "in": "path",
            "description": "The task id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "pageSize",
            "in": "query",
            "description": "Maximum number of drafts per page.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "pageToken",
            "in": "query",
            "description": "Cursor returned by a previous list call.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.ListTaskDraftsResponse"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "TaskDrafts"
        ],
        "description": "Prices all of a Task's selected references, or starts a stored proposal.\n A create here does not mutate the Task or publish a revision.",
        "operationId": "TaskDrafts_CreateTaskDraft",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "task",
            "in": "path",
            "description": "The task id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/qualia.v1.CreateTaskDraftRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.CreateTaskDraftResponse"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/tasks/{task}/drafts/{draft}": {
      "get": {
        "tags": [
          "TaskDrafts"
        ],
        "description": "Reads the run's state and its stored result, if complete.",
        "operationId": "TaskDrafts_GetTaskDraft",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "task",
            "in": "path",
            "description": "The task id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "draft",
            "in": "path",
            "description": "The draft id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.TaskDraft"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/tasks/{task}/drafts/{draft}:cancel": {
      "post": {
        "tags": [
          "TaskDrafts"
        ],
        "description": "Stops a pending run without changing the Task or its revisions.",
        "operationId": "TaskDrafts_CancelTaskDraft",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "task",
            "in": "path",
            "description": "The task id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "draft",
            "in": "path",
            "description": "The draft id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/qualia.v1.CancelTaskDraftRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.TaskDraft"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/tasks/{task}/references": {
      "get": {
        "tags": [
          "Tasks"
        ],
        "description": "Lists a task's references, oldest first.",
        "operationId": "Tasks_ListTaskReferences",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "task",
            "in": "path",
            "description": "The task id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "pageSize",
            "in": "query",
            "description": "At most this many; 0 means 100, the maximum is 500.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "pageToken",
            "in": "query",
            "description": "From a previous response's next_page_token.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.ListTaskReferencesResponse"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "Tasks"
        ],
        "description": "Picks an episode as a reference. NOT_FOUND for an episode the caller\n cannot read or that is not in the named dataset; FAILED_PRECONDITION\n past the limits (3 SUCCESS, 2 a mode) or for a mode already used with\n another role.",
        "operationId": "Tasks_CreateTaskReference",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "task",
            "in": "path",
            "description": "The task id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "requestId",
            "in": "query",
            "description": "Idempotency key (AIP-155): a retry with the same id within 24 hours\n returns the first call's result instead of picking the episode twice.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/qualia.v1.TaskReference"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.TaskReference"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/tasks/{task}/references/{reference}": {
      "get": {
        "tags": [
          "Tasks"
        ],
        "description": "Gets one reference.",
        "operationId": "Tasks_GetTaskReference",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "task",
            "in": "path",
            "description": "The task id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "reference",
            "in": "path",
            "description": "The reference id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.TaskReference"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "Tasks"
        ],
        "description": "Removes a reference. The episode is untouched.",
        "operationId": "Tasks_DeleteTaskReference",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "task",
            "in": "path",
            "description": "The task id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "reference",
            "in": "path",
            "description": "The reference id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {}
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/tasks/{task}/references/{reference}:confirm": {
      "post": {
        "tags": [
          "Tasks"
        ],
        "description": "Confirms a proposal as the caller. Repeated calls keep the first\n confirmer. NOT_FOUND when the reference does not exist.",
        "operationId": "Tasks_ConfirmTaskReference",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "task",
            "in": "path",
            "description": "The task id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "reference",
            "in": "path",
            "description": "The reference id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/qualia.v1.ConfirmTaskReferenceRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.TaskReference"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/tasks/{task}/revisions": {
      "get": {
        "tags": [
          "Tasks"
        ],
        "description": "Lists a task's revisions, newest first.",
        "operationId": "Tasks_ListTaskRevisions",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "task",
            "in": "path",
            "description": "The task id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "pageSize",
            "in": "query",
            "description": "At most this many; 0 means 100, the maximum is 500.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "pageToken",
            "in": "query",
            "description": "From a previous response's next_page_token.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.ListTaskRevisionsResponse"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/tasks/{task}/revisions/{revision}": {
      "get": {
        "tags": [
          "Tasks"
        ],
        "description": "Gets one revision.",
        "operationId": "Tasks_GetTaskRevision",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "task",
            "in": "path",
            "description": "The task id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "revision",
            "in": "path",
            "description": "The revision id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.TaskRevision"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/tasks/{task}:publish": {
      "post": {
        "tags": [
          "Tasks"
        ],
        "description": "Validates the draft and publishes it as the next immutable revision.\n FAILED_PRECONDITION names what is missing; publishing a draft identical\n to the newest revision is refused too.",
        "operationId": "Tasks_PublishTask",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "task",
            "in": "path",
            "description": "The task id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/qualia.v1.PublishTaskRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.TaskRevision"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/workspaces/{workspace}/checkPolicies/{checkPolicy}": {
      "get": {
        "tags": [
          "Checks"
        ],
        "description": "Reads the effective policy and its source for each scheduler half.",
        "operationId": "Checks_GetAutomaticCheckPolicy_Workspace",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "workspace",
            "in": "path",
            "description": "The workspace id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "checkPolicy",
            "in": "path",
            "description": "The checkPolicy id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.AutomaticCheckPolicy"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      },
      "patch": {
        "tags": [
          "Checks"
        ],
        "description": "Updates only the selected halves; an inherit value removes that override.",
        "operationId": "Checks_UpdateAutomaticCheckPolicy_Workspace",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "workspace",
            "in": "path",
            "description": "The workspace id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "checkPolicy",
            "in": "path",
            "description": "The checkPolicy id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "updateMask",
            "in": "query",
            "description": "The halves to change: heuristic, graph, or both. Omitted halves stay put.\n A selected field set to SETTING_UNSPECIFIED clears its override.",
            "schema": {
              "type": "string",
              "format": "field-mask"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/qualia.v1.AutomaticCheckPolicy"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.AutomaticCheckPolicy"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/workspaces/{workspace}/events": {
      "get": {
        "tags": [
          "Events"
        ],
        "description": "Lists events, newest first, optionally grouped into sessions.",
        "operationId": "Events_ListEvents_Workspace",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "workspace",
            "in": "path",
            "description": "The workspace id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "pageSize",
            "in": "query",
            "description": "At most this many events, or sessions when grouping; 0 means 100, the\n maximum is 500. TEAM_ACTIVITY defaults to 50, maximum 100.\n A page may hold fewer and still have a next one.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "pageToken",
            "in": "query",
            "description": "From a previous response's next_page_token, with the same parent,\n filter and grouping. Pages follow the record's sequence, so events\n recorded after the first page never shift a later one.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "filter",
            "in": "query",
            "description": "AIP-160 filter: comparisons joined by AND (or a space); OR and NOT are\n refused. Fields:\n\n - `subject`: a resource name; the event's subject, or one of its\n   `related` (`subject = \"accounts/a/datasets/d\"`).\n - `subject.name`, `subject.type`: the subject only.\n - `parent`: the parent's name.\n - `actor.user`, `actor.api_key`, `actor.agent`, `actor.kind` (PERSON,\n   SYSTEM, ...).\n - `action` (`\"qds.EPISODES_RULED\"`), `service` (`\"qds\"`), `operation`.\n - `create_time`, with `= < <= > >=` and an RFC 3339 time.\n - `sequence`, with `= < <= > >=`.\n\n With view TEAM_ACTIVITY only, each with `=` and at most once:\n\n - `verb`: the summary's verb (`verb = EDIT`, `verb = PROPOSE_SUBTASKS`,\n   `verb = ADD_INTEGRATION_KEY`). Activity reads qds and platform records.\n - `actor`: the summary's actor kind (PERSON, API_KEY, SERVICE, MODEL,\n   SYSTEM, UNKNOWN). Unlike `actor.kind`, the stored kind, a row a key\n   wrote is API_KEY and a check's proposals are SYSTEM.\n - `workspace`: a workspace id, quoted; an organization's list only.\n - `text`: case-insensitive substring of the subject's recorded label, on\n   any subject type (the summary shows it only for datasets); 3 to 256\n   characters.\n\n Strings are quoted. `=` is exact.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "grouping",
            "in": "query",
            "description": "How to group. Unset lists each event.",
            "schema": {
              "enum": [
                "GROUPING_UNSPECIFIED",
                "SESSIONS"
              ],
              "type": "string",
              "format": "enum"
            }
          },
          {
            "name": "view",
            "in": "query",
            "description": "Optional representation. Page tokens bind the view and its policy version.",
            "schema": {
              "enum": [
                "VIEW_UNSPECIFIED",
                "TEAM_ACTIVITY"
              ],
              "type": "string",
              "format": "enum"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.ListEventsResponse"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/workspaces/{workspace}/events/{event}": {
      "get": {
        "tags": [
          "Events"
        ],
        "description": "Gets one event.",
        "operationId": "Events_GetEvent_Workspace",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "workspace",
            "in": "path",
            "description": "The workspace id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "event",
            "in": "path",
            "description": "The event id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.Event"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/workspaces/{workspace}/events/{event}:activityDetails": {
      "get": {
        "tags": [
          "Events"
        ],
        "description": "Reads bounded recorded targets after checking their current QDS access.",
        "operationId": "Events_ReadActivityDetails_Workspace",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "workspace",
            "in": "path",
            "description": "The workspace id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "event",
            "in": "path",
            "description": "The event id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "pageSize",
            "in": "query",
            "description": "Default 50, maximum 100 targets.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "pageToken",
            "in": "query",
            "description": "Independent target cursor, bound to the event and Activity policy version.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.ReadActivityDetailsResponse"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/workspaces/{workspace}/events/{event}:undo": {
      "post": {
        "tags": [
          "Events"
        ],
        "description": "Undoes an event. The service that wrote it does the undo, in its own\n transaction, and records it as a new event whose `undoes` is this\n event's id; the event itself never changes. Each event is undone at most\n once.\n\n FAILED_PRECONDITION, with the reason in the message, when the event is\n not `undoable` (its kind can't be undone, or this one was written so),\n when it was undone already, or when what it changed has changed since\n (an episode ruled or edited again, an issue edited or dismissed). ABORTED\n when the episodes it edited move while the undo runs: send it again.\n Needs `spaces:read` and `datasets:write` on the event's workspace (only\n qds events undo today); an event of the organization itself needs\n `spaces:read` and `spaces:members` on the organization. An API key needs\n `data:write`.",
        "operationId": "Events_UndoEvent_Workspace",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "workspace",
            "in": "path",
            "description": "The workspace id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "event",
            "in": "path",
            "description": "The event id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/qualia.v1.UndoEventRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.UndoEventResponse"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/workspaces/{workspace}/events:activityActors": {
      "get": {
        "tags": [
          "Events"
        ],
        "description": "Reads recorded person names for a bounded page of actions.",
        "operationId": "Events_ReadActivityActors_Workspace",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "workspace",
            "in": "path",
            "description": "The workspace id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "events",
            "in": "query",
            "description": "At most 100 canonical event references.",
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.ReadActivityActorsResponse"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/workspaces/{workspace}/events:activityFacets": {
      "get": {
        "tags": [
          "Events"
        ],
        "description": "Lists the values the TEAM_ACTIVITY list holds for a filter, with counts:\n the suggestions a search box offers under each key.",
        "operationId": "Events_ListActivityFacets_Workspace",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "workspace",
            "in": "path",
            "description": "The workspace id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "filter",
            "in": "query",
            "description": "A ListEvents TEAM_ACTIVITY filter. The whole filter applies: after\n `verb = EDIT` the verbs are only EDIT.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.ListActivityFacetsResponse"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/workspaces/{workspace}/statuses": {
      "get": {
        "tags": [
          "Statuses"
        ],
        "description": "Lists running work (QUEUED, RUNNING) and work that ended within\n `recent`, most recently changed first. An organization's list holds\n every workspace's work and the organization's own.",
        "operationId": "Statuses_ListStatuses_Workspace",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "workspace",
            "in": "path",
            "description": "The workspace id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "pageSize",
            "in": "query",
            "description": "At most this many; 0 means 100, the maximum is 500.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "pageToken",
            "in": "query",
            "description": "From a previous response's next_page_token, with the same parent,\n filter and recent. Pages follow the order at each read: work that\n changed in between may show on two pages or on neither, so a live view\n follows the events stream rather than re-paging.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "filter",
            "in": "query",
            "description": "AIP-160 filter. Fields: `state`, `kind` (enum names) and `service`,\n compared with `=` or `!=`, e.g. `state = QUEUED OR state = RUNNING` for\n what runs now, or `service = \"pipeline\" AND state != FAILED`. OR binds\n tighter than AND.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "recent",
            "in": "query",
            "description": "How far back ended work goes: FINISHED, FAILED and CANCELLED work that\n ended longer ago is left out. Running work is always in. Unset means 24\n hours; at most 90 days.",
            "schema": {
              "pattern": "^-?(?:0|[1-9][0-9]{0,11})(?:\\.[0-9]{1,9})?s$",
              "type": "string",
              "description": "Represents a a duration between -315,576,000,000s and 315,576,000,000s (around 10000 years). Precision is in nanoseconds. 1 nanosecond is represented as 0.000000001s"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.ListStatusesResponse"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/workspaces/{workspace}/statuses/{statuse}": {
      "get": {
        "tags": [
          "Statuses"
        ],
        "description": "Gets one operation's status. An organization-level name reads any\n operation of the organization.",
        "operationId": "Statuses_GetStatus_Workspace",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "workspace",
            "in": "path",
            "description": "The workspace id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "statuse",
            "in": "path",
            "description": "The statuse id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.Status"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    },
    "/v1/accounts/{account}/workspaces/{workspace}/statuses/{statuse}:cancel": {
      "post": {
        "tags": [
          "Statuses"
        ],
        "description": "Asks the service that runs the work to stop it, and answers once it\n accepted. The status still reads as before: it turns CANCELLED when the\n service's OPERATION_CANCELLED reaches the record, a moment later.\n\n Needs `jobs:write` (a contributor and up) on the operation's\n workspace, whichever name asks: PERMISSION_DENIED otherwise. An API key\n needs `jobs:write`, as for `/v1/finetune/{job_id}/cancel`.\n\n FAILED_PRECONDITION when the work has ended, or when its kind cannot be\n cancelled; the message says which.",
        "operationId": "Statuses_CancelStatus_Workspace",
        "parameters": [
          {
            "name": "account",
            "in": "path",
            "description": "The account id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "workspace",
            "in": "path",
            "description": "The workspace id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "statuse",
            "in": "path",
            "description": "The statuse id.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/qualia.v1.CancelStatusRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/qualia.v1.Status"
                }
              }
            }
          },
          "default": {
            "description": "Default error response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/google.rpc.Status"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "google.rpc.Status": {
        "oneOf": [
          {
            "$ref": "#/components/schemas/ApiError"
          },
          {
            "$ref": "#/components/schemas/GatewayError"
          }
        ],
        "description": "The body of a failed call: one of the two shapes below."
      },
      "qualia.v1.AcquireEpisodeLeaseRequest": {
        "required": [
          "episode",
          "tab"
        ],
        "type": "object",
        "properties": {
          "episode": {
            "type": "string",
            "description": "accounts/{account}/datasets/{dataset}/episodes/{episode}: the take, in\n any dataset that reads it."
          },
          "tab": {
            "type": "string",
            "description": "The caller's tab: a uuid the client makes on load."
          }
        },
        "description": "Request for Episodes.AcquireEpisodeLease."
      },
      "qualia.v1.AcquireEpisodeLeaseResponse": {
        "type": "object",
        "properties": {
          "lease": {
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Episode_Lease"
              }
            ],
            "description": "The caller's lease."
          }
        },
        "description": "Response for Episodes.AcquireEpisodeLease."
      },
      "qualia.v1.ActivityActor": {
        "type": "object",
        "properties": {
          "kind": {
            "enum": [
              "KIND_UNSPECIFIED",
              "PERSON",
              "API_KEY",
              "UNKNOWN",
              "SERVICE",
              "SYSTEM",
              "MODEL"
            ],
            "type": "string",
            "description": "Evidence category.",
            "format": "enum"
          },
          "user": {
            "type": "string",
            "description": "Recorded UUID only, absent whenever a credential was recorded."
          },
          "credential": {
            "type": "string",
            "description": "Credential UUID only, never its value, label, creator or owner."
          },
          "authentication": {
            "enum": [
              "AUTHENTICATION_UNSPECIFIED",
              "SESSION",
              "API_KEY",
              "SERVICE"
            ],
            "type": "string",
            "description": "Signed authentication method. Unspecified means not recorded; a key or a\n session never implies the client (UI, SDK) that used it.",
            "format": "enum"
          },
          "initiator": {
            "type": "string",
            "description": "Verified initiating person's UUID, when recorded. Never a key's creator."
          },
          "credentialOwner": {
            "enum": [
              "CREDENTIAL_OWNER_UNSPECIFIED",
              "PERSON",
              "SPACE"
            ],
            "type": "string",
            "description": "Who owned the recorded key at the time, when recorded.",
            "format": "enum"
          },
          "service": {
            "type": "string",
            "description": "The executing service, `service:<name>`, for a SERVICE principal."
          }
        },
        "description": "Minimal recorded principal. No key owner is asserted to be the operator."
      },
      "qualia.v1.ActivityActorName": {
        "type": "object",
        "properties": {
          "event": {
            "type": "string",
            "description": "Canonical event reference."
          },
          "displayName": {
            "type": "string",
            "description": "Recorded display name, at most 256 characters, without an email fallback:\n the session's person, or the verified initiator a service recorded."
          },
          "initiator": {
            "type": "boolean",
            "description": "True when `display_name` is a verified initiator's rather than the\n principal's own."
          }
        },
        "description": "A recorded human name. Key ownership and trusted initiators are separate."
      },
      "qualia.v1.ActivityCredential": {
        "type": "object",
        "properties": {
          "event": {
            "type": "string",
            "description": "Canonical event reference."
          },
          "currentLabel": {
            "type": "string",
            "description": "The key's current name, only for its creator or an admin of its owning\n space. At most 128 characters; empty when not permitted."
          },
          "currentOwner": {
            "enum": [
              "CREDENTIAL_OWNER_UNSPECIFIED",
              "PERSON",
              "SPACE"
            ],
            "type": "string",
            "description": "Who owns the key now.",
            "format": "enum"
          },
          "currentOwnerLabel": {
            "type": "string",
            "description": "The owning person's current display name for a personal key, or the\n owning space's current name for a service key; empty when not permitted."
          },
          "currentCreatorLabel": {
            "type": "string",
            "description": "The creator's current display name, for a service key; empty otherwise."
          },
          "revoked": {
            "type": "boolean",
            "description": "Revoked now. Only set alongside `current_label`."
          }
        },
        "description": "Current metadata of the key an event recorded, read from the platform as the\n caller. It is today's state, not the state when the event was written, and\n it never names who used the key."
      },
      "qualia.v1.ActivityFacet": {
        "type": "object",
        "properties": {
          "value": {
            "type": "string",
            "description": "The value, as the filter takes it."
          },
          "count": {
            "type": "string",
            "description": "Actions holding it."
          },
          "sampleEvent": {
            "type": "string",
            "description": "The newest of those actions, for people and keys: pass it to\n ReadActivityActors for the name. Empty otherwise."
          }
        },
        "description": "One value of a facet."
      },
      "qualia.v1.ActivityFieldChange": {
        "type": "object",
        "properties": {
          "field": {
            "type": "string",
            "description": "Known field path."
          },
          "previous": {
            "type": "string",
            "description": "Recorded previous value; absent means unknown."
          },
          "current": {
            "type": "string",
            "description": "Recorded resulting value; absent means unknown."
          }
        },
        "description": "An allowlisted scalar dataset field, with missing evidence kept distinct.\n An episode's `linked_task` uses task resource names, where empty means no task."
      },
      "qualia.v1.ActivityLink": {
        "type": "object",
        "properties": {
          "root": {
            "readOnly": true,
            "type": "string",
            "description": "Canonical root event UUID, scoped to the event's account."
          },
          "role": {
            "readOnly": true,
            "enum": [
              "ROLE_UNSPECIFIED",
              "ROOT",
              "EFFECT"
            ],
            "type": "string",
            "description": "Whether this event is the root or a derived effect.",
            "format": "enum"
          }
        },
        "description": "Proven request identity, independent of trace IDs and operation transitions."
      },
      "qualia.v1.ActivityReviewContext": {
        "type": "object",
        "properties": {
          "revision": {
            "type": "integer",
            "description": "The episode's edit revision at the decision; 0 is the original recording.\n Absent when it was not recorded.",
            "format": "int32"
          },
          "upload": {
            "type": "string",
            "description": "The upload the episode came from at the decision."
          },
          "contentReference": {
            "type": "string",
            "description": "The content snapshot's id at the decision (hex). An immutable reference,\n not a dataset version."
          }
        },
        "description": "The episode content a review decision applied to."
      },
      "qualia.v1.ActivitySummary": {
        "type": "object",
        "properties": {
          "event": {
            "type": "string",
            "description": "Canonical raw event reference, also the detail lookup key. Consumers\n deduplicate by this field; request_id is not an action identity."
          },
          "uid": {
            "type": "string",
            "description": "The canonical event UUID, preserved unchanged."
          },
          "sequence": {
            "type": "string",
            "description": "Global record sequence, used by both list ordering and SSE resume."
          },
          "createTime": {
            "type": "string",
            "description": "Recorded action time.",
            "format": "date-time"
          },
          "verb": {
            "enum": [
              "VERB_UNSPECIFIED",
              "KEEP",
              "REJECT",
              "RESET",
              "RESTORE",
              "EDIT",
              "ACCEPT_SUGGESTIONS",
              "REJECT_SUGGESTIONS",
              "SPLIT",
              "UNSPLIT",
              "REQUEST_REINGEST",
              "EDIT_DATASET",
              "ISSUE_RAISED",
              "ISSUE_EDITED",
              "ISSUE_CONVERTED",
              "ISSUE_WITHDRAWN",
              "DISMISS_ISSUES",
              "REOPEN_ISSUES",
              "REPLY_ADDED",
              "REPLY_EDITED",
              "REPLY_DELETED",
              "UNDO",
              "REQUEST_CHECKS",
              "PROPOSE_SUBTASKS",
              "ADD_INTEGRATION_KEY",
              "REMOVE_INTEGRATION_KEY",
              "COPY_DATASET",
              "MOVE_DATASET",
              "COPY_DATASET_STARTED",
              "COPY_DATASET_FAILED",
              "UPLOAD_DATASET"
            ],
            "type": "string",
            "description": "What the action did, independent of subsequent execution outcomes.",
            "format": "enum"
          },
          "changedCount": {
            "type": "string",
            "description": "Actual changed episodes, or distinct accepted episodes for a checks\n request, or distinct episodes with published proposals at run termination.\n Absent means unknown; child operations are never this count."
          },
          "changedFields": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "At most fifteen allowlisted field names, without values."
          },
          "actor": {
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.ActivityActor"
              }
            ],
            "description": "Recorded identity evidence only. No historical owner lookup."
          },
          "dataset": {
            "type": "string",
            "description": "Canonical dataset reference when valid."
          },
          "datasetLabel": {
            "readOnly": true,
            "type": "string",
            "description": "Dataset label recorded on the raw event's subject, at most 256 characters.\n Empty when no label was recorded or dataset is absent. Not its name today."
          },
          "subjectType": {
            "readOnly": true,
            "type": "string",
            "description": "The raw event's subject type (`dataset`, `episode`, `secret`, ...), at\n most 64 characters."
          },
          "subjectLabel": {
            "readOnly": true,
            "type": "string",
            "description": "The label recorded on the raw event's subject, of any type, at most 256\n characters; empty when none was recorded. Not its name today."
          },
          "transfer": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.ActivityTransfer"
              }
            ],
            "description": "COPY_DATASET, MOVE_DATASET, COPY_DATASET_STARTED and COPY_DATASET_FAILED:\n where the dataset came from and went, as recorded. Absent for every other\n verb."
          }
        },
        "description": "Bounded summary of one recorded intentional action. No synthetic grouping.\n Historical merged reviews remain separate events. Only the recorded subject\n label is included as text; no payload, reason, related targets, config or\n revision content is sent."
      },
      "qualia.v1.ActivityTarget": {
        "type": "object",
        "properties": {
          "episode": {
            "type": "string",
            "description": "Immutable recorded reference."
          },
          "currentLabel": {
            "type": "string",
            "description": "Current readable episode number, not a historical label."
          },
          "currentUpload": {
            "type": "string",
            "description": "Current upload returned by QDS, not an inferred event-time source."
          },
          "unavailable": {
            "type": "boolean",
            "description": "Missing or inaccessible, without claiming deletion."
          },
          "reason": {
            "type": "string",
            "description": "Recorded ruling reason, at most 4096 characters."
          },
          "previousState": {
            "type": "string",
            "description": "Recorded previous review state, or empty when unknown."
          },
          "revision": {
            "type": "integer",
            "description": "Exact recorded edit revision. Absent when not recorded.",
            "format": "int32"
          },
          "previousRevision": {
            "type": "integer",
            "description": "Exact recorded previous revision. Absent is unknown, not revision zero.",
            "format": "int32"
          },
          "reviewContext": {
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.ActivityReviewContext"
              }
            ],
            "description": "What a review decided on, captured in its transaction. Absent on reviews\n recorded before it was captured: never inferred from today's episode."
          }
        },
        "description": "One recorded episode reference. Content is returned only after GetEpisode\n authorizes the exact reference as the caller. An unavailable target retains\n only its recorded identifier; no reason, state or revision content escapes."
      },
      "qualia.v1.ActivityTransfer": {
        "type": "object",
        "properties": {
          "source": {
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.ActivityTransfer_End"
              }
            ],
            "description": "Where the dataset came from."
          },
          "target": {
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.ActivityTransfer_End"
              }
            ],
            "description": "Where it went: the copy, or the moved dataset."
          },
          "version": {
            "type": "string",
            "description": "The version tag copied; empty for the current version and for a move."
          },
          "episodeCount": {
            "type": "string",
            "description": "Episodes the copy holds, or the moved dataset."
          },
          "bytesShared": {
            "type": "string",
            "description": "Bytes of content the copy references: what a byte copy would write."
          },
          "bytesWritten": {
            "type": "string",
            "description": "Bytes the transfer wrote to blob storage (0 inside one organization)."
          },
          "robotsCleared": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.TransferRobot"
            },
            "description": "Robots cleared by this transfer. Another organization's name is omitted."
          },
          "robotsRestored": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.TransferRobot"
            },
            "description": "Robots restored by a move back."
          },
          "robotsNotRestored": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.TransferRobot"
            },
            "description": "Previous robots that could not be restored."
          },
          "referenceRanges": {
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.ReferenceRangeSwitch"
              }
            ],
            "description": "Reference ranges left behind and found by a move."
          }
        },
        "description": "A copy or a move as its Activity row names it. One is recorded in each\n workspace it touched. An end in another organization than the row's carries\n only its workspace's and organization's names."
      },
      "qualia.v1.ActivityTransfer_End": {
        "type": "object",
        "properties": {
          "dataset": {
            "type": "string",
            "description": "The dataset at this end, in the row's organization; empty for another\n organization's end."
          },
          "datasetLabel": {
            "type": "string",
            "description": "The dataset's name when it was recorded, at most 256 characters; empty\n with `dataset`."
          },
          "workspace": {
            "type": "string",
            "description": "The workspace, in the row's organization; empty for another\n organization's end."
          },
          "workspaceLabel": {
            "type": "string",
            "description": "The workspace's name when it was recorded, at most 256 characters."
          },
          "organizationLabel": {
            "type": "string",
            "description": "The organization's name when it was recorded, at most 256 characters;\n set only for another organization's end."
          }
        },
        "description": "One end of the transfer."
      },
      "qualia.v1.Actor": {
        "type": "object",
        "properties": {
          "kind": {
            "readOnly": true,
            "enum": [
              "KIND_UNSPECIFIED",
              "PERSON",
              "VALIDATION",
              "RULE",
              "MODEL",
              "OPERATOR",
              "SYSTEM"
            ],
            "type": "string",
            "description": "What kind of actor it is.",
            "format": "enum"
          },
          "user": {
            "readOnly": true,
            "type": "string",
            "description": "The person's user id when `kind` is PERSON; empty otherwise."
          },
          "displayName": {
            "readOnly": true,
            "type": "string",
            "description": "The person's display name at the time, for rendering without a lookup."
          },
          "agent": {
            "readOnly": true,
            "type": "string",
            "description": "The rule code, or for a MODEL the Qualia model tier (e.g. \"qualia-vlm\";\n \"qualia\" for any other model), when not a person."
          },
          "run": {
            "readOnly": true,
            "type": "string",
            "description": "The run a model or rule finding came from, when it has one."
          },
          "apiKey": {
            "readOnly": true,
            "type": "string",
            "description": "The API key's id when a person acted through one; empty for a session.\n Never the key itself."
          },
          "attribution": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Attribution"
              }
            ],
            "description": "Signed identity evidence recorded with the change, kept apart from the\n principal above. Unset on older records and wherever none was signed."
          }
        },
        "description": "Who did something. Every decision, issue and reply names one."
      },
      "qualia.v1.Analysis_Channel": {
        "type": "object",
        "properties": {
          "name": {
            "readOnly": true,
            "type": "string",
            "description": "Channel name, as the recording names it."
          },
          "progress": {
            "readOnly": true,
            "type": "array",
            "items": {
              "type": "number",
              "format": "double"
            },
            "description": "The value at 50 evenly spaced points of the take, first to last."
          },
          "autocorrelation": {
            "readOnly": true,
            "type": "array",
            "items": {
              "type": "number",
              "format": "double"
            },
            "description": "Autocorrelation at lags 1..min(100, frames / 2); empty when the\n channel never moves, and in a list."
          },
          "alignment": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Channel_Alignment"
              }
            ],
            "description": "Unset when the state has no channel of this name, and in a list."
          }
        },
        "description": "One commanded channel's training-chart inputs."
      },
      "qualia.v1.AssignTaskRequest": {
        "required": [
          "parent",
          "selection"
        ],
        "type": "object",
        "properties": {
          "parent": {
            "type": "string",
            "description": "accounts/{account}/datasets/{dataset}: must be the upload."
          },
          "selection": {
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.EpisodeSelection"
              }
            ],
            "description": "Which episodes, at most 10000."
          },
          "task": {
            "type": "string",
            "description": "The task label every selected episode should read. Required unless\n linked_task is set, when it defaults to that task's display_name."
          },
          "requestId": {
            "type": "string",
            "description": "Optional UUID4 identifying this logical edit. Reusing it with the same\n caller and request returns the original result; different input conflicts.\n When absent, each call starts a new logical edit."
          },
          "linkedTask": {
            "type": "string",
            "description": "accounts/{account}/tasks/{task}: link every selected episode to this\n task as well. A task of the dataset's account; NOT_FOUND\n otherwise. Empty leaves links as they are."
          }
        },
        "description": "Request for Episodes.AssignTask."
      },
      "qualia.v1.AssignTaskResponse": {
        "type": "object",
        "properties": {
          "assignedCount": {
            "type": "integer",
            "description": "Episodes whose task changed to the label, or whose link changed.",
            "format": "int32"
          },
          "unchangedCount": {
            "type": "integer",
            "description": "Selected episodes that already read the label (and the link), left\n unchanged.",
            "format": "int32"
          },
          "childrenFollowedCount": {
            "type": "integer",
            "description": "Split children of the relabelled episodes that took the label with their\n parent. A child is never selected or counted on its own.",
            "format": "int32"
          }
        },
        "description": "Response for Episodes.AssignTask."
      },
      "qualia.v1.Attribution": {
        "type": "object",
        "properties": {
          "authentication": {
            "readOnly": true,
            "enum": [
              "AUTHENTICATION_UNSPECIFIED",
              "SESSION",
              "API_KEY",
              "SERVICE"
            ],
            "type": "string",
            "description": "How the principal authenticated.",
            "format": "enum"
          },
          "initiator": {
            "readOnly": true,
            "type": "string",
            "description": "The user id of a person verified as starting the work: the person of a\n session, or the person a trusted service's signed job record names.\n Empty when nobody was verified."
          },
          "initiatorDisplayName": {
            "readOnly": true,
            "type": "string",
            "description": "The initiator's display name at the time, never their email."
          },
          "credentialCreator": {
            "readOnly": true,
            "type": "string",
            "description": "The user id of the key's creator at the time. Not who used the key."
          },
          "credentialOwner": {
            "readOnly": true,
            "enum": [
              "CREDENTIAL_OWNER_UNSPECIFIED",
              "PERSON",
              "SPACE"
            ],
            "type": "string",
            "description": "Who owned the key at the time.",
            "format": "enum"
          },
          "credentialOwnerSpace": {
            "readOnly": true,
            "type": "string",
            "description": "The owning space's id (a workspace or the organization) when\n `credential_owner` is SPACE."
          }
        },
        "description": "How a change was authenticated and who verifiably started it.\n Only the trusted mesh signs it. It never authorizes anything, and a key's\n creator or owner is never the person who used the key."
      },
      "qualia.v1.AutomaticCheckPolicy": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "The automatic policy under an org, workspace or dataset."
          },
          "heuristicEnabled": {
            "readOnly": true,
            "type": "boolean",
            "description": "Whether the scheduler runs the free heuristic half."
          },
          "heuristicSource": {
            "readOnly": true,
            "type": "string",
            "description": "Which level supplied the heuristic setting: platform, org, workspace or dataset."
          },
          "graphEnabled": {
            "readOnly": true,
            "type": "boolean",
            "description": "Whether the scheduler runs the paid graph half."
          },
          "graphSource": {
            "readOnly": true,
            "type": "string",
            "description": "Which level supplied the graph setting: platform, org, workspace or dataset."
          },
          "heuristic": {
            "enum": [
              "SETTING_UNSPECIFIED",
              "ENABLED",
              "DISABLED"
            ],
            "type": "string",
            "description": "The heuristic override at this level; SETTING_UNSPECIFIED clears it.",
            "format": "enum"
          },
          "graph": {
            "enum": [
              "SETTING_UNSPECIFIED",
              "ENABLED",
              "DISABLED"
            ],
            "type": "string",
            "description": "The graph override at this level; SETTING_UNSPECIFIED clears it.",
            "format": "enum"
          }
        },
        "description": "Automatic checks policy is per scheduler half, not per catalog check id.\n Inheritance never queues or replays a run: only a new upload is checked."
      },
      "qualia.v1.BatchCreateSourcesRequest": {
        "required": [
          "parent",
          "requests"
        ],
        "type": "object",
        "properties": {
          "parent": {
            "type": "string",
            "description": "accounts/{account}/datasets/{dataset}: a mixture."
          },
          "requests": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.CreateSourceRequest"
            },
            "description": "The sources to add, 1 to 200, in the order they take. Each request's\n parent is empty or this parent; its request_id is left empty (this\n request carries the one key)."
          },
          "requestId": {
            "type": "string",
            "description": "Idempotency key (AIP-155): a retry with the same id within 24 hours\n returns the first call's sources instead of adding them again."
          }
        },
        "description": "Request for Mixtures.BatchCreateSources."
      },
      "qualia.v1.BatchCreateSourcesResponse": {
        "type": "object",
        "properties": {
          "sources": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.Source"
            },
            "description": "The sources added, in the order requested."
          }
        },
        "description": "Response for Mixtures.BatchCreateSources."
      },
      "qualia.v1.BatchSampleEpisodeSeriesResponse": {
        "type": "object",
        "properties": {
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.BatchSampleEpisodeSeriesResponse_Result"
            },
            "description": "One per take asked, in the order asked."
          }
        },
        "description": "Response for Episodes.BatchSampleEpisodeSeries."
      },
      "qualia.v1.BatchSampleEpisodeSeriesResponse_Result": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "accounts/{account}/datasets/{dataset}/episodes/{episode}"
          },
          "series": {
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.SampleEpisodeSeriesResponse"
              }
            ],
            "description": "Its series, as SampleEpisodeSeries answers; unset where it failed."
          },
          "errorCode": {
            "type": "integer",
            "description": "Where it failed, the gRPC status code SampleEpisodeSeries would have\n answered for this take, as google.rpc.Code numbers it (5 NOT_FOUND,\n 9 FAILED_PRECONDITION, ...); 0 where it was read.",
            "format": "int32"
          },
          "errorMessage": {
            "type": "string",
            "description": "Where it failed, why; empty otherwise."
          }
        },
        "description": "One take's answer."
      },
      "qualia.v1.Bound": {
        "required": [
          "metric"
        ],
        "type": "object",
        "properties": {
          "metric": {
            "type": "string",
            "description": "The metric name: 1 to 64 lowercase letters, digits, '_' or '.',\n starting with a letter."
          },
          "min": {
            "type": "number",
            "description": "The lower limit. At least one of min and max is needed to publish.",
            "format": "double"
          },
          "max": {
            "type": "number",
            "description": "The upper limit, at least min when both are set.",
            "format": "double"
          }
        },
        "description": "Inclusive limits for a measured metric at a procedure step."
      },
      "qualia.v1.BumpSourceRequest": {
        "required": [
          "name"
        ],
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "accounts/{account}/datasets/{dataset}/sources/{source}"
          }
        },
        "description": "Request for Mixtures.BumpSource."
      },
      "qualia.v1.CameraLagCorrection": {
        "required": [
          "upload",
          "topic"
        ],
        "type": "object",
        "properties": {
          "upload": {
            "type": "string",
            "description": "The upload containing this camera topic."
          },
          "topic": {
            "type": "string",
            "description": "Camera topic in this upload."
          },
          "stampOffsetMs": {
            "type": "number",
            "description": "Desired absolute stamp_offset_ms, not a delta.",
            "format": "double"
          },
          "useEstimate": {
            "type": "boolean",
            "description": "Apply a trusted estimate only when its measurement basis is known."
          }
        },
        "description": "An absolute camera offset to publish through a corrective re-ingest."
      },
      "qualia.v1.CameraLagReingest": {
        "type": "object",
        "properties": {
          "upload": {
            "readOnly": true,
            "type": "string",
            "description": "Upload whose camera offset was corrected."
          },
          "reingest": {
            "readOnly": true,
            "type": "string",
            "description": "Name to poll with Datasets.GetReingest."
          },
          "unchanged": {
            "readOnly": true,
            "type": "boolean",
            "description": "True when the requested config was already published."
          },
          "dispatchError": {
            "readOnly": true,
            "type": "string",
            "description": "Non-empty when dispatch for this member failed; other members may proceed."
          }
        },
        "description": "The corrective re-ingest operation started for one upload."
      },
      "qualia.v1.CameraLags": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "The camera lag view for the dataset requested."
          },
          "cameras": {
            "readOnly": true,
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.DatasetCameraLag"
            },
            "description": "Entries are grouped by upload; merged dataset topics are member-local."
          }
        },
        "description": "The per-camera lag estimates and the current setting for each topic."
      },
      "qualia.v1.CancelCheckRunRequest": {
        "required": [
          "name"
        ],
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "accounts/{account}/checks/{check}/runs/{run} (check may be `-`)."
          }
        },
        "description": "Request for Checks.CancelCheckRun."
      },
      "qualia.v1.CancelPoseMoveRequest": {
        "required": [
          "name",
          "poseAttempt"
        ],
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "The upload's re-ingest resource."
          },
          "poseAttempt": {
            "type": "integer",
            "description": "The attempt returned by GetReingest; stale attempts are refused.",
            "format": "int32"
          }
        },
        "description": "Request for Datasets.CancelPoseMove."
      },
      "qualia.v1.CancelReachStatusRequest": {
        "required": [
          "name"
        ],
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "accounts/{account}/datasets/{dataset}/reachStatus"
          }
        },
        "description": "Request for Checks.CancelReachStatus."
      },
      "qualia.v1.CancelStatusRequest": {
        "required": [
          "name"
        ],
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "accounts/{account}/workspaces/{workspace}/statuses/{operation}, or\n accounts/{account}/statuses/{operation}."
          }
        },
        "description": "Request for Statuses.CancelStatus."
      },
      "qualia.v1.CancelTaskDraftRequest": {
        "required": [
          "name"
        ],
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "The TaskDraft to cancel."
          }
        },
        "description": "Stop a pending run."
      },
      "qualia.v1.CarriedGripper_Mount": {
        "required": [
          "side"
        ],
        "type": "object",
        "properties": {
          "side": {
            "enum": [
              "SIDE_UNSPECIFIED",
              "SIDE_LEFT",
              "SIDE_RIGHT"
            ],
            "type": "string",
            "description": "Which arm.",
            "format": "enum"
          },
          "parentLink": {
            "type": "string",
            "description": "The robot's link the gripper hangs off: it must be joined to the arm's\n `hand_link` by fixed joints only."
          },
          "matrix": {
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Matrix4"
              }
            ],
            "description": "The pose of the gripper's hand link (its TCP `link`) in `parent_link`'s\n frame. Ignored when `baked`. The mount is for the link the hand's TCP is\n in when it is set, which must exist then; a TCP set in another link\n later composes nothing until the mount is set again."
          },
          "baked": {
            "type": "boolean",
            "description": "The robot's own URDF already has the gripper built in, as the gripper\n design has it: the mount is the identity on the robot's link of the\n gripper's link name. The server checks that the two URDFs agree on where\n that link is (FAILED_PRECONDITION when they do not) and sets\n `parent_link` and `matrix` itself."
          },
          "guessed": {
            "type": "boolean",
            "description": "The mount was filled in by a guess and has not been confirmed."
          }
        },
        "description": "Where a gripper's hand link sits on one arm."
      },
      "qualia.v1.Channel_Alignment": {
        "type": "object",
        "properties": {
          "correlation": {
            "readOnly": true,
            "type": "array",
            "items": {
              "type": "number",
              "format": "double"
            },
            "description": "Correlation at lags -30..30 frames; NaN where a lag has no\n variance. Empty when the take is under 5 frames."
          }
        },
        "description": "Cross-correlation of the channel's step against its measured twin's."
      },
      "qualia.v1.Check": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "accounts/{account}/checks/{check}"
          },
          "kind": {
            "readOnly": true,
            "enum": [
              "KIND_UNSPECIFIED",
              "EPISODE_RULES",
              "MIXTURE",
              "REACH",
              "VLM",
              "HEURISTIC"
            ],
            "type": "string",
            "description": "Which check it is.",
            "format": "enum"
          },
          "description": {
            "readOnly": true,
            "type": "string",
            "description": "One sentence: what it checks."
          },
          "datasetKinds": {
            "readOnly": true,
            "type": "array",
            "items": {
              "enum": [
                "KIND_UNSPECIFIED",
                "UPLOAD",
                "MIXTURE",
                "MERGED"
              ],
              "type": "string",
              "format": "enum"
            },
            "description": "The dataset kinds it runs on."
          },
          "storesResults": {
            "readOnly": true,
            "type": "boolean",
            "description": "Whether the check stores a CheckResult per episode. Only `reach` does.\n A check's computed values are its source and its issues are alerts\n derived from them: reach's source is its results; the episode rules'\n is Episode.metrics and their reference ranges; so their `results`\n collection is empty. The VLM check's readings are kept with its\n issues, which are what it reports: each issue it raised carries its\n reading (Issue.finding)."
          },
          "runnable": {
            "readOnly": true,
            "type": "boolean",
            "description": "Whether this deployment can run it. False only for `vlm` where the\n deployment has no VLM check pipeline template or no source of published\n tasks: RunCheck on it is then FAILED_PRECONDITION. A client offers a run\n only where it is true."
          }
        },
        "description": "A check the server runs over a dataset. Every account has the same four;\n the {check} id is the kind as a lowercase slug: `episode-rules`,\n `mixture`, `reach`, `vlm`. Everything a check needs (its results\n and reference ranges) lives under it.\n\n Served by qds-api."
      },
      "qualia.v1.CheckEstimate": {
        "type": "object",
        "properties": {
          "credits": {
            "readOnly": true,
            "type": "string",
            "description": "Credits the run would reserve: on a merged dataset, the sum over its\n uploads' runs."
          },
          "episodeCount": {
            "readOnly": true,
            "type": "integer",
            "description": "Episodes the model would read: linked to a published task, in a\n published version, with a camera.",
            "format": "int32"
          },
          "unlinkedCount": {
            "readOnly": true,
            "type": "integer",
            "description": "Episodes of the selection it would leave out: not linked to a task,\n linked to one with no published revision, not in a published version, or\n without a camera.",
            "format": "int32"
          },
          "model": {
            "readOnly": true,
            "type": "string",
            "description": "The Qualia model tier it would read with (\"qualia-vlm-fast\"): the\n request's, else the template's default."
          },
          "models": {
            "readOnly": true,
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Every Qualia model tier this deployment's VLM check offers, the default\n first. A request may still name a legacy vendor model id (deprecated)."
          }
        },
        "description": "What a VLM check run would read and the credits it would reserve, before\n it starts (RunCheck with validate_only). Nothing is reserved or charged by\n asking. A run reserves when it starts, sized the same way on the episodes\n it can read then; its charge is the calls it made, never more than its\n reservation, and a failed run is refunded."
      },
      "qualia.v1.CheckFinding": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "accounts/{account}/datasets/{dataset}/checks/{check}/findings/{finding}"
          },
          "checkRun": {
            "readOnly": true,
            "type": "string",
            "description": "accounts/{account}/checks/vlm/runs/{run}: the run that wrote it."
          },
          "checkVersion": {
            "readOnly": true,
            "type": "integer",
            "description": "The check version that wrote it; 0 for a legacy finding.",
            "format": "int32"
          },
          "legacy": {
            "readOnly": true,
            "type": "boolean",
            "description": "Whether it was written by a template before the catalog; its\n check is the one the template maps to."
          },
          "episode": {
            "readOnly": true,
            "type": "string",
            "description": "accounts/{account}/datasets/{dataset}/episodes/{episode}"
          },
          "findingKey": {
            "readOnly": true,
            "type": "string",
            "description": "Stable within the check, e.g. `success_1` for a criterion."
          },
          "verdict": {
            "readOnly": true,
            "enum": [
              "VERDICT_UNSPECIFIED",
              "PASS",
              "FAIL",
              "UNKNOWN"
            ],
            "type": "string",
            "description": "What it found.",
            "format": "enum"
          },
          "confidence": {
            "readOnly": true,
            "type": "number",
            "description": "0 to 1.",
            "format": "float"
          },
          "severity": {
            "readOnly": true,
            "enum": [
              "SEVERITY_UNSPECIFIED",
              "NONE",
              "NOTE",
              "ISSUE"
            ],
            "type": "string",
            "description": "What it raised.",
            "format": "enum"
          },
          "title": {
            "readOnly": true,
            "type": "string",
            "description": "A few words."
          },
          "summary": {
            "readOnly": true,
            "type": "string",
            "description": "One sentence."
          },
          "explanation": {
            "readOnly": true,
            "type": "string",
            "description": "The evidence, in a few sentences."
          },
          "taskRevision": {
            "readOnly": true,
            "type": "string",
            "description": "accounts/{account}/tasks/{task}/revisions/{revision}: the Task revision\n it read against, for a Task check; the Task's name for one read against\n its unpublished draft; empty otherwise."
          },
          "issue": {
            "readOnly": true,
            "type": "string",
            "description": "accounts/{account}/datasets/{dataset}/issues/{issue}: the issue or note\n it raised; empty for a pass."
          },
          "createTime": {
            "readOnly": true,
            "type": "string",
            "description": "When it was written.",
            "format": "date-time"
          }
        },
        "description": "One finding a catalog check wrote on an episode. Its issue\n identity is the dataset, episode, check id and finding key: a re-run of a\n check updates only that check's issues, and a skipped episode leaves them\n as they were.\n\n Served by qds-api."
      },
      "qualia.v1.CheckResult": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "accounts/{account}/checks/{check}/results/{result}"
          },
          "episode": {
            "readOnly": true,
            "type": "string",
            "description": "The episode, named under its upload:\n accounts/{account}/datasets/{upload}/episodes/{episode}."
          },
          "state": {
            "readOnly": true,
            "enum": [
              "STATE_UNSPECIFIED",
              "PENDING",
              "SUCCEEDED",
              "FAILED",
              "NOT_RUN"
            ],
            "type": "string",
            "description": "Pending, succeeded, failed or not run.",
            "format": "enum"
          },
          "failureReason": {
            "readOnly": true,
            "type": "string",
            "description": "Why it failed."
          },
          "computeTime": {
            "readOnly": true,
            "type": "string",
            "description": "When it was computed.",
            "format": "date-time"
          },
          "reach": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.CheckResult_Reach"
              }
            ],
            "description": "The reach check's."
          }
        },
        "description": "What a check stored for one episode beyond the issues it raised. Only the\n reach check stores results: one per episode and robot. `{result}` is\n `<episode uuid>-<robot uuid>`, both canonical lowercase UUIDs joined by a\n hyphen (73 characters), so a client can build the name itself. Computed\n only when a RunCheck on `checks/reach` asks for it: a read never queues\n one, and neither does a change of the dataset's target robot or of its\n reach_settings. A result belongs to a reach key (Reach.key: the robot's\n config_digest, the solver, the base it was keyed with and the walk it was\n computed with); a\n change of any of them leaves the old rows under their own key, and the new\n key reads NOT_RUN until someone runs the check. Two datasets that ask the\n same question share the result.\n\n Served by qds-api (reach results are written by the reach op, pyroki)."
      },
      "qualia.v1.CheckResult_Reach": {
        "type": "object",
        "properties": {
          "robot": {
            "type": "string",
            "description": "accounts/{account}/robots/{robot}"
          },
          "configDigest": {
            "type": "string",
            "description": "The robot model config it was solved against (RobotModel.config_digest)."
          },
          "stretches": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.Reach_Stretch"
            },
            "description": "Every stretch the robot cannot follow, in time order."
          },
          "longestSeconds": {
            "type": "number",
            "description": "The longest stretch, seconds; 1 s or more raises `out_of_reach`.",
            "format": "double"
          },
          "key": {
            "type": "string",
            "description": "The reach key the result belongs to: the robot's config, the solver, the\n base it was keyed with and the walk it was computed with (see\n ReachStatus.current_key). A\n list for a dataset returns that dataset's current key, also for a pair\n not run yet (NOT_RUN), except when nothing in its scope has been solved\n under that key yet: then it returns the key of the dataset's last\n finished run (ReachStatus.last_finished_run) where that run stored\n results, so a key here that differs from current_key is the last solve\n under settings since changed. GetCheckResult, an account-wide list, or\n a read made while fleet is unreachable, returns the key of the newest\n stored result (empty for a pair nobody ran)."
          },
          "trace": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Reach_TraceRef"
              }
            ],
            "description": "Metadata for reading the separate bounded joint trace."
          },
          "diagnostics": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.ReachDiagnostics"
              }
            ],
            "description": "Optional measured collision coverage, findings and conservative bounds."
          },
          "gaps": {
            "readOnly": true,
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.ReachPoseGap"
            },
            "description": "Complete source-row intervals without simultaneous required-hand poses.\n These contain no reach or collision measurement, regardless of trace sampling."
          }
        },
        "description": "The reach check's result: where a robot cannot follow a handheld or\n egocentric episode's hands."
      },
      "qualia.v1.CheckRun": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "accounts/{account}/checks/{check}/runs/{run}"
          },
          "dataset": {
            "readOnly": true,
            "type": "string",
            "description": "accounts/{account}/datasets/{dataset}: the dataset it checked (an\n upload, for each per-upload run of a merged dataset)."
          },
          "operation": {
            "readOnly": true,
            "type": "string",
            "description": "accounts/{account}/operations/{operation}: the same id, as\n RunCheckResponse.operation and the record's events name it."
          },
          "state": {
            "readOnly": true,
            "enum": [
              "STATE_UNSPECIFIED",
              "QUEUED",
              "RUNNING",
              "SUCCEEDED",
              "FAILED"
            ],
            "type": "string",
            "description": "Where it stands.",
            "format": "enum"
          },
          "failureReason": {
            "readOnly": true,
            "type": "string",
            "description": "Why it failed; empty otherwise."
          },
          "selectedCount": {
            "readOnly": true,
            "type": "integer",
            "description": "Episodes of the selection; 0 when it checked the whole dataset.",
            "format": "int32"
          },
          "raisedCount": {
            "readOnly": true,
            "type": "integer",
            "description": "Issues and notes it opened (new ones, and ones a re-run had closed);\n set once it succeeded.",
            "format": "int32"
          },
          "resolvedCount": {
            "readOnly": true,
            "type": "integer",
            "description": "Open issues and notes it no longer found, dismissed as RESOLVED; set\n once it succeeded.",
            "format": "int32"
          },
          "creator": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Actor"
              }
            ],
            "description": "Who started it."
          },
          "createTime": {
            "readOnly": true,
            "type": "string",
            "description": "When RunCheck recorded it.",
            "format": "date-time"
          },
          "updateTime": {
            "readOnly": true,
            "type": "string",
            "description": "When it last moved; once it ended, when it ended.",
            "format": "date-time"
          },
          "judgedTasks": {
            "readOnly": true,
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.CheckRun_JudgedTask"
            },
            "description": "The Task revisions it judged against, set once it planned: a VLM run's\n Tasks, and the ones a heuristic run read duration bounds from. A run\n judges each Task at the revision its episodes' links carry, never a newer\n one; empty when it read no Task."
          },
          "vlm": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.CheckRun_Vlm"
              }
            ],
            "description": "The VLM check's."
          }
        },
        "description": "One run of a check over a dataset, as RunCheck recorded it. Its\n id is the operation's (RunCheckResponse.operation), so its events on the\n record name it too. A merged dataset is checked one upload at a time, one\n run each, named under the upload, but for VLM and REACH, which are one run\n named under the merged dataset.\n\n Served by qds-api."
      },
      "qualia.v1.CheckRun_JudgedTask": {
        "type": "object",
        "properties": {
          "task": {
            "readOnly": true,
            "type": "string",
            "description": "accounts/{account}/tasks/{task}"
          },
          "displayName": {
            "readOnly": true,
            "type": "string",
            "description": "The Task's display name, as that revision (or draft) has it."
          },
          "revision": {
            "readOnly": true,
            "type": "integer",
            "description": "The revision the episodes' links carry (Episode.linked_task_revision);\n 0 when the run read the Task's unpublished draft.",
            "format": "int32"
          }
        },
        "description": "A Task revision a run judged its episodes against."
      },
      "qualia.v1.CheckRun_ReviewHealth": {
        "type": "object",
        "properties": {
          "available": {
            "readOnly": true,
            "type": "boolean",
            "description": "The rules could read this run. When false, `unavailable_code` and\n `unavailable_reason` say why; the numbers, rows, questions and checks\n are unset."
          },
          "unavailableCode": {
            "readOnly": true,
            "type": "string",
            "description": "Why not: \"no_decisions\" (no episode read), \"no_task_review\" (no\n observation was read), \"no_task_map\" (no upload of the run has a task\n discovery), \"map_incomplete\" (the map covers under 90% of the run's\n episodes, e.g. after cuts), \"partial_run\" (the run read under 90% of\n the discovered episodes) or \"invalid_input\"."
          },
          "unavailableReason": {
            "readOnly": true,
            "type": "string",
            "description": "Why not, in a sentence."
          },
          "version": {
            "readOnly": true,
            "type": "string",
            "description": "\"review-health-v1\"."
          },
          "thresholdsSha256": {
            "readOnly": true,
            "type": "string",
            "description": "sha256 of the frozen thresholds (CurationBench's THRESHOLDS_SHA256)."
          },
          "prepareOperations": {
            "readOnly": true,
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "accounts/{account}/operations/{operation}: the prepare runs whose task\n discovery it read, one per upload."
          },
          "episodeCount": {
            "readOnly": true,
            "type": "integer",
            "description": "Episodes read.",
            "format": "int32"
          },
          "reviewedCount": {
            "readOnly": true,
            "type": "integer",
            "description": "Of them, episodes whose observation was read.",
            "format": "int32"
          },
          "removedCount": {
            "readOnly": true,
            "type": "integer",
            "description": "Removals.",
            "format": "int32"
          },
          "removalRate": {
            "readOnly": true,
            "type": "number",
            "description": "removed_count / episode_count.",
            "format": "double"
          },
          "mapSucceededCount": {
            "readOnly": true,
            "type": "integer",
            "description": "Episodes the discovery map calls successful.",
            "format": "int32"
          },
          "mapSucceededShare": {
            "readOnly": true,
            "type": "number",
            "description": "map_succeeded_count / episode_count.",
            "format": "double"
          },
          "gap": {
            "readOnly": true,
            "type": "number",
            "description": "The kept share less the share the map calls successful.",
            "format": "double"
          },
          "removedCompletedCount": {
            "readOnly": true,
            "type": "integer",
            "description": "Removals whose observation says the task was completed (they\n deviated).",
            "format": "int32"
          },
          "deviatesCompletedShare": {
            "readOnly": true,
            "type": "number",
            "description": "removed_completed_count / removed_count.",
            "format": "double"
          },
          "mapCoverage": {
            "readOnly": true,
            "type": "number",
            "description": "Share of the run's episodes the map covers.",
            "format": "double"
          },
          "groupingAgreement": {
            "readOnly": true,
            "type": "number",
            "description": "Share of the run's episodes judged against a Task linked to their own\n discovered task.",
            "format": "double"
          },
          "contradictionChecked": {
            "readOnly": true,
            "type": "boolean",
            "description": "The contradiction rule ran: false when grouping_agreement is under\n 0.9."
          },
          "tasks": {
            "readOnly": true,
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.ReviewHealth_TaskRow"
            },
            "description": "Per task, largest first."
          },
          "questions": {
            "readOnly": true,
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.ReviewHealth_Question"
            },
            "description": "At most three questions, in the rules' order."
          },
          "moreQuestions": {
            "readOnly": true,
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "The rules of questions past the three, not shown."
          },
          "spotCheck": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.ReviewHealth_SpotCheck"
              }
            ],
            "description": "The spot check."
          },
          "missCheck": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.ReviewHealth_MissCheck"
              }
            ],
            "description": "The miss check; unset unless the run keeps too much."
          }
        },
        "description": "Label-free warning signs of a graph check run's removals, read against\n the task discovery of the run's uploads (CurationBench's\n review-health-v1, ported verbatim). Each rule only asks a person:\n nothing here changes a finding, no model is called, and no person's\n decision is read. The thresholds were set on 2-12 saved CurationBench\n runs and are frozen. A take the prepare run cut has no map outcome, so\n it speaks mostly on uploads that were not cut."
      },
      "qualia.v1.CheckRun_UnpublishedProposal": {
        "type": "object",
        "properties": {
          "episode": {
            "readOnly": true,
            "type": "string",
            "description": "accounts/{account}/datasets/{dataset}/episodes/{episode}"
          },
          "reason": {
            "readOnly": true,
            "type": "string",
            "description": "Why, as the publisher answered."
          },
          "pending": {
            "readOnly": true,
            "type": "boolean",
            "description": "Nobody saw the publication end: it may still land. Running the same\n reading again replays it."
          }
        },
        "description": "An episode whose proposed labels did not publish."
      },
      "qualia.v1.CheckRun_UnreadEpisode": {
        "type": "object",
        "properties": {
          "episode": {
            "readOnly": true,
            "type": "string",
            "description": "accounts/{account}/datasets/{dataset}/episodes/{episode}"
          },
          "reason": {
            "readOnly": true,
            "type": "string",
            "description": "Why, in a sentence: no published video, a refused call, an invalid\n answer."
          }
        },
        "description": "A planned episode the run could not read."
      },
      "qualia.v1.CheckRun_Vlm": {
        "type": "object",
        "properties": {
          "model": {
            "readOnly": true,
            "type": "string",
            "description": "The Qualia model tier that read (or reads) the episodes: the one asked\n for, or once the run answered, the one it reports. Empty while a run that\n named none has not answered."
          },
          "pipelineRun": {
            "readOnly": true,
            "type": "string",
            "description": "The pipeline run that reads the episodes, a UUID; empty until it\n started. The gateway serves its status and settled credits."
          },
          "episodeCount": {
            "readOnly": true,
            "type": "integer",
            "description": "Episodes planned for the model: linked to a published task.",
            "format": "int32"
          },
          "unlinkedCount": {
            "readOnly": true,
            "type": "integer",
            "description": "Episodes of the selection left out: no published task.",
            "format": "int32"
          },
          "unreadCount": {
            "readOnly": true,
            "type": "integer",
            "description": "Planned episodes the model could not read (no published video, a\n refused call, an invalid answer). Their other issues are left as they\n were. Each gets an open \"not checked\" issue (code `not_checked`) that\n takes it out of KEPT, as a confident failure does; against a draft\n task, or on an episode a person kept, it is a note. The next VLM\n reading of the episode closes it, whatever its verdict.",
            "format": "int32"
          },
          "passCount": {
            "readOnly": true,
            "type": "integer",
            "description": "Findings written, by verdict.",
            "format": "int32"
          },
          "failCount": {
            "readOnly": true,
            "type": "integer",
            "description": "Failing findings: issues at CONFIDENT confidence or more, else notes.",
            "format": "int32"
          },
          "uncertainCount": {
            "readOnly": true,
            "type": "integer",
            "description": "Uncertain findings: notes.",
            "format": "int32"
          },
          "datasetChecks": {
            "readOnly": true,
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "accounts/{account}/datasets/{dataset}/checks/{check}: the catalog\n checks a RunDatasetChecks run reads, by category then check id; empty\n for a run of the single VLM check."
          },
          "reviewHealth": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.CheckRun_ReviewHealth"
              }
            ],
            "description": "A graph check run's review health, computed once when its pipeline\n run ended; set once the run succeeded on a template with the\n review_health step."
          },
          "unpublishedCount": {
            "readOnly": true,
            "type": "integer",
            "description": "Episodes whose proposed labels did not publish. Their findings stand;\n a run above zero is partial.",
            "format": "int32"
          },
          "unpublishedProposals": {
            "readOnly": true,
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.CheckRun_UnpublishedProposal"
            },
            "description": "The first 100 of those episodes, each with why."
          },
          "unreadEpisodes": {
            "readOnly": true,
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.CheckRun_UnreadEpisode"
            },
            "description": "The first 100 episodes counted in `unread_count`, each with why, in\n the order the run planned them."
          },
          "notCheckedSummary": {
            "readOnly": true,
            "type": "string",
            "description": "One line on a succeeded run that could not read every planned\n episode, e.g. \"completed, 4 of 30 episodes not checked\"; empty\n otherwise. The run's state stays SUCCEEDED."
          }
        },
        "description": "The VLM check's run."
      },
      "qualia.v1.CompareVersionsResponse": {
        "type": "object",
        "properties": {
          "changes": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.CompareVersionsResponse_Change"
            },
            "description": "One page of changed episodes."
          },
          "nextPageToken": {
            "type": "string",
            "description": "Empty on the last page."
          },
          "baseVersion": {
            "type": "string",
            "description": "The resolved base (\"1.0\", or empty when there was none)."
          },
          "baseDigest": {
            "type": "string",
            "description": "Digest of the base."
          },
          "targetDigest": {
            "type": "string",
            "description": "Digest of the target."
          },
          "addedCount": {
            "type": "string",
            "description": "Episodes added, across every page."
          },
          "removedCount": {
            "type": "string",
            "description": "Episodes removed, across every page."
          },
          "changedCount": {
            "type": "string",
            "description": "Episodes in both at a different revision, across every page."
          },
          "reasonCounts": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            },
            "description": "Added, removed and changed counted per reason, \"RULING\" -> n, for the dialog's summary."
          },
          "draftNote": {
            "type": "string",
            "description": "A note drafted from the diff, for the tag dialog to pre-fill."
          },
          "suggestedVersion": {
            "type": "string",
            "description": "The tag name the dialog offers: the next minor (\"1.0\" first). Majors are\n a person's call."
          }
        },
        "description": "Response for Versions.CompareVersions."
      },
      "qualia.v1.CompareVersionsResponse_Change": {
        "type": "object",
        "properties": {
          "episode": {
            "type": "string",
            "description": "accounts/{account}/datasets/{dataset}/episodes/{episode}, in this dataset's scope."
          },
          "direction": {
            "enum": [
              "DIRECTION_UNSPECIFIED",
              "ADDED",
              "REMOVED",
              "CHANGED"
            ],
            "type": "string",
            "description": "Added or removed.",
            "format": "enum"
          },
          "reason": {
            "enum": [
              "REASON_UNSPECIFIED",
              "RULING",
              "UPSTREAM_RULING",
              "SOURCE_CHANGED",
              "SOURCE_MOVED",
              "ARRIVED",
              "SPLIT",
              "EDITED"
            ],
            "type": "string",
            "description": "Why.",
            "format": "enum"
          },
          "source": {
            "type": "string",
            "description": "The source it came through (mixtures)."
          },
          "cut": {
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Episode_Cut"
              }
            ],
            "description": "Present on immutable cut pieces. Identifies their original take and\n their order within its cut, so replacements can be paired across this\n flat direction/episode-ordered list (and across pages). The take uses\n this comparison's dataset scope, just as episode does."
          }
        },
        "description": "One episode that came in or went out."
      },
      "qualia.v1.ConfirmReferenceRangeRequest": {
        "required": [
          "name"
        ],
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "accounts/{account}/checks/{check}/referenceRanges/{reference_range}"
          },
          "confirmedLow": {
            "type": "number",
            "description": "Bounds to confirm. Omitted sides are unset; at least one is required\n unless clear is true. Values must be finite and low must not exceed high.",
            "format": "double"
          },
          "confirmedHigh": {
            "type": "number",
            "description": "Upper bound; absent means unset.",
            "format": "double"
          },
          "clear": {
            "type": "boolean",
            "description": "Clears both bounds, actor and timestamp. Cannot be combined with bounds."
          }
        },
        "description": "Request for Checks.ConfirmReferenceRange."
      },
      "qualia.v1.ConfirmTaskReferenceRequest": {
        "required": [
          "name"
        ],
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "accounts/{account}/tasks/{task}/references/{reference}"
          }
        },
        "description": "Request for Tasks.ConfirmTaskReference."
      },
      "qualia.v1.ConfirmTaskStringsRequest": {
        "required": [
          "name",
          "runId"
        ],
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "accounts/{account}/datasets/{dataset}/preparation"
          },
          "choices": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.ConfirmTaskStringsRequest_Choice"
            },
            "description": "The whole set of decisions; keys not listed are cleared."
          },
          "runId": {
            "type": "string",
            "description": "The prepare run whose candidates the person saw."
          }
        },
        "description": "Request for ConfirmTaskStrings."
      },
      "qualia.v1.ConfirmTaskStringsRequest_Choice": {
        "required": [
          "key"
        ],
        "type": "object",
        "properties": {
          "key": {
            "type": "string",
            "description": "The candidate's key (ts_<sha12> of the normalised string)."
          },
          "displayName": {
            "type": "string",
            "description": "The task name the person gives it, 1 to 32 characters after trimming:\n a Task's name."
          },
          "confirmed": {
            "type": "boolean",
            "description": "True to use it as a task; false records a person's no."
          }
        },
        "description": "One decision on one task name."
      },
      "qualia.v1.CopyDatasetRequest": {
        "required": [
          "name",
          "targetWorkspace"
        ],
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "accounts/{account}/datasets/{dataset}: the dataset to copy, found in the\n request's workspace."
          },
          "targetWorkspace": {
            "type": "string",
            "description": "accounts/{account}/workspaces/{workspace}: where the copy goes. Another\n workspace of the organization, the same workspace (a duplicate), or a\n workspace of another organization the caller belongs to."
          },
          "version": {
            "type": "string",
            "description": "The version to copy: a tag (or `stable`, or a digest prefix, as a\n version name takes). Empty copies the current version."
          },
          "displayName": {
            "type": "string",
            "description": "The copy's name. Empty takes the source's name, or \"<name> (copy)\" when\n that is taken in the target. A name that is given and taken is\n ALREADY_EXISTS."
          },
          "requestId": {
            "type": "string",
            "description": "Idempotency key (AIP-155): a retry with the same id returns the first\n call's result instead of copying again."
          },
          "resumeOnly": {
            "type": "boolean",
            "description": "Read the copy under `request_id`, never start one. A client sets it on\n every call after a copy's first: a server that holds no plan for that id,\n because the id expired or the first call never arrived, answers NOT_FOUND\n with reason `request_expired` and writes nothing."
          }
        },
        "description": "Request for Datasets.CopyDataset."
      },
      "qualia.v1.CopyGripperAsUmiRigRequest": {
        "required": [
          "name"
        ],
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "accounts/{account}/robots/{robot} of kind GRIPPER in the workspace, with no\n `rig_kind` and no `owner`: the gripper template to copy."
          },
          "displayName": {
            "type": "string",
            "description": "The rig's name, 1 to 64 characters, unique among the workspace's robots and\n workspace-level grippers. Empty: \"<template name> UMI\"."
          },
          "requestId": {
            "type": "string",
            "description": "Idempotency key (AIP-155): a retry with the same id within 24 hours returns\n the first call's rig instead of making a second one."
          },
          "sourceTcpEtag": {
            "type": "string",
            "description": "Robot.GripperTcp.etag of the template as read (empty when it has no TCP), so\n a template that changed since is ABORTED (try again) rather than copied\n half-way, as SetRobotGripper checks `source_tcp_etag`."
          },
          "sourceModelEtag": {
            "type": "string",
            "description": "RobotModel.etag of the template as read; see source_tcp_etag."
          }
        },
        "description": "Request for Robots.CopyGripperAsUmiRig."
      },
      "qualia.v1.CopyJob": {
        "type": "object",
        "properties": {
          "state": {
            "readOnly": true,
            "enum": [
              "STATE_UNSPECIFIED",
              "QUEUED",
              "RUNNING",
              "FINISHING",
              "FAILED"
            ],
            "type": "string",
            "description": "Where the copy is.",
            "format": "enum"
          },
          "filesDone": {
            "type": "integer",
            "description": "Files written so far.",
            "format": "int32"
          },
          "filesTotal": {
            "type": "integer",
            "description": "Files the copy writes.",
            "format": "int32"
          },
          "bytesWritten": {
            "type": "string",
            "description": "Bytes written so far."
          },
          "bytesTotal": {
            "type": "string",
            "description": "Bytes the copy writes."
          },
          "error": {
            "type": "string",
            "description": "Why it stopped, when `state` is FAILED."
          }
        },
        "description": "A copy that runs past its call. A finished copy answers with its dataset and\n no job."
      },
      "qualia.v1.CopyRobotRequest": {
        "required": [
          "name"
        ],
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "accounts/{account}/robots/{robot} of kind ROBOT or ROBOT_TEMPLATE: the robot\n to copy."
          },
          "displayName": {
            "type": "string",
            "description": "The copy's name, 1 to 64 characters. Empty: \"<source name> copy\", or the\n template's own name for a copy of a robot template. A name the workspace has\n (among robots, apart from templates) takes the next free \" (2)\", \" (3)\" ...\n suffix."
          },
          "gripper": {
            "enum": [
              "GRIPPER_COPY_UNSPECIFIED",
              "KEEP",
              "NONE"
            ],
            "type": "string",
            "description": "What the copy takes of the source's gripper. Empty reads as KEEP.",
            "format": "enum"
          },
          "requestId": {
            "type": "string",
            "description": "Idempotency key (AIP-155): a retry with the same id within 24 hours returns\n the first call's copy instead of making a second one."
          }
        },
        "description": "Request for Robots.CopyRobot."
      },
      "qualia.v1.CorrectCameraLagsRequest": {
        "required": [
          "name",
          "corrections",
          "requestId"
        ],
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "Upload or merged dataset to correct."
          },
          "corrections": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.CameraLagCorrection"
            },
            "description": "Each upload in a merged dataset must be covered. Names disambiguate topics."
          },
          "requestId": {
            "type": "string",
            "description": "Required UUID4; retries return the same member re-ingest receipt for 24 hours."
          }
        },
        "description": "Request for Datasets.CorrectCameraLags."
      },
      "qualia.v1.CorrectCameraLagsResponse": {
        "type": "object",
        "properties": {
          "reingests": {
            "readOnly": true,
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.CameraLagReingest"
            },
            "description": "Accepted operations or per-upload dispatch errors."
          }
        },
        "description": "The member re-ingest operation for each corrected upload."
      },
      "qualia.v1.CreateSourceRequest": {
        "required": [
          "parent",
          "source"
        ],
        "type": "object",
        "properties": {
          "parent": {
            "type": "string",
            "description": "accounts/{account}/datasets/{dataset}: a mixture."
          },
          "source": {
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Source"
              }
            ],
            "description": "The source: dataset or label, and follow."
          },
          "requestId": {
            "type": "string",
            "description": "Idempotency key (AIP-155): a retry with the same id within 24 hours\n returns the first call's result instead of creating a second one."
          }
        },
        "description": "Request for Mixtures.CreateSource."
      },
      "qualia.v1.CreateTaskDraftRequest": {
        "required": [
          "parent"
        ],
        "type": "object",
        "properties": {
          "parent": {
            "type": "string",
            "description": "The Task with the already-picked references."
          },
          "validateOnly": {
            "type": "boolean",
            "description": "If true, price all references without reserving credits or starting a run."
          },
          "model": {
            "type": "string",
            "description": "A Qualia model tier (\"qualia-vlm-fast\", \"qualia-vlm-lite\"), or the default\n when omitted. A legacy vendor model id is still accepted (deprecated)."
          },
          "maxCost": {
            "type": "string",
            "description": "Optional maximum credits the person permits this run to reserve."
          }
        },
        "description": "Price or start a TaskDraft from the Task's person-picked references."
      },
      "qualia.v1.CreateTaskDraftResponse": {
        "type": "object",
        "properties": {
          "taskDraft": {
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.TaskDraft"
              }
            ],
            "description": "The pending or failed run; absent when validate_only is true."
          },
          "estimatedCredits": {
            "type": "string",
            "description": "Credits to reserve for all selected references and synthesis."
          },
          "minCost": {
            "type": "string",
            "description": "Minimum credits reported by this reservation estimate."
          }
        },
        "description": "Estimate, with the stored proposal when validate_only was false."
      },
      "qualia.v1.CreateVersionPreviewRequest": {
        "required": [
          "parent"
        ],
        "type": "object",
        "properties": {
          "parent": {
            "type": "string",
            "description": "accounts/{account}/datasets/{dataset}: an upload or a merged dataset."
          },
          "include": {
            "type": "array",
            "items": {
              "enum": [
                "CLASS_UNSPECIFIED",
                "KEPT_BY_PERSON",
                "KEPT",
                "FLAGGED",
                "REJECTED",
                "REJECTED_BY_PERSON"
              ],
              "type": "string",
              "format": "enum"
            },
            "description": "Which takes to take, by how they stand: every take in any class named.\n Empty means KEPT_BY_PERSON. Review need not be finished: a take nobody\n has ruled on is KEPT, or FLAGGED."
          },
          "validateOnly": {
            "type": "boolean",
            "description": "Answer the counts the preview would have and write nothing. Also answers\n versus the newest tag, from the same read-only snapshot; changed_count\n remains zero (it describes changes to a saved READY preview)."
          },
          "requestId": {
            "type": "string",
            "description": "Idempotency key (AIP-155): a retry with the same id within 24 hours\n returns the first call's preview instead of making another."
          }
        },
        "description": "Request for Versions.CreateVersionPreview."
      },
      "qualia.v1.Cuts_Span": {
        "type": "object",
        "properties": {
          "startS": {
            "type": "number",
            "description": "Start, seconds from the take's start.",
            "format": "double"
          },
          "endS": {
            "type": "number",
            "description": "End, seconds from the take's start.",
            "format": "double"
          }
        },
        "description": "A window of a take, in take time."
      },
      "qualia.v1.Cuts_Take": {
        "type": "object",
        "properties": {
          "episode": {
            "type": "string",
            "description": "The as-uploaded (v0) episode."
          },
          "durationS": {
            "type": "number",
            "description": "The take's duration in seconds.",
            "format": "double"
          },
          "spans": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.Cuts_Span"
            },
            "description": "The windows kept as pieces."
          },
          "idle": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.Cuts_Span"
            },
            "description": "The idle stretches the cut found."
          },
          "children": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "The pieces, in span order, in the version the split made."
          },
          "event": {
            "type": "string",
            "description": "The split event."
          }
        },
        "description": "One take the run split into pieces."
      },
      "qualia.v1.Dataset": {
        "required": [
          "displayName",
          "kind"
        ],
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "accounts/{account}/datasets/{dataset}"
          },
          "displayName": {
            "type": "string",
            "description": "Human name shown in the dashboard."
          },
          "description": {
            "type": "string",
            "description": "Free text about the dataset."
          },
          "kind": {
            "enum": [
              "KIND_UNSPECIFIED",
              "UPLOAD",
              "MIXTURE",
              "MERGED"
            ],
            "type": "string",
            "description": "Upload, mixture or merged. Only MIXTURE can be created through\n CreateDataset; uploads arrive through the upload path and MERGED is made\n by MergeDatasets.",
            "format": "enum"
          },
          "state": {
            "readOnly": true,
            "enum": [
              "STATE_UNSPECIFIED",
              "UPLOADING",
              "UPLOADED",
              "UPDATED",
              "REVIEWING",
              "READY"
            ],
            "type": "string",
            "description": "Where the dataset stands (the UI calls it status).",
            "format": "enum"
          },
          "stateProgress": {
            "readOnly": true,
            "type": "number",
            "description": "How far along the current status is, 0 to 1 (share of the upload landed\n while UPLOADING, share of episodes no longer waiting while REVIEWING).",
            "format": "double"
          },
          "labels": {
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Dataset_Labels"
              }
            ],
            "description": "Session labels. Editable on an upload and on a merged dataset, derived\n (the commonest value over what it reads, a merged dataset's own for the\n uploads it holds) on a mixture. A merged dataset's are its own: chosen\n when the merge makes it (an answer, else its uploads' commonest), its\n collection tags seeded from its initial uploads and preserved on append.\n Every collection edit, including a compatibility method/axis edit, stays\n on the owner. Recording annotations on the uploads' takes stay separate."
          },
          "sourceRobot": {
            "type": "string",
            "description": "accounts/{account}/robots/{robot}: the fleet robot the episodes were\n recorded on. Empty for handheld data or when unmapped. A robot, not a\n gripper design (a Robot of kind GRIPPER); it is not looked up when set.\n A merged dataset's uploads share one, chosen at the merge; changing it\n changes it on every upload it holds."
          },
          "targetRobot": {
            "type": "string",
            "description": "accounts/{account}/robots/{robot}: the robot the episodes are played on. Set by default only on handheld uploads (method\n \"handheld\"), to the account's oldest robot (never a gripper design); empty\n otherwise until set.\n Changing it asks for no reach check; it closes the dataset's open\n out_of_reach issues, which were about the previous robot. Name a robot,\n not a gripper design (a Robot of kind GRIPPER): it is not looked up when\n set. Changing a merged dataset's changes it on every upload it holds; an\n upload merged away cannot be changed on its own."
          },
          "counts": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Dataset_Counts"
              }
            ],
            "description": "Episode, time and standing counts."
          },
          "channels": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Dataset_Channels"
              }
            ],
            "description": "What stable and head resolve to."
          },
          "drift": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Dataset_Drift"
              }
            ],
            "description": "Head against the newest tag."
          },
          "robotInterface": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Dataset_InterfaceSummary"
              }
            ],
            "description": "Robot interface and cameras."
          },
          "sourceDatasets": {
            "readOnly": true,
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Lineage. Mixture: the uploads it reads at head, once each, an\n upload a merge took named by its merged dataset (once for all it holds). Merged: the uploads it holds, in the order they were merged.\n Upload: empty."
          },
          "readers": {
            "readOnly": true,
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "The mixtures that read this dataset directly: by name, or (for an\n upload or a merged dataset) through a label source it matches. A Task\n source is listed by the dataset's own Task; one that reads only takes\n linked to it here is found by ListDatasets' `reads` filter."
          },
          "posterUri": {
            "readOnly": true,
            "type": "string",
            "description": "A signed midpoint poster from the first episode with one, in source and\n member order, searching the first 128 members per visible source.\n Empty when no poster can be delivered within that search."
          },
          "repository": {
            "readOnly": true,
            "type": "string",
            "description": "Upload only: the repository it was published into (the git-native view)."
          },
          "sourceFormat": {
            "readOnly": true,
            "enum": [
              "SOURCE_FORMAT_UNSPECIFIED",
              "LEROBOT_V2_1",
              "LEROBOT_V3",
              "MCAP_ROS2"
            ],
            "type": "string",
            "description": "Upload only: persisted ingest format.",
            "format": "enum"
          },
          "verdict": {
            "readOnly": true,
            "enum": [
              "VERDICT_UNSPECIFIED",
              "PUBLISHED",
              "DEGRADED",
              "UNDERIVABLE"
            ],
            "type": "string",
            "description": "Upload only: how the ingest ended.",
            "format": "enum"
          },
          "verdictReason": {
            "readOnly": true,
            "type": "string",
            "description": "Upload only: \"<finding code>: <message>\" when the verdict is not PUBLISHED."
          },
          "creator": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Actor"
              }
            ],
            "description": "Who created it (the uploader, or the person who made the mixture)."
          },
          "createTime": {
            "readOnly": true,
            "type": "string",
            "description": "When the dataset was first published or created.",
            "format": "date-time"
          },
          "updateTime": {
            "readOnly": true,
            "type": "string",
            "description": "When anything about it last changed (a ruling, an issue, a source, a tag).",
            "format": "date-time"
          },
          "etag": {
            "type": "string",
            "description": "Sent back on UpdateDataset and DeleteDataset to guard against lost\n updates; a stale etag fails with ABORTED."
          },
          "slug": {
            "readOnly": true,
            "type": "string",
            "description": "The name a training run cites (Version.reference = \"<slug>:<tag>\"),\n fixed when the dataset is created and never changed by a rename (a rename\n changes display_name only). Made from display_name: lowercased, runs of\n anything but [a-z0-9] turned into \"-\", leading and trailing \"-\" trimmed,\n the first 8 characters of the dataset id when nothing is left. Unique per\n account: a collision at creation takes the next free \"-2\", \"-3\" suffix."
          },
          "posesAt": {
            "readOnly": true,
            "enum": [
              "POSES_AT_UNSPECIFIED",
              "ROOT",
              "TCP"
            ],
            "type": "string",
            "description": "Upload only, and only a handheld (UMI) upload whose state ingest placed in\n the pair frame: where its poses are. ROOT or TCP; unspecified for any\n other dataset. Read from the published repository (meta/ingest.toml and\n calibration.json), so it is filled by GetDataset alone: unset on\n ListDatasets, CreateDataset and UpdateDataset.",
            "format": "enum"
          },
          "posesCalibration": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.TcpCalibration"
              }
            ],
            "description": "Upload only: the calibration the TCP poses were resolved with, as it was\n when they were. Set when poses_at is TCP, and then only by GetDataset.\n Compare it with a rig's calibration to tell whether that rig's\n calibration has been replaced since."
          },
          "posesRig": {
            "readOnly": true,
            "type": "string",
            "description": "Upload only, with poses_at: the key of the rig ingest recognised the\n upload as recorded on (\"umi-handheld\"), which is the rig whose\n calibration a ResolvePoses takes. Ingest decides it from the recorder's\n robot_type, from the upload's meta/ingest.toml `[rig]`, or from the state\n channel names, so it can name a rig when Episode.rig (for a LeRobot\n upload only meta/info.json's robot_type) is empty or something else.\n Filled by GetDataset alone, like poses_at."
          },
          "posesUnavailable": {
            "readOnly": true,
            "type": "boolean",
            "description": "Upload only: true when GetDataset could not read the upload's repository\n for poses_at, poses_calibration and poses_rig, so they are unknown here\n and unspecified does not mean there are none. The rest of the dataset is\n answered as usual; read it again for the poses."
          },
          "mergedDataset": {
            "readOnly": true,
            "type": "string",
            "description": "Upload only: the merged dataset that holds it, once it was merged into\n one (MergeDatasets). Empty otherwise, including after member removal.\n While held, it leaves the unfiltered ListDatasets; its reads\n keep answering, by name and by `slug` (its versions, which keep resolving\n as `<slug>:<tag>`, its takes, issues, ingest report and re-ingests), and\n every write that names it, or an episode, issue or version under it, is\n FAILED_PRECONDITION naming the merged dataset, through which it is\n written."
          },
          "curatedFrom": {
            "type": "string",
            "description": "Mixture only: the upload version it curates from, as\n accounts/{account}/datasets/{dataset}/versions/{tag}; set on create\n (CreateDataset) and never changed. Such a branch reads that upload as the\n version froze it, through one source pinned there: the upload's rulings\n and blocking issues since reach neither it nor what reads it, its\n episodes read at the revisions the version pinned, its own keeps and\n rejects curate it, and edits are made in the upload. Empty for any other\n dataset."
          },
          "reachSettings": {
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.ReachSettings"
              }
            ],
            "description": "How the dataset's reach check is walked, as the dataset stores it: what\n is unset follows the target robot's model (see Checks.GetReachStatus for\n what a RunCheck would use now). Saving it starts nothing."
          },
          "linkedTask": {
            "type": "string",
            "description": "accounts/{account}/tasks/{task}: the Task an upload is recorded against, or empty when unlinked. A link, not a label: labels.task stays\n the text. Set on an upload (a task of its account, NOT_FOUND otherwise),\n or on a merged dataset, whose own it is (chosen when the merge makes it:\n an answer, else its uploads' commonest; its uploads keep theirs); a\n mixture shows the commonest link of the uploads it reads (a merged\n dataset's own for the uploads it holds). Linking by label\n (LinkTaskLabels, and publishing a task) links an upload or a merged\n dataset by its own labels.task, never an upload a merge took. Deleting\n the task unlinks it. A mixture source can follow every episode linked to\n one task (Source.linked_task). Every take of an upload\n or a merged dataset with no link of its own reads the dataset's\n (Episode.linked_task_inherited): a merged dataset's takes read\n its own, not their uploads', so setting it links them all at\n once; UpdateDatasetRequest.relink_episodes moves the takes linked to the\n old one as well."
          },
          "linkedTaskRevision": {
            "readOnly": true,
            "type": "integer",
            "description": "The revision of linked_task the link carries, and the one\n checks judge the dataset's takes against: the Task's newest published\n revision when the link was made. 0 when unlinked, when the Task had no\n published revision then (its draft is judged), and on a mixture, which\n carries no link of its own. Publishing a newer revision leaves it, and\n starts no check; RelinkTask moves it to latest_task_revision and reruns.",
            "format": "int32"
          },
          "latestTaskRevision": {
            "readOnly": true,
            "type": "integer",
            "description": "linked_task's newest published revision, 0 when it has none (or nothing\n is linked, or on a mixture). Above linked_task_revision: the link has\n drifted, and RelinkTask would relink it.",
            "format": "int32"
          },
          "interfaceSettlement": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Dataset_InterfaceSettlement"
              }
            ],
            "description": "Merged dataset only: member interfaces ready to freeze as one, and the\n uploads still awaiting or differing from the first member's interface."
          },
          "workspaceId": {
            "readOnly": true,
            "type": "string",
            "description": "The project that owns the dataset, empty when it is in the account's\n default workspace. Gateway clients select it with X-Qualia-Workspace."
          },
          "mergedSettingsContext": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.MergedSettingsContext"
              }
            ],
            "description": "No longer set: a merge is final and a merged dataset is not\n corrected through its uploads. It was GetDataset's merged membership for\n a member settings operation."
          },
          "posesEligible": {
            "readOnly": true,
            "type": "boolean",
            "description": "No longer set: a merged dataset's poses are not resolved\n through its uploads."
          },
          "settingsSettlement": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Dataset_InterfaceSettlement"
              }
            ],
            "description": "No longer set: a merged dataset's uploads were settled at the\n merge (one contract, one pose frame); interface_settlement is its view of\n an interface still re-deriving."
          },
          "settingsUnavailableReason": {
            "readOnly": true,
            "type": "string",
            "description": "No longer set, with settings_settlement."
          },
          "taskReferences": {
            "readOnly": true,
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.Dataset_TaskReferences"
            },
            "description": "GetDataset only: one per Task, by display name."
          },
          "taskReferencedEpisodeCount": {
            "readOnly": true,
            "type": "integer",
            "description": "GetDataset only: how many distinct episodes those Tasks reference (an\n episode two Tasks reference counts once).",
            "format": "int32"
          },
          "tags": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "This dataset's tags: up to 64 nonblank strings of at most 256 bytes.\n Recognized collection names are teleop, vr, umi, egocentric,\n policy-rollout, sim, real-world, human and gello; they are ordered first\n in that order, followed by free tags in lexical order. Environment,\n origin, method and controller derive from saved metadata. The tags mask\n may echo unchanged classifications and edit custom strings only; use\n typed metadata masks for classification changes or Unknown. A merged\n dataset owns its metadata, which is never written\n to its uploads or replaced when uploads are appended. A mixture reads\n the tags of its sources. Distinct from episode curation and version tags."
          },
          "posePreparation": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.MergedPosePreparation"
              }
            ],
            "description": "GetDataset only, merged datasets: each upload's progress toward its own\n recognized rig's CURRENT capture calibration. Independent of playback\n robot selection. A failed read is unknown, never a completed preparation."
          },
          "composedUmiRig": {
            "readOnly": true,
            "type": "string",
            "description": "accounts/{account}/robots/{robot}: a Robot resource name, the UMI rig's\n gripper row (a Robot of kind GRIPPER with a rig kind). It is NOT the legacy\n accounts/{account}/rigs/{rig} Rig resource. The UMI rig this upload was\n composed with when it began: the gripper the uploader named, else\n the workspace's one UMI rig. Recorded at publication, so a later edit or\n deletion of the rig does not change it. A copy in the same workspace carries\n it; a move to a workspace where the rig does not exist clears it (it is not\n listed among the robots cleared, and a move back does not restore it).\n Set by each upload's publication from that upload's own begin, empty\n included; a re-ingest, resolve or cut leaves it.\n Empty when no rig row composed the upload: it predates this field; it was\n uploaded by an SDK that sends no transfer session; the workspace's rig was\n lent unasked and the tree kept its own TCP; it is a UMI recording only\n ingest recognises (channel names, a LeRobot robot_type); the merged dataset\n it appends to lent its members' rig, which is their config, not a row; it\n was copied across workspaces; it was recorded on a robot's joints (see\n source_robot); or it is not an upload. Not set on a merged dataset or a\n mixture."
          },
          "rigs": {
            "readOnly": true,
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.DatasetRig"
            },
            "description": "The rigs this dataset's uploads were recorded on, most uploads\n first; ties by resource name (a client that shows display names orders\n ties itself); the entry with no robot last whatever its count. An upload\n is recorded on one rig: a handheld (UMI) upload's is the UMI rig that\n composed it (composed_umi_rig), and any other upload's is its source_robot.\n A merged dataset lists the distinct rigs of the uploads it holds, and a\n mixture those of the uploads it read at its last resolve, each with how\n many were recorded on it. Computed when read, never stored, so it follows\n a robot assignment, an append, a member's removal and a revert.\n\n An upload with no rig is counted in the entry with no robot, never\n dropped. That is a handheld upload published before uploads recorded their\n rig, or whose latest upload composed none (a kept tree TCP, a rig lent by\n the merge target, an SDK that names no transfer session, a recording only\n ingest recognises as handheld), an upload copied across workspaces, and an\n upload of a robot's joints with no robot assigned.\n\n A handheld upload never lists source_robot, which is a robot, not a\n gripper design. Known limit: a merge's old \"Recorded on\" answer, and a\n source_robot written on a merged dataset, are written to every upload the\n dataset holds, and only arm uploads list it, so such a dataset lists one\n rig for arm uploads that may have been recorded on several."
          }
        },
        "description": "A dataset is an upload (one recording session, as it arrived), a mixture\n (kept up to date from other datasets) or a merge of uploads (several\n uploads reviewed, versioned and trained as one). All three have the same\n page and the same API: episodes, issues and versions nest under any of them.\n\n Served by qds-api."
      },
      "qualia.v1.DatasetCameraLag": {
        "type": "object",
        "properties": {
          "upload": {
            "readOnly": true,
            "type": "string",
            "description": "The upload containing this camera."
          },
          "topic": {
            "readOnly": true,
            "type": "string",
            "description": "Camera topic in this upload."
          },
          "estimatedLagMs": {
            "readOnly": true,
            "type": "number",
            "description": "Median trusted per-episode lag; positive means camera content is late.\n Unset if no trusted estimate exists.",
            "format": "double"
          },
          "confidence": {
            "readOnly": true,
            "type": "number",
            "description": "Median confidence among trusted estimates.",
            "format": "double"
          },
          "sampleCount": {
            "readOnly": true,
            "type": "integer",
            "description": "Episodes with a stored lag entry for this camera.",
            "format": "int32"
          },
          "trustedSampleCount": {
            "readOnly": true,
            "type": "integer",
            "description": "Episodes with a trusted, finite lag and confidence.",
            "format": "int32"
          },
          "appliedOffsetMs": {
            "readOnly": true,
            "type": "number",
            "description": "Published channel stamp_offset_ms; unset means ingest uses zero.",
            "format": "double"
          },
          "estimateApplicable": {
            "readOnly": true,
            "type": "boolean",
            "description": "Whether the stored estimate can safely determine an absolute offset."
          },
          "estimateUnavailableReason": {
            "readOnly": true,
            "type": "string",
            "description": "Why the estimate cannot be applied; empty when it can be applied."
          },
          "topicAvailable": {
            "readOnly": true,
            "type": "boolean",
            "description": "Whether the ingest report proved this camera's native topic mapping."
          },
          "source": {
            "readOnly": true,
            "type": "string",
            "description": "Provenance aggregated from stored per-episode values: recorded, estimated, mixed, or unknown."
          },
          "method": {
            "readOnly": true,
            "type": "string",
            "description": "Stored estimator/event method, mixed when multiple methods were recorded."
          }
        },
        "description": "One camera topic's aggregate lag and current correction."
      },
      "qualia.v1.DatasetCheck": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "accounts/{account}/datasets/{dataset}/checks/{check}; {check} is the\n check id, e.g. `task.graph`."
          },
          "checkId": {
            "readOnly": true,
            "type": "string",
            "description": "The stable, namespaced check id: `<category>.<name>`."
          },
          "version": {
            "readOnly": true,
            "type": "integer",
            "description": "The active version.",
            "format": "int32"
          },
          "displayName": {
            "readOnly": true,
            "type": "string",
            "description": "A short display name."
          },
          "category": {
            "readOnly": true,
            "type": "string",
            "description": "The category it groups under, e.g. `task` or `quality`."
          },
          "kind": {
            "readOnly": true,
            "enum": [
              "KIND_UNSPECIFIED",
              "VLM",
              "HEURISTIC"
            ],
            "type": "string",
            "description": "How it reads an episode.",
            "format": "enum"
          },
          "description": {
            "readOnly": true,
            "type": "string",
            "description": "One sentence: what it checks."
          },
          "requiredInputs": {
            "readOnly": true,
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "What an episode needs for the check to read it, e.g. `task.revision`,\n `episode.media`."
          },
          "runnable": {
            "readOnly": true,
            "type": "boolean",
            "description": "Whether RunDatasetChecks can select it on this dataset now."
          },
          "unavailableReason": {
            "readOnly": true,
            "type": "string",
            "description": "Why not, when it is not runnable; empty otherwise."
          },
          "lastResult": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.DatasetCheck_Result"
              }
            ],
            "description": "The latest completed result here; unset when it never ran here."
          },
          "runningCheckRun": {
            "readOnly": true,
            "type": "string",
            "description": "accounts/{account}/checks/{check}/runs/{run}: the newest run of this\n check still running on this dataset, whoever started it; empty when none\n is. A person's RunDatasetChecks selecting it is refused until it ends."
          }
        },
        "description": "A check in the platform's catalog, as one dataset sees it. A\n check is a reviewed, versioned unit of verification that yields a verdict\n and findings per episode; it is not a model call or a pipeline template.\n Its definition is published on deploy and never changes under a version.\n\n Served by qds-api."
      },
      "qualia.v1.DatasetCheckSelection": {
        "type": "object",
        "properties": {
          "datasetCheck": {
            "type": "string",
            "description": "accounts/{account}/datasets/{dataset}/checks/{check}"
          },
          "version": {
            "type": "integer",
            "description": "The check version pinned.",
            "format": "int32"
          },
          "kind": {
            "enum": [
              "KIND_UNSPECIFIED",
              "VLM",
              "HEURISTIC"
            ],
            "type": "string",
            "description": "How it reads an episode.",
            "format": "enum"
          },
          "episodeCount": {
            "type": "integer",
            "description": "Selected episodes it will read.",
            "format": "int32"
          },
          "skippedCount": {
            "type": "integer",
            "description": "Selected episodes it skips, with `skip_reason`.",
            "format": "int32"
          },
          "skipReason": {
            "type": "string",
            "description": "Why it skips them (e.g. no published Task); empty when it skips none."
          }
        },
        "description": "One selected check, as the run pins it."
      },
      "qualia.v1.DatasetCheck_Result": {
        "type": "object",
        "properties": {
          "checkRun": {
            "readOnly": true,
            "type": "string",
            "description": "accounts/{account}/checks/vlm/runs/{run}: the run."
          },
          "completeTime": {
            "readOnly": true,
            "type": "string",
            "description": "When it ended.",
            "format": "date-time"
          },
          "version": {
            "readOnly": true,
            "type": "integer",
            "description": "The check version it ran.",
            "format": "int32"
          },
          "selectedCount": {
            "readOnly": true,
            "type": "integer",
            "description": "Episodes the run selected (after its filter and sample), so a partial\n sample is not read as full coverage.",
            "format": "int32"
          },
          "skippedCount": {
            "readOnly": true,
            "type": "integer",
            "description": "Of those, episodes the check could not read (ineligible or unread).",
            "format": "int32"
          },
          "partial": {
            "readOnly": true,
            "type": "boolean",
            "description": "Whether the run read a filtered or sampled subset of the dataset."
          },
          "passCount": {
            "readOnly": true,
            "type": "integer",
            "description": "Findings it wrote, by verdict.",
            "format": "int32"
          },
          "failCount": {
            "readOnly": true,
            "type": "integer",
            "description": "Failing findings.",
            "format": "int32"
          },
          "unknownCount": {
            "readOnly": true,
            "type": "integer",
            "description": "Findings that could not tell.",
            "format": "int32"
          },
          "issueCount": {
            "readOnly": true,
            "type": "integer",
            "description": "Of its findings, those raised as issues (a confident fail).",
            "format": "int32"
          },
          "noteCount": {
            "readOnly": true,
            "type": "integer",
            "description": "Of its findings, those raised as notes (a less confident fail, or\n unknown).",
            "format": "int32"
          },
          "assessedCount": {
            "readOnly": true,
            "type": "integer",
            "description": "Episodes the check wholly assessed: every result for the episode a pass\n or a fail. Less than `selected_count` means some episodes were not\n wholly assessed. Zero means none was wholly assessed; classify as not\n assessed only when `pass_count` and `fail_count` are also both zero (a\n camera can fail while another is unassessed). Set for heuristic checks;\n unset for a VLM check or a run recorded before the count was kept.",
            "format": "int32"
          },
          "unassessedReasons": {
            "readOnly": true,
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.DatasetCheck_UnassessedReason"
            },
            "description": "Why results were not assessed, most frequent first, as the check said\n (e.g. `missing or invalid metric: jerk_mean`). Empty when every result\n was assessed, for a VLM check, or for a run recorded before reasons\n were kept."
          }
        },
        "description": "The latest completed run of the check on this dataset."
      },
      "qualia.v1.DatasetCheck_UnassessedReason": {
        "type": "object",
        "properties": {
          "reason": {
            "readOnly": true,
            "type": "string",
            "description": "The check's own words, at most 200 characters."
          },
          "count": {
            "readOnly": true,
            "type": "integer",
            "description": "Results not assessed for this reason.",
            "format": "int32"
          }
        },
        "description": "One reason a check could not assess results, and how many it covers."
      },
      "qualia.v1.DatasetRig": {
        "type": "object",
        "properties": {
          "robot": {
            "readOnly": true,
            "type": "string",
            "description": "accounts/{account}/robots/{robot}: the rig's Robot (a UMI rig's gripper\n row, or the robot an arm upload was recorded on). A rig that no longer\n resolves to a robot is still named here. Empty counts the uploads whose rig\n was never recorded."
          },
          "uploadCount": {
            "readOnly": true,
            "type": "integer",
            "description": "How many of the dataset's uploads were recorded on it.",
            "format": "int32"
          }
        },
        "description": "One rig a dataset's uploads were recorded on: see Dataset.rigs."
      },
      "qualia.v1.Dataset_Channels": {
        "type": "object",
        "properties": {
          "stable": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Dataset_Ref"
              }
            ],
            "description": "The newest tag; unset when there is none yet."
          },
          "head": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Dataset_Ref"
              }
            ],
            "description": "What the dataset yields now; always set."
          }
        },
        "description": "What each channel resolves to right now."
      },
      "qualia.v1.Dataset_Counts": {
        "type": "object",
        "properties": {
          "episodes": {
            "readOnly": true,
            "type": "string",
            "description": "Episodes in the dataset (for a mixture: in its resolved head)."
          },
          "frames": {
            "readOnly": true,
            "type": "string",
            "description": "Frames across every episode."
          },
          "durationSeconds": {
            "readOnly": true,
            "type": "number",
            "description": "Recorded time across every episode, in seconds.",
            "format": "double"
          },
          "kept": {
            "readOnly": true,
            "type": "string",
            "description": "Episodes standing KEPT here."
          },
          "unreviewed": {
            "readOnly": true,
            "type": "string",
            "description": "Episodes standing UNREVIEWED here."
          },
          "rejected": {
            "readOnly": true,
            "type": "string",
            "description": "Episodes standing REJECTED here (validation rejects included)."
          },
          "rejectedValidation": {
            "readOnly": true,
            "type": "string",
            "description": "Of those, rejected by ingest validation."
          },
          "openIssues": {
            "readOnly": true,
            "type": "string",
            "description": "Open blocking issues in this dataset's scope, on the dataset itself or on\n episodes not rejected here."
          },
          "sizeBytes": {
            "readOnly": true,
            "type": "string",
            "description": "Upload only, and set by GetDataset alone (it sums every file): the\n bytes of every file in its repository as published."
          },
          "fileCount": {
            "readOnly": true,
            "type": "string",
            "description": "Upload only, and set by GetDataset alone: how many files those are."
          },
          "ruled": {
            "readOnly": true,
            "type": "string",
            "description": "Episodes a person ruled on here: those a person's keep or\n reject in this dataset's scope (a merged dataset's: its uploads' too)\n stands on, a split take's on each of its pieces without a ruling of\n their own. An episode kept because nothing blocks it, and a validation\n reject, are not counted. At most `kept + rejected`."
          }
        },
        "description": "Row counts. Frame totals can exceed 2^31, so they are int64 (a JSON string)."
      },
      "qualia.v1.Dataset_Drift": {
        "type": "object",
        "properties": {
          "version": {
            "readOnly": true,
            "type": "string",
            "description": "The tag measured from; empty when the dataset has no tag yet."
          },
          "added": {
            "readOnly": true,
            "type": "string",
            "description": "Episodes head yields that the tag does not."
          },
          "removed": {
            "readOnly": true,
            "type": "string",
            "description": "Episodes the tag pins that head no longer yields."
          },
          "changed": {
            "readOnly": true,
            "type": "string",
            "description": "Episodes in both whose pinned revision differs from head's (an edit:\n trim, subtasks, tags). Training reads exact revisions, so these count."
          }
        },
        "description": "How far head has moved past the newest tag. A dataset whose\n drift is not empty lights its tag button."
      },
      "qualia.v1.Dataset_InterfaceSettlement": {
        "type": "object",
        "properties": {
          "settledMembers": {
            "readOnly": true,
            "type": "integer",
            "description": "Number of merged members whose derived interfaces are settled.",
            "format": "int32"
          },
          "totalMembers": {
            "readOnly": true,
            "type": "integer",
            "description": "Total number of uploads in the merged dataset.",
            "format": "int32"
          },
          "outstandingUploads": {
            "readOnly": true,
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Upload resource names whose interfaces are not settled yet."
          }
        },
        "description": "Progress toward one settled robot interface across a merged dataset's\n uploads. A member remains outstanding while its accepted mapping lens is\n still being re-derived, or when its derived interface differs from the\n merged dataset's first member."
      },
      "qualia.v1.Dataset_InterfaceSummary": {
        "type": "object",
        "properties": {
          "interfaceHash": {
            "readOnly": true,
            "type": "string",
            "description": "Canonical robot-interface hash `b3:<hex>`; empty until derived."
          },
          "stateChannels": {
            "readOnly": true,
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Canonical state channel keys, e.g. \"left.joint.1\", \"right.ee.x\"."
          },
          "actionChannels": {
            "readOnly": true,
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Canonical action channel keys."
          },
          "cameras": {
            "readOnly": true,
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Camera keys, e.g. \"context\", \"wrist_left\"."
          },
          "fps": {
            "readOnly": true,
            "type": "number",
            "description": "Frames per second of the data rows.",
            "format": "double"
          },
          "mixed": {
            "readOnly": true,
            "type": "boolean",
            "description": "Mixture only: the episodes it reads come from more than one interface."
          },
          "nativeStateChannels": {
            "readOnly": true,
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.InterfaceSummary_Channel"
            },
            "description": "Each state channel in vector order. A converted handheld upload's are\n the pair-frame channels its takes are sampled in. A merged dataset's are\n its uploads' (one entry per native channel, with `sides` where they\n resolve it differently), on GetDataset only. Empty on a mixture, whose\n uploads each place their channels their own way."
          },
          "nativeActionChannels": {
            "readOnly": true,
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.InterfaceSummary_Channel"
            },
            "description": "Each action channel in vector order, as `native_state_channels`."
          },
          "nativeCameras": {
            "readOnly": true,
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.InterfaceSummary_Channel"
            },
            "description": "Each recorded camera with the camera key it is read as: `native_name` is\n the recording's feature (e.g. \"observation.images.top\") and\n `canonical_key` the key. A person's channel mapping can key a camera\n otherwise than its name (\"observation.images.top\" as \"cam.overhead\").\n An upload's are its cameras in recording order; an entry without\n `sides` binds the upload's own episodes only. A merged dataset's or a\n mixture's are one per feature any upload it reads records, in the order\n the first such upload places it, always with `sides` naming those\n uploads, and `canonical_key` the commonest key. So an episode reads a\n camera from the feature whose entry gives it that key for the episode's\n upload, and records the camera nowhere when no entry does. A version can\n pin episodes of an upload the dataset no longer reads: no entry names\n it, so its cameras are recorded nowhere."
          }
        },
        "description": "What the compatibility check reads: the robot interface and the\n cameras. For a mixture it is the intersection over what it reads, with\n `mixed` set when the interfaces differ."
      },
      "qualia.v1.Dataset_Labels": {
        "type": "object",
        "properties": {
          "task": {
            "type": "string",
            "description": "Task label, e.g. \"restock shelf\". Empty means unlabeled."
          },
          "robot": {
            "type": "string",
            "description": "The robot label as recorded (a robot type key such as \"openarm\"), or\n \"umi-handheld\" for handheld capture. Not the fleet robot; see source_robot."
          },
          "operator": {
            "type": "string",
            "description": "Operator label (a name or a hashed id)."
          },
          "method": {
            "type": "string",
            "description": "Legacy single-method value: teleop, vr, handheld, egocentric,\n policy_rollout, umi, policy-rollout, sim, or empty. An upload's starts\n as its episodes' commonest."
          },
          "scene": {
            "type": "string",
            "description": "Scene label, e.g. \"shelf\"."
          },
          "methods": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Compatibility projection of Dataset.tags containing only the original\n six collection-method names, including saved axis aliases. Legacy\n method edits declare their human methods and positive axis aliases;\n existing saved independent axes and free names remain authoritative.\n Use typed axis paths or human_methods_only for independent edits."
          },
          "environment": {
            "enum": [
              "ENVIRONMENT_UNSPECIFIED",
              "ENVIRONMENT_UNKNOWN",
              "REAL_WORLD",
              "SIMULATION"
            ],
            "type": "string",
            "description": "Saved environment authority for derived real-world/sim tags. An axis edit\n changes only its pair; missing evidence does not prove real-world.",
            "format": "enum"
          },
          "origin": {
            "enum": [
              "ORIGIN_UNSPECIFIED",
              "ORIGIN_UNKNOWN",
              "HUMAN_COLLECTED",
              "POLICY_ROLLOUT"
            ],
            "type": "string",
            "description": "Saved origin authority for derived human/policy-rollout tags. Missing\n policy metadata never proves human-collected origin.",
            "format": "enum"
          },
          "teleopInput": {
            "enum": [
              "TELEOP_INPUT_UNSPECIFIED",
              "TELEOP_INPUT_UNKNOWN",
              "VR",
              "GELLO"
            ],
            "type": "string",
            "description": "Saved controller authority for derived vr/gello tags. A controller does\n not establish teleoperation, and absence establishes no controller.",
            "format": "enum"
          }
        },
        "description": "The session-level labels an upload travels with. A mixture source can\n follow every upload that carries one value (see Source.label)."
      },
      "qualia.v1.Dataset_Ref": {
        "type": "object",
        "properties": {
          "version": {
            "readOnly": true,
            "type": "string",
            "description": "The version tag it stands at, e.g. \"1.0\"; empty for head."
          },
          "digest": {
            "readOnly": true,
            "type": "string",
            "description": "Content digest of the episode set, \"b3:<hex>\"."
          },
          "episodeCount": {
            "readOnly": true,
            "type": "string",
            "description": "Episodes in that set."
          }
        },
        "description": "One resolved reference."
      },
      "qualia.v1.Dataset_TaskReferences": {
        "type": "object",
        "properties": {
          "task": {
            "readOnly": true,
            "type": "string",
            "description": "accounts/{account}/tasks/{task}"
          },
          "displayName": {
            "readOnly": true,
            "type": "string",
            "description": "The Task's display name."
          },
          "episodeCount": {
            "readOnly": true,
            "type": "integer",
            "description": "How many of the dataset's episodes it references.",
            "format": "int32"
          }
        },
        "description": "The Tasks this dataset's episodes are references of: a\n reference names its episode where it was recorded, or the merged dataset\n that upload went into, so a mixture has none. Deleting the\n dataset removes those references (the Tasks stay), so DeleteDataset\n refuses until it is sent with force."
      },
      "qualia.v1.Discovery_Recommendation": {
        "type": "object",
        "properties": {
          "recommended": {
            "type": "boolean",
            "description": "The names are offered, the discovered tasks disagree with them, and\n none is confirmed yet."
          },
          "warning": {
            "type": "string",
            "description": "The sentence that says how they disagree; empty when they agree."
          }
        },
        "description": "Whether confirming the upload's own task names should be a person's\n first step (task-strings-recommend-v1)."
      },
      "qualia.v1.Discovery_Task": {
        "type": "object",
        "properties": {
          "taskId": {
            "type": "string",
            "description": "The matched Task or the draft's id; empty when no draft was made."
          },
          "taskKey": {
            "type": "string",
            "description": "sha256 of the task's sorted member take ids."
          },
          "name": {
            "type": "string",
            "description": "The task's name: its Task's name when it has one (as the Task's page\n shows it), else the name discovery gave it."
          },
          "episodeCount": {
            "type": "integer",
            "description": "Takes in the task.",
            "format": "int32"
          },
          "healthFlag": {
            "type": "string",
            "description": "The task's health: ok, or the reasons it may hold more than one task,\n comma-separated (inverse, margin), or flagged without one."
          },
          "referenceEpisodeIds": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "The picked reference takes' ids, best first."
          }
        },
        "description": "One discovered task."
      },
      "qualia.v1.DismissIssuesRequest": {
        "required": [
          "parent",
          "selection"
        ],
        "type": "object",
        "properties": {
          "parent": {
            "type": "string",
            "description": "accounts/{account}/datasets/{dataset}"
          },
          "selection": {
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.IssueSelection"
              }
            ],
            "description": "Which issues; only OPEN blocking issues are dismissed."
          },
          "reason": {
            "type": "string",
            "description": "Words for the record."
          },
          "cause": {
            "enum": [
              "DISMISS_CAUSE_UNSPECIFIED",
              "MANUAL",
              "KEEP",
              "TRIM",
              "RESOLVED"
            ],
            "type": "string",
            "description": "MANUAL (default) or TRIM when the client trimmed the moment away.",
            "format": "enum"
          }
        },
        "description": "Request for Issues.DismissIssues."
      },
      "qualia.v1.DismissIssuesResponse": {
        "type": "object",
        "properties": {
          "dismissedCount": {
            "type": "integer",
            "description": "How many issues were dismissed.",
            "format": "int32"
          },
          "lockedCount": {
            "type": "integer",
            "description": "Episodes whose issues were left as they were, because another person\n holds the episode's edit lease. Their issues are not in dismissed_count.",
            "format": "int32"
          },
          "locked": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.LockedEpisode"
            },
            "description": "The first 100 of them, with their holders."
          }
        },
        "description": "Response for Issues.DismissIssues."
      },
      "qualia.v1.Episode": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "accounts/{account}/datasets/{dataset}/episodes/{episode}"
          },
          "upload": {
            "readOnly": true,
            "type": "string",
            "description": "accounts/{account}/datasets/{dataset}: the upload it was recorded in.\n The `upload` filter compares it with a dataset name, `=` and `!=`; a\n merged dataset's name matches the episodes of every upload it holds, as\n one comparison."
          },
          "index": {
            "readOnly": true,
            "type": "integer",
            "description": "Its position in the upload, from 0.",
            "format": "int32"
          },
          "position": {
            "readOnly": true,
            "type": "integer",
            "description": "Its place in the dataset it is read through, from 0: what it is numbered\n by there. In a merged dataset, across its uploads, in the order they\n were merged, each upload's episodes in their own order, so no two share\n a number; everywhere else it is `index`.\n Optional for older servers that do not yet report it; clients can\n distinguish an absent position from the valid value zero.",
            "format": "int32"
          },
          "parentEpisode": {
            "readOnly": true,
            "type": "string",
            "description": "The episode it was split from, when it is a child."
          },
          "childCount": {
            "readOnly": true,
            "type": "integer",
            "description": "Children it was split into.",
            "format": "int32"
          },
          "parentWindow": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Episode_Trim"
              }
            ],
            "description": "Where a split child sits in its parent, in seconds from the\n start of the parent's recording: what `parent_episode` traces it back\n to. It is the child's base window, the stretch the split gave it; a\n later trim of the child narrows the child, not this window.\n Unset for an episode that was not split from another."
          },
          "parentIndex": {
            "readOnly": true,
            "type": "integer",
            "description": "The `index` of the episode it was split from, when it is a split child.",
            "format": "int32"
          },
          "state": {
            "readOnly": true,
            "enum": [
              "STATE_UNSPECIFIED",
              "UNREVIEWED",
              "KEPT",
              "REJECTED"
            ],
            "type": "string",
            "description": "Where it stands in this scope.",
            "format": "enum"
          },
          "decision": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Episode_Decision"
              }
            ],
            "description": "The standing ruling in this scope; unset when nobody (and not validation) ruled."
          },
          "openIssueCount": {
            "readOnly": true,
            "type": "integer",
            "description": "Open blocking issues on it, in this scope.",
            "format": "int32"
          },
          "noteCount": {
            "readOnly": true,
            "type": "integer",
            "description": "Notes (non-blocking) on it, in this scope.",
            "format": "int32"
          },
          "openIssueCodes": {
            "readOnly": true,
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Codes of the open issues, for rail chips without a second call."
          },
          "noteCodes": {
            "readOnly": true,
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Codes of the open notes (issues that do not block a keep) that carry one: a check's findings, such as a graph check's, and ingest's\n non-blocking ones. A person's note has no code and is not listed."
          },
          "viewed": {
            "readOnly": true,
            "type": "boolean",
            "description": "Whether the caller has opened it. Per person: always false\n for an API key, which acts as itself, not as the person who made it."
          },
          "frameCount": {
            "readOnly": true,
            "type": "string",
            "description": "Frames in the recording."
          },
          "versionFrameCount": {
            "readOnly": true,
            "type": "string",
            "description": "Frames the read version holds: the trim window it froze, the rows its\n read plan and a download carry. Set when the read is of a version (the\n request's `version`, or the tag a branch reads); at head, frame_count\n and trim describe the episode."
          },
          "fps": {
            "readOnly": true,
            "type": "number",
            "description": "Frames per second of the data rows.",
            "format": "double"
          },
          "recordTime": {
            "readOnly": true,
            "type": "string",
            "description": "When it was recorded.",
            "format": "date-time"
          },
          "cameras": {
            "readOnly": true,
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Camera keys it carries."
          },
          "posters": {
            "readOnly": true,
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.Episode_Poster"
            },
            "description": "First and last frame per camera."
          },
          "task": {
            "type": "string",
            "description": "Task label (editable)."
          },
          "instruction": {
            "type": "string",
            "description": "Language instruction (editable)."
          },
          "operator": {
            "readOnly": true,
            "type": "string",
            "description": "Operator label."
          },
          "rig": {
            "readOnly": true,
            "type": "string",
            "description": "Recording rig key, as the recording carries it (see Rig.key)."
          },
          "sourceRobot": {
            "readOnly": true,
            "type": "string",
            "description": "accounts/{account}/robots/{robot}: the fleet robot it was recorded on."
          },
          "method": {
            "type": "string",
            "description": "Legacy single-method projection retained for older clients."
          },
          "methods": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Canonical collection-method tags (teleop, vr, umi, egocentric,\n policy-rollout, sim). Multiple tags may describe one episode."
          },
          "scene": {
            "type": "string",
            "description": "Scene label (editable)."
          },
          "session": {
            "readOnly": true,
            "type": "string",
            "description": "Recorder session id."
          },
          "tags": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Free tags (editable)."
          },
          "outcome": {
            "enum": [
              "OUTCOME_UNSPECIFIED",
              "SUCCESS",
              "PARTIAL",
              "FAILURE"
            ],
            "type": "string",
            "description": "How the attempt went (editable; the operator's own mark by default).",
            "format": "enum"
          },
          "outcomeActor": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Actor"
              }
            ],
            "description": "Who set the outcome."
          },
          "markers": {
            "readOnly": true,
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.Episode_Marker"
            },
            "description": "Recorder markers."
          },
          "trim": {
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Episode_Trim"
              }
            ],
            "description": "The trim window; unset means untrimmed (editable)."
          },
          "subtasks": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.Episode_Subtask"
            },
            "description": "Subtask spans (editable)."
          },
          "metrics": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Episode_Metrics"
              }
            ],
            "description": "Health metrics and judgements."
          },
          "originalMetrics": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Episode_Metrics"
              }
            ],
            "description": "The take as recorded, before curation: its measurements\n (speed, jerk, smoothness, pauses, gripper events, corrections, alignment)\n over its whole recording, measured once; a split's piece has its take's.\n duration_seconds is the recording's length. Unset until measured; filter\n as `original.<field>`."
          },
          "curatedMetrics": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Episode_Metrics"
              }
            ],
            "description": "The episode as curated: the same measurements over the window it trains\n on (after its trim; a piece's own window), measured when the trim or\n split is applied, or else within minutes of the publish that made it.\n duration_seconds is after the trim. Unset until measured, and for a\n revision no upload holds now; filter as `curated.<field>`."
          },
          "revision": {
            "readOnly": true,
            "type": "integer",
            "description": "Content revision of the episode edit chain (trim, subtasks, tags, ...).",
            "format": "int32"
          },
          "etag": {
            "type": "string",
            "description": "Sent back on UpdateEpisodes; equals the revision."
          },
          "createTime": {
            "readOnly": true,
            "type": "string",
            "description": "When it was ingested.",
            "format": "date-time"
          },
          "updateTime": {
            "readOnly": true,
            "type": "string",
            "description": "When its content or standing last changed.",
            "format": "date-time"
          },
          "upstreamState": {
            "readOnly": true,
            "enum": [
              "STATE_UNSPECIFIED",
              "UNREVIEWED",
              "KEPT",
              "REJECTED"
            ],
            "type": "string",
            "description": "Read through a mixture: where it stands upstream (the least settled of\n its upload and any mixture in between). Unset in its upload's scope.",
            "format": "enum"
          },
          "analysis": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Episode_Analysis"
              }
            ],
            "description": "How the take moves; set only in the EPISODE_VIEW_ANALYSIS view."
          },
          "originalAnalysis": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Episode_Analysis"
              }
            ],
            "description": "How the take moves as recorded, before curation: the same numbers over\n its whole recording, measured once, with no channels; a split's piece\n has its take's. Where `analysis` follows a trim or a split, this stays,\n so the outliers tab sets the episodes as curated against the takes as\n recorded. Set only in the EPISODE_VIEW_ANALYSIS view, once measured."
          },
          "extentSeconds": {
            "readOnly": true,
            "type": "number",
            "description": "Length of the recording that edits are checked against, in seconds: a\n subtask or trim may not end after it. It is the stored millisecond\n length, so it can be shorter than frame_count / fps. Unset on the\n response an edit replays.",
            "format": "double"
          },
          "linkedTask": {
            "type": "string",
            "description": "accounts/{account}/tasks/{task}: the Task the take is recorded against, or empty when unlinked. A link, not content: `task` stays the\n label and language instruction training reads, and linking changes no\n revision, digest or version. Names a task of the episode's account\n (NOT_FOUND otherwise). Deleting the task unlinks it. Set with AssignTask,\n or UpdateEpisodes with the path on its own in one edit. A take with no link of its own\n reads the Dataset.linked_task of the dataset that holds it (linked_task_inherited): its upload's, or once a merge took the upload,\n the merged dataset's own, wherever the take is read from. Its\n own link overrides that, and clearing it (UpdateEpisodes with \"\") makes\n the take read the dataset's again. Filters, facets and the VLM check\n read this value."
          },
          "linkedTaskInherited": {
            "readOnly": true,
            "type": "boolean",
            "description": "Whether linked_task is the dataset's that holds the take (its upload's,\n or its merged dataset's): the take has no link of\n its own. False when nothing links it, or when it links a task itself."
          },
          "linkedTaskRevision": {
            "readOnly": true,
            "type": "integer",
            "description": "The revision of linked_task the link carries, the one checks\n judge the take against: the dataset's when inherited. 0 when unlinked, or\n when the Task had no published revision when it was linked (its draft is\n judged). Moved only by RelinkTask on the dataset.",
            "format": "int32"
          },
          "lease": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Episode_Lease"
              }
            ],
            "description": "Who is editing the take now; unset when nobody holds a live lease.\n ListEpisodes and GetEpisode fill it."
          },
          "draft": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Episode_DraftSummary"
              }
            ],
            "description": "The take's draft (EpisodeDraft), its edit not yet in a version; unset\n when it has none. One per take, so it reads the same from every scope.\n ListEpisodes and GetEpisode fill it."
          },
          "cut": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Episode_Cut"
              }
            ],
            "description": "Set on an episode a version published from a draft that cut a take:\n the take and where in it the episode lies. Unset on a take."
          }
        },
        "description": "One take. An episode is recorded in exactly one upload, and can be read\n through any dataset that contains it: the parent in its name is the scope\n it is seen from. `accounts/a/datasets/{upload}/episodes/{e}` is the take as\n its upload stands on it; `accounts/a/datasets/{mixture}/episodes/{e}` is the\n same take as that mixture stands on it. The {episode} id is the same uuid\n in both. Rulings (Keep, Reject, ...) made through a mixture's name belong to\n that mixture. Upstream wins: seen from a mixture, an episode its\n upload (or a mixture in between) does not keep stands as it stands there,\n read-only; only an upstream KEPT episode is the mixture's to rule on.\n\n A merged dataset (Datasets.MergeDatasets) holds its uploads' episodes where\n they were recorded: `accounts/a/datasets/{merged}/episodes/{e}` is the take\n as its upload stands on it, the same state, decision, issues, notes, tags\n and trim, and `upload` still names the upload it came from. A merge is\n final: the take is the merged dataset's, and everything written\n to it (a ruling, an issue, UpdateEpisodes, AssignTask, splits, suggestions)\n is sent through the merged name and lands in the upload that holds it. The\n upload's own name for it still reads; a write by that name is\n FAILED_PRECONDITION naming the merged dataset. The account-wide list\n (`datasets/-`) names such a take under its merged dataset.\n\n Served by qds-api."
      },
      "qualia.v1.EpisodeDraft": {
        "required": [
          "drawing"
        ],
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "accounts/{account}/datasets/{dataset}/episodes/{episode}/draft"
          },
          "drawing": {
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.EpisodeDraft_Drawing"
              }
            ],
            "description": "What a version published from it holds."
          },
          "baseRevision": {
            "type": "integer",
            "description": "The Episode.revision the drawing began on.",
            "format": "int32"
          },
          "base": {
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.EpisodeDraft_Drawing"
              }
            ],
            "description": "The editor as read when drawing began (the take's trim and subtasks then),\n so a return can tell what moved under the drawing."
          },
          "baseSplit": {
            "type": "string",
            "description": "Reserved for re-splits: the split take's pieces the drawing began on."
          },
          "state": {
            "readOnly": true,
            "enum": [
              "STATE_UNSPECIFIED",
              "OPEN"
            ],
            "type": "string",
            "description": "Always OPEN.",
            "format": "enum"
          },
          "createActor": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Actor"
              }
            ],
            "description": "Who drew it first: a person, or an API key acting for none."
          },
          "updateActor": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Actor"
              }
            ],
            "description": "Who last changed the drawing: a person, or an API key acting for none."
          },
          "createTime": {
            "readOnly": true,
            "type": "string",
            "description": "When it was first saved.",
            "format": "date-time"
          },
          "updateTime": {
            "readOnly": true,
            "type": "string",
            "description": "When it was last saved.",
            "format": "date-time"
          },
          "etag": {
            "type": "string",
            "description": "Changes with every save of the draft. Sent back on UpdateEpisodeDraft\n and DeleteEpisodeDraft, and as UpdateEpisodesRequest.Edit's\n `expected_draft_etag`."
          }
        },
        "description": "An edit of a take drawn and not yet in a version: one per take, read the same\n through every dataset that reads the take. It is never applied to the\n dataset: head keeps the take as recorded, and only a version made from a\n Publish preview holds the edit. Written by whoever holds the take's edit\n lease (Episode.lease), or, while no other person holds one, by any caller\n with write access, a person or an API key. It stays when its author's\n lease ends, for whoever edits the take next, and through a re-ingest of\n the take.\n\n Served by qds-api."
      },
      "qualia.v1.EpisodeDraft_Drawing": {
        "type": "object",
        "properties": {
          "pieces": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.EpisodeDraft_Piece"
            },
            "description": "The take as pieces, in time order and not overlapping, within the\n recording; at most 512 kept. Stored end to end over the recording:\n what lies between the pieces sent is stored as dropped pieces."
          },
          "subtasks": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.Episode_Subtask"
            },
            "description": "Subtask spans, bounded as UpdateEpisodes bounds Episode.subtasks."
          }
        },
        "description": "The editor at one moment."
      },
      "qualia.v1.EpisodeDraft_Piece": {
        "type": "object",
        "properties": {
          "startSeconds": {
            "type": "number",
            "description": "Start, in seconds from the start of the recording.",
            "format": "double"
          },
          "endSeconds": {
            "type": "number",
            "description": "End, in seconds.",
            "format": "double"
          },
          "keep": {
            "type": "boolean",
            "description": "Whether the stretch is kept: one kept piece is a trim, two or more a\n split."
          },
          "tags": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Tags the episode this piece becomes carries (a marker split's labels),\n beside the take's own. Kept only on a kept piece; at most 64, each\n non-empty, without surrounding whitespace, at most 1024 bytes."
          }
        },
        "description": "A stretch of the take as drawn."
      },
      "qualia.v1.EpisodeNames": {
        "type": "object",
        "properties": {
          "names": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "accounts/{account}/datasets/{dataset}/episodes/{episode}, at most 10000."
          }
        },
        "description": "A list of episode names."
      },
      "qualia.v1.EpisodeRevision": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "accounts/{account}/datasets/{dataset}/episodes/{episode}/revisions/{revision}"
          },
          "revision": {
            "readOnly": true,
            "type": "integer",
            "description": "1, 2, 3, ... in edit order; Episode.revision is the newest. 0 is the\n recording.",
            "format": "int32"
          },
          "note": {
            "readOnly": true,
            "type": "string",
            "description": "What the edit was for, in the editor's words; may be empty."
          },
          "author": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Actor"
              }
            ],
            "description": "Who edited; the system for the recording."
          },
          "createTime": {
            "readOnly": true,
            "type": "string",
            "description": "When; for the recording, when it was ingested.",
            "format": "date-time"
          },
          "task": {
            "readOnly": true,
            "type": "string",
            "description": "Task label after the edit."
          },
          "instruction": {
            "readOnly": true,
            "type": "string",
            "description": "Language instruction after the edit."
          },
          "method": {
            "readOnly": true,
            "type": "string",
            "description": "Legacy single-method projection after the edit."
          },
          "methods": {
            "readOnly": true,
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Collection-method tags after the edit."
          },
          "scene": {
            "readOnly": true,
            "type": "string",
            "description": "Scene label after the edit."
          },
          "tags": {
            "readOnly": true,
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Free tags after the edit."
          },
          "outcome": {
            "readOnly": true,
            "enum": [
              "OUTCOME_UNSPECIFIED",
              "SUCCESS",
              "PARTIAL",
              "FAILURE"
            ],
            "type": "string",
            "description": "Outcome after the edit.",
            "format": "enum"
          },
          "trim": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Episode_Trim"
              }
            ],
            "description": "Trim window after the edit; unset means untrimmed. An open end is 0\n (start) or the recording's end (end) as Episode.trim reads it."
          },
          "subtasks": {
            "readOnly": true,
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.Episode_Subtask"
            },
            "description": "Subtask spans after the edit."
          }
        },
        "description": "One edit of a take's content, kept for good: what the history\n in the episode studio lists. A revision holds the whole state after the\n edit, not the change: a field the edit did not set holds the recording's\n value, as Episode reads it. What changed is its difference from the\n revision before it. Revision 0 is the recording itself, before any edit,\n so the first edit's changes read against it. Rulings (keep, reject) are\n not revisions.\n\n Served by qds-api."
      },
      "qualia.v1.EpisodeSelection": {
        "type": "object",
        "properties": {
          "names": {
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.EpisodeNames"
              }
            ],
            "description": "Episode names under the request's parent."
          },
          "filter": {
            "type": "string",
            "description": "A ListEpisodes filter over the parent (e.g. what the filter bar leaves)."
          }
        },
        "description": "Which episodes a bulk ruling acts on: an explicit list, or a filter. Names\n must be under the request's parent (INVALID_ARGUMENT otherwise); a filter\n only ever matches the parent's own episodes (a mixture: its pool)."
      },
      "qualia.v1.Episode_Analysis": {
        "type": "object",
        "properties": {
          "version": {
            "readOnly": true,
            "type": "string",
            "description": "The definition the numbers follow; a reader treats another one as\n not measured yet."
          },
          "unmeasuredReason": {
            "readOnly": true,
            "type": "string",
            "description": "Why the take could not be measured: \"no_joints\" (no state) or\n \"channel_never_read\". Empty when measured."
          },
          "fps": {
            "readOnly": true,
            "type": "number",
            "description": "Rows per second it was measured at.",
            "format": "double"
          },
          "frames": {
            "readOnly": true,
            "type": "integer",
            "description": "Rows read.",
            "format": "int32"
          },
          "speedVariance": {
            "readOnly": true,
            "type": "number",
            "description": "Variance of the joint speed over every state channel, (units/s)^2.",
            "format": "double"
          },
          "speedMean": {
            "readOnly": true,
            "type": "number",
            "description": "Mean joint speed over every state channel, units/s.",
            "format": "double"
          },
          "jerkMean": {
            "readOnly": true,
            "type": "number",
            "description": "Mean norm of the state's third difference, units/s^3.",
            "format": "double"
          },
          "highFrequencyRatio": {
            "readOnly": true,
            "type": "number",
            "description": "Share of the speed spectrum's power above 3 Hz.",
            "format": "double"
          },
          "idleRatio": {
            "readOnly": true,
            "type": "number",
            "description": "Share of frames under 5% of the top speed.",
            "format": "double"
          },
          "tremble": {
            "readOnly": true,
            "type": "number",
            "description": "Mean |v_smooth - v| / (|v_smooth| + |v|) over the arm joints.",
            "format": "double"
          },
          "gripperEventCount": {
            "readOnly": true,
            "type": "integer",
            "description": "Commanded gripper moves of at least 30% of their travel.",
            "format": "int32"
          },
          "gripperFlickerCount": {
            "readOnly": true,
            "type": "integer",
            "description": "The most events of one gripper inside 0.5 s.",
            "format": "int32"
          },
          "correctionCount": {
            "readOnly": true,
            "type": "integer",
            "description": "Regrasps within 3 s, plus events the arm retraces its approach round.",
            "format": "int32"
          },
          "stateChannels": {
            "readOnly": true,
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "State channel names, in the order of the poses."
          },
          "startPose": {
            "readOnly": true,
            "type": "array",
            "items": {
              "type": "number",
              "format": "double"
            },
            "description": "First state row, every channel."
          },
          "endPose": {
            "readOnly": true,
            "type": "array",
            "items": {
              "type": "number",
              "format": "double"
            },
            "description": "Last state row, every channel."
          },
          "channels": {
            "readOnly": true,
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.Analysis_Channel"
            },
            "description": "Every commanded channel, in recording order."
          }
        },
        "description": "How the take moves, as the dataset page's outliers and training tabs\n read it: measured once from its series, within a few\n minutes of a publish, and again only when its data changes (a re-ingest,\n or a trim or a split, measured as it is applied); a ruling or a tag\n measures nothing. The set's fences, embedding and chart averages are\n laid out over these by the reader.\n Read in the EPISODE_VIEW_ANALYSIS view of ListEpisodes (each channel's\n progress only) and of GetEpisode (with the curves); unset when the take\n is not measured yet, or its profile measured another revision of it\n than the one the listed scope reads (before a trim, a re-ingest or a\n split; or through a mixture pinned to an earlier revision, which is\n not measured: only uploads' current members are). The definitions are dataset-ux-proto's\n (scripts/extract.py, src/lib/mock): they differ on purpose from the\n like-named Metrics, which are command-space and feed curation."
      },
      "qualia.v1.Episode_CameraLag": {
        "type": "object",
        "properties": {
          "camera": {
            "readOnly": true,
            "type": "string",
            "description": "Camera key."
          },
          "lagMs": {
            "readOnly": true,
            "type": "number",
            "description": "Milliseconds; positive when the video runs behind the robot's\n motion, negative when it runs ahead.",
            "format": "double"
          },
          "confidence": {
            "readOnly": true,
            "type": "number",
            "description": "For an estimate, the correlation peak (-1 to 1); 1 when recorded.",
            "format": "double"
          },
          "method": {
            "readOnly": true,
            "type": "string",
            "description": "How it was measured, e.g. \"motion_xcorr/1\" or \"sync_event\"."
          },
          "source": {
            "readOnly": true,
            "enum": [
              "SOURCE_UNSPECIFIED",
              "ESTIMATED",
              "RECORDED"
            ],
            "type": "string",
            "description": "Estimated or recorded.",
            "format": "enum"
          },
          "trusted": {
            "readOnly": true,
            "type": "boolean",
            "description": "An estimate whose peak is strong and whose two halves of the episode\n agree; always true when recorded. Only trusted offsets are judged."
          }
        },
        "description": "One camera's time offset against the robot's motion: what the camera lag panel shows per camera."
      },
      "qualia.v1.Episode_Cut": {
        "type": "object",
        "properties": {
          "take": {
            "readOnly": true,
            "type": "string",
            "description": "accounts/{account}/datasets/{dataset}/episodes/{episode}: the take it\n was cut from."
          },
          "takeIndex": {
            "readOnly": true,
            "type": "integer",
            "description": "The take's index in its upload (Episode.index of the take).",
            "format": "int32"
          },
          "piece": {
            "readOnly": true,
            "type": "integer",
            "description": "Its place among the take's pieces, from 1.",
            "format": "int32"
          },
          "pieceCount": {
            "readOnly": true,
            "type": "integer",
            "description": "How many pieces the take was cut into.",
            "format": "int32"
          },
          "startSeconds": {
            "readOnly": true,
            "type": "number",
            "description": "Where it starts, in seconds of the take's recording.",
            "format": "double"
          },
          "endSeconds": {
            "readOnly": true,
            "type": "number",
            "description": "Where it ends, in seconds of the take's recording.",
            "format": "double"
          }
        },
        "description": "Where a cut piece came from: an episode a version published from a draft\n that split or trimmed a take. It is the take's piece `piece` of\n `piece_count`, kept from `start_seconds` to `end_seconds` of the take's\n recording, and reads as the dashboard numbers it (\"12.1\": the take's\n index, then the piece's, from 1)."
      },
      "qualia.v1.Episode_Decision": {
        "type": "object",
        "properties": {
          "verdict": {
            "readOnly": true,
            "enum": [
              "VERDICT_UNSPECIFIED",
              "KEEP",
              "REJECT"
            ],
            "type": "string",
            "description": "Keep or reject.",
            "format": "enum"
          },
          "actor": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Actor"
              }
            ],
            "description": "Who ruled: a person, or VALIDATION for an ingest reject."
          },
          "decideTime": {
            "readOnly": true,
            "type": "string",
            "description": "When.",
            "format": "date-time"
          },
          "reason": {
            "readOnly": true,
            "type": "string",
            "description": "Why, in the person's words; for validation, the invalid reasons."
          },
          "dataset": {
            "readOnly": true,
            "type": "string",
            "description": "accounts/{account}/datasets/{dataset}: the dataset the ruling was made\n in. Equals the upload for an upload ruling; a mixture for its own rejects."
          },
          "locked": {
            "readOnly": true,
            "type": "boolean",
            "description": "True when seen from a mixture and the deciding ruling was made\n upstream: only that dataset can take it back."
          }
        },
        "description": "The standing ruling in this scope, when there is one."
      },
      "qualia.v1.Episode_DraftSummary": {
        "type": "object",
        "properties": {
          "updateActor": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Actor"
              }
            ],
            "description": "Who last changed the drawing: a person, or an API key acting for none."
          },
          "updateTime": {
            "readOnly": true,
            "type": "string",
            "description": "When the drawing was last saved.",
            "format": "date-time"
          },
          "state": {
            "readOnly": true,
            "enum": [
              "STATE_UNSPECIFIED",
              "OPEN"
            ],
            "type": "string",
            "description": "Always OPEN: a draft is never applied.",
            "format": "enum"
          },
          "baseRevision": {
            "readOnly": true,
            "type": "integer",
            "description": "The revision it was drawn on (Episode.revision then).",
            "format": "int32"
          },
          "pieceCount": {
            "readOnly": true,
            "type": "integer",
            "description": "The pieces the drawing keeps: 1 for a trim, 2 or more for a split\n (each becomes an episode of the version published from it), 0 when\n it keeps nothing.",
            "format": "int32"
          },
          "keptSeconds": {
            "readOnly": true,
            "type": "number",
            "description": "The seconds its kept pieces last, together.",
            "format": "double"
          }
        },
        "description": "The take's draft, its edit not yet in a version, as its row shows it:\n who last drew it, when, and what it keeps. GetEpisodeDraft reads the\n drawing."
      },
      "qualia.v1.Episode_Lease": {
        "type": "object",
        "properties": {
          "holder": {
            "readOnly": true,
            "type": "string",
            "description": "The holder's user id (as Actor.user)."
          },
          "holderName": {
            "readOnly": true,
            "type": "string",
            "description": "The holder's display name at the time they took it; empty when they\n have none."
          },
          "expireTime": {
            "readOnly": true,
            "type": "string",
            "description": "When it lapses unless renewed.",
            "format": "date-time"
          }
        },
        "description": "Someone editing the take now: the lease AcquireEpisodeLease\n takes. One per take, so it reads the same from every scope."
      },
      "qualia.v1.Episode_Marker": {
        "type": "object",
        "properties": {
          "timeSeconds": {
            "readOnly": true,
            "type": "number",
            "description": "Seconds from the start of the recording.",
            "format": "double"
          },
          "label": {
            "readOnly": true,
            "type": "string",
            "description": "Its label."
          },
          "role": {
            "readOnly": true,
            "type": "string",
            "description": "Its role (start, end, success, event)."
          }
        },
        "description": "A recorder marker, e.g. the operator's success button."
      },
      "qualia.v1.Episode_Metrics": {
        "type": "object",
        "properties": {
          "durationSeconds": {
            "type": "number",
            "description": "Length, seconds (after trim).",
            "format": "double"
          },
          "speedVariance": {
            "type": "number",
            "description": "Standard deviation of per-frame speed.",
            "format": "double"
          },
          "speedMean": {
            "type": "number",
            "description": "Mean joint speed.",
            "format": "double"
          },
          "sparc": {
            "type": "number",
            "description": "Spectral arc length (smoothness; closer to 0 is smoother).",
            "format": "double"
          },
          "ldlj": {
            "type": "number",
            "description": "Log dimensionless jerk.",
            "format": "double"
          },
          "psdHfRatio": {
            "type": "number",
            "description": "Share of power above the high-frequency cut.",
            "format": "double"
          },
          "idleRatio": {
            "type": "number",
            "description": "Share of time the arm is idle.",
            "format": "double"
          },
          "startPoseZ": {
            "type": "number",
            "description": "Start pose distance from its robot's median start, in MADs.",
            "format": "double"
          },
          "endPoseZ": {
            "type": "number",
            "description": "End pose distance from its robot's median end, in MADs.",
            "format": "double"
          },
          "alignmentLagMs": {
            "type": "number",
            "description": "Lag between action and state, milliseconds.",
            "format": "double"
          },
          "correctionCount": {
            "type": "integer",
            "description": "Corrections near gripper events.",
            "format": "int32"
          },
          "gripperEventCount": {
            "type": "integer",
            "description": "Gripper open or close events.",
            "format": "int32"
          },
          "cameraLagMs": {
            "type": "number",
            "description": "Camera motion against joint speed offset, milliseconds (camera lag):\n the camera_lags entry the panel opens on (a recorded one, else the\n trusted estimate with the strongest peak).",
            "format": "double"
          },
          "jerkMean": {
            "type": "number",
            "description": "Mean jerk of the joints (the curation fence's jerk_mean).",
            "format": "double"
          },
          "gripperFlickerCount": {
            "type": "integer",
            "description": "Gripper open-close flickers.",
            "format": "int32"
          },
          "jerky": {
            "type": "boolean",
            "description": "psd_hf_ratio or tremor above p90 of its robot's population."
          },
          "hasCorrections": {
            "type": "boolean",
            "description": "At least one correction."
          },
          "qualityTier": {
            "readOnly": true,
            "enum": [
              "QUALITY_TIER_UNSPECIFIED",
              "A",
              "B",
              "REJECT"
            ],
            "type": "string",
            "description": "Composite grade.",
            "format": "enum"
          },
          "cameraLags": {
            "readOnly": true,
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.Episode_CameraLag"
            },
            "description": "Every camera's offset, by camera key; empty until measured."
          }
        },
        "description": "Per-episode health metrics and judgements. Unset\n fields are not computed yet. Each is a filter field and a facet."
      },
      "qualia.v1.Episode_Poster": {
        "type": "object",
        "properties": {
          "camera": {
            "readOnly": true,
            "type": "string",
            "description": "Camera key."
          },
          "firstFrameUri": {
            "readOnly": true,
            "type": "string",
            "description": "Signed URI of the midpoint frame of the window ingest recorded. An edit\n and a split piece keep their take's posters, so after a trim or a split\n this frame may lie outside the episode's own frames. The field name is\n retained for compatibility; ingest publishes a midpoint, not a first frame."
          },
          "lastFrameUri": {
            "readOnly": true,
            "type": "string",
            "description": "Signed URI of the last frame of the window ingest recorded; like the\n midpoint, it is the take's after a trim or a split."
          }
        },
        "description": "Midpoint and last-frame posters of one camera."
      },
      "qualia.v1.Episode_Subtask": {
        "type": "object",
        "properties": {
          "startSeconds": {
            "type": "number",
            "description": "Start, in seconds from the start of the recording.",
            "format": "double"
          },
          "endSeconds": {
            "type": "number",
            "description": "End, in seconds.",
            "format": "double"
          },
          "label": {
            "type": "string",
            "description": "The subtask's one name (also one of the episode's tags)."
          },
          "review": {
            "enum": [
              "REVIEW_UNSPECIFIED",
              "PROPOSED",
              "ACCEPTED",
              "REJECTED"
            ],
            "type": "string",
            "description": "Proposed, accepted or rejected.",
            "format": "enum"
          },
          "origin": {
            "enum": [
              "ORIGIN_UNSPECIFIED",
              "HUMAN",
              "MODEL",
              "HEURISTIC"
            ],
            "type": "string",
            "description": "Who proposed it.",
            "format": "enum"
          }
        },
        "description": "One subtask span."
      },
      "qualia.v1.Episode_Trim": {
        "type": "object",
        "properties": {
          "startSeconds": {
            "type": "number",
            "description": "First second kept.",
            "format": "double"
          },
          "endSeconds": {
            "type": "number",
            "description": "Last second kept.",
            "format": "double"
          }
        },
        "description": "The trim window, in seconds from the start of the recording."
      },
      "qualia.v1.Event": {
        "type": "object",
        "properties": {
          "id": {
            "readOnly": true,
            "type": "string",
            "description": "The event's id (a UUID). The relay copies a row under this id, so a\n replayed copy is a no-op."
          },
          "sequence": {
            "readOnly": true,
            "type": "string",
            "description": "Its place in the record: one global sequence, strictly increasing, in\n the order rows were copied. A service's own table numbers its rows\n separately (`source_sequence`)."
          },
          "createTime": {
            "readOnly": true,
            "type": "string",
            "description": "When the change was committed.",
            "format": "date-time"
          },
          "organization": {
            "readOnly": true,
            "type": "string",
            "description": "The organization (account) id it happened in."
          },
          "workspace": {
            "readOnly": true,
            "type": "string",
            "description": "The workspace id it happened in; empty when `origin` is ORGANIZATION."
          },
          "service": {
            "readOnly": true,
            "type": "string",
            "description": "The service that committed it: \"qds\", \"platform\", \"fleet\", \"training\",\n \"pipeline\", \"tasks\" or \"events\". The prefix of `action`."
          },
          "actor": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Actor"
              }
            ],
            "description": "Who did it. `api_key` is set when a person acted through a key; actor\n kind SYSTEM, RULE or MODEL for changes nobody made by hand."
          },
          "action": {
            "readOnly": true,
            "type": "string",
            "description": "What happened: `<service>.<TYPE>`, e.g. \"qds.EPISODES_RULED\". TYPE is a\n value name of the service's `Event.Type`."
          },
          "subject": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Subject"
              }
            ],
            "description": "What it happened to, e.g. a dataset."
          },
          "parent": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Subject"
              }
            ],
            "description": "What the subject lives in, when that matters for filtering (a dataset's\n episode, a run's op); unset otherwise."
          },
          "related": {
            "readOnly": true,
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.Subject"
            },
            "description": "Other things the one change touched, e.g. the episodes a ruling covered,\n or the second entity of a two-entity action."
          },
          "summary": {
            "readOnly": true,
            "type": "string",
            "description": "One plain line, e.g. \"rejected 12 episodes\"."
          },
          "payload": {
            "readOnly": true,
            "type": "object",
            "description": "The service's payload message for `action`, as protojson. Never holds a\n secret value.\n\n A Struct, not a Value: protojson renders a message as a JSON object, so\n a scalar or list here would be a writer bug the type now refuses. Not an\n Any: an Any needs the service's descriptors to read, and readers here\n never have them."
          },
          "payloadType": {
            "readOnly": true,
            "type": "string",
            "description": "The payload's full message name, e.g.\n \"qds.workflow.v1.Event.EpisodesRuled\"; empty when there is no payload."
          },
          "requestId": {
            "readOnly": true,
            "type": "string",
            "description": "The request that made the change, for joining with its logs and trace."
          },
          "undoable": {
            "readOnly": true,
            "type": "boolean",
            "description": "Whether the owning service can undo it."
          },
          "undoes": {
            "readOnly": true,
            "type": "string",
            "description": "The id of the event this one undid; empty unless it is an undo."
          },
          "operation": {
            "readOnly": true,
            "type": "string",
            "description": "The running work it belongs to, when it does (Status.operation). Every\n OPERATION_* event sets it."
          },
          "sourceSequence": {
            "readOnly": true,
            "type": "string",
            "description": "The source row's `sequence` in its service's events table (`service`\n names the table). Status orders an operation's transitions by it, never\n by `sequence`, which is only the order rows reached the record."
          },
          "name": {
            "type": "string",
            "description": "accounts/{account}/workspaces/{workspace}/events/{event} for an event of\n a workspace; accounts/{account}/events/{event} for one of the\n organization itself. `{event}` is `id`. Every event of an organization\n can also be read by its organization path."
          },
          "origin": {
            "readOnly": true,
            "enum": [
              "ORIGIN_UNSPECIFIED",
              "WORKSPACE",
              "ORGANIZATION"
            ],
            "type": "string",
            "description": "Whether a workspace or the organization itself made the change.",
            "format": "enum"
          },
          "activityLink": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.ActivityLink"
              }
            ],
            "description": "Explicit request correlation. Absent on historical uncorrelated records."
          }
        },
        "description": "One thing that happened: a row of the audit trail.\n\n Every service writes its own events table (`qds.events`, `platform.events`,\n `fleet.events`, `training.events`, `pipeline.events`, `tasks.events`) in\n the transaction that makes the change, with these fields as columns.\n events-api copies the rows into one record and serves them; status (see\n Status) is read from the same rows. events-api writes `events.events` for\n what its retention job did (`events.v1.Event`).\n\n Each service types its actions in its own proto (`qds.workflow.v1.Event`,\n `platform.v1.Event`, `fleet.v1.Event`, `training.v1.Event`,\n `pipeline.v1.Event`, `tasks.v1.Event`, `events.v1.Event`): `action` is the\n service name and the type's value name, and `payload` is the matching\n payload message as protojson, rendered by the writer. Nothing downstream decodes a service\n proto.\n\n Served by events-api (Events), read from the record."
      },
      "qualia.v1.EventSession": {
        "type": "object",
        "properties": {
          "latest": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Event"
              }
            ],
            "description": "Its newest event, the one to show."
          },
          "eventCount": {
            "readOnly": true,
            "type": "integer",
            "description": "How many events it holds, `latest` included.",
            "format": "int32"
          },
          "startTime": {
            "readOnly": true,
            "type": "string",
            "description": "The earliest create_time among its events. Record order does not\n follow create_time, so this need not be the oldest event's.",
            "format": "date-time"
          },
          "endTime": {
            "readOnly": true,
            "type": "string",
            "description": "The latest create_time among its events.",
            "format": "date-time"
          },
          "events": {
            "readOnly": true,
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "The names of its events, newest first: the first 100. For all of them,\n list with `subject.name`, the actor and `sequence` between\n `first_sequence` and `latest.sequence`."
          },
          "firstSequence": {
            "readOnly": true,
            "type": "string",
            "description": "The record sequence of its oldest event."
          }
        },
        "description": "Repeated work by one actor on one thing, shown as one line.\n\n Walking a list newest first, an event joins the session before it when it\n has the same actor (kind, user, API key and agent) and the same subject\n (type and name), and was created within 30 minutes of the event that\n joined it last. Anything else in between, as the filter left the list,\n ends the session. A session holds at most 1000 events; the next one starts\n a new session. Sessions never span pages."
      },
      "qualia.v1.Facet_Bucket": {
        "type": "object",
        "properties": {
          "value": {
            "type": "string",
            "description": "The value, as the filter spells it."
          },
          "count": {
            "type": "string",
            "description": "Episodes carrying it."
          }
        },
        "description": "One value and how many episodes carry it."
      },
      "qualia.v1.Finding_Moment": {
        "type": "object",
        "properties": {
          "timeSeconds": {
            "readOnly": true,
            "type": "number",
            "description": "Seconds from the start of the recording, as Issue.time_seconds (the\n trim the model read is added in), so a player seeks to it as is.",
            "format": "double"
          },
          "label": {
            "readOnly": true,
            "type": "string",
            "description": "What happens there, in a few words; may be empty."
          }
        },
        "description": "A moment the model pointed at."
      },
      "qualia.v1.Follow": {
        "type": "object",
        "properties": {
          "channel": {
            "enum": [
              "CHANNEL_UNSPECIFIED",
              "STABLE",
              "HEAD"
            ],
            "type": "string",
            "description": "Move with a channel.",
            "format": "enum"
          },
          "pin": {
            "type": "string",
            "description": "Stay on this version tag of the source dataset, e.g. \"1.0\"."
          }
        },
        "description": "How a mixture source is read: on a channel that moves by itself, or pinned\n to one version tag that never moves."
      },
      "qualia.v1.GripperTcp_Hand": {
        "type": "object",
        "properties": {
          "side": {
            "readOnly": true,
            "enum": [
              "SIDE_UNSPECIFIED",
              "SIDE_LEFT",
              "SIDE_RIGHT"
            ],
            "type": "string",
            "description": "Which hand.",
            "format": "enum"
          },
          "link": {
            "readOnly": true,
            "type": "string",
            "description": "The link of the gripper's URDF that `tcp` is expressed in, with the\n side resolved (\"openarm_left_ee_base_link\"). Empty when the hand has\n only a tracker_to_tcp."
          },
          "tcp": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Matrix4"
              }
            ],
            "description": "The TCP's pose in `link`'s frame. Empty when the hand has none."
          },
          "trackerToTcp": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Transform"
              }
            ],
            "description": "The TCP's pose in the tracker's frame: what uploads are resolved with.\n Unset when the hand has none, so it serves robots only."
          }
        },
        "description": "One hand's TCP."
      },
      "qualia.v1.ImportCalibrationRequest": {
        "required": [
          "name",
          "filename",
          "content"
        ],
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "accounts/{account}/rigs/{rig}"
          },
          "filename": {
            "type": "string",
            "description": "The file's name, recorded with the calibration: 1 to 256 characters, not\n only spaces, no control characters. E.g. \"tcp_calibration.json\"."
          },
          "content": {
            "type": "string",
            "description": "The file's text: a JSON object of at most 64 KiB."
          },
          "etag": {
            "type": "string",
            "description": "The rig's etag as read. When set and the rig has changed since,\n ABORTED."
          }
        },
        "description": "Request for Rigs.ImportCalibration."
      },
      "qualia.v1.ImportGripperCalibrationRequest": {
        "required": [
          "name",
          "filename",
          "content"
        ],
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "accounts/{account}/robots/{robot}, of kind GRIPPER."
          },
          "filename": {
            "type": "string",
            "description": "The file's name, recorded with the calibration: 1 to 256 characters, not\n only spaces, no control characters. E.g. \"tcp_calibration.json\"."
          },
          "content": {
            "type": "string",
            "description": "The file's text: a JSON object of at most 64 KiB."
          },
          "etag": {
            "type": "string",
            "description": "Robot.GripperTcp.etag as read."
          }
        },
        "description": "Request for Robots.ImportGripperCalibration."
      },
      "qualia.v1.ImportRobotModelRequest": {
        "required": [
          "name",
          "object"
        ],
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "accounts/{account}/robots/{robot}/model"
          },
          "object": {
            "type": "string",
            "description": "PrepareRobotModelImportResponse.object, after the file was PUT to its\n upload_uri. FAILED_PRECONDITION when nothing was uploaded there, or it\n belongs to another robot."
          }
        },
        "description": "Request for Robots.ImportRobotModel."
      },
      "qualia.v1.IngestReport": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "accounts/{account}/datasets/{dataset}/ingestReport"
          },
          "sizeBytes": {
            "readOnly": true,
            "type": "string",
            "description": "Size of the stored report in bytes."
          },
          "report": {
            "readOnly": true,
            "type": "object",
            "description": "The report as written (version, generated_at, sources, validation);\n unset when omission is set."
          },
          "omission": {
            "readOnly": true,
            "enum": [
              "OMISSION_UNSPECIFIED",
              "TOO_LARGE",
              "UNPARSEABLE"
            ],
            "type": "string",
            "description": "Why report is unset. A caller shows an omitted report as unreadable,\n never as clean.",
            "format": "enum"
          }
        },
        "description": "The structured report an upload's ingest wrote: per recording, its topics,\n episodes and findings, and the upload's report card. A merged dataset has\n its uploads' folded into one (Datasets.GetIngestReport)."
      },
      "qualia.v1.InterfaceSummary_Channel": {
        "type": "object",
        "properties": {
          "nativeIndex": {
            "readOnly": true,
            "type": "integer",
            "description": "Its position in the state or action vector: the n of the \"state[n]\"\n and \"action[n]\" keys Episodes.SampleEpisodeSeries returns. A camera's\n is its place among the recording's cameras.",
            "format": "int32"
          },
          "nativeName": {
            "readOnly": true,
            "type": "string",
            "description": "The name the recording gives it, e.g. \"left_joint_1.pos\"."
          },
          "canonicalKey": {
            "readOnly": true,
            "type": "string",
            "description": "The canonical key it resolves to, e.g. \"left.joint_1.pos\";\n \"unmapped:<native name>\" when the name could not be read."
          },
          "unit": {
            "readOnly": true,
            "type": "string",
            "description": "\"rad\", \"m\" or \"norm\"; empty when not known."
          },
          "mapped": {
            "readOnly": true,
            "type": "boolean",
            "description": "True when a person's channel mapping resolved it, not the name."
          },
          "sides": {
            "readOnly": true,
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.InterfaceSummary_KeySide"
            },
            "description": "A merged dataset's state or action channel: each key its uploads\n resolve it to, with the uploads that give it, when they do not agree\n (a merged dataset made before its merge asked, or while a remap\n settles). Empty when every upload gives `canonical_key`.\n A camera (`native_cameras`): each key it is read as, with the uploads\n that read it so. Always set on a merged dataset's or a mixture's, even\n where its uploads agree. On an upload's, set only when the upload\n reads one feature as two keys."
          }
        },
        "description": "One state, action or camera channel of an upload: where it sits in the\n recording and the canonical key it resolves to."
      },
      "qualia.v1.InterfaceSummary_KeySide": {
        "type": "object",
        "properties": {
          "canonicalKey": {
            "readOnly": true,
            "type": "string",
            "description": "The canonical key, e.g. \"gripper.pos\"."
          },
          "datasets": {
            "readOnly": true,
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "accounts/{account}/datasets/{dataset}: the uploads that give it."
          }
        },
        "description": "One canonical key some of a merged dataset's (or, for a camera, a\n mixture's) uploads give a channel."
      },
      "qualia.v1.Issue": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "accounts/{account}/datasets/{dataset}/issues/{issue}"
          },
          "episode": {
            "type": "string",
            "description": "accounts/{account}/datasets/{dataset}/episodes/{episode}; empty when the\n issue is about the whole dataset."
          },
          "code": {
            "readOnly": true,
            "type": "string",
            "description": "Machine-readable code (idle_tail, camera_desync, out_of_reach, mix_twin,\n source_starved, ...); empty for a person's own words."
          },
          "kind": {
            "readOnly": true,
            "enum": [
              "KIND_UNSPECIFIED",
              "TAKE",
              "RECORDING",
              "SCENE",
              "MOTION",
              "GRIPPER",
              "CONTROL",
              "DISTRIBUTION",
              "MIXTURE"
            ],
            "type": "string",
            "description": "What it is about.",
            "format": "enum"
          },
          "title": {
            "readOnly": true,
            "type": "string",
            "description": "Short label for the chip: the check's name, or a person's first line."
          },
          "text": {
            "type": "string",
            "description": "One human sentence. A person may raise an issue with no words (\"raised\")."
          },
          "body": {
            "type": "string",
            "description": "More than the sentence says: a model's whole explanation, the rest of\n what a person wrote."
          },
          "value": {
            "readOnly": true,
            "type": "string",
            "description": "The figure beside the title, e.g. \"4.2 s\", \"160 ms\", \"0.4x\"."
          },
          "timeSeconds": {
            "type": "number",
            "description": "A moment in the episode, seconds from the start of the recording.",
            "format": "double"
          },
          "author": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Actor"
              }
            ],
            "description": "Who raised it."
          },
          "blocks": {
            "type": "boolean",
            "description": "True: an issue that blocks a keep. False: a note. A person converts\n either way with UpdateIssue (emits ISSUE_CONVERTED); a rule's, model's or\n operator's issue can be demoted to a note and promoted back."
          },
          "state": {
            "readOnly": true,
            "enum": [
              "STATE_UNSPECIFIED",
              "OPEN",
              "DISMISSED"
            ],
            "type": "string",
            "description": "Open or dismissed. Changed only by DismissIssues and ReopenIssues.",
            "format": "enum"
          },
          "dismissal": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Stamp"
              }
            ],
            "description": "Who dismissed it, when; unset while open."
          },
          "dismissCause": {
            "readOnly": true,
            "enum": [
              "DISMISS_CAUSE_UNSPECIFIED",
              "MANUAL",
              "KEEP",
              "TRIM",
              "RESOLVED"
            ],
            "type": "string",
            "description": "What dismissed it.",
            "format": "enum"
          },
          "dismissReason": {
            "readOnly": true,
            "type": "string",
            "description": "Words given with the dismissal."
          },
          "conversion": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Stamp"
              }
            ],
            "description": "Who last converted it between issue and note; unset if never."
          },
          "replyCount": {
            "readOnly": true,
            "type": "integer",
            "description": "Replies under it.",
            "format": "int32"
          },
          "measurement": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Issue_Measurement"
              }
            ],
            "description": "What a rule measured, when it measured something."
          },
          "recommended": {
            "readOnly": true,
            "type": "boolean",
            "description": "True when the check recommends rejecting the episode (the curation\n suggestion fell under the frozen threshold)."
          },
          "source": {
            "readOnly": true,
            "type": "string",
            "description": "For a mixture-wide issue about one source (starved, apart, read at head,\n read twice): the source it names."
          },
          "createTime": {
            "readOnly": true,
            "type": "string",
            "description": "When it was raised.",
            "format": "date-time"
          },
          "updateTime": {
            "readOnly": true,
            "type": "string",
            "description": "When it last changed.",
            "format": "date-time"
          },
          "etag": {
            "type": "string",
            "description": "Sent back on UpdateIssue."
          },
          "check": {
            "readOnly": true,
            "type": "string",
            "description": "accounts/{account}/checks/{check}: the check that raised it; empty for\n anything else (a person, the operator, ingest, curation)."
          },
          "finding": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Issue_Finding"
              }
            ],
            "description": "The model's reading that last raised it: set on the VLM check's issues\n and notes."
          }
        },
        "description": "Anything said about an episode or a whole dataset. An issue\n blocks a keep until it is dismissed or the episode is ruled; a note\n (blocks = false) never blocks. Checks, models, the operator and people all\n raise into the same list.\n\n The parent dataset is the issue's scope. An issue raised through an upload\n is the episode's own and reads the same from every mixture that contains\n it; an issue raised through a mixture (by its checks or by a person working\n in it) is open in that mixture alone. A merged dataset\n has no issues of its own on its episodes: an issue raised on one through it\n is stored in the upload that holds the take, a dataset-level note is the\n merged dataset's. Every issue stored in an upload a merge took (raised\n before or after the merge) is named, with its episode and its replies,\n under the merged dataset, and is written by that name; its name\n under the upload still reads, and a write by it is FAILED_PRECONDITION\n naming the merged dataset.\n\n Served by qds-api."
      },
      "qualia.v1.IssueNames": {
        "type": "object",
        "properties": {
          "names": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "accounts/{account}/datasets/{dataset}/issues/{issue}, at most 10000."
          }
        },
        "description": "A list of issue names."
      },
      "qualia.v1.IssueSelection": {
        "type": "object",
        "properties": {
          "names": {
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.IssueNames"
              }
            ],
            "description": "Issue names under the request's parent."
          },
          "filter": {
            "type": "string",
            "description": "A ListIssues filter over the parent, e.g. `code = \"idle_tail\" AND state = OPEN`."
          }
        },
        "description": "Which issues a bulk call acts on. The server forces `dataset = parent`:\n only issues scoped to the parent ever match."
      },
      "qualia.v1.Issue_Finding": {
        "type": "object",
        "properties": {
          "verdict": {
            "readOnly": true,
            "enum": [
              "VERDICT_UNSPECIFIED",
              "PASS",
              "FAIL",
              "UNCERTAIN"
            ],
            "type": "string",
            "description": "What the model concluded.",
            "format": "enum"
          },
          "confidence": {
            "readOnly": true,
            "type": "number",
            "description": "How sure it was, 0 to 1.",
            "format": "double"
          },
          "explanation": {
            "readOnly": true,
            "type": "string",
            "description": "The evidence, in a few sentences."
          },
          "moments": {
            "readOnly": true,
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.Finding_Moment"
            },
            "description": "The moments it pointed at, in time order."
          },
          "model": {
            "readOnly": true,
            "type": "string",
            "description": "The Qualia model tier that read it, e.g. \"qualia-vlm-fast\"."
          },
          "task": {
            "readOnly": true,
            "type": "string",
            "description": "accounts/{account}/tasks/{task}: the task it read the episode against."
          },
          "taskRevision": {
            "readOnly": true,
            "type": "integer",
            "description": "That task's published revision, as frozen into the run.",
            "format": "int32"
          },
          "checkRun": {
            "readOnly": true,
            "type": "string",
            "description": "accounts/{account}/checks/vlm/runs/{run}: the check run that read it."
          },
          "readTime": {
            "readOnly": true,
            "type": "string",
            "description": "When it was read.",
            "format": "date-time"
          }
        },
        "description": "What a model read in the episode, as the VLM check recorded it. The\n issue's text is its summary."
      },
      "qualia.v1.Issue_Measurement": {
        "type": "object",
        "properties": {
          "metric": {
            "readOnly": true,
            "type": "string",
            "description": "The metric, as an Episode.Metrics field name."
          },
          "value": {
            "readOnly": true,
            "type": "number",
            "description": "The episode's value.",
            "format": "double"
          },
          "fence": {
            "readOnly": true,
            "type": "number",
            "description": "The fence it crossed.",
            "format": "double"
          },
          "comparator": {
            "readOnly": true,
            "type": "string",
            "description": "\">\" or \"<\"."
          },
          "population": {
            "readOnly": true,
            "type": "string",
            "description": "Whose fence: \"robot\", \"dataset\", \"mixture\", \"version\"."
          },
          "populationSize": {
            "readOnly": true,
            "type": "string",
            "description": "Episodes in that population."
          },
          "referenceRange": {
            "readOnly": true,
            "type": "string",
            "description": "The reference range the episode was judged against, as currently\n computed (each run on the interface refreshes it; the values at\n judgment are `fence` and `population_size` above):\n accounts/{account}/checks/episode-rules/referenceRanges/{reference_range}.\n Set on the episode rules' findings whose fence came from a stored\n range; empty for an absolute limit, an upload judged against itself\n (its ranges are not stored), the curation engine's thresholds, and a\n range a later run no longer computes (it is deleted)."
          },
          "observed": {
            "readOnly": true,
            "type": "number",
            "description": "Ingest: what the data said, in `unit` (a gap's length, a camera's\n rate, an episode's span).",
            "format": "double"
          },
          "expected": {
            "readOnly": true,
            "type": "number",
            "description": "Ingest: what it should have said, in `unit`: the limit it broke or the\n declared value.",
            "format": "double"
          },
          "delta": {
            "readOnly": true,
            "type": "number",
            "description": "Ingest: `observed` minus `expected`, in `unit`.",
            "format": "double"
          },
          "unit": {
            "readOnly": true,
            "type": "string",
            "description": "Ingest: the unit of `observed`, `expected` and `delta`: \"s\", \"rows\",\n \"hz\", \"px\", ...; empty when unknown."
          },
          "count": {
            "readOnly": true,
            "type": "string",
            "description": "Ingest: how many times it happened (the 3 of \"3 of 120\")."
          },
          "total": {
            "readOnly": true,
            "type": "string",
            "description": "Ingest: what `count` is out of (the 120 of \"3 of 120\": samples, rows,\n episodes), when there is such a whole."
          },
          "timeSeconds": {
            "readOnly": true,
            "type": "number",
            "description": "Ingest: when it started, in seconds from the episode start.",
            "format": "double"
          },
          "durationSeconds": {
            "readOnly": true,
            "type": "number",
            "description": "Ingest: how long it lasted from `time_seconds`, in seconds: a gap, a\n frozen reading, a low-rate window, the episode's whole span. Unset on\n a condition at one moment.",
            "format": "double"
          },
          "frameIndex": {
            "readOnly": true,
            "type": "string",
            "description": "Ingest: the row it was seen at, by position in the episode."
          },
          "camera": {
            "readOnly": true,
            "type": "string",
            "description": "Ingest: the camera it is about, by its key; empty when none."
          },
          "topic": {
            "readOnly": true,
            "type": "string",
            "description": "Ingest: the topic or column it is about; empty when none."
          }
        },
        "description": "What a rule measured, so the UI can say \"jerk_mean 0.61 > 0.42 (Q3+3 IQR\n of this robot's takes)\". An ingest finding fills the fields\n from `observed` on instead: what it saw, where and for how\n long, so a reader never parses `text`."
      },
      "qualia.v1.KeepEpisodesRequest": {
        "required": [
          "parent",
          "selection"
        ],
        "type": "object",
        "properties": {
          "parent": {
            "type": "string",
            "description": "accounts/{account}/datasets/{dataset}: the scope the keep is made in."
          },
          "selection": {
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.EpisodeSelection"
              }
            ],
            "description": "Which episodes."
          },
          "reason": {
            "type": "string",
            "description": "Optional words for the record."
          }
        },
        "description": "Request for Episodes.KeepEpisodes."
      },
      "qualia.v1.KeepEpisodesResponse": {
        "type": "object",
        "properties": {
          "result": {
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.RulingResult"
              }
            ],
            "description": "What happened."
          }
        },
        "description": "Response for Episodes.KeepEpisodes."
      },
      "qualia.v1.LinkTaskLabelsRequest": {
        "required": [
          "parent",
          "linkedTask"
        ],
        "type": "object",
        "properties": {
          "parent": {
            "type": "string",
            "description": "accounts/{account}/datasets/-: every upload of the account in the\n caller's workspace."
          },
          "linkedTask": {
            "type": "string",
            "description": "accounts/{account}/tasks/{task}: the task to link to. A task of the\n parent's account; NOT_FOUND otherwise."
          },
          "labels": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "The labels to link, each exactly as a match reports it: the task's name\n or a near miss of it, at most 100. Empty links the exact matches only,\n as publishing does. A label that is neither is INVALID_ARGUMENT."
          },
          "validateOnly": {
            "type": "boolean",
            "description": "Report what the call would link and write nothing."
          }
        },
        "description": "Request for Episodes.LinkTaskLabels."
      },
      "qualia.v1.LinkTaskLabelsResponse": {
        "type": "object",
        "properties": {
          "matches": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.TaskLabelMatch"
            },
            "description": "Every label that matches the task's name, as it stood before the call:\n exact ones first, then by episode count."
          },
          "linkedEpisodeCount": {
            "type": "integer",
            "description": "Episodes linked (with validate_only, that would be).",
            "format": "int32"
          },
          "linkedDatasetCount": {
            "type": "integer",
            "description": "Uploads and merged datasets linked (with validate_only, that would be).",
            "format": "int32"
          }
        },
        "description": "Response for Episodes.LinkTaskLabels."
      },
      "qualia.v1.ListActivityFacetsResponse": {
        "type": "object",
        "properties": {
          "verbs": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.ActivityFacet"
            },
            "description": "Verb names (ActivitySummary.Verb)."
          },
          "actors": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.ActivityFacet"
            },
            "description": "Summary actor kinds (ActivityActor.Kind)."
          },
          "people": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.ActivityFacet"
            },
            "description": "People (`actor.user` ids) who acted without a key."
          },
          "keys": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.ActivityFacet"
            },
            "description": "Keys (`actor.api_key` ids)."
          },
          "subjectTypes": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.ActivityFacet"
            },
            "description": "Subject types (`dataset`, `episode`, `task`, ...)."
          },
          "workspaces": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.ActivityFacet"
            },
            "description": "Workspace ids; set for an organization only. The organization's own\n actions have none."
          },
          "truncated": {
            "type": "boolean",
            "description": "True when more actions matched than the counts cover."
          },
          "scanned": {
            "type": "integer",
            "description": "How many actions the counts cover: the newest ones, at most 5000.",
            "format": "int32"
          }
        },
        "description": "The values the newest eligible actions hold, each with how many of them\n hold it, most first. Ids only: names come from ReadActivityActors (by\n `sample_event`) and from the workspaces the caller reads."
      },
      "qualia.v1.ListCheckFindingsResponse": {
        "type": "object",
        "properties": {
          "checkFindings": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.CheckFinding"
            },
            "description": "One page of findings, newest first."
          },
          "nextPageToken": {
            "type": "string",
            "description": "Empty on the last page."
          }
        },
        "description": "Response for Checks.ListCheckFindings."
      },
      "qualia.v1.ListCheckResultsResponse": {
        "type": "object",
        "properties": {
          "checkResults": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.CheckResult"
            },
            "description": "One page of results."
          },
          "nextPageToken": {
            "type": "string",
            "description": "Empty on the last page."
          }
        },
        "description": "Response for Checks.ListCheckResults."
      },
      "qualia.v1.ListCheckRunsResponse": {
        "type": "object",
        "properties": {
          "checkRuns": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.CheckRun"
            },
            "description": "One page of runs, newest first."
          },
          "nextPageToken": {
            "type": "string",
            "description": "Empty on the last page."
          }
        },
        "description": "Response for Checks.ListCheckRuns."
      },
      "qualia.v1.ListChecksResponse": {
        "type": "object",
        "properties": {
          "checks": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.Check"
            },
            "description": "One page of checks."
          },
          "nextPageToken": {
            "type": "string",
            "description": "Empty on the last page."
          }
        },
        "description": "Response for Checks.ListChecks."
      },
      "qualia.v1.ListDatasetChecksResponse": {
        "type": "object",
        "properties": {
          "datasetChecks": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.DatasetCheck"
            },
            "description": "One page of checks, by category then check id."
          },
          "nextPageToken": {
            "type": "string",
            "description": "Empty on the last page."
          }
        },
        "description": "Response for Checks.ListDatasetChecks."
      },
      "qualia.v1.ListDatasetsResponse": {
        "type": "object",
        "properties": {
          "datasets": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.Dataset"
            },
            "description": "One page of datasets."
          },
          "nextPageToken": {
            "type": "string",
            "description": "Empty on the last page."
          },
          "totalSize": {
            "type": "integer",
            "description": "Datasets matching the filter, across every page.",
            "format": "int32"
          }
        },
        "description": "Response for Datasets.ListDatasets."
      },
      "qualia.v1.ListEpisodeRevisionsResponse": {
        "type": "object",
        "properties": {
          "episodeRevisions": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.EpisodeRevision"
            },
            "description": "One page of revisions, newest first."
          },
          "nextPageToken": {
            "type": "string",
            "description": "Empty on the last page."
          }
        },
        "description": "Response for Episodes.ListEpisodeRevisions."
      },
      "qualia.v1.ListEpisodesResponse": {
        "type": "object",
        "properties": {
          "episodes": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.Episode"
            },
            "description": "One page of episodes."
          },
          "nextPageToken": {
            "type": "string",
            "description": "Empty on the last page."
          },
          "totalSize": {
            "type": "integer",
            "description": "Episodes matching the filter, across every page.",
            "format": "int32"
          }
        },
        "description": "Response for Episodes.ListEpisodes."
      },
      "qualia.v1.ListEventsResponse": {
        "type": "object",
        "properties": {
          "events": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.Event"
            },
            "description": "One page of events, newest first. Empty when grouping."
          },
          "nextPageToken": {
            "type": "string",
            "description": "Empty on the last page."
          },
          "sessions": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.EventSession"
            },
            "description": "One page of sessions, newest first; set only when grouping is SESSIONS."
          },
          "activity": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.ActivitySummary"
            },
            "description": "Bounded intentional actions, newest first. Only set for TEAM_ACTIVITY."
          },
          "activityCursor": {
            "type": "string",
            "description": "TEAM_ACTIVITY snapshot cursor. Open its separate SSE subscription after\n the first page's cursor, then merge by ActivitySummary.event. Use only\n the first page's cursor; later pages do not replace the live cursor."
          },
          "activityViewVersion": {
            "type": "string",
            "description": "The classifier/projection version bound into Activity page tokens."
          }
        },
        "description": "Response for Events.ListEvents."
      },
      "qualia.v1.ListIssuesResponse": {
        "type": "object",
        "properties": {
          "issues": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.Issue"
            },
            "description": "One page of issues."
          },
          "nextPageToken": {
            "type": "string",
            "description": "Empty on the last page."
          },
          "totalSize": {
            "type": "integer",
            "description": "Issues matching the filter, across every page.",
            "format": "int32"
          }
        },
        "description": "Response for Issues.ListIssues."
      },
      "qualia.v1.ListMaterializationArtifactsResponse": {
        "type": "object",
        "properties": {
          "materializationArtifacts": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.MaterializationArtifact"
            },
            "description": "One page of files, in path order."
          },
          "nextPageToken": {
            "type": "string",
            "description": "Empty on the last page."
          }
        },
        "description": "Response for Versions.ListMaterializationArtifacts."
      },
      "qualia.v1.ListReferenceRangesResponse": {
        "type": "object",
        "properties": {
          "referenceRanges": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.ReferenceRange"
            },
            "description": "One page of ranges."
          },
          "nextPageToken": {
            "type": "string",
            "description": "Empty on the last page."
          }
        },
        "description": "Response for Checks.ListReferenceRanges."
      },
      "qualia.v1.ListReingestNotCarriedResponse": {
        "type": "object",
        "properties": {
          "notCarried": {
            "readOnly": true,
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.ReingestNotCarried"
            },
            "description": "Old original takes, ordered by their recorded episode_index."
          },
          "nextPageToken": {
            "readOnly": true,
            "type": "string",
            "description": "Signed continuation; empty only when this complete result ends."
          },
          "totalSize": {
            "readOnly": true,
            "type": "string",
            "description": "Exact number of old original takes across all pages of this result."
          },
          "publicationCommit": {
            "readOnly": true,
            "type": "string",
            "description": "Immutable publication commit; identical on every page."
          }
        },
        "description": "One page of old takes whose state the finalized re-cut did not carry."
      },
      "qualia.v1.ListRepliesResponse": {
        "type": "object",
        "properties": {
          "replies": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.Reply"
            },
            "description": "One page of replies."
          },
          "nextPageToken": {
            "type": "string",
            "description": "Empty on the last page."
          }
        },
        "description": "Response for Issues.ListReplies."
      },
      "qualia.v1.ListRigsResponse": {
        "type": "object",
        "properties": {
          "rigs": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.Rig"
            },
            "description": "One page of rigs."
          },
          "nextPageToken": {
            "type": "string",
            "description": "Empty on the last page."
          }
        },
        "description": "Response for Rigs.ListRigs."
      },
      "qualia.v1.ListRobotsResponse": {
        "type": "object",
        "properties": {
          "robots": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.Robot"
            },
            "description": "One page of robots."
          },
          "nextPageToken": {
            "type": "string",
            "description": "Empty on the last page."
          }
        },
        "description": "Response for Robots.ListRobots."
      },
      "qualia.v1.ListSolverTemplatesResponse": {
        "type": "object",
        "properties": {
          "solverTemplates": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.SolverTemplate"
            },
            "description": "One page of solver templates."
          },
          "nextPageToken": {
            "type": "string",
            "description": "Empty on the last page."
          }
        },
        "description": "Response for Robots.ListSolverTemplates."
      },
      "qualia.v1.ListSourceCommitsResponse": {
        "type": "object",
        "properties": {
          "sourceCommits": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.SourceCommit"
            },
            "description": "One page of commits."
          },
          "nextPageToken": {
            "type": "string",
            "description": "Empty on the last page."
          },
          "totalSize": {
            "type": "integer",
            "description": "Commits the tag pins, across every page.",
            "format": "int32"
          }
        },
        "description": "Response for Versions.ListSourceCommits."
      },
      "qualia.v1.ListSourcesResponse": {
        "type": "object",
        "properties": {
          "sources": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.Source"
            },
            "description": "One page of sources."
          },
          "nextPageToken": {
            "type": "string",
            "description": "Empty on the last page."
          }
        },
        "description": "Response for Mixtures.ListSources."
      },
      "qualia.v1.ListStatusesResponse": {
        "type": "object",
        "properties": {
          "statuses": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.Status"
            },
            "description": "One page, most recently changed first."
          },
          "nextPageToken": {
            "type": "string",
            "description": "Empty on the last page."
          }
        },
        "description": "Response for Statuses.ListStatuses."
      },
      "qualia.v1.ListTaskDraftsResponse": {
        "type": "object",
        "properties": {
          "taskDrafts": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.TaskDraft"
            },
            "description": "Drafts in newest-first order."
          },
          "nextPageToken": {
            "type": "string",
            "description": "Cursor for the next page, or empty when complete."
          }
        },
        "description": "A page of TaskDrafts and its next cursor, if any."
      },
      "qualia.v1.ListTaskReferencesResponse": {
        "type": "object",
        "properties": {
          "taskReferences": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.TaskReference"
            },
            "description": "One page of references."
          },
          "nextPageToken": {
            "type": "string",
            "description": "Empty on the last page."
          }
        },
        "description": "Response for Tasks.ListTaskReferences."
      },
      "qualia.v1.ListTaskRevisionsResponse": {
        "type": "object",
        "properties": {
          "taskRevisions": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.TaskRevision"
            },
            "description": "One page of revisions."
          },
          "nextPageToken": {
            "type": "string",
            "description": "Empty on the last page."
          }
        },
        "description": "Response for Tasks.ListTaskRevisions."
      },
      "qualia.v1.ListTasksResponse": {
        "type": "object",
        "properties": {
          "tasks": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.Task"
            },
            "description": "One page of tasks."
          },
          "nextPageToken": {
            "type": "string",
            "description": "Empty on the last page."
          }
        },
        "description": "Response for Tasks.ListTasks."
      },
      "qualia.v1.ListVersionPreviewItemsResponse": {
        "type": "object",
        "properties": {
          "versionPreviewItems": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.VersionPreviewItem"
            },
            "description": "One page of windows, in take order and each take's in time order."
          },
          "nextPageToken": {
            "type": "string",
            "description": "Empty on the last page."
          }
        },
        "description": "Response for Versions.ListVersionPreviewItems."
      },
      "qualia.v1.ListVersionPreviewsResponse": {
        "type": "object",
        "properties": {
          "versionPreviews": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.VersionPreview"
            },
            "description": "The caller's live preview of the dataset, if any."
          },
          "nextPageToken": {
            "type": "string",
            "description": "Empty on the last page."
          }
        },
        "description": "Response for Versions.ListVersionPreviews."
      },
      "qualia.v1.ListVersionsResponse": {
        "type": "object",
        "properties": {
          "versions": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.Version"
            },
            "description": "One page of tags."
          },
          "nextPageToken": {
            "type": "string",
            "description": "Empty on the last page."
          },
          "copySource": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Version_CopySource"
              }
            ],
            "description": "What this dataset was copied from, whatever its kind, on every page. Unset\n when it is no copy."
          }
        },
        "description": "Response of ListVersions."
      },
      "qualia.v1.LocateEpisodeResponse": {
        "type": "object",
        "properties": {
          "position": {
            "type": "integer",
            "description": "Its index in the filtered order, from 0.",
            "format": "int32"
          },
          "totalSize": {
            "type": "integer",
            "description": "Episodes the filter leaves.",
            "format": "int32"
          },
          "previousEpisode": {
            "type": "string",
            "description": "The episode before it; empty at the start."
          },
          "nextEpisode": {
            "type": "string",
            "description": "The episode after it; empty at the end."
          },
          "pageToken": {
            "type": "string",
            "description": "A ListEpisodes page_token that starts the page containing it."
          }
        },
        "description": "Response for Episodes.LocateEpisode."
      },
      "qualia.v1.LockedEpisode": {
        "type": "object",
        "properties": {
          "episode": {
            "type": "string",
            "description": "accounts/{account}/datasets/{dataset}/episodes/{episode}, in the scope\n the write was made in."
          },
          "holderName": {
            "type": "string",
            "description": "The holder's display name; empty when they have none."
          }
        },
        "description": "An episode a write left alone, or refused, because another person holds\n its edit lease (Episodes.AcquireEpisodeLease). Bulk responses list at most\n 100 of these beside a count of all of them."
      },
      "qualia.v1.MarkEpisodeViewedRequest": {
        "required": [
          "name"
        ],
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "accounts/{account}/datasets/{dataset}/episodes/{episode}"
          }
        },
        "description": "Request for Episodes.MarkEpisodeViewed."
      },
      "qualia.v1.MarkEpisodeViewedResponse": {
        "type": "object",
        "properties": {},
        "description": "Response for Episodes.MarkEpisodeViewed."
      },
      "qualia.v1.Materialization": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "accounts/{account}/datasets/{dataset}/versions/{version}/materializations/{materialization}.\n The version segment is the tag, also when the request named `stable` or\n a digest prefix."
          },
          "state": {
            "readOnly": true,
            "enum": [
              "STATE_UNSPECIFIED",
              "NOT_STARTED",
              "RUNNING",
              "SUCCEEDED",
              "INTERRUPTED"
            ],
            "type": "string",
            "description": "How far the rendering is.",
            "format": "enum"
          },
          "digest": {
            "readOnly": true,
            "type": "string",
            "description": "\"b3:<hex>\", once SUCCEEDED: one hash over every artifact's path and\n content, so two renderings with one digest are the same files."
          },
          "artifactCount": {
            "readOnly": true,
            "type": "string",
            "description": "Files in the rendered dataset, once SUCCEEDED."
          },
          "episodeCount": {
            "readOnly": true,
            "type": "string",
            "description": "Episodes in it, once SUCCEEDED."
          },
          "frameCount": {
            "readOnly": true,
            "type": "string",
            "description": "Frames in it, once SUCCEEDED."
          },
          "renderer": {
            "readOnly": true,
            "type": "string",
            "description": "\"b3:<hex>\": the renderer revision this rendering is for. A new renderer\n starts over at NOT_STARTED."
          }
        },
        "description": "A tag rendered as a LeRobot or MCAP ROS2 dataset, to download.\n The files stay in object storage: each artifact carries a short-lived signed\n URI to its immutable object, never the bytes. Rendering runs in the\n background: StartMaterialization begins it, and every later call, from\n anyone, finds the same rendering. A tag never moves, so the same tag\n rendered by the same renderer gives the same files, byte for byte.\n\n The {materialization} id is the layout: `lerobot-v3` (LeRobot v3.0),\n `lerobot-v2-1` (LeRobot v2.1) or `mcap-ros2` (one ROS 2 MCAP file per\n episode). `head` is not pinned, so it has none: tag it first.\n\n Served by qds-api."
      },
      "qualia.v1.MaterializationArtifact": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": ".../materializations/{materialization}/artifacts/{artifact}; {artifact}\n is its position in the listing, from 0."
          },
          "path": {
            "readOnly": true,
            "type": "string",
            "description": "Where it goes in the dataset's directory, e.g. \"meta/info.json\"."
          },
          "role": {
            "readOnly": true,
            "enum": [
              "ROLE_UNSPECIFIED",
              "META",
              "DATA",
              "VIDEO"
            ],
            "type": "string",
            "description": "What it holds.",
            "format": "enum"
          },
          "sizeBytes": {
            "readOnly": true,
            "type": "string",
            "description": "Its size in bytes."
          },
          "sha256": {
            "readOnly": true,
            "type": "string",
            "description": "Lowercase hex SHA-256 of its bytes, to check a download against."
          },
          "episode": {
            "readOnly": true,
            "type": "string",
            "description": "accounts/{account}/datasets/{dataset}/episodes/{episode}: the episode\n it was rendered from, when it holds one episode only."
          },
          "camera": {
            "readOnly": true,
            "type": "string",
            "description": "The camera key, for a video."
          },
          "uri": {
            "readOnly": true,
            "type": "string",
            "description": "Signed GET URI of its bytes; honours HTTP Range. Valid until expire_time."
          },
          "expireTime": {
            "readOnly": true,
            "type": "string",
            "description": "When uri stops working; list again for a fresh one.",
            "format": "date-time"
          }
        },
        "description": "One file of a rendered dataset."
      },
      "qualia.v1.Matrix4": {
        "type": "object",
        "properties": {
          "m": {
            "type": "array",
            "items": {
              "type": "number",
              "format": "double"
            },
            "description": "m[0..3] is the first row, m[12..15] the last."
          }
        },
        "description": "A 3D rigid transform as a 4x4 matrix: 16 numbers, row-major, translation in\n metres in the last column, the bottom row 0 0 0 1. Where it is used says\n whose pose it is and in which frame (Robot.GripperTcp.Hand.tcp: the TCP in\n a link's frame). Unlike Transform it has no pitch pole to lose a rotation at."
      },
      "qualia.v1.MemberPosePreparation": {
        "type": "object",
        "properties": {
          "upload": {
            "readOnly": true,
            "type": "string",
            "description": "The source upload resource."
          },
          "displayName": {
            "readOnly": true,
            "type": "string",
            "description": "The source upload's display name."
          },
          "state": {
            "readOnly": true,
            "enum": [
              "STATE_UNSPECIFIED",
              "CURRENT",
              "READY",
              "RUNNING",
              "BLOCKED",
              "FAILED"
            ],
            "type": "string",
            "description": "The upload's current preparation state.",
            "format": "enum"
          },
          "reason": {
            "readOnly": true,
            "type": "string",
            "description": "Human-readable explanation when applicable."
          },
          "operationId": {
            "readOnly": true,
            "type": "string",
            "description": "UUID polled at this upload's reingests/{operation_id} resource."
          },
          "rigKey": {
            "readOnly": true,
            "type": "string",
            "description": "Recording rig, never an editable collection tag or playback robot."
          },
          "calibrationGripper": {
            "readOnly": true,
            "type": "string",
            "description": "The capture gripper supplying the calibration."
          },
          "calibrationEtag": {
            "readOnly": true,
            "type": "string",
            "description": "The capture calibration's version."
          },
          "publishing": {
            "readOnly": true,
            "type": "boolean",
            "description": "Preparation is complete and its publication is pending; it cannot be cancelled."
          }
        },
        "description": "One upload's current state. Names and reasons are suitable for the merged\n dataset's pre-check; no source data or historical rulings are removed."
      },
      "qualia.v1.MergeConflict": {
        "type": "object",
        "properties": {
          "field": {
            "readOnly": true,
            "type": "string",
            "description": "What differs: what training freezes (\"features\", \"cameras\",\n \"channel_names\", \"fps\", \"poses_at\"), which only leaving uploads out\n settles, or what a write settles (\"channel_key\", \"target_robot\",\n \"source_robot\", \"method\", \"reach_settings\"), or, when the merge makes a\n new merged dataset, what it takes as its own (\"labels.task\",\n \"labels.robot\", \"labels.operator\", \"labels.scene\", \"linked_task\"; the\n uploads' commonest value unless a resolution names one)."
          },
          "channel": {
            "readOnly": true,
            "type": "string",
            "description": "The native channel name, for \"channel_key\" only."
          },
          "sides": {
            "readOnly": true,
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.MergeConflict_Side"
            },
            "description": "Each value and the uploads that have it."
          },
          "blocking": {
            "readOnly": true,
            "type": "boolean",
            "description": "True when only leaving uploads out settles it."
          }
        },
        "description": "What differs between the uploads a merge would hold (MergeDatasets with\n `validate_only`)."
      },
      "qualia.v1.MergeConflict_Side": {
        "type": "object",
        "properties": {
          "value": {
            "readOnly": true,
            "type": "string",
            "description": "The value: a canonical key, a robot resource name (\"\" for none), a\n method, reach settings as JSON (`{\"base_m\":[x,y,z],\"home_heading_rad\":r}`\n with what the upload names; \"\" follows the target robot's model), a\n label (\"\" for unset), a task resource name (\"\" for none), or a\n description of what training freezes."
          },
          "datasets": {
            "readOnly": true,
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "accounts/{account}/datasets/{dataset}: the uploads that have it."
          }
        },
        "description": "One value of the field, and the uploads that have it."
      },
      "qualia.v1.MergeDatasetsRequest": {
        "required": [
          "parent",
          "datasets"
        ],
        "type": "object",
        "properties": {
          "parent": {
            "type": "string",
            "description": "accounts/{account}"
          },
          "datasets": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "accounts/{account}/datasets/{dataset}: the uploads to merge, each once.\n At least two for a new merged dataset; at least one when `merge_target`\n is set. At most 100."
          },
          "mergeTarget": {
            "type": "string",
            "description": "accounts/{account}/datasets/{dataset}: an existing merged dataset to add\n the uploads to. Empty merges them into a new one. The uploads must be\n compatible with the ones it already holds; its tags stay as they are and\n its drift shows the uploads that arrived."
          },
          "displayName": {
            "type": "string",
            "description": "Name of the new merged dataset. Required for a new merge; it must be empty\n with `merge_target`, whose name is edited with UpdateDataset."
          },
          "description": {
            "type": "string",
            "description": "Free text about the new merged dataset."
          },
          "requestId": {
            "type": "string",
            "description": "Idempotency key (AIP-155): a retry with the same id within 24 hours\n returns the first call's result instead of merging a second time."
          },
          "validateOnly": {
            "type": "boolean",
            "description": "Preview the merge without writing anything: every check runs as for a\n commit, and `MergeDatasetsResponse.conflicts` lists what differs between\n the uploads (and the uploads `merge_target` holds), with `dataset`\n empty. Nothing is written, no lock on the account is taken and\n `request_id` is not remembered."
          },
          "resolutions": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.MergeResolution"
            },
            "description": "How to settle each resolvable conflict a preview returned, applied in the\n merge's transaction: a lens per upload whose channel key differs, and the\n method, target robot, reach settings and source robot written to each\n upload that differs, each recording its own event (the robots and reach\n settings also to the merged dataset); a new merged dataset's own labels\n and linked Task, which no upload takes. A label or the linked Task left\n without one takes the uploads' commonest value. Any other conflict left\n without one, or a value that is not one of its sides, is\n FAILED_PRECONDITION naming it, and nothing is written; a resolution for a\n field that no longer differs is ignored. Without any, a merge refuses\n every conflict but those five, as it did before resolutions existed."
          },
          "automaticUpload": {
            "type": "boolean",
            "description": "Automatic completion of one logical upload's bound append intent. The\n server checks that intent under the merge lock and refuses a stale one\n (one reverted before merges were final among them). Requires one upload\n and merge_target, and no preview or resolutions: it appends as the\n upload is, so a setting that differs from the merged dataset's is\n refused and the intent waits for a person (action_needed). Labels and\n the linked Task are not compared. Omitted for an explicit user merge."
          }
        },
        "description": "Request for Datasets.MergeDatasets."
      },
      "qualia.v1.MergeDatasetsResponse": {
        "type": "object",
        "properties": {
          "dataset": {
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Dataset"
              }
            ],
            "description": "The merged dataset, with every upload it holds in `source_datasets`.\n Empty for `validate_only`."
          },
          "conflicts": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.MergeConflict"
            },
            "description": "For `validate_only`: what differs between the uploads, blocking ones\n first. Empty when they merge as they are."
          }
        },
        "description": "Response for Datasets.MergeDatasets."
      },
      "qualia.v1.MergeHistory": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "accounts/{account}/datasets/{dataset}/mergeHistory"
          },
          "entries": {
            "readOnly": true,
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.MergeHistoryEntry"
            },
            "description": "Merge and revert events, newest first."
          }
        },
        "description": "The merge and revert history of a dataset."
      },
      "qualia.v1.MergeHistoryEntry": {
        "type": "object",
        "properties": {
          "event": {
            "type": "string",
            "description": "The merge or revert event in the dataset event stream."
          },
          "kind": {
            "type": "string",
            "description": "DATASETS_MERGED or EVENT_REVERTED."
          },
          "actor": {
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Actor"
              }
            ],
            "description": "User, agent or system identity that made the change."
          },
          "createTime": {
            "type": "string",
            "description": "RFC 3339 event time.",
            "format": "date-time"
          },
          "datasets": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Uploads joined by this merge, or released by its revert."
          },
          "revertedEvent": {
            "type": "string",
            "description": "For EVENT_REVERTED, the DATASETS_MERGED event it reverses."
          },
          "reverted": {
            "type": "boolean",
            "description": "For DATASETS_MERGED, true after a revert event was recorded."
          },
          "canRevert": {
            "type": "boolean",
            "description": "For DATASETS_MERGED, whether RevertMerge can reverse this entry: always\n false since merges are final."
          },
          "appended": {
            "type": "boolean",
            "description": "True when the merge appended to an existing merged dataset."
          }
        },
        "description": "The merge or revert event in the dataset event stream."
      },
      "qualia.v1.MergeResolution": {
        "required": [
          "field"
        ],
        "type": "object",
        "properties": {
          "field": {
            "type": "string",
            "description": "The conflict's field: one MergeConflict.field a write settles."
          },
          "channel": {
            "type": "string",
            "description": "The native channel name, for \"channel_key\" only."
          },
          "value": {
            "type": "string",
            "description": "One of the conflict's side values: a merged dataset's settings are\n chosen once, at the merge. Every upload takes it, but a label or the\n linked Task, which the new merged dataset takes as its own in place of\n its uploads' commonest."
          }
        },
        "description": "How a merge settles one resolvable MergeConflict."
      },
      "qualia.v1.MergedPosePreparation": {
        "type": "object",
        "properties": {
          "membershipRevision": {
            "readOnly": true,
            "type": "string",
            "description": "Opaque ordered-membership epoch. Send it back on an explicit move or\n removal; a changed membership is ABORTED and must be confirmed again."
          },
          "currentMembers": {
            "readOnly": true,
            "type": "integer",
            "description": "Number already at their current capture calibration.",
            "format": "int32"
          },
          "totalMembers": {
            "readOnly": true,
            "type": "integer",
            "description": "Number of uploads in the current membership.",
            "format": "int32"
          },
          "members": {
            "readOnly": true,
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.MemberPosePreparation"
            },
            "description": "Preparation state for each upload, in membership order."
          },
          "applicable": {
            "readOnly": true,
            "type": "boolean",
            "description": "False when none of these recordings has handheld poses to prepare."
          }
        },
        "description": "Current TCP preparation of the uploads held by one merged dataset."
      },
      "qualia.v1.MergedSettingsContext": {
        "required": [
          "mergedDataset",
          "members",
          "membershipRevision",
          "etag"
        ],
        "type": "object",
        "properties": {
          "mergedDataset": {
            "type": "string",
            "description": "The merged dataset whose membership was confirmed."
          },
          "members": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Every upload it held, in merge order, including the selected upload."
          },
          "membershipRevision": {
            "type": "string",
            "description": "Opaque merge/undo epoch from GetDataset; never recapture it on retry."
          },
          "etag": {
            "type": "string",
            "description": "The dataset's editable etag; a member edit sends the selected upload's."
          },
          "sourceCommit": {
            "type": "string",
            "description": "The selected upload's exact paired head. Empty on the merged dataset's\n context, which is used only to fence global label edits."
          }
        },
        "description": "No longer answered: a merge is final and a merged dataset is not\n corrected through its uploads. One an older client still sends is checked:\n every resource in the caller's account/workspace, the exact ordered\n membership, the selected upload's etag and its published head. A stale\n context is ABORTED."
      },
      "qualia.v1.MoveDatasetRequest": {
        "required": [
          "name",
          "targetWorkspace"
        ],
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "accounts/{account}/datasets/{dataset}: the dataset to move, found in the\n request's workspace."
          },
          "targetWorkspace": {
            "type": "string",
            "description": "accounts/{account}/workspaces/{workspace}: another workspace of the same\n organization."
          },
          "requestId": {
            "type": "string",
            "description": "Idempotency key (AIP-155): a retry with the same id returns the first\n call's result instead of moving again."
          }
        },
        "description": "Request for Datasets.MoveDataset."
      },
      "qualia.v1.NumericCondition": {
        "required": [
          "metric",
          "op",
          "value"
        ],
        "type": "object",
        "properties": {
          "metric": {
            "type": "string",
            "description": "The metric name: 1 to 64 lowercase letters, digits, '_' or '.',\n starting with a letter."
          },
          "op": {
            "type": "string",
            "description": "The comparison: lt, le, gt, ge, eq or between."
          },
          "value": {
            "type": "number",
            "description": "The comparison value, or the lower value for between.",
            "format": "double"
          },
          "valueHigh": {
            "type": "number",
            "description": "The upper value, greater than value. Set if and only if op is between.",
            "format": "double"
          }
        },
        "description": "A comparison against a measured metric."
      },
      "qualia.v1.PersonSet": {
        "type": "object",
        "properties": {
          "actor": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Actor"
              }
            ],
            "description": "The person, always kind PERSON, with `user` and `display_name` as at\n the time."
          },
          "setTime": {
            "readOnly": true,
            "type": "string",
            "description": "When they set it.",
            "format": "date-time"
          },
          "digest": {
            "readOnly": true,
            "type": "string",
            "description": "Lowercase hex sha256 of the value. For counts:\n \"count:<min_count>:<max_count>\", each empty when unset. For a numeric\n condition: \"numeric:<metric>:<op>:<value>:<value_high>\", numbers as\n Python repr(float), value_high empty when unset. For a procedure:\n \"procedure:<proto JSON>\", keys sorted, without any stamp."
          }
        },
        "description": "A person's confirmation of one value: who, when, and a digest of the value\n confirmed. Written only by the server. It holds while the value's digest\n still matches."
      },
      "qualia.v1.Preparation": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "accounts/{account}/datasets/{dataset}/preparation"
          },
          "state": {
            "readOnly": true,
            "enum": [
              "STATE_UNSPECIFIED",
              "NONE",
              "QUEUED",
              "RUNNING",
              "SUCCEEDED",
              "FAILED",
              "SKIPPED"
            ],
            "type": "string",
            "description": "Where the newest run is.",
            "format": "enum"
          },
          "runId": {
            "readOnly": true,
            "type": "string",
            "description": "The newest run's id."
          },
          "version": {
            "readOnly": true,
            "type": "string",
            "description": "The dataset version the run read."
          },
          "createTime": {
            "readOnly": true,
            "type": "string",
            "description": "When the run was queued.",
            "format": "date-time"
          },
          "updateTime": {
            "readOnly": true,
            "type": "string",
            "description": "When the run last changed.",
            "format": "date-time"
          },
          "error": {
            "readOnly": true,
            "type": "string",
            "description": "Why the run failed."
          },
          "taskMatch": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Preparation_TaskMatch"
              }
            ],
            "description": "The matched or drafted Task. Unset for a run that discovery split into\n tasks: each has its own Task, in discovery."
          },
          "cuts": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Preparation_Cuts"
              }
            ],
            "description": "The takes it split."
          },
          "taskStrings": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Preparation_TaskStrings"
              }
            ],
            "description": "The dataset's own task names."
          },
          "discovery": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Preparation_Discovery"
              }
            ],
            "description": "The tasks discovery found; unset on runs from before discovery."
          },
          "unpublishedAnnotationCount": {
            "readOnly": true,
            "type": "integer",
            "description": "Takes without a published annotation. Above zero, the run is partial: the\n other takes' annotations stand.",
            "format": "int32"
          },
          "unpublishedAnnotations": {
            "readOnly": true,
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.Preparation_UnpublishedAnnotation"
            },
            "description": "The first 100 of those takes, each with why."
          },
          "warnings": {
            "readOnly": true,
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "What the run flagged without failing, one sentence each: a model that\n answered in place of the one asked for (\"3 reads answered by a fallback\n model instead of Qualia VLM\", Qualia names only), whose labels may be\n weaker. A read is a reply whose model was checked, not a label. A\n SUCCEEDED run whose task discovery failed says so here in one fixed\n sentence (\"Task discovery did not finish, so the takes were prepared as\n one task for the whole dataset.\"), or \"... prepared as a task per\n instruction they carry.\" when the takes' own task strings gave the tasks\n (discovery.task_strings_fallback), or, for a failed re-run that left\n earlier tasks standing, \"Finding the tasks again did not finish; the\n tasks found before stand.\"; the reason is in discovery.reason. Empty\n when none."
          }
        },
        "description": "What the newest prepare run did to an upload. Its splits make the next\n version's episodes (v0 keeps the takes as uploaded); the rest is a proposal\n or a flag, and no Task was published."
      },
      "qualia.v1.Preparation_Cuts": {
        "type": "object",
        "properties": {
          "takes": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.Cuts_Take"
            },
            "description": "Only takes split into two or more pieces."
          },
          "skippedCount": {
            "type": "integer",
            "description": "Takes the run left whole or could not split.",
            "format": "int32"
          }
        },
        "description": "The takes the run split."
      },
      "qualia.v1.Preparation_Discovery": {
        "type": "object",
        "properties": {
          "status": {
            "enum": [
              "STATUS_UNSPECIFIED",
              "RUNNING",
              "DONE",
              "FAILED",
              "FALLBACK"
            ],
            "type": "string",
            "description": "Where discovery is.",
            "format": "enum"
          },
          "tasks": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.Discovery_Task"
            },
            "description": "The tasks, by task_key."
          },
          "unsortedCount": {
            "type": "integer",
            "description": "Takes no task holds (their map failed): not linked, not checked.",
            "format": "int32"
          },
          "reason": {
            "type": "string",
            "description": "Why discovery fell back or failed; empty otherwise."
          },
          "recommendation": {
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Discovery_Recommendation"
              }
            ],
            "description": "Unset when the upload's task names were not assessed (a fallback)."
          },
          "taskStringsFallback": {
            "type": "boolean",
            "description": "FAILED or FALLBACK, and the tasks are the episodes' own task strings\n (their task label, else their instruction), one per distinct string,\n each with its own Task; takes without a string are unsorted."
          }
        },
        "description": "Task discovery: the upload's takes sorted into tasks, each with its own\n matched Task or draft."
      },
      "qualia.v1.Preparation_TaskMatch": {
        "type": "object",
        "properties": {
          "matched": {
            "type": "boolean",
            "description": "True when a published Task matched; false when the run drafted one."
          },
          "task": {
            "type": "string",
            "description": "tasks/{task}: the matched Task, or the draft."
          },
          "revision": {
            "type": "integer",
            "description": "The matched revision; 0 for a draft.",
            "format": "int32"
          },
          "score": {
            "type": "number",
            "description": "Match score, 0 to 1 (0 for a draft).",
            "format": "double"
          },
          "basis": {
            "type": "string",
            "description": "One line on what the score rests on."
          },
          "candidates": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.TaskMatch_Candidate"
            },
            "description": "The top candidates, best first (at most 5)."
          },
          "event": {
            "type": "string",
            "description": "The TASK_ASSIGNED event that applied the match; empty when not applied."
          },
          "assignedCount": {
            "type": "integer",
            "description": "How many episodes the match was applied to.",
            "format": "int32"
          },
          "undone": {
            "type": "boolean",
            "description": "True once that event was undone."
          },
          "revertingEvent": {
            "type": "string",
            "description": "The event that undid it."
          },
          "displayName": {
            "type": "string",
            "description": "The Task's name."
          }
        },
        "description": "The Task the run matched and applied, or the one it drafted."
      },
      "qualia.v1.Preparation_TaskStrings": {
        "type": "object",
        "properties": {
          "state": {
            "type": "string",
            "description": "none, outcome_split, single, too_many, sparse, codes or informative."
          },
          "reason": {
            "type": "string",
            "description": "One line on why."
          },
          "offered": {
            "type": "boolean",
            "description": "The rule offers the names (informative)."
          },
          "confirmable": {
            "type": "boolean",
            "description": "A person may confirm them (informative, sparse)."
          },
          "candidates": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.TaskStrings_Candidate"
            },
            "description": "One per distinct name, most episodes first."
          }
        },
        "description": "The dataset's own task names (from its metadata) and the decisions on them."
      },
      "qualia.v1.Preparation_UnpublishedAnnotation": {
        "type": "object",
        "properties": {
          "episode": {
            "type": "string",
            "description": "accounts/{account}/datasets/{dataset}/episodes/{episode}"
          },
          "reason": {
            "type": "string",
            "description": "Why, as the run recorded it."
          }
        },
        "description": "A take whose proposed annotation did not publish."
      },
      "qualia.v1.PrepareRobotModelImportRequest": {
        "required": [
          "name",
          "filename",
          "sizeBytes"
        ],
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "accounts/{account}/robots/{robot}/model"
          },
          "filename": {
            "type": "string",
            "description": "The file name it was picked as, e.g. \"openarm_v20.urdf\" or \"rizon.zip\":\n the URDF alone, or a .zip of the URDF and its meshes (the package\n directory)."
          },
          "sizeBytes": {
            "type": "string",
            "description": "Its size in bytes; at most 256 MiB (268435456), else INVALID_ARGUMENT.\n The bucket refuses uploads over 256 MiB, and ImportRobotModel refuses an\n upload whose stored size differs from this one."
          }
        },
        "description": "Request for Robots.PrepareRobotModelImport."
      },
      "qualia.v1.PrepareRobotModelImportResponse": {
        "type": "object",
        "properties": {
          "uploadUri": {
            "type": "string",
            "description": "Signed URL to PUT the file to, valid for 2 hours (the lifetime Supabase\n Storage fixes for signed upload URLs)."
          },
          "object": {
            "type": "string",
            "description": "The object reference to pass to ImportRobotModel."
          },
          "expireTime": {
            "type": "string",
            "description": "When upload_uri stops working.",
            "format": "date-time"
          }
        },
        "description": "Response for Robots.PrepareRobotModelImport."
      },
      "qualia.v1.Procedure": {
        "type": "object",
        "properties": {
          "steps": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.Step"
            },
            "description": "The steps. Step ids are the stable names judgments, subtask labels and\n progress report against. At most 64."
          },
          "transitions": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.Transition"
            },
            "description": "How steps follow each other, each from one step to another; nothing is\n implied. A failure outcome that can happen at several steps has a\n transition from each. At most 256."
          },
          "procedureSet": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.PersonSet"
              }
            ],
            "description": "The signed-in person whose edit wrote these steps and transitions.\n Written only by the server, on any UpdateTask from such a person that\n changes them. An API key's change or a new proposal from preparation\n clears it. Unset on a draft, the step-order check reads uncertain instead\n of failing a take. It is left out of `content_hash`."
          }
        },
        "description": "The task as a state machine: where an attempt starts, the actions it\n takes and the outcomes it ends in. Optional, and a layer over the prose:\n the prose says what the task is, the procedure gives checks, subtask labels\n and progress stable names to report against. A procedure that has steps is\n checked when the task is published: one start step, at least one success\n outcome, every step reachable from the start, no step that leads nowhere,\n nothing after an outcome, no loops, and no task that contains itself."
      },
      "qualia.v1.PublishTaskRequest": {
        "required": [
          "name"
        ],
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "accounts/{account}/tasks/{task}"
          },
          "etag": {
            "type": "string",
            "description": "The task's etag as read; publishing refuses (ABORTED) a draft that\n changed since, so what was reviewed is what is published."
          },
          "note": {
            "type": "string",
            "description": "What changed, for the revision history. At most 1000 characters."
          }
        },
        "description": "Request for Tasks.PublishTask."
      },
      "qualia.v1.PublishVersionPreviewRequest": {
        "required": [
          "name",
          "versionId"
        ],
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "accounts/{account}/datasets/{dataset}/versionPreviews/{version_preview}"
          },
          "versionId": {
            "type": "string",
            "description": "The tag name, as CreateVersionRequest.version_id has it."
          },
          "note": {
            "type": "string",
            "description": "The tag's note."
          },
          "requestId": {
            "type": "string",
            "description": "Idempotency key (AIP-155): a retry with the same id within 24 hours\n answers as the first call did instead of failing ALREADY_EXISTS."
          }
        },
        "description": "Request for Versions.PublishVersionPreview."
      },
      "qualia.v1.ReachArmBound": {
        "type": "object",
        "properties": {
          "side": {
            "enum": [
              "SIDE_UNSPECIFIED",
              "SIDE_LEFT",
              "SIDE_RIGHT"
            ],
            "type": "string",
            "description": "Configured arm side.",
            "format": "enum"
          },
          "shoulderJoint": {
            "type": "string",
            "description": "Actual first independent arm joint."
          },
          "parentLink": {
            "type": "string",
            "description": "Parent link containing the shoulder origin."
          },
          "shoulderOriginMeters": {
            "type": "array",
            "items": {
              "type": "number",
              "format": "double"
            },
            "description": "Three metres in that parent link's frame."
          },
          "radiusMeters": {
            "type": "number",
            "description": "Sum of downstream translation lengths and tool offset; finite prismatic\n excursion is included. Inside this sphere does not establish reachability.",
            "format": "double"
          },
          "baseFixedAnchor": {
            "type": "boolean",
            "description": "Only a base-fixed anchor can prove global beyond-chain reach."
          }
        },
        "description": "A conservative outer sphere derived from the configured URDF chain/tool."
      },
      "qualia.v1.ReachBeyondReach": {
        "type": "object",
        "properties": {
          "distanceMeters": {
            "type": "number",
            "description": "Target distance from the shoulder, metres.",
            "format": "double"
          },
          "radiusMeters": {
            "type": "number",
            "description": "Conservative chain radius, metres.",
            "format": "double"
          },
          "excessMeters": {
            "type": "number",
            "description": "Target distance minus radius minus the existing position tolerance.",
            "format": "double"
          }
        },
        "description": "A target outside a proved fixed-anchor bound by more than reached tolerance."
      },
      "qualia.v1.ReachCollisionCoverage": {
        "type": "object",
        "properties": {
          "state": {
            "type": "string",
            "description": "checked_configured_pairs, partial, or unavailable."
          },
          "totalRows": {
            "type": "integer",
            "description": "Original source rows.",
            "format": "int32"
          },
          "evaluatedRows": {
            "type": "integer",
            "description": "Valid rows evaluated against all available configured pairs.",
            "format": "int32"
          },
          "unavailableReasons": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Concrete missing geometry, explicit home or row-jaw inputs."
          },
          "homeExcludedPairs": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.ReachCollisionPair"
            },
            "description": "Exact pairs excluded because they touch at explicitly configured home."
          }
        },
        "description": "Availability of configured capsule-pair measurements, never a mesh-safety claim."
      },
      "qualia.v1.ReachCollisionPair": {
        "type": "object",
        "properties": {
          "linkA": {
            "type": "string",
            "description": "First link in the configured pair."
          },
          "linkB": {
            "type": "string",
            "description": "Second link in the configured pair."
          }
        },
        "description": "A configured capsule pair, named exactly as its URDF links."
      },
      "qualia.v1.ReachCollisionStretch": {
        "type": "object",
        "properties": {
          "category": {
            "type": "string",
            "description": "grippers_collide, hits_body, arms_collide, or uncategorized links_collide."
          },
          "startSeconds": {
            "type": "number",
            "description": "Start on the take's unchanged timeline, seconds.",
            "format": "double"
          },
          "durationSeconds": {
            "type": "number",
            "description": "Duration on the take's unchanged timeline, seconds.",
            "format": "double"
          },
          "firstPair": {
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.ReachCollisionPair"
              }
            ],
            "description": "Links that met first in this stretch."
          },
          "minimumSignedGapMeters": {
            "type": "number",
            "description": "Most negative signed capsule clearance, metres.",
            "format": "double"
          },
          "stretchCount": {
            "type": "integer",
            "description": "Number of stretches in this category. The other fields describe its longest.",
            "format": "int32"
          }
        },
        "description": "One positive-duration stretch of measured capsule penetration."
      },
      "qualia.v1.ReachDiagnostics": {
        "type": "object",
        "properties": {
          "collisionCoverage": {
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.ReachCollisionCoverage"
              }
            ],
            "description": "Missing geometry or home/jaw input never establishes collision-free output."
          },
          "collisions": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.ReachCollisionStretch"
            },
            "description": "Every collision stretch, measured before trace decimation."
          },
          "armBounds": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.ReachArmBound"
            },
            "description": "Conservative shoulder bounds, where provable from the configured model."
          }
        },
        "description": "Small optional result detail; posture arrays remain in the trace artifact."
      },
      "qualia.v1.ReachFrameDiagnostics": {
        "type": "object",
        "properties": {
          "sides": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.ReachSideDiagnostics"
            },
            "description": "Only hands that missed their target in this row."
          }
        },
        "description": "Causes measured at the exact retained input row."
      },
      "qualia.v1.ReachHeldJoint": {
        "type": "object",
        "properties": {
          "joint": {
            "type": "string",
            "description": "Actual URDF joint and the link it turns."
          },
          "childLink": {
            "type": "string",
            "description": "Actual URDF child link."
          },
          "bound": {
            "type": "string",
            "description": "\"lower\" or \"upper\"."
          },
          "position": {
            "type": "number",
            "description": "Measured position in radians (metres for prismatic).",
            "format": "double"
          },
          "limit": {
            "type": "number",
            "description": "The active URDF limit, in the same native joint unit.",
            "format": "double"
          },
          "outwardErrorDecrease": {
            "type": "number",
            "description": "Decrease of tolerance-normalized squared error per native joint unit in\n the direction beyond this bound. Positive, measured from actual FK.",
            "format": "double"
          }
        },
        "description": "A finite active joint bound whose outward differential reduces target error.\n This is local constraint evidence, not proof that every IK branch fails."
      },
      "qualia.v1.ReachPoseGap": {
        "type": "object",
        "properties": {
          "startFrame": {
            "type": "integer",
            "description": "First original input row, zero based.",
            "format": "int32"
          },
          "frameCount": {
            "type": "integer",
            "description": "Consecutive missing-pose rows in this interval.",
            "format": "int32"
          },
          "startSeconds": {
            "type": "number",
            "description": "Start on the original take's clock, derived from its FPS.",
            "format": "double"
          },
          "durationSeconds": {
            "type": "number",
            "description": "Length on that clock; the end is exclusive.",
            "format": "double"
          }
        },
        "description": "A gap in the original take's pose coverage, independent of sampled postures."
      },
      "qualia.v1.ReachRun": {
        "type": "object",
        "properties": {
          "operation": {
            "readOnly": true,
            "type": "string",
            "description": "accounts/{account}/operations/{operation}: the RunCheck that recorded it."
          },
          "key": {
            "readOnly": true,
            "type": "string",
            "description": "The key its results are stored under (ReachStatus.current_key)."
          },
          "settings": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.ReachSettings"
              }
            ],
            "description": "What it was keyed with, resolved: the solver is PYROKI, DLS or MINK and base_m\n has three numbers."
          },
          "robot": {
            "readOnly": true,
            "type": "string",
            "description": "accounts/{account}/robots/{robot}: the target robot it ran on."
          },
          "requestTime": {
            "readOnly": true,
            "type": "string",
            "description": "When Run solver was pressed.",
            "format": "date-time"
          },
          "state": {
            "readOnly": true,
            "enum": [
              "STATE_UNSPECIFIED",
              "REQUESTED",
              "RUNNING",
              "SUCCEEDED",
              "FAILED",
              "CANCELLED"
            ],
            "type": "string",
            "description": "Where it stands.",
            "format": "enum"
          },
          "total": {
            "readOnly": true,
            "type": "integer",
            "description": "The takes it covers (handheld and egocentric episodes that carry hand\n poses): those of the dataset when it was pressed\n (or the selection), the ones answered from stored results included.",
            "format": "int32"
          },
          "done": {
            "readOnly": true,
            "type": "integer",
            "description": "Takes with a result.",
            "format": "int32"
          },
          "failed": {
            "readOnly": true,
            "type": "integer",
            "description": "Takes that could not be solved.",
            "format": "int32"
          },
          "note": {
            "readOnly": true,
            "type": "string",
            "description": "Why a run that stands REQUESTED or RUNNING has not moved, or why it was\n given up, in a sentence a person reads (\"waiting for the reach service\",\n \"some takes are not ready yet\", \"the robot model changed; run again\").\n Empty while it is moving."
          }
        },
        "description": "One press of Run solver: a RunCheck on `checks/reach`, as the dataset\n recorded it."
      },
      "qualia.v1.ReachSettings": {
        "type": "object",
        "properties": {
          "solver": {
            "enum": [
              "SOLVER_UNSPECIFIED",
              "PYROKI",
              "DLS",
              "MINK"
            ],
            "type": "string",
            "description": "The IK solver the dataset is solved with: always its target robot's, and\n set only on a status read (a run's resolved settings). A dataset does not\n pick one: a request that names a solver here (UpdateDataset, CreateDataset)\n is refused with INVALID_ARGUMENT (\"a dataset uses its robot's solver;\n change it on the robot's Solver page\"), and a solver stored on a dataset\n before that is ignored. A robot with no solver cannot be solved on.",
            "format": "enum"
          },
          "baseM": {
            "type": "array",
            "items": {
              "type": "number",
              "format": "double"
            },
            "description": "Where the takes' start sits from the relaxed grippers' midpoint, metres\n in the robot's base frame (x forward, y left, z up): empty or exactly\n three numbers, each finite and within 5 m either way. Empty follows the\n target robot model's `reach_base`, else 0, 0, 0. Stored to 0.1 mm and\n applied to both hand paths as one rigid translation from the robot's home\n hand midpoint."
          },
          "homeHeadingRad": {
            "type": "number",
            "description": "Rotate both paired paths around world up before placing their first-row\n midpoint at the shared home reference. Radians; finite and within +/- pi.\n The robot base remains at world (0, 0, 0).",
            "format": "double"
          },
          "poseSource": {
            "readOnly": true,
            "enum": [
              "POSES_AT_UNSPECIFIED",
              "ROOT",
              "TCP"
            ],
            "type": "string",
            "description": "Where the source episode's hand poses were recorded. Set by qds-api on\n reads; clients do not set it. TCP runs consume already-resolved TCP\n channels and never apply calibration again.",
            "format": "enum"
          },
          "calibrationDigest": {
            "readOnly": true,
            "type": "string",
            "description": "Digest of the TCP calibration already applied to the published upload,\n empty for root poses. Set by qds-api on reads."
          }
        },
        "description": "How a dataset's reach check is walked: where the takes\n start and which way they face. It is stored on the dataset, so two datasets\n over one robot keep their own, and it is part of the key a reach result is\n stored under: a result is shared by every dataset that asks the same\n question (same robot config, solver, base and walk), and a change here\n leaves the old results as they are until the next RunCheck on\n `checks/reach`. The solver is not a dataset's to choose: a dataset uses its\n robot's, tuned in the robot's solver file.\n\n Served by qds-api."
      },
      "qualia.v1.ReachSideDiagnostics": {
        "type": "object",
        "properties": {
          "side": {
            "enum": [
              "SIDE_UNSPECIFIED",
              "SIDE_LEFT",
              "SIDE_RIGHT"
            ],
            "type": "string",
            "description": "Configured hand side.",
            "format": "enum"
          },
          "heldJoints": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.ReachHeldJoint"
            },
            "description": "Locally limiting joints, with actual URDF attribution."
          },
          "beyondChainReach": {
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.ReachBeyondReach"
              }
            ],
            "description": "Present only when a finite fixed-anchor outer bound proves the excess."
          },
          "residualSolverMiss": {
            "type": "boolean",
            "description": "Solver left a miss without either of the measured causes above."
          }
        },
        "description": "Factual diagnostics for one missed hand at one sampled posture."
      },
      "qualia.v1.ReachSpanDiagnostics": {
        "type": "object",
        "properties": {
          "positionToleranceMeters": {
            "type": "number",
            "description": "Existing solver-specific position threshold, metres.",
            "format": "double"
          },
          "rotationToleranceRadians": {
            "type": "number",
            "description": "Existing rotation threshold, radians.",
            "format": "double"
          },
          "positionExcessMeters": {
            "type": "number",
            "description": "Worst measured miss beyond that position threshold; zero for rotation-only.",
            "format": "double"
          },
          "rotationExcessRadians": {
            "type": "number",
            "description": "Worst measured miss beyond that rotation threshold.",
            "format": "double"
          },
          "heldJoints": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.ReachHeldJoint"
            },
            "description": "Measured limiting joints observed during the stretch."
          },
          "beyondChainReach": {
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.ReachBeyondReach"
              }
            ],
            "description": "Largest proved beyond-chain excess observed during the stretch."
          },
          "residualSolverRows": {
            "type": "integer",
            "description": "Rows with residual solver misses and no measured bound/length cause.",
            "format": "int32"
          },
          "invalidPostureRows": {
            "type": "integer",
            "description": "Unavailable solver rows; they do not supply a fabricated physical miss.",
            "format": "int32"
          }
        },
        "description": "Aggregated measurements over one existing out-of-reach stretch."
      },
      "qualia.v1.ReachStatus": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "accounts/{account}/datasets/{dataset}/reachStatus"
          },
          "settings": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.ReachSettings"
              }
            ],
            "description": "The settings a RunCheck on `checks/reach` would use now, resolved: the\n target robot's solver, and the dataset's base and heading, else the robot\n model's reach_base, else 0, 0, 0. A dataset has no solver of its own, and\n there is no default solver: `solver` is SOLVER_UNSPECIFIED whenever none\n was resolved (no target robot, the robot removed, without a model or in\n another workspace, a robot without a solver, or fleet could not be\n asked)."
          },
          "currentKey": {
            "readOnly": true,
            "type": "string",
            "description": "The reach key those settings make with the target robot's current model\n config. Empty when the dataset has no target robot, the robot cannot be\n solved against (removed, no model, no solver, in another workspace), a\n merged dataset's uploads hold their poses at different frames, or fleet\n could not be asked."
          },
          "lastRun": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.ReachRun"
              }
            ],
            "description": "The newest run of any state; unset until the first press."
          },
          "lastFinishedRun": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.ReachRun"
              }
            ],
            "description": "The newest run that ended (SUCCEEDED, FAILED or CANCELLED); unset until\n one has."
          },
          "stale": {
            "readOnly": true,
            "type": "boolean",
            "description": "Whether last_run was made under another key than current_key: the\n target robot, model, placement, pose frame or calibration changed since,\n and a RunCheck would compute something new. Nothing runs by itself."
          },
          "targetRobot": {
            "readOnly": true,
            "type": "string",
            "description": "accounts/{account}/robots/{robot}; empty if no target robot is assigned."
          }
        },
        "description": "Where a dataset's reach check stands (Checks.GetReachStatus): one per\n dataset, always there. Reading it writes nothing and asks for no run.\n\n Served by qds-api."
      },
      "qualia.v1.ReachTraceFrame": {
        "type": "object",
        "properties": {
          "index": {
            "type": "integer",
            "description": "Index in the original take, before the trace's bounded stride.",
            "format": "int32"
          },
          "seconds": {
            "type": "number",
            "description": "Seconds from the start of the take.",
            "format": "double"
          },
          "jointPositions": {
            "type": "array",
            "items": {
              "type": "number",
              "format": "double"
            },
            "description": "One position per response joint_names, in URDF joint order."
          },
          "reachable": {
            "type": "boolean",
            "description": "Whether every targeted hand pose in this frame met the reach tolerance."
          },
          "valid": {
            "type": "boolean",
            "description": "False means the frame must not be replayed as a solved posture."
          },
          "diagnostics": {
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.ReachFrameDiagnostics"
              }
            ],
            "description": "Local measured causes at this exact sampled row, never interpolated."
          }
        },
        "description": "One frame of a solver posture trace."
      },
      "qualia.v1.Reach_Stretch": {
        "type": "object",
        "properties": {
          "side": {
            "enum": [
              "SIDE_UNSPECIFIED",
              "SIDE_LEFT",
              "SIDE_RIGHT"
            ],
            "type": "string",
            "description": "Which hand.",
            "format": "enum"
          },
          "startSeconds": {
            "type": "number",
            "description": "Start, seconds from the start of the recording.",
            "format": "double"
          },
          "durationSeconds": {
            "type": "number",
            "description": "How long.",
            "format": "double"
          },
          "positionErrorMeters": {
            "type": "number",
            "description": "Worst position miss, metres.",
            "format": "double"
          },
          "rotationErrorRadians": {
            "type": "number",
            "description": "Worst rotation miss, radians.",
            "format": "double"
          },
          "diagnostics": {
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.ReachSpanDiagnostics"
              }
            ],
            "description": "Measured causes and excess over the unchanged reached tolerances."
          }
        },
        "description": "One stretch the robot cannot follow."
      },
      "qualia.v1.Reach_TraceRef": {
        "type": "object",
        "properties": {
          "key": {
            "type": "string",
            "description": "Current reach key this trace belongs to."
          },
          "sourceRun": {
            "type": "string",
            "description": "Pipeline run that owns the separate `reach_trace` artifact."
          },
          "frameCount": {
            "type": "integer",
            "description": "Original input rows; samples retain their source index.",
            "format": "int32"
          },
          "sampleEvery": {
            "type": "integer",
            "description": "Number of original input rows between retained solver frames.",
            "format": "int32"
          },
          "fps": {
            "type": "number",
            "description": "Source take's frames per second.",
            "format": "double"
          },
          "jointNames": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Solver order is exactly Robot.joints.actuated_names (URDF order).\n Revolute values are radians; prismatic values are metres."
          },
          "homeMidpointM": {
            "type": "array",
            "items": {
              "type": "number",
              "format": "double"
            },
            "description": "Home hand midpoint in metres, in the fixed robot base frame."
          },
          "placementDigest": {
            "type": "string",
            "description": "Digest of the fixed-base placement settings."
          },
          "poseSource": {
            "enum": [
              "POSES_AT_UNSPECIFIED",
              "ROOT",
              "TCP"
            ],
            "type": "string",
            "description": "Where the source hand poses were recorded.",
            "format": "enum"
          },
          "calibrationDigest": {
            "type": "string",
            "description": "Calibration digest already applied to TCP channels, empty at root."
          },
          "diagnosticVersion": {
            "type": "integer",
            "description": "Zero on legacy traces; one carries optional measured diagnostics.",
            "format": "int32"
          },
          "diagnosticBytes": {
            "type": "integer",
            "description": "Serialized optional diagnostic bytes in the bounded artifact, used\n alongside frame/joint counts for conservative batch read budgets.",
            "format": "int32"
          },
          "sourceMidpointM": {
            "type": "array",
            "items": {
              "type": "number",
              "format": "double"
            },
            "description": "Exact midpoint of the first simultaneous posed source row. Walk 5\n uses this single placement anchor even when display samples omit it."
          }
        },
        "description": "Metadata for a bounded solver posture trace. Joint samples are read\n separately with ReadReachTrace and never included in list results."
      },
      "qualia.v1.ReadActivityActorsResponse": {
        "type": "object",
        "properties": {
          "actors": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.ActivityActorName"
            },
            "description": "Missing records or names are omitted; absence never proves deletion."
          },
          "credentials": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.ActivityCredential"
            },
            "description": "One entry per requested event that recorded a key the platform let the\n caller see. Omitted when the key is unknown, in another organization,\n outside the caller's access, or the platform is unreachable."
          }
        },
        "description": "Only names recorded for people without credential evidence, plus the\n current, platform-authorized metadata of recorded keys."
      },
      "qualia.v1.ReadActivityDetailsResponse": {
        "type": "object",
        "properties": {
          "targets": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.ActivityTarget"
            },
            "description": "Recorded targets in immutable order, never a search of today's selection."
          },
          "event": {
            "type": "string",
            "description": "Canonical action identity."
          },
          "dataset": {
            "type": "string",
            "description": "Scope recorded by the producer."
          },
          "currentDatasetLabel": {
            "type": "string",
            "description": "Current authorized dataset name; empty when unavailable."
          },
          "currentDatasetSlug": {
            "type": "string",
            "description": "Current authorized dataset slug; empty when unavailable."
          },
          "nextPageToken": {
            "type": "string",
            "description": "Empty when the recorded target list ends."
          },
          "unavailable": {
            "type": "boolean",
            "description": "True when dataset access could not be established. Does not imply deletion."
          },
          "originalBatchUnknown": {
            "type": "boolean",
            "description": "Historical action membership was not recorded for these individual events."
          },
          "changes": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.ActivityFieldChange"
            },
            "description": "Safe recorded field changes: dataset fields, or an episode task link that\n moved without a new revision. Never ingest configuration JSON."
          },
          "requestRecorded": {
            "type": "boolean",
            "description": "True for a durable request manifest, even when its exact count is unknown."
          },
          "checks": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Requested checks, without child run or findings counts."
          },
          "admissionOperation": {
            "type": "string",
            "description": "Typed admitted re-ingest operation UUID, when recorded."
          }
        },
        "description": "Recorded evidence, with current target metadata separately identified."
      },
      "qualia.v1.ReadReachTraceItem": {
        "type": "object",
        "properties": {
          "result": {
            "type": "string",
            "description": "The exact result name from the request."
          },
          "state": {
            "readOnly": true,
            "enum": [
              "STATE_UNSPECIFIED",
              "AVAILABLE",
              "STALE",
              "NOT_FOUND",
              "UNAVAILABLE"
            ],
            "type": "string",
            "description": "AVAILABLE has a trace; STALE, NOT_FOUND and UNAVAILABLE never do.",
            "format": "enum"
          },
          "trace": {
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.ReadReachTraceResponse"
              }
            ],
            "description": "The sampled solver trace, present only when state is AVAILABLE."
          }
        },
        "description": "One result in Checks.ReadReachTraces."
      },
      "qualia.v1.ReadReachTraceResponse": {
        "type": "object",
        "properties": {
          "key": {
            "type": "string",
            "description": "The current reach key this trace belongs to."
          },
          "robot": {
            "type": "string",
            "description": "The target robot whose URDF joints appear in each frame."
          },
          "configDigest": {
            "type": "string",
            "description": "Robot model digest the solver used."
          },
          "poseSource": {
            "enum": [
              "POSES_AT_UNSPECIFIED",
              "ROOT",
              "TCP"
            ],
            "type": "string",
            "description": "Where the source hand poses were recorded.",
            "format": "enum"
          },
          "calibrationDigest": {
            "type": "string",
            "description": "Calibration digest already applied to TCP channels, empty at root."
          },
          "placementDigest": {
            "type": "string",
            "description": "Digest of the fixed-base placement settings."
          },
          "frameCount": {
            "type": "integer",
            "description": "Number of frames in the original take.",
            "format": "int32"
          },
          "sampleEvery": {
            "type": "integer",
            "description": "Number of original input rows between retained solver frames.",
            "format": "int32"
          },
          "fps": {
            "type": "number",
            "description": "Source take's frames per second.",
            "format": "double"
          },
          "jointNames": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Actuated URDF joints in the exact order used by each joint_positions row."
          },
          "homeMidpointM": {
            "type": "array",
            "items": {
              "type": "number",
              "format": "double"
            },
            "description": "Mean of both hand positions at solver home, in fixed-base metres."
          },
          "frames": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.ReachTraceFrame"
            },
            "description": "Bounded samples with original row indices and reach flags."
          },
          "armBounds": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.ReachArmBound"
            },
            "description": "Conservative URDF bounds, carried once rather than repeated in every row."
          },
          "gaps": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.ReachPoseGap"
            },
            "description": "Every missing-pose interval. Never interpolate a posture across one."
          }
        },
        "description": "A bounded sampled solver posture trace for one episode."
      },
      "qualia.v1.ReadReachTracesResponse": {
        "type": "object",
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.ReadReachTraceItem"
            },
            "description": "One entry per request name, in request order."
          }
        },
        "description": "Response for Checks.ReadReachTraces, in request order."
      },
      "qualia.v1.ReferenceRange": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "accounts/{account}/checks/{check}/referenceRanges/{reference_range}"
          },
          "interfaceHash": {
            "readOnly": true,
            "type": "string",
            "description": "The robot interface hash `b3:<hex>` the population shares."
          },
          "robot": {
            "readOnly": true,
            "type": "string",
            "description": "accounts/{account}/robots/{robot} when the population is narrowed to one\n fleet robot; empty for the whole interface."
          },
          "metric": {
            "readOnly": true,
            "type": "string",
            "description": "The metric, as an Episode.Metrics field name."
          },
          "quantiles": {
            "readOnly": true,
            "type": "array",
            "items": {
              "type": "number",
              "format": "double"
            },
            "description": "p05, p10, p25, p50, p75, p90, p95, p99."
          },
          "mad": {
            "readOnly": true,
            "type": "number",
            "description": "Median absolute deviation.",
            "format": "double"
          },
          "fenceLow": {
            "readOnly": true,
            "type": "number",
            "description": "The lower fence the checks use.",
            "format": "double"
          },
          "fenceHigh": {
            "readOnly": true,
            "type": "number",
            "description": "The upper fence the checks use.",
            "format": "double"
          },
          "sampleCount": {
            "readOnly": true,
            "type": "string",
            "description": "Episodes in the population."
          },
          "computeTime": {
            "readOnly": true,
            "type": "string",
            "description": "When it was computed.",
            "format": "date-time"
          },
          "confirmedLow": {
            "readOnly": true,
            "type": "number",
            "description": "Human-confirmed bounds. Each side is independent; calibration preserves them.",
            "format": "double"
          },
          "confirmedHigh": {
            "readOnly": true,
            "type": "number",
            "description": "Independently confirmed upper bound.",
            "format": "double"
          },
          "confirmedBy": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Actor"
              }
            ],
            "description": "Who confirmed the bounds and when. Absent after clearing them."
          },
          "confirmedAt": {
            "readOnly": true,
            "type": "string",
            "description": "When the bounds were confirmed.",
            "format": "date-time"
          }
        },
        "description": "A robot's reference range for one metric: the quantiles of its\n own episodes, so each episode is checked against its own robot's takes and\n checks stay meaningful across mixed rigs. The population is every KEPT or\n UNREVIEWED episode of the workspace on the same robot interface, and a\n workspace lists and reads only its own ranges. The episode\n rules' configuration: only `checks/episode-rules` has them.\n\n Served by qds-api."
      },
      "qualia.v1.ReferenceRangeSwitch": {
        "type": "object",
        "properties": {
          "sourceRanges": {
            "type": "string",
            "description": "Ranges in the source workspace, which no longer apply."
          },
          "targetRanges": {
            "type": "string",
            "description": "Ranges in the target workspace, which apply from now on."
          }
        },
        "description": "Reference ranges belong to a workspace. These count the ranges of the moved\n uploads' interfaces on each side. Both 0 for a mixture, which moves no upload."
      },
      "qualia.v1.Reingest": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "accounts/{account}/datasets/{dataset}/reingests/{reingest}"
          },
          "state": {
            "readOnly": true,
            "enum": [
              "STATE_UNSPECIFIED",
              "QUEUED",
              "PREPARING",
              "PUBLISHING",
              "SUCCEEDED",
              "FAILED"
            ],
            "type": "string",
            "description": "Where the work stands.",
            "format": "enum"
          },
          "unchanged": {
            "readOnly": true,
            "type": "boolean",
            "description": "The posted config was the published one: nothing ran, and this names\n the publication that already carries it."
          },
          "failureReason": {
            "readOnly": true,
            "type": "string",
            "description": "Why it failed; empty unless FAILED."
          },
          "progress": {
            "readOnly": true,
            "type": "object",
            "description": "While PREPARING: the live step, the same open set of fields the upload\n feed reports (step, detail, counters)."
          },
          "episodeCount": {
            "readOnly": true,
            "type": "string",
            "description": "Once SUCCEEDED: episodes in the published generation."
          },
          "frameCount": {
            "readOnly": true,
            "type": "string",
            "description": "Once SUCCEEDED: frames in the published generation."
          },
          "poseAttempt": {
            "readOnly": true,
            "type": "integer",
            "description": "Attempt currently preparing a pose move, or zero when cancellation is unavailable.",
            "format": "int32"
          },
          "publicationFailure": {
            "readOnly": true,
            "type": "string",
            "description": "Most recent safe publication failure while publishing, if any."
          },
          "recutResult": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.ReingestRecutResult"
              }
            ],
            "description": "Present only when a verified re-cut result committed atomically with\n this successful publication. Absence is not an empty/clean result."
          }
        },
        "description": "One re-ingest of an upload under a new meta/ingest.toml\n (Datasets.ReingestDataset)."
      },
      "qualia.v1.ReingestDatasetRequest": {
        "required": [
          "name"
        ],
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "accounts/{account}/datasets/{dataset}"
          },
          "ingestConfig": {
            "type": "string",
            "description": "Required unless resume_reingest is set. The complete meta/ingest.toml\n (schema = 1). It replaces the published\n file: a table the published file declared and this one leaves out is\n dropped. Declaring [episodes] spans re-cuts the upload (see\n ReingestDataset). With merged_settings_context this is instead a strict\n clock/alignment patch: only schema, clock and channels.<topic>.align are\n accepted. Omitted clock keeps it; empty [clock] resets clock/grid/source\n overrides to automatic. In a nonempty clock table, a supplied fixed_hz or\n row_clock_topic replaces the grid, and source changes only if supplied.\n Explicit align = \"nearest\" resets alignment; omitted topics keep theirs.\n Unknown/unrouted topics and every other key are refused. The server\n composes onto the exact captured head, retaining episode boundaries,\n rig, camera settings and per-channel timestamp offsets."
          },
          "mergedSettingsContext": {
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.MergedSettingsContext"
              }
            ],
            "description": "Explicitly confirmed MCAP clock/alignment edit of one merged member.\n Other config tables and episode boundaries must remain unchanged. Older\n callers without this context retain the existing member re-cut rules."
          },
          "requestId": {
            "type": "string",
            "description": "UUID retry key, required with merged_settings_context. A replay retains\n its original operation and membership scope, never today's membership."
          },
          "resumeReingest": {
            "type": "string",
            "description": "Resume this exact completed corrective publication. No ingest_config,\n request_id or merged_settings_context may accompany this operation."
          }
        },
        "description": "Request for Datasets.ReingestDataset."
      },
      "qualia.v1.ReingestDatasetResponse": {
        "type": "object",
        "properties": {
          "reingest": {
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Reingest"
              }
            ],
            "description": "The re-ingest it admitted (QUEUED), or with unchanged set, the\n publication that already carries the config (SUCCEEDED)."
          }
        },
        "description": "Response for Datasets.ReingestDataset."
      },
      "qualia.v1.ReingestNotCarried": {
        "type": "object",
        "properties": {
          "episode": {
            "readOnly": true,
            "type": "string",
            "description": "The old immutable original identity, even when absent from current head."
          },
          "episodeIndex": {
            "readOnly": true,
            "type": "string",
            "description": "Its recorded, zero-based number. Cut identities are never listed here."
          },
          "reason": {
            "readOnly": true,
            "enum": [
              "REASON_UNSPECIFIED",
              "FOOTAGE_CHANGED_OR_REMOVED",
              "RETURNED_AS_RECORDED"
            ],
            "type": "string",
            "description": "Why this old take is included in the result.",
            "format": "enum"
          },
          "personKeeps": {
            "readOnly": true,
            "type": "string",
            "description": "Person keeps retained on the old identities/audit, not reassigned."
          },
          "personRejects": {
            "readOnly": true,
            "type": "string",
            "description": "Person rejects retained on the old identities/audit, not reassigned."
          },
          "personIssues": {
            "readOnly": true,
            "type": "string",
            "description": "Issues raised by people and retained on the old identities/audit."
          },
          "personNotes": {
            "readOnly": true,
            "type": "string",
            "description": "Notes written by people and retained on the old identities/audit."
          },
          "reaches": {
            "readOnly": true,
            "type": "string",
            "description": "Reach records retained on the old identities/audit."
          },
          "drafts": {
            "readOnly": true,
            "type": "string",
            "description": "Saved drafts retained on the old identities/audit."
          },
          "appliedEdits": {
            "readOnly": true,
            "type": "string",
            "description": "Applied original edits reset by verified re-cut authority, at most one."
          },
          "appliedTrims": {
            "readOnly": true,
            "type": "string",
            "description": "Applied original trims reset; a subset of applied_edits."
          },
          "splitPieces": {
            "readOnly": true,
            "type": "string",
            "description": "Legacy split pieces removed from current head but retained on their audit."
          }
        },
        "description": "Exact state retained only on an old original identity and its audit after\n a verified re-cut. Counts include affected legacy children of that take."
      },
      "qualia.v1.ReingestRecutResult": {
        "type": "object",
        "properties": {
          "notCarriedCount": {
            "readOnly": true,
            "type": "string",
            "description": "Exact number of old original takes with state not carried. Zero means\n the verified publication lost no state; no such take is listed."
          },
          "publicationCommit": {
            "readOnly": true,
            "type": "string",
            "description": "Immutable publication commit, used to bind every page of the result."
          }
        },
        "description": "Summary of state not carried by one verified, finalized re-cut publication."
      },
      "qualia.v1.RejectEpisodesRequest": {
        "required": [
          "parent",
          "selection"
        ],
        "type": "object",
        "properties": {
          "parent": {
            "type": "string",
            "description": "accounts/{account}/datasets/{dataset}: the scope the reject is made in."
          },
          "selection": {
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.EpisodeSelection"
              }
            ],
            "description": "Which episodes."
          },
          "reason": {
            "type": "string",
            "description": "Optional words for the record."
          }
        },
        "description": "Request for Episodes.RejectEpisodes."
      },
      "qualia.v1.RejectEpisodesResponse": {
        "type": "object",
        "properties": {
          "result": {
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.RulingResult"
              }
            ],
            "description": "What happened."
          }
        },
        "description": "Response for Episodes.RejectEpisodes."
      },
      "qualia.v1.ReleaseEpisodeLeaseRequest": {
        "required": [
          "episode",
          "tab"
        ],
        "type": "object",
        "properties": {
          "episode": {
            "type": "string",
            "description": "accounts/{account}/datasets/{dataset}/episodes/{episode}"
          },
          "tab": {
            "type": "string",
            "description": "The tab that is leaving."
          }
        },
        "description": "Request for Episodes.ReleaseEpisodeLease."
      },
      "qualia.v1.ReleaseEpisodeLeaseResponse": {
        "type": "object",
        "properties": {},
        "description": "Response for Episodes.ReleaseEpisodeLease."
      },
      "qualia.v1.RelinkTaskRequest": {
        "required": [
          "name"
        ],
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "accounts/{account}/datasets/{dataset}: an upload or a merged dataset."
          },
          "validateOnly": {
            "type": "boolean",
            "description": "Relink nothing and start nothing: answer what a call would relink and\n the credit bound of the runs it would start."
          },
          "maxCost": {
            "type": "string",
            "description": "The most the graph run may reserve, in credits. Unset: the bound. Below\n the bound: FAILED_PRECONDITION, and nothing is relinked. 0 relinks only\n while no graph run would start: a preview's credit_bound of 0, confirmed."
          },
          "requestId": {
            "type": "string",
            "description": "A UUID naming this call for the heuristic run's admission, so a retry\n starts it once; empty: a new one."
          }
        },
        "description": "Request for Datasets.RelinkTask."
      },
      "qualia.v1.RelinkTaskResponse": {
        "type": "object",
        "properties": {
          "task": {
            "type": "string",
            "description": "accounts/{account}/tasks/{task}: the Task the dataset links."
          },
          "taskDisplayName": {
            "type": "string",
            "description": "The Task's display name, as its newest revision has it."
          },
          "previousRevision": {
            "type": "integer",
            "description": "The revision the dataset's link carried before; 0 when it was made while\n the Task was a draft.",
            "format": "int32"
          },
          "revision": {
            "type": "integer",
            "description": "The revision it carries now (with validate_only, would carry).",
            "format": "int32"
          },
          "relinkedEpisodeCount": {
            "type": "integer",
            "description": "Takes whose own link to the Task moved with it (or would).",
            "format": "int32"
          },
          "checkRuns": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "accounts/{account}/checks/{check}/runs/{run}: the runs started, heuristic\n first; empty with validate_only. The graph run is left out when it has\n nothing to read (no take with a published video)."
          },
          "creditBound": {
            "type": "string",
            "description": "The credit bound of the graph run: its estimate, what it may reserve at\n most. 0 when no graph run starts. Heuristic runs reserve nothing."
          }
        },
        "description": "Response for Datasets.RelinkTask."
      },
      "qualia.v1.RemapDatasetChannelsRequest": {
        "required": [
          "name",
          "renames"
        ],
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "accounts/{account}/datasets/{dataset}"
          },
          "renames": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            },
            "description": "Native channel name to canonical key, 1 to 512 entries. Keys are\n [left.|right.]{joint_N|gripper|shoulder_pan|...}.{pos|vel|eff|torque|\n current|temp} or [left.|right.]ee.{x|y|z|roll|pitch|yaw|qx|qy|qz|qw},\n each used once. qx..qw are a unit quaternion's parts (x, y, z, w), unit\n \"norm\". An empty key resets the channel to the key read from its name. A\n name's mapping also reaches its velocity and effort channels."
          }
        },
        "description": "Request for Datasets.RemapDatasetChannels."
      },
      "qualia.v1.RemapDatasetChannelsResponse": {
        "type": "object",
        "properties": {
          "interfaceHash": {
            "type": "string",
            "description": "The robot interface derived under the new renames, \"b3:<hex>\"; empty\n when it could not be derived yet (the renames are kept either way)."
          },
          "uploadsChanged": {
            "readOnly": true,
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Merged dataset only: the uploads a lens was written on, which are\n re-derived after the call returns (empty: they all keyed the channels as\n asked already). `interface_hash` is empty for a merged dataset."
          },
          "interfaceSettlement": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Dataset_InterfaceSettlement"
              }
            ],
            "description": "Merged dataset only: how far its uploads' interfaces have settled as the\n call commits (the same count as Dataset.interface_settlement)."
          }
        },
        "description": "Response for Datasets.RemapDatasetChannels."
      },
      "qualia.v1.RemoveMergedDatasetMemberRequest": {
        "required": [
          "name",
          "member",
          "membershipRevision"
        ],
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "The merged dataset."
          },
          "member": {
            "type": "string",
            "description": "The upload to remove from its current membership."
          },
          "membershipRevision": {
            "type": "string",
            "description": "From GetDataset.pose_preparation."
          }
        },
        "description": "Request to remove an upload from a merged dataset's current membership."
      },
      "qualia.v1.RenewEpisodeLeaseRequest": {
        "required": [
          "episode",
          "tab"
        ],
        "type": "object",
        "properties": {
          "episode": {
            "type": "string",
            "description": "accounts/{account}/datasets/{dataset}/episodes/{episode}"
          },
          "tab": {
            "type": "string",
            "description": "The tab that acquired it."
          }
        },
        "description": "Request for Episodes.RenewEpisodeLease."
      },
      "qualia.v1.RenewEpisodeLeaseResponse": {
        "type": "object",
        "properties": {
          "lease": {
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Episode_Lease"
              }
            ],
            "description": "The caller's lease, with its new expiry."
          }
        },
        "description": "Response for Episodes.RenewEpisodeLease."
      },
      "qualia.v1.ReopenIssuesRequest": {
        "required": [
          "parent",
          "selection"
        ],
        "type": "object",
        "properties": {
          "parent": {
            "type": "string",
            "description": "accounts/{account}/datasets/{dataset}"
          },
          "selection": {
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.IssueSelection"
              }
            ],
            "description": "Which issues; only DISMISSED ones are reopened."
          }
        },
        "description": "Request for Issues.ReopenIssues."
      },
      "qualia.v1.ReopenIssuesResponse": {
        "type": "object",
        "properties": {
          "reopenedCount": {
            "type": "integer",
            "description": "How many issues were reopened.",
            "format": "int32"
          },
          "lockedCount": {
            "type": "integer",
            "description": "Episodes whose issues were left as they were, because another person\n holds the episode's edit lease. Their issues are not in reopened_count.",
            "format": "int32"
          },
          "locked": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.LockedEpisode"
            },
            "description": "The first 100 of them, with their holders."
          }
        },
        "description": "Response for Issues.ReopenIssues."
      },
      "qualia.v1.Reply": {
        "required": [
          "text"
        ],
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "accounts/{account}/datasets/{dataset}/issues/{issue}/replies/{reply}"
          },
          "text": {
            "type": "string",
            "description": "What was said."
          },
          "author": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Actor"
              }
            ],
            "description": "Who said it."
          },
          "createTime": {
            "readOnly": true,
            "type": "string",
            "description": "When.",
            "format": "date-time"
          },
          "updateTime": {
            "readOnly": true,
            "type": "string",
            "description": "When last edited.",
            "format": "date-time"
          },
          "etag": {
            "type": "string",
            "description": "Sent back on UpdateReply; a stale etag fails with ABORTED."
          }
        },
        "description": "A reply under an issue or a note."
      },
      "qualia.v1.ResetEpisodesRequest": {
        "required": [
          "parent",
          "selection"
        ],
        "type": "object",
        "properties": {
          "parent": {
            "type": "string",
            "description": "accounts/{account}/datasets/{dataset}: the scope whose ruling is withdrawn."
          },
          "selection": {
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.EpisodeSelection"
              }
            ],
            "description": "Which episodes."
          }
        },
        "description": "Request for Episodes.ResetEpisodes."
      },
      "qualia.v1.ResetEpisodesResponse": {
        "type": "object",
        "properties": {
          "result": {
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.RulingResult"
              }
            ],
            "description": "What happened."
          }
        },
        "description": "Response for Episodes.ResetEpisodes."
      },
      "qualia.v1.ResolvePosesRequest": {
        "required": [
          "name",
          "posesAt"
        ],
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "accounts/{account}/datasets/{dataset}"
          },
          "posesAt": {
            "enum": [
              "POSES_AT_UNSPECIFIED",
              "ROOT",
              "TCP"
            ],
            "type": "string",
            "description": "TCP to resolve at the TCP (again, with a replaced calibration, when the\n upload is there already), ROOT to undo that. Unspecified is\n INVALID_ARGUMENT.",
            "format": "enum"
          },
          "calibration": {
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.TcpCalibration"
              }
            ],
            "description": "The calibration to resolve with: required for TCP, empty for ROOT. The\n caller supplies it, normally the calibration of the rig the upload was\n recognised as recorded on (Dataset.poses_rig; not a dataset label, those\n are editable, and not Episode.rig, which ingest may not have used), and\n it is recorded in the upload's\n meta/ingest.toml, so the upload does not follow the rig afterwards. Both\n hands, every number finite. INVALID_ARGUMENT otherwise."
          },
          "mergedSettingsContext": {
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.MergedSettingsContext"
              }
            ],
            "description": "Explicitly confirmed correction of one eligible LeRobot merged member.\n Its training adapter must consume observation.tcp and its own recognized\n rig supplies calibration; one rig's calibration must not be fanned out to\n heterogeneous uploads. Omitted retains the old merged-away restriction."
          },
          "requestId": {
            "type": "string",
            "description": "UUID retry key, required with merged_settings_context."
          },
          "validateOnly": {
            "type": "boolean",
            "description": "Merged datasets only: run the same per-upload admission checks without\n creating a lease or dispatching ingest. All blockers are returned by name;\n a later move rechecks them. Standalone uploads retain their existing API."
          },
          "members": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Merged only: retry these held uploads. Empty selects every current member."
          },
          "membershipRevision": {
            "type": "string",
            "description": "Required for a merged move (not validate_only), from GetDataset's\n pose_preparation. No caller calibration is accepted for merged datasets:\n the server reads each upload's own recognized rig's current calibration."
          },
          "expectedOperationId": {
            "type": "string",
            "description": "Resume only this existing pose operation; never admit a new move."
          }
        },
        "description": "Request for Datasets.ResolvePoses."
      },
      "qualia.v1.ResolvePosesResponse": {
        "type": "object",
        "properties": {
          "operationId": {
            "readOnly": true,
            "type": "string",
            "description": "The re-derive's operation id, to poll through\n GET /datasets/sync-status/{operation_id}. Empty when no_op is set."
          },
          "noOp": {
            "readOnly": true,
            "type": "boolean",
            "description": "True when nothing needed doing (the upload already stands as asked), so\n there is nothing to wait for."
          },
          "mergedPreparation": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.MergedPosePreparation"
              }
            ],
            "description": "Merged dataset only: one result per upload. Eligible uploads may proceed\n despite other blockers. Retry joins the same running work; no batch job\n or implicit pose move on a robot selection is created."
          }
        },
        "description": "Response for Datasets.ResolvePoses."
      },
      "qualia.v1.RestoreEpisodesRequest": {
        "required": [
          "parent",
          "selection",
          "reason"
        ],
        "type": "object",
        "properties": {
          "parent": {
            "type": "string",
            "description": "accounts/{account}/datasets/{dataset}: must be the upload."
          },
          "selection": {
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.EpisodeSelection"
              }
            ],
            "description": "Which episodes; only validation rejects are restored, the rest skipped."
          },
          "reason": {
            "type": "string",
            "description": "Why the check was wrong. Required and non-empty."
          }
        },
        "description": "Request for Episodes.RestoreEpisodes."
      },
      "qualia.v1.RestoreEpisodesResponse": {
        "type": "object",
        "properties": {
          "result": {
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.RulingResult"
              }
            ],
            "description": "What happened."
          }
        },
        "description": "Response for Episodes.RestoreEpisodes."
      },
      "qualia.v1.RevertMergeRequest": {
        "required": [
          "name",
          "mergeEvent"
        ],
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "accounts/{account}/datasets/{dataset}"
          },
          "mergeEvent": {
            "type": "string",
            "description": "The DATASETS_MERGED event to reverse."
          }
        },
        "description": "Request for Datasets.RemapDatasetChannels."
      },
      "qualia.v1.RevertMergeResponse": {
        "type": "object",
        "properties": {
          "dataset": {
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Dataset"
              }
            ],
            "description": "The merged dataset after the uploads were released. If its initial merge\n was reverted, its prior versions remain addressable by this resource name."
          },
          "uploads": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Uploads released by this revert."
          },
          "event": {
            "type": "string",
            "description": "The EVENT_REVERTED event."
          }
        },
        "description": "Response for Datasets.RevertMerge."
      },
      "qualia.v1.ReviewHealth_Group": {
        "type": "object",
        "properties": {
          "task": {
            "readOnly": true,
            "type": "string",
            "description": "The task's display name in the discovery."
          },
          "variant": {
            "readOnly": true,
            "type": "string",
            "description": "The variant's name; empty for a whole task."
          },
          "episodeCount": {
            "readOnly": true,
            "type": "integer",
            "description": "Its episodes in the run.",
            "format": "int32"
          },
          "removedCount": {
            "readOnly": true,
            "type": "integer",
            "description": "Of them, removals: a failing finding.",
            "format": "int32"
          },
          "mapSucceededCount": {
            "readOnly": true,
            "type": "integer",
            "description": "Of them, episodes the discovery map calls successful.",
            "format": "int32"
          },
          "referenceEpisodeIds": {
            "readOnly": true,
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "The SUCCESS references most of them were judged against, by episode\n id: a Task's reference can live in another dataset."
          }
        },
        "description": "A task (or variant) the contradiction rule fires on."
      },
      "qualia.v1.ReviewHealth_MissCheck": {
        "type": "object",
        "properties": {
          "episodes": {
            "readOnly": true,
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "The episodes shown, at most eight."
          },
          "restEpisodes": {
            "readOnly": true,
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "The rest of the queue, in removal-score order."
          },
          "poolCount": {
            "readOnly": true,
            "type": "integer",
            "description": "The whole queue.",
            "format": "int32"
          },
          "confirmCount": {
            "readOnly": true,
            "type": "integer",
            "description": "Removals among the shown episodes that say the rest likely go too\n (5).",
            "format": "int32"
          }
        },
        "description": "Kept episodes that rank next for removal, when the run keeps more\n than the map calls successful."
      },
      "qualia.v1.ReviewHealth_Question": {
        "type": "object",
        "properties": {
          "rule": {
            "readOnly": true,
            "type": "string",
            "description": "The rule that asks it: \"contradiction\" (tasks may be mixed),\n \"under_removal\", \"over_removal\" or \"outcome_data\"."
          },
          "question": {
            "readOnly": true,
            "type": "string",
            "description": "The question, in a sentence."
          },
          "detail": {
            "readOnly": true,
            "type": "string",
            "description": "Why it is asked, with the numbers."
          },
          "groups": {
            "readOnly": true,
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.ReviewHealth_Group"
            },
            "description": "contradiction: the tasks it fires on."
          },
          "episodes": {
            "readOnly": true,
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Example episodes."
          },
          "action": {
            "readOnly": true,
            "type": "string",
            "description": "Where it is answered: \"tasks\" (the task grouping and the\n references), \"miss_check\" (the miss check below), or empty."
          }
        },
        "description": "One question for a person, with example episodes."
      },
      "qualia.v1.ReviewHealth_SpotCheck": {
        "type": "object",
        "properties": {
          "episodes": {
            "readOnly": true,
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "The episodes, at most ten, picked reproducibly from the pool."
          },
          "poolCount": {
            "readOnly": true,
            "type": "integer",
            "description": "Every removal the map calls successful.",
            "format": "int32"
          },
          "flagErrorCount": {
            "readOnly": true,
            "type": "integer",
            "description": "Wrong removals among the episodes that say the references or the\n Task may not fit the dataset (4).",
            "format": "int32"
          }
        },
        "description": "Removals the discovery map calls successful, for a person to open:\n keeping one says the run was wrong to remove it."
      },
      "qualia.v1.ReviewHealth_TaskRow": {
        "type": "object",
        "properties": {
          "task": {
            "readOnly": true,
            "type": "string",
            "description": "The task's display name in the discovery, else the Task's label."
          },
          "episodeCount": {
            "readOnly": true,
            "type": "integer",
            "description": "Its episodes in the run.",
            "format": "int32"
          },
          "removedCount": {
            "readOnly": true,
            "type": "integer",
            "description": "Of them, removals.",
            "format": "int32"
          },
          "mapSucceededCount": {
            "readOnly": true,
            "type": "integer",
            "description": "Of them, episodes the discovery map calls successful.",
            "format": "int32"
          },
          "removalRate": {
            "readOnly": true,
            "type": "number",
            "description": "removed_count / episode_count.",
            "format": "double"
          },
          "mapSucceededShare": {
            "readOnly": true,
            "type": "number",
            "description": "map_succeeded_count / episode_count.",
            "format": "double"
          },
          "gap": {
            "readOnly": true,
            "type": "number",
            "description": "The kept share less the share the map calls successful.",
            "format": "double"
          }
        },
        "description": "One task's numbers."
      },
      "qualia.v1.ReviewSuggestionsRequest": {
        "required": [
          "parent",
          "selection",
          "review"
        ],
        "type": "object",
        "properties": {
          "parent": {
            "type": "string",
            "description": "accounts/{account}/datasets/{dataset}"
          },
          "selection": {
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.EpisodeSelection"
              }
            ],
            "description": "Which episodes."
          },
          "origin": {
            "enum": [
              "ORIGIN_UNSPECIFIED",
              "HUMAN",
              "MODEL",
              "HEURISTIC"
            ],
            "type": "string",
            "description": "Only spans of this origin (MODEL or HEURISTIC); unset means both.",
            "format": "enum"
          },
          "review": {
            "enum": [
              "REVIEW_UNSPECIFIED",
              "PROPOSED",
              "ACCEPTED",
              "REJECTED"
            ],
            "type": "string",
            "description": "ACCEPTED or REJECTED.",
            "format": "enum"
          },
          "requestId": {
            "type": "string",
            "description": "Optional UUID4 identifying this logical edit. Reusing it with the same\n caller and request returns the original result; different input conflicts.\n When absent, each call starts a new logical edit."
          }
        },
        "description": "Request for Episodes.ReviewSuggestions."
      },
      "qualia.v1.ReviewSuggestionsResponse": {
        "type": "object",
        "properties": {
          "episodeCount": {
            "type": "integer",
            "description": "Episodes that had a span settled.",
            "format": "int32"
          },
          "spanCount": {
            "type": "integer",
            "description": "Spans settled.",
            "format": "int32"
          }
        },
        "description": "Response for Episodes.ReviewSuggestions."
      },
      "qualia.v1.Rig": {
        "required": [
          "displayName",
          "key",
          "kind"
        ],
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "accounts/{account}/rigs/{rig}"
          },
          "displayName": {
            "type": "string",
            "description": "Human name."
          },
          "key": {
            "type": "string",
            "description": "What recordings carry as their rig id (meta/ingest.toml, LeRobot\n robot_type). Unique per account; 1 to 128 letters, digits, '.', '_', ':'\n or '-', starting with a letter or digit. Fixed at creation."
          },
          "kind": {
            "enum": [
              "KIND_UNSPECIFIED",
              "ARM",
              "HANDHELD"
            ],
            "type": "string",
            "description": "Arm or handheld.",
            "format": "enum"
          },
          "robot": {
            "type": "string",
            "description": "Arm rig: accounts/{account}/robots/{robot} it drives, so its episodes get\n forward kinematics on that robot's model. A robot (not a gripper design)\n of the rig's own account; deleting the robot clears it. A handheld rig has\n none."
          },
          "mounts": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.Rig_Mount"
            },
            "description": "Handheld rig: one mount per tracked hand, at least one, at most one per\n side. An arm rig has none."
          },
          "createTime": {
            "readOnly": true,
            "type": "string",
            "description": "When it was created.",
            "format": "date-time"
          },
          "updateTime": {
            "readOnly": true,
            "type": "string",
            "description": "When it last changed.",
            "format": "date-time"
          },
          "etag": {
            "type": "string",
            "description": "Sent back on UpdateRig."
          },
          "calibration": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.TcpCalibration"
              }
            ],
            "description": "Handheld rig: where each tracker's TCP is, from the last\n ImportCalibration. Unset until one is imported, and never set on the\n built-in rig. Not editable through UpdateRig."
          },
          "builtin": {
            "readOnly": true,
            "type": "boolean",
            "description": "Whether this is a built-in rig (the UMI handheld rig): read only, the same\n in every account. Setting a gripper on one makes the account's own copy."
          },
          "gripper": {
            "type": "string",
            "description": "Handheld rig: accounts/{account}/robots/{robot} of kind GRIPPER, the\n design of its gripper (a URDF, imported as a robot model). A design of the\n rig's own account; deleting the design clears it. A design lives in one\n workspace, like any robot, and a rig in none, so this may name a design of\n any workspace of the account, and Robots.GetRobot finds it only from that\n workspace. Set with UpdateRig (CreateRig refuses it); on the built-in rig\n that makes the account's own copy, uncalibrated. An arm rig has none; it\n names a robot."
          }
        },
        "description": "A capture rig: what episodes are recorded with. An arm rig drives a fleet\n robot; a handheld (UMI) rig carries trackers whose fixed mount to each\n gripper root belongs here, not to any robot. Episodes name their\n rig by `key` (Episode.rig).\n\n The UMI handheld rig (key `umi-handheld`) is built in: every account lists\n and reads it under its own name, and nobody edits or deletes it\n (FAILED_PRECONDITION). An account rig with the same key takes its place, so\n an account records its own calibration of its UMI pair by creating one, or\n by setting a gripper on the built-in (UpdateRig), which makes that copy\n itself. An account may delete its copy; it then lists the built-in again,\n uncalibrated.\n\n A handheld rig may carry the TCP calibration of its trackers (`calibration`)\n and the design of its gripper (`gripper`, a Robot of kind GRIPPER): the\n gripper's URDF, with the calibration saying where on it the TCP is. Both are\n a record on the rig: importing or replacing either changes no dataset.\n Ingest reads only the calibration's `tracker_to_tcp`, `filename` and\n `derive_date`; the gripper design and the calibration's end-effector fields\n (`ee_link`, `ee_to_tcp`) are for display.\n\n Served by fleet."
      },
      "qualia.v1.Rig_Mount": {
        "required": [
          "side",
          "trackerPose"
        ],
        "type": "object",
        "properties": {
          "side": {
            "enum": [
              "SIDE_UNSPECIFIED",
              "SIDE_LEFT",
              "SIDE_RIGHT"
            ],
            "type": "string",
            "description": "Which hand.",
            "format": "enum"
          },
          "trackerPose": {
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Transform"
              }
            ],
            "description": "The fixed mount: the tracker's pose in its gripper root's frame (x along\n the fingers, y the way the jaw opens, z along the hinge): xyz in metres\n and rpy in radians like every Transform. meta/ingest.toml's\n [rig.mount.<side>] gives the same pose with rpy in degrees. Unset xyz or\n rpy read as zeros."
          },
          "openAngle": {
            "type": "number",
            "description": "The gripper's closure calibration: the raw angle fully open.",
            "format": "double"
          },
          "closedAngle": {
            "type": "number",
            "description": "The raw angle shut.",
            "format": "double"
          }
        },
        "description": "One tracker's fixed mount."
      },
      "qualia.v1.Robot": {
        "required": [
          "displayName"
        ],
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "accounts/{account}/robots/{robot}"
          },
          "displayName": {
            "type": "string",
            "description": "Unique per account."
          },
          "robotType": {
            "type": "string",
            "description": "The robot type key (fleet.robot_type.key), e.g. \"openarm\", \"franka_fr3\".\n Empty for a robot defined only by an imported URDF."
          },
          "serialNumber": {
            "type": "string",
            "description": "Serial number, free text."
          },
          "hasModel": {
            "readOnly": true,
            "type": "boolean",
            "description": "Whether the robot has a model (URDF) configured."
          },
          "configDigest": {
            "readOnly": true,
            "type": "string",
            "description": "RobotModel.config_digest, empty without a model: what reach results are\n keyed by. Always empty for a gripper design."
          },
          "createTime": {
            "readOnly": true,
            "type": "string",
            "description": "When it was registered.",
            "format": "date-time"
          },
          "updateTime": {
            "readOnly": true,
            "type": "string",
            "description": "When it last changed.",
            "format": "date-time"
          },
          "etag": {
            "type": "string",
            "description": "Sent back on UpdateRobot."
          },
          "kind": {
            "enum": [
              "KIND_UNSPECIFIED",
              "ROBOT",
              "GRIPPER",
              "ROBOT_TEMPLATE"
            ],
            "type": "string",
            "description": "Robot, robot template or gripper design. Set by CreateRobot (unset is ROBOT)\n and never changed.",
            "format": "enum"
          },
          "gripperTcp": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Robot_GripperTcp"
              }
            ],
            "description": "Kind GRIPPER only: its TCPs."
          },
          "carriedGripper": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Robot_CarriedGripper"
              }
            ],
            "description": "Kind ROBOT only: the gripper it carries, if any."
          },
          "owner": {
            "type": "string",
            "description": "Kind GRIPPER only: accounts/{account}/robots/{robot} of the robot that\n owns this gripper. Empty for a workspace-level gripper (the handheld's, or\n a library gripper). Set on CreateRobot (with kind GRIPPER) to make the\n named robot's own gripper, which that robot carries from then on (with no\n mounts); never changed after."
          },
          "stagedGripperSupported": {
            "readOnly": true,
            "type": "boolean",
            "description": "The server supports exact staged gripper copy and fenced replacement.\n Absent on older servers; clients must not assume those guarantees."
          },
          "thumbnailSha256": {
            "readOnly": true,
            "type": "string",
            "description": "The sha256 (lowercase hex) of the robot's thumbnail, a picture of its\n model at the default pose that fleet draws when the model is imported\n (the bytes are GetRobotThumbnail's). Empty when it has none yet, or when\n the model was replaced since it was drawn, so a replaced model never shows\n its old picture."
          },
          "solver": {
            "readOnly": true,
            "enum": [
              "SOLVER_UNSPECIFIED",
              "PYROKI",
              "DLS",
              "MINK"
            ],
            "type": "string",
            "description": "RobotModel.solver, so a reader of the robot knows whether it has one\n without reading the model (whose signed URLs cost fleet more than the\n answer is worth). SOLVER_UNSPECIFIED: the robot has no solver, or no model;\n `has_model` tells which. Always SOLVER_UNSPECIFIED for a gripper design.\n fleet always sets it, SOLVER_UNSPECIFIED included, so a reader that finds\n it unset is talking to an older fleet, which does not know the field, and\n reads the model's solver instead.",
            "format": "enum"
          },
          "sourceTemplate": {
            "readOnly": true,
            "type": "string",
            "description": "accounts/{account}/robots/{robot} of the template this record was copied\n from: for a robot, the robot template CopyRobot copied (or the template of\n the robot it copied); for a gripper, the gripper template it was copied from\n (a UMI rig made by CopyGripperAsUmiRig, or the copy a robot owns). Empty when\n it was made another way, copied from something that was no template, or its\n template was deleted. It is provenance only: nothing is re-synced from it."
          }
        },
        "description": "A robot the account keeps (fleet.robots). Episodes can be recorded on it\n (Dataset.source_robot) and played on it (Dataset.target_robot).\n\n A gripper design (`kind` GRIPPER) is the same record: a URDF of one gripper\n with the TCP of each hand on it (`gripper_tcp`), which is also what\n a handheld rig's trackers are calibrated to and what Rig.gripper points at. Everything that takes a robot name works on it (upload, model,\n delete), but it is no robot: ListRobots leaves it out unless asked for\n grippers, so it is never the default target, and Robot.config_digest is\n always empty (its RobotModel keeps one), so no reach result is keyed by it.\n It lives in one workspace. A workspace-level gripper is one of two things: a\n gripper template (`gripper_tcp.rig_kind` empty), the design a robot's gripper\n or a UMI rig is copied from, or a UMI rig (`gripper_tcp.rig_kind`\n \"umi-handheld\"), the capture rig a handheld recording is converted\n with: made by CopyGripperAsUmiRig from a gripper template and calibrated with\n ImportGripperCalibration. A workspace has as many UMI rigs as someone made\n and none otherwise: nothing makes one on listing, and a UMI rig is deleted\n like any other robot.\n\n A robot template (`kind` ROBOT_TEMPLATE) is the model of a robot\n that rigs are made from: a URDF with its meshes and arms, and nothing a rig\n adds (no solver, gripper, serial number, credentials, datasets or reach\n results). CopyRobot makes a rig from it. The copy is a snapshot and shares\n nothing with the template afterwards, and deleting the template never\n touches a rig.\n\n A robot carries a gripper on its flanges (`carried_gripper`), set with\n SetRobotGripper, and owns it: attaching a gripper copies its URDF, TCP and jaw\n into a gripper design of the robot's own (`owner` names the robot), so editing\n it changes that robot only. An owned gripper is carried by its owner alone, is\n included when listing grippers as a source to copy, is deleted with its robot,\n by detaching it, or by DeleteRobot on the gripper, and\n needs robots:write to change (a workspace-level gripper, a gripper template or\n a UMI rig, needs rigs:write). Everything that takes a gripper name works on\n it (GetRobot, the model, SetGripperTcp, ImportGripperCalibration).\n\n Served by fleet."
      },
      "qualia.v1.RobotModel": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "accounts/{account}/robots/{robot}/model"
          },
          "urdfRobot": {
            "readOnly": true,
            "type": "string",
            "description": "The URDF's own robot name."
          },
          "urdfUri": {
            "readOnly": true,
            "type": "string",
            "description": "Signed URI of the browser-safe URDF: meshes point at the GLBs below."
          },
          "meshes": {
            "readOnly": true,
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.RobotModel_Mesh"
            },
            "description": "The meshes."
          },
          "digest": {
            "readOnly": true,
            "type": "string",
            "description": "Content digest of the imported URDF and meshes."
          },
          "arms": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.RobotModel_Arm"
            },
            "description": "Its arms: guessed at import (the deepest link named for each side, else\n one right arm), then edited."
          },
          "solver": {
            "enum": [
              "SOLVER_UNSPECIFIED",
              "PYROKI",
              "DLS",
              "MINK"
            ],
            "type": "string",
            "description": "The IK solver; SOLVER_UNSPECIFIED when none has been set (a new model has\n none). Once set it can be changed to another, never cleared: naming\n `solver` in the update mask with SOLVER_UNSPECIFIED, or with a value this\n server does not know, is INVALID_ARGUMENT.",
            "format": "enum"
          },
          "gripper": {
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.RobotModel_Gripper"
              }
            ],
            "description": "The gripper joint; unset when the robot has none."
          },
          "capsuleState": {
            "readOnly": true,
            "enum": [
              "CAPSULE_STATE_UNSPECIFIED",
              "FITTING",
              "FITTED",
              "UNAVAILABLE"
            ],
            "type": "string",
            "description": "Self-collision capsules.",
            "format": "enum"
          },
          "capsulesUri": {
            "readOnly": true,
            "type": "string",
            "description": "Signed URI of the capsules JSON (pyroki's export), when fitted."
          },
          "configDigest": {
            "readOnly": true,
            "type": "string",
            "description": "Digest over digest, arms, solver, capsules, gripper and the solver's\n parameters (mink_parameters for MINK, pyroki_parameters for PYROKI, the\n legacy numbers excepted). Reach results\n are keyed by it: after a change the stored results are for the old\n config, and nothing re-runs them until a reach check is asked for."
          },
          "editor": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Actor"
              }
            ],
            "description": "Who last changed it."
          },
          "updateTime": {
            "readOnly": true,
            "type": "string",
            "description": "When it last changed.",
            "format": "date-time"
          },
          "etag": {
            "type": "string",
            "description": "Sent back on UpdateRobotModel."
          },
          "importState": {
            "readOnly": true,
            "enum": [
              "IMPORT_STATE_UNSPECIFIED",
              "PENDING",
              "CONVERTING",
              "READY",
              "FAILED"
            ],
            "type": "string",
            "description": "Where the latest import is. Until it is READY, the fields above describe\n the previous model (empty when there is none).",
            "format": "enum"
          },
          "importFailureReason": {
            "readOnly": true,
            "type": "string",
            "description": "Why the latest import FAILED, e.g. \"no link is reached through three\n turning joints\"."
          },
          "reachBase": {
            "type": "array",
            "items": {
              "type": "number",
              "format": "double"
            },
            "description": "Where a dataset's reach check starts when the dataset names no base of\n its own (ReachSettings.base_m): empty or exactly three numbers, metres in\n the robot's base frame, each within 5 m either way. Not part of\n config_digest, so changing it makes no stored result stale; a dataset that\n follows it gets a new reach key on its next RunCheck. The reach op does\n not apply a base yet; see ReachSettings.base_m."
          },
          "tcpDigest": {
            "readOnly": true,
            "type": "string",
            "description": "Digest of every arm's TCP (Arm.tcp), empty when no arm has one. Reach\n results walked at the TCP are keyed by it beside config_digest, so a\n change to the carried gripper, its mount, its TCP or either URDF makes\n them stale; results walked at the gripper root do not depend on it."
          },
          "minkParameters": {
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.RobotModel_MinkParameters"
              }
            ],
            "description": "What Mink solves with: set exactly when the solver is MINK, and then whole\n (see MinkParameters). Set with UpdateRobotModel (update_mask\n `mink_parameters`) together with solver MINK; any other solver clears\n them. Part of config_digest, so changing them makes stored reach results\n stale."
          },
          "pyrokiParameters": {
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.RobotModel_PyrokiParameters"
              }
            ],
            "description": "What PyRoKi solves with: set exactly when the solver is PYROKI, and then\n whole (see PyrokiParameters). Set with UpdateRobotModel (update_mask\n `pyroki_parameters`) together with solver PYROKI, as `mink_parameters` is\n with MINK; any other solver clears them. A PYROKI robot that has run before\n holds the numbers it has always run. Part of config_digest, except that the\n numbers every PyRoKi robot ran before it had a file add nothing, so a robot\n that still holds them keeps the digest (and the stored reach results) it\n had."
          }
        },
        "description": "A robot's kinematic model and the config every consumer shares: reach\n checks, retargeting, forward kinematics for trajectories, and the 3D\n gripper. One per robot.\n\n Served by fleet."
      },
      "qualia.v1.RobotModel_Arm": {
        "required": [
          "side",
          "handLink"
        ],
        "type": "object",
        "properties": {
          "side": {
            "enum": [
              "SIDE_UNSPECIFIED",
              "SIDE_LEFT",
              "SIDE_RIGHT"
            ],
            "type": "string",
            "description": "Which side.",
            "format": "enum"
          },
          "handLink": {
            "type": "string",
            "description": "The link the arm ends at."
          },
          "tool": {
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Transform"
              }
            ],
            "description": "The tool frame fixed in the hand link, where a handheld gripper root is held."
          },
          "startPosture": {
            "type": "array",
            "items": {
              "type": "number",
              "format": "double"
            },
            "description": "The posture a replay starts from: one angle per turning joint of the\n chain, radians, clamped to the limits."
          },
          "joints": {
            "readOnly": true,
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.RobotModel_Joint"
            },
            "description": "The chain's turning joints, base to hand, with their limits."
          },
          "tcp": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Matrix4"
              }
            ],
            "description": "The arm's TCP in the hand link's frame, the one every reader of a robot's\n TCP uses (the reach solve at the TCP, the dashboard). A robot carrying a\n gripper (Robot.carried_gripper): the hand link to the mount's parent\n link, then the mount, then the gripper's own TCP; empty when the gripper\n has no TCP for this side or it is stale, or the mount's parent link is\n not joined to the hand link by fixed joints. A robot carrying none: the\n TCP its URDF names, the first link called `grasp_frame`, `hand_tcp` or\n `tcp` (or ending `_` and one of those) fixed below the hand link; empty\n where it names none."
          },
          "startPostureConfigured": {
            "type": "boolean",
            "description": "Explicitly use this complete, in-limit start_posture as configured\n home for contact exclusions. Absent/false retains the replay rest seed\n without claiming imported, padded or clipped defaults are verified home."
          }
        },
        "description": "One arm."
      },
      "qualia.v1.RobotModel_Gripper": {
        "required": [
          "joint",
          "openPosition",
          "closedPosition"
        ],
        "type": "object",
        "properties": {
          "joint": {
            "type": "string",
            "description": "Joint name; `{side}` is replaced by \"left\" or \"right\"."
          },
          "openPosition": {
            "type": "number",
            "description": "Its position fully open.",
            "format": "double"
          },
          "closedPosition": {
            "type": "number",
            "description": "Its position shut.",
            "format": "double"
          },
          "homePosition": {
            "type": "number",
            "description": "Explicit jaw position at the configured arm home, mirrored with the\n open/closed range where the side's URDF limits require it. Absence means\n unknown, including on legacy profiles; never infer open, closed or zero.",
            "format": "double"
          }
        },
        "description": "The joint that opens the gripper. A robot that carries a gripper\n (Robot.carried_gripper) has that gripper's own jaw here, none when the gripper\n has none, not the stock fingers its URDF came on; taking the gripper off gives\n the robot's own jaw back. The gripper's own model holds the same jaw."
      },
      "qualia.v1.RobotModel_Joint": {
        "type": "object",
        "properties": {
          "joint": {
            "readOnly": true,
            "type": "string",
            "description": "Joint name."
          },
          "lower": {
            "readOnly": true,
            "type": "number",
            "description": "Lower limit, radians (or metres for prismatic).",
            "format": "double"
          },
          "upper": {
            "readOnly": true,
            "type": "number",
            "description": "Upper limit.",
            "format": "double"
          }
        },
        "description": "One turning joint, read off the URDF."
      },
      "qualia.v1.RobotModel_Mesh": {
        "type": "object",
        "properties": {
          "path": {
            "readOnly": true,
            "type": "string",
            "description": "The path in the served URDF (package:// resolved to this relative path)."
          },
          "uri": {
            "readOnly": true,
            "type": "string",
            "description": "Signed URI of the GLB."
          }
        },
        "description": "One mesh, converted to GLB, at the path the served URDF references."
      },
      "qualia.v1.RobotModel_MinkParameters": {
        "type": "object",
        "properties": {
          "posCost": {
            "type": "number",
            "description": "Each arm's frame task on its tool frame: its position cost, 0 or more.\n pos_cost and ori_cost are not both 0.",
            "format": "double"
          },
          "oriCost": {
            "type": "number",
            "description": "The frame task's orientation cost, 0 or more.",
            "format": "double"
          },
          "frameLmDamping": {
            "type": "number",
            "description": "The frame task's Levenberg-Marquardt damping, 0 or more.",
            "format": "double"
          },
          "postureCost": {
            "type": "number",
            "description": "The posture task's cost on the arm joints, 0 or more.",
            "format": "double"
          },
          "postureTarget": {
            "enum": [
              "POSTURE_TARGET_UNSPECIFIED",
              "ENGAGE",
              "ROW"
            ],
            "type": "string",
            "description": "What the posture task pulls the arm joints toward.",
            "format": "enum"
          },
          "smoothnessCost": {
            "type": "number",
            "description": "The smoothness task's cost, 0 or more; 0 turns it off.",
            "format": "double"
          },
          "elbowDownCost": {
            "type": "number",
            "description": "The elbow-down task's cost, 0 or more; 0 turns it off.",
            "format": "double"
          },
          "singularityThreshold": {
            "type": "number",
            "description": "The singularity task's threshold, 0 or more; 0 turns it off.",
            "format": "double"
          },
          "singularityDamping": {
            "type": "number",
            "description": "The singularity task's damping, 0 or more; 0 turns it off.",
            "format": "double"
          },
          "dt": {
            "type": "number",
            "description": "The QP's step, above 0.",
            "format": "double"
          },
          "damping": {
            "type": "number",
            "description": "The QP's Levenberg-Marquardt damping, 0 or more.",
            "format": "double"
          },
          "maxIters": {
            "type": "integer",
            "description": "The most QP steps a row takes, 1 to 1000.",
            "format": "int32"
          },
          "posTol": {
            "type": "number",
            "description": "A row's steps stop once every arm's position error is within this and\n its orientation error within ori_tol; a 0 tolerance is never met.",
            "format": "double"
          },
          "oriTol": {
            "type": "number",
            "description": "The orientation tolerance that goes with pos_tol; 0 is never met.",
            "format": "double"
          },
          "stallTol": {
            "type": "number",
            "description": "A row's steps stop once a step moves the joints less than this; 0\n never stops one.",
            "format": "double"
          },
          "progressWindow": {
            "type": "integer",
            "description": "A row's steps stop once its error shrank by less than min_progress over\n this many steps, 0 to 1000; 0 never stops one.",
            "format": "int32"
          },
          "minProgress": {
            "type": "number",
            "description": "The share of its error a row must lose over progress_window steps to\n keep stepping, 0 or more and below 1.",
            "format": "double"
          },
          "checkedSteps": {
            "type": "boolean",
            "description": "q-research's checked step (inference) instead of mink.solve_ik (teleop)."
          },
          "maxJointVelocity": {
            "type": "number",
            "description": "The arm joints' speed limit in the QP, 0 or more; 0 is no limit.",
            "format": "double"
          },
          "maxJointSpeedPerRow": {
            "type": "number",
            "description": "The arm joints' speed limit from one row of the take to the next, 0 or\n more; 0 is no limit.",
            "format": "double"
          },
          "selfCollision": {
            "type": "boolean",
            "description": "Whether the collision limit, on the robot's capsules, is on."
          },
          "collisionPairs": {
            "enum": [
              "COLLISION_PAIRS_UNSPECIFIED",
              "ALL",
              "AVOIDED"
            ],
            "type": "string",
            "description": "The capsule pairs the collision limit watches.",
            "format": "enum"
          },
          "collisionMinDistance": {
            "type": "number",
            "description": "The collision limit's minimum distance, 0 or more.",
            "format": "double"
          },
          "collisionDetectionDistance": {
            "type": "number",
            "description": "The collision limit's detection distance, above collision_min_distance.",
            "format": "double"
          },
          "collisionGain": {
            "type": "number",
            "description": "The collision limit's gain, above 0 and at most 1.",
            "format": "double"
          },
          "collisionBoundRelaxation": {
            "type": "number",
            "description": "The collision limit's bound relaxation, 0 or more.",
            "format": "double"
          },
          "shoulderLink": {
            "type": "string",
            "description": "The shoulder link's name (\"{side}\" stands for left or right, at most 256\n characters); empty is the arm chain's 2nd joint's child link."
          },
          "elbowLink": {
            "type": "string",
            "description": "The elbow link's name, like shoulder_link; empty is the 4th joint's\n child link."
          },
          "wristLink": {
            "type": "string",
            "description": "The wrist link's name, like shoulder_link; empty is the 5th joint's\n child link."
          }
        },
        "description": "What Mink solves with (Solver MINK): schema 1 of the reach op's contract\n (op_reach.contract.MinkParameters). Every field is required: there are no\n defaults and no built-in sets. Metres, radians and seconds."
      },
      "qualia.v1.RobotModel_PyrokiParameters": {
        "type": "object",
        "properties": {
          "posWeight": {
            "type": "number",
            "description": "The pose cost's weight on each hand's position, 0 to 1e6. pos_weight and\n ori_weight are not both 0.",
            "format": "double"
          },
          "oriWeight": {
            "type": "number",
            "description": "The pose cost's weight on each hand's orientation, 0 to 1e6.",
            "format": "double"
          },
          "lastWeight": {
            "type": "number",
            "description": "The weight pulling each row toward the last answer, 0 to 1e6. It pulls\n toward the same value as anchor_weight, so only their sum of squares\n matters and tuning either has the same effect.",
            "format": "double"
          },
          "anchorWeight": {
            "type": "number",
            "description": "The weight pulling each row toward the row before it, 0 to 1e6. Not toward\n home: see last_weight.",
            "format": "double"
          },
          "manipulabilityWeight": {
            "type": "number",
            "description": "The weight on the arm's manipulability, 0 to 1e6.",
            "format": "double"
          },
          "limitWeight": {
            "type": "number",
            "description": "The weight keeping the joints inside their limits, 0 to 1e6.",
            "format": "double"
          },
          "collisionWeight": {
            "type": "number",
            "description": "The weight keeping the arms' capsules apart, 0 to 1e6.",
            "format": "double"
          },
          "collisionMargin": {
            "type": "number",
            "description": "How near two capsules may come before the collision cost acts, in metres,\n 0 to 1.",
            "format": "double"
          },
          "maxIterations": {
            "type": "integer",
            "description": "The most solver iterations a row takes, 1 to 50.",
            "format": "int32"
          }
        },
        "description": "What PyRoKi solves with (Solver PYROKI): schema 1 of the PyRoKi solver\n file, as fleet checks it (q_fleet_api.services.pyroki_parameters). qds sends\n it to the reach op with each solve, as it sends a Mink robot's parameters. Every field is required: there are no defaults and no built-in\n sets. Weights are unitless, the margin is metres.\n Each robot has its own: PyRoKi on one robot and PyRoKi on another run the same\n solver and are tuned apart."
      },
      "qualia.v1.RobotThumbnail": {
        "type": "object",
        "properties": {
          "sha256": {
            "readOnly": true,
            "type": "string",
            "description": "The sha256 (lowercase hex) of `image`."
          },
          "contentType": {
            "readOnly": true,
            "type": "string",
            "description": "\"image/webp\" or \"image/png\"."
          },
          "image": {
            "readOnly": true,
            "type": "string",
            "description": "The picture.",
            "format": "bytes"
          }
        },
        "description": "A robot's thumbnail."
      },
      "qualia.v1.Robot_CarriedGripper": {
        "type": "object",
        "properties": {
          "gripper": {
            "readOnly": true,
            "type": "string",
            "description": "accounts/{account}/robots/{robot} of kind GRIPPER, in the robot's\n workspace: the robot's own gripper (its `owner` is the robot)."
          },
          "mounts": {
            "readOnly": true,
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.CarriedGripper_Mount"
            },
            "description": "One per arm side the gripper is mounted on."
          },
          "etag": {
            "readOnly": true,
            "type": "string",
            "description": "Sent back on SetRobotGripper."
          },
          "displayName": {
            "readOnly": true,
            "type": "string",
            "description": "The gripper's display name (the one it was copied from), so a robot can\n say \"gripper: KIWI gripper pair\" without reading the gripper."
          }
        },
        "description": "The gripper a robot carries on its flanges, and where each one sits on its\n arm. Only a robot (kind ROBOT) has one."
      },
      "qualia.v1.Robot_GripperTcp": {
        "type": "object",
        "properties": {
          "hands": {
            "readOnly": true,
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.GripperTcp_Hand"
            },
            "description": "The hands that have a TCP: none, one or both sides."
          },
          "calibration": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.TcpCalibration"
              }
            ],
            "description": "The hands' `tracker_to_tcp` as a calibration, the form\n Datasets.ResolvePoses takes. Set only when `resolves_uploads`."
          },
          "rigKey": {
            "readOnly": true,
            "type": "string",
            "description": "The key a recording may name this gripper by, e.g. \"umi-handheld\" on a\n workspace's first UMI rig, which also stands for the ingest rig kind of the\n same name (`rig_kind`). Unique among workspace-level grippers. Empty for a\n gripper that has none: a gripper template, a UMI rig made by CopyGripperAsUmiRig\n (named by its name or id), and the gripper a robot owns (see\n `source_rig_key`); a TCP on it serves robots only. Nothing makes a keyed\n gripper any more: the key stays on the ones that have it."
          },
          "filename": {
            "readOnly": true,
            "type": "string",
            "description": "The calibration file's name, or \"tcp-matrix:<gripper name>\" for a matrix."
          },
          "deriveDate": {
            "readOnly": true,
            "type": "string",
            "description": "\"YYYY-MM-DD\": the file's, or the day the matrix was set (UTC). Empty when\n a file gave none."
          },
          "stale": {
            "readOnly": true,
            "type": "boolean",
            "description": "Whether the gripper's URDF changed since a TCP in a link was set: a\n re-import changed its digest or took the link away. A stale TCP is shown\n with a warning and is never composed into a robot's arm; set it again,\n every hand that has one in the same call."
          },
          "tcpSet": {
            "readOnly": true,
            "type": "boolean",
            "description": "Robots can use it: every hand has its TCP in a link and it is not stale."
          },
          "resolvesUploads": {
            "readOnly": true,
            "type": "boolean",
            "description": "Uploads can be resolved with it: both hands have a `tracker_to_tcp`, and\n the calibration has a file name and a date."
          },
          "etag": {
            "readOnly": true,
            "type": "string",
            "description": "Sent back on SetGripperTcp and ImportGripperCalibration."
          },
          "sourceRigKey": {
            "readOnly": true,
            "type": "string",
            "description": "The `rig_kind` (else the `rig_key`) of the gripper this one was copied from,\n e.g. \"umi-handheld\", for the gripper a robot owns; empty otherwise. It says\n the gripper is a copy of a UMI rig's gripper (and so has its controller to\n TCP transform), which a copy cannot claim as its own `rig_kind`: uploads are\n resolved with a UMI rig."
          },
          "rigKind": {
            "readOnly": true,
            "type": "string",
            "description": "The ingest rig kind this gripper converts a recording with, e.g.\n \"umi-handheld\": what Dataset.poses_rig names. Set exactly on a UMI rig (a\n workspace-level gripper made by CopyGripperAsUmiRig, or the one a workspace had\n before: its `rig_key` is the same string). Several UMI rigs of one kind may exist in\n a workspace. Empty on a gripper template and on a gripper a robot owns."
          }
        },
        "description": "A gripper's tool centre points (TCP), one per hand. Only a gripper has one.\n It is set with SetGripperTcp (a 4x4 matrix) or ImportGripperCalibration\n (a tcp_calibration.json), never by UpdateRobot, and lives in the\n gripper's workspace like the gripper."
      },
      "qualia.v1.RulingResult": {
        "type": "object",
        "properties": {
          "changedCount": {
            "type": "integer",
            "description": "Episodes whose standing changed.",
            "format": "int32"
          },
          "unchangedCount": {
            "type": "integer",
            "description": "Episodes already standing that way.",
            "format": "int32"
          },
          "skippedCount": {
            "type": "integer",
            "description": "Episodes skipped: through a mixture, those not KEPT upstream (rejected\n or unreviewed in their upload or a mixture in between); anywhere, a\n Restore on an episode that is not a validation reject, and a Keep on a\n validation reject (RestoreEpisodes puts those back, with a reason).",
            "format": "int32"
          },
          "dismissedIssueCount": {
            "type": "integer",
            "description": "Open issues dismissed with a keep.",
            "format": "int32"
          },
          "lockedCount": {
            "type": "integer",
            "description": "Episodes the call would have changed but left as they were, because\n another person holds their edit lease. Not counted in skipped_count.",
            "format": "int32"
          },
          "locked": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.LockedEpisode"
            },
            "description": "The first 100 of them, with their holders."
          },
          "reopenedIssueCount": {
            "type": "integer",
            "description": "Blocking issues a reset reopened: the ones the withdrawn keep had closed.",
            "format": "int32"
          }
        },
        "description": "The result every bulk ruling returns."
      },
      "qualia.v1.RunCheckRequest": {
        "required": [
          "name",
          "dataset"
        ],
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "accounts/{account}/checks/{check}. `checks/-` runs the dataset's\n default set: an upload runs episode-rules, a mixture runs mixture.\n Reach is never in it; name `checks/reach`."
          },
          "dataset": {
            "type": "string",
            "description": "accounts/{account}/datasets/{dataset}"
          },
          "selection": {
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.EpisodeSelection"
              }
            ],
            "description": "Only these episodes (names under `dataset`); unset means all. Ignored by\n MIXTURE, which always reads the whole mixture."
          },
          "model": {
            "type": "string",
            "description": "`checks/vlm` only: the Qualia model tier that reads the episodes, one of\n CheckEstimate.models (what this deployment's VLM check template offers).\n Empty: the template's default. INVALID_ARGUMENT, before anything starts,\n for a model the template does not offer, or on any other check."
          },
          "validateOnly": {
            "type": "boolean",
            "description": "Check the request and answer what it would do, starting nothing and\n reserving nothing: every refusal a run would meet, then `estimate` (VLM\n only). `checks` and `check_runs` are empty."
          },
          "maxEpisodes": {
            "type": "integer",
            "description": "`checks/vlm` only: sample at most this many linked episodes across the\n scope. Must be positive; unset checks all eligible episodes.",
            "format": "int32"
          },
          "maxCost": {
            "type": "string",
            "description": "`checks/vlm` only: maximum credits reserved and spent. Must be positive."
          },
          "requestId": {
            "type": "string",
            "description": "Optional UUID4 idempotency key. Matching retries return the original\n admission; a different caller, scope or normalized input is refused.\n An intentional rerun needs a new key. validate_only never reserves it."
          }
        },
        "description": "Request for Checks.RunCheck."
      },
      "qualia.v1.RunCheckResponse": {
        "type": "object",
        "properties": {
          "checks": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "accounts/{account}/checks/{check} of the checks started, in the order\n they run."
          },
          "operation": {
            "type": "string",
            "description": "accounts/{account}/operations/{operation}: the run RunCheck recorded (the\n first upload's, for a merged dataset's per-upload checks). For\n `checks/reach` it is also ReachRun.operation, the run GetReachStatus\n reports."
          },
          "checkRuns": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Every run started, in the order they run: one, or one per upload of a\n merged dataset for the checks run per upload (VLM and REACH are one run).\n Read each with GetCheckRun."
          },
          "estimate": {
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.CheckEstimate"
              }
            ],
            "description": "`checks/vlm` with validate_only: what the run would read and reserve."
          },
          "activityEvent": {
            "type": "string",
            "description": "The durable request event, when correlated Activity writing is enabled."
          },
          "queuedBehind": {
            "type": "string",
            "description": "`checks/vlm` asked for while another run of it is on the dataset (an\n automatic run after preparation, or a person's): that\n run. This run is recorded QUEUED behind it and starts when it ends; it\n reserves nothing until then. Empty when the run started at once."
          },
          "queuedReason": {
            "type": "string",
            "description": "With queued_behind, the same in a sentence: \"queued behind the automatic\n VLM check started 10:41 UTC (accounts/…/runs/…); it starts when that\n ends\"."
          }
        },
        "description": "Response for Checks.RunCheck: what was started."
      },
      "qualia.v1.RunDatasetChecksRequest": {
        "required": [
          "dataset"
        ],
        "type": "object",
        "properties": {
          "dataset": {
            "type": "string",
            "description": "accounts/{account}/datasets/{dataset}"
          },
          "checkIds": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Check ids to run, e.g. `task.graph`."
          },
          "categories": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Categories to run every runnable check of the selected kind."
          },
          "all": {
            "type": "boolean",
            "description": "Run every runnable check of the selected kind."
          },
          "selection": {
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.EpisodeSelection"
              }
            ],
            "description": "Only these episodes (names under `dataset`, or a ListEpisodes filter);\n unset means all."
          },
          "maxEpisodes": {
            "type": "integer",
            "description": "Sample at most this many eligible episodes, evenly spread and the same\n for the same request. Must be positive; unset reads all of them.",
            "format": "int32"
          },
          "maxCost": {
            "type": "string",
            "description": "The most credits the run may reserve and spend. Required to start a\n VLM run, and must cover the bound; optional with `validate_only`.\n Heuristic runs have a bound of zero and do not require max_cost."
          },
          "validateOnly": {
            "type": "boolean",
            "description": "Resolve the selection and answer the bound, starting and reserving\n nothing."
          },
          "model": {
            "type": "string",
            "description": "The Qualia model tier that reads the VLM checks, one of\n CheckEstimate.models; a legacy vendor model id is still accepted.\n Empty: the runner's default."
          },
          "requestId": {
            "type": "string",
            "description": "Idempotency key (AIP-155): a retry with the same id within 24 hours\n returns the first call's run and its pinned selection instead of\n starting a second one. Required to start a run."
          },
          "kind": {
            "enum": [
              "KIND_UNSPECIFIED",
              "VLM",
              "HEURISTIC"
            ],
            "type": "string",
            "description": "Kind selected by all and categories. Unset: the kind `check_ids` names;\n else VLM when a VLM check they reach can run here, else heuristic. A run\n reads one kind; the checks it leaves out are listed in `skipped_checks`.\n Explicit check_ids may name either kind, but cannot mix kinds in one run.",
            "format": "enum"
          }
        },
        "description": "Request for Checks.RunDatasetChecks."
      },
      "qualia.v1.RunDatasetChecksResponse": {
        "type": "object",
        "properties": {
          "checks": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.DatasetCheckSelection"
            },
            "description": "The resolved checks, by category then check id."
          },
          "episodeCount": {
            "type": "integer",
            "description": "Episodes selected: after the selection and sample cap.",
            "format": "int32"
          },
          "skippedCount": {
            "type": "integer",
            "description": "Episodes of the selection that no selected check can read.",
            "format": "int32"
          },
          "estimate": {
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.CheckEstimate"
              }
            ],
            "description": "What the run reserves: pipeline-api's bound for the pinned selection."
          },
          "checkRun": {
            "type": "string",
            "description": "accounts/{account}/checks/vlm/runs/{run}: the run; empty with\n `validate_only`."
          },
          "skippedChecks": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.SkippedDatasetCheck"
            },
            "description": "Checks `all` or `categories` reached that the run leaves out, by category\n then check id, with why. An id in `check_ids` that cannot run is refused\n instead. The VLM check's own steps (graph.observe, graph.evaluate) run\n only inside it and are left out unlisted."
          }
        },
        "description": "Response for Checks.RunDatasetChecks."
      },
      "qualia.v1.SampleEpisodeSeriesResponse": {
        "type": "object",
        "properties": {
          "timeSeconds": {
            "type": "array",
            "items": {
              "type": "number",
              "format": "double"
            },
            "description": "Seconds from the first frame sampled, one per sample: a sample's second\n of the episode's recording is this plus window_start_seconds."
          },
          "channels": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.SampleEpisodeSeriesResponse_Channel"
            },
            "description": "Every channel the recording carries, on time_seconds."
          },
          "fps": {
            "type": "number",
            "description": "The recording's frames per second.",
            "format": "double"
          },
          "frameCount": {
            "type": "string",
            "description": "Frames sampled: the take's, or what its applied trim keeps."
          },
          "unpublished": {
            "type": "boolean",
            "description": "True when the take is in no published version yet (a split child\n before its publish): it has no channels to sample."
          },
          "windowStartSeconds": {
            "type": "number",
            "description": "Where the first frame sampled sits in the episode's recording, in\n seconds of the recording (the clock its trim, subtasks and markers are\n in), on that frame: 0 until a trim is applied, the trim's start once one\n is; a split's piece is a recording of its own, so 0. Unset with\n unpublished.",
            "format": "double"
          },
          "windowEndSeconds": {
            "type": "number",
            "description": "Where the frames sampled end in the recording, in the same seconds: the\n end of the last one (window_start_seconds plus frame_count / fps).\n Unset with unpublished.",
            "format": "double"
          }
        },
        "description": "Response for Episodes.SampleEpisodeSeries."
      },
      "qualia.v1.SampleEpisodeSeriesResponse_Channel": {
        "type": "object",
        "properties": {
          "stream": {
            "enum": [
              "STREAM_UNSPECIFIED",
              "STATE",
              "ACTION",
              "TCP"
            ],
            "type": "string",
            "description": "Which vector.",
            "format": "enum"
          },
          "key": {
            "type": "string",
            "description": "Its positional key, \"state[3]\" or \"action[3]\"; the dataset's robot\n interface names the positions. A TCP channel is named, \"left.tcp.x\"."
          },
          "values": {
            "type": "array",
            "items": {
              "type": "number",
              "format": "double"
            },
            "description": "One value per sample; 0 where valid is false."
          },
          "valid": {
            "type": "array",
            "items": {
              "type": "boolean"
            },
            "description": "Per sample: false where the recording holds no finite value."
          }
        },
        "description": "One channel: one component of the state or the action vector."
      },
      "qualia.v1.SetGripperTcpRequest": {
        "required": [
          "name"
        ],
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "accounts/{account}/robots/{robot}, of kind GRIPPER."
          },
          "hands": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.SetGripperTcpRequest_Hand"
            },
            "description": "The hands to set. Hands not named keep what they have (but on a `stale`\n gripper every hand with a TCP is named). Exactly one of `hands` and\n `content` is given."
          },
          "content": {
            "type": "string",
            "description": "Or the text of a JSON file, of at most 64 KiB, that gives the hands:\n {\"left\": {\"link\": \"openarm_{side}_ee_base_link\", \"matrix\": [... 16 ...]},\n  \"right\": {...}}, `matrix` a flat 16-array or a nested 4x4."
          },
          "filename": {
            "type": "string",
            "description": "What to record as the calibration's file name; empty is\n \"tcp-matrix:<gripper name>\". Otherwise 1 to 256 characters, not only\n spaces, no control characters, as ImportGripperCalibration's. The date\n recorded is today's, UTC. Neither changes while no hand's `tracker_to_tcp`\n does (a TCP set again on a re-imported URDF is still the same calibration)."
          },
          "etag": {
            "type": "string",
            "description": "Robot.GripperTcp.etag as read."
          }
        },
        "description": "Request for Robots.SetGripperTcp."
      },
      "qualia.v1.SetGripperTcpRequest_Hand": {
        "required": [
          "side",
          "link",
          "matrix"
        ],
        "type": "object",
        "properties": {
          "side": {
            "enum": [
              "SIDE_UNSPECIFIED",
              "SIDE_LEFT",
              "SIDE_RIGHT"
            ],
            "type": "string",
            "description": "Which hand.",
            "format": "enum"
          },
          "link": {
            "type": "string",
            "description": "The link of the gripper's URDF the matrix is expressed in; `{side}` is\n replaced by \"left\" or \"right\". Fixed after the first set."
          },
          "matrix": {
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Matrix4"
              }
            ],
            "description": "The TCP in that link's frame: 16 numbers, row-major, metres, bottom row\n 0 0 0 1, a rotation that is orthonormal to 1e-3."
          }
        },
        "description": "One hand's TCP matrix."
      },
      "qualia.v1.SetRobotGripperRequest": {
        "required": [
          "name"
        ],
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "accounts/{account}/robots/{robot}, of kind ROBOT."
          },
          "gripper": {
            "type": "string",
            "description": "The robot's own gripper (Robot.CarriedGripper.gripper), to set its mounts.\n Until a workspace is backfilled a robot may still carry a workspace-level\n gripper it shared; naming that one updates its mounts too. Naming a\n workspace-level gripper on a robot that carries none attaches a copy of it\n (as `copy_from` does, with these mounts); any other is\n FAILED_PRECONDITION: attach with `copy_from`. Empty with no `copy_from`\n takes the robot's gripper off and clears its mounts (an owned gripper is\n deleted)."
          },
          "mounts": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.CarriedGripper_Mount"
            },
            "description": "Where the gripper sits on each arm, one per side at most. With `copy_from`\n and none given, the gripper is mounted at the hand link of every arm whose\n hand it has a TCP in a link for, with no offset and marked `guessed`, unless\n exact_mounts is true."
          },
          "etag": {
            "type": "string",
            "description": "Robot.CarriedGripper.etag as read; empty when the robot had none."
          },
          "copyFrom": {
            "type": "string",
            "description": "accounts/{account}/robots/{robot}: a gripper design, or a robot whose own\n gripper to copy, in the robot's workspace. Only for a robot that carries no\n gripper unless replace_existing is true. The copy takes the source's URDF and meshes, TCP (hands, file,\n date), jaw and name; it has no `rig_key`, but a `source_rig_key` when the\n source had one. The source is not changed."
          },
          "exactMounts": {
            "type": "boolean",
            "description": "Use exactly the mounts supplied, including an empty list. Without this,\n copy_from retains its legacy default of guessed mounts when none are sent."
          },
          "replaceExisting": {
            "type": "boolean",
            "description": "Replace the currently carried gripper atomically with a copy. Requires\n copy_from and the carried gripper etag; old clients retain attach-only behavior."
          },
          "sourceTcpEtag": {
            "type": "string",
            "description": "Source versions read before staging an exact copy, including an empty TCP\n etag when the source has no TCP. Checked before files or rows change."
          },
          "sourceModelEtag": {
            "type": "string",
            "description": "Source model etag read before staging, checked before copying its files."
          }
        },
        "description": "Request for Robots.SetRobotGripper."
      },
      "qualia.v1.SignEpisodeVideosResponse": {
        "type": "object",
        "properties": {
          "videos": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.SignEpisodeVideosResponse_Video"
            },
            "description": "One per camera."
          },
          "unpublished": {
            "type": "boolean",
            "description": "True when the take is in no published version yet (a split child\n before its publish): it has no videos to sign."
          },
          "windowStartSeconds": {
            "type": "number",
            "description": "Where the videos' take starts in the episode's recording, in seconds of\n the recording (the clock its trim, subtasks and markers are in): a\n camera's start_seconds plays this second. 0 until a trim is applied,\n the trim's start once one is; a split's piece is a recording of its\n own, so 0. Unset with unpublished.",
            "format": "double"
          },
          "windowEndSeconds": {
            "type": "number",
            "description": "Where the take ends in the recording, in the same seconds: the\n recording's length, or the applied trim's end. A camera whose file\n ends sooner stops at its end_seconds. Unset with unpublished.",
            "format": "double"
          }
        },
        "description": "Response for Episodes.SignEpisodeVideos."
      },
      "qualia.v1.SignEpisodeVideosResponse_Video": {
        "type": "object",
        "properties": {
          "camera": {
            "type": "string",
            "description": "Camera key, e.g. \"observation.images.top\"."
          },
          "uri": {
            "type": "string",
            "description": "Signed URI of the video file; it stops working at expire_time."
          },
          "startSeconds": {
            "type": "number",
            "description": "When the file holds more than this take: seconds into the file where\n the take starts. Unset when the take is the whole file.",
            "format": "double"
          },
          "endSeconds": {
            "type": "number",
            "description": "Seconds into the file where the take ends; unset with start_seconds.",
            "format": "double"
          },
          "expireTime": {
            "type": "string",
            "description": "When uri stops working.",
            "format": "date-time"
          },
          "recordingStartSeconds": {
            "type": "number",
            "description": "Seconds into the file where the take's whole recording starts, before\n any trim: start_seconds less what an applied trim cut from the start,\n so a client can show the footage a trim leaves out. Unset only when qds\n does not know it: the take has no window of this file on record.",
            "format": "double"
          },
          "recordingEndSeconds": {
            "type": "number",
            "description": "Seconds into the file where the whole recording ends; unset with\n recording_start_seconds.",
            "format": "double"
          }
        },
        "description": "One camera's video of the take."
      },
      "qualia.v1.SkippedDatasetCheck": {
        "type": "object",
        "properties": {
          "datasetCheck": {
            "type": "string",
            "description": "accounts/{account}/datasets/{dataset}/checks/{check}"
          },
          "version": {
            "type": "integer",
            "description": "Its active version.",
            "format": "int32"
          },
          "kind": {
            "enum": [
              "KIND_UNSPECIFIED",
              "VLM",
              "HEURISTIC"
            ],
            "type": "string",
            "description": "How it reads an episode.",
            "format": "enum"
          },
          "reason": {
            "type": "string",
            "description": "Why the run leaves it out: it cannot run here, or it is of the other\n kind and runs as its own run."
          }
        },
        "description": "A check the selection reached that the run leaves out."
      },
      "qualia.v1.SolverTemplate": {
        "required": [
          "displayName",
          "solver"
        ],
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "accounts/{account}/solverTemplates/{solver_template}"
          },
          "displayName": {
            "type": "string",
            "description": "Unique per workspace, 1 to 64 characters."
          },
          "solver": {
            "enum": [
              "SOLVER_UNSPECIFIED",
              "PYROKI",
              "DLS",
              "MINK"
            ],
            "type": "string",
            "description": "PYROKI, DLS or MINK; SOLVER_UNSPECIFIED is INVALID_ARGUMENT. Never changed\n after creation.",
            "format": "enum"
          },
          "minkParameters": {
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.RobotModel_MinkParameters"
              }
            ],
            "description": "Set exactly when the solver is MINK, and then whole (see\n RobotModel.MinkParameters)."
          },
          "pyrokiParameters": {
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.RobotModel_PyrokiParameters"
              }
            ],
            "description": "Set exactly when the solver is PYROKI, and then whole (see\n RobotModel.PyrokiParameters). DLS has no parameters."
          },
          "createTime": {
            "readOnly": true,
            "type": "string",
            "description": "When it was registered.",
            "format": "date-time"
          },
          "creator": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Actor"
              }
            ],
            "description": "Who registered it, as events name an actor."
          }
        },
        "description": "A named solver choice with its parameters, kept in a workspace to apply to\n rigs (see CreateSolverTemplate). Served by fleet."
      },
      "qualia.v1.Source": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "accounts/{account}/datasets/{dataset}/sources/{source}"
          },
          "dataset": {
            "type": "string",
            "description": "accounts/{account}/datasets/{dataset}: an upload, a mixture or a\n merged dataset by name. Not an upload a merge took: name its\n merged dataset; a pin of one of its own tags, left from before, stays."
          },
          "label": {
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Source_LabelMatch"
              }
            ],
            "description": "Every upload and merged dataset with this label value, present and\n future: a merged dataset by its own labels (a method by its own method\n tags, the union of its uploads', and then all of it), and no upload a\n merge took."
          },
          "linkedTask": {
            "type": "string",
            "description": "accounts/{account}/tasks/{task}: every episode linked to this task,\n present and future: its own Episode.linked_task, else its\n upload's or merged dataset's (Dataset.linked_task). An upload linked\n to another task brings in only its episodes linked to this one; no upload a merge took. A task of the\n mixture's account; NOT_FOUND otherwise. Deleting the task is not\n refused: the source stays, reads nothing and says so in `state`\n (TASK_DELETED)."
          },
          "follow": {
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Follow"
              }
            ],
            "description": "How it is followed; unset means stable. A pin names a tag of `dataset`;\n a label or task source can only follow a channel."
          },
          "resolutions": {
            "readOnly": true,
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.Source_Resolution"
            },
            "description": "What it resolves to now, one row per dataset (one for a dataset source,\n every matching upload and merged dataset for a label source)."
          },
          "episodeCount": {
            "readOnly": true,
            "type": "string",
            "description": "Episodes it brings into head, after this mixture's rejects."
          },
          "inheritedRejectCount": {
            "readOnly": true,
            "type": "string",
            "description": "Mixture source only: episodes the source mixture had rejected itself,\n inherited unseen."
          },
          "update": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Source_Update"
              }
            ],
            "description": "Pinned source only: set when a newer stable tag exists."
          },
          "creator": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Actor"
              }
            ],
            "description": "Who added it."
          },
          "createTime": {
            "readOnly": true,
            "type": "string",
            "description": "When it was added.",
            "format": "date-time"
          },
          "updateTime": {
            "readOnly": true,
            "type": "string",
            "description": "When its follow last changed.",
            "format": "date-time"
          },
          "etag": {
            "type": "string",
            "description": "Sent back on UpdateSource."
          },
          "position": {
            "type": "integer",
            "description": "Its place in the sources panel, from 0; the first source that brings an\n episode in is the one it counts under. A new source goes last; setting it\n moves the others along.",
            "format": "int32"
          },
          "state": {
            "readOnly": true,
            "enum": [
              "STATE_UNSPECIFIED",
              "ACTIVE",
              "TASK_DELETED"
            ],
            "type": "string",
            "description": "Whether it can still read what it names; TASK_DELETED once its\n `linked_task` is gone.",
            "format": "enum"
          }
        },
        "description": "One thing a mixture reads: an upload or another mixture by name,\n or every upload carrying one label value, now and later. Each is followed\n on a channel or pinned to a tag. An upload or label source arrives raw\n (what the upload kept); a mixture source arrives curated (what it yields,\n its own rejects already out, and inherited). A mixture cannot read itself,\n however far round. There are no weights.\n\n Served by qds-api. Only a MIXTURE dataset has sources."
      },
      "qualia.v1.SourceCommit": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "accounts/{account}/datasets/{dataset}/versions/{version}/sourceCommits/{source_commit},\n under the tag's own name (not `stable` or a digest prefix)."
          },
          "dataset": {
            "readOnly": true,
            "type": "string",
            "description": "accounts/{account}/datasets/{dataset}: the upload the commit published."
          },
          "repoId": {
            "readOnly": true,
            "type": "string",
            "description": "The upload's Git repository, a UUID."
          },
          "gitOid": {
            "readOnly": true,
            "type": "string",
            "description": "The Git object id of the commit, lowercase hex."
          },
          "gitHashAlgorithm": {
            "readOnly": true,
            "type": "string",
            "description": "The hash the object id is in: \"sha1\" or \"sha256\"."
          },
          "publicationGeneration": {
            "readOnly": true,
            "type": "string",
            "description": "The publication of refs/heads/main that wrote the commit; counts up\n from 1 per repository."
          },
          "semanticCommitId": {
            "readOnly": true,
            "type": "string",
            "description": "The commit's identity across hash algorithms, a UUID."
          }
        },
        "description": "One repository commit a tag pins: where the bytes of the episodes it took\n from one upload were published. A tag's commits never change.\n\n The {source_commit} id is `<upload uuid>-<semantic commit uuid>`."
      },
      "qualia.v1.Source_LabelMatch": {
        "required": [
          "field",
          "value"
        ],
        "type": "object",
        "properties": {
          "field": {
            "enum": [
              "FIELD_UNSPECIFIED",
              "TASK",
              "ROBOT",
              "OPERATOR",
              "METHOD",
              "SCENE"
            ],
            "type": "string",
            "description": "The label.",
            "format": "enum"
          },
          "value": {
            "type": "string",
            "description": "The value it must equal, exactly."
          }
        },
        "description": "Every upload of the same account (kind UPLOAD only, never a mixture)\n whose label equals a value."
      },
      "qualia.v1.Source_Resolution": {
        "type": "object",
        "properties": {
          "dataset": {
            "readOnly": true,
            "type": "string",
            "description": "accounts/{account}/datasets/{dataset}"
          },
          "kind": {
            "readOnly": true,
            "enum": [
              "KIND_UNSPECIFIED",
              "UPLOAD",
              "MIXTURE",
              "MERGED"
            ],
            "type": "string",
            "description": "Upload, merged dataset or mixture.",
            "format": "enum"
          },
          "version": {
            "readOnly": true,
            "type": "string",
            "description": "The tag it is read at; empty at head."
          },
          "digest": {
            "readOnly": true,
            "type": "string",
            "description": "The digest it is read at."
          },
          "episodeCount": {
            "readOnly": true,
            "type": "string",
            "description": "Episodes it brings in, before this mixture's rejects."
          },
          "rejectedCount": {
            "readOnly": true,
            "type": "string",
            "description": "Episodes this mixture rejected among them."
          },
          "empty": {
            "readOnly": true,
            "type": "boolean",
            "description": "Nothing to read: the followed channel has no tag yet (stable on a\n dataset still in review)."
          },
          "reviewedCount": {
            "readOnly": true,
            "type": "string",
            "description": "Upload or merged dataset (over the uploads it holds) only: ruled /\n total, for the sources panel's progress."
          },
          "totalCount": {
            "readOnly": true,
            "type": "string",
            "description": "Upload or merged dataset (over the uploads it holds) only: total\n episodes."
          }
        },
        "description": "One dataset the source resolved to, and where it is read."
      },
      "qualia.v1.Source_Update": {
        "type": "object",
        "properties": {
          "version": {
            "readOnly": true,
            "type": "string",
            "description": "The newer tag."
          },
          "addedCount": {
            "readOnly": true,
            "type": "string",
            "description": "Episodes it would add."
          },
          "removedCount": {
            "readOnly": true,
            "type": "string",
            "description": "Episodes it would remove."
          },
          "changedCount": {
            "readOnly": true,
            "type": "string",
            "description": "Episodes in both at another revision."
          }
        },
        "description": "A newer stable tag than the pin, and what moving would change."
      },
      "qualia.v1.SplitEpisodesRequest": {
        "required": [
          "parent"
        ],
        "type": "object",
        "properties": {
          "parent": {
            "type": "string",
            "description": "accounts/{account}/datasets/{dataset}: must be the upload."
          },
          "cutPlan": {
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.SplitEpisodesRequest_CutPlan"
              }
            ],
            "description": "Explicit cuts."
          },
          "markerCuts": {
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.SplitEpisodesRequest_MarkerCuts"
              }
            ],
            "description": "Marker cuts."
          },
          "validateOnly": {
            "type": "boolean",
            "description": "Report the children without writing them."
          }
        },
        "description": "Request for Episodes.SplitEpisodes."
      },
      "qualia.v1.SplitEpisodesRequest_CutPlan": {
        "type": "object",
        "properties": {
          "episodes": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.SplitEpisodesRequest_Cuts"
            },
            "description": "One entry per episode, at most 500."
          }
        },
        "description": "Explicit cuts for several episodes, drawn together: all or none."
      },
      "qualia.v1.SplitEpisodesRequest_Cuts": {
        "type": "object",
        "properties": {
          "episode": {
            "type": "string",
            "description": "accounts/{account}/datasets/{dataset}/episodes/{episode}"
          },
          "cutSeconds": {
            "type": "array",
            "items": {
              "type": "number",
              "format": "double"
            },
            "description": "Cut points, seconds from the start of the recording. An episode is\n cut inside the one stretch its draft keeps, else inside its trim: its\n pieces keep only those frames, and a cut outside them places nothing."
          },
          "keepWindows": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.Episode_Trim"
            },
            "description": "The windows to keep instead, seconds from the start of the\n recording, in time order and not overlapping: each becomes one child,\n and what lies outside every window is in no child. Two windows that\n touch are two children. A window may keep frames the episode's trim\n cut (kept_trimmed_frame_count says how many). Not with cut_seconds."
          }
        },
        "description": "Where to cut one episode."
      },
      "qualia.v1.SplitEpisodesRequest_MarkerCuts": {
        "type": "object",
        "properties": {
          "selection": {
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.EpisodeSelection"
              }
            ],
            "description": "Episodes to cut."
          },
          "labels": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Marker labels to cut at; empty means every marker (none when\n start_labels or end_labels is set)."
          },
          "startFirstMarker": {
            "type": "boolean",
            "description": "Drop what comes before the first marker."
          },
          "endLastMarker": {
            "type": "boolean",
            "description": "Drop what comes after the last marker."
          },
          "startLabels": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Start each episode at its first marker among these labels instead,\n dropping the lead-in. Not with start_first_marker. Without `labels`,\n nothing is cut: each episode becomes one child, its narrowed window."
          },
          "endLabels": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "End each episode at its last marker among these labels instead,\n dropping the run-out. Not with end_last_marker. Without `labels`, as\n start_labels."
          }
        },
        "description": "Cut every selected episode at its recorder markers, inside its trim\n when it is trimmed: a marker the trim cut names nothing."
      },
      "qualia.v1.SplitEpisodesResponse": {
        "type": "object",
        "properties": {
          "splits": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.SplitEpisodesResponse_Split"
            },
            "description": "One per parent that was cut."
          },
          "lockedCount": {
            "type": "integer",
            "description": "Parents left uncut because another person holds their edit lease.",
            "format": "int32"
          },
          "locked": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.LockedEpisode"
            },
            "description": "The first 100 of them, with their holders."
          },
          "skipped": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.SplitEpisodesResponse_Skipped"
            },
            "description": "Marker splits left unchanged for a reason other than an edit lease.\n Includes refusals found while planning and while saving the drawing."
          }
        },
        "description": "Response for Episodes.SplitEpisodes."
      },
      "qualia.v1.SplitEpisodesResponse_Skipped": {
        "type": "object",
        "properties": {
          "episode": {
            "type": "string",
            "description": "The parent episode left unchanged."
          },
          "reason": {
            "type": "string",
            "description": "Why no split was drawn, including an already drawn split or no marker."
          }
        },
        "description": "A marker split that could not be drawn. Other selected takes proceed."
      },
      "qualia.v1.SplitEpisodesResponse_Split": {
        "type": "object",
        "properties": {
          "episode": {
            "type": "string",
            "description": "The parent episode."
          },
          "children": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Empty: the split is drawn on the parent's draft (`draft`), and its\n pieces are made only when a version is published from it. With\n validate_only, a name for each piece, which never exists."
          },
          "droppedLeadFrameCount": {
            "type": "string",
            "description": "Frames of the recording before the first child that no child keeps\n (the dropped lead-in, with what the episode's trim cut there)."
          },
          "droppedTailFrameCount": {
            "type": "string",
            "description": "Frames of the recording after the last child that no child keeps (the\n dropped run-out, with what the episode's trim cut there)."
          },
          "droppedBetweenFrameCount": {
            "type": "string",
            "description": "Frames between children that no child keeps (keep_windows apart)."
          },
          "keptTrimmedFrameCount": {
            "type": "string",
            "description": "Frames the children keep that the episode's trim had cut: keep_windows\n may reach past the trim, cut_seconds and marker cuts never do. 0 for an untrimmed episode."
          },
          "draft": {
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.EpisodeDraft"
              }
            ],
            "description": "The parent's draft, drawn with the split: the pieces it keeps, each\n an episode once a version is published from it. Unset with\n validate_only."
          },
          "pieceCount": {
            "type": "integer",
            "description": "How many pieces the split keeps.",
            "format": "int32"
          }
        },
        "description": "One parent and what it became."
      },
      "qualia.v1.Stamp": {
        "type": "object",
        "properties": {
          "actor": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Actor"
              }
            ],
            "description": "Who."
          },
          "stampTime": {
            "readOnly": true,
            "type": "string",
            "description": "When.",
            "format": "date-time"
          }
        },
        "description": "A signature: who and when. Used for dismissals, conversions and decisions."
      },
      "qualia.v1.StartMaterializationRequest": {
        "required": [
          "name"
        ],
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "accounts/{account}/datasets/{dataset}/versions/{version}/materializations/{materialization}:\n a tag, `stable` or a digest prefix, and the layout."
          }
        },
        "description": "Request for Versions.StartMaterialization."
      },
      "qualia.v1.StateCheck": {
        "required": [
          "text"
        ],
        "type": "object",
        "properties": {
          "text": {
            "type": "string",
            "description": "What must hold, in 1 to 500 characters. Needed to publish."
          },
          "numeric": {
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.NumericCondition"
              }
            ],
            "description": "A numeric form of the condition, when it can be measured. Only a person\n writes one: it publishes only with `numeric_set`."
          },
          "numericSet": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.PersonSet"
              }
            ],
            "description": "The person who set `numeric` to its current value. Written only by the\n server, from UpdateTaskRequest.person_set. It follows the numeric form\n within its step and is cleared when that form changes without it."
          }
        },
        "description": "An observable condition at a procedure step, optionally expressed as a number."
      },
      "qualia.v1.Status": {
        "type": "object",
        "properties": {
          "operation": {
            "readOnly": true,
            "type": "string",
            "description": "The operation's id: the owning row's UUID in canonical form, e.g.\n \"3f2b8c1e-7d4a-4e9b-9c2f-0a6e5d1b8f47\", never a path with a slash.\n Event.operation on each of its events."
          },
          "service": {
            "readOnly": true,
            "type": "string",
            "description": "The service that runs it, and that a cancel goes to: \"qds\", \"training\",\n \"pipeline\", ..."
          },
          "kind": {
            "readOnly": true,
            "enum": [
              "KIND_UNSPECIFIED",
              "INGEST",
              "IMPORT",
              "HEALTH",
              "CURATION",
              "EXPORT",
              "RESYNC",
              "SPLIT",
              "CHECKS",
              "JUDGE",
              "REACH",
              "TRAINING_JOB",
              "PIPELINE_RUN",
              "PIPELINE_OP",
              "CURATION_APPLY",
              "EPISODE_REVISION"
            ],
            "type": "string",
            "description": "What kind of work it is.",
            "format": "enum"
          },
          "target": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Subject"
              }
            ],
            "description": "What it works on, e.g. a dataset."
          },
          "state": {
            "readOnly": true,
            "enum": [
              "STATE_UNSPECIFIED",
              "QUEUED",
              "RUNNING",
              "FINISHED",
              "FAILED",
              "CANCELLED"
            ],
            "type": "string",
            "description": "Where it is.",
            "format": "enum"
          },
          "actor": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Actor"
              }
            ],
            "description": "Who started it."
          },
          "progress": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Status_Progress"
              }
            ],
            "description": "How far it has got; unset when the service posted nothing or the work\n has ended."
          },
          "createTime": {
            "readOnly": true,
            "type": "string",
            "description": "When it was queued (its first event).",
            "format": "date-time"
          },
          "updateTime": {
            "readOnly": true,
            "type": "string",
            "description": "When its state or progress last changed.",
            "format": "date-time"
          },
          "response": {
            "type": "object",
            "description": "FINISHED: what the work produced, as protojson, when it has a result."
          },
          "error": {
            "type": "string",
            "description": "FAILED: one plain line on why."
          },
          "name": {
            "type": "string",
            "description": "accounts/{account}/workspaces/{workspace}/statuses/{operation}, or\n accounts/{account}/statuses/{operation} for work of the organization\n itself. The last segment is `operation`.\n accounts/{account}/statuses/{operation} reads any of them."
          },
          "origin": {
            "readOnly": true,
            "enum": [
              "ORIGIN_UNSPECIFIED",
              "WORKSPACE",
              "ORGANIZATION"
            ],
            "type": "string",
            "description": "Whether the work runs in a workspace or in the organization itself.",
            "format": "enum"
          },
          "cancellable": {
            "readOnly": true,
            "type": "boolean",
            "description": "Whether this service and kind support CancelStatus. Authorization and\n the current state are checked again when cancellation is requested."
          }
        },
        "description": "Running work, and how it ended: an ingest, a check run, a training job, a\n pipeline run.\n\n This is not a `google.rpc.Status` (an error code and message). It is the\n state of one operation, rebuilt from its latest OPERATION_* event in the\n record (QUEUED, STARTED, FINISHED, FAILED, CANCELLED), joined with the\n progress its service last posted. Progress is never an event and never sets\n the state, so a late progress write cannot undo a final state.\n\n Served by events. Work is named under its workspace; work of\n the organization itself is named under the organization (`origin`\n ORGANIZATION). Every status can also be read by its organization path."
      },
      "qualia.v1.Status_Progress": {
        "type": "object",
        "properties": {
          "phase": {
            "readOnly": true,
            "type": "string",
            "description": "The current phase, e.g. \"derive\"."
          },
          "done": {
            "readOnly": true,
            "type": "string",
            "description": "Units done in this phase."
          },
          "total": {
            "readOnly": true,
            "type": "string",
            "description": "Units in this phase; 0 when unknown."
          },
          "message": {
            "readOnly": true,
            "type": "string",
            "description": "The work's own line about where it is, e.g. \"epoch 3\"; empty when its\n service sent none."
          }
        },
        "description": "How far the work has got, as its service last posted. Cleared once the\n work ends."
      },
      "qualia.v1.Step": {
        "required": [
          "id"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Stable within the procedure, e.g. \"place_box\": given by the editor when the\n step is made and not changed after. 1 to 64 lowercase letters, digits or\n '_', starting with a letter. Unique within the procedure."
          },
          "kind": {
            "enum": [
              "KIND_UNSPECIFIED",
              "START",
              "ACTION",
              "SUCCESS",
              "FAILURE",
              "RECOVERY"
            ],
            "type": "string",
            "description": "What the step is.",
            "format": "enum"
          },
          "description": {
            "type": "string",
            "description": "The step in one line, as it observably holds: what an action or\n recovery gets done (e.g. \"place the box upright on the shelf\"), what an\n outcome looks like. At most 200 characters. Needed to publish, except on\n the start and on a step that stands for a task (`task`), which is named\n by the task."
          },
          "task": {
            "type": "string",
            "description": "An action that is a whole other task of the same account,\n accounts/{account}/tasks/{task}. In a draft it means that task's newest\n published revision; publishing pins it, so a revision's steps name\n accounts/{account}/tasks/{task}/revisions/{revision}. A task never\n contains itself, directly or through others. Such a step takes its name\n from the task and leaves `description` empty."
          },
          "minCount": {
            "type": "integer",
            "description": "The fewest times an action (or recovery) happens in a successful\n attempt: 0 or more; 0 makes it optional, e.g. a step only some attempts\n need. With both counts unset the step is not counted: checks report how\n often it happened and never flag it. Checks enforce a count only when\n `count_set` names the person who set it.",
            "format": "int32"
          },
          "maxCount": {
            "type": "integer",
            "description": "The most times an action (or recovery) happens in a successful attempt,\n e.g. 4 box placements: 1 or more, and at least `min_count`. Unset is no\n limit. Exactly N is both N; up to N is `max_count` N alone.",
            "format": "int32"
          },
          "triggers": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "What observably sets a recovery off (\"When\"), e.g. \"the box slips in the\n gripper\". Only a recovery has triggers, and it needs one to publish. At\n most 16, each 1 to 500 characters."
          },
          "stateChecks": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.StateCheck"
            },
            "description": "Conditions that observably hold at this step. At most 16; each needs\n text to publish and may also name a numeric condition. Not on START."
          },
          "bounds": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.Bound"
            },
            "description": "Metric limits for this step. At most 8. Not on START."
          },
          "countSet": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.PersonSet"
              }
            ],
            "description": "The person who set `min_count` and `max_count` to their current values.\n Written only by the server, from UpdateTaskRequest.person_set; cleared\n when either count, the kind or `task` changes without it. Unset means the\n counts are not enforced, whatever they are."
          }
        },
        "description": "A state of the task: its start, an action, a recovery, or an outcome it\n ends in."
      },
      "qualia.v1.Subject": {
        "type": "object",
        "properties": {
          "type": {
            "readOnly": true,
            "type": "string",
            "description": "What kind of thing, e.g. \"dataset\", \"episode\", \"robot\", \"workspace\"."
          },
          "name": {
            "readOnly": true,
            "type": "string",
            "description": "Its resource name or id, e.g. \"accounts/a/datasets/d\"."
          },
          "label": {
            "readOnly": true,
            "type": "string",
            "description": "What a person called it at the time, e.g. \"Pick and place, v2\"."
          }
        },
        "description": "A thing an event or a status points at. Labels are captured when the event\n is written, so a renamed or deleted thing still reads as it was."
      },
      "qualia.v1.SummarizeEpisodesResponse": {
        "type": "object",
        "properties": {
          "episodeCount": {
            "type": "string",
            "description": "Episodes the filter leaves."
          },
          "durationSeconds": {
            "type": "number",
            "description": "Their recorded time, seconds.",
            "format": "double"
          },
          "frameCount": {
            "type": "string",
            "description": "Frames."
          },
          "facets": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.SummarizeEpisodesResponse_Facet"
            },
            "description": "One per requested facet."
          },
          "distributions": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.SummarizeEpisodesResponse_Distribution"
            },
            "description": "One per requested metric."
          }
        },
        "description": "Response for Episodes.SummarizeEpisodes."
      },
      "qualia.v1.SummarizeEpisodesResponse_Distribution": {
        "type": "object",
        "properties": {
          "field": {
            "type": "string",
            "description": "The metric field."
          },
          "sampleCount": {
            "type": "string",
            "description": "Episodes with a value."
          },
          "quantiles": {
            "type": "array",
            "items": {
              "type": "number",
              "format": "double"
            },
            "description": "p05, p10, p25, p50, p75, p90, p95."
          },
          "binEdges": {
            "type": "array",
            "items": {
              "type": "number",
              "format": "double"
            },
            "description": "Bin edges, bin_count + 1 values."
          },
          "binCounts": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Episodes per bin."
          },
          "fenceLow": {
            "type": "number",
            "description": "Lower and upper fences the checks use for this metric in this dataset\n (Q1 - 3 IQR, Q3 + 3 IQR over its robot's reference); NaN when unfenced.",
            "format": "double"
          },
          "fenceHigh": {
            "type": "number",
            "description": "Upper fence.",
            "format": "double"
          }
        },
        "description": "One metric's distribution over the filtered episodes."
      },
      "qualia.v1.SummarizeEpisodesResponse_Facet": {
        "type": "object",
        "properties": {
          "field": {
            "type": "string",
            "description": "The facet field."
          },
          "buckets": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.Facet_Bucket"
            },
            "description": "Buckets, largest first."
          },
          "otherCount": {
            "type": "string",
            "description": "Distinct values beyond the buckets returned."
          }
        },
        "description": "One facet: counts per value."
      },
      "qualia.v1.SummarizeIssuesResponse": {
        "type": "object",
        "properties": {
          "rows": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.SummarizeIssuesResponse_Row"
            },
            "description": "One row per code, most open first."
          }
        },
        "description": "Response for Issues.SummarizeIssues."
      },
      "qualia.v1.SummarizeIssuesResponse_Row": {
        "type": "object",
        "properties": {
          "code": {
            "type": "string",
            "description": "The code; empty groups a person's own words."
          },
          "kind": {
            "enum": [
              "KIND_UNSPECIFIED",
              "TAKE",
              "RECORDING",
              "SCENE",
              "MOTION",
              "GRIPPER",
              "CONTROL",
              "DISTRIBUTION",
              "MIXTURE"
            ],
            "type": "string",
            "description": "Its kind.",
            "format": "enum"
          },
          "title": {
            "type": "string",
            "description": "Its label."
          },
          "authorKind": {
            "enum": [
              "KIND_UNSPECIFIED",
              "PERSON",
              "VALIDATION",
              "RULE",
              "MODEL",
              "OPERATOR",
              "SYSTEM"
            ],
            "type": "string",
            "description": "Who raises it.",
            "format": "enum"
          },
          "blocks": {
            "type": "boolean",
            "description": "Whether it blocks (false for notes)."
          },
          "openCount": {
            "type": "string",
            "description": "Open issues with this code."
          },
          "dismissedCount": {
            "type": "string",
            "description": "Dismissed issues with this code."
          },
          "openEpisodeCount": {
            "type": "string",
            "description": "Distinct episodes with an open one."
          }
        },
        "description": "One row: a code and how often it stands in each state."
      },
      "qualia.v1.TakeOverEpisodeLeaseRequest": {
        "required": [
          "episode",
          "tab"
        ],
        "type": "object",
        "properties": {
          "episode": {
            "type": "string",
            "description": "accounts/{account}/datasets/{dataset}/episodes/{episode}"
          },
          "tab": {
            "type": "string",
            "description": "The caller's tab."
          }
        },
        "description": "Request for Episodes.TakeOverEpisodeLease."
      },
      "qualia.v1.TakeOverEpisodeLeaseResponse": {
        "type": "object",
        "properties": {
          "lease": {
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Episode_Lease"
              }
            ],
            "description": "The caller's lease."
          }
        },
        "description": "Response for Episodes.TakeOverEpisodeLease."
      },
      "qualia.v1.Task": {
        "required": [
          "displayName"
        ],
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "accounts/{account}/tasks/{task}"
          },
          "displayName": {
            "type": "string",
            "description": "The library label, e.g. \"Restock shelf\". Not unique and not an\n identity: two tasks may share it. 1 to 32 characters; a longer name\n stored before that cap stays until the task is renamed, and the task\n publishes only once renamed."
          },
          "draft": {
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.TaskSpec"
              }
            ],
            "description": "The working copy. Saving it checks lengths only, so an incomplete draft\n saves; PublishTask checks that it is complete."
          },
          "revision": {
            "readOnly": true,
            "type": "integer",
            "description": "The newest published revision number; 0 before the first publish.",
            "format": "int32"
          },
          "unpublishedChanges": {
            "readOnly": true,
            "type": "boolean",
            "description": "The draft differs from the newest published revision (or nothing is\n published yet)."
          },
          "creator": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Actor"
              }
            ],
            "description": "Who created it."
          },
          "createTime": {
            "readOnly": true,
            "type": "string",
            "description": "When it was created.",
            "format": "date-time"
          },
          "updateTime": {
            "readOnly": true,
            "type": "string",
            "description": "When the task or its draft last changed.",
            "format": "date-time"
          },
          "etag": {
            "type": "string",
            "description": "Sent back on UpdateTask and PublishTask to refuse a stale write."
          },
          "references": {
            "writeOnly": true,
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.TaskReference"
            },
            "description": "CreateTask only: episodes the person picked as references, created with\n the task in one write by the rules of CreateTaskReference (their names\n and output fields are ignored). Read them back with ListTaskReferences."
          },
          "labels": {
            "readOnly": true,
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "The episode task labels it links beside its name: the whole\n instructions a short name was made from (a draft preparation named after\n the dataset's own task strings). Episodes.LinkTaskLabels and the link on\n publish match them as they match the name, against an episode's task\n label, never its instruction."
          }
        },
        "description": "A task: what a robot should do and how success shows, in prose. A task is\n reusable across datasets, robots and stages of a policy's life: operators\n collect against it, curation judges episodes against it, evals score\n rollouts against it.\n\n A task holds one editable `draft`. Publishing it writes an immutable,\n numbered TaskRevision, so editing never changes what was published.\n\n Served by tasks."
      },
      "qualia.v1.TaskDraft": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "accounts/{account}/tasks/{task}/drafts/{draft}."
          },
          "state": {
            "readOnly": true,
            "enum": [
              "STATE_UNSPECIFIED",
              "RUNNING",
              "SUCCEEDED",
              "FAILED",
              "CANCELLED"
            ],
            "type": "string",
            "description": "Current state of the run.",
            "format": "enum"
          },
          "references": {
            "readOnly": true,
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.TaskReference"
            },
            "description": "The exact references picked when the run started, not a live task read."
          },
          "proposal": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.TaskSpec"
              }
            ],
            "description": "The model's five TaskSpec text fields and proposed procedure."
          },
          "graph": {
            "readOnly": true,
            "type": "string",
            "description": "valid, valid_after_retry or dropped; only valid graphs can be applied."
          },
          "model": {
            "readOnly": true,
            "type": "string",
            "description": "The Qualia model tier that drafted this proposal, e.g. \"qualia-vlm-fast\"."
          },
          "estimatedCredits": {
            "readOnly": true,
            "type": "string",
            "description": "Credits estimated for the full selection and synthesis."
          },
          "maxCost": {
            "readOnly": true,
            "type": "string",
            "description": "Person-specified spending cap, or zero when none was specified."
          },
          "error": {
            "readOnly": true,
            "type": "string",
            "description": "Failure reason, if the run did not produce a usable proposal."
          },
          "createTime": {
            "readOnly": true,
            "type": "string",
            "description": "When the proposal was requested.",
            "format": "date-time"
          },
          "updateTime": {
            "readOnly": true,
            "type": "string",
            "description": "When its status was last refreshed.",
            "format": "date-time"
          }
        },
        "description": "One proposal and its run status. Applying and publishing are Tasks writes."
      },
      "qualia.v1.TaskLabelMatch": {
        "type": "object",
        "properties": {
          "label": {
            "type": "string",
            "description": "The label as stored."
          },
          "exact": {
            "type": "boolean",
            "description": "Whether it is the task's name, surrounding whitespace aside. Other\n matches are near misses."
          },
          "episodeCount": {
            "type": "integer",
            "description": "Unlinked episodes whose task label it is.",
            "format": "int32"
          },
          "datasetCount": {
            "type": "integer",
            "description": "Unlinked uploads and merged datasets whose task label it is.",
            "format": "int32"
          }
        },
        "description": "Unlinked episodes, uploads and merged datasets that carry one label."
      },
      "qualia.v1.TaskMatch_Candidate": {
        "type": "object",
        "properties": {
          "task": {
            "type": "string",
            "description": "tasks/{task}"
          },
          "displayName": {
            "type": "string",
            "description": "The Task's name."
          },
          "score": {
            "type": "number",
            "description": "Match score, 0 to 1.",
            "format": "double"
          }
        },
        "description": "Another Task the match scored."
      },
      "qualia.v1.TaskReference": {
        "required": [
          "role",
          "episode"
        ],
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "accounts/{account}/tasks/{task}/references/{reference}"
          },
          "role": {
            "enum": [
              "ROLE_UNSPECIFIED",
              "SUCCESS",
              "FAILURE",
              "RECOVERY"
            ],
            "type": "string",
            "description": "What it shows.",
            "format": "enum"
          },
          "mode": {
            "type": "string",
            "description": "FAILURE and RECOVERY: the mode's short name, e.g. \"drops the box\", which\n groups the references that show it. 1 to 80 characters; a mode has one\n role. Empty for SUCCESS."
          },
          "episode": {
            "type": "string",
            "description": "The episode: accounts/{account}/datasets/{dataset}/episodes/{episode},\n in the task's account; immutable. Named by the upload it was recorded in\n (Episode.upload), or by the merged dataset that holds that upload; it is\n kept and returned as its upload names it, and lives as long as that\n upload does."
          },
          "startSeconds": {
            "type": "number",
            "description": "The part of the episode it shows, in seconds from its start. Both unset\n means the whole episode; when set, 0 <= start_seconds < end_seconds.",
            "format": "double"
          },
          "endSeconds": {
            "type": "number",
            "description": "See start_seconds.",
            "format": "double"
          },
          "creator": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Actor"
              }
            ],
            "description": "Who picked it."
          },
          "createTime": {
            "readOnly": true,
            "type": "string",
            "description": "When it was picked.",
            "format": "date-time"
          },
          "proposedBy": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Actor"
              }
            ],
            "description": "Who proposed it. A person's own pick is confirmed immediately."
          },
          "confirmedBy": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Actor"
              }
            ],
            "description": "The first person to confirm it; unset while unconfirmed."
          }
        },
        "description": "An episode proposed to show the task: done (SUCCESS), or going\n wrong in a named way (a FAILURE or RECOVERY mode). A reference points at\n the episode and copies no media, so it lives while its task and its\n dataset do: deleting the task deletes it, and deleting the dataset removes\n it (the task and everything written from the reference stay). Nothing is\n confirmed for a person: a model's proposal needs a person's confirmation.\n\n A task holds 1 to 3 SUCCESS references and any number of modes, each 1 to\n 2 references. Picking one needs read access to the episode's dataset."
      },
      "qualia.v1.TaskRevision": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "accounts/{account}/tasks/{task}/revisions/{revision}"
          },
          "revision": {
            "readOnly": true,
            "type": "integer",
            "description": "1, 2, 3, ... in publishing order.",
            "format": "int32"
          },
          "displayName": {
            "readOnly": true,
            "type": "string",
            "description": "The task's display name when it was published."
          },
          "spec": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.TaskSpec"
              }
            ],
            "description": "The specification, exactly as published."
          },
          "schemaVersion": {
            "readOnly": true,
            "type": "integer",
            "description": "The version of the TaskSpec schema it was written with. Readers reject a\n version they do not know rather than guess.",
            "format": "int32"
          },
          "contentHash": {
            "readOnly": true,
            "type": "string",
            "description": "sha256 of the spec's canonical JSON: two revisions with one hash say the\n same thing, and a run can pin the content it read."
          },
          "note": {
            "readOnly": true,
            "type": "string",
            "description": "What changed, in the publisher's words."
          },
          "publisher": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Actor"
              }
            ],
            "description": "Who published it."
          },
          "createTime": {
            "readOnly": true,
            "type": "string",
            "description": "When it was published.",
            "format": "date-time"
          }
        },
        "description": "A published, immutable task specification. Episodes judged and evals\n scored against a task cite one of these, so results stay comparable: a\n revision never changes once written."
      },
      "qualia.v1.TaskSpec": {
        "type": "object",
        "properties": {
          "description": {
            "type": "string",
            "description": "What the robot should do, in ordinary language. Required to publish."
          },
          "scene": {
            "type": "string",
            "description": "The scene the task runs in: the workspace, the objects that matter, how\n things start and what varies between episodes."
          },
          "steps": {
            "type": "string",
            "description": "The steps of the task in order, one per line, e.g. \"pick a box from the\n tray\"."
          },
          "success": {
            "type": "string",
            "description": "How success shows: what has to be true, or seen happening, for an\n episode to succeed. Required to publish."
          },
          "failure": {
            "type": "string",
            "description": "How it fails: the ways the task goes wrong, and what looks like a\n failure but is fine."
          },
          "procedure": {
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Procedure"
              }
            ],
            "description": "The task as a state machine of steps and transitions, beside the prose.\n Optional; when it has steps, publishing checks that it is well formed."
          }
        },
        "description": "What a task asks for, as five pieces of prose. Each is plain multi-line\n text of at most 20000 characters. Every field is optional while drafting;\n publishing needs `description` and `success`. An optional `procedure` lays\n the task out as a state machine beside the prose."
      },
      "qualia.v1.TaskStrings_Candidate": {
        "type": "object",
        "properties": {
          "key": {
            "type": "string",
            "description": "ts_<sha12> of the normalised string."
          },
          "text": {
            "type": "string",
            "description": "The string as the dataset gives it."
          },
          "episodeCount": {
            "type": "integer",
            "description": "Episodes that carry it.",
            "format": "int32"
          },
          "looksLikeCode": {
            "type": "boolean",
            "description": "It looks like a rig or session code."
          },
          "blocked": {
            "type": "boolean",
            "description": "It can never be confirmed (see blocked_reason)."
          },
          "confirmation": {
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.TaskStrings_Confirmation"
              }
            ],
            "description": "The person's decision; unset when nobody decided."
          },
          "blockedReason": {
            "type": "string",
            "description": "Why it is blocked: outcome words, a code, already a task label."
          }
        },
        "description": "One distinct task name."
      },
      "qualia.v1.TaskStrings_Confirmation": {
        "type": "object",
        "properties": {
          "displayName": {
            "type": "string",
            "description": "The task name the person gave it."
          },
          "confirmed": {
            "type": "boolean",
            "description": "True: use it as a task. False: a person said no."
          },
          "actor": {
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Actor"
              }
            ],
            "description": "Who decided."
          },
          "decideTime": {
            "type": "string",
            "description": "When.",
            "format": "date-time"
          }
        },
        "description": "A person's decision on one name."
      },
      "qualia.v1.TcpCalibration": {
        "required": [
          "filename",
          "hands"
        ],
        "type": "object",
        "properties": {
          "filename": {
            "type": "string",
            "description": "The uploaded file's name, e.g. \"tcp_calibration.json\"."
          },
          "deriveDate": {
            "type": "string",
            "description": "When the calibration was made, \"YYYY-MM-DD\": the leading date of the\n file's `calibrated` or else its `derived` text. Empty when the file gives\n none."
          },
          "hands": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.TcpCalibration_Hand"
            },
            "description": "Both hands, left then right."
          },
          "eeLink": {
            "type": "string",
            "description": "The link of the rig's gripper design that `Hand.ee_to_tcp` is a pose in,\n with `{side}` for \"left\" or \"right\" (the gripper joint's convention in\n RobotModel.Gripper), e.g. \"openarm_{side}_ee_base_link\". Read from the\n file's own description of its end-effector frame. Empty when the file\n names none, lacks the end-effector poses, or they disagree with its\n controller_to_tcp (then no `ee_to_tcp` is set either). Display only.\n\n `ee_to_tcp` is drawn in this link's own frame, which must be the plain\n end-effector frame the file means. An export whose link sits elsewhere\n draws the TCP off by the difference: an OpenArm exported with the xacro\n default collapse_internal_empty_links puts openarm_<side>_ee_base_link at\n link7, 20.5 mm behind the frame the calibration is in."
          }
        },
        "description": "A handheld rig's calibration of its trackers to the gripper's tool centre\n point (TCP, the midpoint of the closed fingertips). It is what a tcp_calibration.json holds as `<side>.controller_to_tcp`: the TCP's pose in\n the tracker's frame, so a pose recorded at a tracker becomes the pose of the\n TCP by composing it with this transform.\n\n A file that also names the gripper's end-effector link gives the same TCP in\n that link's frame (`ee_link`, `Hand.ee_to_tcp`), which is what a rig's\n gripper design (Rig.gripper) draws the TCP with. Those two are for display:\n poses are resolved and uploads converted with `tracker_to_tcp`, `filename`\n and `derive_date` alone, never with `ee_to_tcp`. So compare two calibrations\n on those, `hands[].side` and `hands[].tracker_to_tcp` only: a copy kept\n elsewhere (a dataset keeps the calibration its poses were resolved with)\n carries just those, and a whole-message comparison would call every\n calibration that has the end-effector fields replaced."
      },
      "qualia.v1.TcpCalibration_Hand": {
        "required": [
          "side",
          "trackerToTcp"
        ],
        "type": "object",
        "properties": {
          "side": {
            "enum": [
              "SIDE_UNSPECIFIED",
              "SIDE_LEFT",
              "SIDE_RIGHT"
            ],
            "type": "string",
            "description": "Which hand.",
            "format": "enum"
          },
          "trackerToTcp": {
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Transform"
              }
            ],
            "description": "The TCP's pose in the tracker's frame: xyz in metres and rpy in radians\n (URDF convention, extrinsic XYZ), the file's rotation matrix converted.\n A rotation whose pitch is within a hair of +-90 degrees has no unique\n roll and yaw; it is stored with roll 0."
          },
          "eeToTcp": {
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Transform"
              }
            ],
            "description": "The same TCP in the frame of the gripper design's `ee_link` for this\n hand, in the form of `tracker_to_tcp` (so the same pitch limit). Display\n only. Set with `ee_link` or not at all, and only when it composes with\n the file's controller_to_ee to the file's controller_to_tcp, which is\n what makes the TCP drawn the TCP used."
          }
        },
        "description": "One hand's transform."
      },
      "qualia.v1.TransferDatasetResponse": {
        "type": "object",
        "properties": {
          "dataset": {
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Dataset"
              }
            ],
            "description": "The copy, or the moved dataset."
          },
          "episodeCount": {
            "type": "string",
            "description": "Episodes copied or moved."
          },
          "bytesShared": {
            "type": "string",
            "description": "Bytes of content the copy references: what a byte copy would write."
          },
          "bytesWritten": {
            "type": "string",
            "description": "Bytes written to blob storage by this copy: its own metadata, across\n organizations the blobs repacked, and every file it rewrote. A video it\n rewrote counts twice, because a browser reads a separate object. A copy of\n a whole version writes no media inside one organization."
          },
          "blobsGranted": {
            "type": "string",
            "description": "Across organizations: blobs the target organization was granted."
          },
          "elapsed": {
            "pattern": "^-?(?:0|[1-9][0-9]{0,11})(?:\\.[0-9]{1,9})?s$",
            "type": "string",
            "description": "Server wall time of the whole call, from when it came in to its last\n write; of a copy that ran as a job, from its first call. A retry of a\n finished call answers the first call's."
          },
          "sourceWorkspace": {
            "type": "string",
            "description": "accounts/{account}/workspaces/{workspace}: where the dataset was."
          },
          "targetWorkspace": {
            "type": "string",
            "description": "accounts/{account}/workspaces/{workspace}: where it is now."
          },
          "blobsRepacked": {
            "type": "string",
            "description": "Across organizations: blobs rewritten so the target reads only what it\n copied."
          },
          "referenceRanges": {
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.ReferenceRangeSwitch"
              }
            ],
            "description": "A move: the reference ranges its range checks read change with the\n workspace. Unset for a copy."
          },
          "bytesRewritten": {
            "type": "string",
            "description": "A copy that left episodes out: bytes of the files it rewrote. Unset for a\n whole version and for a move."
          },
          "episodesLeftOut": {
            "type": "integer",
            "description": "A copy that left episodes out: how many of its upload's episodes stayed\n behind. Unset for a whole version and for a move.",
            "format": "int32"
          },
          "job": {
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.CopyJob"
              }
            ],
            "description": "A copy still running; `dataset` is then empty. Call CopyDataset again with\n this `request_id` and `resume_only` to read how far it got."
          },
          "requestId": {
            "type": "string",
            "description": "The id to call again with while `job` is set."
          },
          "pixelsChanged": {
            "type": "boolean",
            "description": "A camera could not be cut where the copy needed, so it was re-encoded to\n AV1 4:2:0: its frames are the same takes, not the same pixels."
          },
          "robotsCleared": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.TransferRobot"
            },
            "description": "Robot references cleared by the transfer."
          },
          "robotsRestored": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.TransferRobot"
            },
            "description": "A move back restored these previously cleared robots."
          },
          "robotsNotRestored": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.TransferRobot"
            },
            "description": "Previous robot references that stayed cleared after this move."
          },
          "targetWorkspaceDisplayName": {
            "type": "string",
            "description": "The target workspace's display name when the transfer finished."
          }
        },
        "description": "Response for Datasets.CopyDataset and Datasets.MoveDataset: the dataset and\n what the transfer cost."
      },
      "qualia.v1.TransferRobot": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "accounts/{account}/robots/{robot}."
          },
          "displayName": {
            "type": "string",
            "description": "The robot's display name at transfer time."
          }
        },
        "description": "A robot named by a transfer, including its name before a later deletion."
      },
      "qualia.v1.Transform": {
        "type": "object",
        "properties": {
          "xyz": {
            "type": "array",
            "items": {
              "type": "number",
              "format": "double"
            },
            "description": "x, y, z in metres."
          },
          "rpy": {
            "type": "array",
            "items": {
              "type": "number",
              "format": "double"
            },
            "description": "roll, pitch, yaw in radians."
          }
        },
        "description": "A 3D rigid transform: translation in metres and roll, pitch, yaw in radians\n (URDF convention, extrinsic XYZ)."
      },
      "qualia.v1.Transition": {
        "required": [
          "source",
          "target"
        ],
        "type": "object",
        "properties": {
          "source": {
            "type": "string",
            "description": "The step it leaves, by id."
          },
          "target": {
            "type": "string",
            "description": "The step it enters, by id."
          }
        },
        "description": "A move from one step to another."
      },
      "qualia.v1.UndoEventRequest": {
        "required": [
          "name"
        ],
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "The event to undo, by its `name`:\n accounts/{account}/workspaces/{workspace}/events/{event} for a\n workspace's, accounts/{account}/events/{event} for the organization's\n own. A workspace's event named by the organization path is refused."
          }
        },
        "description": "Request for Events.UndoEvent."
      },
      "qualia.v1.UndoEventResponse": {
        "type": "object",
        "properties": {
          "event": {
            "type": "string",
            "description": "The event that records the undo, named under the same parent as the\n request; its `undoes` is the undone event's id. It reaches the record,\n and GetEvent, ListEvents and the live stream, when the relay copies it,\n normally within a second."
          }
        },
        "description": "Response for Events.UndoEvent."
      },
      "qualia.v1.UnsplitEpisodeRequest": {
        "required": [
          "name"
        ],
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "accounts/{account}/datasets/{dataset}/episodes/{episode}: the parent."
          }
        },
        "description": "Request for Episodes.UnsplitEpisode."
      },
      "qualia.v1.UnsplitEpisodeResponse": {
        "type": "object",
        "properties": {
          "removedCount": {
            "type": "integer",
            "description": "Children removed.",
            "format": "int32"
          }
        },
        "description": "Response for Episodes.UnsplitEpisode."
      },
      "qualia.v1.UpdateEpisodesRequest": {
        "required": [
          "parent",
          "edits"
        ],
        "type": "object",
        "properties": {
          "parent": {
            "type": "string",
            "description": "accounts/{account}/datasets/{dataset}: every edited episode is one of\n its episodes. A mixture or merged dataset edits through to the upload\n that holds them."
          },
          "edits": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.UpdateEpisodesRequest_Edit"
            },
            "description": "The edits, 1 to 500, each of a different episode."
          },
          "requestId": {
            "type": "string",
            "description": "Optional UUID4 identifying this logical edit. Reusing it with the same\n caller and request returns the original result; different input conflicts.\n When absent, each call starts a new logical edit."
          }
        },
        "description": "Request for Episodes.UpdateEpisodes."
      },
      "qualia.v1.UpdateEpisodesRequest_Edit": {
        "required": [
          "episode"
        ],
        "type": "object",
        "properties": {
          "episode": {
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Episode"
              }
            ],
            "description": "The episode, with its name set; etag guards against a lost update."
          },
          "updateMask": {
            "type": "string",
            "description": "Which fields to change: task, instruction, method, methods, scene,\n tags, outcome, trim, subtasks, or linked_task on its own. Empty means\n the editable fields the episode sets.",
            "format": "field-mask"
          },
          "expectedDraftEtag": {
            "type": "string",
            "description": "The etag of the episode's draft (EpisodeDraft.etag) this edit's trim\n or subtasks are drawn over: another etag, or a draft discarded since,\n is ABORTED. Empty overwrites whatever draft the episode has. On an\n edit that draws neither, INVALID_ARGUMENT."
          }
        },
        "description": "One episode's edit, as UpdateEpisode took it."
      },
      "qualia.v1.UpdateEpisodesResponse": {
        "type": "object",
        "properties": {
          "episodes": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.Episode"
            },
            "description": "The edited episodes, in the order of the edits, read through the parent\n once the call has committed. A replay under the same request_id answers\n the first reply (without its posters, whose signed URLs expire); if that\n reply is no longer kept, an episode changed since answers only its name\n and the revision the call left it at."
          }
        },
        "description": "Response for Episodes.UpdateEpisodes."
      },
      "qualia.v1.Version": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "accounts/{account}/datasets/{dataset}/versions/{version}"
          },
          "tag": {
            "readOnly": true,
            "type": "string",
            "description": "The tag name (\"1.0\"); empty for head."
          },
          "digest": {
            "type": "string",
            "description": "Opaque episode-set identity, \"b3:<hex>\", for the (episode id, episode\n revision) pairs the ref yields. Head and tags use the same account-scoped\n identity. Upgrades preserve current heads and retained version digests.\n Clients compare returned identities rather than computing them.\n On CreateVersion, optionally the head digest seen in the tag dialog: when\n head has moved since, the call fails with ABORTED instead of tagging\n something nobody saw."
          },
          "episodeCount": {
            "readOnly": true,
            "type": "string",
            "description": "Episodes it pins."
          },
          "durationSeconds": {
            "readOnly": true,
            "type": "number",
            "description": "Recorded time it pins, seconds.",
            "format": "double"
          },
          "rejectedCount": {
            "readOnly": true,
            "type": "string",
            "description": "Episodes the dataset itself had rejected (inherited by whoever reads it)."
          },
          "manifest": {
            "readOnly": true,
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.Version_ManifestEntry"
            },
            "description": "Per upload: how finished it was."
          },
          "lock": {
            "readOnly": true,
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.Version_LockEntry"
            },
            "description": "Per mixture source: what it resolved to. Empty for an upload."
          },
          "note": {
            "type": "string",
            "description": "What the version is, in a person's words. Editable after the cut."
          },
          "reference": {
            "readOnly": true,
            "type": "string",
            "description": "The reference a training run cites: \"<Dataset.slug>:<tag>\", e.g.\n \"restock-shelf-mix:1.0\". Unique per account."
          },
          "creator": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Actor"
              }
            ],
            "description": "Who cut it."
          },
          "createTime": {
            "readOnly": true,
            "type": "string",
            "description": "When it was cut.",
            "format": "date-time"
          },
          "updateTime": {
            "readOnly": true,
            "type": "string",
            "description": "When the note last changed.",
            "format": "date-time"
          },
          "etag": {
            "type": "string",
            "description": "Sent back on UpdateVersion."
          },
          "datasetVersionId": {
            "readOnly": true,
            "type": "string",
            "description": "The immutable dataset version the tag pins, a UUID: the id training,\n materialization and health reads take. Tags of one digest\n may share it. Empty for head, which pins nothing."
          },
          "copySource": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Version_CopySource"
              }
            ],
            "description": "Set only on `v0` of a copy, which holds what the copy started with rather\n than what an upload arrived with. ListVersionsResponse.copy_source says the\n same of any dataset, `v0` or not."
          },
          "preview": {
            "readOnly": true,
            "type": "string",
            "description": "accounts/{account}/datasets/{dataset}/versionPreviews/{version_preview}:\n the preview the tag was published from (PublishVersionPreview). Empty\n for a tag of head (CreateVersion), and for head itself."
          },
          "include": {
            "readOnly": true,
            "type": "array",
            "items": {
              "enum": [
                "CLASS_UNSPECIFIED",
                "KEPT_BY_PERSON",
                "KEPT",
                "FLAGGED",
                "REJECTED",
                "REJECTED_BY_PERSON"
              ],
              "type": "string",
              "format": "enum"
            },
            "description": "Which takes the preview took, by how they stood. Empty when `preview` is."
          },
          "includedFlaggedCount": {
            "readOnly": true,
            "type": "string",
            "description": "Episodes it pins that stood FLAGGED when the preview was made."
          },
          "includedRejectedCount": {
            "readOnly": true,
            "type": "string",
            "description": "Episodes it pins that stood REJECTED when the preview was made."
          },
          "editedCount": {
            "readOnly": true,
            "type": "string",
            "description": "Takes published with the edit drawn on them. 0 for a tag of head, which\n has every take as recorded."
          },
          "trimmedCount": {
            "readOnly": true,
            "type": "string",
            "description": "Edited takes published as one new episode (a trim, new subtasks or both)."
          },
          "splitCount": {
            "readOnly": true,
            "type": "string",
            "description": "Edited takes published as two or more new episodes."
          },
          "pieceCount": {
            "readOnly": true,
            "type": "string",
            "description": "New episodes the edited takes became, across every edited take."
          },
          "draftsNotIncluded": {
            "readOnly": true,
            "type": "string",
            "description": "Takes with an edit drawn and not published when a tag of head was made:\n the tag has them as recorded. 0 for a tag published from a preview."
          }
        },
        "description": "A version tag: a human name on what a dataset yielded at one moment. Uploads and mixtures both have them. A tag never moves; many\n tags may share a digest.\n\n The {version} id is the tag name. Two reserved ids resolve instead of\n naming a tag: `stable` (the newest tag) and `head` (what the\n dataset yields now; a Version with no tag).\n A DatasetVersion id (`dataset_version_id`, what an upload prints) names\n the version that has it; a tag cut with that UUID as its name, before such\n names were refused, answers first, and FAILED_PRECONDITION when the two\n are different versions. Any other id that is not a tag is matched as a\n prefix (7+ hex characters) of the dataset's version digests and of their\n DatasetVersion ids without dashes. Those include an upload's\n `v0`, which has no tag row.\n\n Served by qds-api."
      },
      "qualia.v1.VersionPreview": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "accounts/{account}/datasets/{dataset}/versionPreviews/{version_preview}"
          },
          "include": {
            "readOnly": true,
            "type": "array",
            "items": {
              "enum": [
                "CLASS_UNSPECIFIED",
                "KEPT_BY_PERSON",
                "KEPT",
                "FLAGGED",
                "REJECTED",
                "REJECTED_BY_PERSON"
              ],
              "type": "string",
              "format": "enum"
            },
            "description": "Which takes it took, by how they stood when it was made."
          },
          "state": {
            "readOnly": true,
            "enum": [
              "STATE_UNSPECIFIED",
              "MEASURING",
              "READY",
              "PUBLISHING",
              "PUBLISHED",
              "FAILED",
              "DISCARDED",
              "SUPERSEDED",
              "EXPIRED"
            ],
            "type": "string",
            "description": "Where it is.",
            "format": "enum"
          },
          "measuredWindowCount": {
            "readOnly": true,
            "type": "string",
            "description": "Windows measured so far, of `window_count`. A window is one stretch of\n one take the version would hold: the take as recorded, its trim, or one\n piece of its split."
          },
          "windowCount": {
            "readOnly": true,
            "type": "string",
            "description": "Windows to measure."
          },
          "episodeCount": {
            "readOnly": true,
            "type": "string",
            "description": "Episodes the version would pin: each take it has as recorded, and each\n new episode an edited take becomes."
          },
          "durationSeconds": {
            "readOnly": true,
            "type": "number",
            "description": "Recorded time those episodes span, seconds.",
            "format": "double"
          },
          "editedCount": {
            "readOnly": true,
            "type": "string",
            "description": "Takes the version would publish with the edit drawn on them."
          },
          "trimmedCount": {
            "readOnly": true,
            "type": "string",
            "description": "Edited takes that become one new episode (a trim, new subtasks or both)."
          },
          "splitCount": {
            "readOnly": true,
            "type": "string",
            "description": "Edited takes that become two or more new episodes."
          },
          "pieceCount": {
            "readOnly": true,
            "type": "string",
            "description": "New episodes the edited takes become, across every edited take."
          },
          "includedFlaggedCount": {
            "readOnly": true,
            "type": "string",
            "description": "Episodes it would pin that stand FLAGGED."
          },
          "includedRejectedCount": {
            "readOnly": true,
            "type": "string",
            "description": "Episodes it would pin that stand REJECTED."
          },
          "unmeasuredCount": {
            "readOnly": true,
            "type": "string",
            "description": "Windows with nothing in them to measure. Their episodes are still in\n the version; the preview's charts leave them out."
          },
          "unprofiledCount": {
            "readOnly": true,
            "type": "string",
            "description": "Takes with no profile of the recording as it was taken: the layer the\n preview's charts draw behind the version's leaves them out."
          },
          "unprocessable": {
            "readOnly": true,
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/qualia.v1.VersionPreview_Unprocessable"
            },
            "description": "Takes it leaves out, and why: the version will not have them."
          },
          "changedCount": {
            "readOnly": true,
            "type": "string",
            "description": "Takes it took whose ruling, drawing, labels or recording changed since\n it was made. Publishing it still publishes them as previewed. Counted\n only while READY; 0 otherwise."
          },
          "versus": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.VersionPreview_Versus"
              }
            ],
            "description": "How it compares with the dataset's newest tag; unset when there is none.\n Set while READY and on a validate_only response. Validation reads both\n selections in one read-only snapshot. To count changes since a particular\n newest preview-made tag, validate with that tag's include and check this\n tag still matches; retry the newest-tag read if it changed."
          },
          "sameAsVersion": {
            "readOnly": true,
            "type": "string",
            "description": "A tag (\"1.2\") holding exactly the episodes it would pin, if there is\n one: publishing it would make that tag again. Empty otherwise, and until\n it is READY."
          },
          "version": {
            "readOnly": true,
            "type": "string",
            "description": "accounts/{account}/datasets/{dataset}/versions/{version}: the tag it\n was published as, once PUBLISHED."
          },
          "publishError": {
            "readOnly": true,
            "type": "string",
            "description": "Why it cannot be published as it stands (a merged dataset whose uploads\n freeze different training contracts), or why the last\n PublishVersionPreview stopped short of a tag, naming the takes. Empty\n when nothing stands in the way."
          },
          "creator": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Actor"
              }
            ],
            "description": "Who made it, a person or an API key: its owner, the only caller who\n publishes or discards it."
          },
          "createTime": {
            "readOnly": true,
            "type": "string",
            "description": "When it was made.",
            "format": "date-time"
          },
          "updateTime": {
            "readOnly": true,
            "type": "string",
            "description": "When it last changed.",
            "format": "date-time"
          },
          "readyTime": {
            "readOnly": true,
            "type": "string",
            "description": "When it became READY; unset before.",
            "format": "date-time"
          },
          "expireTime": {
            "readOnly": true,
            "type": "string",
            "description": "When it EXPIRES unless it is published first.",
            "format": "date-time"
          },
          "draftsUnpublishedCount": {
            "readOnly": true,
            "type": "string",
            "description": "Takes of the dataset with an edit drawn that no tag has published yet,\n whether the preview took them or not."
          }
        },
        "description": "What a version would be: the dataset's takes as they stand now, picked by\n how they stand (`include`), each with the edit drawn on it (its draft)\n cut out of the recorded bytes and measured, before anything is published\n (\"Apply all\" in the Create version dialog). Making one writes nothing a\n dataset reads: head, its episodes, their standing, their profiles and\n every draft stay as they are. PublishVersionPreview turns it into a tag:\n each edited take is cut into new episodes beside the take, and the tag\n pins exactly the takes and windows the preview froze, however they have\n changed since (`changed_count` says how many have).\n\n A caller has at most one live preview of a dataset (MEASURING, READY,\n PUBLISHING or FAILED): a new CreateVersionPreview supersedes the caller's\n earlier one when it is MEASURING, READY or FAILED, and is refused\n (FAILED_PRECONDITION) while it is PUBLISHING, which only its publish ends.\n Uploads and merged datasets have them; a mixture is tagged from head\n (CreateVersion).\n\n The {version_preview} id is a UUID.\n\n Served by qds-api."
      },
      "qualia.v1.VersionPreviewItem": {
        "type": "object",
        "properties": {
          "take": {
            "readOnly": true,
            "type": "string",
            "description": "accounts/{account}/datasets/{dataset}/episodes/{episode}: the take it\n is cut from."
          },
          "piece": {
            "readOnly": true,
            "type": "integer",
            "description": "Its place among the take's windows, from 0.",
            "format": "int32"
          },
          "pieces": {
            "readOnly": true,
            "type": "integer",
            "description": "The take's windows: 1 for a take as recorded or trimmed, more for a split.",
            "format": "int32"
          },
          "startSeconds": {
            "readOnly": true,
            "type": "number",
            "description": "Where it starts, seconds from the start of the take's recording.",
            "format": "double"
          },
          "endSeconds": {
            "readOnly": true,
            "type": "number",
            "description": "Where it ends, seconds from the start of the take's recording.",
            "format": "double"
          },
          "label": {
            "readOnly": true,
            "type": "string",
            "description": "The take as a person finds it in the dataset, e.g. \"episode 41 ·\n pick_cup_041\"."
          },
          "episode": {
            "readOnly": true,
            "type": "string",
            "description": "accounts/{account}/datasets/{dataset}/episodes/{episode}: the episode\n the version pins for it. The take itself when it is published as\n recorded; for an edited take, its new episode once the preview is\n PUBLISHED, and empty before (publishing makes the new episodes)."
          },
          "analysis": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Episode_Analysis"
              }
            ],
            "description": "How it moves, measured over the window alone, as Episode.analysis\n reads; unset when it could not be measured."
          }
        },
        "description": "One window of a preview: a stretch of one take the version would hold,\n and how it measured."
      },
      "qualia.v1.VersionPreview_Unprocessable": {
        "type": "object",
        "properties": {
          "episode": {
            "readOnly": true,
            "type": "string",
            "description": "accounts/{account}/datasets/{dataset}/episodes/{episode}: the take."
          },
          "label": {
            "readOnly": true,
            "type": "string",
            "description": "The take as a person finds it in the dataset, e.g. \"episode 41 ·\n pick_cup_041\"."
          },
          "reasonCode": {
            "readOnly": true,
            "type": "string",
            "description": "Why, as a stable UPPER_SNAKE_CASE code to branch on: KEEPS_NOTHING\n (the drawing keeps no frame), TOO_MANY_PIECES (more than 512),\n ALREADY_SPLIT (drawn on a take split before), A_PIECE (drawn on a\n piece of one), UNMEASURABLE (its windows failed to measure three\n times), and others to come."
          },
          "reason": {
            "readOnly": true,
            "type": "string",
            "description": "Why, in a person's words: \"the drawing keeps nothing\"."
          }
        },
        "description": "A take the preview leaves out, and why."
      },
      "qualia.v1.VersionPreview_Versus": {
        "type": "object",
        "properties": {
          "tag": {
            "readOnly": true,
            "type": "string",
            "description": "The newest tag (\"1.2\")."
          },
          "addedCount": {
            "readOnly": true,
            "type": "string",
            "description": "Episodes the preview has and the tag does not."
          },
          "removedCount": {
            "readOnly": true,
            "type": "string",
            "description": "Episodes the tag has and the preview does not."
          },
          "changedCount": {
            "readOnly": true,
            "type": "string",
            "description": "Takes in both, at another revision or with another edit."
          },
          "unchangedCount": {
            "readOnly": true,
            "type": "string",
            "description": "Episodes in both, the same."
          }
        },
        "description": "How the preview's episodes compare with the dataset's newest tag. An\n edited take matches a tag's new episodes when they were cut from the\n same recording with the same drawing."
      },
      "qualia.v1.Version_CopySource": {
        "type": "object",
        "properties": {
          "datasetDisplayName": {
            "readOnly": true,
            "type": "string",
            "description": "The source dataset's name. Empty for a source in another organization,\n and for an upload forked for a copied mixture, which has no record of\n its own."
          },
          "workspaceDisplayName": {
            "readOnly": true,
            "type": "string",
            "description": "The source's workspace's name; empty when no record names it."
          },
          "organizationDisplayName": {
            "readOnly": true,
            "type": "string",
            "description": "The source's organization's name; set only for another organization."
          },
          "version": {
            "readOnly": true,
            "type": "string",
            "description": "The source's version tag; empty for the version it stood at then."
          },
          "copyTime": {
            "readOnly": true,
            "type": "string",
            "description": "When the copy was made.",
            "format": "date-time"
          }
        },
        "description": "What a copy started from, in the words its own organization may read: a\n source in another organization is named by its workspace and organization\n only, with no dataset and no id. Names are as they were when it was copied."
      },
      "qualia.v1.Version_LockEntry": {
        "type": "object",
        "properties": {
          "source": {
            "readOnly": true,
            "type": "string",
            "description": "accounts/{account}/datasets/{dataset}/sources/{source}"
          },
          "dataset": {
            "readOnly": true,
            "type": "string",
            "description": "accounts/{account}/datasets/{dataset}: the dataset it resolved to."
          },
          "follow": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/qualia.v1.Follow"
              }
            ],
            "description": "The follow it had."
          },
          "ref": {
            "readOnly": true,
            "type": "string",
            "description": "The tag it stood at, or \"head\"."
          },
          "digest": {
            "readOnly": true,
            "type": "string",
            "description": "The digest it stood at."
          },
          "episodeCount": {
            "readOnly": true,
            "type": "string",
            "description": "Episodes it brought in."
          }
        },
        "description": "What one mixture source resolved to when the version was cut: the lockfile row."
      },
      "qualia.v1.Version_ManifestEntry": {
        "type": "object",
        "properties": {
          "dataset": {
            "readOnly": true,
            "type": "string",
            "description": "accounts/{account}/datasets/{dataset}: the upload. A mixture's version\n names an upload a merge took by its merged dataset, one entry for all\n the uploads it holds, their counts summed; a merged\n dataset's own versions name its uploads."
          },
          "reviewedCount": {
            "readOnly": true,
            "type": "string",
            "description": "Episodes a person or validation had ruled on. On `v0`, 0: nothing was\n ruled yet, except on a copy, whose rulings came with it and were not\n counted (see Version.copy_source)."
          },
          "totalCount": {
            "readOnly": true,
            "type": "string",
            "description": "Episodes in the upload."
          },
          "memberCount": {
            "readOnly": true,
            "type": "string",
            "description": "Episodes the version took from it."
          }
        },
        "description": "How finished one upload was when the version was cut."
      },
      "ApiError": {
        "title": "API error",
        "type": "object",
        "required": [
          "code",
          "message",
          "retryable",
          "details"
        ],
        "properties": {
          "code": {
            "type": "string",
            "description": "The gRPC code name in upper case, e.g. `NOT_FOUND`."
          },
          "message": {
            "type": "string"
          },
          "retryable": {
            "type": "boolean",
            "description": "Whether the same call may succeed if retried."
          },
          "details": {
            "type": "array",
            "items": {
              "type": "object"
            },
            "description": "Empty, except when a dataset copy or move is refused: then one `google.rpc.ErrorInfo` with the refusal's `reason` code, its `domain` and, in `metadata`, the datasets it names."
          }
        },
        "description": "A refusal from the API itself."
      },
      "GatewayError": {
        "title": "Gateway error",
        "type": "object",
        "required": [
          "detail"
        ],
        "properties": {
          "detail": {
            "type": "string",
            "description": "What went wrong."
          }
        },
        "description": "A refusal from the gateway before the call reaches the API, for example `401` bad or missing API key, `403` key lacks the scope or environment closed, `413` body too large."
      }
    },
    "securitySchemes": {
      "ApiKey": {
        "type": "apiKey",
        "in": "header",
        "name": "X-API-Key"
      }
    }
  },
  "tags": [
    {
      "name": "Checks",
      "description": "The checks, what they computed, and running them again."
    },
    {
      "name": "Datasets",
      "description": "Browse, create and edit datasets."
    },
    {
      "name": "Episodes",
      "description": "Read, edit and rule on the episodes of a dataset."
    },
    {
      "name": "Events",
      "description": "The audit trail of a workspace or an organization, newest\n first, and the undo of what can be undone.\n\n A workspace sees the events that happened in it. An organization sees every\n event it holds: its workspaces' (deleted ones included, which keep their\n events) and its own (`origin` ORGANIZATION), which no workspace sees.\n Reading needs `spaces:read` on the workspace or the organization (every\n member holds it there). An API key needs `data:read`, and `data:write` to\n undo."
    },
    {
      "name": "Issues",
      "description": "Raise, read, convert, dismiss and reply to issues and notes."
    },
    {
      "name": "Mixtures",
      "description": "Compose a mixture: add, follow, bump and remove sources. What the mixture\n then contains is read with Episodes.ListEpisodes on the mixture."
    },
    {
      "name": "Rigs",
      "description": "Keep the account's capture rigs."
    },
    {
      "name": "Robots",
      "description": "Keep the account's robots and their models."
    },
    {
      "name": "Statuses",
      "description": "Running work and what ended recently, per workspace or for a whole\n organization, and a way to stop it.\n\n Read from the events record: a status is the latest OPERATION_* event of\n its operation, joined with the progress its service last posted. Live\n changes come on the events stream (`/next/events/v1/events`): each\n OPERATION_* event, and progress as `event: progress`."
    },
    {
      "name": "TaskDrafts",
      "description": "A human-selected Task draft. The qds storage and dispatch are temporary\n until tasks-api owns both. Only a person applies this proposal."
    },
    {
      "name": "Tasks",
      "description": "Keep the account's tasks."
    },
    {
      "name": "Versions",
      "description": "Cut, read, compare and download version tags, and preview and publish a\n version with the edits drawn on its takes."
    }
  ],
  "security": [
    {
      "ApiKey": []
    }
  ]
}
