> ## Documentation Index
> Fetch the complete documentation index at: https://avala.ai/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# 시퀀스 메타데이터 스키마

> 모든 시퀀스의 결과 라벨, 기술적 유효성을 보고하는 방식, 그리고 둘을 읽고 쓰고 내보내는 방법

모든 시퀀스에는 서로 분리된 두 종류의 메타데이터가 있습니다:

* **기술적 유효성.** 녹화를 사용할 수 있습니까? Avala는 승인 기준과 품질 목표를 바탕으로 이를 보고합니다. 아래 기술적 유효성 섹션을 참조하세요.
* **행동 결과.** 사람 또는 로봇이 무엇을 했고, 작업이 성공했습니까? Avala는 이를 시퀀스의 **결과 라벨**로 저장합니다.

시퀀스는 기술적으로 유효하면서도 실패를 보여줄 수 있습니다. 실패한 시퀀스가 가장 유용한 경우가 많습니다. 두 축이 분리되어 있으므로 깨끗한 데이터를 고르는 필터가 유용한 실패를 버리지 않고, 성공을 고르는 필터가 고장 난 센서를 숨기지 않습니다.

## 결과 라벨

각 시퀀스에는 현재 결과 라벨이 최대 하나 있습니다. 쓰기를 할 때마다 새 버전이 기록됩니다. 이전 버전은 라벨 이력에서 계속 읽을 수 있습니다.

### 예시

다음은 미끄러짐과 복구가 있는 사람 시연의 라벨로, `GET .../sequences/<sequence-uid>/outcome/`이 반환하는 형태입니다:

```json theme={null}
{
  "uid": "<outcome-uid>",
  "sequence_uid": "<sequence-uid>",
  "version": 2,
  "is_current": true,
  "outcome": "mistake_and_recovery",
  "progress": 1.0,
  "quality": 4,
  "speed": 3,
  "subtasks": [
    { "label": "Load the plate into the lower rack", "start_ts": 0.0, "end_ts": 19.8, "outcome": "mistake_and_recovery" },
    { "label": "Pull out the lower rack", "start_ts": 0.0, "end_ts": 6.2, "outcome": "expert_success" },
    { "label": "Place the wet plate in a free slot", "start_ts": 6.2, "end_ts": 19.8, "outcome": "mistake_and_recovery" }
  ],
  "hand_actions": {
    "left": [
      { "start_ts": 0.0, "end_ts": 6.2, "action": "pulling the lower rack out by its front edge", "object": "dishwasher rack", "verb": "pull", "contact": true },
      { "start_ts": 6.2, "end_ts": 19.8, "action": "holding the rack steady", "object": "dishwasher rack", "verb": "hold", "contact": true }
    ],
    "right": [
      { "start_ts": 6.2, "end_ts": 9.1, "action": "carrying the wet plate to the rack", "object": "plate", "verb": "carry", "contact": true },
      { "start_ts": 9.1, "end_ts": 10.4, "action": "the plate slips out of the grasp", "object": "plate", "verb": null, "contact": false },
      { "start_ts": 10.4, "end_ts": 14.7, "action": "regrasping the plate by its rim", "object": "plate", "verb": "grasp", "contact": true },
      { "start_ts": 14.7, "end_ts": 19.8, "action": "placing the plate in a free slot", "object": "plate", "verb": "place", "contact": true }
    ]
  },
  "mistake_type": "slip_during_place",
  "recovery_type": "regrasp",
  "failure_stage": "place",
  "autonomy_level": "human_demonstration",
  "model_version": "",
  "evaluation_membership": "train",
  "leakage_groups": {
    "location": "loc_8f2a",
    "object": "obj_set_31",
    "mechanism": "dishwasher_pull_rack_v2",
    "operator": "op_5c1e",
    "environment_family": "kitchen_galley"
  },
  "source": "human",
  "source_metadata": {},
  "labeled_by": "<user-uid>",
  "confidence": null,
  "created_at": "2026-09-30T17:42:11.204000Z",
  "updated_at": "2026-09-30T17:42:11.204000Z"
}
```

위 값은 라벨의 형태를 보여주기 위한 것입니다. 실제 납품을 설명하지 않습니다.

