8/8 실효성 평가가 "남은 것: 신뢰출처 판정 자체. 목록만 정해지면
cleared_reference 와 같은 패턴으로 바로 붙는다"로 남겨둔 항목이다. 전제였던
"호스트가 저장 시점에 파괴되는" 문제는 9/18 에 고쳤고, 저장 위치는 지식DB 로
정해졌다.
지식DB 의 trusted_host 항목 — 이름이 호스트, 별칭이 같은 주체의 다른 도메인
신뢰 철회는 기존 활성/비활성 수명주기 그대로 (두 번째 스위치를 만들지 않는다)
핵심은 **행 단위 제외**라는 것이다. 케이스 단위로 끄면 자사 사본이 있다는
이유로 스크래퍼 게시까지 덮인다. 실측: 우리 CDN 완전일치 + 블로그 게시가 같이
있을 때 신뢰 등록 전 80/high, 등록 후 35/medium — 블로그만 남는다.
제외된 행은 점수에서 빠지되 사유로는 남는다("신뢰 출처 posar.info — 위험
점수에서 제외"). 증거 목록에는 그 행이 그대로 보이므로, 왜 점수가 증거보다
조용한지 운영자에게 말해주지 않으면 도구를 불신하게 된다.
경계 처리:
서브도메인은 같은 주체다 (cdn.posar.info)
posar.info.evil.test 는 접미사가 아니라 다른 도메인이다
점 없는 값은 무시한다 — "com" 하나가 웹 전체를 신뢰 처리하면 안 된다
엔티티 라벨은 영향 없다 — "어디에 떠 있나"가 아니라 "무엇이 찍혔나"다
신선한 CSE 행은 host 키가 없어 domain(displayLink)에서 해석한다
호스트 해석이 store_serialization._result_host 와 따로 사는 이유는 층 때문이다.
analysis 는 server 를 import 할 수 없고, 한쪽은 값을 영속화하고 다른 쪽은
운영자 목록과 대조한다. 우선순위는 같게 맞추고 그 사실을 양쪽 주석에 적었다.
빈 목록이면 v3 과 동작이 같다. 등록하지 않은 배포는 아무것도 달라지지 않는다.
다이어그램 사실 게이트(9/21 신설)가 v3 -> v4 를 3개 다이어그램에서 자동으로
잡았다. 스펙을 고치고 rebuild-diagrams.ps1 로 재생성했다 — 게이트의 첫 실사용이고
의도대로 동작했다.
검증: ruff clean, pytest 632 passed (스코어러 7건 + 스토어 3건 추가).
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BStHFrjQj2VypecSG9ex1V
349 lines
7.5 KiB
JSON
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": 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": "v4",
|
|
"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행으로 제한된다"
|
|
]
|
|
}
|
|
]
|
|
}
|