# 2026-04-07 Smoke Test 1회차 결과 - **이슈**: #11 fix 검증 → 새 이슈 #12 도출 - **소요 시간**: ~1.5시간 (Step 0~4 + 4번 재녹화) - **Context 사용량**: ~370k tokens (orchestrator 누적) ## 진행 단계 | Step | 결과 | 메모 | |------|------|------| | 0 | 환경 확인 | .NET 9 SDK, SUT 존재, DPI 100% | | 1 | 빌드 + `dotnet test` | 60/60 green | | 2 | SUT 수동 실행 | `manual-box.hmeg` 저장 성공 | | 3 | recorder 1회차 (`box-create.yaml`) | target 100% null, 113 step skip | | 3-fix | 이슈 #11 fix (STAThread 등) | merged commit `139fbbc` | | 3-2회차 | recorder (`box-v2.yaml`) | target 여전히 null — attach 실패 (창 제목 mismatch) | | 3-3회차 | recorder PID attach (`box-v3.yaml`) | VS Code 창이 잡힘 (recorder는 시스템 hook이라 모든 창 캡처) | | 3-4회차 | SUT-only 캡처 (`box-v4.yaml`) | ✅ **target에 SUT UIA path 정확히 잡힘** (`MetroWindow`, `CommandBox`, `CB`) | | 4 | player 재생 (cleaned `box-v4-clean.yaml`) | exit 0이지만 Box 미생성 | ## 결정적 발견 ### 성공 1. recorder의 PID attach + UIA `FromPoint`가 정상 동작 2. yaml에 SUT 컨트롤 path 정확히 기록 (`MetroWindow[@AutomationId='root']/CommandPanel/.../CB`) 3. Win32 VK → 문자 번역 (`BOX`, `enter`) 4. player의 `null guard`가 의도대로 동작 — type 스텝을 안전하게 skip 5. Box 명령 자체는 SUT가 받음 (좌표 입력은 일부 진행됨) ### 실패 / 해결할 gap **Gap A — player `UiaPlayerHost.ResolveElement` AutomationId-only 매칭** - `MetroWindow/ItemsControl` 같이 마지막 segment에 AutomationId가 없는 path는 빈 string으로 검색 → first descendant 아무거나 잡음 → 엉뚱한 좌표 클릭 - 결과: 메뉴 클릭이 재질 스타일 팝업을 열거나, ItemsControl의 임의 위치를 클릭 **Gap B — recorder type 스텝에 target 미설정** - `DragCollapser`가 type 스텝을 만들 때 typeRes가 null이면 target을 안 채움 - player의 null guard가 type을 skip → "BOX"·"10" 입력 안 됨 - typeRes가 항상 null인 이유: 키 이벤트는 resolver를 안 부르도록 fix했기 때문 (정당한 이유). 하지만 그러면 type 스텝의 target은 어디서 가져와야 하는가? → 직전 focus_change 이벤트의 element를 사용하는 게 자연스러움 **Gap C (부수)** — recorder가 시스템 전역 hook이라 SUT 외 창의 이벤트도 캡처. 사용자가 alt+tab하면 다른 창 path가 섞임. 필터 필요. **Gap D (부수)** — yaml 한글 인코딩 PowerShell 출력 시 깨짐 (파일 자체는 정상일 가능성) ## Box 명령이 안 그려진 이유 정리 1. type 스텝 2개 skip → "BOX" 미입력 → Box 명령 미발동 2. click 7개는 잘못된 element를 잡고 엉뚱한 좌표 클릭 3. 그래도 일부 좌표가 우연히 SUT 영역과 겹쳐 메뉴 팝업 열림 정도 발생 ## 다음 단계 - 이슈 #12 생성: player full-path resolver + recorder type-step target inheritance - Generator → Evaluator 사이클 - Smoke 2회차 ## Smoke가 잡아낸 것의 가치 샌드박스 60 unit test 전부 green 상태에서도 라이브 실행 시 발견된 **구조적 gap이 4개**. harness design 기사가 강조한 "integration gaps that unit tests miss" 정확한 사례. Smoke test 패턴의 가치 실증.