# v0.1.267 — 41st stable seal (post-40th polish + 핸드오프 자동화)

**봉인일**: 2026-05-21 KST
**범위**: v0.1.263 ~ v0.1.267 (5 사이클)
**40th seal**: v0.1.262 (2026-05-21 새벽)
**자율 진행**: post-40th polish + 협업자 PM 회신 2건 + 핸드오프 다이어트 + publish hook 5종

---

## 사이클 요약

| 버전 | 작업 | 카테고리 |
|---|---|---|
| v0.1.263 | critic 중간/사소 잔존 fix (SignalSimulator + GameObject 처리) | critic fix |
| v0.1.264 | QA-067 SignalSim 스크롤 보존 + QA-068 Gizmo 다중 이동 | 협업자 PM 회신 2건 |
| v0.1.265 | QA-048 Duplicate 오프셋 누적 (`origId` 카운터) | 협업자 PM 회신 1건 |
| v0.1.266 | QA-049 ESC -> F10 변경 + QA-064 복제 후 highlight 잔존 fix | 협업자 PM 회신 2건 |
| v0.1.267 | QA-042 키보드 이동 속도 슬라이더 + QA-043 URP 투명 적용 + 핸드오프 다이어트 + publish marker 5종 hook | 협업자 PM 회신 2건 + 인프라 |

누적 협업자 PM 회신 처리: **7건** (post-40th)

---

## 협업자 PM 회신 처리 상세

### QA-067 — SignalSim 스크롤 위치 보존 (v0.1.264)

기존: SignalSimulatorPanel.Render() 호출 시 scrollOffset 초기화 -> 사용자가 스크롤한 위치가 매 갱신마다 리셋.
fix: `Render()` 진입 시 `_scrollView.scrollOffset` 캐시 -> rebuild 후 scheduler defer로 복원.

### QA-068 — Gizmo 다중 부품 이동 (v0.1.264)

기존: `UpdateGizmoTargets`가 단일 부품만 추적 -> 다중 선택 후 Gizmo 드래그 시 첫 부품만 이동.
fix: `_selectedParts` 전체 순회 후 각 부품 `localPosition += delta` 처리. World 좌표계 기준.

### QA-048 — Duplicate 오프셋 누적 (v0.1.265)

기존: 동일 부품 반복 Ctrl+D 시 모두 같은 위치(원본 + 50mm)에 생성 -> 시각적 겹침.
fix: `_duplicateCount<origId, int>` 정적 dict로 origId당 누적 카운터 +1 -> 오프셋 = `(50mm × dupCount)`.
**SSOT**: Bootstrap.cs:850 + 6979~6988. 앱 세션 동안 유지, 새 `.twn` 로드 시 reset (의도된 동작).

### QA-049 — 설정창 단축키 ESC -> F10 (v0.1.266)

이유: ESC는 모달 닫기/선택 해제의 표준 단축키로 사용 중. 설정창 토글에 ESC 사용 시 충돌.
fix: `Bootstrap.cs:3471` (polling) + `SettingsPanelViewModel.cs:95` (KeyDownEvent) 모두 `KeyCode.F10`로 변경. Ribbon tooltip "(ESC)" -> "(F10)" 갱신.

### QA-064 — Duplicate 후 highlight 잔존 (v0.1.266)

기존: 복제된 부품 선택 시 원본 부품의 outline highlight가 잔존하여 두 부품 동시 강조.
fix: `ApplyMaterialHighlight` 시작 시 `ClearMaterialHighlight()` 호출 -> 이전 highlight 명시적 해제 후 신규 적용.

### QA-042 — 키보드 이동 속도(WASD/Space/C) 슬라이더 (v0.1.267)

