docs(keycloak-session-store): remake all 28 diagrams through the techviz pipeline
The originating repository's SVGs were drawn by hand and every one of them
put a title, a subtitle and an explanation band inside the canvas. This
repository forbids both, so they could not be carried over — the whole set
was rebuilt through the skill's pipeline instead.
Each diagram went through prepare, references, prompt, a VizSpec 1.1 citing
document line ranges, lint, and render. All 28 pass lint and produce the
same eight formats the existing keycloak project has. Sentences moved out of
the canvas into <desc> and the paragraph beside each figure; the drawings
carry names only.
Two lint rules did real work rather than formatting work:
edge-through-node caught arrows crossing an unrelated
node and implying an adjacency that
does not exist — four diagrams had to
be restructured, not just relaid out
evidence-outside-prepared-context caught a diagram citing another
section; its anchor moved from B-0 to
B-1 so all three sections it draws on
are inside the prepared context
lab-topology also had to change profile: its context offers a different
candidate set, and query-fanout with shard roles is what the section
actually shows — one entry point spreading to two Keycloak nodes.
The document now carries all 28 inline, one per claim that needed one, and
the section recording what was still missing is updated: the diagram gap is
closed, Studio records remain.
verify-pipeline.py passes. audit-records.py reports no issues.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
b2963105a8
commit
75bed382c8
@@ -0,0 +1,84 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="680" height="670" viewBox="0 0 680 670" role="img" aria-labelledby="diagram-title diagram-description">
|
||||
<title id="diagram-title">명령으로 적는 것과 도는 것</title>
|
||||
<desc id="diagram-description">절차를 명령으로 적었지만 측정 장치 자체가 산문인 자리가 남아 있었다. 22.2초라는 헤드라인을 만든 부하 생성기가 실행 가능한 형태가 아니었고, RPO 측정의 로그인 루프와 sid 대조도 그랬으며, A-8 은 파일 하나에 쓰고 다른 파일을 읽고 있었다. 전부 셸 표현식으로 바꾸고 실제로 돌려서 확인했다. 그 확인에서 A-6 의 부하 생성기가 깨졌다. 일회성 파드의 출력 스트림이 유실됐고 상주 탐침에 파일로 모아 20/20 을 확인했다.</desc>
|
||||
<metadata>{"techviz":{"spec_version":"1.1","id":"reproducibility-gap","profile":"component-flow"},"source_context":{"document":"docs/keycloak-session-store/final/document.md","document_sha256":"1d44cba1905544d92f1d26ae36a8deb64a3db3914d6b488fd30d6ae7f8cfbabe","anchor":{"kind":"heading","value":"재현 가능성을 어떻게 보장했나","line":660}},"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="680" height="670" />
|
||||
<polyline class="edge kind-request style-solid emphasis-normal" points="188.5,291.0 188.5,339.0 188.5,339.0 188.5,387.0" data-evidence="615-622" />
|
||||
<rect class="edge-label-bg" x="190.1" y="325.0" width="44.8" height="22" rx="3" />
|
||||
<text class="edge-label" x="212.5" y="340.0">돌려본다</text>
|
||||
<polyline class="edge kind-request style-solid emphasis-normal" points="188.5,458.0 188.5,506.0 188.5,506.0 188.5,554.0" data-evidence="615-622" />
|
||||
<rect class="edge-label-bg" x="170.0" y="492.0" width="85.0" height="22" rx="3" />
|
||||
<text class="edge-label" x="212.5" y="507.0">통과한 것만 남긴다</text>
|
||||
<polyline class="edge kind-request style-solid emphasis-normal" points="188.5,131.0 188.5,179.0 188.5,179.0 188.5,227.0" data-evidence="598-614" />
|
||||
<rect class="edge-label-bg" x="183.4" y="165.0" width="58.2" height="22" rx="3" />
|
||||
<text class="edge-label" x="212.5" y="180.0">바꿔 적는다</text>
|
||||
<g id="node-prose">
|
||||
<rect class="node-shape kind-component emphasis-warning role-source" data-evidence="598-610" x="70.0" y="60.0" width="237.0" height="71.0" rx="7" />
|
||||
<text class="node-label" x="188.5" y="87.0">산문으로 적힌 측정 장치</text>
|
||||
<line class="node-detail-divider" x1="84.0" y1="108.0" x2="293.0" y2="108.0" />
|
||||
<text class="node-detail" x="86.0" y="125.0">( curl ... ) & 를 20개 띄우고 wait</text>
|
||||
</g>
|
||||
<g id="node-command">
|
||||
<rect class="node-shape kind-component emphasis-normal role-control" data-evidence="598-614" x="113.5" y="227.0" width="150.0" height="64.0" rx="7" />
|
||||
<text class="node-label" x="188.5" y="257.0">셸 표현식</text>
|
||||
</g>
|
||||
<g id="node-execute">
|
||||
<rect class="node-shape kind-process emphasis-primary role-control" data-evidence="615-622" x="113.5" y="387.0" width="150.0" height="71.0" rx="7" />
|
||||
<text class="node-label" x="188.5" y="414.0">실제 실행 확인</text>
|
||||
<line class="node-detail-divider" x1="127.5" y1="435.0" x2="249.5" y2="435.0" />
|
||||
<text class="node-detail" x="129.5" y="452.0">일회성 파드의 출력 유실</text>
|
||||
</g>
|
||||
<g id="node-verified">
|
||||
<rect class="node-shape kind-component emphasis-primary role-target" data-evidence="615-622" x="113.5" y="554.0" width="150.0" height="71.0" rx="7" />
|
||||
<text class="node-label" x="188.5" y="581.0">재현 가능</text>
|
||||
<line class="node-detail-divider" x1="127.5" y1="602.0" x2="249.5" y2="602.0" />
|
||||
<text class="node-detail" x="129.5" y="619.0">상주 탐침으로 20/20</text>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 6.9 KiB |
Reference in New Issue
Block a user