> ## Documentation Index
> Fetch the complete documentation index at: https://docs.starfort.io/llms.txt
> Use this file to discover all available pages before exploring further.

# 정책 테스트 (Forge)

> Project Guardian별 Test Dataset을 등록하고 Experiment를 실행해, Guard Policy가 PASS / MASK / BLOCK을 얼마나 정확하게 판정하는지 측정합니다.

**Forge**는 v1.3에 새로 도입된 Starfort의 정책 테스트 기능입니다. v1.2에서는 답할 수 없던 질문 — *내 Guard Policy가 실제로 기대한 대로 판정하는가?* — 에 답합니다. 각 입력이 받아야 할 판정을 짝지은 **Test Dataset**을 등록하고, Project Guardian을 대상으로 **Experiment**를 실행하면 action 클래스별 **accuracy**가 산출됩니다. 실패한 케이스는 정책을 수동으로 개선하기 위한 신호가 됩니다.

<Frame caption="Forge는 각 Project Guardian 안에 있습니다 — (1) Forge 탭, (2) Add Dataset, (3) Run Experiment">
  <img src="https://mintcdn.com/aimintelligence/-3ie4No4rGti8Jbz/images/v1.3/admin/forge-overview.png?fit=max&auto=format&n=-3ie4No4rGti8Jbz&q=85&s=c686ff90907eff09f6f6c7f5fdbc5da3" alt="Forge 내비게이션 항목과 Add Dataset, Run Experiment 버튼이 강조 표시된 Project Guardian의 Forge 탭" width="1200" height="626" data-path="images/v1.3/admin/forge-overview.png" />
</Frame>

<Note>
  Forge는 측정하고 가시화할 뿐, 정책을 대신 수정하지 않습니다. 평가는 expected action과 actual action의 결정적(deterministic) 비교이며(LLM 판정 없음), 정책 수정은 일반적인 [Guard Policy 편집·버전 관리](/ko/v1.3/admin/author-guard-policy) 흐름을 그대로 사용합니다.
</Note>

## Test Dataset

**Test Dataset**은 **Project Guardian**(정책을 테스트할 대상)에 종속됩니다. 한 Guardian에 여러 dataset을 둘 수 있습니다 — 예: "PII 공격 패턴", "정상 입력", "Edge case". Dataset 이름은 소속 Guardian 안에서 유일하며, Guardian을 삭제하면 그 dataset과 모든 결과도 함께 삭제됩니다.

Dataset의 각 **item**은 두 부분으로 구성됩니다:

| 부분         | 내용                                                                                                   |
| ---------- | ---------------------------------------------------------------------------------------------------- |
| **입력**     | Guardian에 전달할 콘텐츠 — 멀티턴 대화(user / assistant 메시지의 순서 배열). v1.3은 **텍스트만** 지원합니다.                       |
| **기대 판정값** | Guardian이 내려야 *할* 판정 — 최종 **action**(`PASS` / `MASK` / `BLOCK`), 선택적으로 걸려야 할 정책 코드와 자유 텍스트 `reason`. |

v1.3의 평가는 **최종 action만** 비교합니다. 정책 코드와 reason은 실패 케이스 분석을 위해 모든 결과와 함께 보존되지만, 점수에는 영향을 주지 않습니다.

### Dataset 등록

프로젝트의 Guardian에서 **Forge**를 열고 dataset을 생성합니다:

<Steps>
  <Step title="이름과 설명">이름은 해당 Project Guardian 안에서 유일해야 합니다.</Step>
  <Step title="Guardian Action List">이 dataset이 평가 대상으로 삼는 action 집합(예: Pass / Mask / Block) — 클래스별 accuracy가 이 기준으로 산출됩니다.</Step>
  <Step title="Item 업로드">CSV 또는 JSONL 파일 — 각 레코드가 1개 item(`input` + `expected_output`)입니다.</Step>
  <Step title="Goal (선택)">0\~100%의 accuracy 목표치. 설정하면 이 dataset의 모든 Experiment에 **PASS / FAIL** 판정이 붙습니다: Total Accuracy ≥ Goal이면 PASS.</Step>
</Steps>

<Frame caption="Item 업로드 — 파일 컬럼이 각 item의 입력, 기대 판정값, 메타데이터로 매핑됩니다">
  <img src="https://mintcdn.com/aimintelligence/-3ie4No4rGti8Jbz/images/v1.3/admin/forge-dataset-upload.png?fit=max&auto=format&n=-3ie4No4rGti8Jbz&q=85&s=eb1fe30449b462a0bb5e0989d8334cfc" alt="업로드된 JSONL 파일과 컬럼 매핑을 보여주는 Add Test Dataset 다이얼로그의 Dataset File 단계" width="1200" height="626" data-path="images/v1.3/admin/forge-dataset-upload.png" />
</Frame>

<Frame caption="평가 설정 — accuracy Goal과 Guardian Action List">
  <img src="https://mintcdn.com/aimintelligence/-3ie4No4rGti8Jbz/images/v1.3/admin/forge-dataset-evaluation.png?fit=max&auto=format&n=-3ie4No4rGti8Jbz&q=85&s=dc909bc22c44a383947a5a14284a9cc0" alt="Goal 80%와 PASS, MASK, BLOCK이 선택된 Add Test Dataset 다이얼로그의 Evaluation 단계" width="1200" height="626" data-path="images/v1.3/admin/forge-dataset-evaluation.png" />
</Frame>

Dataset은 버전 관리됩니다. 편집하거나 재업로드하면 새 버전이 생성되고 이전 버전도 보존되며, Experiment는 원하는 버전(기본값 = 최신)으로 실행할 수 있습니다.

## Experiment