### 필드

모든 타임스탬프는 시퀀스 시작부터의 초 단위입니다.

| 필드 | 유형 | 의미 |
| - | - | - |
| `uid` | string | 이 라벨 버전의 ID. 읽기 전용. |
| `sequence_uid` | string | 라벨이 속한 시퀀스. 읽기 전용. |
| `version` | integer | 라벨 버전. 1부터 시작하며 쓰기마다 1씩 늘어납니다. 읽기 전용. |
| `is_current` | boolean | 현재 버전이면 `true`. 읽기 전용. |
| `outcome` | string | 행동 결과. 필수. 아래 결과 값 섹션을 참조하세요. |
| `progress` | number 또는 null | 0에서 1 사이의 작업 진행도. |
| `quality` | integer 또는 null | 1에서 5 사이의 실행 품질. |
| `speed` | integer 또는 null | 1에서 5 사이의 실행 속도. |
| `subtasks` | list | 라벨이 붙은 시간 범위. 아래 하위 작업 섹션을 참조하세요. |
| `hand_actions` | object | 손별 동작 스트림, `left`와 `right`. 아래 손 동작 섹션을 참조하세요. |
| `mistake_type` | string | 실수 종류에 대한 고객의 태그. 최대 128자. 설정하지 않으면 비어 있습니다. |
| `recovery_type` | string | 복구 종류에 대한 고객의 태그. 최대 128자. 설정하지 않으면 비어 있습니다. |
| `failure_stage` | string | 실패가 일어난 단계에 대한 고객의 태그. 최대 128자. 설정하지 않으면 비어 있습니다. |
| `autonomy_level` | string | 누가 제어했는지. 아래 자율성 수준 섹션을 참조하세요. 설정하지 않으면 비어 있습니다. |
| `model_version` | string | 로봇을 구동한 정책 또는 모델 버전. 최대 255자. 사람 시연에서는 비어 있습니다. |
| `evaluation_membership` | string | `train`, `held_out_eval` 또는 `none`. 설정하지 않으면 비어 있습니다. 아래 평가 소속 섹션을 참조하세요. |
| `leakage_groups` | object | 분할 위생을 위한 그룹 ID. 아래 누출 그룹 섹션을 참조하세요. |
| `source` | string | 라벨을 쓴 주체: `human`, `model` 또는 `imported`. 기본값 `human`. |
| `source_metadata` | object | 가져오기 출처 정보. 아래 출처 메타데이터 섹션을 참조하세요. |
| `labeled_by` | string 또는 null | 해당 버전을 쓴 사용자의 UID. 데이터셋을 편집할 수 있는 호출자에게만 반환됩니다. 읽기 전용. |
| `confidence` | number 또는 null | 0에서 1 사이의 모델 신뢰도. `source`가 `model`일 때만 허용됩니다. |
| `created_at`, `updated_at` | string | 해당 버전의 타임스탬프. 읽기 전용. |

`mistake_type`, `recovery_type`, `failure_stage`는 자유 텍스트입니다. 시퀀스가 깔끔하게 묶이도록 프로그램의 실패 분류 체계에 있는 태그를 사용하세요.

### 결과 값

| 결과 | 의미 |
| - | - |
| `expert_success` | 작업이 완료되었습니다. 실행이 매끄럽고 전문가 속도입니다. |
| `slow_success` | 작업이 완료되었습니다. 실행은 올바르지만 전문가 속도보다 확연히 느립니다. |
| `partial_success` | 작업의 일부가 완료되었습니다. 최종 목표 상태에는 도달하지 못했습니다. |
| `mistake_and_recovery` | 미끄러짐, 놓침, 잘못된 배치 같은 오류가 발생합니다. 행위자가 외부 도움 없이 복구하고 작업을 완료합니다. |
| `intervention` | 사람이 개입하여 작업을 바로잡거나 마무리합니다. |
| `unsafe` | 시퀀스에 안전하지 않은 동작이나 상태가 있습니다. |
| `aborted` | 작업이 완료되기 전에 시도가 멈추고 복구가 없습니다. |
| `failure` | 시도가 끝났고 작업이 달성되지 않았습니다. |
| `novel_strategy` | 일반적인 전략과 다른 유효한 방식으로 작업을 해결합니다. |
| `inefficient_strategy` | 피할 수 있는 추가 동작, 반복 시도, 우회로 작업을 해결합니다. |

