{ "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": 132 }, { "id": "seed", "lane": "intake", "col": 1, "type": "backend", "label": "시드 · 리로드", "sublabel": "신규 레코드만", "tag": "판정 보존", "width": 132 }, { "id": "analyze", "lane": "auto", "col": 2, "type": "backend", "label": "내부 분석", "sublabel": "지문 · 얼굴 · 출처", "width": 132 }, { "id": "search", "lane": "auto", "col": 3, "type": "backend", "label": "자동 검색", "sublabel": "쿼리 생성 · 승격", "width": 132 }, { "id": "score", "lane": "auto", "col": 4, "type": "backend", "label": "위험도 산출", "sublabel": "점수 · 밴드 · 사유", "tag": "v3", "width": 132 }, { "id": "llm", "lane": "review", "col": 3, "type": "backend", "label": "LLM 증거 판독", "sublabel": "인용 검증 · 12행", "width": 132 }, { "id": "evidence", "lane": "review", "col": 4, "type": "frontend", "label": "증거 검토", "sublabel": "호스트 · 썸네일 · 링크", "width": 132 }, { "id": "decide", "lane": "review", "col": 5, "type": "backend", "label": "판정", "sublabel": "승인 · 보류 · 반려", "tag": "감사 이벤트", "width": 132 }, { "id": "stop", "lane": "exception", "col": 3, "type": "security", "label": "비상 차단 스위치", "sublabel": "쿼터 · provider 토글", "width": 132 }, { "id": "skipped", "lane": "exception", "col": 4, "type": "security", "label": "검색 건너뜀", "sublabel": "0점 · 사유만 기록", "width": 132 }, { "id": "retained", "lane": "exception", "col": 5, "type": "database", "label": "보존된 케이스", "sublabel": "원본 파일 없음", "tag": "assetMissing", "width": 132 } ], "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행으로 제한된다" ] } ] }