# v0.1.272 — 42nd stable seal (post-41st 협업자 회신 + 핸드오프 hook + Collision UX 확장)

**봉인일**: 2026-05-21 KST
**범위**: v0.1.268 ~ v0.1.272 (5 사이클)
**41st seal**: v0.1.267 (2026-05-21 아침)
**자율 진행**: 협업자 PM 잔존 spec 4건 + 41st deferred 종료 + 핸드오프 다이어트 + handshake r058 PM 확정 18건 반영

---

## 사이클 요약

| 버전 | 작업 | 카테고리 |
|---|---|---|
| v0.1.268 | QA-045 Edit Tab 4 그룹 분할 + Cut/Copy/Paste 비활성 / QA-050 F11 패널 width 0 | 협업자 PM 회신 2건 |
| v0.1.269 | QA-070 저장 경로 기억 (PlayerPrefs `LastSaveDirectory` + `Project/` 자동 생성) + handoff-pm-action.html PM 확정 18건 다이어트 | 협업자 PM 회신 1건 + 핸드오프 자동화 |
| v0.1.270 | QA-066 씬 클릭 부품 리스트 오토 트래킹 토글 (기존 `autoTrackingScroll` SSOT 재사용) | 협업자 PM 회신 1건 |
| v0.1.271 | 41st seal critic 중간 결함 deferred 종료 — F10 binding 이중 안전망 의도 주석 강화 | critic deferred 종료 |
| v0.1.272 | QA-069 Collision Check 단일/없음 선택 + 탄젠트 제외 + 별도 윈도우 + 카메라 자동 포커스 | 협업자 PM 회신 1건 (큰 사이클 ~150라인) |

누적 협업자 PM 회신 처리: **5건** (post-41st)

---

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

### QA-045 — Edit Tab 4 그룹 분할 + Cut/Copy/Paste 비활성 (v0.1.268)

기존: `cmds-edit` 안 6 버튼이 같은 그룹에 일렬 배치. spec은 4개 그룹 (History/Clipboard/Selection/Object) + 라벨 명시 + Cut/Copy/Paste P2 미구현 = 비활성 고정 요구.

fix:
- `Ribbon.uxml` — `cmds-edit` 4 서브그룹 분할 + 그룹 라벨 + Cut/Copy/Paste 버튼 신설
- `ribbon.uss` — `.c-ribbon__subgroup` + `.c-ribbon__subgroup-label` 신규 셀렉터 + `#edit-cut/copy/paste` opacity 0.35 회색
- `Factory00Bootstrap.cs` — Edit Cut/Copy/Paste `SetEnabled(false)` 호출

### QA-050 — F11 패널 완전 접힘 (v0.1.268)

기존: `--size-leftpanel-collapsed: 24px` — 햄버거 ≡ 영역 확보 목적. 사용자는 "씬이 안 확장된 버그"로 인지.

fix: `tokens.uss` `--size-leftpanel-collapsed: 24px -> 0px`. 햄버거 ≡는 Ribbon 좌측 끝(이미 v0.1.170부터 존재)으로 복원 가능.

### QA-070 — 저장 경로 기억 (v0.1.269)

기존: Save As가 매번 Windows 다운로드 폴더로 초기화.

fix: `Factory00Bootstrap.cs`에 `GetTwnDialogInitDir()` + `RememberTwnDialogDir()` 두 헬퍼 추출.
- 1순위: `_currentTwnPath` 디렉토리 (작업 중 파일)
- 2순위: `PlayerPrefs("LastSaveDirectory")` 이전 세션 마지막 경로
- 3순위: `Application.dataPath/../Project/` (`.exe` 옆 자동 생성 폴더)

Open / Save / Save As 핸들러 모두 두 헬퍼로 통합.

### QA-066 — 씬 클릭 시 부품 리스트 오토 트래킹 토글 (v0.1.270)

오토 트래킹 동작은 이미 v0.1.030부터 `autoTrackingScroll` 플래그로 구현되어 있었음. spec은 ON/OFF UI 노출 요구.

