드라이런이란?
**드라이런(Dry Run)**은 단일 입력 fact가 특정 정책 버전의 규칙에 대해 어떻게 평가되는지 부작용 없이 테스트합니다. 실행 로그가 기록되지 않고 할당량도 차감되지 않습니다. 규칙에 대한 단위 테스트라고 보면 됩니다.드라이런 vs 변경 영향 시뮬레이션 vs 의사결정 재실행: 드라이런은 빠른 검증을 위해 직접 입력한 하나의 값을 테스트합니다. 변경 영향 시뮬레이션은 수백~수천 개의 과거 입력에 대해 버전을 테스트하고 베이스라인과 비교합니다. 의사결정 재실행(Decision Replay)은 실제 과거 결정 하나를 후보 버전으로 재평가해 결과를 diff합니다. 개발 중에는 드라이런을, 배포 전 회귀 검증에는 시뮬레이션을, “바로 이 프로덕션 결정은 어떻게 됐을까”라는 질문에는 재실행을 사용하세요.
언제 사용하나요
- 규칙을 만들거나 수정한 직후: 의도한 입력에 매칭되는지 확인
- DRAFT 버전을 발행하기 전: 안전망
- 예상과 다른 실행 결과를 디버깅할 때: 시나리오 재현
- 두 버전을 동일 입력으로 비교하고 싶을 때 (Dry Run Compare)
드라이런 실행
콘솔
정책 버전 페이지 → Dry Run 탭 → 입력 fact 입력 → Run 클릭.CLI
API
응답
상태 3 층위 (State Layers)
data 객체는 상태를 세 층위로 명시적으로 분리해 노출합니다. 한 덩어리로 합쳐서 돌려주지 않습니다.
inputFacts: 요청에서 받은 입력 fact (정규화 후).mutatedFacts: 규칙 액션에 의해 값이 변경된 fact만.generatedVariables: 규칙 액션이 새로 생성한 변수 (입력에 없었던 것). 액션별 변화 키도 포함됩니다.{targetVar}__delta는MUTATE_FACT가 적용한 부호 포함 변화량입니다.
{ ...inputFacts, ...mutatedFacts, ...generatedVariables }로 재구성할 수 있습니다. 분리해서 돌려주는 이유는 감사·재현·디버그가 결정적이어야 하기 때문입니다. 어떤 값이 어디서 왔는지가 항상 명확합니다.
실행 트레이스 (Execution Traces)
엔진이 평가한 모든 규칙은 실행 트레이스 하나를 남깁니다. 트레이스는 어떤 매칭 표현식이 검증됐는지, 규칙이 본 입력 fact가 무엇이었는지, 어떤 액션이 생성됐는지를 기록합니다:tenantId, policyGroupId, policyVersionId, ruleId)가 모든 트레이스를 그 자체로 식별할 수 있게 만듭니다. 외부 조회 없이도 어느 tenant·그룹·버전·규칙에서 나온 트레이스인지 알 수 있습니다.
의사결정 트레이스 (Decision Traces)
실행 트레이스가 무엇을 평가했는가를 기록한다면, 의사결정 트레이스는 무엇이 선택됐는가를 기록합니다. 모든 규칙은decisionTraces에 최종 status와 그 사유 코드와 함께 등장합니다:
status는 결과의 상위 분류를, reasonCode는 그 분류 안의 구체적 사유를 담습니다.
reasonDetail은 nullable이며, 엔진이 추가로 노출할 컨텍스트가 있을 때 사람이 읽을 수 있는 메시지가 들어갑니다 (예: 도달한 구체적 한도 값).
status와 reasonCode의 전체 값 목록과 매핑은 정책 규칙의 Decision Trace를 참조하세요.요구사항 확인
드라이런 전에 버전이 기대하는 fact를 확인하세요:드라이런 비교
두 버전이 동일한 입력에 대해 어떻게 평가하는지 나란히 비교:다음 단계
변경 영향 시뮬레이션
수백 개의 과거 입력에 대해 한 번에 테스트합니다.
배포
검증된 버전을 프로덕션에 배포합니다.

