# 작업자 위임

> contract 파일, `dispatch-gate check`, Orca task-create와 dispatch, register probe, completion channel, acceptance 전 재검증 흐름을 설명합니다.

- Repository: local/master-ops-with-local-mogui-ADE-orchestrator

- Human docs: https://grok-wiki.com/public/docs/local-master-ops-with-local-mogui-ade-orches-0ac7093355f3
- Complete Markdown: https://grok-wiki.com/public/docs/local-master-ops-with-local-mogui-ade-orches-0ac7093355f3/llms-full.txt

## Source Files

- `local-mogui-ade-orchestrator:docs/public/delegation-and-review.md`
- `local-mogui-ade-orchestrator:src/master_runtime/core/dispatch_gate.py`
- `local-mogui-ade-orchestrator:scripts/dispatch-gate`
- `local-master-ops:scripts/dispatch`
- `local-master-ops:docs/charter/05-dispatch-gate.md`
- `local-mogui-ade-orchestrator:tests/test_dispatch_gate.py`

---

---
title: "작업자 위임"
description: "contract 파일, `dispatch-gate check`, Orca task-create와 dispatch, register probe, completion channel, acceptance 전 재검증 흐름을 설명합니다."
---

작업자 위임의 구현 표면은 `local-master-ops/scripts/dispatch`와 `local-mogui-ade-orchestrator/scripts/dispatch-gate`가 나눠 가진다. `dispatch-gate`는 contract 파일을 읽어 정책 verdict와 `contract_sha`를 ledger에 남기고, `dispatch`는 그 verdict를 받은 뒤 Orca Task와 Dispatch를 만들고, 실제 Dispatch artifact가 확인된 뒤에만 `register`를 호출한다.

## 위임 경계

감독 위임은 다음 순서를 기준으로 한다.

```text
contract 작성
  -> dispatch-gate check
  -> orca orchestration task-create
  -> orca orchestration dispatch --inject
  -> dispatch-gate register
  -> delivery classification
  -> worker_done 수신
  -> master acceptance 재검증
```

`check`는 실행 허가가 아니라 dispatch 전 정책 결정이다. `register`는 worker job id가 실제 artifact에 나타났는지 확인하는 등록 단계다. `worker_done`은 작업자 완료 주장이고, acceptance는 master가 contract와 산출물을 다시 대조한 뒤 내리는 별도 판단이다.

<Warning>
worker self-report는 acceptance evidence가 아니다. acceptance 전에는 diff, 테스트, 로그, deterministic probe, authoritative document 중 contract가 요구한 근거를 master가 직접 확인해야 한다.
</Warning>

## Contract 파일

Contract는 작업자가 추측하지 않도록 작업 범위를 고정하는 파일이다. 저장 위치는 ops 저장소의 `contracts/`가 기준이며, 위임 스크립트는 `--contract FILE`로 파일 존재 여부를 먼저 검사한다.

Contract에는 최소한 다음 사실을 명시한다.

| 항목 | 목적 |
| --- | --- |
| 대상 저장소와 checkout | worker가 들어갈 위치와 금지된 master checkout을 구분한다. |
| 허용 작업 표면 | 수정 가능한 파일, 금지 파일, 읽기 전용 자료를 구분한다. |
| acceptance criteria | 완료 보고가 아니라 acceptance 판단 기준을 고정한다. |
| required evidence | 테스트, 로그, diff, probe, 문서 확인 항목을 지정한다. |
| commit/push 규칙 | local commit, push, deploy 권한을 추측하지 않게 한다. |
| 제외 범위 | 비슷해 보이지만 이번 lease에 포함되지 않는 일을 차단한다. |

Placement evidence는 공개 보고에 절대경로를 올리지 않는 형태가 기본이다.

```text
FIRST ACTION:
- in_expected_worktree: yes|no
- is_master_checkout: yes|no
- branch: `git branch --show-current`
```

`is_master_checkout: yes`이면 worker는 즉시 중단해야 한다. 정확한 절대경로는 worker에게 내려가는 contract 안에서는 필요할 수 있지만, 완료 보고나 PR 본문 같은 공개 표면으로 올라오면 안 된다.

## `dispatch-gate check`

`check`는 contract를 읽고, 정책을 평가하고, 허용 시 dispatch ticket을 발급한다. 기본 ledger는 gate 설정의 `.dispatch-gate-ledger.jsonl`이지만, 운영 wrapper는 `~/.mogui/dispatch-ledger.jsonl`을 사용한다.

```bash
scripts/dispatch-gate \
  --ledger ~/.mogui/dispatch-ledger.jsonl \
  check \
  --runtime codex \
  --model gpt-5.6-luna \
  --tier-policy ./config/model-tier-policy.json \
  --contract ./contracts/job.md \
  --agents 1 \
  --est-chars 3000 \
  --completion-channel orchestration
```

응답은 stdout의 단일 JSON 객체다. 사람용 진단은 stderr의 `dispatch-gate:` 접두 메시지로 분리된다. JSON 파서에 넘길 때는 stderr를 합치지 않는다.

```json
{"allow":true,"contract_sha":"...","cost_proxy":3000,"reason":"OK","warnings":[]}
```

### 주요 입력

<ParamField body="--runtime" type="string" required>
작업자를 실행할 runtime 이름이다. 소문자, 숫자, `_`, `-` 패턴의 runtime만 유효하다.
</ParamField>

<ParamField body="--model" type="string">
선언한 worker model id다. 현재 gate는 model 누락을 `NO_MODEL`로 거부한다.
</ParamField>

<ParamField body="--completion-channel" type="enum">
`orchestration` 또는 `sentinel-log`만 허용된다. supervised Orca dispatch는 `orchestration`을 사용한다.
</ParamField>

<ParamField body="--no-record" type="flag">
현재 ledger와 정책으로 평가만 수행한다. ledger row와 dispatch ticket을 만들지 않으므로 `scripts/dispatch --check-only`에서 사용된다.
</ParamField>

## Tier policy와 모델 검증

Tier policy 선택 순서는 명시적 `--tier-policy`, `DISPATCH_TIER_POLICY`, instance `config/model-tier-policy.json`, template `master-ops/model-tier-policy.json`이다. policy 파일을 읽을 수 없거나 malformed이면 `TIER_POLICY_UNAVAILABLE`로 fail closed 한다.

Version 2 policy는 model identity 자체보다 tier와 fan-out을 평가한다. unlisted model은 자동으로 top tier가 되지 않고 `unknown` tier로 기록되며, `unknown` tier에 cap이 있으면 그 cap을 따른다. cap 초과는 `--tier-override "<reason>"`이 없으면 `TIER_FANOUT_CAP`이다.

`local-master-ops/scripts/dispatch`는 top tier model에 대해 gate 이전에 `--top-approved "<reason>"`을 요구한다. 이 값은 인증 경계가 아니라 운영 절차 evidence로 run log에 남는 값이다.

## Orca dispatch wrapper

ops 저장소의 `scripts/dispatch`는 한 번에 supervised dispatch를 수행하는 wrapper다.

```bash
local-master-ops/scripts/dispatch \
  --contract ./contracts/job.md \
  --spec "작업자에게 전달할 작업 지시" \
  --worktree path:/absolute/worktree \
  --runtime codex \
  --model gpt-5.6-luna
```

Wrapper의 실행 순서는 고정되어 있다.

<Steps>
<Step title="Gate preflight">
`dispatch-gate check --no-record`로 dry-run을 수행한다. 여기서 거부되면 ledger budget이나 ticket을 소비하지 않고 중단한다.
</Step>

<Step title="Gate record">
실행 직전에 같은 인자로 `dispatch-gate check`를 다시 수행한다. 이 단계가 허용되어야 ledger row와 ticket이 생긴다.
</Step>