각 하위 작업은 같은 목록에서 고른 자체 결과를 가질 수 있습니다.

### 자율성 수준

| 값 | 의미 |
| - | - |
| `human_demonstration` | 사람이 작업을 수행합니다. |
| `teleoperation` | 사람이 로봇을 원격으로 조종합니다. |
| `autonomous` | 로봇이 정책으로 작동합니다. |
| `shared_autonomy` | 정책과 사람이 제어를 나눕니다. |
| `intervention` | 시퀀스 중에 사람이 정책으로부터 제어를 넘겨받습니다. |

### 하위 작업

각 하위 작업은 `{label, start_ts, end_ts, outcome}`입니다.

| 필드 | 규칙 |
| - | - |
| `label` | 하위 작업에 대한 자연어 설명. 필수. 1\~500자. |
| `start_ts`, `end_ts` | 0 이상의 유한한 수. `end_ts`는 `start_ts` 이상입니다. |
| `outcome` | 결과 값 또는 `null`. |

라벨 하나에는 하위 작업이 최대 256개까지 들어갑니다. 목록은 `start_ts` 순서로 정렬되어야 합니다. 두 하위 작업은 서로 겹치지 않거나, 단계와 그 세부 단계처럼 하나가 다른 하나를 완전히 포함해야 합니다. 끝이 맞닿는 경우는 겹치지 않는 것으로 봅니다. 일부만 겹치면 거부됩니다. 두 하위 작업이 같은 시각에 시작하면 감싸는 쪽을 먼저 나열하세요.

### 손 동작

`hand_actions`는 서로 독립된 두 스트림, `left`와 `right`를 담습니다. 각 항목은 한 손이 어떤 시간 범위 동안 하는 일을 설명합니다.

| 필드 | 규칙 |
| - | - |
| `start_ts`, `end_ts` | 0 이상의 유한한 수. `end_ts`는 `start_ts` 이상입니다. |
| `action` | 동작에 대한 자연어 설명. 필수. 1\~500자. |
| `object` | 손이 다루는 물체. 선택. 최대 255자. |
| `verb` | 동작을 나타내는 짧은 동사. 선택. 최대 64자. |
| `contact` | 손이 물체에 닿으면 `true`, 닿지 않으면 `false`, 알 수 없으면 `null`. JSON 불리언만 허용됩니다. |

* 한 손 안에서 항목은 `start_ts` 순서로 정렬되며 서로 겹치면 안 됩니다. 각 항목은 이전 항목이 끝난 시각 또는 그 이후에 시작합니다. 맞닿는 것은 괜찮습니다.
* 두 손은 자유롭게 겹칠 수 있습니다.
* 각 손에는 항목이 최대 3,600개까지 들어갑니다. 초당 라벨 하나로 한 시간 분량입니다.
* 키는 `left`와 `right`만 허용됩니다. 둘 중 하나는 생략할 수 있습니다. 생략한 손은 빈 목록으로 저장됩니다.
* 빈 `object` 또는 `verb`는 `null`로 저장됩니다. 저장된 모든 항목에는 여섯 필드가 모두 있습니다.

### 시퀀스 길이

Avala가 시퀀스의 길이를 알면, 모든 하위 작업의 `end_ts`와 모든 손 동작의 `end_ts`는 그 길이에 1초를 더한 값 이하여야 합니다. 추가 1초는 초당 하나씩 쓴 라벨을 허용하기 위한 것입니다. 시퀀스에 길이가 기록된 추출 MCAP 파일이 정확히 하나 있으면 Avala가 길이를 압니다. 다른 시퀀스에서는 이 검사를 건너뜁니다.

### 평가 소속

`evaluation_membership`은 시퀀스를 분할에 배치합니다:

| 값 | 의미 |
| - | - |
| `train` | 시퀀스를 학습에 사용할 수 있습니다. |
| `held_out_eval` | 시퀀스가 홀드아웃 평가 세트에 속합니다. 학습에서 제외하세요. |
| `none` | 시퀀스가 어느 분할에도 속하지 않습니다. |

