POSA_Copyrighter/docs/diagrams/operator-review-workflow.workflow.json
changukyu 6017750bae feat: 스코어러 v5 — 축 예산을 총합 기준으로 재배분, 실이미지 100점 포화 20/20 → 0/20
첫 실측이 보인 원인은 축 예산의 합(245 vs 상한 100)이었다. 캡 없는 두 축만 캡하는
시뮬레이션(80/50, 60/40)으로는 20/20 이 그대로 100 이라 총합 기준으로 다시 짰다.

예산: 등록 권리 대상 일치 80(단독 high) · 웹 존재 40(검색결과 사본 유사도·Vision 매치·
CSE 페이지가 제공자 무관 한 풀, 뷰 강도로만 40/30/10) · 인물 30/10 · 이름 있는 검색
승격 15 · 라벨 10 → 등록 제외 최대 95. 외부 검색 실패는 +30/행 가산 대신 medium 하한.
검색결과 사본 행은 knowledge_entry_id 부재 + url/source_evidence_ids 로 웹 풀에 간다.

격자 432: high 92→75%, 포화 80→44%(남은 포화는 전부 등록 강한 일치 조합), 웹 신호만
high 13/24→0/24. 실이미지 20장 리스코어: 100점 20→0, 구별 점수 1→4(75/80/92/95),
밴드는 전부 high 유지(전부 웹에 있는 인물 사진 — medium/low 임계는 여전히 미검증).

다이어그램 spec 3종 v5 + 재생성(archify 2.17). operator-review-workflow 는 새
desktop-readability 검사에 HEAD 그대로 걸려 노드 폭 132→124 로 통과시켰고, 그 확대로
1440x900 세로 13px 넘침이 남는다(visual-check containment) — INDEX 에 기록.

verify.ps1: ruff clean, 654 passed.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BStHFrjQj2VypecSG9ex1V
2026-09-22 10:31:53 +09:00

349 lines
7.5 KiB
JSON

