# 버전·태그·릴리스 규약

## 버전 번호 — SemVer `A.B.C`

버전업이 필요할 만큼 큰 수정이면, 내용에 따라 어느 자리를 올릴지 판단합니다.

| 자리 | 언제 올리나 | 예 |
|---|---|---|
| **A** (major) | 호환이 깨지거나 구조가 바뀔 때 | 통신 전문의 필수 필드 변경, 설정 파일 형식 변경, 구조 전환 |
| **B** (minor) | 새 기능(큰 기능 단위)을 추가할 때 | 새 화면, 새 제어 기능 |
| **C** (patch) | 버그·보안 수정, 작은 개선 | 오표기 수정, 오판정 수정, 취약점 조치 |

- 사소한 수정(문구·스타일 등)은 그때마다 올리지 않고 **다음 릴리스에 묶습니다.**
- 상위 자리를 올리면 하위 자리는 0 으로 되돌립니다. (`1.4.7` → 새 기능 → `1.5.0`)
- 버전 번호는 제품마다 따로 관리합니다. 한 제품의 번호를 다른 제품의 기본값으로 쓰지 않습니다.

> 왜 — 버전 번호만 보고도 "업데이트해도 기존 설정·연동이 그대로 동작하는가"를 판단할 수 있어야 합니다.

## 태그 — 프로젝트의 기존 접두를 유지

한 저장소에서 여러 산출물을 내거나 제품을 구분해야 하는 경우, 태그 앞에 **프로젝트 고유 접두**를 붙입니다. 이미 쓰고 있는 접두는 바꾸지 않습니다.

| 예 | 뜻 |
|---|---|
| `sv-v1.12.0` | 서버 릴리스 |
| `cl-v1.12.0` | 클라이언트(웹 화면) 릴리스 |
| `v2.3.1` | 접두가 없는 단일 제품 저장소 |

> 왜 — 접두가 중간에 바뀌면 태그 목록이 두 갈래로 나뉘어, 과거 릴리스를 찾거나 비교하기 어려워집니다.

## 릴리스 — 릴리스 노트 + CHANGELOG

릴리스할 때는 다음을 함께 남깁니다.

1. **태그** — 위 접두 규칙대로
2. **릴리스 노트** (예: GitHub Release) — 이번 버전에서 바뀐 점, 업데이트 시 주의점
3. **CHANGELOG** — 저장소 안의 누적 변경 기록

릴리스 노트에는 사용자·협력사가 알아야 할 것을 씁니다.

```markdown
## sv-v1.12.0 (2026-10-27)

### 새 기능
- 세척 설정 화면에서 로봇이 거부한 항목을 표시 (#120)

### 수정
- 예약세척 취소 후 우유밀기가 계속 막히던 오판정 수정 (#118)

### 업데이트 시 주의
- 없음 (기존 설정 그대로 동작)
```

- 큰 기능은 **별도 기능 브랜치·별도 릴리스**로 분리합니다 ('브랜치 운영' 문서 참조).
- 릴리스 노트·이슈 본문에 **비밀값(비밀번호·토큰·키)** 을 넣지 않습니다.

## 라벨

이슈·PR 에 라벨을 붙여 분류합니다.

| 라벨 묶음 | 용도 | 예 |
|---|---|---|
| `type/*` | 변경 유형 | `type/feat`, `type/fix`, `type/docs` |
| `semver/*` | 올릴 버전 자리 | `semver/major`, `semver/minor`, `semver/patch` |
| `area/*` | 영향 영역 | `area/server`, `area/client`, `area/protocol` |

협업 저장소에는 그 저장소 고유의 라벨이 따로 있을 수 있습니다(예: 요청 방향을 나타내는 `from:robot` / `from:server`). 그 경우 **저장소 규약이 우선**합니다.

## 우선순위

1. 각 프로젝트 고유 규칙(저장소의 README·에이전트 규약 문서)
2. 푸시·외부 공개에 대한 승인, 자동 배포 트리거(예: 특정 브랜치 푸시 시 자동 배포) 확인
3. 이 문서의 공통 규칙