Avala는 모든 평가 코호트의 시퀀스에 `held_out_eval`을 설정합니다. 이 시퀀스는 학습 릴리스에 절대 나타나지 않습니다. [평가](/docs/ko/fleet-learning/evaluation.md)를 참조하세요.

### 누출 그룹

누출 그룹은 거의 중복된 데이터가 학습 분할과 평가 분할 양쪽에 들어가는 것을 막습니다. `leakage_groups`는 다음 키를 받으며, 각 키의 값은 최대 255자의 그룹 ID입니다:

| 키 | 다음을 공유하는 시퀀스를 묶습니다 |
| - | - |
| `location` | 같은 집, 현장 또는 방. |
| `object` | 같은 물리적 물체 세트. |
| `mechanism` | 같은 가전 또는 메커니즘 단위. |
| `operator` | 같은 수집자 또는 원격 조작자. |
| `environment_family` | 갤리 주방처럼 같은 종류의 환경과 배치. |

다른 키는 거부됩니다. 각 키는 선택 사항입니다.

Avala는 코호트의 어떤 그룹 값도 학습 릴리스에 나타나지 않도록 평가 코호트를 구성합니다. 고객도 자체 데이터를 같은 방식으로 분할할 수 있습니다: 그룹 단위로 홀드아웃하고, 무작위 시퀀스 단위로는 절대 분할하지 마세요. Avala의 그룹 ID는 가명이므로 누구인지, 어디인지 알지 않고도 묶고 분할할 수 있습니다.

### 출처 메타데이터

`source_metadata`는 가져온 라벨이 어디서 왔는지 기록합니다. 예: `{"importer": "...", "run_id": "...", "task": "...", "log_path": "..."}`.

* 키가 최대 20개인 평면 객체입니다.
* 각 키는 1\~64자입니다.
* 각 값은 최대 512자의 문자열, 유한한 수 또는 불리언입니다.
* 중첩 객체, 목록, `null` 값은 거부됩니다.

### 쓰기 동작 방식

* 쓰기는 현재 라벨 전체를 교체하고 새 버전을 기록합니다. 생략한 선택 필드는 설정되지 않은 상태로 저장됩니다. 이전 버전에서 복사되지 않습니다.
* 쓰기에는 데이터셋 편집 권한이 필요합니다. 읽기에는 공개 데이터셋을 포함해 시퀀스를 읽는 것과 같은 권한이 필요합니다.
* `source`가 `model`이 아니면 `confidence`는 거부됩니다.
* 라벨이 없는 시퀀스를 읽으면 `404`가 반환됩니다.

## 기술적 유효성

기술적 유효성은 결과 라벨에 포함되지 않습니다. Avala는 승인 엔진과 품질 목표를 바탕으로 이를 보고하며, 별도의 JSON 스키마는 없습니다.

**승인 기준.** 캡처 캠페인의 모든 캡처는 기계 판정을 받습니다: `accept`, `quarantine` 또는 `reject`. 판정은 다음 기준에서 나옵니다:

| 기준 | 확인하는 내용 |
| - | - |
| `capture_health` | MCAP 파일이 검증을 통과하고 캠페인이 요구하는 채널이 존재합니다. |
| `frame_rate` | 카메라 프레임 레이트가 지속적으로 무너지지 않고 클립 전체에서 유지됩니다. |
| `completeness` | 길이가 캠페인이 요청한 길이에 가깝습니다. |
| `framing` | 감지기가 관찰한 시간 중 충분한 비율 동안 손이 보입니다. |
| `shake` | 클립 대부분에서 카메라가 흔들리지 않습니다. |

각 기준은 `pass`, `fail`, `insufficient_evidence` 또는 `skipped`를 보고합니다. 실패한 기준은 `acceptance_frame_rate_drop`이나 `hands_not_visible` 같은 사유 코드를 기록합니다. 이후 리뷰어가 판정을 확인하거나 변경합니다. 사유 코드는 [승인된 시간](/docs/ko/fleet-learning/accepted-hour.md)에 나와 있습니다.

