# v0.1.494 — QA-102 B-03 후속: 컴포넌트 삭제 Undo + ComponentEditCommand 일반화

- 버전: v0.1.494
- 날짜: 2026-05-30
- 다운로드: [factory00-windows-x64-v0.1.494.zip](../../downloads/factory00-windows-x64-v0.1.494.zip) (170 MB)
- 캡처: [qa-screenshots/v0.1.494/](../../qa-screenshots/v0.1.494/)

---

## 핵심 변경
- **QA-102 B-03 후속 (직전 critic 중대 — 추가만 Undo 가능, 삭제 비대칭)**: 컴포넌트 삭제(Ctrl+Z 복원) 가능화.
- **ComponentEditCommand 일반화** (옛 `AddComponentCommand`): do/undo 페어 액션을 받는 단일 커맨드로 일반화 (DRY). 추가 = do:add/undo:remove, 삭제 = do:remove/undo:동일 인스턴스 복원.
- **6개 Remove 헬퍼 Undo wrap**: ServoAxis/Pneumatic/RotaryPneumatic/RotaryActuator/PhotoSensor/TowerLamp. Remove 는 컴포넌트 인스턴스를 받아 driver unregister + 리스트 제거만 하므로, closure 가 동일 인스턴스 보존 → undo 시 설정값(SensingDistance/ModbusCoil/ContactType 등) 그대로 복원 (데이터 손실 0).
- **TowerLamp Add 도 wrap** (직전 미wrap, 비대칭 해소) + EmissionDriver material lifecycle 처리: 신규 `ReapplyLamp(id) => ApplyEmission(id)` — 삭제 undo(또는 add redo) 시 lamp 재추가 후 material 강제 재생성 (InvalidateLamp 역연산). static ON lamp 도 즉시 복원 (update 루프는 blink 만 처리).
## critic 결과 (CONDITIONAL → 치명 해소)
- **치명 1 → 해소**: ComponentEditCommand.Undo 가 `_suppressAddRebuild` 가드 우회(inline Rebuild) → Undo 도 Refresh() 경유로 통일 (가드 일관 적용 + DRY).
- **중대 (재분류)**: (a) re-add 상호배제 가드 우회 = **비결함** (UndoStack LIFO 순서가 "서보 Remove→회전 Add→서보 undo" 시나리오 차단 — 회전 Add 가 먼저 undo됨). (b) Pneumatic visualizer GC churn = register/unregister 정확한 lifecycle, leak 없음, v0.1.491 Add undo 와 동일 = 중간 등급. (c) TowerLamp null 드라이버 = 방어적 edge(런타임 미발생), 데이터 복원 정상.
- 판정: 치명 0 / 실 중대 0 → PASS.
## 영향 파일
- `Assets/Scripts/Game/Factory00Bootstrap.cs` — ComponentEditCommand 일반화(Undo→Refresh DRY) + 6 Add rename + 6 Remove wrap + TowerLamp Add wrap
- `Assets/Scripts/Outputs/TowerLampEmissionDriver.cs` — public ReapplyLamp(string) 신규
