Policy
Policy(정책)는 안전하지 않은 연산이 프로덕션에 도달하는 것을 방지하기 위해 설계 시점에 적용되는 규칙입니다. 런타임 검증과 달리, Policy는 Tool이 배포되기 전에 Risk Engine이 검사합니다. Tool이 Policy를 위반하면 경고가 표시되거나 배포 자체가 차단됩니다.
설계 시점 적용
Fascia는 "정책 우선(Policy-First)" 원칙을 따릅니다. 안전하지 않은 패턴은 런타임이 아닌 설계 및 검토 단계에서 포착됩니다. 이는 Tool이 GCP 환경에 배포되어 실행되는 시점에는 이미 모든 안전성 검사를 통과했음을 의미합니다.
Risk Engine은 모든 Tool 스펙과 Flow 그래프를 분석하여 리스크를 분류합니다. Policy는 Risk Engine이 평가하는 구체적인 규칙을 정의합니다.
Policy 스펙 구조
Policy 스펙은 다음을 포함합니다:
| Field | Description |
|---|---|
name | camelCase 형식의 고유 식별자 (예: maxRowLimit, budgetCheck) |
type | 정책의 유형 |
condition | 규칙을 정의하는 Value DSL 불리언 표현식 |
action | 조건 위반 시 수행할 행동 |
정책 유형
| Type | Purpose | Example |
|---|---|---|
rowLimit | 너무 많은 행에 영향을 미치는 연산 방지 | 1000행 이상 업데이트 차단 |
budgetCheck | 금융 연산이 한도 내에 있는지 확인 | 설정된 임계값 초과 결제 시 경고 |
rateLimit | Tool 호출 빈도 제한 | 분당 100회 이상 호출 차단 |
custom | 사용자 정의 비즈니스 규칙 | 50% 이상 할인 시 관리자 승인 요구 |
정책 행동
Policy 조건이 위반되면 세 가지 행동 중 하나가 수행됩니다:
| Action | Behavior |
|---|---|
block | 위반이 해결될 때까지 Tool을 배포할 수 없음 |
warn | Tool을 배포할 수 있으나, 사용자가 경고를 확인해야 함 (감사 로그에 기록) |
escalate | 위반 사항이 관리자의 수동 검토를 위해 플래그됨 |
불변식
Policy는 설계 시점에 작동하는 반면, **Invariant(불변식)**은 Execution Contract(실행 계약)의 일부로 런타임에 작동합니다. Invariant는 Entity에 대해 항상 참이어야 하는 비즈니스 규칙입니다.
Invariant는 Entity 스펙에서 Value DSL 불리언 표현식으로 정의됩니다. Execution Contract의 6단계 -- Flow 그래프 실행 후, 트랜잭션 커밋 전 -- 에서 강제됩니다. 불변식이 하나라도 거짓으로 평가되면 전체 트랜잭션이 롤백됩니다.
불변식의 예시:
reservation.endDate > reservation.startDate-- 종료일은 시작일 이후여야 합니다order.totalPrice > 0-- 주문 총액은 양수여야 합니다account.balance >= 0-- 계좌 잔액은 음수가 될 수 없습니다
Risk Engine
Risk Engine은 Policy를 Tool 스펙에 대해 평가하는 자동화된 시스템입니다. 세 가지 리스크 등급 중 하나를 부여합니다:
| Level | Meaning | Deployable? |
|---|---|---|
| Green | 모든 안전 패턴 충족 | 배포 가능 |
| Yellow | 경고 수준의 우려 감지 | 사용자 확인 후 배포 가능 |
| Red | 치명적 안전 위반 발견 | 배포 불가 -- 반드시 해결 필요 |
Red 등급 Tool은 예외나 재정의(override) 없이 배포가 차단됩니다. 재제출 전에 Tool 스펙에서 위반 사항을 수정해야 합니다.
Risk Engine은 일반적인 위반에 대한 자동 수정 제안도 제공합니다. 예를 들어 쓰기 작업을 Transaction 경계로 감싸거나, External 호출에 Retry 노드를 추가하거나, 하드 삭제를 소프트 삭제로 변환하는 등의 제안이 포함됩니다.
전체 리스크 분류 기준, 시그널, 자동 수정 제안 목록은 리스크 규칙 레퍼런스를 참고하세요.