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

# 멀티 에이전트 오케스트레이션

> 메시지, 작업 배정, 결과 보고, heartbeat, 사람의 decision gate로 여러 코딩 에이전트를 조율합니다.

여러 terminal이 한 화면에 있다고 저절로 팀이 되는 것은 아니다. Dure는 provider에
종속되지 않는 조율 계층을 더해 에이전트가 서로 작업을 넘기고, 결과를 보고하고,
막힌 지점을 알리고, 사람의 결정을 기다릴 수 있게 한다.

## 명령을 실행하기 전 요구사항

* `dure` CLI를 설치하고 사용하려는 app channel에서 Dure를 한 번 이상 실행한다.
  CLI가 읽는 registry가 이때 생성된다. 그 뒤 `task-create`에는 실행 중인 앱이
  필요하지 않다.
* `task-create`는 작업을 기록할 뿐이다. `--title`은 필수지만 provider, 실행 중인
  agent, project, worktree, managed session은 필요 없다. `--spec`과 `--deps`는
  선택이다.
* 별도 `--requirements` field는 없다. 범위, 완료 조건, 검증 방법, 기대 결과
  형식을 자유 형식 `--spec`에 넣는다. Dure는 이를 저장하고 전달하지만 계약의
  완전성이나 충족 여부를 판정하지 않는다.
* Dure 안에서 연 terminal은 올바른 app channel을 자동으로 상속한다. 설치형 앱은
  기본으로 `stable`을 사용한다. 외부 shell에서 격리된 개발 빌드를 대상으로
  실행할 때는 `DURE_APP_CHANNEL`을 해당 빌드의 channel로 설정한다.
* `dispatch --inject`의 요구사항은 더 엄격하다. 대상이 같은 channel에 등록돼 있고
  해당 session이 입력을 받을 수 있어야 한다. 원격 mailbox는 아직 연결되지
  않으므로 결과 보고까지 완결하려면 대상도 로컬이어야 한다. `--inject`를 빼면
  작업 배정과 메시지만 저장한다.

## 조율 계층이 더하는 것

<CardGroup cols={2}>
  <Card title="종류가 있는 메시지" icon="messages-square">
    Note, status, dispatch, 완료 보고, escalation, decision gate, heartbeat를
    서로 구분해 보낸다.
  </Card>

  <Card title="Provider 중립적인 대상" icon="waypoints">
    한 에이전트, 전체를 뜻하는 `@all`, `@claude`나 `@codex` 같은 provider
    그룹을 수신자로 지정한다.
  </Card>

  <Card title="결과가 돌아오는 작업" icon="list-checks">
    작업을 기록하고 에이전트에게 배정한 뒤 terminal 출력을 추측하는 대신
    구조화된 `worker_done` 결과를 받는다.
  </Card>

  <Card title="사람의 판단을 흐름 안에" icon="split">
    승인이 필요한 경계를 넘기 전에 에이전트가 답을 기다리는 질문이나 decision
    gate를 만들 수 있다.
  </Card>
</CardGroup>

메시지와 작업 상태는 현재 Dure app channel에 저장된다. 관리형 agent session
안에서는 Dure가 발신자를 자동으로 식별하므로 보통의 명령에 별도 `--from`
identity를 붙이지 않아도 된다.

## 작은 조율 루프

현재 팀 전체에 공지를 보낸다.

```sh theme={"system"}
dure orch send --to @all \
  --subject "candidate를 비동기로 전환" \
  --body "origin/main 추적을 중단하고 blocker는 coordinator에게 보고한다."
```

작업을 만들고 이름이 있는 에이전트에게 배정한다.

```sh theme={"system"}
dure orch task-create \
  --title "세션 복구 diff 리뷰" \
  --spec "범위: 복구 diff. 동작, 테스트, rollback 경로 검증. 결과: 발견한 내용만 보고."

# t7은 task-create가 출력한 ID로 바꾼다.
dure orch dispatch --task t7 --to review-agent --inject
```

`--inject`는 작업 설명과 보고 규칙을 대상 에이전트의 terminal에 넣는다.
Dispatch 자체도 종류가 있는 메시지로 남기 때문에 단순한 keystroke 전송과는
다르다.

결과, 막힘, 사람의 결정이 필요한 이벤트를 기다린다.

```sh theme={"system"}
dure orch check --wait \
  --types worker_done,escalation,decision_gate \
  --timeout 900
```

## 조율 패턴

### 독립 작업을 병렬로 나누기

조사, 구현, 리뷰를 각각 작업으로 만들고 서로 다른 에이전트나 provider에게
배정한다. Worktree는 파일 변경을 격리하고 orchestration channel은 공통 의도와
결과를 전달한다.

### 조용히 멈추는 대신 질문하기

Coordinator의 답이 필요한 에이전트는 reply가 올 때까지 기다릴 수 있다.

```sh theme={"system"}
dure orch ask --to coordinator \
  --question "fallback에서 기존 세션을 보존할까요?" \
  --options "보존,교체"
```

### 오래 걸리는 작업과 먹통 구분하기

긴 작업을 수행하는 worker는 `heartbeat`를 보낼 수 있다. 계속하려면 조치가 필요한
작업은 `escalation`을 보내므로 모든 terminal을 지켜보지 않아도 둘을 구분할 수
있다.

## Terminal 주입과의 차이

다른 terminal에 text를 입력하는 것은 에이전트를 깨우거나 prompt를 전달할 때
유용하지만 task identity, message type, 지속되는 결과 계약은 없다. Dure
orchestration은 먼저 소통을 기록한다. Injection은 배정된 작업을 전달하는 선택적
수단이지 source of truth가 아니다.

<Warning>
  현재 오케스트레이션은 하나의 Dure app channel 안에서 로컬로 동작한다. 원격
  SSH 에이전트는 로컬 mailbox에 직접 참여하지 않고, `@all`은 수신자마다 별도의
  전달 확인을 아직 기록하지 않는다. 반드시 처리해야 하는 작업에는 수신자를
  명시한다.
</Warning>

정확한 alpha 경계는 [현재 한계](/ko/current-limits)에서 확인하고, 작업에 맞는
worker 선택은 [provider 지원 수준](/ko/providers)을 참고한다.
