위험한 액션을 실행 전에 승인하기 BETA
escalate_on_deny는 승인 요청을 생성하지 않습니다거부(deny)는 작동합니다. escalate_on_deny: true 태그가 붙은 규칙은 작성된 그대로
거부합니다 -- 일치한 규칙 자체의 policy_id, effect: "deny",
reason_code: "RULE_MATCH"가 반환됩니다.
영어 원문 -- 번역은 기술 검토 대기 중입니다
You are protected.
영어 원문 -- 번역은 기술 검토 대기 중입니다
The escalation does not. The tag is accepted by the policy schema and
carried into the policy bundle, and no enforcer acts on it: no approval request
is raised, no approver is notified, and decision.requires_approval stays
false. Code that branches on decision.requires_approval in order to act on
this tag therefore never runs. (A different mechanism, LLM function policies'
require_approval, does set that field -- escalate_on_deny is not wired to
it.) Tracking: #2391.
현재 승인을 요청하려면 명시적으로 호출하세요.
client.request_approval(decision)은 실제 승인 요청을 전송합니다. 태그가 이를 대신
호출해 주지는 않습니다. 승인 콜백을 참고하세요.
#2363에 따라 승인자용
/approvals 페이지는 프로덕션에서 승인 게이트가 적용되므로, 요청은 API를 통해 처리됩니다.
이는 게시된 Python SDK(controlzero 1.13.14)와 게시된 Node SDK(@controlzero/sdk 1.13.6)
모두에 동일하게 적용됩니다.
사용하는 적용 지점: 승인 워크플로 (대시보드 + 알림 채널) 지원 모드: Hosted (SaaS) 플랜: Teams 상태: BETA. 요청 경로는 호스티드(SaaS) 플랜을 포함한 모든 배포에 제공됩니다. 정책이 승인 요청을 생성하고 에이전트가 일시 중지됩니다. 승인은 기본적으로 꺼져 있습니다 -- 관리자가 Settings -> Approvals에서 범위(조직, 프로젝트 또는 API 키)별로 켭니다. 활성화하려면 별도의 승인자가 필요하므로 Teams 플랜부터 사용할 수 있습니다.
이 흐름에서 액션을 일시 중지하는 절반은 현재 작동합니다. 사람이 액션을 해제하는 나머지 절반은 작동하지 않습니다. 승인 받은 편지함과 요청 상세 경로는 제공되는 모든 배포에서 대시보드로 리디렉션되며, 알림의 딥 링크도 같은 경로를 가리킵니다. 지금은 Teams를 포함한 어떤 플랜에서도 UI에서 요청을 승인할 수 없습니다.
결과는 안전하지만 단순합니다. 일시 중지된 요청은 마감 시간까지 대기하고, SDK는
합성된 거부와 함께 HITLTimeoutError를 발생시키며, 액션은 실행되지 않습니다. 지금
승인을 켜면 approval_required 액션에 대해 감사 추적이 남는 하드 스톱이 제공됩니다.
아직 승인 후 진행(approve-and-proceed)은 제공되지 않습니다. 전체 안내는
승인 설정을 참고하세요.
수행할 내용
AI 에이전트가 정책에서 approval_required로 표시한 액션(프로덕션 배포, 고액 환불, 외부 이메일 발송)을 시도하면 요청이 일시 중지되고, 승인자는 전체 컨텍스트가 담긴 Slack 또는 이메일 알림을 받습니다. 받은 편지함이 제공되면 승인자가 Approve 또는 Deny를 클릭하고, 에이전트는 계속 진행하거나 사유와 함께 거부 응답을 받습니다.
이 방법이 적합한 경우
- AI 에이전트에게 고위험 업무를 맡기되 무작정 실행하도록 두고 싶지 않다면 이 패턴이 맞습니다.
- 승인자 풀이 작고 예측 가능하다면 요청마다 정책을 수정하는 것보다 승인 흐름이 낫습니다.
- 단순히 거부하려면 일반 DLP 규칙 또는 정책을 사용하세요. 승인은 "때로는 예, 때로는 아니오"인 결정을 위한 것입니다.
이 방법을 사용하지 말아야 할 경우
답이 항상 같다면("에이전트의 프로덕션 쓰기는 절대 허용하지 않음") 승인을 기다리지 마세요. 지금 거부 규칙을 작성하세요.
사용 흐름
Agent -> Control Zero: invoke tool "send_refund" args {amount: $9500, customer: ...}
Control Zero: policy match "high_value_refund" -> deny
SDK: your code calls client.request_approval(decision) -> POST approval request
Control Zero -> Slack / email / in-app bell: "Agent 'billing-bot' wants to refund $9500 to cust_123.
[ Approve ] [ Deny ] [ Open context ]"
Approver clicks Approve once / for 24h / 7d / 30d / forever.
SDK: PendingApproval.wait() resolves -> agent proceeds with the call (allow path).
일시 중지 후 대기하는 기본 기능은 현재 SDK에 포함되어 있습니다. 에이전트는 검토 가능하다고 판단한 거부에 대해 request_approval()을 호출한 다음, 승인자가 결정할 때까지 PendingApproval.wait()에서 대기합니다. 정책 액션, 알림 채널, 감사 추적이 모두 이 흐름을 뒷받침합니다. 에이전트 코드가 직접 수행해야 하는 단계는 request_approval() 호출입니다 -- 정책 태그가 이를 대신 실행하지는 않습니다.
설정 방법
- 규칙에 태그를 지정합니다. 검토하려는 규칙에
escalate_on_deny: true를 표시합니다. 현재는 정책을 읽는 사람에게 의도를 기록해 두는 용도이며, 거부를 요청으로 바꾸는 것은 3단계입니다. - 승인을 켭니다. 관리자가 Settings -> Approvals에서 해당 범위(조직, 프로젝트 또는 API 키)의 승인을 활성화합니다. 기본적으로 꺼져 있습니다.
- SDK를 연결합니다. 코드가 검토 가능하다고 보는 거부에 대해
request_approval()과wait()(Python) /requestApproval()과wait()(Node)를 호출합니다. 요청을 생성하는 단계가 바로 이것입니다. 승인 콜백 가이드를 참고하세요. - 어디서든 승인합니다. 승인자는 앱 내 알림 벨, 이메일 매직 링크 또는 연결된 알림 채널에서 처리합니다.
영어 원문 -- 번역은 기술 검토 대기 중입니다
Every approval is auditable: who approved, when, why, and what grant was created.
전체 안내는 승인 설정을, 결정 종류와 범위 모델은 승인 워크플로를 참고하세요.
항상 거부 방식 사용
답이 항상 "아니오"라면 승인을 사용하지 말고 거부 규칙을 작성하세요. 승인을 켜지 않고도 거부 시 알림을 보내는 가벼운 검토 루프를 원한다면, 사유와 함께 거부하고 채널로 전달하세요.
- name: high_value_refund
match:
tool: send_refund
argument_gt: { amount: 1000 }
action: deny
reason: 'Refunds over $1,000 require a human approver. Reply in #approvals to authorize.'
알림 채널과 함께 사용하면 거부 사유와 도구 인수가 검토 채널에 전달됩니다.
자주 이어지는 질문
- "전체 승인 흐름을 설정하고 싶어요" -> 승인 설정
- "SDK 콜백을 연결하고 싶어요" -> 승인 콜백
- "대신 일반 거부 규칙을 작성하고 싶어요" -> DLP 규칙 설정
- "로드맵에 또 무엇이 있는지 보고 싶어요" -> 기능 제공 현황