diff --git a/docs/INDEX.md b/docs/INDEX.md index cd12960..776d146 100644 --- a/docs/INDEX.md +++ b/docs/INDEX.md @@ -1,5 +1,6 @@ # Project INDEX +- 2026-09-23 · **심사 가이드 다이어그램** — `docs/diagrams/review-guide.html` (archify workflow v2, 5번째 다이어그램). 문서의 6단계를 3레인(읽기·근거 확인 / 판정 / 기준 DB 에 남는 것)으로: 한 줄 요약 → 점수 구성 → 증거 열기 → 근거 표시 → 판정 → 다음 미심사, 분기는 미수행 하한(→ 보류 후 재분석)과 판정 뒤 DB(주의 후보 자동 · 클리어 기준 등록 수동). 첫 안은 4레인·3항목 카드로 1440×900 에서 127px 넘쳐 레인 병합·제목 한 줄·카드 2항목으로 압축(노드 폭 148 로 종횡비 1.52 충족). validate 9/9 showcase · visual-check 4뷰포트 containment pass · manifest 5종. rebuild 스크립트·manifest 갱신기에 등록, PROJECT_MAP 표 추가. - 2026-09-23 · **심사 가이드 v2** — `docs/operations/review-guide.md`. 기존 `operator-review-workflow` 다이어그램은 시스템 흐름(폴더→분석→채점)이라 "어떻게 심사하고 무엇을 보는가"에 답하지 못했다. 운영자 관점으로 다시 썼다: 한 건 심사 6단계(한 줄 읽기 → 점수 구성 → 동일→부분→페이지 순 증거 → 사용/무관/오탐 표시 → A/H/R → N), 한 줄 요약의 신호 9종과 판정 무게(라벨은 권리와 무관, 미수행은 안전 아님), 승인/보류/반려 기준과 **뒤에 일어나는 일**(보류·반려 → 주의 후보, 승인은 DB 에 안 남으니 `클리어 기준 등록` 별도), 반려 사유 프리셋, 키보드, 일괄 처리, 헷갈리는 것 5개, 종료 루틴(내보내기·통계·임계 재검토). 콘솔 라벨은 실제 index.html 문자열로 대조. - 2026-09-22 · **한 줄 요약(headline) — 운영자의 첫 1초를 사유 원문 덤프에서 사실·규모로.** 코퍼스 DB 로 실 콘솔을 띄워 보니 큐의 '상위 근거' 칸이 `구글 visually s... 구글 페이지 with ...`(사유 원문 둘을 잘라 붙인 것)이었고 증거 제목도 `구글 full image match found` 로 절반 영어였다. 스코어러가 점수 계산과 별개로 집계(`_Tally`)해 `riskBreakdown.headline` 에 `웹 완전일치 사본 4곳 · 식별 가능 인물 · 이름 있는 검색 승격 2건 · 라벨 9개` 를 싣는다 — 순서는 예산표, 웹은 가장 강한 뷰만 **호스트 수(곳)** 로, 등록 일치·클리어 이력·미수행·실패·신뢰 출처 제외까지 한 줄. 큐 행과 케이스 요약 보드의 첫 줄이 이것으로 바뀌고 옛 케이스(headline 없음)만 예전 배치. `formatReason` 에 Vision 매치 4종·검색결과 사본·기준 DB 유사도 한국어 매핑 추가. 실렌더(claude-in-chrome, 코퍼스 20장)로 큐·케이스 확인 — 점수·밴드 변화 없음(SCORER_VERSION 유지). diff --git a/docs/PROJECT_MAP.md b/docs/PROJECT_MAP.md index c4fa4c7..e7b9908 100644 --- a/docs/PROJECT_MAP.md +++ b/docs/PROJECT_MAP.md @@ -213,6 +213,7 @@ app-shell CSP(`script-src 'self'`, `http_app.py:514`)가 인라인 스크립트 | `system-architecture.html` | 시스템 구성. 폐쇄망 경계와 그 밖의 외부 검색 API, SSRF 가드 앞의 호출 게이트 | architecture | | `operator-review-workflow.html` | 운영자 심사 4레인(제출·자동·심사·차단). 비상 차단 시 심사가 이어지는 경로 포함 | workflow v2 | | `submission-lifecycle.html` | 제출물 상태 전이. 분석 실패·보류가 종료가 아니라 분석으로 복귀하는 두 고리 | lifecycle | +| `review-guide.html` | 심사 가이드(운영자 관점). 한 줄 요약 → 점수 구성 → 동일→부분→페이지 → 근거 표시 → 판정 → 다음. 미수행 하한 분기와 기준 DB 에 남는 것(주의 후보 자동 · 클리어 기준 등록 수동). 본문은 `docs/operations/review-guide.md` | workflow | ## 알려진 부채 diff --git a/docs/diagrams/manifest.json b/docs/diagrams/manifest.json index 9135c8c..d8ea4dd 100644 --- a/docs/diagrams/manifest.json +++ b/docs/diagrams/manifest.json @@ -26,6 +26,14 @@ "htmlSha256": "e51d09c4251fb762c63142e870d6b58aef7d8f5ca6857875248dc9ee56ae0e7f", "htmlBytes": 818466 }, + { + "type": "workflow", + "spec": "review-guide.workflow.json", + "html": "review-guide.html", + "specSha256": "588cc3dc2fbd223776bcf0a4f040b4b1b71d784036d25948c09db7efc9f952b3", + "htmlSha256": "40b96cae655186f9cf7f339259a5a4a64f1b94b347e99f4d7e37efc5b0f5f042", + "htmlBytes": 814047 + }, { "type": "lifecycle", "spec": "submission-lifecycle.lifecycle.json", diff --git a/docs/diagrams/review-guide.html b/docs/diagrams/review-guide.html new file mode 100644 index 0000000..e87592b Binary files /dev/null and b/docs/diagrams/review-guide.html differ diff --git a/docs/diagrams/review-guide.workflow.json b/docs/diagrams/review-guide.workflow.json new file mode 100644 index 0000000..66f1426 --- /dev/null +++ b/docs/diagrams/review-guide.workflow.json @@ -0,0 +1,292 @@ +{ + "schema_version": 2, + "diagram_type": "workflow", + "meta": { + "title": "심사 가이드", + "output": "docs/diagrams/review-guide.html", + "quality_profile": "showcase", + "views": [ + { + "id": "one-case", + "label": "한 건 심사", + "focus": [ + "headline", + "breakdown", + "evidence", + "mark", + "decide", + "next" + ], + "note": "한 줄 요약에서 다음 미심사 건까지, 보통 1~2분." + }, + { + "id": "unchecked", + "label": "검색이 안 돌았을 때", + "focus": [ + "breakdown", + "unchecked", + "decide" + ], + "note": "증거가 적은 것이 안전하다는 뜻이 아니다 — 중간 하한으로 올라오고 보류 후 재분석한다." + }, + { + "id": "after", + "label": "판정 뒤에 남는 것", + "focus": [ + "decide", + "watchlist", + "cleared" + ], + "note": "보류·반려는 기준 DB 에 자동으로 남고, 승인은 직접 등록해야 남는다." + } + ], + "legend": { + "mode": "auto", + "entries": { + "frontend": { + "label": "운영자가 보는 것" + }, + "backend": { + "label": "운영자가 하는 것" + }, + "database": { + "label": "기준 DB" + }, + "security": { + "label": "커버리지 공백" + } + } + } + }, + "lanes": [ + { + "id": "read", + "label": "읽기 · 근거 확인" + }, + { + "id": "judge", + "label": "판정" + }, + { + "id": "kb", + "label": "기준 DB 에 남는 것", + "variant": "exception" + } + ], + "phases": [ + { + "id": "p-read", + "label": "무엇이 나왔나", + "fromCol": 0, + "toCol": 1 + }, + { + "id": "p-check", + "label": "무엇을 보나", + "fromCol": 2, + "toCol": 3, + "variant": "emphasis" + }, + { + "id": "p-judge", + "label": "어떻게 판정하나", + "fromCol": 4, + "toCol": 5 + } + ], + "groups": [ + { + "id": "g-kb", + "label": "다음에 같은 이미지가 오면", + "lane": "kb", + "fromCol": 4, + "toCol": 5, + "variant": "dashed" + } + ], + "mainPath": [ + "headline", + "breakdown", + "evidence", + "mark", + "decide", + "next" + ], + "nodes": [ + { + "id": "headline", + "lane": "read", + "col": 0, + "type": "frontend", + "label": "한 줄 요약", + "sublabel": "웹 사본 N곳 · 인물 · 검색", + "tag": "첫 1초", + "width": 148 + }, + { + "id": "breakdown", + "lane": "read", + "col": 1, + "type": "frontend", + "label": "점수 구성", + "sublabel": "몇 점이 어디서 왔나", + "width": 148 + }, + { + "id": "unchecked", + "lane": "judge", + "col": 2, + "type": "security", + "label": "미수행 · 실패", + "sublabel": "중간 30 하한", + "width": 148 + }, + { + "id": "evidence", + "lane": "read", + "col": 2, + "type": "frontend", + "label": "증거 열기", + "sublabel": "동일 → 부분 → 페이지 순", + "width": 148 + }, + { + "id": "mark", + "lane": "read", + "col": 3, + "type": "backend", + "label": "근거 표시", + "sublabel": "사용 · 무관 · 오탐", + "tag": "리스코어", + "width": 148 + }, + { + "id": "decide", + "lane": "judge", + "col": 4, + "type": "backend", + "label": "판정", + "sublabel": "A 승인 · H 보류 · R 반려", + "tag": "반려는 사유 필수", + "width": 148 + }, + { + "id": "next", + "lane": "judge", + "col": 5, + "type": "frontend", + "label": "다음 미심사", + "sublabel": "N · 승인·보류는 자동", + "width": 148 + }, + { + "id": "cleared", + "lane": "kb", + "col": 4, + "type": "database", + "label": "클리어 기준 등록", + "sublabel": "승인만으로는 안 남는다", + "width": 148 + }, + { + "id": "watchlist", + "lane": "kb", + "col": 5, + "type": "database", + "label": "주의 후보", + "sublabel": "보류 · 반려는 자동", + "width": 148 + } + ], + "edges": [ + { + "id": "e-headline-breakdown", + "from": "headline", + "to": "breakdown", + "variant": "emphasis" + }, + { + "id": "e-breakdown-evidence", + "from": "breakdown", + "to": "evidence", + "variant": "emphasis" + }, + { + "id": "e-evidence-mark", + "from": "evidence", + "to": "mark", + "variant": "emphasis" + }, + { + "id": "e-mark-decide", + "from": "mark", + "to": "decide", + "label": "근거 행을 사용으로", + "variant": "emphasis" + }, + { + "id": "e-decide-next", + "from": "decide", + "to": "next", + "variant": "emphasis" + }, + { + "id": "e-breakdown-unchecked", + "from": "breakdown", + "to": "unchecked", + "label": "검색이 안 돌았으면", + "variant": "security", + "role": "branch" + }, + { + "id": "e-unchecked-decide", + "from": "unchecked", + "to": "decide", + "label": "보류 후 다음 날 재분석", + "variant": "security", + "role": "branch" + }, + { + "id": "e-decide-cleared", + "from": "decide", + "to": "cleared", + "label": "승인 후 직접", + "variant": "dashed", + "role": "branch" + }, + { + "id": "e-decide-watchlist", + "from": "decide", + "to": "watchlist", + "label": "보류 · 반려", + "variant": "default", + "role": "branch" + } + ], + "cards": [ + { + "dot": "emerald", + "title": "무엇을 보는가", + "items": [ + "웹 완전일치 사본이 가장 중요한 사실 — 동일 그룹의 출처 하나가 나머지 70행보다 중요하다", + "라벨은 무엇이 찍혔는지만 말한다 — 권리 판단에 쓰지 않는다" + ] + }, + { + "dot": "rose", + "title": "판정 뒤에 남는 것", + "items": [ + "보류 · 반려 → 주의 후보 자동 등록, 같은 이미지가 다시 오면 잡힌다", + "승인은 DB 에 남지 않는다 — 반복 제출되는 정상 이미지는 클리어 기준 등록" + ] + }, + { + "dot": "cyan", + "title": "키보드", + "items": [ + "J / K 이동 · N 다음 미심사 · A 승인 · H 보류 · R 반려 · ? 도움말", + "입력칸에 커서가 있으면 단축키가 먹지 않는다 — Esc" + ] + } + ] +} diff --git a/scripts/rebuild-diagrams.ps1 b/scripts/rebuild-diagrams.ps1 index a15f8de..d46fba6 100644 --- a/scripts/rebuild-diagrams.ps1 +++ b/scripts/rebuild-diagrams.ps1 @@ -56,6 +56,7 @@ $diagrams = @( @{ Type = 'architecture'; Base = 'system-architecture' }, @{ Type = 'dataflow'; Base = 'evidence-dataflow' }, @{ Type = 'workflow'; Base = 'operator-review-workflow' }, + @{ Type = 'workflow'; Base = 'review-guide' }, @{ Type = 'lifecycle'; Base = 'submission-lifecycle' } ) diff --git a/scripts/update_diagram_manifest.py b/scripts/update_diagram_manifest.py index ab8882f..2672a6a 100644 --- a/scripts/update_diagram_manifest.py +++ b/scripts/update_diagram_manifest.py @@ -24,6 +24,7 @@ DIAGRAMS = [ ("architecture", "system-architecture"), ("dataflow", "evidence-dataflow"), ("workflow", "operator-review-workflow"), + ("workflow", "review-guide"), ("lifecycle", "submission-lifecycle"), ]