POSA_Copyrighter/docs/diagrams/submission-lifecycle.lifecycle.json
changukyu d45018c4d0 docs: 다이어그램 4종 세트 완성, 범례 한글화
아키텍처 · 운영자 심사 워크플로 · 제출물 상태 전이를 신설하고, 기존 증거
데이터 흐름까지 4종의 범례를 한글화했다. 렌더러 기본 범례가 "User UI /
Agent logic / Context-trace" 나 "policy / PII" 처럼 타 도메인 문구였다 —
legend.entries 로 라벨만 바꿨고 종류와 개수는 그대로다.

  system-architecture      폐쇄망 경계와 그 밖의 외부 검색 API. 나가는 경로는
                           store_remote_fetch 하나뿐이고 앞에 호출 게이트가 있다
  operator-review-workflow 4레인(제출·자동·심사·차단). 비상 차단이 걸려도
                           커버리지 부족 표시로 심사가 이어지는 경로 포함
  submission-lifecycle     분석 실패와 보류가 종료가 아니라 분석 중으로
                           돌아오는 두 고리, 판정 후 보존 상태

작성 중 내린 고도 판단 두 개를 남긴다.

  아키텍처에서 analyzer/scorer 를 "분석 · 채점" 한 컴포넌트로 합쳤다. 이
  고도에서 그 분리는 엣지를 벌지 못하고, store 노드에 엣지 7개가 몰려
  통로가 부족해졌다. 채점 내부는 dataflow 다이어그램이 담당한다.

  라이프사이클에서 "재분석 요청"을 상태에서 뺐다. decisionStatus 값이 아니라
  운영자 액션이고, 보류가 같은 의미를 담아 긴 복귀 엣지를 하나로 줄인다.

검증: 4종 모두 showcase 통과(아티팩트 검사 9/9 · 합성 오류 0 · 경고 0),
visual-check 통과(1440x900 · 2048x1320 각 Light/Dark, 오버플로 0).
html sha256 — dataflow a62f0f5c / architecture f5a4b6e1 /
workflow 402914a3 / lifecycle 62e934a3

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BStHFrjQj2VypecSG9ex1V
2026-09-19 00:34:51 +09:00

280 lines
6 KiB
JSON

