# Rule Details

> `coding step` 이 룰 제목 아래 얹는 세부 항목의 정본이다. 두번째 수준 제목 뒤 대괄호 안 룰 id 가 그 절을 룰에 묶는다.
> 룰 제목 자체는 `PROJECT_RULE.md`(루트) 가 정본이며 이 파일은 그 살을 담는다.

## 출처를 먼저 확정한다 [DR-04]
- 본 값이 **SSOT인가 파생물인가** 먼저 판정한다. 못 정하면 손대지 말고 출처를 찾을 때까지 읽는다.
- 여러 구현이 갈리면 **정본(설계 문서·스펙)**부터 확정한다. 정본 없이 고치면 추측이다.

## 이미 있는 판정을 다시 만들지 않는다 [DR-03]
- 새 분기·새 헬퍼 충동이 들면 멈춘다. **같은 판정이 이미 플래그·데이터에 있다.** 그걸 따르게 한다.
- 같은 로직을 N곳에 복붙하면 미래 드리프트가 N-1개 생긴다.
- 헬퍼는 옵션이라 우회된다. 강제는 **나쁜 코드를 표현 불가능하게** 하거나 **결과를 고정**하는 것뿐이다.

## 생성물은 읽기 전용이다 [DR-02]
- **생성물(빌드 산출물·복제본)은 직접 고치지 않는다.** 증상이 거기 보여도 원인은 생성기·소스다.
- 생성물 직접 수정은 재생성에 소멸하는 가짜 수정이다.
- 생성된 코드는 **완성품**이어야 한다 — 런타임에 registry 조회·convention 재계산·키 재해석을 하지 않는다.

## 한 사실을 바꾸면 모든 소비처를 같은 변경에서 정합한다 [DR-03]
- 시그니처·플래그·이름을 바꾸면 **전 언어·전 소비처**를 함께 고친다.
- "한 곳 고치니 컴파일됨"은 나머지가 조용히 깨진 것이다.

## 이름은 역할을 드러낸다 [DC-NAME]
- 새로 만드는 변수·함수·타입은 무엇을 하는지가 이름에 드러나야 한다.
- 축약·번호·임시 이름을 남기지 않는다.

## 설계가 정한 분기만 만든다 [DC-FALLBACK]
- 폴백·방어 분기를 임의로 넣지 않는다. 설계에 없는 분기는 만들지 않는다.
- 부재를 기본값으로 메우지 않는다 — 없는 것은 없다고 드러낸다.
- 폴백은 이 형태로 온다: `a || b`, 미상을 특정 값으로 유도, 모르는 인자를 무시, `try/catch`로 삼키기.
- 값이 없을 때 다른 값을 고르고 있으면 그것이 폴백이다 — 요구하거나 실패하라.
- 폴백은 틀린 답을 맞는 답처럼 보이게 해 결함을 관측 불가능하게 만든다. 그래서 조용히 오래 산다.
