# Sprint Contract — recorder **Owner:** Generator **Depends on:** FlaUI 승인, sut-prober(UIA 힌트용 카탈로그) **Issue:** #2 ## Goal 사용자가 EG-BIM Modeler에서 수동 테스트하는 동안 입력(키·마우스·창 이벤트)을 캡처해 element-aware 시나리오 파일을 생성한다. ## Definition of Done - [ ] `Recordingtest.Recorder` 콘솔 실행 시 SUT에 attach하고 입력 캡처 시작 - [ ] 캡처되는 이벤트: 키 다운/업, 마우스 클릭/드래그/휠, 포커스 변경 - [ ] 각 이벤트는 `{ ts, kind, uia_path, offset_norm, raw_coord, value }` 형식으로 기록 - [ ] 3D 뷰포트(SharpDX surface) 클릭 시 uia_path는 호스팅 엘리먼트, `offset_norm`은 `[0..1]` 정규화 좌표 - [ ] 출력: `scenarios/.yaml` 스키마 준수 (`scenario-author` 규격 일치) - [ ] 비밀번호/토큰 마스킹 규칙 1개 이상 (예: focus된 element가 `PasswordBox`이면 `value`를 ``) - [ ] 캡처 중 SUT 성능에 눈에 띄는 영향 없음 (60 FPS 유지; 경고만) - [ ] 캡처 종료 시 요약(이벤트 수, 소요 시간, uia_path 미결 건수) ## Interfaces - **Inputs:** `--output scenarios/.yaml`, `--attach ` - **Outputs:** 시나리오 yaml - **Side effects:** 전역 Win32 hook 등록/해제 ## Out of scope - 리플레이 (player의 몫) - 3D 엔진 상태 캡처 (engine-bridge 사용 예정) - 자동 이름 추정 / 자연어 변환 (scenario-author) ## Evaluation plan 1. SUT를 수동 실행 후 recorder attach → Box 명령 버튼 클릭 → Box 생성 드래그 → 저장 2. 출력 yaml 파싱 + 스키마 검증 3. 클릭 이벤트의 `uia_path`가 `Button[@Name*='Box']` 형태 포함 확인 4. 드래그 이벤트의 `offset_norm`이 `[0..1]` 범위 확인 5. `PasswordBox`에 더미 입력 → `` 기록 확인 6. 종료 후 hook 해제 확인 (재실행 시 double-hook 안 남음) ## Risks - IME(한글) 조합 키 이벤트 손실 → 클립보드 우회 필요 가능 - 해상도/DPI 변경 시 `raw_coord`는 유효성 상실 → `offset_norm` 우선 사용 - Win32 hook은 UI thread 블록 가능 → 별도 스레드 + 큐 필수