협업자 PM 요청 "1인칭 모드 키보드 이동 속도를 설정창에서 조절".
구현:
- `MainHUD.uxml` — 4번째 슬라이더 `slider-fp-speed` (0.5~10 m/s, default 2) + FloatField `label-fp-speed`
- `SettingsPanelViewModel.cs` — `GetFpSpeed` / `SetFpSpeed` 콜백 + 기존 슬라이더 wiring 패턴 일관
- `Factory00Bootstrap.cs:3131~3132` — `CameraViewController.fpSpeed` 직접 바인딩
- **SSOT**: `CameraViewController.cs:33` `fpSpeed = 2f` (단일 필드). L475 `speed = fpSpeed * (Shift ? 3f : 1f)` 실제 사용.

### QA-043 — 우클릭 "투명하게 보기" URP 완전 적용 (v0.1.267)

기존: `_Surface = 1`만 설정 -> URP/Lit이 opaque 큐에서 렌더링하여 알파값 무시.
fix: URP/Lit transparent 모드 8개 속성 일괄 설정.

```csharp
inst.SetFloat("_Surface", 1f);
inst.SetFloat("_Blend", 0f);
inst.SetFloat("_AlphaClip", 0f);
inst.SetFloat("_SrcBlend", (float)BlendMode.SrcAlpha);
inst.SetFloat("_DstBlend", (float)BlendMode.OneMinusSrcAlpha);
inst.SetFloat("_ZWrite", 0f);
inst.DisableKeyword("_SURFACE_TYPE_OPAQUE");
inst.EnableKeyword("_SURFACE_TYPE_TRANSPARENT");
inst.renderQueue = (int)RenderQueue.Transparent;
```

알파 0.35 적용 + 렌더 큐 Transparent 이동으로 깊이 정렬 정합.

---

## 인프라 — 핸드오프 자동화 (v0.1.267)

### handoff.html 구조 다이어트 (579 -> 276라인, 52% 감소)

사용자 명시 "다이어트하라고 문장이 짧을 필요는 없다 + 너무 길지 않도록 한다" 받고 stale 정보만 제거.

- sec1~9 본문에 release-notes로 이미 옮겨진 정보(Stable Seal 11건 표, Ribbon 45 명령 매트릭스, spec 23/28) 일괄 제거
- CYCLE_LOG 표 33 사이클 -> 최근 5건 + seal별 합계
- 본문 -> "release-notes SSOT 참조" 링크로 위임

### handoff-pm-action.html (별도 SSOT 파일, ~130라인)

PM 액션 패널을 별도 파일로 분리하여 어시스턴트가 협업자 회신마다 다이어트할 SSOT로 활용. 모바일 가독성 보강 적용.

- 카드 padding 10->14px, line-height 1.65
- [2] 박스 제목 짧게 ("v0.1.240->266" 잘림 회피) + 부제로 누적 건수
- QA 번호 점(·) -> 콤마(,) 구분 (자연스러운 줄바꿈)
- 각 항목 친절한 설명 한 줄

### publish-build-auto.sh marker 5종 hook

매 빌드마다 `handoff.html`이 자동 갱신됩니다.

| marker | 자동 갱신 |
|---|---|
| `BUILD_META_AUTOGEN` | 최종 갱신 일시 + 최신 빌드 |
| `BUILD_VERSION_AUTOGEN` | 현재 작업 버전 + 빌드 제목 |
| `CYCLE_LOG_AUTOGEN` | 사이클 표 신규 행 prepend (최근 5건 유지) |
| `PM_ACTION_AUTOGEN` | `wiki/handoff-pm-action.html` 통째 삽입 |
| `PM_DOWNLOAD_AUTOGEN` | 빠른 다운로드 vX.Y.Z zip 링크 |

협업자 repo (`/mnt/c/tmp/codeless-dt`) 자동 git pull도 매 빌드 시 실행 — 신규 commit 발견 시 어시스턴트가 다음 사이클에서 `handoff-pm-action.html` 다이어트.

---

## critic 코드리뷰 결과

