# Release Notes — v0.1.158 (25th Stable · Interface Emulation P2)

> **봉인일**: 2026-05-12
> **사이클 코드**: v0.1.158 (Interface Emulation P2 — Phase B 실 감지 전환)
> **이전 stable**: v0.1.157 (24th — Interface Emulation P1)
> **spec**: [`2026-05-12-interface-emulation.md`](../specs/2026-05-12-interface-emulation.md) §1 Phase B

## 한 줄 요약

Phase B 정지 트리거를 **단순 2초 timer** -> **EventBus.OnSensorStateChanged 실 감지 + deadline 5s fallback** 으로 전환. 코일 10 발화 시 즉시 정지, 아니면 timeout. 사실적 시연 강화. SensingDistance 0.1m -> 0.3m + Angle 30° -> 45° 부채꼴 (감지 가능성 향상). **25번째 stable**.

## 변경

### 수정 파일

- `Assets/Scripts/Game/Factory00Bootstrap.cs` (~30라인)
  - `RunInterfaceEmulationDemo()` Phase B 전체 재작성
  - `bool stoppedBySensor` 로컬 가드 + 람다 핸들러 `sensorHandler` 구독/해제
  - `Bus.OnSensorStateChanged` 구독 (`e.ModbusCoil == 10 && e.Value`) -> `actuator.CommandStop()`
  - 5초 deadline `while (!stoppedBySensor && Time.time < deadline) yield return null`
  - timeout 발화 시 토스트 "Sensor 범위 밖" 명시 (정직성)
  - Phase A Photosensor 자동 부착 시 `SensingDistance = 0.3f`, `SensingAngle = 45f` 설정
- `ProjectSettings/ProjectSettings.asset` — bundleVersion 0.1.157 -> 0.1.158

### 신규 산출물

- `wiki/topics/release-notes/v0.1.158.md` (본 문서)
- `downloads/factory00-windows-x64-v0.1.158.zip` (50 MB)
- `downloads/stable/factory00-windows-x64-v0.1.158-emulation-p2-stable.zip` (25th stable)
- `qa-screenshots/v0.1.158/emulation-p2.png` (1920×1080, 회귀 검증)

## 시나리오 변화

| Phase | v0.1.157 P1 | v0.1.158 P2 |
|---|---|---|
| A 부품 어셈블리 | Photo 코일 10, 거리 0.1m, 각도 30° | Photo 코일 10, **거리 0.3m, 각도 45°** (감지 가능성 향상) |
| B 정지 트리거 | 2초 timer 후 무조건 Stop | **OnSensorStateChanged(코일 10, Value=true) 즉시 Stop, 또는 5s deadline** |
| B 토스트 | "센서 감지 모사 -> 정지" (mock) | **"Sensor 감지 (코일 10) -> 정지 (위치 = X.XX m)"** (실) 또는 "Timeout(5s) -> 정지. Sensor 범위 밖." (fallback) |
| C 복귀 | 동일 (CommandHome -> HomePosition 도달) | 동일 |

## 동작 시나리오 (2가지 path)

### A. Sensor 감지 시 (PhotoSensor 범위 안에 부품 진입)
1. F12 -> Phase A 자동 어셈블리
2. Phase B: actuator.CommandForward() 발화
3. Actuator 이동 중 PhotoSensor 가 50ms 폴링으로 다른 부품 (self 제외) 감지
4. SensorPollingDriver -> EventBus.Publish(SensorStateChangedEvent { ModbusCoil=10, Value=true })
5. Demo handler 발화 -> actuator.CommandStop() + 토스트 "Sensor 감지 (코일 10) -> 정지 (위치 = X.XX m)"

### B. Sensor 범위 밖 (감지 못 함 — fallback)
1. F12 -> Phase A 자동 어셈블리
2. Phase B: actuator.CommandForward()
3. 5초 deadline 만료
4. actuator.CommandStop() + 토스트 "Timeout(5s) -> 정지 (위치 = X.XX m). Sensor 범위 밖."

## 사용자 영향

