아키텍처 · 운영자 심사 워크플로 · 제출물 상태 전이를 신설하고, 기존 증거
데이터 흐름까지 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
280 lines
6 KiB
JSON
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": [
|
|
"판정을 남긴 케이스는 원본 파일이 사라져도 지워지지 않는다",
|
|
"파일이 돌아오면 보존 표시는 해제되고 감사에 남는다"
|
|
]
|
|
}
|
|
]
|
|
}
|