본문으로 건너뛰기

Policy

Policy(정책)는 안전하지 않은 연산이 프로덕션에 도달하는 것을 방지하기 위해 설계 시점에 적용되는 규칙입니다. 런타임 검증과 달리, Policy는 Tool이 배포되기 전에 Risk Engine이 검사합니다. Tool이 Policy를 위반하면 경고가 표시되거나 배포 자체가 차단됩니다.

설계 시점 적용

Fascia는 "정책 우선(Policy-First)" 원칙을 따릅니다. 안전하지 않은 패턴은 런타임이 아닌 설계 및 검토 단계에서 포착됩니다. 이는 Tool이 GCP 환경에 배포되어 실행되는 시점에는 이미 모든 안전성 검사를 통과했음을 의미합니다.

Risk Engine은 모든 Tool 스펙과 Flow 그래프를 분석하여 리스크를 분류합니다. Policy는 Risk Engine이 평가하는 구체적인 규칙을 정의합니다.

Policy 스펙 구조

Policy 스펙은 다음을 포함합니다:

FieldDescription
namecamelCase 형식의 고유 식별자 (예: maxRowLimit, budgetCheck)
type정책의 유형
condition규칙을 정의하는 Value DSL 불리언 표현식
action조건 위반 시 수행할 행동

정책 유형

TypePurposeExample
rowLimit너무 많은 행에 영향을 미치는 연산 방지1000행 이상 업데이트 차단
budgetCheck금융 연산이 한도 내에 있는지 확인설정된 임계값 초과 결제 시 경고
rateLimitTool 호출 빈도 제한분당 100회 이상 호출 차단
custom사용자 정의 비즈니스 규칙50% 이상 할인 시 관리자 승인 요구

정책 행동

Policy 조건이 위반되면 세 가지 행동 중 하나가 수행됩니다:

ActionBehavior
block위반이 해결될 때까지 Tool을 배포할 수 없음
warnTool을 배포할 수 있으나, 사용자가 경고를 확인해야 함 (감사 로그에 기록)
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 스펙에 대해 평가하는 자동화된 시스템입니다. 세 가지 리스크 등급 중 하나를 부여합니다:

LevelMeaningDeployable?
Green모든 안전 패턴 충족배포 가능
Yellow경고 수준의 우려 감지사용자 확인 후 배포 가능
Red치명적 안전 위반 발견배포 불가 -- 반드시 해결 필요

Red 등급 Tool은 예외나 재정의(override) 없이 배포가 차단됩니다. 재제출 전에 Tool 스펙에서 위반 사항을 수정해야 합니다.

Risk Engine은 일반적인 위반에 대한 자동 수정 제안도 제공합니다. 예를 들어 쓰기 작업을 Transaction 경계로 감싸거나, External 호출에 Retry 노드를 추가하거나, 하드 삭제를 소프트 삭제로 변환하는 등의 제안이 포함됩니다.

전체 리스크 분류 기준, 시그널, 자동 수정 제안 목록은 리스크 규칙 레퍼런스를 참고하세요.