# Sprint Contract — player **Owner:** Generator **Depends on:** recorder 스키마 확정 **Issue:** #2 ## Goal recorder가 생성한 시나리오 yaml을 SUT에 재생해 결과 저장 파일을 생성한다. 타이밍은 고정 sleep 금지, UIA/이벤트 기반 동기화. ## Definition of Done - [ ] `Recordingtest.Player` 콘솔이 `--scenario [--output-dir ]` 받음 - [ ] 각 step 재생 전 `wait_for`(uia 이벤트/엘리먼트 property) 대기 구현 - [ ] `target.uia_path`로 엘리먼트 재탐색 후 `offset_norm`으로 좌표 계산해 입력 전달 - [ ] 재생 중 예외 발생 시 시나리오 스텝 index + 엘리먼트 탐색 실패 이유를 아티팩트로 기록 - [ ] 체크포인트 step에서 현재 저장 파일을 `/checkpoint-.*`로 복사 - [ ] 재생 완료 시 exit code 0, 실패 시 non-zero + 아티팩트 경로 출력 - [ ] 동일 시나리오 10회 재생 시 9회 이상 성공 (flaky 허용 상한) ## Interfaces - **Inputs:** 시나리오 yaml, 아티팩트 출력 디렉터리 - **Outputs:** checkpoint 저장 파일, 실패 아티팩트(스크린샷, UIA 덤프, 로그) - **Side effects:** SUT 프로세스 실행/종료 ## Out of scope - 정규화 (normalizer의 몫) - diff (diff-reporter의 몫) - 리포트 집계 (test-runner의 몫) ## Evaluation plan 1. recorder로 만든 간단 시나리오(Box 생성 저장)를 10회 재생 → 9회 이상 완료 파일 생성 2. 의도적으로 잘못된 `uia_path`를 넣어 실패 → 아티팩트에 탐색 실패 이유 기록 확인 3. 체크포인트 2개 시나리오 재생 → 각 checkpoint 파일 존재 확인 4. 고정 sleep 호출 grep으로 0건 확인 ## Risks - plugin 로드 지연 → 첫 step 전 "plugin ready" 신호 필요 - 시작 상태 초기화 (임시 프로젝트 파일 삭제) 미비 시 누적 오염 - 재생 중 모달 대화상자 출현 시 대응 정책 필요