# v0.1.228 — 35th Stable Seal (PlayerPrefs SSOT 시리즈)

**날짜**: 2026-05-17
**범위**: v0.1.226 ~ v0.1.228 3 사이클
**Ribbon 8 탭 명령 누계**: 45 (34th seal 42 -> 35th seal 45, +3)

## 사이클별 변경

### v0.1.226 — File P2 Recent Files
- Ribbon File 탭 `cmd-recent` 버튼 + ContextMenu 5개 .twn 파일
- `OpenTwnPath(string)` 헬퍼 추출 (cmd-open + Recent 메뉴 공통 path)
- PlayerPrefs `factory00.recent_files` (`|` separator, 최대 5개)
- `LoadRecentFiles` / `AddToRecent` 헬퍼 + `System.IO.File.Exists` 필터
- cmd-open / cmd-save / cmd-save-as 자동 `AddToRecent` 호출

### v0.1.227 — View P2 카메라 프리셋 (1 slot)
- Ribbon View 탭 `view-save` + `view-load` 버튼
- `CameraViewController.SaveViewState() / LoadViewState(ViewState)` 신규 메서드
- `[System.Serializable] ViewState` 클래스 — yaw / pitch / pan / distance / ortho / mode
- PlayerPrefs `factory00.view_slot1` (JSON)

### v0.1.228 — View P3 카메라 프리셋 multi-slot (1~5)
- `ShowViewSlotMenu(Button anchor, bool isSave)` 헬퍼 — Save/Load 동일 ContextMenu 패턴
- Save 모드: 5 slot 모두 표시 + 현재 상태 라벨 (`[2] yaw=45° pitch=30° dist=8.5`)
- Load 모드: 저장된 slot만 표시 (비어있으면 skip)
- v0.1.227 ViewSlot1Pref 호환 유지 (키 동일)

## 핵심 패턴 SSOT 확립

### PlayerPrefs 키 컨벤션
```
factory00.recent_files       — | separator string
factory00.view_slot1 ~ 5     — JsonUtility ToJson(ViewState)
factory00.lit_mode           — int 0/1 (v0.1.108부터)
factory00.auto_tracking_scroll — int 0/1 (v0.1.138부터)
factory00.screen_resolution  — string "WxH"
factory00.parts_section_height / inspector_section_height — float (splitter)
```

### ContextMenu 동적 메뉴 패턴
```csharp
var items = new List<ContextMenuElement.Item>();
foreach (var x in source) {
    var captured = x;
    items.Add(new ContextMenuElement.Item {
        label = $"...",
        onClick = () => Handler(captured),   // closure 캡처
    });
}
_contextMenu = new ContextMenuElement();
var rect = anchor.worldBound;
_contextMenu.Show(rootEl, new Vector2(rect.x, rect.y + rect.height), items);
```

이 패턴은 Recent Files / View multi-slot 둘 다 사용. 향후 동적 메뉴(Edit History / Bookmark 등)에 재사용.

## Ribbon 8 탭 명령 최종

| 탭 | 명령 수 | 변동 |
|---|---|---|
| File | 6 | +1 (Recent) |
| Edit | 6 | — |
| View | 12 | +2 (Save View · Load View) |
| Model | 8 | — |
| Simulation | 4 | — |
| Communication | 3 | — |
| Review | 5 | — |
| Present | 2 | — |
| **총계** | **45** | **+3** |

## 협업자 spec 매칭

- studio-file-tab P2 Recent Files = 100%
- studio-view-tab P2~P3 카메라 프리셋 multi-slot = 100% (실 의도가 1 slot 또는 multi-slot인지는 spec 명세 없음 — 5 slot 보수적 선택)
- 협업자 spec 전체 진척: 23/28 (82%)

## 외부 URL
- stable: https://os-file-server.tail2b816d.ts.net/downloads/factory00-windows-x64-v0.1.228-playerprefs-ssot-stable.zip
- 갤러리: https://os-file-server.tail2b816d.ts.net/latest-builds.html#v0.1.228

## 다음 사이클 큐
- v0.1.229+ Edit Duplicate (Part Mesh/Material 복제 매트릭스 spec 필요)
- v0.1.230+ Status label에 View 활성 slot 표시
- v0.1.231+ Communication MX Component placeholder 갱신 (SDK 대기)
- task #39 InspectorVM / MotorTableVM 분리 (Bootstrap -500~700 라인 감축)
