승인형 백오피스 자동화
approval event, operator identity, side effect 통제를 포함한 백오피스 자동화 패턴을 정리합니다.
백오피스 자동화의 핵심은 모델 품질보다 어떤 action을 언제 누구 승인으로 실행할 것인가입니다.
이 시나리오에서는 LLM이 결정을 보조하더라도, 실제 write와 외부 커뮤니케이션은 business-risk gate 뒤에 두는 편이 안전합니다.
| 조건 | 적합도 | 이유 |
|---|
| 환불/권한/메시지 발송이 포함됨 | 높음 | approval gate 필요 |
| operator identity 추적이 중요함 | 높음 | audit log 구조가 필수 |
| 완전 자동 실행을 원함 | 낮음 | business risk가 높음 |
| 계층 | 책임 | 구현 포인트 |
|---|
| App | 운영자 요청 수집 | OIDC session |
| Orchestration | approval 대기와 resume | Workflow |
| Decision Layer | 초안, 요약, 추천 action | AI SDK |
| Execution Layer | 실제 시스템 쓰기 | Sandbox / internal API |
| Audit Layer | 승인자, 실행자, 결과 기록 | audit log |
| 상태 | 의미 | 종료 조건 |
|---|
| requested | 작업 요청 등록 | draft 생성 |
| drafted | 실행 초안 생성 | 승인 또는 자동 취소 |
| waiting-approval | 승인 대기 | event 수신 |
| approved | 실행 승인 | action 실행 |
| executed | 시스템 반영 완료 | 결과 기록 |
| cancelled | 승인 거부/timeout | 종료 |
import { defineHook, sleep } from 'workflow'
const financeApprovalHook = defineHook<{ approved: boolean; operatorId: string }>()
export async function refundWorkflow(refundId: string) {
'use workflow'
const proposal = await draftRefund(refundId)
const approval = financeApprovalHook.create({ token: `refund:${proposal.id}` })
await notifyFinanceApprover({ proposal, token: approval.token })
const result = await Promise.race([
approval,
sleep('8h').then(() => ({ approved: false, operatorId: 'timeout' })),
])
if (!result.approved) {
return { status: 'cancelled' }
}
return executeRefund({
operatorId: result.operatorId,
proposal,
})
}
async function draftRefund(refundId: string) {
'use step'
return draftRefundProposal(refundId)
}
async function executeRefund(input: { operatorId: string; proposal: RefundProposal }) {
'use step'
return runRefundInSandbox(input)
}
| 통제 | 이유 |
|---|
| OIDC bound operator identity | 행위 책임 추적 |
| approval before side effect | 비즈니스 리스크 차단 |
| workflow trace | 사고 재구성 |
| sandboxed script execution | 실행 격리 |
| 실패 모드 | 대응 |
|---|
| approval timeout | 자동 취소 |
| 승인 후 실행 실패 | rollback 가능한 범위만 자동 복구 |
| 외부 발송 실패 | draft 상태로 보존 |
| operator identity mismatch | 실행 차단 |
| 지표 | 목표 예시 |
|---|
| approval SLA | 8시간 이하 |
| 승인 후 실행 성공률 | 98% 이상 |
| 무승인 실행 건수 | 0 |
| audit completeness | 100% |
Decision
승인형 백오피스 자동화는 "모델이 바로 실행"하는 구조가 아니라 draft -> approval -> execute 구조로
설계합니다. side effect는 approval과 operator identity를 통과한 뒤에만 발생시킵니다.
- operator identity가 OIDC 기준으로 남는가
- mutating action이 approval gate를 통과하는가
- approval timeout 시 자동 종료되는가
- 실행 결과와 승인 로그가 같은 trace에 묶이는가