# ADR-016: 씨앗 반응 글꼴 — 글꼴이 자모 씨앗값으로 변주한다

## Status
Accepted

## Date
2026-10-10

## Context
- 씨앗값 계약(`seed`, `jamo-seeds`, `FontKku.applyJamoSeeds`)은 오래전부터 있었다. 자모 노드마다 `--fy-jamo-seed`(0–1, 키 `자모|역할|순번|salt|호스트 씨앗`)를 걸어 주지만, 이 값을 읽는 것은 페이지 CSS뿐이었다. 기본 제공 글꼴은 모두 "같은 글은 언제나 같은 모양"이었다.
- 사용자는 "정해진 글꼴이 아니라 매번 무작위로 변형되는 스타일"을 폰꾸의 중요한 특장점으로 꼽았다(2026-10-10). 글꼴 파일로는 같은 글자를 매번 다르게 그릴 수 없다. 한글은 11,172자 × 변형을 파일에 담을 수 없다. 반면 폰꾸는 글자를 그리는 규칙이라 주사위를 섞을 수 있다.
- PRD의 열린 결정이 있었다: "규칙 기반 변주 기능을 CSS + 씨앗값 도우미 수준으로 둘지, 별도 규칙 API/DSL로 승격할지".
- 위험도 둘 있다. 무작위 변형이 자모를 겹치게 해 조립을 무너뜨릴 수 있고, 기존 페이지의 모양이 조용히 바뀔 수 있다.

## Decision

### 1. 씨앗 반응 글꼴
씨앗 반응 글꼴은 글꼴 CSS가 자모 노드의 `--fy-jamo-seed`를 읽어 변주하는 글꼴이다. 페이지가 바탕 요소에 `seed`(고정 값 또는 `"auto"`)와 `jamo-seeds`를 주면 켜진다.
- **켜지 않으면 그대로다.** 씨앗 규칙은 글꼴 범위 조건에 바탕 요소 출력 `[data-fy-jamo-seeds="true"]`를 붙여(`:where([data-fy-font="X"][data-fy-jamo-seeds="true"]) …`) `jamo-seeds`를 켠 바탕 요소에만 닿는다. 식은 `(var(--fy-jamo-seed, 0.5) - 0.5)` 꼴로, 값이 없으면 0이다.
  - 예외: 말랑은 기존 자모별 기울기 규칙에 씨앗 몫을 더했으므로 조건 없이 이 식에 기댄다. 씨앗이 없으면 0이 더해진다.
- **재현과 변주를 한 손잡이로.** 같은 씨앗(`seed="poster-v1"`, 이름·주문번호)은 언제나 같은 모양이다. `seed="auto"`는 그릴 때마다 새로 섞는다. 해석된 숫자는 `data-fy-seed`로 읽어 고정할 수 있다.
- **계약 안에서만.** 기하는 기반 글꼴이 쓰지 않는 레벨 변수만 쓴다(ADR-010 — 같은 레이어 같은 변수는 대체).
  - 자모 레벨 `--fy-jamo-rotate`·`--fy-jamo-dx`·`--fy-jamo-dy`는 jamo 레이어에서 `[data-jamo]` 조건으로 선언한다.
  - 칠은 `color`·`text-shadow`처럼 글꼴 린트가 허용하는 속성만 쓴다.
  - 글꼴 린트와 계약(ADR-008)은 바꾸지 않았다. 바탕 요소 출력 조건과 `var()` 읽기는 이미 허용된다.

### 2. 기본 제공 씨앗 반응 글꼴 6종
| 글꼴 | 씨앗을 켜면 |
|---|---|
| `malang` | 자모별 기울기에 초성 자리 ±1.5°, 모음·받침 자리 ±1°를 더함. 가로 모음 위 초성(`tt`)·head·막대는 돌리지 않음 |
| `crayon` | 기울기 ±2.5°, 세로 ±0.015em. 역할 색 안에서 색조 ±30° |
| `chalk`·`jasu` | 기울기 ±2.5°, 세로 ±0.015em |
| `sticker` | 세로 모음 옆 초성·세로 모음 기울기 ±3°. 역할 색 안에서 색조 ±30° |
| `glitch` | 색 채널 어긋남 폭 ±0.02em. 씨앗이 큰 자모(약 5개 중 1개)는 가로로 최대 0.07em 밀림(head 제외) |

폭은 겹침 감사가 정한다. 기하 변주는 은은하게 두고, 눈에 띄는 변주는 겹침과 무관한 칠(색조)로 낸다.

