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:
DongHyeonka
2026-09-05 11:03:10 +09:00
co-authored by Claude Opus 5
parent b2963105a8
commit 75bed382c8
286 changed files with 65385 additions and 710 deletions
@@ -0,0 +1,152 @@
{
"version": "1.1",
"id": "not-applicable-conditions",
"title": "이 기록이 적용되지 않는 조건",
"question": "이 결론들을 언제 그대로 쓰면 안 되는가",
"type": "architecture",
"direction": "TB",
"audience": [
"이 기록을 자기 환경에 옮기려는 엔지니어"
],
"summary": "버전, 캐시 온도, 인스턴스 수, 프록시 설정, 시계 동기 다섯 가지가 결론을 바꾼다.",
"alt": "다섯 가지 전제가 각각 어떤 결론을 무효로 만드는지 이어진 구성.",
"long_description": "Keycloak 26 미만이면 persistent-user-sessions 가 기본이 아니라 A층 결론 중 셋이 뒤집힌다. volatile 에서는 캐시가 더운지 찬지가 DB 정지 시의 동작을 가른다. 인스턴스가 하나면 B층 질문 자체가 생기지 않는다. oauth2-proxy 에서 cookie-refresh 를 켜면 TTL 역산 정리 규칙이 무너진다. 그리고 이 실험대는 106초 시계 왜곡이 있었고 여기 적힌 수치는 그것을 보정한 값이다.",
"source_context": {
"document": "docs/keycloak-session-store/final/document.md",
"document_sha256": "1d44cba1905544d92f1d26ae36a8deb64a3db3914d6b488fd30d6ae7f8cfbabe",
"anchor": {
"kind": "heading",
"value": "이 기록이 적용되지 않는 조건",
"line": 689
}
},
"composition": {
"profile": "component-flow",
"diagram_only": true,
"reference_ids": [
"payment-event-flow"
],
"rationale": "어떤 전제가 어떤 결론을 무효로 만드는가가 지배적 질문이다. 조건의 사슬이므로 component-flow 를 골랐다."
},
"groups": [],
"nodes": [
{
"id": "version",
"label": "Keycloak 버전",
"kind": "component",
"role": "source",
"emphasis": "warning",
"description": "26 미만이면 세션의 거처가 다르다.",
"details": [
"A층 결론 중 셋이 뒤집힌다"
],
"evidence": [
{
"start_line": 684,
"end_line": 690
}
],
"assumption": false
},
{
"id": "cache",
"label": "캐시 온도",
"kind": "component",
"role": "control",
"emphasis": "warning",
"description": "volatile 에서 DB 정지 시의 동작을 가른다.",
"details": [
"400 · 500 · 200"
],
"evidence": [
{
"start_line": 684,
"end_line": 692
}
],
"assumption": false
},
{
"id": "instances",
"label": "인스턴스 수",
"kind": "component",
"role": "control",
"emphasis": "normal",
"description": "하나면 B층 질문이 생기지 않는다.",
"details": [],
"evidence": [
{
"start_line": 684,
"end_line": 694
}
],
"assumption": false
},
{
"id": "clock",
"label": "시계 동기",
"kind": "component",
"role": "target",
"emphasis": "warning",
"description": "이 수치들은 106초 보정을 거친 값이다.",
"details": [
"NTP 미동기 환경"
],
"evidence": [
{
"start_line": 684,
"end_line": 696
}
],
"assumption": false
}
],
"edges": [
{
"id": "v-c",
"from": "version",
"to": "cache",
"label": "버전이 먼저다",
"kind": "request",
"evidence": [
{
"start_line": 684,
"end_line": 690
}
],
"assumption": false
},
{
"id": "c-i",
"from": "cache",
"to": "instances",
"label": "그 다음",
"kind": "request",
"evidence": [
{
"start_line": 684,
"end_line": 694
}
],
"assumption": false
},
{
"id": "i-cl",
"from": "instances",
"to": "clock",
"label": "수치를 읽을 때",
"kind": "request",
"evidence": [
{
"start_line": 684,
"end_line": 696
}
],
"assumption": false
}
],
"legend": [],
"metadata": {
"rationale": "적용 조건을 목록이 아니라 무엇을 무효로 만드는가로 이었다."
}
}