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>
152 lines
4.3 KiB
JSON
152 lines
4.3 KiB
JSON
{
|
|
"version": "1.1",
|
|
"id": "reproducibility-gap",
|
|
"title": "명령으로 적는 것과 도는 것",
|
|
"question": "절차를 명령으로 적으면 재현이 보장되는가",
|
|
"type": "architecture",
|
|
"direction": "TB",
|
|
"audience": [
|
|
"실험 절차를 문서로 남기는 엔지니어"
|
|
],
|
|
"summary": "문법이 멀쩡해도 조용히 실패한다. 바꾼 명령을 실제로 돌려봐야 안다.",
|
|
"alt": "산문으로 적힌 측정 장치를 셸 표현식으로 바꾸고, 그것을 실행해 확인하는 단계까지 거치는 경로.",
|
|
"long_description": "절차를 명령으로 적었지만 측정 장치 자체가 산문인 자리가 남아 있었다. 22.2초라는 헤드라인을 만든 부하 생성기가 실행 가능한 형태가 아니었고, RPO 측정의 로그인 루프와 sid 대조도 그랬으며, A-8 은 파일 하나에 쓰고 다른 파일을 읽고 있었다. 전부 셸 표현식으로 바꾸고 실제로 돌려서 확인했다. 그 확인에서 A-6 의 부하 생성기가 깨졌다. 일회성 파드의 출력 스트림이 유실됐고 상주 탐침에 파일로 모아 20/20 을 확인했다.",
|
|
"source_context": {
|
|
"document": "docs/keycloak-session-store/final/document.md",
|
|
"document_sha256": "1d44cba1905544d92f1d26ae36a8deb64a3db3914d6b488fd30d6ae7f8cfbabe",
|
|
"anchor": {
|
|
"kind": "heading",
|
|
"value": "재현 가능성을 어떻게 보장했나",
|
|
"line": 660
|
|
}
|
|
},
|
|
"composition": {
|
|
"profile": "component-flow",
|
|
"diagram_only": true,
|
|
"reference_ids": [
|
|
"payment-event-flow"
|
|
],
|
|
"rationale": "적힌 절차가 실제로 도는가를 무엇이 보장하는가가 지배적 질문이다. 검증 사슬이므로 component-flow 를 골랐다."
|
|
},
|
|
"groups": [],
|
|
"nodes": [
|
|
{
|
|
"id": "prose",
|
|
"label": "산문으로 적힌 측정 장치",
|
|
"kind": "component",
|
|
"role": "source",
|
|
"emphasis": "warning",
|
|
"description": "괄호와 설명으로 남아 있었다.",
|
|
"details": [
|
|
"( curl ... ) & 를 20개 띄우고 wait"
|
|
],
|
|
"evidence": [
|
|
{
|
|
"start_line": 598,
|
|
"end_line": 610
|
|
}
|
|
],
|
|
"assumption": false
|
|
},
|
|
{
|
|
"id": "command",
|
|
"label": "셸 표현식",
|
|
"kind": "component",
|
|
"role": "control",
|
|
"emphasis": "normal",
|
|
"description": "붙여넣으면 도는 형태.",
|
|
"details": [],
|
|
"evidence": [
|
|
{
|
|
"start_line": 598,
|
|
"end_line": 614
|
|
}
|
|
],
|
|
"assumption": false
|
|
},
|
|
{
|
|
"id": "execute",
|
|
"label": "실제 실행 확인",
|
|
"kind": "process",
|
|
"role": "control",
|
|
"emphasis": "primary",
|
|
"description": "여기서 한 건이 깨졌다.",
|
|
"details": [
|
|
"일회성 파드의 출력 유실"
|
|
],
|
|
"evidence": [
|
|
{
|
|
"start_line": 615,
|
|
"end_line": 622
|
|
}
|
|
],
|
|
"assumption": false
|
|
},
|
|
{
|
|
"id": "verified",
|
|
"label": "재현 가능",
|
|
"kind": "component",
|
|
"role": "target",
|
|
"emphasis": "primary",
|
|
"description": "실행까지 확인된 것만.",
|
|
"details": [
|
|
"상주 탐침으로 20/20"
|
|
],
|
|
"evidence": [
|
|
{
|
|
"start_line": 615,
|
|
"end_line": 622
|
|
}
|
|
],
|
|
"assumption": false
|
|
}
|
|
],
|
|
"edges": [
|
|
{
|
|
"id": "p-c",
|
|
"from": "prose",
|
|
"to": "command",
|
|
"label": "바꿔 적는다",
|
|
"kind": "request",
|
|
"evidence": [
|
|
{
|
|
"start_line": 598,
|
|
"end_line": 614
|
|
}
|
|
],
|
|
"assumption": false
|
|
},
|
|
{
|
|
"id": "c-e",
|
|
"from": "command",
|
|
"to": "execute",
|
|
"label": "돌려본다",
|
|
"kind": "request",
|
|
"evidence": [
|
|
{
|
|
"start_line": 615,
|
|
"end_line": 622
|
|
}
|
|
],
|
|
"assumption": false
|
|
},
|
|
{
|
|
"id": "e-v",
|
|
"from": "execute",
|
|
"to": "verified",
|
|
"label": "통과한 것만 남긴다",
|
|
"kind": "request",
|
|
"evidence": [
|
|
{
|
|
"start_line": 615,
|
|
"end_line": 622
|
|
}
|
|
],
|
|
"assumption": false
|
|
}
|
|
],
|
|
"legend": [],
|
|
"metadata": {
|
|
"rationale": "산문에서 명령으로, 명령에서 실행 확인으로 두 단계를 그렸다. 두 번째 단계에서 한 건이 깨졌다."
|
|
}
|
|
} |