**Experiment**는 선택한 **정책 구성**으로 하나의 Test Dataset을 Project Guardian에 통과시켜 결과를 채점하는 1회의 실행입니다. 다음을 설정합니다:

| 입력                              | 비고                                                                                                                           |
| ------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- |
| **Dataset** (+ 버전)              | Dataset이 대상 Guardian, Goal, Action List를 결정합니다. 버전 기본값은 최신입니다.                                                               |
| **이름 / 설명**                     | 선택 — 이름을 지정하지 않으면 process type과 정책 구성으로 자동 명명됩니다.                                                                            |
| **Policy 선택**                   | **서로 다른** 정책 1개 이상, 각각 **버전 1개**를 지정(기본값 = 그 정책의 최신 버전). 같은 정책을 두 번 고를 수 없습니다 — 한 정책의 버전 간 비교는 별도 Experiment를 실행해 나란히 비교합니다. |
| **Process type · model config** | Guardian이 지원하는 process type 중 하나(기본값 = 첫 번째). Model config는 Guardian 설정값이 미리 채워지며 이 실행에 한해 override할 수 있습니다.                 |

<Frame caption="Experiment 설정 — 버전 1개가 지정된 정책, process type, Guardian에서 미리 채워진 model config">
  <img src="https://mintcdn.com/aimintelligence/-3ie4No4rGti8Jbz/images/v1.3/admin/forge-experiment-config.png?fit=max&auto=format&n=-3ie4No4rGti8Jbz&q=85&s=dbd0eea46ed7f61d2ba1e40f37807c1c" alt="PII Basic 정책 버전 0.1.0과 input process type이 선택된 Run Experiment 다이얼로그의 Configuration 단계" width="1200" height="626" data-path="images/v1.3/admin/forge-experiment-config.png" />
</Frame>

실행은 \*\*동기(synchronous)\*\*입니다. 완료될 때까지 blocking되고(`RUNNING` → `COMPLETED` 또는 `ERROR`), 완료 시 결과를 보여줍니다. 결과·트레이스·점수는 영구 보존되어 과거 Experiment를 언제든 다시 조회할 수 있습니다.

### 채점 방식

각 item은 응답이 도착하는 즉시 판정됩니다 — expected action vs actual action, 정답 또는 오답. Experiment는 다음을 보고합니다:

* **Total Accuracy** — action이 일치한 item 수 / 전체 item 수.
* **Pass / Mask / Block Accuracy** — dataset의 Action List에 있는 클래스별, expected action 기준의 정답 비율.
* **PASS / FAIL** — dataset에 Goal이 있는 경우에만: Total Accuracy ≥ Goal이면 PASS.

<Frame caption="Experiment 결과 — 이 실행은 80% Goal에 미달(FAIL)했고, action별 분해가 어디서 실패했는지 정확히 보여줍니다(MASK·BLOCK 항목 미탐지)">
  <img src="https://mintcdn.com/aimintelligence/-3ie4No4rGti8Jbz/images/v1.3/admin/forge-experiment-results.png?fit=max&auto=format&n=-3ie4No4rGti8Jbz&q=85&s=a4f36227a270eb9a4e033809d8c0cdf8" alt="처리 6건, 불일치 4건, Total Accuracy 33%, FAIL 판정과 action별 정확도를 보여주는 Run Experiment 결과 단계" width="1200" height="860" data-path="images/v1.3/admin/forge-experiment-results.png" />
</Frame>

### 결과가 저장되는 곳

Experiment 트레이스는 [Opticon](/ko/v1.3/admin/monitoring-opticon)에 *Guardian › dataset › Experiment* 계층으로 기록되며, 운영 트래픽과 엄격히 분리됩니다: **`forge` environment** 태그(운영 트레이스는 `default`), Experiment 이름 = **session**, dataset 이름 = **user ID**. 운영 PASS / MASK / BLOCK 지표가 테스트 실행으로 오염되지 않고, 특정 Experiment의 트레이스만 정확히 필터링할 수 있습니다. Starfort의 Experiment 이력에는 Forge에서 트리거한 실행만 표시됩니다.

## 실패 케이스로 정책 개선하기

Forge는 기존에 운영 트래픽 사후 분석에 의존하던 루프를 사전 검증으로 닫아줍니다:

<Steps>
  <Step title="실패 케이스 찾기">accuracy가 낮은 Experiment에서 실패한 item(accuracy = 0)을 열어 각 트레이스를 확인합니다 — 입력, expected action, actual action.</Step>
  <Step title="진단">패턴을 찾습니다: 누락된 PII 카테고리, 과탐/미탐하는 topic 등.</Step>
  <Step title="정책 수정">Guard Policy를 수정하고 새 버전을 발행합니다 — 일반적인 [편집·버전 관리](/ko/v1.3/admin/how-to/version-and-apply-policy) 흐름 그대로입니다.</Step>
  <Step title="재실행 후 비교">같은 dataset으로 새 버전의 Experiment를 실행합니다. Run을 나란히 비교하면 accuracy 변화가 보이고 — 회귀(regression)를 운영 트래픽에 도달하기 전에 잡을 수 있습니다.</Step>
</Steps>

## 권한

| 작업                           | 필요 권한                           |
| ---------------------------- | ------------------------------- |
| Dataset · Experiment 조회      | Project Member 이상               |
| Dataset 등록/수정, Experiment 실행 | **`test-execute`** IAM 권한       |
| Dataset 삭제                   | Project Admin 이상                |
| Guard Policy 수정·반영           | Project Admin 이상 (일반 정책 편집과 동일) |

<Note>
  v1.3의 Forge는 의도적으로 텍스트 전용·rule-based입니다. 파일/이미지 dataset, LLM-as-judge 평가, 자동 정책 최적화는 이번 버전 범위 밖입니다.
</Note>
