Skip to content

frames_from_video 섀도 → 강제 전환 (베타 표본 30건 도달 시 판단) #135

Description

@seizeh

배경

#134 에서 펫 신원 등록의 기준 프레임↔영상 동일 출처 게이트(frames_from_video)를 추가하되, challenge 를 AI 오탐으로 제거한 전례에 따라 측정 없이 하드 리젝을 켜지 않고 섀도 모드로 배포했다(2026-07-29, enroll-pet-identity v23, FRAMES_FROM_VIDEO_ENFORCE=false).

오탐 소지: 클라 프레임 추출 시각이 Gemini 의 1fps 영상 샘플링 순간과 어긋나면 정상 사용자의 영상도 false 판정이 나올 수 있다(구조적 요인은 seizeh/pmdartae38c22에서 정수 초 격자 1/2/3/4s 로 제거 — 베타 측정 중 추출 격자 변경 금지, 측정 오염). 정상 사용자는 프레임을 자기 영상에서 뽑으므로 이 게이트의 거절은 대부분 오탐이고, 거절 비용이 크다(신원 등록 실패 → 사진 게이트 게시글 작성 전면 차단, 재심 경로 없음).

측정 — 표본은 개인 사용자 베타에서 나온다

날짜 기준이 아니라 이벤트 기준: purpose='pet_identity' AND result='pass' 행(성공 등록당 1행, v23~) 30건 도달 시 판단한다. 30건이면 오탐률이 0%대인지 수십%대인지 가르는 데 충분하다. 유입은 개인 사용자 클로즈드 베타(launch-checklist.md §6 — 업체 파일럿에서는 이 표본이 안 나옴).

select
  count(*) filter (where fail_reason = 'frames_not_from_video_shadow') as false_verdicts,
  count(*) as total,
  round(100.0 * count(*) filter (where fail_reason = 'frames_not_from_video_shadow')
        / nullif(count(*), 0), 1) as false_pct
from photo_verifications
where purpose = 'pet_identity' and result = 'pass'
  and created_at >= '2026-07-29';

_shadow 접미사는 강제 전환 후의 실제 거절 행(result='fail', fail_reason='frames_not_from_video')과의 영구 구분자다.

수용 리스크 (결정 기록)

클로즈드 베타 동안 섀도 윈도우 = 실제 노출 창이다 — 프레임 바꿔치기 구멍이 열린 채 실사용자가 돌아간다. 테스터가 신원 확인된 범위(섭외 업체·지인)라 노출 대비 측정 가치가 크다고 판단하고 수용한다(2026-07-29). 오픈 베타로 넓히기 전에 enforce 전환 여부 재검토 필수.

전환 절차

  1. 표본 30건 도달 시 위 쿼리로 오탐률 확인.
  2. 오탐률이 수용 가능하면(false 행의 ai_reason 을 직접 읽고 실제 오탐인지 표본 검토) FRAMES_FROM_VIDEO_ENFORCE=true + 재배포.
  3. 전환 직전에 게이트 로직을 순수 함수로 추출하면서 Deno 테스트 추가(false → 거절 회귀 테스트). Edge Function 층은 현재 자동 테스트 0건.
  4. 오탐률이 높으면: false 행 ai_reason 으로 원인 분류 후 프롬프트/추출 방식 조정 → 섀도 재측정.

백업 경로(일정 리스크 대비): 스토어 심사·테스터 유입이 늦어 발표 2주 전까지 표본이 안 모이면, 단말 1종 자가 표본 n=30 으로 중간 검증표를 먼저 만든다(베타 데이터와 배타적 선택 아님).

관련: #134, #136, seizeh/pmdart#212(거절 사유 한글 메시지 — 전환 시 자동 활성화), launch-checklist.md §6·§7

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions