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

# nora approvals

> CLI에서 승인 게이트 결정, 또는 외부 승인 워크플로우 배선

승인은 특정 에이전트 액션을 출시하기 전 거치는 사람 게이트입니다. `approvals`로 대기 승인을 나열하고 결정하며, 승인 요청을 외부 시스템(Slack 봇, 커스텀 리뷰 UI)으로 밀어 보내는 웹훅을 설정할 수 있습니다.

## 명령

| 명령 | 설명 |
| - | - |
| `approvals list [flags]` | 필터와 함께 승인 낱건 나열. |
| `approvals get <id>` | 승인 낱건 하나 가져오기(전체 맥락). |
| `approvals decide <id> --approve\|--reject` | 대기 낱건 승인이나 거부. |
| `approvals describe <flow-slug>` | 외부 승인용 웹훅 URL·페이로드 모양 출력. |
| `approvals set-webhook <flow-slug> [url]` | 승인 웹훅 URL 설정이나 지우기. |

## `approvals list`

```bash theme={null}
nora approvals list \
  --status pending \
  --kind tool \
  --limit 20
```

필터:

* `--status pending|approved|rejected|expired`
* `--kind agent|route|tool|action|cost` 게이트 종류
* `--source builder_run|api|webhook|schedule` 호출이 온 곳
* `--limit <n>` 최대 줄. 기본 50

구조화 출력은 `--json`을 붙입니다.

## `approvals get`

```bash theme={null}
nora approvals get ap_abc
```

승인 낱건을 전부 출력합니다.

* 승인 대상(종류, 타겟 블록, 인자)
* 언제 올라왔는지
* 관련 트레이스 ID
* 타임아웃
* 같은 트레이스의 이전 관련 승인(있다면)

승인자가 근거 있는 결정을 내리는 데 씁니다.

## `approvals decide`

```bash theme={null}
# 승인
nora approvals decide ap_abc --approve --reason "한도 내 금액"

# 거부
nora approvals decide ap_abc --reject --reason "중복 환불" --external QA_TICKET_42
```

플래그:

* `--approve` **또는** `--reject`(정확히 하나, 필수)
* `--reason <text>` 컴플라이언스 모드에선 필수. 늘 강력히 권함
* `--external <id>` 외부 추적 ID(예: 티켓 번호, PR 참조)

결정은 한 방향 액션입니다. undo는 안 되지만, 바로잡으려고 같은 트레이스에 새 승인을 올릴 수 있습니다.

## `approvals describe`

```bash theme={null}
nora approvals describe support-agent
```

웹훅 계약을 출력합니다.

* 새 승인이 열릴 때 Nora가 POST 하는 URL
* 서명 헤더 형식
* 페이로드 모양
* 외부 시스템이 다시 닿는 콜백 엔드포인트

Slack 봇이나 커스텀 리뷰 UI를 이을 때 씁니다.

기계 출력은 `--json`을 붙입니다.

## `approvals set-webhook`

```bash theme={null}
# 설정
nora approvals set-webhook support-agent https://approvals.internal/hooks/nora

# 지우기
nora approvals set-webhook support-agent --clear
```

웹훅을 설정하면 새 승인이 앱 안**과** 웹훅에 함께 뜹니다. 지우면 앱 안에서만 뜹니다.

이건 `nora flows settings update --set-approval-webhook`의 편의 래퍼입니다.

## 레시피

### 믿는 소스에서 전부 한꺼번에 승인

```bash theme={null}
for id in $(nora approvals list --status pending --source schedule --json | jq -r '.[].id'); do
  nora approvals decide "$id" --approve --reason "자동 승인 스케줄 실행"
done
```

주의하세요. 승인은 undo가 안 됩니다. 정말 믿는 소스만 자동 승인합니다.

### Slack 연동 승인

```bash theme={null}
# 일회성 셋업: 웹훅 잇기
nora approvals set-webhook support-agent https://slack-approvals.internal/hooks/nora

# Slack 봇에서 버튼 눌림에
curl -X POST https://<서버>/api/v1/<워크스페이스 ID>/approvals/ap_abc/decide \
  -H "Authorization: Bearer $NORA_TOKEN" \
  -d '{"verdict":"approve","reason":"Alice가 Slack으로 승인","external":"slack-msg-xyz"}'
```

엔드포인트가 `approvals decide`와 같은 페이로드 모양을 받습니다.

### 타임아웃 정책: 오래된 승인 자동 거부

cron job을 둡니다:

```bash theme={null}
# 24시간 넘게 대기한 것 거부
cutoff=$(date -v-1d +%s)
for row in $(nora approvals list --status pending --json | jq -c '.[]'); do
  age=$(echo "$row" | jq -r '.created_at' | date -j -f "%Y-%m-%dT%H:%M:%SZ" +%s -)
  if [ "$age" -lt "$cutoff" ]; then
    id=$(echo "$row" | jq -r '.id')
    nora approvals decide "$id" --reject --reason "자동 거부: 24시간 초과 대기"
  fi
done
```

또는 승인 게이트에 직접 타임아웃을 둡니다(`agents update --set-cost-approval`과 관련 플래그로).

## 승인 게이트 종류

* **agent** Agent 답변이 전송 전 승인 필요
* **route** Agent 라우팅 결정(어느 분기로 갈지)이 승인 필요
* **tool** 특정 Tool 호출이 실행 전 승인 필요
* **action** Action이 걸리기 전 승인 필요
* **cost** 실행 비용이 임계값을 넘을 때 승인 필요

각각 블록마다 켭니다([`nora agents`](/ko/cli/agents), [`nora tools`](/ko/cli/tools), [`nora actions`](/ko/cli/actions) 참고).

## 관련

* [승인·배포](/ko/reliable/simulation/verify-deploy) 승인의 개념 문서
* [`nora flows settings`](/ko/cli/flow-settings) 승인 웹훅 설정
* [감사 트레일](/ko/reliable/versions/audit) 모든 결정이 행위자·이유와 함께 기록됨


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.