### 3. 겹침 감사의 씨앗 표본
- 정책 항목에 `seeds`(문자열 목록)를 두면 `scripts/glyph_overlap_audit.py --policy`가 씨앗 없이 한 번 재고, 씨앗마다 측정 칸의 바탕 요소에 `seed` + `jamo-seeds`를 켜고 한 번씩 더 잰다. 쌍마다 가장 큰 비율로 판정한다.
- 씨앗 반응 글꼴은 어떤 표본 씨앗에서도 임계(15%)를 넘으면 안 된다. 기본 제공 6종은 씨앗 4개(`가람`·`나래`·`다솜`·`마루`)로 잰다.
- 처음 폭에서 실제로 잡힌 겹침이 있었다(크레용 꿰 18.5%, 스티커 홍 26%, 말랑 룡 17.6%, 글리치 황 17.2%). 이것으로 위 폭과 제외 자리를 정했다.

### 4. 제품 결정 — 변주는 CSS + 씨앗 도우미 + 씨앗 반응 글꼴
규칙 API·DSL로 승격하지 않는다. 변주는 세 가지로 완결한다.
- 페이지 CSS(`--fy-jamo-seed`를 읽는 클래스 — 글꼴 페이지의 꾸미기 '변주' 묶음이 생성한다)
- 씨앗 도우미(`seed`, `jamo-seeds`, `applyJamoSeeds`)
- 감사를 통과한 씨앗 반응 글꼴

PRD의 열린 결정은 이것으로 닫는다.

## Alternatives Considered
### 런타임 옵션 `vary="0.3"` — JS가 변형 계산
- 장점: 글꼴과 무관하게 한 줄로 켠다.
- 단점: 새 옵션 표면이 생기고, 변형 축·폭이 런타임에 박혀 글꼴마다 다른 손맛을 못 낸다. CSS 계층(글꼴·페이지)이 이미 같은 일을 하며, 감사가 글꼴 단위라 글꼴이 폭을 가져야 검증된다.

### 씨앗 변주를 항상 켠다
- 장점: 따로 켤 필요가 없다.
- 단점: 기존 페이지 모양이 바뀌고 "같은 글은 같은 모양" 기본 약속이 깨진다. `jamo-seeds`가 없으면 씨앗이 모두 0.5라 어차피 변주가 없다.

### 페이지 CSS로만 변주
- 장점: 글꼴이 단순하다.
- 단점: 사람마다 폭을 정해야 하고 겹침 보장이 없다. 꾸미기 도구로 이 길도 남기되(상한 있는 슬라이더), 기본 제공 글꼴은 감사를 통과한 폭을 갖는다.

## Consequences
### Positive
- 글꼴 파일 없이, 추가 파일 없이 같은 글자를 매번 다르게 그린다. 씨앗으로 재현할 수 있다.
- 씨앗을 켜지 않은 페이지는 모양이 그대로다(조건부 규칙, 말랑은 0이 더해짐).
- 무작위인데 깨지지 않는다는 것을 감사가 보장한다.

### Negative
- 겹침 감사 시간이 씨앗 반응 글꼴마다 (1 + 씨앗 수)배다. 6종 × 5회.
- 기하 변주 폭이 작다(겹침 예산). 눈에 띄는 변화는 색조에 기댄다.
- 브라우저 전용이다. 사이드카 `render_html`은 `--fy-jamo-seed`를 내보내지 않는다(기존 `jamo-seeds` 계약과 같음).

### Risks
- 기반 글꼴이 나중에 같은 레벨 변수를 쓰기 시작하면 씨앗 규칙과 대체 관계가 생긴다. 파생 글꼴의 머리 주석이 쓰는 변수를 적어 두었고, 감사가 겹침으로 드러낸다.

## Related Documents
- ADR: [ADR-008 글꼴 계약 v2](./ADR-008-font-contract-v2.md), [ADR-010 파생 글꼴](./ADR-010-derived-fonts-and-script-loader.md), [ADR-002 옵션 우선순위](./ADR-002-option-priority-contract.md)
- Architecture: [움직임과 변주](../ARCHITECTURE/animation-and-variation.md)
- PRD: [해결하는 문제와 쓰임](../PRD/problems-and-use-cases.md)

## Change Log
- 2026-10-10: 씨앗 반응 글꼴 6종, 겹침 감사 씨앗 표본, 글꼴 페이지 변주·글꼴 뽑기와 함께 Accepted로 기록
