# 운영 모드 — 네트워크를 얼마나 여느냐에 따라 무엇이 남는가 "폐쇄망 납품"은 **설치** 쪽 이야기다. 런타임 의존성(numpy · opencv · Pillow)은 오프라인 휠로 들어가고(`offline-install.md`), 콘솔·폰트도 전부 동봉이다. 그러나 **탐지의 핵심 신호는 외부 검색 API 에서 온다.** 그래서 배포 전에 아래 셋 중 어느 모드인지 정하고, 운영자에게 그 모드에서 점수가 무엇을 뜻하는지 알려야 한다. | | A. 전체 egress | B. API 호스트만 | C. 완전 폐쇄 | |---|---|---|---| | 허용 대상 | API 호스트 + 검색 결과 페이지·이미지 | `vision.googleapis.com` · `openapi.naver.com` (+ CSE 사용 시 `www.googleapis.com`) | 없음 | | Vision 웹 탐지 (동일·부분·페이지·유사) | O | O | X | | 네이버 이름 검색 | O | O | X | | **검색결과 사본 비교** (결과 페이지를 받아 지문 대조) | O | **X — 조용히 빠진다** | X | | 지문 · 얼굴 · 출처 메타데이터 · 기준 DB 일치 | O | O | O | | 실이미지 20장 기준 한 줄 요약 | `웹 완전일치 사본 N곳 · …` | Vision full 매치가 있으면 같은 `웹 완전일치`, 없으면 `부분·페이지` 로 내려감 | `식별 가능 인물` 또는 `외부 검색 꺼짐` | | 점수가 뜻하는 것 | 설계대로 | 웹 존재 축이 약해져 일부가 한 단계 낮게 나온다 | 인물·기준 DB 이력만 — **신규 이미지는 대부분 low** | ## 모드별 주의 **B. API 호스트만.** 결과 페이지 받기가 막히면 오류 없이 빈 결과로 처리된다 (`store_search_candidates.py` 의 페이지 fetch 는 예외를 삼킨다). 그래서 실패 하한(30)이 걸리지 않고 사유에도 남지 않는다. Vision 이 같은 이미지를 `full` 로 잡으면 점수는 같다. 사본 비교에만 기대던 케이스는 조용히 약해진다 — 이 모드를 택했다면 운영자에게 알린다. **C. 완전 폐쇄 — API 키를 빼거나 비상 차단을 켜고 운영한다.** 키를 둔 채 망만 막으면 매 호출이 **실패**(`External API failed`)가 되고, v5 부터 실패는 검토 하한 30 이라 **큐 전체가 medium 으로 깔린다.** 키가 없거나 비상 차단이 켜진 상태면 `disabled` 로 처리돼 0점이고, 한 줄 요약에 `외부 검색 꺼짐` 이 붙는다(v7 이후). 이 모드에서 low 는 "확인했고 깨끗함"이 아니라 "외부 확인을 하지 않음"이다. **공통.** 일일 한도 도달(`usage limit reached`)은 모드와 무관하게 검토 하한 30 과 ` 미수행` 사유로 드러난다. 네이버 기본 한도 100 = 약 20장/일이므로 하루 처리량에 맞춰 `COPYRIGHTER_NAVER_DAILY_LIMIT` 을 정한다. ## 확인 방법 - 기동 로그 첫 줄: `Provider readiness: Naver search: ready, Google Vision web detection: ready, …` - `/health` → `version` · `scorerVersion` - 콘솔 상단 `외부 검색 tool N/5 활성 · 실패 N` - 모드 C 는 한 줄 요약에 `외부 검색 꺼짐` 이 떠야 정상이다. 대신 `외부 검색 실패` 가 뜨면 키가 남아 있는 것이다.