<Step title="Task 생성">
`orca orchestration task-create --spec "$SPEC" --json`으로 Task id를 만든다.
</Step>

<Step title="Terminal 준비">
`--terminal`이 없으면 `orca terminal create --worktree "$WORKTREE" --command "<runtime command>" --json`으로 worker terminal을 만든다.
</Step>

<Step title="Dispatch inject">
`orca orchestration dispatch --task "$TASK" --to "$TERMINAL" --inject --json`으로 Dispatch id를 만든다.
</Step>

<Step title="Register">
`dispatch-gate register`가 `dispatch-show` 기반 probe와 `orchestration_task`를 확인한 뒤 ledger에 job id를 남긴다.
</Step>
</Steps>

Wrapper는 provider-neutral한 Orca orchestration 표면을 기준으로 동작한다. Runtime별 CLI는 worker 실행 명령에만 사용되고, Task, Dispatch, completion authority는 Orca artifact와 ledger가 가진다.

## `dispatch-gate register`

`register`는 dispatch가 실제로 생성된 뒤 호출한다. `--probe-cmd`는 exit code 0이어야 하고 stdout에 `--job-id` 값을 출력해야 한다.

```bash
scripts/dispatch-gate \
  --ledger ~/.mogui/dispatch-ledger.jsonl \
  register \
  --job-id dispatch_123 \
  --contract-sha abc123abc123 \
  --runtime codex \
  --probe-cmd "orca orchestration dispatch-show --task task_123 --json | grep -o dispatch_123 | head -1" \
  --orchestration-task task_123 \
  --declared-model gpt-5.6-luna \
  --model-probe-cmd "scripts/model-identity-probe --transcript ./worker.jsonl"
```

`completion_channel`이 `orchestration`이면 `--orchestration-task`가 필요하다. CLI는 해당 task에 대해 `orca orchestration dispatch-show --task <id> --json`을 실행해 dispatch artifact를 확인한다. task가 없거나 Orca가 없거나 JSON이 파싱되지 않으면 `ORCHESTRATION_UNVERIFIED`로 거부하고 ledger에 probe failure를 남긴다.

`register`가 성공하면 ledger row에는 `job_id`, `completion_channel`, 선택적으로 `orchestration_task`, `model_declared`, `model_measured`, `model_verified`, `attempt`가 기록된다.

## Completion channel

| Channel | 의미 | Register 조건 |
| --- | --- | --- |
| `orchestration` | Orca Task와 Dispatch artifact가 completion authority다. | `--orchestration-task`를 제공하고 `dispatch-show` probe가 통과해야 한다. |
| `sentinel-log` | 별도 sentinel log를 completion channel로 둔다. | orchestration task probe를 생략할 수 있지만 `--probe-cmd`의 job id 확인은 여전히 필요하다. |

Completion channel mismatch는 `INVALID_REQUEST`다. 예를 들어 `check`가 `orchestration`으로 기록한 pending dispatch를 `sentinel-log`로 기대하며 등록하면 register는 ledger에 job row를 쓰지 않고 ticket도 유지한다.

## Delivery 확인

`register`는 dispatch artifact 등록이지 실제 지시문 소비 증거가 아니다. Wrapper는 inject 전후 terminal 상태를 읽어 delivery class를 판단한다.

| 상태 | 의미 | 처리 |
| --- | --- | --- |
| `agent-started` | prepared prompt가 inject 뒤 사라졌다. | worker가 처리를 시작한 것으로 보고 pane을 읽어 contract 진행을 확인한다. |
| `hook-trust` | trust 또는 hook gate가 보인다. | spec이 소비되지 않은 실패로 보고 재dispatch 전 gate를 해소한다. |
| `limit` | rate limit 또는 quota marker가 보인다. | spec이 소비되지 않은 실패로 보고 runtime 교체나 대기를 선택한다. |
| `unknown` | 인식 가능한 delivery evidence가 없다. | 완료로 보지 않고 `orca terminal read`로 수동 확인한다. |

