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

# Stratum Rule Package 작성

> Layer A 감지기, Layer B 분류 규칙, Layer C 라벨 정책을 의도한 등급 분류가 나오는 순서로 작성해 Stratum을 배포합니다 (Starfort v1.4 문서)

[Stratum 정책 관리](/ko/v1.4/admin/stratum-policy)가 Taxonomy·Rule Package의 구조와 버전 규율을 다룬다면, 이 페이지는 Rule Package의 **내용**을 다룹니다 — 세 층을 무엇부터 어떻게 채우는지, 그리고 규칙끼리 충돌하지 않도록 우선순위·확정·억제를 어떻게 설계하는지.

문서 하나의 판별은 세 층을 차례로 지납니다.

```mermaid theme={"dark"}
flowchart LR
    D["문서"] --> A["Layer A<br/>detector 신호"]
    A --> B["Layer B<br/>분류 규칙 → 등급 후보"]
    B --> C["Layer C<br/>라벨 정책 → 최종 등급"]
    C --> R1["자동 확정"]
    C --> R2["회색지대<br/>(2차 검토)"]
    C --> R3["차단"]
```

<Note>
  이 페이지의 YAML 예시는 구조 이해를 위한 발췌입니다. 실제 작성은 `/aim`이 제공하는 **policy type 템플릿**을 시작점으로 삼고, 필드 구성과 검증은 템플릿의 스키마를 기준으로 하세요. 템플릿은 JSON과 YAML을 모두 지원하며, 정책 모델은 YAML로 정의됩니다.
</Note>

## 시작 전 — Taxonomy부터

Rule Package의 모든 등급 참조는 Taxonomy에서 옵니다. 작성 전에 프로젝트의 Taxonomy(등급 집합·순위·판정 방식·임계값)를 먼저 확정하고, Rule Package가 참조할 버전을 정하세요. detector의 grade attribution과 분류 규칙이 emit하는 등급은 모두 **그 Taxonomy 버전에 존재하는 등급**이어야 합니다.

## Layer A — detector: 무엇을 탐지하는가

detector는 특정 신호를 탐지하는 최소 단위이며, 각 detector는 자신이 어느 등급에 기여하는지(grade attribution)를 가집니다. 판별 파이프라인의 단계별로 성격이 다릅니다.

| 단계     | detector | 적합한 대상                                                                     |
| ------ | -------- | -------------------------------------------------------------------------- |
| **L1** | 지문       | 등록된 [지문 템플릿](/ko/v1.4/admin/fingerprint-templates)의 작성본 — 확신도가 높아 즉시 확정 근거 |
| **L1** | 완전일치     | 사전 등록된 실제 데이터와의 완전일치                                                       |
| **L2** | 패턴       | 형식이 고정된 정형 식별자(주민등록번호·카드번호 등) — 검증 규칙 동반                                   |
| **L2** | 키워드      | 도메인 키워드 — 문맥어 근접으로 신뢰도 보강                                                  |
| **L3** | 의미 기반 분류 | 정형 신호가 없어도 문서의 의미로 등급을 추정                                                  |
| **L4** | 조항 판단    | 경계 케이스의 정책 조항 기준 판단 — 반대 방향 증거 포함                                          |

```yaml theme={"dark"}
detectors:
  - id: det.pat_주민등록번호
    kind: pattern
    grade_attribution: 기밀
    regex: '(?<!\d)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])[-.\s]?[1-4]\d{6}(?!\d)'
    validator: rrn_mod11
    context_words: [주민등록번호, 주민번호]
    proximity_chars: 250
    confidence_tiers: { format: 0.75, context: 0.85, checksum: 0.95 }
    action: mask

  - id: det.fp_계약신청서
    kind: fingerprint
    grade_attribution: 기밀
    template_id: tmpl_계약신청서
    match_threshold: 0.8
    action: review_only
```

작성 요령:

