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>
763 lines
17 KiB
Plaintext
763 lines
17 KiB
Plaintext
{
|
|
"type": "excalidraw",
|
|
"version": 2,
|
|
"source": "techviz-harness",
|
|
"elements": [
|
|
{
|
|
"id": "edge-k0-store",
|
|
"type": "arrow",
|
|
"x": 745.0,
|
|
"y": 211.0,
|
|
"width": 255.0,
|
|
"height": 127.5,
|
|
"angle": 0,
|
|
"strokeColor": "#1e1e1e",
|
|
"backgroundColor": "transparent",
|
|
"fillStyle": "solid",
|
|
"strokeWidth": 2,
|
|
"strokeStyle": "solid",
|
|
"roughness": 1,
|
|
"opacity": 100,
|
|
"groupIds": [],
|
|
"frameId": null,
|
|
"index": null,
|
|
"roundness": null,
|
|
"seed": 1730127547,
|
|
"version": 1,
|
|
"versionNonce": 1574543462,
|
|
"isDeleted": false,
|
|
"boundElements": [],
|
|
"updated": 0,
|
|
"link": null,
|
|
"locked": false,
|
|
"points": [
|
|
[
|
|
255.0,
|
|
0.0
|
|
],
|
|
[
|
|
127.5,
|
|
0.0
|
|
],
|
|
[
|
|
127.5,
|
|
127.5
|
|
],
|
|
[
|
|
0.0,
|
|
127.5
|
|
]
|
|
],
|
|
"lastCommittedPoint": null,
|
|
"startBinding": {
|
|
"elementId": "node-keycloak-0",
|
|
"focus": 0,
|
|
"gap": 4
|
|
},
|
|
"endBinding": {
|
|
"elementId": "node-stores",
|
|
"focus": 0,
|
|
"gap": 4
|
|
},
|
|
"startArrowhead": null,
|
|
"endArrowhead": "arrow",
|
|
"elbowed": true
|
|
},
|
|
{
|
|
"id": "edge-label-k0-store",
|
|
"type": "text",
|
|
"x": 851.5,
|
|
"y": 262.75,
|
|
"width": 90,
|
|
"height": 24,
|
|
"angle": 0,
|
|
"strokeColor": "#1e1e1e",
|
|
"backgroundColor": "transparent",
|
|
"fillStyle": "solid",
|
|
"strokeWidth": 1,
|
|
"strokeStyle": "solid",
|
|
"roughness": 0,
|
|
"opacity": 100,
|
|
"groupIds": [],
|
|
"frameId": null,
|
|
"index": null,
|
|
"roundness": {
|
|
"type": 3
|
|
},
|
|
"seed": 665130871,
|
|
"version": 1,
|
|
"versionNonce": 521041486,
|
|
"isDeleted": false,
|
|
"boundElements": [],
|
|
"updated": 0,
|
|
"link": null,
|
|
"locked": false,
|
|
"fontSize": 13,
|
|
"fontFamily": 5,
|
|
"text": "같은 노드",
|
|
"textAlign": "center",
|
|
"verticalAlign": "middle",
|
|
"containerId": null,
|
|
"originalText": "같은 노드",
|
|
"autoResize": true,
|
|
"lineHeight": 1.25
|
|
},
|
|
{
|
|
"id": "edge-tls",
|
|
"type": "arrow",
|
|
"x": 440.0,
|
|
"y": 119.0,
|
|
"width": 55.0,
|
|
"height": 256.5,
|
|
"angle": 0,
|
|
"strokeColor": "#1e1e1e",
|
|
"backgroundColor": "transparent",
|
|
"fillStyle": "solid",
|
|
"strokeWidth": 2,
|
|
"strokeStyle": "solid",
|
|
"roughness": 1,
|
|
"opacity": 100,
|
|
"groupIds": [],
|
|
"frameId": null,
|
|
"index": null,
|
|
"roundness": null,
|
|
"seed": 34656478,
|
|
"version": 1,
|
|
"versionNonce": 1315728849,
|
|
"isDeleted": false,
|
|
"boundElements": [],
|
|
"updated": 0,
|
|
"link": null,
|
|
"locked": false,
|
|
"points": [
|
|
[
|
|
25.0,
|
|
256.5
|
|
],
|
|
[
|
|
55.0,
|
|
256.5
|
|
],
|
|
[
|
|
55.0,
|
|
0.0
|
|
],
|
|
[
|
|
0.0,
|
|
0.0
|
|
],
|
|
[
|
|
0.0,
|
|
71.5
|
|
],
|
|
[
|
|
30.0,
|
|
71.5
|
|
]
|
|
],
|
|
"lastCommittedPoint": null,
|
|
"startBinding": {
|
|
"elementId": "node-nginx",
|
|
"focus": 0,
|
|
"gap": 4
|
|
},
|
|
"endBinding": {
|
|
"elementId": "node-traefik",
|
|
"focus": 0,
|
|
"gap": 4
|
|
},
|
|
"startArrowhead": null,
|
|
"endArrowhead": "arrow",
|
|
"elbowed": true
|
|
},
|
|
{
|
|
"id": "edge-label-tls",
|
|
"type": "text",
|
|
"x": 474.0,
|
|
"y": 172.0,
|
|
"width": 90,
|
|
"height": 24,
|
|
"angle": 0,
|
|
"strokeColor": "#1e1e1e",
|
|
"backgroundColor": "transparent",
|
|
"fillStyle": "solid",
|
|
"strokeWidth": 1,
|
|
"strokeStyle": "solid",
|
|
"roughness": 0,
|
|
"opacity": 100,
|
|
"groupIds": [],
|
|
"frameId": null,
|
|
"index": null,
|
|
"roundness": {
|
|
"type": 3
|
|
},
|
|
"seed": 1419518024,
|
|
"version": 1,
|
|
"versionNonce": 1845487199,
|
|
"isDeleted": false,
|
|
"boundElements": [],
|
|
"updated": 0,
|
|
"link": null,
|
|
"locked": false,
|
|
"fontSize": 13,
|
|
"fontFamily": 5,
|
|
"text": "TLS 종단",
|
|
"textAlign": "center",
|
|
"verticalAlign": "middle",
|
|
"containerId": null,
|
|
"originalText": "TLS 종단",
|
|
"autoResize": true,
|
|
"lineHeight": 1.25
|
|
},
|
|
{
|
|
"id": "edge-to-k0",
|
|
"type": "arrow",
|
|
"x": 645.0,
|
|
"y": 199.5,
|
|
"width": 100.0,
|
|
"height": 11.5,
|
|
"angle": 0,
|
|
"strokeColor": "#1e1e1e",
|
|
"backgroundColor": "transparent",
|
|
"fillStyle": "solid",
|
|
"strokeWidth": 2,
|
|
"strokeStyle": "solid",
|
|
"roughness": 1,
|
|
"opacity": 100,
|
|
"groupIds": [],
|
|
"frameId": null,
|
|
"index": null,
|
|
"roundness": null,
|
|
"seed": 930868227,
|
|
"version": 1,
|
|
"versionNonce": 940573977,
|
|
"isDeleted": false,
|
|
"boundElements": [],
|
|
"updated": 0,
|
|
"link": null,
|
|
"locked": false,
|
|
"points": [
|
|
[
|
|
0.0,
|
|
0.0
|
|
],
|
|
[
|
|
50.0,
|
|
0.0
|
|
],
|
|
[
|
|
50.0,
|
|
11.5
|
|
],
|
|
[
|
|
100.0,
|
|
11.5
|
|
]
|
|
],
|
|
"lastCommittedPoint": null,
|
|
"startBinding": {
|
|
"elementId": "node-traefik",
|
|
"focus": 0,
|
|
"gap": 4
|
|
},
|
|
"endBinding": {
|
|
"elementId": "node-keycloak-0",
|
|
"focus": 0,
|
|
"gap": 4
|
|
},
|
|
"startArrowhead": null,
|
|
"endArrowhead": "arrow",
|
|
"elbowed": true
|
|
},
|
|
{
|
|
"id": "edge-label-to-k0",
|
|
"type": "text",
|
|
"x": 674.0,
|
|
"y": 193.25,
|
|
"width": 90,
|
|
"height": 24,
|
|
"angle": 0,
|
|
"strokeColor": "#1e1e1e",
|
|
"backgroundColor": "transparent",
|
|
"fillStyle": "solid",
|
|
"strokeWidth": 1,
|
|
"strokeStyle": "solid",
|
|
"roughness": 0,
|
|
"opacity": 100,
|
|
"groupIds": [],
|
|
"frameId": null,
|
|
"index": null,
|
|
"roundness": {
|
|
"type": 3
|
|
},
|
|
"seed": 486820483,
|
|
"version": 1,
|
|
"versionNonce": 571745661,
|
|
"isDeleted": false,
|
|
"boundElements": [],
|
|
"updated": 0,
|
|
"link": null,
|
|
"locked": false,
|
|
"fontSize": 13,
|
|
"fontFamily": 5,
|
|
"text": "라우팅",
|
|
"textAlign": "center",
|
|
"verticalAlign": "middle",
|
|
"containerId": null,
|
|
"originalText": "라우팅",
|
|
"autoResize": true,
|
|
"lineHeight": 1.25
|
|
},
|
|
{
|
|
"id": "edge-to-k1",
|
|
"type": "arrow",
|
|
"x": 645.0,
|
|
"y": 86.0,
|
|
"width": 100.0,
|
|
"height": 95.5,
|
|
"angle": 0,
|
|
"strokeColor": "#1e1e1e",
|
|
"backgroundColor": "transparent",
|
|
"fillStyle": "solid",
|
|
"strokeWidth": 2,
|
|
"strokeStyle": "solid",
|
|
"roughness": 1,
|
|
"opacity": 100,
|
|
"groupIds": [],
|
|
"frameId": null,
|
|
"index": null,
|
|
"roundness": null,
|
|
"seed": 1690094151,
|
|
"version": 1,
|
|
"versionNonce": 610738559,
|
|
"isDeleted": false,
|
|
"boundElements": [],
|
|
"updated": 0,
|
|
"link": null,
|
|
"locked": false,
|
|
"points": [
|
|
[
|
|
0.0,
|
|
95.5
|
|
],
|
|
[
|
|
50.0,
|
|
95.5
|
|
],
|
|
[
|
|
50.0,
|
|
0.0
|
|
],
|
|
[
|
|
100.0,
|
|
0.0
|
|
]
|
|
],
|
|
"lastCommittedPoint": null,
|
|
"startBinding": {
|
|
"elementId": "node-traefik",
|
|
"focus": 0,
|
|
"gap": 4
|
|
},
|
|
"endBinding": {
|
|
"elementId": "node-keycloak-1",
|
|
"focus": 0,
|
|
"gap": 4
|
|
},
|
|
"startArrowhead": null,
|
|
"endArrowhead": "arrow",
|
|
"elbowed": true
|
|
},
|
|
{
|
|
"id": "edge-label-to-k1",
|
|
"type": "text",
|
|
"x": 674.0,
|
|
"y": 121.75,
|
|
"width": 90,
|
|
"height": 24,
|
|
"angle": 0,
|
|
"strokeColor": "#1e1e1e",
|
|
"backgroundColor": "transparent",
|
|
"fillStyle": "solid",
|
|
"strokeWidth": 1,
|
|
"strokeStyle": "solid",
|
|
"roughness": 0,
|
|
"opacity": 100,
|
|
"groupIds": [],
|
|
"frameId": null,
|
|
"index": null,
|
|
"roundness": {
|
|
"type": 3
|
|
},
|
|
"seed": 1144438771,
|
|
"version": 1,
|
|
"versionNonce": 717340575,
|
|
"isDeleted": false,
|
|
"boundElements": [],
|
|
"updated": 0,
|
|
"link": null,
|
|
"locked": false,
|
|
"fontSize": 13,
|
|
"fontFamily": 5,
|
|
"text": "라우팅",
|
|
"textAlign": "center",
|
|
"verticalAlign": "middle",
|
|
"containerId": null,
|
|
"originalText": "라우팅",
|
|
"autoResize": true,
|
|
"lineHeight": 1.25
|
|
},
|
|
{
|
|
"id": "node-traefik",
|
|
"type": "rectangle",
|
|
"x": 470.0,
|
|
"y": 155.0,
|
|
"width": 175.0,
|
|
"height": 71.0,
|
|
"angle": 0,
|
|
"strokeColor": "#1e1e1e",
|
|
"backgroundColor": "#fff4e6",
|
|
"fillStyle": "solid",
|
|
"strokeWidth": 2,
|
|
"strokeStyle": "solid",
|
|
"roughness": 1,
|
|
"opacity": 100,
|
|
"groupIds": [],
|
|
"frameId": null,
|
|
"index": null,
|
|
"roundness": {
|
|
"type": 3
|
|
},
|
|
"seed": 1004362376,
|
|
"version": 1,
|
|
"versionNonce": 1434039951,
|
|
"isDeleted": false,
|
|
"boundElements": [],
|
|
"updated": 0,
|
|
"link": null,
|
|
"locked": false
|
|
},
|
|
{
|
|
"id": "node-label-traefik",
|
|
"type": "text",
|
|
"x": 480.0,
|
|
"y": 165.0,
|
|
"width": 155.0,
|
|
"height": 51.0,
|
|
"angle": 0,
|
|
"strokeColor": "#1e1e1e",
|
|
"backgroundColor": "transparent",
|
|
"fillStyle": "solid",
|
|
"strokeWidth": 1,
|
|
"strokeStyle": "solid",
|
|
"roughness": 0,
|
|
"opacity": 100,
|
|
"groupIds": [],
|
|
"frameId": null,
|
|
"index": null,
|
|
"roundness": {
|
|
"type": 3
|
|
},
|
|
"seed": 1067358536,
|
|
"version": 1,
|
|
"versionNonce": 1366351535,
|
|
"isDeleted": false,
|
|
"boundElements": [],
|
|
"updated": 0,
|
|
"link": null,
|
|
"locked": false,
|
|
"fontSize": 15,
|
|
"fontFamily": 5,
|
|
"text": "traefik (kc-lab-1)\nk3s server 노드",
|
|
"textAlign": "center",
|
|
"verticalAlign": "middle",
|
|
"containerId": null,
|
|
"originalText": "traefik (kc-lab-1)\nk3s server 노드",
|
|
"autoResize": true,
|
|
"lineHeight": 1.25
|
|
},
|
|
{
|
|
"id": "node-keycloak-1",
|
|
"type": "rectangle",
|
|
"x": 745.0,
|
|
"y": 40.0,
|
|
"width": 255.0,
|
|
"height": 92.0,
|
|
"angle": 0,
|
|
"strokeColor": "#1e1e1e",
|
|
"backgroundColor": "#ffffff",
|
|
"fillStyle": "solid",
|
|
"strokeWidth": 2,
|
|
"strokeStyle": "solid",
|
|
"roughness": 1,
|
|
"opacity": 100,
|
|
"groupIds": [],
|
|
"frameId": null,
|
|
"index": null,
|
|
"roundness": {
|
|
"type": 3
|
|
},
|
|
"seed": 1492679290,
|
|
"version": 1,
|
|
"versionNonce": 684109252,
|
|
"isDeleted": false,
|
|
"boundElements": [],
|
|
"updated": 0,
|
|
"link": null,
|
|
"locked": false
|
|
},
|
|
{
|
|
"id": "node-label-keycloak-1",
|
|
"type": "text",
|
|
"x": 755.0,
|
|
"y": 50.0,
|
|
"width": 235.0,
|
|
"height": 72.0,
|
|
"angle": 0,
|
|
"strokeColor": "#1e1e1e",
|
|
"backgroundColor": "transparent",
|
|
"fillStyle": "solid",
|
|
"strokeWidth": 1,
|
|
"strokeStyle": "solid",
|
|
"roughness": 0,
|
|
"opacity": 100,
|
|
"groupIds": [],
|
|
"frameId": null,
|
|
"index": null,
|
|
"roundness": {
|
|
"type": 3
|
|
},
|
|
"seed": 186685213,
|
|
"version": 1,
|
|
"versionNonce": 935977296,
|
|
"isDeleted": false,
|
|
"boundElements": [],
|
|
"updated": 0,
|
|
"link": null,
|
|
"locked": false,
|
|
"fontSize": 15,
|
|
"fontFamily": 5,
|
|
"text": "keycloak-1\nkc-lab-1",
|
|
"textAlign": "center",
|
|
"verticalAlign": "middle",
|
|
"containerId": null,
|
|
"originalText": "keycloak-1\nkc-lab-1",
|
|
"autoResize": true,
|
|
"lineHeight": 1.25
|
|
},
|
|
{
|
|
"id": "node-keycloak-0",
|
|
"type": "rectangle",
|
|
"x": 745.0,
|
|
"y": 165.0,
|
|
"width": 255.0,
|
|
"height": 92.0,
|
|
"angle": 0,
|
|
"strokeColor": "#1e1e1e",
|
|
"backgroundColor": "#ffffff",
|
|
"fillStyle": "solid",
|
|
"strokeWidth": 2,
|
|
"strokeStyle": "solid",
|
|
"roughness": 1,
|
|
"opacity": 100,
|
|
"groupIds": [],
|
|
"frameId": null,
|
|
"index": null,
|
|
"roundness": {
|
|
"type": 3
|
|
},
|
|
"seed": 969396610,
|
|
"version": 1,
|
|
"versionNonce": 1478355734,
|
|
"isDeleted": false,
|
|
"boundElements": [],
|
|
"updated": 0,
|
|
"link": null,
|
|
"locked": false
|
|
},
|
|
{
|
|
"id": "node-label-keycloak-0",
|
|
"type": "text",
|
|
"x": 755.0,
|
|
"y": 175.0,
|
|
"width": 235.0,
|
|
"height": 72.0,
|
|
"angle": 0,
|
|
"strokeColor": "#1e1e1e",
|
|
"backgroundColor": "transparent",
|
|
"fillStyle": "solid",
|
|
"strokeWidth": 1,
|
|
"strokeStyle": "solid",
|
|
"roughness": 0,
|
|
"opacity": 100,
|
|
"groupIds": [],
|
|
"frameId": null,
|
|
"index": null,
|
|
"roundness": {
|
|
"type": 3
|
|
},
|
|
"seed": 293436436,
|
|
"version": 1,
|
|
"versionNonce": 1829861746,
|
|
"isDeleted": false,
|
|
"boundElements": [],
|
|
"updated": 0,
|
|
"link": null,
|
|
"locked": false,
|
|
"fontSize": 15,
|
|
"fontFamily": 5,
|
|
"text": "keycloak-0\nkc-lab-2",
|
|
"textAlign": "center",
|
|
"verticalAlign": "middle",
|
|
"containerId": null,
|
|
"originalText": "keycloak-0\nkc-lab-2",
|
|
"autoResize": true,
|
|
"lineHeight": 1.25
|
|
},
|
|
{
|
|
"id": "node-stores",
|
|
"type": "rectangle",
|
|
"x": 745.0,
|
|
"y": 290.0,
|
|
"width": 255.0,
|
|
"height": 97.0,
|
|
"angle": 0,
|
|
"strokeColor": "#1e1e1e",
|
|
"backgroundColor": "#e7f5ff",
|
|
"fillStyle": "solid",
|
|
"strokeWidth": 2,
|
|
"strokeStyle": "solid",
|
|
"roughness": 1,
|
|
"opacity": 100,
|
|
"groupIds": [],
|
|
"frameId": null,
|
|
"index": null,
|
|
"roundness": {
|
|
"type": 3
|
|
},
|
|
"seed": 1711725683,
|
|
"version": 1,
|
|
"versionNonce": 127709791,
|
|
"isDeleted": false,
|
|
"boundElements": [],
|
|
"updated": 0,
|
|
"link": null,
|
|
"locked": false
|
|
},
|
|
{
|
|
"id": "node-label-stores",
|
|
"type": "text",
|
|
"x": 755.0,
|
|
"y": 300.0,
|
|
"width": 235.0,
|
|
"height": 77.0,
|
|
"angle": 0,
|
|
"strokeColor": "#1e1e1e",
|
|
"backgroundColor": "transparent",
|
|
"fillStyle": "solid",
|
|
"strokeWidth": 1,
|
|
"strokeStyle": "solid",
|
|
"roughness": 0,
|
|
"opacity": 100,
|
|
"groupIds": [],
|
|
"frameId": null,
|
|
"index": null,
|
|
"roundness": {
|
|
"type": 3
|
|
},
|
|
"seed": 640597826,
|
|
"version": 1,
|
|
"versionNonce": 1221007761,
|
|
"isDeleted": false,
|
|
"boundElements": [],
|
|
"updated": 0,
|
|
"link": null,
|
|
"locked": false,
|
|
"fontSize": 15,
|
|
"fontFamily": 5,
|
|
"text": "PostgreSQL · Redis\nkc-lab-2",
|
|
"textAlign": "center",
|
|
"verticalAlign": "middle",
|
|
"containerId": null,
|
|
"originalText": "PostgreSQL · Redis\nkc-lab-2",
|
|
"autoResize": true,
|
|
"lineHeight": 1.25
|
|
},
|
|
{
|
|
"id": "node-nginx",
|
|
"type": "rectangle",
|
|
"x": 270.0,
|
|
"y": 340.0,
|
|
"width": 195.0,
|
|
"height": 71.0,
|
|
"angle": 0,
|
|
"strokeColor": "#1e1e1e",
|
|
"backgroundColor": "#fff4e6",
|
|
"fillStyle": "solid",
|
|
"strokeWidth": 2,
|
|
"strokeStyle": "solid",
|
|
"roughness": 1,
|
|
"opacity": 100,
|
|
"groupIds": [],
|
|
"frameId": null,
|
|
"index": null,
|
|
"roundness": {
|
|
"type": 3
|
|
},
|
|
"seed": 721013300,
|
|
"version": 1,
|
|
"versionNonce": 1520646945,
|
|
"isDeleted": false,
|
|
"boundElements": [],
|
|
"updated": 0,
|
|
"link": null,
|
|
"locked": false
|
|
},
|
|
{
|
|
"id": "node-label-nginx",
|
|
"type": "text",
|
|
"x": 280.0,
|
|
"y": 350.0,
|
|
"width": 175.0,
|
|
"height": 51.0,
|
|
"angle": 0,
|
|
"strokeColor": "#1e1e1e",
|
|
"backgroundColor": "transparent",
|
|
"fillStyle": "solid",
|
|
"strokeWidth": 1,
|
|
"strokeStyle": "solid",
|
|
"roughness": 0,
|
|
"opacity": 100,
|
|
"groupIds": [],
|
|
"frameId": null,
|
|
"index": null,
|
|
"roundness": {
|
|
"type": 3
|
|
},
|
|
"seed": 117243520,
|
|
"version": 1,
|
|
"versionNonce": 936748041,
|
|
"isDeleted": false,
|
|
"boundElements": [],
|
|
"updated": 0,
|
|
"link": null,
|
|
"locked": false,
|
|
"fontSize": 15,
|
|
"fontFamily": 5,
|
|
"text": "호스트 nginx\nSAN: auth · app1 · app2",
|
|
"textAlign": "center",
|
|
"verticalAlign": "middle",
|
|
"containerId": null,
|
|
"originalText": "호스트 nginx\nSAN: auth · app1 · app2",
|
|
"autoResize": true,
|
|
"lineHeight": 1.25
|
|
}
|
|
],
|
|
"appState": {
|
|
"gridSize": 10,
|
|
"viewBackgroundColor": "#ffffff",
|
|
"currentItemFontFamily": 5
|
|
},
|
|
"files": {}
|
|
}
|