docs(keycloak-session-store): take the sentences out of the diagram canvases

The skill says drawings carry names and sentences go in <desc> and the
paragraph beside the figure. I put sentences in node details and edge labels
instead, and 27 of the 28 diagrams shipped with prose inside the canvas —
"예측 다섯 개가 틀렸다", "아홉 번 조용히 실패했다", "막혀서 닿지 않는다".

Only label and details render on the canvas; description does not. So every
sentence moved to a noun phrase and the meaning stays in description, which
was already carrying it.

  막혀서 닿지 않는다              -> 차단
  아홉 번 조용히 실패했다         -> 조용한 실패 9건
  예측 다섯 개가 틀렸다           -> 틀린 예측 5건
  로그아웃이 정리하지 않는다      -> 로그아웃 미정리
  볼륨이 없으면 여기까지다        -> 볼륨 없음

Three node labels were sentences too and became names: 세션 스냅샷, 예측
선기록, 대조군 확보.

What stays is what the rules protect — identifiers, commands and measured
values: PRIMARY KEY (client_registration_id, principal_name),
ValidationFailedException: 1 changesets check sum, nginx -t && nginx -s
reload, SET LOCAL synchronous_commit TO OFF. Those are names of things, not
prose about them.

294 canvas strings across 28 diagrams, none matching a sentence ending,
average 11 characters. All 28 still lint clean and re-rendered.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
DongHyeonka
2026-09-05 11:50:33 +09:00
co-authored by Claude Opus 5
parent 75bed382c8
commit 95c0e680b5
221 changed files with 1156 additions and 1152 deletions
@@ -17,7 +17,7 @@ certbot renew 는 archive 디렉터리에 새 인증서를 쓰고 live 심볼릭
## Relationships
- **live/fullchain.pem → nginx 워커:** reload 없이는 닿지 않는다. Evidence: L536L540.
- **live/fullchain.pem → nginx 워커:** reload 필요. Evidence: L536L540.
- **renewal-hooks/deploy → nginx 워커:** reload 신호. Evidence: L556L562.
- **certbot renew → renewal-hooks/deploy:** 갱신 성공 시 호출. Evidence: L527L533.
- **certbot renew → live/fullchain.pem:** 새 인증서 기록. Evidence: L504L510.
@@ -14,6 +14,6 @@ n3: "nginx 워커" {
shape: rectangle
}
n0 -> n1: "새 인증서 기록"
n1 -> n3: "reload 없이는 닿지 않는다"
n1 -> n3: "reload 필요"
n0 -> n2: "갱신 성공 시 호출"
n2 -> n3: "reload 신호"
@@ -7,7 +7,7 @@ digraph techviz {
n2 [label="renewal-hooks/deploy", shape=box, style="rounded,filled"];
n3 [label="nginx 워커", shape=box, style="rounded,filled"];
n0 -> n1 [label="새 인증서 기록", style=solid];
n1 -> n3 [label="reload 없이는 닿지 않는다", style=solid];
n1 -> n3 [label="reload 필요", style=solid];
n0 -> n2 [label="갱신 성공 시 호출", style=solid];
n2 -> n3 [label="reload 신호", style=solid];
}
@@ -11,15 +11,15 @@
<mxCell id="n_deploy-hook" value="renewal-hooks/deploy&lt;br/&gt;nginx -t &amp;&amp; nginx -s reload" tooltip="갱신이 실제로 일어났을 때만 실행된다. 이 실험대에서는 비어 있었다. | Evidence: L527-L533" style="whiteSpace=wrap;html=1;rounded=1;strokeWidth=2;fontSize=14;fontStyle=1;fillColor=#ffffff;strokeColor=#2d4357;verticalAlign=middle;strokeColor=#d97706;fillColor=#fffdf5;" vertex="1" parent="1">
<mxGeometry x="380.0" y="60.0" width="223.0" height="71.0" as="geometry"/>
</mxCell>
<mxCell id="n_live-link" value="live/fullchain.pem&lt;br/&gt;archive/cert2.pem 을 가리킨다" tooltip="심볼릭 링크. 경로는 그대로이고 가리키는 대상만 바뀐다. | Evidence: L536-L540" style="whiteSpace=wrap;html=1;rounded=1;strokeWidth=2;fontSize=14;fontStyle=1;fillColor=#ffffff;strokeColor=#2d4357;verticalAlign=middle;shape=cylinder3;boundedLbl=1;backgroundOutline=1;fillColor=#eef6fb;strokeColor=#2563eb;strokeWidth=2;" vertex="1" parent="1">
<mxGeometry x="390.5" y="203.0" width="202.0" height="97.0" as="geometry"/>
<mxCell id="n_live-link" value="live/fullchain.pem&lt;br/&gt;archive/cert2.pem" tooltip="심볼릭 링크. 경로는 그대로이고 가리키는 대상만 바뀐다. | Evidence: L536-L540" style="whiteSpace=wrap;html=1;rounded=1;strokeWidth=2;fontSize=14;fontStyle=1;fillColor=#ffffff;strokeColor=#2d4357;verticalAlign=middle;shape=cylinder3;boundedLbl=1;backgroundOutline=1;fillColor=#eef6fb;strokeColor=#2563eb;strokeWidth=2;" vertex="1" parent="1">
<mxGeometry x="408.0" y="203.0" width="167.0" height="97.0" as="geometry"/>
</mxCell>
<mxCell id="n_nginx" value="nginx 워커&lt;br/&gt;마스터 유지 · 워커 교체" tooltip="기동 시점에 읽은 인증서를 메모리에 들고 있다. reload 해야 새 워커가 새 인증서를 읽는다. | Evidence: L541-L548" style="whiteSpace=wrap;html=1;rounded=1;strokeWidth=2;fontSize=14;fontStyle=1;fillColor=#ffffff;strokeColor=#2d4357;verticalAlign=middle;strokeColor=#2563eb;strokeWidth=2;" vertex="1" parent="1">
<mxGeometry x="763.0" y="144.5" width="150.0" height="71.0" as="geometry"/>
</mxCell>
<mxCell id="e_needs-reload" value="reload 없이는 닿지 않는다" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=2;endArrow=block;endFill=1;" edge="1" parent="1" source="n_live-link" target="n_nginx">
<mxCell id="e_needs-reload" value="reload 필요" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=2;endArrow=block;endFill=1;" edge="1" parent="1" source="n_live-link" target="n_nginx">
<mxGeometry relative="1" as="geometry">
<mxPoint x="701.8" y="220.2" as="offset"/>
<mxPoint x="693.0" y="220.2" as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="e_reload" value="reload 신호" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=2;endArrow=block;endFill=1;" edge="1" parent="1" source="n_deploy-hook" target="n_nginx">
@@ -34,7 +34,7 @@
</mxCell>
<mxCell id="e_write" value="새 인증서 기록" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=2;endArrow=block;endFill=1;" edge="1" parent="1" source="n_certbot" target="n_live-link">
<mxGeometry relative="1" as="geometry">
<mxPoint x="329.2" y="220.2" as="offset"/>
<mxPoint x="338.0" y="220.2" as="offset"/>
</mxGeometry>
</mxCell>
</root>
@@ -6,9 +6,9 @@
{
"id": "edge-needs-reload",
"type": "arrow",
"x": 592.5,
"x": 575.0,
"y": 189.0,
"width": 170.5,
"width": 188.0,
"height": 62.5,
"angle": 0,
"strokeColor": "#1e1e1e",
@@ -36,15 +36,15 @@
62.5
],
[
85.25,
94.0,
62.5
],
[
85.25,
94.0,
0.0
],
[
170.5,
188.0,
0.0
]
],
@@ -66,9 +66,9 @@
{
"id": "edge-label-needs-reload",
"type": "text",
"x": 633.75,
"x": 648.0,
"y": 208.25,
"width": 136,
"width": 90,
"height": 24,
"angle": 0,
"strokeColor": "#1e1e1e",
@@ -94,11 +94,11 @@
"locked": false,
"fontSize": 13,
"fontFamily": 5,
"text": "reload 없이는 닿지 않는다",
"text": "reload 필요",
"textAlign": "center",
"verticalAlign": "middle",
"containerId": null,
"originalText": "reload 없이는 닿지 않는다",
"originalText": "reload 필요",
"autoResize": true,
"lineHeight": 1.25
},
@@ -305,7 +305,7 @@
"type": "arrow",
"x": 220.0,
"y": 189.0,
"width": 170.5,
"width": 188.0,
"height": 62.5,
"angle": 0,
"strokeColor": "#1e1e1e",
@@ -333,15 +333,15 @@
0.0
],
[
85.25,
94.0,
0.0
],
[
85.25,
94.0,
62.5
],
[
170.5,
188.0,
62.5
]
],
@@ -363,7 +363,7 @@
{
"id": "edge-label-write",
"type": "text",
"x": 284.25,
"x": 293.0,
"y": 208.25,
"width": 90,
"height": 24,
@@ -540,9 +540,9 @@
{
"id": "node-live-link",
"type": "rectangle",
"x": 390.5,
"x": 408.0,
"y": 203.0,
"width": 202.0,
"width": 167.0,
"height": 97.0,
"angle": 0,
"strokeColor": "#1e1e1e",
@@ -570,9 +570,9 @@
{
"id": "node-label-live-link",
"type": "text",
"x": 400.5,
"x": 418.0,
"y": 213.0,
"width": 182.0,
"width": 147.0,
"height": 77.0,
"angle": 0,
"strokeColor": "#1e1e1e",
@@ -598,11 +598,11 @@
"locked": false,
"fontSize": 15,
"fontFamily": 5,
"text": "live/fullchain.pem\narchive/cert2.pem 을 가리킨다",
"text": "live/fullchain.pem\narchive/cert2.pem",
"textAlign": "center",
"verticalAlign": "middle",
"containerId": null,
"originalText": "live/fullchain.pem\narchive/cert2.pem 을 가리킨다",
"originalText": "live/fullchain.pem\narchive/cert2.pem",
"autoResize": true,
"lineHeight": 1.25
},
@@ -2,7 +2,7 @@
"harness_version": "0.2.0",
"spec_id": "renewal-to-serving-gap",
"spec_version": "1.1",
"spec_sha256": "3e3db52f9abd54ed3f8d6d45e2bff22ba1c2fa312dfb8185d7d5c5c3b5ea24be",
"spec_sha256": "27876093d869fde6f95f5f296995ef24011354039da6da56a049d114068545d4",
"source_context": {
"document": "docs/keycloak-session-store/final/document.md",
"document_sha256": "609353e10bfd37a9bbb6a79ecf2a32f3d3c02d5d161879a14ad4713e49e7e5e8",
@@ -6,6 +6,6 @@ flowchart LR
n2["renewal-hooks/deploy"]
n3["nginx 워커"]
n0 -->|"새 인증서 기록"| n1
n1 -->|"reload 없이는 닿지 않는다"| n3
n1 -->|"reload 필요"| n3
n0 -->|"갱신 성공 시 호출"| n2
n2 -->|"reload 신호"| n3
@@ -50,18 +50,18 @@
</style>
</defs>
<rect class="canvas" width="958" height="345" />
<polyline class="edge kind-blocked style-solid emphasis-normal" points="592.5,251.5 677.8,251.5 677.8,189.0 763.0,189.0" data-evidence="536-540" />
<rect class="edge-label-bg" x="635.8" y="206.2" width="131.9" height="22" rx="3" />
<text class="edge-label" x="701.8" y="221.2">reload 없이는 닿지 않는다</text>
<polyline class="edge kind-blocked style-solid emphasis-normal" points="575.0,251.5 669.0,251.5 669.0,189.0 763.0,189.0" data-evidence="536-540" />
<rect class="edge-label-bg" x="653.9" y="206.2" width="78.3" height="22" rx="3" />
<text class="edge-label" x="693.0" y="221.2">reload 필요</text>
<polyline class="edge kind-request style-solid emphasis-normal" points="603.0,95.5 683.0,95.5 683.0,171.0 763.0,171.0" data-evidence="556-562" />
<rect class="edge-label-bg" x="667.9" y="119.2" width="78.3" height="22" rx="3" />
<text class="edge-label" x="707.0" y="134.2">reload 신호</text>
<polyline class="edge kind-request style-solid emphasis-normal" points="220.0,171.0 300.0,171.0 300.0,95.5 380.0,95.5" data-evidence="527-533" />
<rect class="edge-label-bg" x="281.5" y="119.2" width="85.0" height="22" rx="3" />
<text class="edge-label" x="324.0" y="134.2">갱신 성공 시 호출</text>
<polyline class="edge kind-write style-solid emphasis-normal" points="220.0,189.0 305.2,189.0 305.2,251.5 390.5,251.5" data-evidence="504-510" />
<rect class="edge-label-bg" x="293.4" y="206.2" width="71.6" height="22" rx="3" />
<text class="edge-label" x="329.2" y="221.2">새 인증서 기록</text>
<polyline class="edge kind-write style-solid emphasis-normal" points="220.0,189.0 314.0,189.0 314.0,251.5 408.0,251.5" data-evidence="504-510" />
<rect class="edge-label-bg" x="302.2" y="206.2" width="71.6" height="22" rx="3" />
<text class="edge-label" x="338.0" y="221.2">새 인증서 기록</text>
<g id="node-certbot">
<rect class="node-shape kind-process emphasis-primary role-source" data-evidence="499-504" x="70.0" y="144.5" width="150.0" height="71.0" rx="7" />
<text class="node-label" x="145.0" y="171.5">certbot renew</text>
@@ -75,10 +75,10 @@
<text class="node-detail" x="396.0" y="125.0">nginx -t &amp;&amp; nginx -s reload</text>
</g>
<g id="node-live-link">
<rect class="node-shape kind-datastore emphasis-primary role-store" data-evidence="536-540" x="390.5" y="216.0" width="202.0" height="71.0" /><ellipse class="node-shape kind-datastore emphasis-primary role-store" cx="491.5" cy="216.0" rx="101.0" ry="13.0" /><path class="storage-bottom" d="M 390.5 287.0 A 101.0 13.0 0 0 0 592.5 287.0" />
<rect class="node-shape kind-datastore emphasis-primary role-store" data-evidence="536-540" x="408.0" y="216.0" width="167.0" height="71.0" /><ellipse class="node-shape kind-datastore emphasis-primary role-store" cx="491.5" cy="216.0" rx="83.5" ry="13.0" /><path class="storage-bottom" d="M 408.0 287.0 A 83.5 13.0 0 0 0 575.0 287.0" />
<text class="node-label" x="491.5" y="243.0">live/fullchain.pem</text>
<line class="node-detail-divider" x1="404.5" y1="264.0" x2="578.5" y2="264.0" />
<text class="node-detail" x="406.5" y="281.0">archive/cert2.pem 을 가리킨다</text>
<line class="node-detail-divider" x1="422.0" y1="264.0" x2="561.0" y2="264.0" />
<text class="node-detail" x="424.0" y="281.0">archive/cert2.pem</text>
</g>
<g id="node-nginx">
<rect class="node-shape kind-service emphasis-primary role-target" data-evidence="541-548" x="763.0" y="144.5" width="150.0" height="71.0" rx="7" />

Before

Width:  |  Height:  |  Size: 7.6 KiB

After

Width:  |  Height:  |  Size: 7.6 KiB