주제 13개 · Case 28 · Concept 5 · Reference 15 · Question 4 · Decision 4. 계약의 노드마다 종류가 요구하는 칸을 채우고, 본문이 있는 두 종류에는 SSOT 가 이미 그려 둔 도식 셋(value-boundaries · decision-path-404 · topic-variant-model)을 tech-log-studio/ 로 옮겨 붙였다. 새로 그린 그림은 없다. 검사 셋 전부 통과한다. check_body.mjs 56 편 중 본문이 있는 33 편 PASS check_prose.mjs 56 편 error 0 check_evidence.mjs --repo 포함 문제 없음 verify-tech-log-tree.py 프로젝트 5 · error 0 · warn 0 인용한 코드블록은 전부 SSOT 에서 찾아 대조했다. check_evidence.mjs 가 본문의 각 줄과 source 앵커와 계약 제목을 다시 확인한다. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
105 lines
8.1 KiB
XML
105 lines
8.1 KiB
XML
<?xml version="1.0" encoding="UTF-8"?>
|
|
<svg xmlns="http://www.w3.org/2000/svg" width="1535" height="300" viewBox="0 0 1535 300" role="img" aria-labelledby="diagram-title diagram-description">
|
|
<title id="diagram-title">공개 화면 한 줄까지 값이 지나는 열한 개의 경계 — 다섯 묶음</title>
|
|
<desc id="diagram-description">왼쪽에서 오른쪽으로 읽는다. tech-log-backend 구역에 저장 묶음과 백엔드 조립 묶음이 있고 각각 경계 둘과 넷을 담는다. 전선 구역에는 HTTP envelope 하나가 있다. tech-log-frontend 구역에는 프론트엔드 조립 묶음과 화면 컴포넌트가 있고 각각 경계 셋과 하나다. 다 더하면 열한 개이고, 각 경계의 이름은 그림 위 목록에 있다.</desc>
|
|
<metadata>{"techviz":{"spec_version":"1.1","id":"value-boundaries","profile":"component-flow"},"source_context":{"document":"document.md","document_sha256":"93b9fec4884efa0e6231de07dc27e2b0ac36c9052d3720e28d102d9747ac4f8f","anchor":{"kind":"marker","value":"value-boundaries","line":82}},"evidence_policy":"Each factual element cites source lines or is marked assumption.","diagram_only":true}</metadata>
|
|
<defs>
|
|
<marker id="arrow" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse">
|
|
<path d="M 0 0 L 10 5 L 0 10 z" />
|
|
</marker>
|
|
<style>
|
|
:root { color-scheme: light; }
|
|
text { font-family: Inter, Pretendard, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; fill: #111827; }
|
|
.canvas { fill: #ffffff; }
|
|
.group-box { fill: #ffffff; stroke: #9ca3af; stroke-width: 1.4; stroke-dasharray: 7 5; }
|
|
.group-label-bg { fill: #ffffff; }
|
|
.group-label { font-size: 13px; font-weight: 650; fill: #374151; }
|
|
.edge { fill: none; stroke: #374151; stroke-width: 1.8; stroke-linejoin: round; stroke-linecap: round; marker-end: url(#arrow); }
|
|
.edge.style-dashed, .edge.semantic-dashed, .edge.assumption { stroke-dasharray: 7 5; }
|
|
.edge.style-dotted { stroke-dasharray: 2 5; }
|
|
.edge.emphasis-primary { stroke: #2563eb; stroke-width: 2.2; }
|
|
.edge.emphasis-muted { stroke: #9ca3af; }
|
|
.edge.emphasis-warning, .edge.kind-failure, .edge.kind-error { stroke: #dc2626; stroke-width: 2.2; }
|
|
.edge-label-bg { fill: #ffffff; }
|
|
.edge-label { font-size: 12px; font-weight: 560; text-anchor: middle; }
|
|
.node-shape { fill: #ffffff; stroke: #4b5563; stroke-width: 1.7; }
|
|
.node-shape.emphasis-primary { stroke: #2563eb; stroke-width: 2.2; }
|
|
.node-shape.emphasis-muted { stroke: #9ca3af; fill: #f9fafb; }
|
|
.node-shape.emphasis-warning { stroke: #d97706; stroke-width: 2; fill: #fffdf5; }
|
|
.node-shape.kind-database, .node-shape.kind-datastore, .node-shape.kind-storage { fill: #f8fafc; }
|
|
.node-shape.kind-queue, .node-shape.kind-event, .node-shape.kind-topic { fill: #fafafa; }
|
|
.node-shape.assumption { stroke-dasharray: 4 4; }
|
|
.storage-bottom, .controller-divider { fill: none; stroke: #4b5563; stroke-width: 1.4; }
|
|
.controller-led { fill: #4b5563; }
|
|
.actor-symbol { fill: none; stroke: #4b5563; stroke-width: 1.8; stroke-linecap: round; }
|
|
.actor-symbol.emphasis-primary { stroke: #2563eb; stroke-width: 2.2; }
|
|
.node-label { font-size: 14px; font-weight: 650; text-anchor: middle; }
|
|
.node-role { font-size: 10px; letter-spacing: 0.04em; text-anchor: middle; fill: #6b7280; }
|
|
.node-detail-divider { stroke: #d1d5db; stroke-width: 1; }
|
|
.node-detail { font-size: 11px; fill: #374151; }
|
|
.assumption-badge { font-size: 9px; font-weight: 700; fill: #92400e; }
|
|
.failure-mark { stroke: #dc2626; stroke-width: 4; stroke-linecap: round; }
|
|
.lifeline { stroke: #9ca3af; stroke-width: 1.2; stroke-dasharray: 5 5; }
|
|
.timeline-axis { stroke: #374151; stroke-width: 1.8; marker-end: url(#arrow); }
|
|
.timeline-stem { stroke: #6b7280; stroke-width: 1.3; }
|
|
.timeline-marker { fill: #ffffff; stroke: #374151; stroke-width: 1.7; }
|
|
.timeline-marker.primary { fill: #2563eb; stroke: #2563eb; }
|
|
.timeline-marker.warning { fill: #dc2626; stroke: #dc2626; }
|
|
.timeline-label { font-size: 13px; font-weight: 650; text-anchor: middle; }
|
|
.timeline-detail { font-size: 11px; fill: #4b5563; text-anchor: middle; }
|
|
</style>
|
|
</defs>
|
|
<rect class="canvas" width="1535" height="300" />
|
|
<rect class="group-box" x="40.0" y="35.0" width="520.0" height="143.0" rx="8" />
|
|
<rect class="group-label-bg" x="54.0" y="25.0" width="134.0" height="22" />
|
|
<text class="group-label" x="64.0" y="40.0">tech-log-backend</text>
|
|
<rect class="group-box" x="660.0" y="35.0" width="210.0" height="143.0" rx="8" />
|
|
<rect class="group-label-bg" x="674.0" y="25.0" width="90.0" height="22" />
|
|
<text class="group-label" x="684.0" y="40.0">전선 (HTTP)</text>
|
|
<rect class="group-box" x="970.0" y="35.0" width="520.0" height="143.0" rx="8" />
|
|
<rect class="group-label-bg" x="984.0" y="25.0" width="141.0" height="22" />
|
|
<text class="group-label" x="994.0" y="40.0">tech-log-frontend</text>
|
|
<polyline class="edge kind-data style-solid emphasis-normal" points="220.0,116.5 300.0,116.5 300.0,116.5 380.0,116.5" data-evidence="70-71" />
|
|
<rect class="edge-label-bg" x="270.9" y="74.5" width="58.2" height="22" rx="3" />
|
|
<text class="edge-label" x="300.0" y="89.5">SQL 조회</text>
|
|
<polyline class="edge kind-data style-solid emphasis-normal" points="530.0,116.5 610.0,116.5 610.0,116.5 690.0,116.5" data-evidence="74-75" />
|
|
<rect class="edge-label-bg" x="577.5" y="74.5" width="64.9" height="22" rx="3" />
|
|
<text class="edge-label" x="610.0" y="89.5">HTTP 응답</text>
|
|
<polyline class="edge kind-data style-solid emphasis-normal" points="840.0,116.5 920.0,116.5 920.0,116.5 1000.0,116.5" data-evidence="75-76" />
|
|
<rect class="edge-label-bg" x="887.5" y="74.5" width="64.9" height="22" rx="3" />
|
|
<text class="edge-label" x="920.0" y="89.5">HTTP 수신</text>
|
|
<polyline class="edge kind-data style-solid emphasis-normal" points="1150.0,116.5 1230.0,116.5 1230.0,116.5 1310.0,116.5" data-evidence="78-79" />
|
|
<rect class="edge-label-bg" x="1200.9" y="74.5" width="58.2" height="22" rx="3" />
|
|
<text class="edge-label" x="1230.0" y="89.5">화면 한 줄</text>
|
|
<g id="node-store">
|
|
<rect class="node-shape kind-database emphasis-normal role-store" data-evidence="69-70" x="70.0" y="81.0" width="150.0" height="71.0" rx="7" />
|
|
<text class="node-label" x="145.0" y="108.0">저장</text>
|
|
<line class="node-detail-divider" x1="84.0" y1="129.0" x2="206.0" y2="129.0" />
|
|
<text class="node-detail" x="86.0" y="146.0">경계 2</text>
|
|
</g>
|
|
<g id="node-backend-assembly">
|
|
<rect class="node-shape kind-service emphasis-warning role-service" data-evidence="71-74" x="380.0" y="81.0" width="150.0" height="71.0" rx="7" />
|
|
<text class="node-label" x="455.0" y="108.0">백엔드 조립</text>
|
|
<line class="node-detail-divider" x1="394.0" y1="129.0" x2="516.0" y2="129.0" />
|
|
<text class="node-detail" x="396.0" y="146.0">경계 4</text>
|
|
</g>
|
|
<g id="node-http-envelope">
|
|
<rect class="node-shape kind-message emphasis-normal role-transfer" data-evidence="75-75" x="690.0" y="81.0" width="150.0" height="71.0" rx="7" />
|
|
<text class="node-label" x="765.0" y="108.0">HTTP envelope</text>
|
|
<line class="node-detail-divider" x1="704.0" y1="129.0" x2="826.0" y2="129.0" />
|
|
<text class="node-detail" x="706.0" y="146.0">경계 1</text>
|
|
</g>
|
|
<g id="node-frontend-assembly">
|
|
<rect class="node-shape kind-service emphasis-normal role-service" data-evidence="76-78" x="1000.0" y="81.0" width="150.0" height="71.0" rx="7" />
|
|
<text class="node-label" x="1075.0" y="108.0">프론트엔드 조립</text>
|
|
<line class="node-detail-divider" x1="1014.0" y1="129.0" x2="1136.0" y2="129.0" />
|
|
<text class="node-detail" x="1016.0" y="146.0">경계 3</text>
|
|
</g>
|
|
<g id="node-screen">
|
|
<rect class="node-shape kind-component emphasis-normal role-sink" data-evidence="79-79,66-66" x="1310.0" y="81.0" width="150.0" height="71.0" rx="7" />
|
|
<text class="node-label" x="1385.0" y="108.0">화면 컴포넌트</text>
|
|
<line class="node-detail-divider" x1="1324.0" y1="129.0" x2="1446.0" y2="129.0" />
|
|
<text class="node-detail" x="1326.0" y="146.0">경계 1</text>
|
|
</g>
|
|
</svg>
|