Output byte 변화나 idle 상태만으로 delivery를 통과시키지 않는다. start screen과 준비된 prompt는 모두 idle로 보일 수 있기 때문이다.

## Acceptance 전 재검증

`worker_done`을 받으면 master는 바로 accept하지 않는다. 다음 순서로 contract와 산출물을 다시 연결한다.

<Steps>
<Step title="Contract와 dispatch 연결">
Ledger의 `contract_sha`, `job_id`, `orchestration_task`, `attempt`를 확인해 어떤 contract 실행인지 고정한다.
</Step>

<Step title="변경 표면 확인">
Worker가 수정한 파일, branch, commit 상태가 contract의 allowed surface와 commit/push 규칙을 벗어나지 않았는지 확인한다.
</Step>

<Step title="Evidence 재실행">
Contract가 요구한 테스트, redaction scan, link check, 로그 확인, deterministic probe를 master가 직접 실행하거나 산출물을 읽는다.
</Step>

<Step title="모델 검증 상태 표시">
`model_verified: false`, `MODEL_UNVERIFIED`, `MODEL_PROBE_FAILED`가 있으면 모델 선언은 측정 사실이 아니라 미검증 상태로 취급한다.
</Step>

<Step title="Acceptance 판단">
통과 항목, 실행하지 못한 항목, 남은 risk를 분리해 기록한다. 검증할 수 없는 결과는 아직 accepted가 아니다.
</Step>
</Steps>

## 실패 신호

| 신호 | 원인 | 조치 |
| --- | --- | --- |
| `CONTRACT_UNREADABLE` | contract 파일을 읽을 수 없거나 `est_chars` 산정이 실패했다. | contract 경로와 권한을 고친 뒤 다시 `check`한다. |
| `NO_COMPLETION_CHANNEL` | `check` 요청에 completion channel이 없다. | `--completion-channel orchestration` 또는 `sentinel-log`를 명시한다. |
| `NO_MODEL` | worker model id가 없다. | runtime이 실행할 실제 model id를 contract와 command에 명시한다. |
| `UNVERIFIED_JOB` | `--probe-cmd`가 job id를 stdout에 출력하지 않았다. | artifact 내용을 읽는 probe로 교체한다. |
| `ORCHESTRATION_UNVERIFIED` | Orca task/dispatch artifact를 확인하지 못했다. | `--orchestration-task`와 `dispatch-show` 결과를 확인한다. |
| `MODEL_TIER_ESCALATION` | 측정된 모델이 선언 모델보다 더 엄격한 tier다. | 해당 worker 결과를 accept하지 말고 재dispatch 또는 owner 판단을 받는다. |
| `MODEL_PROBE_FAILED` | model probe가 실패했지만 register 자체는 완료됐다. | declared model을 측정 사실로 쓰지 말고 별도 확인한다. |
| `delivery UNVERIFIED` | terminal transition이 delivery pass가 아니다. | pane을 직접 읽고 worker가 contract를 받았는지 확인한다. |

## 관련 페이지

<CardGroup>
<Card title="Acceptance loop 실행" href="/run-acceptance-loop">
Acceptance suite, scorecard, regression log로 acceptance 판단을 반복 실행하는 흐름.
</Card>
<Card title="작업자 정리" href="/reap-workers">
Accepted 또는 settled dispatch 이후 terminal과 worktree를 정리하는 절차.
</Card>
<Card title="방어 인벤토리" href="/defense-inventory">
Dispatch gate, model verification, placement, redaction 등 방어 표면의 실패 모드.
</Card>
<Card title="CLI 참조" href="/cli-reference">
`scripts/dispatch-gate`, `scripts/dispatch` 등 공개 command surface와 exit code.
</Card>
</CardGroup>