* **grade attribution을 등급마다 정확히.** detector가 기여하는 등급이 Layer B 조합과 Layer C 집계의 출발점입니다.
* **패턴 detector는 형식 + 검증 + 문맥의 3단으로.** 정규식에는 숫자 경계(`(?<!\d)`, `(?!\d)`)를 고정하고, 체크섬 등 `validator`는 신뢰도를 끌어올리는 보강으로, `context_words` + `proximity_chars`는 문맥어 근접 시 신뢰도를 높이는 계단(`confidence_tiers`)으로 씁니다. 형식만 맞은 매치와 문맥·검증까지 통과한 매치를 다른 신뢰도로 구분해야 Layer B에서 임계 조건을 걸 수 있습니다.
* **`action`은 탐지 항목의 마스킹 취급을 정합니다.** 마스킹으로 위험이 제거되는 항목은 `mask`로 두어 마스킹본 재등급의 대상이 되게 하고, 자격 증명류처럼 가려도 위험이 남는 항목이나 그 자체로는 판단 근거일 뿐인 신호는 `review_only`로 둡니다 — 마스킹 불가 항목이 남은 문서는 등급이 유지되어 외부 전송이 차단됩니다.
* **지문 detector는 등록된 양식을 참조합니다.** `template_id`가 가리키는 지문 템플릿이 프로젝트에 등록되어 있어야 하며, 참조 유효성은 Rule Package 활성화 시점에 검증됩니다.

L4 조항 판단은 등급 기준을 자연어 조항으로 정의합니다. 포함·불포함 예시로 경계를 긋고, "이미 공개된 정보" 같은 **반대 방향 증거 조항**도 함께 둡니다.

```yaml theme={"dark"}
clauses:
  - clause_id: cl.기밀.심사기준
    grade: 기밀
    title: 심사 기준
    markdown: |
      심사 로직이나 기준값이 노출되는 내용이면 기밀로 판단한다.
      - 포함: 판정 기준표, 기준값이 담긴 내부 매뉴얼.
      - 불포함: 이미 공시된 기준의 일반론.
```

L4의 판단은 항상 "검토 필요" 신호로만 작용하며, 그 자체로 차단이나 마스킹을 직접 내리지 않습니다.

## Layer B — 분류 규칙: 신호를 등급 후보로

분류 규칙은 detector 신호를 조합해 등급 후보를 emit합니다.

| 요소           | 역할                                                                                   |
| ------------ | ------------------------------------------------------------------------------------ |
| `condition`  | detector 신호의 조합 — `signal`(매치 여부), `compare`(건수·신뢰도 비교), `and` / `or` / `not`(부정 조건) |
| `emit`       | 조건 충족 시 내는 등급 후보                                                                     |
| `priority`   | 규칙 간 평가 우선순위                                                                         |
| `terminal`   | 확정 — 해당 등급을 즉시 확정하는 강한 규칙                                                            |
| `suppresses` | 억제 — 이 규칙이 발화하면 지정한 다른 규칙의 후보를 무효화                                                   |

```yaml theme={"dark"}
rules:
  - id: rule.기밀_신청서양식          # 등록 양식 작성본 — 즉시 확정
    priority: 90
    condition: { op: signal, detector_id: det.fp_계약신청서, test: matched }
    emit: { grade: 기밀 }
    terminal: true

  - id: rule.기밀_pii검증             # 검증된 고유식별정보 — 신뢰도 임계 결합
    priority: 80
    condition:
      op: and
      nodes:
        - { op: signal, detector_id: det.pat_주민등록번호, test: matched }
        - { op: compare, detector_id: det.pat_주민등록번호, field: confidence, cmp: ge, value: 0.85 }
    emit: { grade: 기밀 }

  - id: rule.일반_마스킹가공본        # 부정 조건 — 이미 가공된 문서는 기밀 후보를 억제
    priority: 78
    condition:
      op: and
      nodes:
        - { op: signal, detector_id: det.pat_마스킹흔적, test: matched }
        - { op: not, node: { op: signal, detector_id: det.pat_주민등록번호, test: matched } }
    emit: { grade: 일반 }
    suppresses: [rule.기밀_pii검증]
```

설계 요령:

