# v0.1.233 — 37th Stable Seal (View slot CRUD 완성 + license SSOT)

**날짜**: 2026-05-17
**범위**: v0.1.231 ~ v0.1.233 3 사이클
**Ribbon 8 탭 명령 누계**: 45 (36th seal 45 -> 37th seal 45, ±0 — 폴리시/마이그레이션 사이클)

## 사이클별 변경

### v0.1.231 — View slot Save 메뉴 sub-menu CRUD

- 채워진 slot 항목 -> sub-menu 분기 `[덮어쓰기, 삭제]`
- 비어있는 slot 항목 -> 단순 click = 저장 (기존 동작 유지)
- `DeleteViewSlot(int slotN)` 헬퍼 신규 — PlayerPrefs.DeleteKey + active slot reset + 토스트
- v0.1.226~230 PlayerPrefs SSOT 시리즈의 CRUD 완성 (Save / Load / Delete = 풀 사이클)

### v0.1.232 — license.tier 키 마이그레이션

- 기존: `factory00.license.tier` (period 사용, SSOT 컨벤션 위반)
- 신규: `factory00.license_tier` (underscore, SSOT)
- 마이그레이션: `LicenseManager.Load()` 안 1회 자동 (HasKey check -> SetInt -> DeleteKey -> Save)
- Idempotent (재실행 안전)
- Debug.Log 1회 출력 (`migrated legacy key '...' -> '...' (tier=N)`)
- PlayerPrefs 키 13종 모두 underscore 컨벤션 통일 완료 (v0.1.230 보고분 마지막 1건 처리)

### v0.1.233 — View slot 메뉴 timestamp 표시

- `ViewState.savedAt` 신규 필드 (ISO8601 `yyyy-MM-ddTHH:mm`)
- SaveViewState 시 `System.DateTime.Now` 자동 채움
- 메뉴 라벨: `[2] yaw=45° pitch=30° dist=8.5 · 2026-05-17 22:00`
- JsonUtility 호환 (기존 5 slot 데이터 손실 없음 — savedAt null 안전)
- 사용자가 어느 slot이 최신/구버전인지 한눈에 확인 가능

## 핵심 패턴 SSOT 강화

### PlayerPrefs 키 컨벤션 100% 통일

```
factory00.<feature>_<descriptor>   <- underscore 만, period 영구 금지
```

13 키 audit + 죽은 키 2개 fix + 컨벤션 위반 1건 마이그레이션. v0.1.226~233 8 사이클 PlayerPrefs SSOT 시리즈 완결.

### PlayerPrefs key 마이그레이션 패턴

```csharp
if (PlayerPrefs.HasKey(LEGACY) && !PlayerPrefs.HasKey(NEW))
{
    var v = PlayerPrefs.GetInt(LEGACY, default);
    PlayerPrefs.SetInt(NEW, v);
    PlayerPrefs.DeleteKey(LEGACY);
    PlayerPrefs.Save();
}
```

향후 다른 키 마이그레이션 시 동일 패턴 재사용. 첫 적용 사례 = LicenseManager.

### ViewState forward-compatible 필드 추가

```csharp
[System.Serializable]
public class ViewState
{
    // 기존 필드 + ...
    public string savedAt;   // v0.1.233 신규. JsonUtility null 안전 = 기존 JSON 호환.
}
```

JsonUtility 가 미존재 필드는 default(`null` / `0` / `0f`) 로 채움 — 데이터 마이그레이션 코드 불필요.

## Ribbon 8 탭 명령 — 45 (변동 없음)

| 탭 | 명령 수 |
|---|---|
| File | 6 |
| Edit | 6 |
| View | 12 |
| Model | 8 |
| Simulation | 4 |
| Communication | 3 |
| Review | 5 |
| Present | 2 |
| **총계** | **45** |

## 협업자 spec 매칭

- 진척 변동 없음 (23/28 = 82%)
- 본 봉인은 PlayerPrefs SSOT 시리즈 후속 완결 — 신규 spec 항목 없음

## 외부 URL

- stable: https://os-file-server.tail2b816d.ts.net/downloads/factory00-windows-x64-v0.1.233-view-crud-license-stable.zip
- 갤러리: https://os-file-server.tail2b816d.ts.net/latest-builds.html#v0.1.233

## USER-GUIDE

- v0.1.232 기준 통합 가이드 작성: `wiki/USER-GUIDE-v0.1.232.md` (PlayerPrefs 13 키 SSOT 표 + View slot CRUD + .twn 직렬화 sync)

## 다음 사이클 큐

- v0.1.234+ Edit Duplicate (Part Mesh/Material 복제 매트릭스 — spec 필요)
- v0.1.235+ Communication MX Component placeholder (SDK 대기)
- v0.1.236+ Welcome 토스트 갱신 (View Save/Load 단축키 안내)
- task #39 InspectorVM / MotorTableVM 분리 (Bootstrap -500~700 라인)