{
"schema_version": 2,
"diagram_type": "workflow",
"meta": {
"title": "운영자 심사 워크플로",
"output": "docs/diagrams/operator-review-workflow.html",
"quality_profile": "showcase",
"views": [
{
"id": "happy-path",
"label": "정상 경로",
"focus": [
"folder",
"seed",
"analyze",
"search",
"score",
"evidence",
"decide"
],
"note": "폴더 투입에서 판정까지 가는 주 경로."
},
{
"id": "stop-path",
"label": "비상 차단",
"focus": [
"search",
"stop",
"skipped",
"evidence"
],
"note": "외부 호출이 멈췄을 때 심사가 어떻게 이어지는지."
},
{
"id": "assist",
"label": "판독 보조",
"focus": [
"search",
"llm",
"evidence"
],
"note": "LLM 이 증거를 읽고 초안을 내는 보조 경로."
}
],
"legend": {
"mode": "auto",
"entries": {
"external": {
"label": "외부 입력"
},
"backend": {
"label": "서버 처리"
},
"frontend": {
"label": "운영자 화면"
},
"security": {
"label": "차단 · 정책"
},
"database": {
"label": "저장소"
}
}
}
},
"lanes": [
{
"id": "intake",
"label": "제출 · 시드"
},
{
"id": "auto",
"label": "자동 분석 · 검색"
},
{
"id": "review",
"label": "운영자 심사"
},
{
"id": "exception",
"label": "차단 · 보존",
"variant": "exception"
}
],
"phases": [
{
"id": "p-intake",
"label": "제출 · 시드",
"fromCol": 0,
"toCol": 1
},
{
"id": "p-auto",
"label": "자동 분석 · 검색",
"fromCol": 2,
"toCol": 3,
"variant": "emphasis"
},
{
"id": "p-judge",
"label": "채점 · 심사 · 판정",
"fromCol": 4,
"toCol": 5
}
],
"groups": [
{
"id": "g-exception",
"label": "외부 호출이 멈춘 경우",
"lane": "exception",
"fromCol": 3,
"toCol": 4,
"variant": "security"
},
{
"id": "g-assist",
"label": "판독 보조",
"lane": "review",
"fromCol": 3,
"toCol": 3,
"variant": "dashed"
}
],
"mainPath": [
"folder",
"seed",
"analyze",
"search",
"score",
"evidence",
"decide"
],
"nodes": [
{
"id": "folder",
"lane": "intake",
"col": 0,
"type": "external",
"label": "큐 폴더 · 업로드",
"sublabel": "이미지 · manifest",
"width": 124
},
{
"id": "seed",
"lane": "intake",
"col": 1,
"type": "backend",
"label": "시드 · 리로드",
"sublabel": "신규 레코드만",
"tag": "판정 보존",
"width": 124
},
{
"id": "analyze",
"lane": "auto",
"col": 2,
"type": "backend",
"label": "내부 분석",
"sublabel": "지문 · 얼굴 · 출처",
"width": 124
},
{
"id": "search",
"lane": "auto",
"col": 3,
"type": "backend",
"label": "자동 검색",
"sublabel": "쿼리 생성 · 승격",
"width": 124
},
{
"id": "score",
"lane": "auto",
"col": 4,
"type": "backend",
"label": "위험도 산출",
"sublabel": "점수 · 밴드 · 사유",
"tag": "v5",
"width": 124
},
{
"id": "llm",
"lane": "review",
"col": 3,
"type": "backend",
"label": "LLM 증거 판독",
"sublabel": "인용 검증 · 12행",
"width": 124
},
{
"id": "evidence",
"lane": "review",
"col": 4,
"type": "frontend",
"label": "증거 검토",
"sublabel": "호스트 · 썸네일 · 링크",
"width": 124
},
{
"id": "decide",
"lane": "review",
"col": 5,
"type": "backend",
"label": "판정",
"sublabel": "승인 · 보류 · 반려",
"tag": "감사 이벤트",
"width": 124
},
{
"id": "stop",
"lane": "exception",
"col": 3,
"type": "security",
"label": "비상 차단 스위치",
"sublabel": "쿼터 · provider 토글",
"width": 124
},
{
"id": "skipped",
"lane": "exception",
"col": 4,
"type": "security",
"label": "검색 건너뜀",
"sublabel": "0점 · 사유만 기록",
"width": 124
},
{
"id": "retained",
"lane": "exception",
"col": 5,
"type": "database",
"label": "보존된 케이스",
"sublabel": "원본 파일 없음",
"tag": "assetMissing",
"width": 124
}
],
"edges": [
{
"id": "e-intake",
"from": "folder",
"to": "seed",
"variant": "default"
},
{
"id": "e-seed-analyze",
"from": "seed",
"to": "analyze",
"variant": "emphasis"
},
{
"id": "e-analyze-search",
"from": "analyze",
"to": "search",
"variant": "default"
},
{
"id": "e-search-score",
"from": "search",
"to": "score",
"variant": "emphasis"
},
{
"id": "e-score-evidence",
"from": "score",
"to": "evidence",
"variant": "emphasis"
},
{
"id": "e-evidence-decide",
"from": "evidence",
"to": "decide",
"label": "근거 확인 후",
"variant": "emphasis"
},
{
"id": "e-search-stop",
"from": "search",
"to": "stop",
"label": "외부 호출 요청",
"variant": "security"
},
{
"id": "e-stop-skipped",
"from": "stop",
"to": "skipped",
"label": "차단됨",
"variant": "security",
"role": "error"
},
{
"id": "e-skipped-evidence",
"from": "skipped",
"to": "evidence",
"label": "커버리지 부족 표시",
"variant": "default",
"role": "branch"
},
{
"id": "e-search-llm",
"from": "search",
"to": "llm",
"label": "판독 요청",
"variant": "dashed",
"role": "async"
},
{
"id": "e-llm-evidence",
"from": "llm",
"to": "evidence",
"label": "인용된 초안",
"variant": "dashed"
},
{
"id": "e-decide-retained",
"from": "decide",
"to": "retained",
"label": "파일 소실 시",
"variant": "default",
"role": "branch"
}
],
"cards": [
{
"dot": "emerald",
"title": "주 경로",
"items": [
"리로드는 신규 레코드만 분석한다 — 기존 행은 판정과 함께 보존된다",
"자동 검색은 쿼리를 생성하고 유사도가 맞는 결과만 증거로 승격한다"
]
},
{
"dot": "rose",
"title": "멈췄을 때",
"items": [
"비상 차단은 시드 · 재분석 · 얼굴 크롭 경로까지 모두 막는다",
"건너뛴 검색은 0점이며 위험 사유가 아니라 운영 상태로만 기록된다"
]
},
{
"dot": "cyan",
"title": "판독 보조",
"items": [
"LLM 은 요약기가 아니라 증거 판독기다 — 인용 없는 claim 은 폐기된다",
"프롬프트 입력은 상위 12행으로 제한된다"
]
}
]
}