fix:
- `MainHUD.uxml` — `parts-toolbar`에 `parts-toolbar-options` ([설정]) 버튼 추가
- `Factory00Bootstrap.cs` — [설정] 클릭 -> ContextMenu에 `[[OK]] 씬 클릭 시 부품 리스트 오토 트래킹` 표시
- spec은 "세션 임시" 명시했으나 codebase는 이미 `PlayerPrefs("factory00.auto_tracking_scroll")` 영구 SSOT. 영구 유지가 UX 우수 + SSOT 통일 위해 PlayerPrefs 유지

### QA-069 — Collision Check 단일/없음 선택 + 별도 윈도우 (v0.1.272)

가장 큰 사이클 — 신규 메서드 3종 + ~150라인.

#### 3 모드 분기 (`RunCollisionCheck`)

| 선택 상태 | 검사 동작 |
|---|---|
| 0개 | 씬 내 전체 부품 pairwise |
| 1개 이상 | 선택 부품 ↔ 씬 내 나머지 모든 부품 (선택끼리 중복 제거) |

#### 탄젠트 제외 (`StrictBoundsOverlap`)

`Bounds.Intersects()`는 inclusive(면 접촉도 hit). spec은 면 접촉만으로는 hit 아니라고 명시.

```csharp
bool StrictBoundsOverlap(Bounds a, Bounds b)
{
    const float eps = 0.1f;   // 0.1mm (factory00 단위 mm)
    return (a.min.x + eps < b.max.x && a.max.x > b.min.x + eps)
        && (a.min.y + eps < b.max.y && a.max.y > b.min.y + eps)
        && (a.min.z + eps < b.max.z && a.max.z > b.min.z + eps);
}
```

#### 별도 윈도우 (`OpenCollisionResultsSubWindow`)

`_subWindowOverlay` 모달 패턴(v0.1.030 "새창에서 보기") 재사용.
- 중앙 정렬 다이얼로그 (폭 520px, 최대 높이 480px)
- ScrollView + 페어 행 (Button)
- 행 클릭 -> 두 부품 선택 + 합집합 AABB로 `camCtrl.FocusOnBounds()` 카메라 자동 포커스

#### 컴파일 회복 사례

1차 빌드에서 `camCtrl` not in scope 컴파일 에러 발생. `camCtrl`은 SetupScene 메서드의 로컬 변수라 별도 메서드 `OpenCollisionResultsSubWindow`에서 접근 불가. `Bootstrap.cs:3045`의 `Camera.main?.GetComponent<Factory00.Game.CameraViewController>()` 즉석 조회 패턴 미러로 fix. r2 재빌드 PASS.

회고: spec-vs-codebase 사전 검토에서 "참조하는 변수의 scope (필드 vs 로컬)"가 누락. 향후 신규 메서드 추가 시 grep으로 변수 정의 시점 확인 추가 권장.

---

## 41st seal critic deferred 종료 (v0.1.271)

41st seal 봉인 시 critic이 "F10 binding이 두 곳에 분산되어 SSOT 헬퍼 추출이 필요할 수 있다"고 중간 결함으로 지적했으나, 정밀 검토 결과 **의도된 이중 안전망**임을 확인했습니다.

- `Bootstrap.cs:3531` (Input.GetKeyDown polling) — UnityEngine.Input 표준 경로
- `SettingsPanelViewModel.cs:92` (RegisterCallback) — UI Toolkit 이벤트 경로

두 경로 모두 단일 `Toggle()` 호출. `Toggle()` 안 150ms throttle이 동시 발화 시 두 번째 호출을 차단. PostMessage WM_KEYDOWN 자동화 안전망 보장 (룰 `qa-test-by-repro.md §1.2`).

처리: 두 binding에 의도 주석 강화 + Debug.Log 1줄 cleanup. 41st seal 추적 잔존 결함 모두 종료.

---

## handoff-pm-action.html 다이어트 (v0.1.269)

협업자 PM이 2026-05-21 handshake r058 commit (`4278c77`)에서 누적 18개 QA 항목을 [완료] 확정. spot-check 박스에서 일괄 제거.