승인 결과는 MCP 도구로 읽습니다. 캡처 하나는 `get_result_acceptance`, 캠페인은 `get_campaign_acceptance_summary`를 사용하세요. `list_capture_submissions`에는 각 캡처의 기계 승인 요약이 포함됩니다.

**품질 목표.** 프로젝트는 승인률, 거부율, 이슈율 같은 품질 지표에 임계값을 정할 수 있습니다. 지표가 임계값을 넘으면 Avala가 알림을 보냅니다. MCP 도구 `list_quality_targets`로 읽습니다.

캘리브레이션, 동의, 타임스탬프 동기화처럼 기계 기준이 아닌 프로그램 검사는 [커버리지 리포트](/docs/ko/fleet-learning/coverage.md)에 거부 사유로 보고됩니다. [승인된 시간](/docs/ko/fleet-learning/accepted-hour.md)을 참조하세요.

## 결과 라벨 읽기와 쓰기

REST 엔드포인트는 `https://api.avala.ai/api/v1` 아래에 있습니다:

| 메서드와 경로 | 하는 일 |
| - | - |
| `GET /datasets/{owner}/{slug}/sequences/{sequence_uid}/outcome/` | 시퀀스 하나의 현재 라벨. 라벨이 없으면 `404`. |
| `PUT /datasets/{owner}/{slug}/sequences/{sequence_uid}/outcome/` | 새 현재 라벨을 기록합니다. |
| `GET /datasets/{owner}/{slug}/sequences/{sequence_uid}/outcome/history/` | 라벨의 모든 버전, 최신순. |
| `GET /datasets/{owner}/{slug}/sequence-outcomes/` | 데이터셋의 현재 라벨, 페이지 단위. |

데이터셋 목록은 `outcome`, `evaluation_membership`, `source`, `autonomy_level` 필터를 받습니다. 각 필터는 값 하나 또는 쉼표로 구분한 목록을 받으며, 시퀀스는 목록의 값 중 하나와 일치하면 해당됩니다. `model_version`은 정확히 한 버전과 일치합니다. 알 수 없는 필터 값은 `400`을 반환합니다.

시퀀스 목록 `GET /datasets/{owner}/{slug}/sequences/`는 같은 형식으로 `outcome`과 `evaluation_membership`을 받습니다. 현재 라벨이 일치하는 시퀀스를 반환합니다.

### 라벨 쓰기

```bash cURL theme={null}
curl -X PUT \
  "https://api.avala.ai/api/v1/datasets/your-org/kitchen-rollouts/sequences/<sequence-uid>/outcome/" \
  -H "X-Avala-Api-Key: $AVALA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "outcome": "failure",
    "progress": 0.4,
    "subtasks": [
      { "label": "Place the plate in the lower rack", "start_ts": 0.0, "end_ts": 21.5, "outcome": "failure" }
    ],
    "mistake_type": "slip_during_place",
    "failure_stage": "place",
    "autonomy_level": "autonomous",
    "model_version": "your-policy@2026-09-20",
    "evaluation_membership": "held_out_eval",
    "source": "imported",
    "source_metadata": { "importer": "your-eval-harness", "run_id": "r42", "task": "load_dishwasher" }
  }'
```

```python Python theme={null}
from avala import Client

client = Client()  # reads AVALA_API_KEY

label = client.sequence_outcomes.set(
    "your-org",
    "kitchen-rollouts",
    "<sequence-uid>",
    outcome="failure",
    progress=0.4,
    subtasks=[
        {"label": "Place the plate in the lower rack", "start_ts": 0.0, "end_ts": 21.5, "outcome": "failure"},
    ],
    mistake_type="slip_during_place",
    failure_stage="place",
    autonomy_level="autonomous",
    model_version="your-policy@2026-09-20",
    evaluation_membership="held_out_eval",
    source="imported",
    source_metadata={"importer": "your-eval-harness", "run_id": "r42", "task": "load_dishwasher"},
)
print(label.version, label.outcome)
```

