# Sprint Contract — normalizer **Owner:** Generator **Depends on:** sut-prober (Json 카탈로그) **Issue:** #2 ## Goal SUT 저장 파일(Json 설정 + 모델 파일)의 비결정적 필드를 정규화해 golden-file 비교를 결정적으로 만든다. 규칙은 **프로파일 단위로 버전 관리**되고 단위 테스트를 동반한다. ## Definition of Done - [ ] `Recordingtest.Normalizer` 라이브러리가 `Normalize(input, profile)` API 제공 - [ ] 기본 프로파일 `default` 포함 규칙 최소 5개: 타임스탬프 마스킹, GUID 치환, 절대 경로 → ``/``, 부동소수점 epsilon(1e-6), JSON 객체 키 정렬 - [ ] 프로파일은 `profiles/*.yaml`로 선언, 코드 변경 없이 규칙 추가 가능 - [ ] 각 규칙마다 `tests/Normalizer.Tests/` 아래 before/after 샘플 1쌍 이상 - [ ] 동일 입력으로 두 번 정규화해도 같은 바이트 출력 (idempotent) - [ ] 정규화 로그(sidecar) `normalization.log` 생성 — 어떤 규칙이 몇 번 적용됐는지 기록 - [ ] `json-configs.json` 카탈로그의 "suspected fields" 전수를 default 프로파일로 덮는다 ## Interfaces / contracts - **Inputs:** 파일 경로 + 프로파일 이름 - **Outputs:** 정규화된 바이트 스트림 + sidecar 로그 - **Side effects:** sidecar 로그 쓰기만 ## Out of scope - 바이너리 `.hme`/`.egm` 파서 (별도 contract) - SUT 내부 호출 - 정규화 규칙 자동 학습 ## Evaluation plan 1. `dotnet test tests/Normalizer.Tests` 전부 pass 2. `json-configs.json`의 모든 suspected field가 default 프로파일 규칙에 커버됨 (매핑 테이블 검증) 3. 동일 입력 2회 정규화 바이트 diff 없음 4. 샘플 `Settings.json` 정규화 전/후 비교에서 타임스탬프·경로가 마스킹됨 ## Risks - epsilon 선택이 SUT 실제 정밀도와 충돌 가능 → 구성 가능해야 함. - 컬렉션 순서 정렬이 SUT 의미를 바꿀 수 있음 → 정렬 대상은 명시적 화이트리스트.