| 박스 | 변경 전 | 변경 후 |
|---|---|---|
| [2] spot-check | 누적 32건 | 잔존 14건 + PM 확정 18건 별도 표시 |
| 38th seal | 12건 | 5건 (QA-007/009/021/031/052) |
| 39th seal | 7건 | 2건 (QA-053/055) |
| 40th seal | 6건 | 5건 (QA-038/039/040/062/063) |
| 41st seal | 7건 | 2건 (QA-042/043) |

42nd seal에서는 추가로 5건 (QA-045/050/070/066/069) 신규 spot-check 대상으로 추가됩니다.

---

## critic 검토 결과 (v0.1.272 직접 검증)

| 등급 | 건수 | 처리 |
|---|---|---|
| 치명 | 0 | — |
| 중대 | 0 | — |
| 중간 | 1 | `Camera.main?.GetComponent<CameraViewController>()` 즉석 조회 패턴이 2곳 중복 (`Bootstrap.cs:3045` + `:6719`). 향후 헬퍼 추출 권장. v0.1.273 deferred |
| 사소 | 0 | — |

**판정: PASS** (치명·중대 0).

### SSOT 검증

```bash
# 1. Camera.main 즉석 조회 패턴
grep -n "Camera\.main?\.GetComponent<Factory00\.Game\.CameraViewController>" Assets/Scripts/Game/Factory00Bootstrap.cs
# -> L3045 + L6719 (2건, 동일 패턴) — 중간 결함 deferred 대상

# 2. _subWindowOverlay 모달 패턴
grep -n "_subWindowOverlay\s*=\s*new VisualElement" Assets/Scripts/Game/Factory00Bootstrap.cs
# -> L6448 (OpenPartInSubWindow) + L6635 (OpenCollisionResultsSubWindow) — 동일 구조 미러

# 3. StrictBoundsOverlap 단일 정의 + 2곳 호출
grep -n "StrictBoundsOverlap" Assets/Scripts/Game/Factory00Bootstrap.cs
# -> SSOT 일치
```

---

## 변경 파일

코드:
- `Assets/UI/Components/Ribbon.uxml` — Edit Tab 4 그룹 분할 + Cut/Copy/Paste + Collision tooltip
- `Assets/UI/Components/ribbon.uss` — `.c-ribbon__subgroup` + Cut/Copy/Paste 비활성 시각
- `Assets/UI/MainHUD.uxml` — `parts-toolbar` [설정] 옵션 버튼
- `Assets/UI/Theme/tokens.uss` — `--size-leftpanel-collapsed: 24px -> 0px`
- `Assets/Scripts/Game/Factory00Bootstrap.cs` — Cut/Copy/Paste 비활성 + parts-toolbar [설정] 토글 + Open/Save 헬퍼 + RunCollisionCheck + StrictBoundsOverlap + OpenCollisionResultsSubWindow (~250라인 신규/수정)
- `Assets/Scripts/UI/SettingsPanelViewModel.cs` — F10 binding 주석 강화
- `ProjectSettings/ProjectSettings.asset` — bundleVersion 0.1.267 -> 0.1.272

문서·hook:
- `wiki/handoff-pm-action.html` — PM 확정 18건 다이어트 (32 -> 14건 잔존)

---

## 다음 사이클 예정

- **v0.1.273** — Camera.main 즉석 조회 헬퍼 추출 (42nd seal 중간 deferred) + publish-build-auto.sh HEADER_TITLE / FACTORY00_GIT / COLLAB_GIT marker hook 3종
- **v0.1.274** — QA-065 Undo/Redo 드롭다운 P2 검토 답변 (handshake.md 답변 작성) / 잔존 협업자 spec 정리
- **43rd stable seal** — v0.1.273~278 5~6 사이클 누적 후 봉인 예정

---

## 누적 통계

- factory00 stable seal 누계: **42건** (v0.1.000 첫 안정화부터)
- 협업자 PM 회신 처리 누계: **37건** (32 + 5)
- PM 확정 (handshake r058): 18건 / 잔존 19건 (14 + 신규 5)
- bundleVersion: 0.1.272 (next: 0.1.273)
- 잔존 PM 회신 대기: QA-014 (View Tab 무동작 진단)