* **확정(terminal)은 확신도가 1에 가까운 근거에만.** 지문 매치나 완전일치처럼 오탐 여지가 거의 없는 신호가 대상입니다. terminal을 남발하면 뒤 단계(의미 분류·조항 판단)와 라벨 정책이 보정할 기회가 사라집니다.
* **임계 조건은 `compare`로.** 같은 detector라도 형식만 맞은 매치와 검증까지 통과한 매치의 신뢰도가 다르므로, `field: confidence`(신뢰도)나 `field: count`(건수) 비교로 규칙의 발화 조건을 조입니다.
* **부정 조건으로 반대 증거를 반영하세요.** 위 예시처럼 마스킹 흔적이 있고 활성 PII가 없으면 가공본으로 보고 일반을 emit하면서 기밀 후보를 `suppresses`로 억제합니다. L4의 반대 방향 증거 조항(기공시·공개 확정)도 `not` 조건으로 기밀 조항 판정에서 배제할 수 있습니다.
* **priority는 근거의 강도 순으로.** 확정 계열을 높게, 단독으로는 판단이 서지 않는 약한 신호는 낮은 priority의 하위 후보로 두어 회색지대 수렴용으로 씁니다.

## Layer C — 라벨 정책: 충돌 해소와 외부 전송 라우팅

라벨 정책은 Layer B가 낸 등급 후보들을 최종 등급으로 확정하고, 외부 전송 라우팅을 결정합니다.

```yaml theme={"dark"}
label_policy:
  taxonomy_ref: my-company@1.0
  conflict_resolution: highest_rank
  manual_label_precedence: true
  routing:
    기밀:   { low: 0.60, high: 0.85 }
    대외비: { low: 0.60, high: 0.85 }
```

* **`taxonomy_ref`** — 이 Rule Package가 참조하는 Taxonomy의 특정 버전입니다.
* **`conflict_resolution: highest_rank`** — 한 문서에서 여러 등급 후보가 나오면 가장 높은 등급으로 확정합니다. 단일 민감 구간이 문서 전체 등급을 끌어올려 하향 오분류를 막습니다.
* **`manual_label_precedence`** — 수동으로 부여된 등급은 자동 판정이 임의로 덮어쓰지 않습니다.
* **`routing`** — 등급별 확신도 임계입니다. `high` 이상이면 자동 확정, `low`와 `high` 사이면 회색지대로 라우팅되어 사람의 2차 검토로 이어집니다. 외부 전송 불가 판정은 차단됩니다.

일반 등급은 점수형이 아니라 **clearance gate**입니다 — 의심 신호가 없고 판별이 완수된 문서만 통과합니다. 판별이 완수되지 못한 경우(분석 실패·시간 초과)는 일반으로 강등되지 않고 fail-secure로 안전측에서 처리됩니다.

## Taxonomy 참조 무결성

* Rule Package가 참조하는 Taxonomy 버전은 `taxonomy_ref`로 **고정**됩니다. Taxonomy를 개정해 새 버전을 발행해도 기존 Rule Package는 참조하던 버전으로 계속 동작하며, 새 등급 체계를 쓰려면 `taxonomy_ref`를 갱신한 새 Rule Package 버전을 발행해 Pin해야 합니다.
* detector의 grade attribution과 분류 규칙이 emit하는 등급이 참조 Taxonomy의 등급 집합에 존재하는지, 지문 detector가 참조하는 지문 템플릿과 버전이 존재하는지는 스키마 검증과 활성화 시점 검증의 대상입니다.

## 체크리스트

* Taxonomy 버전을 먼저 확정하고 `taxonomy_ref`로 고정했는가?
* 모든 detector에 grade attribution을 지정했고, emit하는 등급이 전부 그 Taxonomy에 존재하는가?
* 패턴 detector에 숫자 경계와 `validator`·문맥어 신뢰도 계단을 넣었는가?
* 마스킹으로 위험이 제거되지 않는 항목(자격 증명류)을 `mask`로 두지 않았는가?
* `terminal`은 지문·완전일치처럼 확신도 높은 근거에만 썼는가?
* 반대 증거(가공본·기공시)를 부정 조건과 `suppresses`로 반영했는가?
* `routing`의 `low` / `high` 임계가 자동 확정과 회색지대의 경계를 의도대로 긋는가?
* 지문 detector가 참조하는 [지문 템플릿](/ko/v1.4/admin/fingerprint-templates)이 등록되어 있고 버전이 유효한가?

<Tip>
  작성을 마친 Rule Package는 저장만으로는 적용되지 않습니다. 새 버전을 Project Stratum에 **Pin**해야 판별에 쓰입니다 — 버전 규율은 [Stratum 정책 관리](/ko/v1.4/admin/stratum-policy)를 참고하세요.
</Tip>
