# Checks_GetCheckResult

`GET /v1/accounts/{account}/checks/{check}/results/{result}`

Gets one result: the newest stored for the pair at the robot's current
model config (a dataset's own key is ListCheckResults'), NOT_RUN when
there is none; reading queues nothing.

- Base URL: `https://junction-api.qualiastudios.dev`
- Authentication: an API key in the `X-API-Key` header

## Parameters

- `account` (path, string, required): The account id.
- `check` (path, string, required): The check id.
- `result` (path, string, required): The result id.

## Responses

- `200` OK: `application/json` `qualia.v1.CheckResult`
- `default` Default error response: `application/json` `google.rpc.Status`

## Schemas

```yaml
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:
        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
    reach check stores results: one per episode and robot. `{result}` is
    `<episode uuid>-<robot uuid>`, both canonical lowercase UUIDs joined by a
    hyphen (73 characters), so a client can build the name itself. Computed
    only when a RunCheck on `checks/reach` asks for it: a read never queues
    one, and neither does a change of the dataset's target robot or of its
    reach_settings. A result belongs to a reach key (Reach.key: the robot's
    config_digest, the solver, the base it was keyed with and the walk it was
    computed with); a
    change of any of them leaves the old rows under their own key, and the new
    key reads NOT_RUN until someone runs the check. Two datasets that ask the
    same question share the result.

    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
        base it was keyed with and the walk it was computed with (see
        ReachStatus.current_key). A
        list for a dataset returns that dataset's current key, also for a pair
        not run yet (NOT_RUN), except when nothing in its scope has been solved
        under that key yet: then it returns the key of the dataset's last
        finished run (ReachStatus.last_finished_run) where that run stored
        results, so a key here that differs from current_key is the last solve
        under settings since changed. GetCheckResult, an account-wide list, or
        a read made while fleet is unreachable, returns the key of the newest
        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.
        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
    egocentric episode's hands.
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.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.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
        the direction beyond this bound. Positive, measured from actual FK.
      format: double
  description: |-
    A finite active joint bound whose outward differential reduces target error.
    This is local constraint evidence, not proof that every IK branch fails.
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.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).
        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
        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
        uses this single placement anchor even when display samples omit it.
  description: |-
    Metadata for a bounded solver posture trace. Joint samples are read
    separately with ReadReachTrace and never included in list results.
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.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.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
        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.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.
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."
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.
```
