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
+22
@@ -0,0 +1,22 @@
|
||||
# 명령으로 적는 것과 도는 것
|
||||
|
||||
## Alternative text
|
||||
|
||||
산문으로 적힌 측정 장치를 셸 표현식으로 바꾸고, 그것을 실행해 확인하는 단계까지 거치는 경로.
|
||||
|
||||
## Long description
|
||||
|
||||
절차를 명령으로 적었지만 측정 장치 자체가 산문인 자리가 남아 있었다. 22.2초라는 헤드라인을 만든 부하 생성기가 실행 가능한 형태가 아니었고, RPO 측정의 로그인 루프와 sid 대조도 그랬으며, A-8 은 파일 하나에 쓰고 다른 파일을 읽고 있었다. 전부 셸 표현식으로 바꾸고 실제로 돌려서 확인했다. 그 확인에서 A-6 의 부하 생성기가 깨졌다. 일회성 파드의 출력 스트림이 유실됐고 상주 탐침에 파일로 모아 20/20 을 확인했다.
|
||||
|
||||
## Elements and evidence
|
||||
|
||||
- **산문으로 적힌 측정 장치** (component): 괄호와 설명으로 남아 있었다. Evidence: L598–L610.
|
||||
- **셸 표현식** (component): 붙여넣으면 도는 형태. Evidence: L598–L614.
|
||||
- **실제 실행 확인** (process): 여기서 한 건이 깨졌다. Evidence: L615–L622.
|
||||
- **재현 가능** (component): 실행까지 확인된 것만. Evidence: L615–L622.
|
||||
|
||||
## Relationships
|
||||
|
||||
- **셸 표현식 → 실제 실행 확인:** 돌려본다. Evidence: L615–L622.
|
||||
- **실제 실행 확인 → 재현 가능:** 통과한 것만 남긴다. Evidence: L615–L622.
|
||||
- **산문으로 적힌 측정 장치 → 셸 표현식:** 바꿔 적는다. Evidence: L598–L614.
|
||||
@@ -0,0 +1,18 @@
|
||||
# 명령으로 적는 것과 도는 것
|
||||
# Question: 절차를 명령으로 적으면 재현이 보장되는가
|
||||
direction: down
|
||||
n0: "산문으로 적힌 측정 장치" {
|
||||
shape: rectangle
|
||||
}
|
||||
n1: "셸 표현식" {
|
||||
shape: rectangle
|
||||
}
|
||||
n2: "실제 실행 확인" {
|
||||
shape: rectangle
|
||||
}
|
||||
n3: "재현 가능" {
|
||||
shape: rectangle
|
||||
}
|
||||
n0 -> n1: "바꿔 적는다"
|
||||
n1 -> n2: "돌려본다"
|
||||
n2 -> n3: "통과한 것만 남긴다"
|
||||
@@ -0,0 +1,12 @@
|
||||
digraph techviz {
|
||||
graph [rankdir=TB, splines=ortho, nodesep=0.55, ranksep=0.85];
|
||||
node [fontname=Helvetica, fontsize=11, margin="0.18,0.12", style="rounded,filled", fillcolor=white, color="#2d4357", penwidth=1.5];
|
||||
edge [fontname=Helvetica, fontsize=10, color="#364b5f", penwidth=1.4, arrowsize=0.75];
|
||||
n0 [label="산문으로 적힌 측정 장치", shape=box, style="rounded,filled"];
|
||||
n1 [label="셸 표현식", shape=box, style="rounded,filled"];
|
||||
n2 [label="실제 실행 확인", shape=box, style="rounded,filled"];
|
||||
n3 [label="재현 가능", shape=box, style="rounded,filled"];
|
||||
n0 -> n1 [label="바꿔 적는다", style=solid];
|
||||
n1 -> n2 [label="돌려본다", style=solid];
|
||||
n2 -> n3 [label="통과한 것만 남긴다", style=solid];
|
||||
}
|
||||
+38
@@ -0,0 +1,38 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<mxfile host="app.diagrams.net" modified="2026-07-23T00:00:00.000Z" agent="techviz-harness" version="24.7.17" type="device">
|
||||
<diagram id="reproducibility-gap" name="명령으로 적는 것과 도는 것">
|
||||
<mxGraphModel dx="680" dy="670" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
|
||||
<root>
|
||||
<mxCell id="0"/>
|
||||
<mxCell id="1" parent="0"/>
|
||||
<mxCell id="n_prose" value="산문으로 적힌 측정 장치<br/>( curl ... ) & 를 20개 띄우고 wait" tooltip="괄호와 설명으로 남아 있었다. | Evidence: L598-L610" 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="70.0" y="60.0" width="237.0" height="71.0" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="n_command" value="셸 표현식" tooltip="붙여넣으면 도는 형태. | Evidence: L598-L614" style="whiteSpace=wrap;html=1;rounded=1;strokeWidth=2;fontSize=14;fontStyle=1;fillColor=#ffffff;strokeColor=#2d4357;verticalAlign=middle;" vertex="1" parent="1">
|
||||
<mxGeometry x="113.5" y="227.0" width="150.0" height="64.0" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="n_execute" value="실제 실행 확인<br/>일회성 파드의 출력 유실" tooltip="여기서 한 건이 깨졌다. | Evidence: L615-L622" 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="113.5" y="387.0" width="150.0" height="71.0" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="n_verified" value="재현 가능<br/>상주 탐침으로 20/20" tooltip="실행까지 확인된 것만. | Evidence: L615-L622" 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="113.5" y="554.0" width="150.0" height="71.0" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="e_c-e" value="돌려본다" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=2;endArrow=block;endFill=1;" edge="1" parent="1" source="n_command" target="n_execute">
|
||||
<mxGeometry relative="1" as="geometry">
|
||||
<mxPoint x="212.5" y="339.0" as="offset"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="e_e-v" value="통과한 것만 남긴다" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=2;endArrow=block;endFill=1;" edge="1" parent="1" source="n_execute" target="n_verified">
|
||||
<mxGeometry relative="1" as="geometry">
|
||||
<mxPoint x="212.5" y="506.0" as="offset"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="e_p-c" value="바꿔 적는다" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=2;endArrow=block;endFill=1;" edge="1" parent="1" source="n_prose" target="n_command">
|
||||
<mxGeometry relative="1" as="geometry">
|
||||
<mxPoint x="212.5" y="179.0" as="offset"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
</root>
|
||||
</mxGraphModel>
|
||||
</diagram>
|
||||
</mxfile>
|
||||
+586
@@ -0,0 +1,586 @@
|
||||
{
|
||||
"type": "excalidraw",
|
||||
"version": 2,
|
||||
"source": "techviz-harness",
|
||||
"elements": [
|
||||
{
|
||||
"id": "edge-c-e",
|
||||
"type": "arrow",
|
||||
"x": 188.5,
|
||||
"y": 291.0,
|
||||
"width": 0.0,
|
||||
"height": 96.0,
|
||||
"angle": 0,
|
||||
"strokeColor": "#1e1e1e",
|
||||
"backgroundColor": "transparent",
|
||||
"fillStyle": "solid",
|
||||
"strokeWidth": 2,
|
||||
"strokeStyle": "solid",
|
||||
"roughness": 1,
|
||||
"opacity": 100,
|
||||
"groupIds": [],
|
||||
"frameId": null,
|
||||
"index": null,
|
||||
"roundness": null,
|
||||
"seed": 1513220568,
|
||||
"version": 1,
|
||||
"versionNonce": 255748168,
|
||||
"isDeleted": false,
|
||||
"boundElements": [],
|
||||
"updated": 0,
|
||||
"link": null,
|
||||
"locked": false,
|
||||
"points": [
|
||||
[
|
||||
0.0,
|
||||
0.0
|
||||
],
|
||||
[
|
||||
0.0,
|
||||
48.0
|
||||
],
|
||||
[
|
||||
0.0,
|
||||
48.0
|
||||
],
|
||||
[
|
||||
0.0,
|
||||
96.0
|
||||
]
|
||||
],
|
||||
"lastCommittedPoint": null,
|
||||
"startBinding": {
|
||||
"elementId": "node-command",
|
||||
"focus": 0,
|
||||
"gap": 4
|
||||
},
|
||||
"endBinding": {
|
||||
"elementId": "node-execute",
|
||||
"focus": 0,
|
||||
"gap": 4
|
||||
},
|
||||
"startArrowhead": null,
|
||||
"endArrowhead": "arrow",
|
||||
"elbowed": true
|
||||
},
|
||||
{
|
||||
"id": "edge-label-c-e",
|
||||
"type": "text",
|
||||
"x": 167.5,
|
||||
"y": 327.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": 809267409,
|
||||
"version": 1,
|
||||
"versionNonce": 1101078427,
|
||||
"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-e-v",
|
||||
"type": "arrow",
|
||||
"x": 188.5,
|
||||
"y": 458.0,
|
||||
"width": 0.0,
|
||||
"height": 96.0,
|
||||
"angle": 0,
|
||||
"strokeColor": "#1e1e1e",
|
||||
"backgroundColor": "transparent",
|
||||
"fillStyle": "solid",
|
||||
"strokeWidth": 2,
|
||||
"strokeStyle": "solid",
|
||||
"roughness": 1,
|
||||
"opacity": 100,
|
||||
"groupIds": [],
|
||||
"frameId": null,
|
||||
"index": null,
|
||||
"roundness": null,
|
||||
"seed": 128041634,
|
||||
"version": 1,
|
||||
"versionNonce": 1430378644,
|
||||
"isDeleted": false,
|
||||
"boundElements": [],
|
||||
"updated": 0,
|
||||
"link": null,
|
||||
"locked": false,
|
||||
"points": [
|
||||
[
|
||||
0.0,
|
||||
0.0
|
||||
],
|
||||
[
|
||||
0.0,
|
||||
48.0
|
||||
],
|
||||
[
|
||||
0.0,
|
||||
48.0
|
||||
],
|
||||
[
|
||||
0.0,
|
||||
96.0
|
||||
]
|
||||
],
|
||||
"lastCommittedPoint": null,
|
||||
"startBinding": {
|
||||
"elementId": "node-execute",
|
||||
"focus": 0,
|
||||
"gap": 4
|
||||
},
|
||||
"endBinding": {
|
||||
"elementId": "node-verified",
|
||||
"focus": 0,
|
||||
"gap": 4
|
||||
},
|
||||
"startArrowhead": null,
|
||||
"endArrowhead": "arrow",
|
||||
"elbowed": true
|
||||
},
|
||||
{
|
||||
"id": "edge-label-e-v",
|
||||
"type": "text",
|
||||
"x": 167.5,
|
||||
"y": 494.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": 1353837138,
|
||||
"version": 1,
|
||||
"versionNonce": 579442242,
|
||||
"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-p-c",
|
||||
"type": "arrow",
|
||||
"x": 188.5,
|
||||
"y": 131.0,
|
||||
"width": 0.0,
|
||||
"height": 96.0,
|
||||
"angle": 0,
|
||||
"strokeColor": "#1e1e1e",
|
||||
"backgroundColor": "transparent",
|
||||
"fillStyle": "solid",
|
||||
"strokeWidth": 2,
|
||||
"strokeStyle": "solid",
|
||||
"roughness": 1,
|
||||
"opacity": 100,
|
||||
"groupIds": [],
|
||||
"frameId": null,
|
||||
"index": null,
|
||||
"roundness": null,
|
||||
"seed": 1092142442,
|
||||
"version": 1,
|
||||
"versionNonce": 1067509802,
|
||||
"isDeleted": false,
|
||||
"boundElements": [],
|
||||
"updated": 0,
|
||||
"link": null,
|
||||
"locked": false,
|
||||
"points": [
|
||||
[
|
||||
0.0,
|
||||
0.0
|
||||
],
|
||||
[
|
||||
0.0,
|
||||
48.0
|
||||
],
|
||||
[
|
||||
0.0,
|
||||
48.0
|
||||
],
|
||||
[
|
||||
0.0,
|
||||
96.0
|
||||
]
|
||||
],
|
||||
"lastCommittedPoint": null,
|
||||
"startBinding": {
|
||||
"elementId": "node-prose",
|
||||
"focus": 0,
|
||||
"gap": 4
|
||||
},
|
||||
"endBinding": {
|
||||
"elementId": "node-command",
|
||||
"focus": 0,
|
||||
"gap": 4
|
||||
},
|
||||
"startArrowhead": null,
|
||||
"endArrowhead": "arrow",
|
||||
"elbowed": true
|
||||
},
|
||||
{
|
||||
"id": "edge-label-p-c",
|
||||
"type": "text",
|
||||
"x": 167.5,
|
||||
"y": 167.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": 1465048076,
|
||||
"version": 1,
|
||||
"versionNonce": 96904623,
|
||||
"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-prose",
|
||||
"type": "rectangle",
|
||||
"x": 70.0,
|
||||
"y": 60.0,
|
||||
"width": 237.0,
|
||||
"height": 71.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": 826601902,
|
||||
"version": 1,
|
||||
"versionNonce": 4271171,
|
||||
"isDeleted": false,
|
||||
"boundElements": [],
|
||||
"updated": 0,
|
||||
"link": null,
|
||||
"locked": false
|
||||
},
|
||||
{
|
||||
"id": "node-label-prose",
|
||||
"type": "text",
|
||||
"x": 80.0,
|
||||
"y": 70.0,
|
||||
"width": 217.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": 76587276,
|
||||
"version": 1,
|
||||
"versionNonce": 1816784595,
|
||||
"isDeleted": false,
|
||||
"boundElements": [],
|
||||
"updated": 0,
|
||||
"link": null,
|
||||
"locked": false,
|
||||
"fontSize": 15,
|
||||
"fontFamily": 5,
|
||||
"text": "산문으로 적힌 측정 장치\n( curl ... ) & 를 20개 띄우고 wait",
|
||||
"textAlign": "center",
|
||||
"verticalAlign": "middle",
|
||||
"containerId": null,
|
||||
"originalText": "산문으로 적힌 측정 장치\n( curl ... ) & 를 20개 띄우고 wait",
|
||||
"autoResize": true,
|
||||
"lineHeight": 1.25
|
||||
},
|
||||
{
|
||||
"id": "node-command",
|
||||
"type": "rectangle",
|
||||
"x": 113.5,
|
||||
"y": 227.0,
|
||||
"width": 150.0,
|
||||
"height": 64.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": 1956089356,
|
||||
"version": 1,
|
||||
"versionNonce": 1918729941,
|
||||
"isDeleted": false,
|
||||
"boundElements": [],
|
||||
"updated": 0,
|
||||
"link": null,
|
||||
"locked": false
|
||||
},
|
||||
{
|
||||
"id": "node-label-command",
|
||||
"type": "text",
|
||||
"x": 123.5,
|
||||
"y": 237.0,
|
||||
"width": 130.0,
|
||||
"height": 44.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": 829075040,
|
||||
"version": 1,
|
||||
"versionNonce": 1236911514,
|
||||
"isDeleted": false,
|
||||
"boundElements": [],
|
||||
"updated": 0,
|
||||
"link": null,
|
||||
"locked": false,
|
||||
"fontSize": 15,
|
||||
"fontFamily": 5,
|
||||
"text": "셸 표현식",
|
||||
"textAlign": "center",
|
||||
"verticalAlign": "middle",
|
||||
"containerId": null,
|
||||
"originalText": "셸 표현식",
|
||||
"autoResize": true,
|
||||
"lineHeight": 1.25
|
||||
},
|
||||
{
|
||||
"id": "node-execute",
|
||||
"type": "rectangle",
|
||||
"x": 113.5,
|
||||
"y": 387.0,
|
||||
"width": 150.0,
|
||||
"height": 71.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": 567962482,
|
||||
"version": 1,
|
||||
"versionNonce": 1529598817,
|
||||
"isDeleted": false,
|
||||
"boundElements": [],
|
||||
"updated": 0,
|
||||
"link": null,
|
||||
"locked": false
|
||||
},
|
||||
{
|
||||
"id": "node-label-execute",
|
||||
"type": "text",
|
||||
"x": 123.5,
|
||||
"y": 397.0,
|
||||
"width": 130.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": 1413737284,
|
||||
"version": 1,
|
||||
"versionNonce": 818240909,
|
||||
"isDeleted": false,
|
||||
"boundElements": [],
|
||||
"updated": 0,
|
||||
"link": null,
|
||||
"locked": false,
|
||||
"fontSize": 15,
|
||||
"fontFamily": 5,
|
||||
"text": "실제 실행 확인\n일회성 파드의 출력 유실",
|
||||
"textAlign": "center",
|
||||
"verticalAlign": "middle",
|
||||
"containerId": null,
|
||||
"originalText": "실제 실행 확인\n일회성 파드의 출력 유실",
|
||||
"autoResize": true,
|
||||
"lineHeight": 1.25
|
||||
},
|
||||
{
|
||||
"id": "node-verified",
|
||||
"type": "rectangle",
|
||||
"x": 113.5,
|
||||
"y": 554.0,
|
||||
"width": 150.0,
|
||||
"height": 71.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": 1763885420,
|
||||
"version": 1,
|
||||
"versionNonce": 946588663,
|
||||
"isDeleted": false,
|
||||
"boundElements": [],
|
||||
"updated": 0,
|
||||
"link": null,
|
||||
"locked": false
|
||||
},
|
||||
{
|
||||
"id": "node-label-verified",
|
||||
"type": "text",
|
||||
"x": 123.5,
|
||||
"y": 564.0,
|
||||
"width": 130.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": 1492977970,
|
||||
"version": 1,
|
||||
"versionNonce": 1733623573,
|
||||
"isDeleted": false,
|
||||
"boundElements": [],
|
||||
"updated": 0,
|
||||
"link": null,
|
||||
"locked": false,
|
||||
"fontSize": 15,
|
||||
"fontFamily": 5,
|
||||
"text": "재현 가능\n상주 탐침으로 20/20",
|
||||
"textAlign": "center",
|
||||
"verticalAlign": "middle",
|
||||
"containerId": null,
|
||||
"originalText": "재현 가능\n상주 탐침으로 20/20",
|
||||
"autoResize": true,
|
||||
"lineHeight": 1.25
|
||||
}
|
||||
],
|
||||
"appState": {
|
||||
"gridSize": 10,
|
||||
"viewBackgroundColor": "#ffffff",
|
||||
"currentItemFontFamily": 5
|
||||
},
|
||||
"files": {}
|
||||
}
|
||||
+32
@@ -0,0 +1,32 @@
|
||||
{
|
||||
"harness_version": "0.2.0",
|
||||
"spec_id": "reproducibility-gap",
|
||||
"spec_version": "1.1",
|
||||
"spec_sha256": "f869b1dec58438616a980ae048ea5c43e8f56634949eaddb25d06057728c008f",
|
||||
"source_context": {
|
||||
"document": "docs/keycloak-session-store/final/document.md",
|
||||
"document_sha256": "1d44cba1905544d92f1d26ae36a8deb64a3db3914d6b488fd30d6ae7f8cfbabe",
|
||||
"anchor": {
|
||||
"kind": "heading",
|
||||
"value": "재현 가능성을 어떻게 보장했나",
|
||||
"line": 660
|
||||
}
|
||||
},
|
||||
"outputs": [
|
||||
"reproducibility-gap.svg",
|
||||
"reproducibility-gap.mmd",
|
||||
"reproducibility-gap.d2",
|
||||
"reproducibility-gap.dot",
|
||||
"reproducibility-gap.drawio",
|
||||
"reproducibility-gap.excalidraw",
|
||||
"reproducibility-gap.alt.md"
|
||||
],
|
||||
"lint_issue_count": 0,
|
||||
"assumption_count": 0,
|
||||
"assumptions_allowed": false,
|
||||
"composition_profile": "component-flow",
|
||||
"reference_ids": [
|
||||
"payment-event-flow"
|
||||
],
|
||||
"diagram_only": true
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
%% 명령으로 적는 것과 도는 것
|
||||
%% question: 절차를 명령으로 적으면 재현이 보장되는가
|
||||
flowchart TB
|
||||
n0["산문으로 적힌 측정 장치"]
|
||||
n1["셸 표현식"]
|
||||
n2["실제 실행 확인"]
|
||||
n3["재현 가능"]
|
||||
n0 -->|"바꿔 적는다"| n1
|
||||
n1 -->|"돌려본다"| n2
|
||||
n2 -->|"통과한 것만 남긴다"| n3
|
||||
@@ -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