| 등급 | 건수 | 처리 |
|---|---|---|
| 치명 | 0 | — |
| 중대 | 0 | — |
| 중간 | 1 | F10 이중 binding (Bootstrap polling + ViewModel KeyDownEvent) — 의도된 분기. v0.1.268 SSOT 헬퍼 추출 deferred |
| 사소 | 1 | `SettingsPanelViewModel.cs:13` 주석 "[설정] + ESC" -> "[설정] + F10" 갱신 (본 사이클 즉시 fix) |

**판정**: PASS — 치명·중대 0건. 41st seal 즉시 봉인.

---

## SSOT 검증 (사이클 종료 직전)

```bash
# 1. fpSpeed SSOT — CameraViewController.cs:33 단일 필드
grep -rn "fpSpeed\b" Assets/Scripts/
# -> CameraViewController.cs:33 field + L475 사용 + Bootstrap.cs:3131~3132 콜백 wiring (3개소 SSOT 일치)

# 2. F10 binding — 2곳 (의도된 분기)
grep -rn "KeyCode.F10" Assets/Scripts/
# -> Bootstrap.cs:3471 polling + SettingsPanelViewModel.cs:95 KeyDownEvent

# 3. URP transparent keyword
grep -n "_SURFACE_TYPE_TRANSPARENT" Assets/Scripts/Game/Factory00Bootstrap.cs
# -> L664 + L736 (MaterialGenerator 모드) + L7468 (TogglePartTransparency) — 패턴 일관

# 4. Duplicate origId SSOT — Bootstrap _duplicateCount dict
grep -n "_duplicateCount\b" Assets/Scripts/Game/Factory00Bootstrap.cs
# -> L850 정적 dict + L6979~6988 DuplicateCommand 내부 처리
```

모든 SSOT 검증 PASS.

---

## 변경 파일

코드:
- `Assets/UI/MainHUD.uxml` — slider-fp-speed 행 추가
- `Assets/UI/Components/Ribbon.uxml` — tooltip "(ESC)" -> "(F10)"
- `Assets/Scripts/UI/SettingsPanelViewModel.cs` — GetFpSpeed/SetFpSpeed + 주석 ESC->F10
- `Assets/Scripts/Game/Factory00Bootstrap.cs` — F10 polling + SettingsVM wiring + URP transparent + duplicateCount dict + highlight 잔존 fix + Gizmo 다중 이동
- `Assets/Scripts/Communication/Modbus/SignalSimulatorPanel.cs` — scrollOffset 보존
- `ProjectSettings/ProjectSettings.asset` — bundleVersion 0.1.262 -> 0.1.267

문서·hook:
- `wiki/handoff.html` — 579->276 다이어트 + marker 5종
- `wiki/handoff-pm-action.html` (신규) — PM 액션 패널 SSOT 분리 + 가독성 보강
- `Tools/qa/publish-build-auto.sh` — PM_ACTION + PM_DOWNLOAD hook + 협업자 git pull

---

## 다음 사이클 예정

- **v0.1.268** — QA-014 PM 회신 받으면 root cause 확정 후 fix / QA-045 Edit Tab 그룹 라벨 / QA-050 F11 씬 미확장
- **v0.1.269** — 중간 결함 deferred (F10 SSOT 헬퍼 추출) + publish-build-auto.sh HEADER_TITLE / FACTORY00_GIT / COLLAB_GIT marker hook 3종 추가
- **42nd stable seal** — v0.1.268~272 5 사이클 누적 후 봉인 예정

---

## 누적 통계

- factory00 stable seal 누계: **41건** (v0.1.000 첫 안정화부터 41번째)
- 협업자 PM 회신 처리 누계: **32건** (v0.1.240->267, 38th/39th/40th/41st seal 합산)
- bundleVersion: 0.1.267 (next: 0.1.268)
- 잔존 PM 회신 대기: QA-014 (View Tab 무동작 진단 회신)