| 영역 | 변경 | 효과 |
|---|---|---|
| 시연 사실성 | 단순 timer -> 실 sensor event 구독 | "실제로 sensor가 감지하고 stop한다" 미팅 톤 강화 |
| 데모 범위 | Sensor 0.1m -> 0.3m | 부품 배치에 따라 감지 가능성 향상 |
| 데모 안정성 | deadline 5s fallback | sensor 감지 실패해도 무한 대기 방지 (이전 P1과 동일) |
| 토스트 | "Sensor 감지" vs "Timeout" 분기 | 사용자 인지 가능 (어느 path 진행됐는지) |

## critic 자체 검토

| 등급 | 건수 | 처리 |
|---|---|---|
| 치명 | 0 | — |
| 중대 | 0 | — |
| 중간 | 2 | (1) Photosensor self-detect 회피 `IsChildOf(selfRoot)` 이미 존재해서 같은 부품 메시는 안 봄. **다른 부품 (LoadedRoot 구조 의존)** 이 sensor 범위 안에 있어야 감지 — 사용자 PC 부품 배치에 따라 감지/timeout 분기. v0.1.159+ 폴리시에서 데모 sensor 위치를 자동으로 다른 부품 근처로 reposition 가능. (2) Photosensor 의 `worldDir` 도 LocalAxisDir 에 의존 — default PlusX 방향. Actuator LocalAxisDir 와 정렬되도록 자동 설정 가능 (현재는 default 유지) |
| 사소 | 1 | 람다 핸들러 구독/해제는 정상 동작이지만 코루틴 안 람다 capture 가 GC 압박 가능 — 단일 호출이라 OK |

판정: **PASS** — 25번째 stable seal 봉인.

## 검증 가능성

### Stage 1 (어시스턴트 자동 — 본 사이클 한계)
- 1920×1080 캡처: 회귀 없음 PASS
- PostMessage WM_KEYDOWN VK_F12 (0x7B) 발화 후 12s 대기 + 캡처 — 단, factory00 1280x1024 부품 배치에서 sensor가 정확히 감지하는지는 모델 구조 의존이라 자동화 한계
- Player.log grep "[demo]" 4개 발화 = PASS 기준

### Stage 2 (사용자 PC 실)
- F12 시연 직접 시도 -> 토스트가 "Sensor 감지" 또는 "Timeout" 어느 분기인지 확인
- 어느 분기든 데모 정상 완료 = PASS

## 알려진 한계

- Demo Phase B 감지는 LoadedRoot 부품 배치 의존. 정확한 시연 자료가 필요한 경우 사용자가 sensor LocalPosition 을 Inspector 에서 부품 끝단 외부에 수동 배치 권장
- 향후 v0.1.159+ 에서 Demo 코드가 sensor 위치를 자동으로 다른 부품 인근에 reposition 하는 기능 추가 가능

## 외부 URL

- 캡처: `os-file-server.tail2b816d.ts.net/qa-screenshots/v0.1.158/emulation-p2.png`
- 빌드 zip: `os-file-server.tail2b816d.ts.net/downloads/factory00-windows-x64-v0.1.158.zip`
- 봉인 zip: `os-file-server.tail2b816d.ts.net/downloads/stable/factory00-windows-x64-v0.1.158-emulation-p2-stable.zip`

## 누적 stable seal 진척 (2026-05-12 — 7 stable 봉인)

| stable # | 버전 | 모듈 |
|---|---|---|
| 19th | v0.1.131 | Inspector Transform Redesign |
| 20th | v0.1.148 | Photosensor P1+P2 |
| 21st | v0.1.151 | Photosensor P3 |
| 22nd | v0.1.154 | Servo Axis P1+P2 |
| 23rd | v0.1.155 | Servo Maker Presets |
| 24th | v0.1.157 | Interface Emulation P1 (단순 timer) |
| **25th** | **v0.1.158** | **Interface Emulation P2 (실 감지 + deadline)** |

총 **7 stable seal in 2026-05-12** / 3 모듈 spec 구현 (Photo + Servo + Emulation P1+P2).

## 다음 사이클 후보

- **v0.1.159 P3**: 다중 부품 시퀀스 (Conveyor -> Sensor -> Stop -> Pick -> Place) — spec §9 Phase 2
- **새 모듈 spec**: 회전 구동축 (RotaryActuator) — spec README P2 예약
- **USER-GUIDE 갱신**: v0.1.115 -> v0.1.158 (24/25th stable 기준 가이드 재작성)
- **polish**: Bootstrap 슬림화 (~4250라인) / 드래그 핸들
