> ## 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.

# 액션: PASS / MASK / BLOCK

> Starfort의 모든 Guardian 판단은 PASS·MASK·BLOCK 중 하나로 귀결합니다. 각 액션의 의미와 전체 액션이 선택되는 방식을 설명합니다 (Starfort v1.4 문서)

Guardian이 콘텐츠를 평가할 때마다 **액션**을 반환합니다. **PII** 정책은 `PASS` / `MASK` / `BLOCK`을 사용하고, **Topic** 판정은 2가지 상태입니다 — `PASS` 또는 `BLOCK`.

<CardGroup cols={3}>
  <Card title="PASS" icon="check">
    매칭된 규칙이 없습니다(또는 `PASSING` 규칙만 매칭됨). 콘텐츠가 계속 진행됩니다 — 전달되는 것은 Guardian이 확인·재구성한 처리본입니다.
  </Card>

  <Card title="MASK" icon="eye-slash">
    *(PII 전용)* 민감한 부분이 마스크 토큰으로 대체됩니다. Guardian은 마스킹된 콘텐츠를 반환합니다.
  </Card>

  <Card title="BLOCK" icon="ban">
    차단 규칙 또는 unsafe 주제가 매칭되었습니다. 요청이 중단되며 아무것도 전달되지 않습니다.
  </Card>
</CardGroup>

## 전체 액션은 가장 높은 심각도입니다

응답에는 루트 `action`과 항목별 세부 내역이 있습니다. 루트 액션은 PII와 Topic 결과를 결합하여 탐지된 모든 항목 중 **가장 심각한** 액션입니다: `BLOCK` > `MASK` > `PASS`. 따라서 다른 부분이 마스킹만 되더라도, 단 하나의 차단 매칭이 있으면 전체 요청이 `BLOCK`이 됩니다.

## 외부로 나가는 것은 처리본입니다

v1.4부터 외부 AI 서비스로 실제 나가는 콘텐츠는 caller가 제출한 원본이 아니라, Guardian이 파싱·정규화(필요 시 OCR·디코드)로 내용을 실제 확인한 뒤 재구성한 **처리본**(`processed_content`)으로 통일됩니다. 원본에는 Guardian이 확인하지 못한 부분이 남아 있을 수 있으므로, 처리본만 내보내 "우리가 보지 못한 것"이 그대로 흘러나가는 경로를 닫습니다.

| 판정        | egress 콘텐츠                                                                    |
| --------- | ----------------------------------------------------------------------------- |
| **PASS**  | 처리본 — 마스킹 대상이 없어 내용이 원문과 같더라도, 전달되는 것은 Guardian이 재구성한 처리본입니다. 원본이 직접 나가지 않습니다 |
| **MASK**  | 마스킹된 처리본(기존과 동일)                                                              |
| **BLOCK** | 전달 없음 — egress 자체가 발생하지 않습니다                                                  |

이 원칙은 세 caller(API · Desktop Agent · Proxy Server)에 동일하게 적용됩니다. API 응답은 판정과 무관하게 각 입력의 `processed_content`에 처리본을 담으며, PASS여도 비우지 않습니다. 미지원 파일이나 파싱·디코드에 실패한 입력처럼 **처리본을 만들 수 없는 입력**은 내보낼 대상이 없으므로 전달되지 않습니다(`null`) — 확인하지 못한 원본은 외부로 나가지 않습니다.

## 실제 모습 (실제 응답)

**MASK** — PII가 매칭되어 대체되었습니다. `processed_content`에 마스킹된 텍스트가 담깁니다. 마스크 토큰은 `[<MASK_WORD>_<n>]` 형식을 따르며, 카테고리별로 번호가 매겨집니다(1부터 시작, 문서 순서대로, 그리고 **값에 안정적**입니다 — 동일한 원본 값은 동일한 번호를 받으므로 서로 다른 두 이름은 `[PERSON_NAME_1]`과 `[PERSON_NAME_2]`가 됩니다). 각 토큰 뒤의 원본은 `matched_text`로 노출되며, 이는 `unmaskOutput`이 복원할 때 사용하는 값입니다.

```json theme={"dark"}
{
  "action": "MASK",
  "input_results": [{
    "index": 0, "type": "text", "action": "MASK",
    "processed_content": "제 번호는 [PHONE_NUMBER_1] 이고 이메일은 [EMAIL_1] 입니다.",
    "results": [{
      "policy_name": "PII Masking Policy", "policy_type": "PII", "action": "MASK",
      "detected_items": [
        { "rule_type": "regex", "rule_name": "phone_number", "mask_word": "PHONE_NUMBER_1", "matched_text": "010-2543-2513" },
        { "rule_type": "regex", "rule_name": "email", "mask_word": "EMAIL_1", "matched_text": "jane@acme.co.kr" }
      ]
    }]
  }]
}
```

**BLOCK** — unsafe Topic이 매칭되었습니다. `processed_content`는 `null`입니다.

```json theme={"dark"}
{
  "action": "BLOCK",
  "input_results": [{
    "index": 0, "type": "text", "action": "BLOCK", "processed_content": null,
    "results": [{
      "policy_name": "Topic Policy", "policy_type": "TOPIC", "action": "BLOCK",
      "detected_items": [{ "rule_id": "WPN", "rule_name": "무기", "action": "BLOCK", "confidence": 0.91 }]
    }]
  }]
}
```

<Note>
  전체 필드 레퍼런스(PII와 Topic의 `detected_items`)는 [응답 형식](/ko/v1.4/api/response-format)을 참고하세요.
</Note>

## 액션을 확인할 수 있는 위치

* **API 개발자**는 [Guard API 응답](/ko/v1.4/api/response-format)에서 `action`을 읽습니다.
* **Account Admin**은 [Opticon 모니터링](/ko/v1.4/admin/monitoring-opticon)에서 모든 액션을 `PASS` / `MASK` / `BLOCK` 태그가 붙은 트레이스로 확인합니다.
* **Desktop Agent 사용자**는 AI 도구를 사용하면서 MASK/BLOCK을 투명하게 경험합니다.
