Smoke 1회차 후속 — player full-path resolver + recorder type-step target + 부수 gap #12
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
배경
2026-04-07 smoke test 1회차 (
docs/history/2026-04-07_smoke-1회차-결과.md) 결과, recorder까지는 정상 동작하나 player 재생 시 Box 명령이 재현되지 않음. 4개의 구조적 gap 발견.해결할 Gap
Gap A (치명) — player
UiaPlayerHost.ResolveElementAutomationId-only 매칭현재 코드 (
src/Recordingtest.Player/UiaPlayerHost.cs:135):→
MetroWindow[@AutomationId='root']/ItemsControl같이 마지막 segment에 AutomationId가 없는 path는 빈 문자열로FindFirstDescendant를 호출 → 첫 descendant 아무거나 잡음 → 엉뚱한 element bounds로 offset 적용 → 잘못된 좌표 클릭.수정 요구:
uia_path를/로 분리해 ancestor chain 전체를 따라 descendClassName,AutomationId,Name모두 활용해 매칭Gap B (치명) — recorder type 스텝 target 미설정
DragCollapser.FlushType()이 typeRes가 null이면 target을 빈 채로 emit. typeRes는 key event resolver skip 정책 때문에 항상 null.수정 요구:
focus_changeRawEvent의FocusedElementPath를 type 스텝의 target에 자동 상속이렇게 하면 player가 type 스텝을 skip하지 않고 정확한 element에 키 입력 보낼 수 있음.
Gap C (부수) — recorder가 SUT 외 창 이벤트 캡처
Win32 hook은 시스템 전역. 사용자 alt+tab 시 다른 창 path 섞임. 옵션:
--filter-window-handle <hwnd>인자로 attach된 SUT의 hwnd를 받아 hook proc에서WindowFromPoint검사Gap D (부수) — yaml 한글 PowerShell 출력 시 인코딩 깨짐
Get-Content로 볼 때 한글이 cp949로 보임. 파일 자체는 UTF-8일 가능성. 검증 필요. ScenarioWriter가 BOM을 쓰는지 확인.사이클
비용 추정
200300k tokensRelated: #2, #6, #7, #11
Smoke 2차 gap fix — Verdict: pass ✅
Generator (
8784fec)4개 Gap 모두 구조적 fix:
UiaPathParser.cs+IUiaPathResolver.cs+UiaPathResolver신규. ancestor chain 따라 descend, id→name→class 우선순위, 누락 중간 wrapper 대비 bounded descendant fallback (depth 4).UiaPlayerHost.ResolveElementrewire, miss 시 null 반환DragCollapser에lastFocusPath/lastMousePath상태 추가.FlushTypefallback chain:typeRes ?? focus ?? mouseSutProcessWindowFilter+WindowFilter.cs. 마우스WindowFromPoint, 키는GetForegroundWindow.Program.cs가app.ProcessId로 wireScenarioWriter가new UTF8Encoding(false)명시. round-trip 테스트가 BOM 부재 + 한글 보존 확인Evaluator DoD
남은 honest gap (non-blocking)
UiaPathResolverbounded descendant fallback은 휴리스틱, smoke 2차에서 튜닝 필요GetForegroundWindowonly — 빠른 alt+tab 전환 시 race 가능성focus_change이벤트는 filter 우회 (UIA 콜백이 이미 SUT-scoped)UiaPlayerHost는GetMainWindow를 root로 사용 — 멀티윈도우 SUT 미지원비용
다음 단계
Smoke 2회차 — 사용자 환경에서 recorder (PID attach) → 짧은 Box 시나리오 → player 재생. 이번엔 click이 정확한 element를 잡고, type 스텝이 focus_change 상속으로 target 채워지고, 외부 창 이벤트가 필터되어 깔끔한 yaml이 나와야 함.
closing.