{
"schema_version": 1,
"diagram_type": "lifecycle",
"meta": {
"title": "제출물 상태 전이",
"output": "docs/diagrams/submission-lifecycle.html",
"quality_profile": "showcase",
"viewBox": [
1080,
630
],
"views": [
{
"id": "main",
"label": "주 단계",
"focus": [
"intake",
"analyzing",
"pending",
"decision",
"approved"
],
"note": "접수에서 승인까지 이어지는 다섯 단계."
},
{
"id": "recovery",
"label": "복구 경로",
"focus": [
"analyzing",
"failed",
"held"
],
"note": "끝나지 않고 분석으로 되돌아오는 두 고리."
},
{
"id": "terminal",
"label": "종료 상태",
"focus": [
"decision",
"approved",
"rejected",
"retained"
],
"note": "되돌아오지 않는 상태와, 판정을 남긴 채 파일만 사라진 상태."
}
],
"legend": {
"mode": "auto",
"entries": {
"start": {
"label": "시작"
},
"active": {
"label": "진행 중"
},
"waiting": {
"label": "대기"
},
"decision": {
"label": "판정"
},
"success": {
"label": "정상 종료"
},
"failure": {
"label": "실패 · 종료"
}
}
}
},
"lanes": [
{
"id": "main",
"label": "제출물 단계"
},
{
"id": "waiting",
"label": "대기 · 보강"
},
{
"id": "exceptions",
"label": "복구 경로"
},
{
"id": "terminal",
"label": "종료 상태"
}
],
"states": [
{
"id": "intake",
"type": "start",
"label": "접수",
"sublabel": "폴더 · 업로드",
"lane": "main",
"col": 0,
"step": "01",
"tag": "신규"
},
{
"id": "analyzing",
"type": "active",
"label": "분석 중",
"sublabel": "지문 · 얼굴 · 검색",
"lane": "main",
"col": 1,
"step": "02"
},
{
"id": "pending",
"type": "active",
"label": "심사 대기",
"sublabel": "점수 · 밴드 산출됨",
"lane": "main",
"col": 2,
"step": "03",
"tag": "unreviewed"
},
{
"id": "decision",
"type": "decision",
"label": "판정",
"sublabel": "운영자 결정",
"lane": "main",
"col": 3,
"step": "04"
},
{
"id": "approved",
"type": "success",
"label": "승인",
"sublabel": "사용 가능",
"lane": "main",
"col": 4,
"step": "05",
"tag": "approved"
},
{
"id": "held",
"type": "waiting",
"label": "보류",
"sublabel": "추가 확인 필요",
"lane": "waiting",
"col": 0,
"tag": "held"
},
{
"id": "failed",
"type": "failure",
"label": "분석 실패",
"sublabel": "provider 실패",
"lane": "exceptions",
"col": 0,
"tag": "복구 가능",
"yOffset": 78
},
{
"id": "rejected",
"type": "failure",
"label": "반려",
"sublabel": "사용 불가",
"lane": "terminal",
"col": 1,
"tag": "rejected"
},
{
"id": "retained",
"type": "failure",
"label": "보존",
"sublabel": "원본 파일 없음",
"lane": "terminal",
"col": 2,
"tag": "assetMissing"
}
],
"transitions": [
{
"id": "t-intake",
"from": "intake",
"to": "analyzing",
"variant": "emphasis"
},
{
"id": "t-analyzed",
"from": "analyzing",
"to": "pending",
"variant": "emphasis",
"route": "straight"
},
{
"id": "t-review",
"from": "pending",
"to": "decision",
"variant": "emphasis"
},
{
"id": "t-approve",
"from": "decision",
"to": "approved",
"label": "승인",
"variant": "emphasis"
},
{
"id": "t-hold",
"from": "pending",
"to": "held",
"label": "추가 확인 필요",
"labelDy": 24
},
{
"id": "t-fail",
"from": "analyzing",
"to": "failed",
"label": "provider 실패",
"variant": "security",
"labelDy": -24
},
{
"id": "t-retry",
"from": "failed",
"to": "analyzing",
"label": "재시도",
"variant": "emphasis",
"labelDy": 6,
"channelX": 240,
"toSide": "bottom"
},
{
"id": "t-reject",
"from": "decision",
"to": "rejected",
"label": "반려",
"variant": "security",
"labelDy": 24
},
{
"id": "t-retain",
"from": "rejected",
"to": "retained",
"label": "원본 파일 소실",
"variant": "dashed",
"labelDy": 60
},
{
"id": "t-rerun",
"from": "held",
"to": "analyzing",
"label": "재분석 요청",
"variant": "emphasis",
"channelX": 170,
"toSide": "left"
}
],
"cards": [
{
"dot": "emerald",
"title": "주 단계",
"items": [
"접수된 제출물은 분석을 거쳐 심사 대기 상태에서 점수와 밴드를 갖는다",
"판정은 운영자만 내린다 — 자동 분석은 밴드까지만 만든다"
]
},
{
"dot": "rose",
"title": "되돌아오는 상태",
"items": [
"분석 실패와 재분석 요청은 종료가 아니라 분석 중으로 돌아온다",
"보류는 운영자가 증거를 보강하려는 상태다 — 재분석은 기존 증거를 지우지 않는다"
]
},
{
"dot": "amber",
"title": "보존",
"items": [
"판정을 남긴 케이스는 원본 파일이 사라져도 지워지지 않는다",
"파일이 돌아오면 보존 표시는 해제되고 감사에 남는다"
]
}
]
}