평가
모두 합성 데이터 기준입니다. 규칙 문서(B01)·합성 예약·엔진·검사기·기대값을 같은 도구(Claude Code)로 만들었고, 기대값(경계 사례 표·규칙 해석)은 AI 작성·사람 검수 전입니다. 두 구현이 같은 문서를 같은 쪽으로 잘못 읽은 해석 실수(접수 마감 포함, 점심 맞닿음)는 여기 숫자로 잡히지 않습니다. 못 미쳐도 그대로 싣습니다.
한눈에
| 규칙 위반(따로 짠 검사기) | 0건 | 앱이 낸 칸 335,936개 · 기준 시각 2,215개(9/21(월) 10:00 ~ 10/6(화) 19:00, 10분 간격) × 안건 6 |
|---|---|---|
| 심은 경계 사례 | 32 / 32 | 의도대로 판정된 사례 / 사례(판정은 앱 엔진) |
| 결정성 | 0건 | 결과가 달라진 쌍 / 90쌍(기준 시각 5 × 안건 6 × 변형 3) |
| 별도 구현 대조 | 3,580 / 3,580행 | 앱 코드를 쓰지 않는 파이썬 계산기(data/scripts/slots_expected.py)가 기준 시각 5 × 안건 6의 모든 시작 후보를 판정한 행(휴진일은 날짜당 1행)과 판정·떨어진 까닭까지 같은 행. 빈 칸 779개 중 잘못 냄 0 · 빠뜨림 0. 화면이 아니라 시험(src/core/expected.test.ts)이 npm run verify마다 다시 확인합니다. 같은 AI가 같은 문서를 해석했으므로 해석 실수(접수 마감 포함, 점심 맞닿기, 리드 올림)는 못 잡습니다. |
| 사람 손 검수 | 미실시 | 사람이 달력과 예약표로 확인한 행 0 / 20(사람 몫, 목표가 아님) |
규칙 위반 — 규칙별
기준 시각을 9/21(월) 10:00 ~ 10/6(화) 19:00에서 10분마다 바꿔 가며, 앱이 낸 모든 칸을 엔진의 판정 함수를 쓰지 않고 따로 짠 검사기(src/demo/violations.ts)로 봅니다. 가예약 3건(첫 상담 9/21(월) 14:00, 두피 주사 9/21(월) 11:00, 모발이식 수술(하루) 9/28(월) 10:00, 9/21 10:00에 만듦)을 넣었습니다. 분모가 0이면 위반 0은 의미가 없습니다.
| 규칙 | 어긴 칸 / 검사한 칸 |
|---|---|
| 휴진일·공휴일 미확인 날에 낸 칸 | 0 / 335,936 |
| 점심과 겹침 | 0 / 314,386 |
| 접수 마감 뒤 시작 | 0 / 335,936 |
| 진료 종료 넘김(준비 시간 포함) | 0 / 335,936 |
| 수술 없는 요일(토요일) 수술 | 0 / 21,550 |
| 다음 날(D+1) 휴진인 수술 | 0 / 21,550 |
| D+7 내원 창에 진료일 없는 수술 | 0 / 21,550 |
| 하루 최대 초과 | 0 / 72,416 |
| 사람·방 수 초과(기존 예약 + 가예약 + 이 칸) | 0 / 335,936 |
| 살아 있는 가예약과 같은 칸 | 0 / 335,936 |
| 첫 예약 가능 시각 전 | 0 / 335,936 |
심은 경계 사례(PRD 7절)
| 칸 | 안건 | 기대 | 앱 판정 | 결과 |
|---|---|---|---|---|
| 9/22(화) 12:00 점심과 맞닿기만 함 · 기준 09-21 10:00 | 첫 상담 | 가능 | 가능 | 통과 |
| 9/22(화) 12:30 점심 겹침 · 기준 09-21 10:00 | 첫 상담 | 불가(점심과 겹침) | 불가(점심과 겹침) | 통과 |
| 9/22(화) 12:30 점심 전에 끝나는 주사 · 기준 09-21 10:00 | 두피 주사 | 가능 | 가능 | 통과 |
| 9/22(화) 14:00 점심 직후 · 기준 09-21 10:00 | 첫 상담 | 가능 | 가능 | 통과 |
| 9/22(화) 18:00 평일 마지막 60분 칸 · 기준 09-21 10:00 | 첫 상담 | 가능 | 가능 | 통과 |
| 9/22(화) 18:30 진료 종료 넘김 · 기준 09-21 10:00 | 첫 상담 | 불가(진료 종료 넘김) | 불가(진료 종료 넘김) | 통과 |
| 9/22(화) 18:30 접수 마감 포함 · 기준 09-21 10:00 | 두피 주사 | 가능 | 가능 | 통과 |
| 10/1(목) 20:00 목요일 야간 자원 안 · 기준 09-21 10:00 | 첫 상담 | 가능 | 가능 | 통과 |
| 10/1(목) 20:30 목요일 진료 종료 넘김 · 기준 09-21 10:00 | 첫 상담 | 불가(진료 종료 넘김) | 불가(진료 종료 넘김) | 통과 |
| 10/1(목) 20:30 목요일 접수 마감 포함 · 기준 09-21 10:00 | 두피 주사 | 가능 | 가능 | 통과 |
| 10/10(토) 14:00 토요일 마지막 60분 칸 · 기준 10-06 10:00 | 첫 상담 | 가능 | 가능 | 통과 |
| 10/10(토) 14:30 토요일 진료 종료 넘김 · 기준 10-06 10:00 | 첫 상담 | 불가(진료 종료 넘김) | 불가(진료 종료 넘김) | 통과 |
| 10/10(토) 14:30 토요일 접수 마감 포함 · 기준 10-06 10:00 | 두피 주사 | 가능 | 가능 | 통과 |
| 10/10(토) 10:00 평범한 토요일 수술 · 기준 10-06 10:00 | 모발이식 수술(하루) | 불가(수술 없는 날) | 불가(수술 없는 날, 다음 날 휴진, 첫 예약 가능 시각 전, 진료 종료 넘김, 사람·방 없음) | 통과 |
| 10/2(금) 10:00 다음 날 10/3 개천절 · 기준 09-21 10:00 | 모발이식 수술(하루) | 불가(다음 날 휴진) | 불가(다음 날 휴진, 사람·방 없음) | 통과 |
| 10/8(목) 10:00 다음 날 10/9 한글날 · 기준 09-21 10:00 | 모발이식 수술(하루) | 불가(다음 날 휴진) | 불가(다음 날 휴진, 사람·방 없음) | 통과 |
| 10/15(목) 10:00 다음 날 10/16 임시 휴진 · 기준 10-06 10:00 | 모발이식 수술(하루) | 불가(다음 날 휴진) | 불가(다음 날 휴진, 사람·방 없음) | 통과 |
| 10/1(목) 10:00 다음 날 10/2 진료 · 기준 09-21 10:00 | 모발이식 수술(하루) | 가능 | 가능 | 통과 |
| 10/23(금) 10:00 다음 날 토요일 진료 · 기준 10-06 10:00 | 모발이식 수술(하루) | 가능 | 가능 | 통과 |
| 9/28(월) 10:00 수술실 정리 18:00~18:30이 진료 종료 안 · 기준 09-21 10:00 | 모발이식 수술(하루) | 가능 | 가능 | 통과 |
| 10/16(금) 11:00 10/16 임시 휴진 · 기준 10-06 10:00 | 첫 상담 | 불가(휴진) | 불가(휴진) | 통과 |
| 10/16(금) 11:00 10/16 임시 휴진 · 기준 10-06 10:00 | 의료진 재진 상담 | 불가(휴진) | 불가(휴진) | 통과 |
| 10/16(금) 11:00 10/16 임시 휴진 · 기준 10-06 10:00 | 두피 주사 | 불가(휴진) | 불가(휴진) | 통과 |
| 10/16(금) 11:00 10/16 임시 휴진 · 기준 10-06 10:00 | 두피 관리 | 불가(휴진) | 불가(휴진) | 통과 |
| 10/16(금) 10:00 10/16 임시 휴진 · 기준 10-06 10:00 | 모발이식 수술(하루) | 불가(휴진) | 불가(휴진) | 통과 |
| 10/16(금) 10:00 10/16 임시 휴진 · 기준 10-06 10:00 | 모발이식 수술(반나절) | 불가(휴진) | 불가(휴진) | 통과 |
| 1/4(화) 11:00 공휴일 확인 기간 밖(2028-01-04) · 기준 09-21 10:00 | 첫 상담 | 불가(공휴일 미확인 — 계산하지 않음) | 불가(공휴일 미확인 — 계산하지 않음) | 통과 |
| 9/30(수) 첫 상담 — 의료진 1명 휴무 + 합성 수술 | 예약 꽉 참 | 예약 꽉 참 | 통과 | |
| 주사 첫 예약 가능 시각 — 기준 09-21 10:00 | 9/21(월) 11:00 | 9/21(월) 11:00 | 통과 | |
| 주사 첫 예약 가능 시각 — 기준 09-21 11:00 | 9/21(월) 12:00 | 9/21(월) 12:00 | 통과 | |
| 주사 첫 예약 가능 시각 — 기준 09-23 12:50 | 9/23(수) 14:00 | 9/23(수) 14:00 | 통과 | |
| 주사 첫 예약 가능 시각 — 기준 10-01 20:10 | 10/2(금) 10:00 | 10/2(금) 10:00 | 통과 | |
통화 중 조작 수(설계상 값)
버튼을 누르기 시작해 첫 빈 시간이 보일 때까지의 누름 수입니다. 화면 상태 함수(callReducer)로 모든 길을 실제로 눌러 센 값이고, 사람이 전화를 받으며 잰 값이 아닙니다.
| 길 | 찾는 안건 | 누름 |
|---|---|---|
| 상담 → 예, 처음 | 첫 상담 | 2번 |
| 상담 → 아니오, 재진 | 의료진 재진 상담 | 2번 |
| 시술 → 모발이식 수술 → 예 | 모발이식 수술(하루) | 3번 |
| 시술 → 모발이식 수술 → 아니오 | 첫 상담 (첫 상담으로 바뀜) | 3번 |
| 시술 → 두피 주사 → 처음(진찰 전) | 첫 상담 (첫 상담으로 바뀜) | 3번 |
| 시술 → 두피 주사 → 시작·다음 회차 | 두피 주사 | 3번 |
| 시술 → 두피 주사 → 회차 옮기기 | 두피 주사 | 4번 |
| 시술 → 두피 관리 → 예, 처음 | 첫 상담 (첫 상담으로 바뀜) | 3번 |
| 시술 → 두피 관리 → 아니오 | 두피 관리 | 3번 |
| 재시술 → 예, 여기서 | 의료진 재진 상담 | 2번 |
| 재시술 → 다른 병원 | 첫 상담 (첫 상담으로 바뀜) | 2번 |
수술 크기를 반나절로 바꾸면 +1, 거르개 하나 +1, 칸을 눌러 문장을 보면 +1, 가예약 +1.
기준 시각 9/21(월) 10:00의 첫 빈 시간
| 첫 상담 | 9/21(월) 11:00 · 9/21(월) 11:30 · 9/21(월) 14:00 · 9/21(월) 17:30 · 9/22(화) 12:00 | 38칸 |
|---|---|---|
| 의료진 재진 상담 | 9/21(월) 11:00 · 9/21(월) 11:30 · 9/21(월) 12:00 · 9/21(월) 14:00 · 9/21(월) 14:30 | 57칸 |
| 두피 주사 | 9/21(월) 11:00 · 9/21(월) 11:30 · 9/21(월) 12:00 · 9/21(월) 14:00 · 9/21(월) 14:30 | 50칸 |
| 두피 관리 | 9/21(월) 15:00 · 9/21(월) 15:30 · 9/21(월) 16:00 · 9/21(월) 16:30 · 9/21(월) 17:00 | 31칸 |
| 모발이식 수술(하루) | 9/28(월) 10:00 · 10/1(목) 10:00 · 10/12(월) 10:00 · 10/14(수) 10:00 | 4칸 |
| 모발이식 수술(반나절) | 9/28(월) 10:00 · 9/29(화) 14:30 · 10/1(목) 10:00 · 10/7(수) 10:00 · 10/12(월) 10:00 | 6칸 |
재지 않은 것
- 변이 검사(규칙을 일부러 틀리게 바꾸기)는 저장소 밖 스크립트로 2026-09-30에 한 번 돌렸습니다: 42개 중 42개를 시험이 잡음(시간대 결함 하나는 UTC 실행에서만 잡힘). 빌드마다 다시 돌지는 않습니다.
- 375×667에서 첫 칩 줄이 스크롤 없이 보이는 것은 상담 → 예, 처음(657px)뿐입니다. 재시술·주사·수술은 안내 줄과 하위 칩 때문에 첫 칩 줄이 화면 아래(767~856px)로 내려갑니다(헤드리스 크롬으로 잼).
- 도입 뒤 볼 것: 통화 한 건 시간이 줄었는지, 잘못 안내해 다시 건 전화 수, 가예약이 실제 예약으로 이어진 비율.