POSA_Copyrighter/docs/reviews/2026-07-24-implementation-checklist.md
changukyu 8b5b3f5cf9 docs: 2026-07-24 review report, implementation checklist, spec revision
- Add the 2026-07-24 multi-agent review report (43 confirmed findings, runtime
  smoke, feature proposals with judge scores) and the implementation checklist
  tracking what was done vs. deliberately deferred (with reasons).
- Record the batch-decision decision: the v1 "no bulk approve/reject" GUI-spec
  restriction is revised, not silently overridden, and lists the guardrails that
  made lifting it acceptable.
- Fix the README `python -m rights_filter.server` invocation (needs
  PYTHONPATH=src) and start a docs/INDEX.md continuity log.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E6GD9gxUtfUiVB3JHejGpU
2026-07-24 14:18:27 +09:00

6.4 KiB

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 — 저장소 위생 ✅

  • 루트 Microsoft/ 삭제 + .gitignore 에 Microsoft/ 추가
  • 루트 tmp_* 4건 삭제 (git 미추적 확인 후)
  • 저장소 전체 stale __pycache__ 삭제 (옛 경로 Desktop\complete\ 내장분)
  • data/logs/edge-profile-static/ 삭제 (612엔트리·27MB)

배치 1 — HIGH ✅

  • H1 face_person_detection.py cv2 호환 가드(경고 1회) + batch_analyzer 제출물단위 예외 격리 + 환경 정리(opencv-python 5.0.0 제거 → 핀 4.13.0.92 복구)
  • H2 risk_scoring.py match=="search_image" 명시적 0점 — 왕복 시 0→45 인플레 차단
  • H3 store_serialization.py SEARCH_SKIPPED/ENRICHMENT_FAILURE 를 dedup 시그니처에서 제외
  • H4 store_operations.py rerun 예외 격리 + 'queued' 마커 finally 정리 + lastRerunDiff.error 노출
  • H5 external_policy.py 날짜 윈도우 리셋 + Lock (SearchApiPolicy 패턴 미러)
  • H6 image_store.py 매니페스트 행 단위 예외 격리 + width/height 안전 변환
  • H7 app.js/index.html/styles.css 인증 게이트(401→토큰 입력→헤더 재시도→세션 쿠키)

배치 2 — 큐/스토어 정합성 ✅

  • sqlite_store.py 큐 전역 id 충돌 시 스킵 + 1회성 감사 이벤트(판정 소실·증거 오염 차단)
  • Vision 실패만 provider 귀속(provider: google) + 레거시 매처 확장. 스킵은 의도적으로 미귀속 — 정책 거부는 '실패'가 아니라 '미실행'
  • _search_coverage 실패-만 제출물을 커버리지에서 제외

배치 3 — enrichment/operations ✅

  • Vision 정책거부 시 사용량 오계상 + 허위 생체정보 외부전송 감사기록 제거
  • 재분석 FACE_PERSON +35 중첩 → 스코어러 단일 버킷
  • lastFailure 를 실제 실패 항목에서 선택 (manual_search / collect 2곳)
  • 전부 스킵 시 기존 수집 후보 보존(무조건 삭제 제거) + provider 상태는 영속
  • 수집 후보 카운트 인플레 → id 기준 dedup

배치 4 — HTTP/보안/부팅 ✅

  • 비-객체/비-UTF8 JSON 바디 → 400 (핸들러 AttributeError 크래시 제거)
  • 비ASCII Authorization/쿠키 → bytes 비교로 401 (무응답 종료 제거)
  • _file() OSError → 404
  • env_file.py 비인용 값의 인라인 주석 절단(인용 값은 원문 보존)
  • __main__.py stdout 라인 버퍼링 — 리다이렉트 기동 시 보안 경고가 즉시 로그에 남음

배치 5 — analysis ✅

  • EXIF Orientation 정규화 — 외부 파생물·얼굴크롭·pHash·PIL 폴백 디코드 (파생물 크기를 정규화 이미지 기준으로 재계산). cv2 기본 디코드는 이미 적용됨을 실측 확인
  • aHash 저엔트로피 근접매칭 차단 (동일 해시는 1.0 유지 — 동일 이미지 매칭 보존)
  • 프로모터 마커 스캔에서 URL 제외 (title/description 한정)

배치 6 — integrations ✅

  • Vision 응답 매핑을 예외 경계 안으로 + bestGuessLabels 비-dict 항목 무시
  • http_json.py HTTPError 본문 4KiB 캡
  • _probe_connect 프록시 적용 대상이면 프로브 생략
  • search_policy.py try_reserve/release 예약형 회계 (쿼터 의미 보존: fetch 실패=환불, 매핑 실패=소비)

배치 7 — domain/admin/governance ✅

  • LLM_SUMMARY 거버넌스 게이트를 실제 저장 경로에 적용(미근거 요약 폐기)
  • admin 4개 모듈에 '운영 서버 미연결' docstring 경고
  • 정상 스킵을 skipped 그룹으로 분리 (failures 오분류 제거)
  • register_manual_entry 미지원 필드 조용한 폐기 → ValueError
  • 반복 반려 시 rejected_image 엔트리 upsert (무한 누적 제거)

배치 8 — 프론트엔드 ✅

  • 케이스 전환 시 결정 메모/오류/수동쿼리 초기화 (resetCaseScopedInputs)
  • 추천 쿼리 요약 — 실근거만 집계, 스킵/무결과 구분 표기
  • '주의 후보 보기' → 등록 탭 + watchlist 필터
  • 케이스 없음 시 evidence-next-actions 초기화
  • hashchange #corrections 진입 시 지식 탭 실제 전환
  • 수동검색 완료 메시지에 대상 케이스 id 명시

배치 9 — 문서 ✅

  • README python -m rights_filter.server PYTHONPATH 안내로 정정
  • GUI 설계 스펙에 일괄 판정 제약 해제 개정 이력 명시

배치 10 — 신규 기능 ✅

  • F1 키보드 연속 심사 — J/K 이동, A/H 판정 후 다음 미심사 자동 이동, R 메모 포커스, N 다음 미심사, ? 도움말, 진행 표시. 입력 중에는 비활성
  • F2 일괄 판정 + 메모 프리셋 — POST /api/submissions/decision-batch(케이스별 트랜잭션·감사·부분실패 보고, 최대 200건, 고위험 확인, 반려 메모 필수) / GET·POST /api/decision-memo-presets
  • F3 제출물 지문 중복·선례 인덱스 — 시드 시 지문 백필(멱등), exact+pHash≥0.97 클러스터, 큐 배지·그룹 일괄선택, 선례 판정·판정 불일치 표시
  • F4 판정 내보내기 — GET /api/decisions/export(internal / applicant 화이트리스트 분리, CSV+BOM)
  • 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 연기 사유 유효