# 진단과 제한

Stack 진단은 콘솔 문장이 아닌 구조화된 결과입니다. 안정적인 코드, `error` 또는 `warning` 심각도, 1부터 시작하는 end-exclusive 소스 범위, 간결한 메시지, 정렬된 `expected` 목록을 가집니다. 유용할 때 수정 도움말과 관련 소스 범위도 포함합니다.

## 처리와 심각도

도구는 인코딩과 token, 문법, 식별자와 기본값, 의미 제한, 테마와 아이콘, 레이아웃, 렌더링 순서로 처리합니다. 앞 네 단계의 오류는 렌더링을 막습니다. 테마, 아이콘, 밀도, 레이아웃 힌트 경고는 fallback SVG와 함께 반환될 수 있습니다.

Playground는 소스 편집 후 오래된 진단을 지웁니다. 결과를 선택하면 primary source에 포커스하고 관련 정보에서 이전 선언으로 이동할 수 있습니다.

## 복잡도 제한

| 항목                      |               Draft Stack 1.0 제한 |
| ------------------------- | ---------------------------------: |
| 문서당 다이어그램         |                                  1 |
| 노드                      |                               1~40 |
| 그룹                      |                               0~12 |
| 다이어그램 아래 그룹 중첩 |                              3레벨 |
| 엣지                      | 0~80 또는 노드 수 두 배 중 작은 값 |
| 경고 전 노드 degree       |          12개의 incident edge 선언 |

하드 제한 초과는 `STK4003`입니다. 권장 degree를 넘은 노드는 유효하지만 `STK4002`가 발생합니다. 큰 시스템은 하나에 압축하지 말고 집중된 여러 다이어그램으로 나누세요.

## 이식 가능한 진단 코드

| Code      | Severity | 의미                                             |
| --------- | -------- | ------------------------------------------------ |
| `STK1001` | Error    | 입력이 유효한 UTF-8이 아님                       |
| `STK1002` | Error    | Byte order mark가 있음                           |
| `STK1003` | Error    | 문자열 이스케이프나 디코드 값이 유효하지 않음    |
| `STK2001` | Error    | 선언한 언어 버전을 지원하지 않음                 |
| `STK2002` | Error    | 예상하지 못한 token, 선언, 속성, 값, 연산자      |
| `STK2003` | Error    | 현재 구문이 끝나기 전에 입력이 종료됨            |
| `STK3001` | Error    | 식별자가 유효하지 않음                           |
| `STK3002` | Error    | 식별자가 중복 선언됨                             |
| `STK3003` | Error    | 엣지가 알 수 없는 노드를 참조함                  |
| `STK3004` | Error    | 그룹을 엣지 endpoint로 사용함                    |
| `STK3005` | Error    | 엣지가 노드 자신을 연결함                        |
| `STK3006` | Error    | 정확히 중복된 엣지를 선언함                      |
| `STK3007` | Error    | 한 block에서 속성이 중복됨                       |
| `STK3008` | Error    | 제목, 라벨, 상세가 텍스트 제약을 위반함          |
| `STK3009` | Error    | 그룹에 하위 노드가 없음                          |
| `STK3010` | Error    | 그룹 중첩이 언어 제한을 넘음                     |
| `STK3011` | Error    | 레이아웃 참조가 스코프에서 유효하지 않음         |
| `STK3012` | Error    | 레이아웃 블록 또는 singleton 문장이 중복됨       |
| `STK3013` | Error    | 아이콘 식별자 형식이 잘못됨                      |
| `STK3014` | Error    | 다이어그램에 여러 테마 문장이 있음               |
| `STK4001` | Warning  | 순서 힌트를 만족할 수 없음                       |
| `STK4002` | Warning  | 노드가 권장 incident-edge degree를 넘음          |
| `STK4003` | Error    | 다이어그램이 언어 복잡도 제한을 넘음             |
| `STK5001` | Warning  | 유효 테마에 아이콘이 없어 kind fallback을 사용함 |
| `STK6001` | Warning  | 요청한 non-core 테마가 없어 `default`를 사용함   |

코드 family에서 `STK1000`은 인코딩/어휘, `STK2000`은 문법, `STK3000`은 이름/의미, `STK4000`은 레이아웃/복잡도, `STK5000`은 아이콘, `STK6000`은 테마입니다. `STK9000`은 소스 실수가 아닌 구현 실패용입니다. 구현은 자체 non-`STK` prefix로만 진단을 추가할 수 있습니다.

## 복구 규칙

파서는 여러 독립 오류를 보고하기 위해 복구할 수 있지만 부분 다이어그램을 유효한 것으로 렌더링할 수 없습니다. 알 수 없는 선언, 속성, enum 값, 연산자는 무시되지 않습니다. 의미를 잃은 채 성공처럼 보이는 출력을 막습니다.
