# 2026-07-24 구현 체크리스트 (전체 개선 + 신규 기능) > 기준: `docs/reviews/2026-07-24-project-review.md`. > 최종 검증: `pytest tests/rights_filter tests/operator_gui` → **457 passed** (착수 전 377 passed / 2 failed). > 실서버 스모크(포트 9561): 인증·시드·중복인덱스·일괄판정·프리셋·내보내기·백업·복구 CLI 실동작 확인. ## 배치 0 — 저장소 위생 ✅ - [x] 루트 `Microsoft/` 삭제 + `.gitignore` 에 `Microsoft/` 추가 - [x] 루트 `tmp_*` 4건 삭제 (git 미추적 확인 후) - [x] 저장소 전체 stale `__pycache__` 삭제 (옛 경로 `Desktop\complete\` 내장분) - [x] `data/logs/edge-profile-static/` 삭제 (612엔트리·27MB) ## 배치 1 — HIGH ✅ - [x] H1 `face_person_detection.py` cv2 호환 가드(경고 1회) + `batch_analyzer` 제출물단위 예외 격리 + **환경 정리**(opencv-python 5.0.0 제거 → 핀 4.13.0.92 복구) - [x] H2 `risk_scoring.py` `match=="search_image"` 명시적 0점 — 왕복 시 0→45 인플레 차단 - [x] H3 `store_serialization.py` SEARCH_SKIPPED/ENRICHMENT_FAILURE 를 dedup 시그니처에서 제외 - [x] H4 `store_operations.py` rerun 예외 격리 + 'queued' 마커 finally 정리 + `lastRerunDiff.error` 노출 - [x] H5 `external_policy.py` 날짜 윈도우 리셋 + Lock (SearchApiPolicy 패턴 미러) - [x] H6 `image_store.py` 매니페스트 행 단위 예외 격리 + width/height 안전 변환 - [x] H7 `app.js`/`index.html`/`styles.css` 인증 게이트(401→토큰 입력→헤더 재시도→세션 쿠키) ## 배치 2 — 큐/스토어 정합성 ✅ - [x] `sqlite_store.py` 큐 전역 id 충돌 시 스킵 + 1회성 감사 이벤트(판정 소실·증거 오염 차단) - [x] Vision **실패**만 provider 귀속(`provider: google`) + 레거시 매처 확장. **스킵은 의도적으로 미귀속** — 정책 거부는 '실패'가 아니라 '미실행' - [x] `_search_coverage` 실패-만 제출물을 커버리지에서 제외 ## 배치 3 — enrichment/operations ✅ - [x] Vision 정책거부 시 사용량 오계상 + **허위 생체정보 외부전송 감사기록** 제거 - [x] 재분석 FACE_PERSON +35 중첩 → 스코어러 단일 버킷 - [x] `lastFailure` 를 실제 실패 항목에서 선택 (manual_search / collect 2곳) - [x] 전부 스킵 시 기존 수집 후보 보존(무조건 삭제 제거) + provider 상태는 영속 - [x] 수집 후보 카운트 인플레 → id 기준 dedup ## 배치 4 — HTTP/보안/부팅 ✅ - [x] 비-객체/비-UTF8 JSON 바디 → 400 (핸들러 AttributeError 크래시 제거) - [x] 비ASCII Authorization/쿠키 → bytes 비교로 401 (무응답 종료 제거) - [x] `_file()` OSError → 404 - [x] `env_file.py` 비인용 값의 인라인 주석 절단(인용 값은 원문 보존) - [x] `__main__.py` stdout 라인 버퍼링 — 리다이렉트 기동 시 보안 경고가 즉시 로그에 남음 ## 배치 5 — analysis ✅ - [x] EXIF Orientation 정규화 — 외부 파생물·얼굴크롭·pHash·PIL 폴백 디코드 (파생물 크기를 정규화 이미지 기준으로 재계산). cv2 기본 디코드는 이미 적용됨을 실측 확인 - [x] aHash 저엔트로피 근접매칭 차단 (동일 해시는 1.0 유지 — 동일 이미지 매칭 보존) - [x] 프로모터 마커 스캔에서 URL 제외 (title/description 한정) ## 배치 6 — integrations ✅ - [x] Vision 응답 매핑을 예외 경계 안으로 + bestGuessLabels 비-dict 항목 무시 - [x] `http_json.py` HTTPError 본문 4KiB 캡 - [x] `_probe_connect` 프록시 적용 대상이면 프로브 생략 - [x] `search_policy.py` `try_reserve`/`release` 예약형 회계 (쿼터 의미 보존: fetch 실패=환불, 매핑 실패=소비) ## 배치 7 — domain/admin/governance ✅ - [x] LLM_SUMMARY 거버넌스 게이트를 실제 저장 경로에 적용(미근거 요약 폐기) - [x] admin 4개 모듈에 '운영 서버 미연결' docstring 경고 - [x] 정상 스킵을 `skipped` 그룹으로 분리 (failures 오분류 제거) - [x] `register_manual_entry` 미지원 필드 조용한 폐기 → ValueError - [x] 반복 반려 시 rejected_image 엔트리 upsert (무한 누적 제거) ## 배치 8 — 프론트엔드 ✅ - [x] 케이스 전환 시 결정 메모/오류/수동쿼리 초기화 (`resetCaseScopedInputs`) - [x] 추천 쿼리 요약 — 실근거만 집계, 스킵/무결과 구분 표기 - [x] '주의 후보 보기' → 등록 탭 + watchlist 필터 - [x] 케이스 없음 시 `evidence-next-actions` 초기화 - [x] hashchange `#corrections` 진입 시 지식 탭 실제 전환 - [x] 수동검색 완료 메시지에 대상 케이스 id 명시 ## 배치 9 — 문서 ✅ - [x] README `python -m rights_filter.server` PYTHONPATH 안내로 정정 - [x] GUI 설계 스펙에 일괄 판정 제약 해제 **개정 이력** 명시 ## 배치 10 — 신규 기능 ✅ - [x] **F1 키보드 연속 심사** — J/K 이동, A/H 판정 후 다음 미심사 자동 이동, R 메모 포커스, N 다음 미심사, ? 도움말, 진행 표시. 입력 중에는 비활성 - [x] **F2 일괄 판정 + 메모 프리셋** — `POST /api/submissions/decision-batch`(케이스별 트랜잭션·감사·부분실패 보고, 최대 200건, 고위험 확인, 반려 메모 필수) / `GET·POST /api/decision-memo-presets` - [x] **F3 제출물 지문 중복·선례 인덱스** — 시드 시 지문 백필(멱등), exact+pHash≥0.97 클러스터, 큐 배지·그룹 일괄선택, 선례 판정·**판정 불일치** 표시 - [x] **F4 판정 내보내기** — `GET /api/decisions/export`(internal / applicant 화이트리스트 분리, CSV+BOM) - [x] **F5 온라인 백업·복구** — `POST /api/admin/backup`(sqlite backup API, WAL 안전) + 보존 로테이션 + `--restore` 오프라인 CLI(복구 전 원본 보존) ## 의도적 비구현 (사유) - #7 쿠키 Secure — localhost HTTP 에서 인증 붕괴, HTTPS 전제 필요 - #8 rate limit — 로컬 단일 운영자 콘솔, 인증으로 대체 커버 - #20 `ScoreResult.reasons` tuple — 다수 테스트 `== []` 단언과 충돌 - 운영자 역할분리 / 통계 대시보드 — 차점 기능, 다음 사이클 - google_search 수동검색 허용 — 2026-06-11 승인된 설계 결정(유지) - aHash → DCT pHash 교체 — 저장된 지문 무효화 + 임계 재보정 필요. 근접매칭 가드로 완화, 별도 마이그레이션 과제 - `#12`/M4 락 협소화, M7 스키마 coerce, M9 이관 검증, M8 id 마이그레이션 — 7/11 연기 사유 유효