```typescript TypeScript theme={null}
import Avala from "@avala-ai/sdk";

const avala = new Avala(); // reads AVALA_API_KEY

const label = await avala.sequenceOutcomes.set("your-org", "kitchen-rollouts", "<sequence-uid>", {
  outcome: "failure",
  progress: 0.4,
  subtasks: [{ label: "Place the plate in the lower rack", startTs: 0.0, endTs: 21.5, outcome: "failure" }],
  mistakeType: "slip_during_place",
  failureStage: "place",
  autonomyLevel: "autonomous",
  modelVersion: "your-policy@2026-09-20",
  evaluationMembership: "held_out_eval",
  source: "imported",
  sourceMetadata: { importer: "your-eval-harness", run_id: "r42", task: "load_dishwasher" },
});
console.log(label.version, label.outcome);
```

```bash CLI theme={null}
avala sequence-outcomes set your-org kitchen-rollouts <sequence-uid> \
  --outcome failure \
  --progress 0.4 \
  --subtasks-file subtasks.json \
  --mistake-type slip_during_place \
  --failure-stage place \
  --autonomy-level autonomous \
  --model-version your-policy@2026-09-20 \
  --evaluation-membership held_out_eval \
  --source imported \
  --source-metadata '{"importer": "your-eval-harness", "run_id": "r42", "task": "load_dishwasher"}'
```

TypeScript SDK는 camelCase 옵션 이름을 받아 API의 snake\_case 필드로 보냅니다. `sourceMetadata` 안의 키는 작성한 그대로 전송됩니다. CLI에서 `--hand-actions-file`은 `{"left": [...], "right": [...]}` 형식의 JSON 파일을 받고, `--leakage-group KEY=ID`는 여러 번 지정할 수 있습니다.

### 라벨 읽기

```bash cURL theme={null}
# Current label of one sequence
curl "https://api.avala.ai/api/v1/datasets/your-org/kitchen-rollouts/sequences/<sequence-uid>/outcome/" \
  -H "X-Avala-Api-Key: $AVALA_API_KEY"

# Every version, newest first
curl "https://api.avala.ai/api/v1/datasets/your-org/kitchen-rollouts/sequences/<sequence-uid>/outcome/history/" \
  -H "X-Avala-Api-Key: $AVALA_API_KEY"

# Failed or aborted held-out sequences
curl "https://api.avala.ai/api/v1/datasets/your-org/kitchen-rollouts/sequence-outcomes/?outcome=failure,aborted&evaluation_membership=held_out_eval" \
  -H "X-Avala-Api-Key: $AVALA_API_KEY"

# The sequences themselves, filtered by their current label
curl "https://api.avala.ai/api/v1/datasets/your-org/kitchen-rollouts/sequences/?outcome=mistake_and_recovery,intervention" \
  -H "X-Avala-Api-Key: $AVALA_API_KEY"
```

```python Python theme={null}
from avala import Client

client = Client()

label = client.sequence_outcomes.get("your-org", "kitchen-rollouts", "<sequence-uid>")
versions = client.sequence_outcomes.history("your-org", "kitchen-rollouts", "<sequence-uid>")

page = client.sequence_outcomes.list(
    "your-org",
    "kitchen-rollouts",
    outcome=["failure", "aborted"],
    evaluation_membership="held_out_eval",
    model_version="your-policy@2026-09-20",
)
for item in page:
    print(item.sequence_uid, item.outcome, item.progress)
```

```typescript TypeScript theme={null}
import Avala from "@avala-ai/sdk";

const avala = new Avala();

const label = await avala.sequenceOutcomes.get("your-org", "kitchen-rollouts", "<sequence-uid>");
const versions = await avala.sequenceOutcomes.history("your-org", "kitchen-rollouts", "<sequence-uid>");

const page = await avala.sequenceOutcomes.list("your-org", "kitchen-rollouts", {
  outcome: ["failure", "aborted"],
  evaluationMembership: "held_out_eval",
  modelVersion: "your-policy@2026-09-20",
});
for (const item of page.items) {
  console.log(item.sequenceUid, item.outcome, item.progress);
}
```

```bash CLI theme={null}
avala sequence-outcomes get your-org kitchen-rollouts <sequence-uid>
avala sequence-outcomes history your-org kitchen-rollouts <sequence-uid>
avala sequence-outcomes list your-org kitchen-rollouts \
  --outcome failure,aborted \
  --evaluation-membership held_out_eval
```

데이터셋 목록은 페이지당 최대 100개의 라벨을 반환합니다. 계속하려면 이전 페이지의 `cursor`를 전달하세요.

### MCP 서버로 라벨 읽기

MCP 서버는 결과 라벨을 읽습니다. 쓰지는 않습니다.

* `get_sequence_outcome`은 `owner`, `slug`, `sequenceUid`를 받습니다. 현재 라벨을 반환합니다.
* `list_sequence_outcomes`는 `owner`와 `slug`, 그리고 `outcome`, `evaluationMembership`, `source`, `autonomyLevel`, `modelVersion` 필터와 `limit`, `cursor`를 받습니다.

두 도구 모두 기본적으로 짧은 형식을 반환합니다. 하위 작업, 손 동작, 실수 및 복구 태그, 누출 그룹, 출처 메타데이터, 라벨 작성자를 포함하려면 `detail: "full"`을 전달하세요. 연결하려면 [AI와 함께 Avala 사용하기](/docs/ko/getting-started/mcp.md)를 참조하세요.

## LeRobot으로 결과 라벨 내보내기

LeRobot 익스포터는 각 시퀀스의 현재 결과 라벨을 데이터셋 옆에 쓸 수 있습니다. Avala 시퀀스 하나가 LeRobot 에피소드 하나가 됩니다.

```bash CLI theme={null}
avala lerobot export your-org/kitchen-rollouts \
  --repo-id your-hf-user/kitchen-rollouts \
  --output ./lerobot-out \
  --include-outcomes
```

```python Python theme={null}
from avala import Client
from avala.lerobot import export_dataset

export_dataset(
    Client(),
    "your-org",
    "kitchen-rollouts",
    repo_id="your-hf-user/kitchen-rollouts",
    output_dir="./lerobot-out",
    include_outcomes=True,
)
```

라벨은 `meta/avala_sequence_outcomes.jsonl`에 기록됩니다. 한 줄에 JSON 객체 하나, 저장된 LeRobot 에피소드 하나당 한 줄입니다. LeRobot 자체의 에피소드 테이블에는 이 메타데이터를 넣을 자리가 없으므로 별도 파일로 둡니다. 각 줄에는 다음 키가 있습니다:

| 키 | 값 |
| - | - |
| `episode_index` | LeRobot 에피소드 인덱스. |
| `avala_sequence_uid` | 에피소드의 원본 Avala 시퀀스. |
| `outcome` | 결과 값. 시퀀스에 라벨이 없으면 `null`. |
| `outcome_version` | 내보낸 라벨 버전. |
| `progress`, `quality`, `speed` | 라벨과 같습니다. |
| `subtasks`, `hand_actions` | 라벨과 같습니다. 타임스탬프는 에피소드 시작부터의 초 단위입니다. |
| `mistake_type`, `recovery_type`, `failure_stage`, `autonomy_level`, `model_version`, `evaluation_membership` | 라벨과 같으며, 빈 값 대신 `null`이 들어갑니다. |
| `leakage_groups` | 라벨과 같습니다. |
| `outcome_source`, `outcome_source_metadata`, `outcome_confidence` | 라벨의 `source`, `source_metadata`, `confidence`. |

라벨이 없는 시퀀스는 `episode_index`, `avala_sequence_uid`, `"outcome": null`만 있는 줄을 받습니다.

## 실패 및 복구 레인

복구 가능한 실패는 별도 레인으로 제공됩니다: 결과가 `mistake_and_recovery` 또는 `intervention`인 시퀀스입니다. 각 시퀀스의 하위 작업과 손 동작이 실패와 복구가 일어난 지점을 표시합니다.

이 레인은 릴리스에서 별도의 슬라이스로 제공됩니다. 이 레인으로 학습하거나, 가중치를 주거나, 제외할 수 있습니다. `?outcome=mistake_and_recovery,intervention`으로 같은 세트를 직접 만들 수도 있습니다. 안전하지 않은 시퀀스는 이 레인에 포함되지 않습니다.
