docs(clean-architecture-backend-template): fold analysis into final and re-select one topic
- analysis/·source-index·state.json 을 final/document.md 제2부·제3부로 접었다. SSOT 는 하나다 - 파일럿 — commit-ambiguity-as-a-result 를 새 기준으로 재선별. 후보 14 → 글감 5 (PROMOTE 5 · MERGE_INTO 3 · KEEP_IN_SSOT 4 · 보류 2). 기록 5건을 다시 썼고 그림 1개를 techviz 로 만들었다 - 재선별이 잡은 것: 제1부 §6.2·§11.1 이 자기 §13.2 와 어긋나 있었다(레인을 안 돌렸다 vs 돌렸다) — 정정. 이미 답이 나와 있던 Question 을 HEAD 재실행 질문으로 다시 세웠다. Concept 이 인용한 코드가 SSOT 에 없어 뺐다 - candidateScope·sourceRepository 기록. 나머지 43개 주제는 재선별 대기(PENDING 905) Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Fable 5.1
parent
9d2a3725c5
commit
b25357c48a
+15747
File diff suppressed because one or more lines are too long
+16009
File diff suppressed because one or more lines are too long
+255
@@ -0,0 +1,255 @@
|
||||
{
|
||||
"version": "1.1",
|
||||
"id": "commit-evidence-phase-machine",
|
||||
"title": "커밋 요청 뒤의 결과 판정",
|
||||
"question": "커밋을 넘긴 뒤 어떤 관측이 어느 결과 변형으로 이어지는가?",
|
||||
"type": "flow",
|
||||
"direction": "TB",
|
||||
"audience": [
|
||||
"백엔드 엔지니어"
|
||||
],
|
||||
"summary": "COMMIT_REQUESTED 관측 뒤 provider commit 의 결과가 네 변형 중 하나로 갈라진다.",
|
||||
"alt": "커밋 요청에서 시작해 provider commit 을 거쳐 Committed, CommittedWithPostCommitFailure, DeterminateRollback, Indeterminate 네 결과로 갈라지는 흐름도",
|
||||
"long_description": "tracker 가 COMMIT_REQUESTED 를 관측한 뒤 provider commit 을 호출한다. 예외가 없으면 Committed 다. RuntimeException 이 오면 먼저 commitAcknowledged 를 보고, 이미 afterCommit 이 왔으면 CommittedWithPostCommitFailure 다. 그렇지 않으면 rolledBack 과 UnexpectedRollbackException 과 replay 후보 여부를 보고, 하나라도 성립하면 DeterminateRollback 이다. 어느 것도 성립하지 않으면 Indeterminate 로 남는다.",
|
||||
"source_context": {
|
||||
"document": "docs/clean-architecture-backend-template/final/document.md",
|
||||
"document_sha256": "74b4986fd8621f6fd61791232777dc0e6c8ef999cbc2343df050bd5921ea03ac",
|
||||
"anchor": {
|
||||
"kind": "heading",
|
||||
"value": "3.2 트랜잭션 — `application-core` 포트에서 PostgreSQL local timeout까지",
|
||||
"line": 352
|
||||
}
|
||||
},
|
||||
"composition": {
|
||||
"profile": "component-flow",
|
||||
"diagram_only": true,
|
||||
"reference_ids": [
|
||||
"payment-event-flow"
|
||||
],
|
||||
"rationale": "커밋 요청 하나가 관측 두 번을 거쳐 네 결과 중 하나로 흘러가는 방향 있는 경로다. 참여자 간 왕복이 아니라 한 방향 갈래이므로 sequence 가 아니라 component-flow 다.",
|
||||
"focus_node": "indeterminate"
|
||||
},
|
||||
"groups": [],
|
||||
"nodes": [
|
||||
{
|
||||
"id": "commit-requested",
|
||||
"label": "COMMIT_REQUESTED",
|
||||
"kind": "process",
|
||||
"role": "source",
|
||||
"evidence": [
|
||||
{
|
||||
"start_line": 397,
|
||||
"end_line": 397
|
||||
}
|
||||
],
|
||||
"assumption": false
|
||||
},
|
||||
{
|
||||
"id": "provider-commit",
|
||||
"label": "provider commit",
|
||||
"kind": "service",
|
||||
"role": "service",
|
||||
"evidence": [
|
||||
{
|
||||
"start_line": 398,
|
||||
"end_line": 400
|
||||
}
|
||||
],
|
||||
"assumption": false
|
||||
},
|
||||
{
|
||||
"id": "ack-check",
|
||||
"label": "commitAcknowledged",
|
||||
"kind": "process",
|
||||
"role": "service",
|
||||
"evidence": [
|
||||
{
|
||||
"start_line": 401,
|
||||
"end_line": 401
|
||||
}
|
||||
],
|
||||
"assumption": false
|
||||
},
|
||||
{
|
||||
"id": "rollback-check",
|
||||
"label": "rolledBack · replay 후보",
|
||||
"kind": "process",
|
||||
"role": "service",
|
||||
"evidence": [
|
||||
{
|
||||
"start_line": 404,
|
||||
"end_line": 406
|
||||
}
|
||||
],
|
||||
"assumption": false
|
||||
},
|
||||
{
|
||||
"id": "committed",
|
||||
"label": "Committed",
|
||||
"kind": "result",
|
||||
"role": "sink",
|
||||
"evidence": [
|
||||
{
|
||||
"start_line": 388,
|
||||
"end_line": 388
|
||||
},
|
||||
{
|
||||
"start_line": 396,
|
||||
"end_line": 400
|
||||
}
|
||||
],
|
||||
"assumption": false
|
||||
},
|
||||
{
|
||||
"id": "post-commit-failure",
|
||||
"label": "CommittedWithPostCommitFailure",
|
||||
"kind": "result",
|
||||
"role": "sink",
|
||||
"evidence": [
|
||||
{
|
||||
"start_line": 402,
|
||||
"end_line": 402
|
||||
}
|
||||
],
|
||||
"assumption": false
|
||||
},
|
||||
{
|
||||
"id": "determinate-rollback",
|
||||
"label": "DeterminateRollback",
|
||||
"kind": "result",
|
||||
"role": "sink",
|
||||
"evidence": [
|
||||
{
|
||||
"start_line": 407,
|
||||
"end_line": 407
|
||||
}
|
||||
],
|
||||
"assumption": false
|
||||
},
|
||||
{
|
||||
"id": "indeterminate",
|
||||
"label": "Indeterminate",
|
||||
"kind": "result",
|
||||
"role": "sink",
|
||||
"evidence": [
|
||||
{
|
||||
"start_line": 391,
|
||||
"end_line": 391
|
||||
},
|
||||
{
|
||||
"start_line": 409,
|
||||
"end_line": 409
|
||||
}
|
||||
],
|
||||
"assumption": false,
|
||||
"emphasis": "primary"
|
||||
}
|
||||
],
|
||||
"edges": [
|
||||
{
|
||||
"id": "hand-over",
|
||||
"from": "commit-requested",
|
||||
"to": "provider-commit",
|
||||
"label": "commit(status)",
|
||||
"kind": "request",
|
||||
"evidence": [
|
||||
{
|
||||
"start_line": 397,
|
||||
"end_line": 399
|
||||
}
|
||||
],
|
||||
"assumption": false
|
||||
},
|
||||
{
|
||||
"id": "no-exception",
|
||||
"from": "provider-commit",
|
||||
"to": "committed",
|
||||
"label": "예외 없음",
|
||||
"kind": "response",
|
||||
"evidence": [
|
||||
{
|
||||
"start_line": 388,
|
||||
"end_line": 388
|
||||
},
|
||||
{
|
||||
"start_line": 396,
|
||||
"end_line": 400
|
||||
}
|
||||
],
|
||||
"assumption": false
|
||||
},
|
||||
{
|
||||
"id": "runtime-exception",
|
||||
"from": "provider-commit",
|
||||
"to": "ack-check",
|
||||
"label": "RuntimeException",
|
||||
"kind": "response",
|
||||
"evidence": [
|
||||
{
|
||||
"start_line": 400,
|
||||
"end_line": 401
|
||||
}
|
||||
],
|
||||
"assumption": false
|
||||
},
|
||||
{
|
||||
"id": "already-acked",
|
||||
"from": "ack-check",
|
||||
"to": "post-commit-failure",
|
||||
"label": "afterCommit 도착",
|
||||
"kind": "data",
|
||||
"evidence": [
|
||||
{
|
||||
"start_line": 401,
|
||||
"end_line": 402
|
||||
}
|
||||
],
|
||||
"assumption": false
|
||||
},
|
||||
{
|
||||
"id": "not-acked",
|
||||
"from": "ack-check",
|
||||
"to": "rollback-check",
|
||||
"label": "미도착",
|
||||
"kind": "data",
|
||||
"evidence": [
|
||||
{
|
||||
"start_line": 403,
|
||||
"end_line": 404
|
||||
}
|
||||
],
|
||||
"assumption": false
|
||||
},
|
||||
{
|
||||
"id": "rollback-confirmed",
|
||||
"from": "rollback-check",
|
||||
"to": "determinate-rollback",
|
||||
"label": "하나라도 성립",
|
||||
"kind": "data",
|
||||
"evidence": [
|
||||
{
|
||||
"start_line": 404,
|
||||
"end_line": 407
|
||||
}
|
||||
],
|
||||
"assumption": false
|
||||
},
|
||||
{
|
||||
"id": "no-signal",
|
||||
"from": "rollback-check",
|
||||
"to": "indeterminate",
|
||||
"label": "판정 근거 없음",
|
||||
"kind": "data",
|
||||
"evidence": [
|
||||
{
|
||||
"start_line": 409,
|
||||
"end_line": 409
|
||||
}
|
||||
],
|
||||
"assumption": false,
|
||||
"emphasis": "primary"
|
||||
}
|
||||
],
|
||||
"legend": [],
|
||||
"metadata": {}
|
||||
}
|
||||
+30
@@ -0,0 +1,30 @@
|
||||
# 커밋 요청 뒤의 결과 판정
|
||||
|
||||
## Alternative text
|
||||
|
||||
커밋 요청에서 시작해 provider commit 을 거쳐 Committed, CommittedWithPostCommitFailure, DeterminateRollback, Indeterminate 네 결과로 갈라지는 흐름도
|
||||
|
||||
## Long description
|
||||
|
||||
tracker 가 COMMIT_REQUESTED 를 관측한 뒤 provider commit 을 호출한다. 예외가 없으면 Committed 다. RuntimeException 이 오면 먼저 commitAcknowledged 를 보고, 이미 afterCommit 이 왔으면 CommittedWithPostCommitFailure 다. 그렇지 않으면 rolledBack 과 UnexpectedRollbackException 과 replay 후보 여부를 보고, 하나라도 성립하면 DeterminateRollback 이다. 어느 것도 성립하지 않으면 Indeterminate 로 남는다.
|
||||
|
||||
## Elements and evidence
|
||||
|
||||
- **COMMIT_REQUESTED** (process): No additional description. Evidence: L397–L397.
|
||||
- **provider commit** (service): No additional description. Evidence: L398–L400.
|
||||
- **commitAcknowledged** (process): No additional description. Evidence: L401–L401.
|
||||
- **rolledBack · replay 후보** (process): No additional description. Evidence: L404–L406.
|
||||
- **Committed** (result): No additional description. Evidence: L388–L388, L396–L400.
|
||||
- **CommittedWithPostCommitFailure** (result): No additional description. Evidence: L402–L402.
|
||||
- **DeterminateRollback** (result): No additional description. Evidence: L407–L407.
|
||||
- **Indeterminate** (result): No additional description. Evidence: L391–L391, L409–L409.
|
||||
|
||||
## Relationships
|
||||
|
||||
- **commitAcknowledged → CommittedWithPostCommitFailure:** afterCommit 도착. Evidence: L401–L402.
|
||||
- **COMMIT_REQUESTED → provider commit:** commit(status). Evidence: L397–L399.
|
||||
- **provider commit → Committed:** 예외 없음. Evidence: L388–L388, L396–L400.
|
||||
- **rolledBack · replay 후보 → Indeterminate:** 판정 근거 없음. Evidence: L409–L409.
|
||||
- **commitAcknowledged → rolledBack · replay 후보:** 미도착. Evidence: L403–L404.
|
||||
- **rolledBack · replay 후보 → DeterminateRollback:** 하나라도 성립. Evidence: L404–L407.
|
||||
- **provider commit → commitAcknowledged:** RuntimeException. Evidence: L400–L401.
|
||||
+34
@@ -0,0 +1,34 @@
|
||||
# 커밋 요청 뒤의 결과 판정
|
||||
# Question: 커밋을 넘긴 뒤 어떤 관측이 어느 결과 변형으로 이어지는가?
|
||||
direction: down
|
||||
n0: "COMMIT_REQUESTED" {
|
||||
shape: rectangle
|
||||
}
|
||||
n1: "provider commit" {
|
||||
shape: rectangle
|
||||
}
|
||||
n2: "commitAcknowledged" {
|
||||
shape: rectangle
|
||||
}
|
||||
n3: "rolledBack · replay 후보" {
|
||||
shape: rectangle
|
||||
}
|
||||
n4: "Committed" {
|
||||
shape: rectangle
|
||||
}
|
||||
n5: "CommittedWithPostCommitFailure" {
|
||||
shape: rectangle
|
||||
}
|
||||
n6: "DeterminateRollback" {
|
||||
shape: rectangle
|
||||
}
|
||||
n7: "Indeterminate" {
|
||||
shape: rectangle
|
||||
}
|
||||
n0 -> n1: "commit(status)"
|
||||
n1 -> n4: "예외 없음"
|
||||
n1 -> n2: "RuntimeException"
|
||||
n2 -> n5: "afterCommit 도착"
|
||||
n2 -> n3: "미도착"
|
||||
n3 -> n6: "하나라도 성립"
|
||||
n3 -> n7: "판정 근거 없음"
|
||||
+28
@@ -0,0 +1,28 @@
|
||||
{
|
||||
"harness_version": "0.2.0",
|
||||
"spec_id": "commit-evidence-phase-machine",
|
||||
"spec_version": "1.1",
|
||||
"spec_sha256": "ef61ffdeb76585e9fcd01b69516054125db5a6020ce2658901abb709c52eb9d2",
|
||||
"source_context": {
|
||||
"document": "docs/clean-architecture-backend-template/final/document.md",
|
||||
"document_sha256": "74b4986fd8621f6fd61791232777dc0e6c8ef999cbc2343df050bd5921ea03ac",
|
||||
"anchor": {
|
||||
"kind": "heading",
|
||||
"value": "3.2 트랜잭션 — `application-core` 포트에서 PostgreSQL local timeout까지",
|
||||
"line": 352
|
||||
}
|
||||
},
|
||||
"outputs": [
|
||||
"commit-evidence-phase-machine.svg",
|
||||
"commit-evidence-phase-machine.d2",
|
||||
"commit-evidence-phase-machine.alt.md"
|
||||
],
|
||||
"lint_issue_count": 1,
|
||||
"assumption_count": 0,
|
||||
"assumptions_allowed": false,
|
||||
"composition_profile": "component-flow",
|
||||
"reference_ids": [
|
||||
"payment-event-flow"
|
||||
],
|
||||
"diagram_only": true
|
||||
}
|
||||
+106
@@ -0,0 +1,106 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="680" height="809" viewBox="0 0 680 809" role="img" aria-labelledby="diagram-title diagram-description">
|
||||
<title id="diagram-title">커밋 요청 뒤의 결과 판정</title>
|
||||
<desc id="diagram-description">tracker 가 COMMIT_REQUESTED 를 관측한 뒤 provider commit 을 호출한다. 예외가 없으면 Committed 다. RuntimeException 이 오면 먼저 commitAcknowledged 를 보고, 이미 afterCommit 이 왔으면 CommittedWithPostCommitFailure 다. 그렇지 않으면 rolledBack 과 UnexpectedRollbackException 과 replay 후보 여부를 보고, 하나라도 성립하면 DeterminateRollback 이다. 어느 것도 성립하지 않으면 Indeterminate 로 남는다.</desc>
|
||||
<metadata>{"techviz":{"spec_version":"1.1","id":"commit-evidence-phase-machine","profile":"component-flow"},"source_context":{"document":"docs/clean-architecture-backend-template/final/document.md","document_sha256":"74b4986fd8621f6fd61791232777dc0e6c8ef999cbc2343df050bd5921ea03ac","anchor":{"kind":"heading","value":"3.2 트랜잭션 — `application-core` 포트에서 PostgreSQL local timeout까지","line":352}},"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="809" />
|
||||
<polyline class="edge kind-data style-solid emphasis-normal" points="202.0,444.0 202.0,492.0 192.0,492.0 192.0,540.0" data-evidence="401-402" />
|
||||
<rect class="edge-label-bg" x="141.1" y="450.0" width="111.8" height="22" rx="3" />
|
||||
<text class="edge-label" x="197.0" y="465.0">afterCommit 도착</text>
|
||||
<polyline class="edge kind-request style-solid emphasis-normal" points="316.0,124.0 316.0,172.0 316.0,172.0 316.0,220.0" data-evidence="397-399" />
|
||||
<rect class="edge-label-bg" x="284.1" y="158.0" width="111.8" height="22" rx="3" />
|
||||
<text class="edge-label" x="340.0" y="173.0">commit(status)</text>
|
||||
<polyline class="edge kind-response style-solid emphasis-normal semantic-dashed" points="325.0,284.0 325.0,332.0 426.0,332.0 426.0,380.0" data-evidence="388-388,396-400" />
|
||||
<rect class="edge-label-bg" x="349.8" y="290.0" width="51.5" height="22" rx="3" />
|
||||
<text class="edge-label" x="375.5" y="305.0">예외 없음</text>
|
||||
<polyline class="edge kind-data style-solid emphasis-primary" points="477.0,604.0 477.0,652.0 429.5,652.0 429.5,700.0" data-evidence="409-409" />
|
||||
<rect class="edge-label-bg" x="417.4" y="610.0" width="71.6" height="22" rx="3" />
|
||||
<text class="edge-label" x="453.2" y="625.0">판정 근거 없음</text>
|
||||
<polyline class="edge kind-data style-solid emphasis-normal" points="220.0,444.0 220.0,492.0 468.0,492.0 468.0,540.0" data-evidence="403-404" />
|
||||
<rect class="edge-label-bg" x="322.0" y="450.0" width="44.0" height="22" rx="3" />
|
||||
<text class="edge-label" x="344.0" y="465.0">미도착</text>
|
||||
<polyline class="edge kind-data style-solid emphasis-normal" points="459.0,604.0 459.0,652.0 211.0,652.0 211.0,700.0" data-evidence="404-407" />
|
||||
<rect class="edge-label-bg" x="302.6" y="610.0" width="64.9" height="22" rx="3" />
|
||||
<text class="edge-label" x="335.0" y="625.0">하나라도 성립</text>
|
||||
<polyline class="edge kind-response style-solid emphasis-normal semantic-dashed" points="307.0,284.0 307.0,332.0 211.0,332.0 211.0,380.0" data-evidence="400-401" />
|
||||
<rect class="edge-label-bg" x="196.4" y="290.0" width="125.2" height="22" rx="3" />
|
||||
<text class="edge-label" x="259.0" y="305.0">RuntimeException</text>
|
||||
<g id="node-commit-requested">
|
||||
<rect class="node-shape kind-process emphasis-normal role-source" data-evidence="397-397" x="241.0" y="60.0" width="150.0" height="64.0" rx="7" />
|
||||
<text class="node-label" x="316.0" y="90.0">COMMIT_REQUESTED</text>
|
||||
</g>
|
||||
<g id="node-provider-commit">
|
||||
<rect class="node-shape kind-service emphasis-normal role-service" data-evidence="398-400" x="241.0" y="220.0" width="150.0" height="64.0" rx="7" />
|
||||
<text class="node-label" x="316.0" y="250.0">provider commit</text>
|
||||
</g>
|
||||
<g id="node-ack-check">
|
||||
<rect class="node-shape kind-process emphasis-normal role-service" data-evidence="401-401" x="131.0" y="380.0" width="160.0" height="64.0" rx="7" />
|
||||
<text class="node-label" x="211.0" y="410.0">commitAcknowledged</text>
|
||||
</g>
|
||||
<g id="node-committed">
|
||||
<rect class="node-shape kind-result emphasis-normal role-sink" data-evidence="388-388,396-400" x="351.0" y="380.0" width="150.0" height="64.0" rx="7" />
|
||||
<text class="node-label" x="426.0" y="410.0">Committed</text>
|
||||
</g>
|
||||
<g id="node-post-commit-failure">
|
||||
<rect class="node-shape kind-result emphasis-normal role-sink" data-evidence="402-402" x="70.0" y="540.0" width="244.0" height="64.0" rx="7" />
|
||||
<text class="node-label" x="192.0" y="570.0">CommittedWithPostCommitFailure</text>
|
||||
</g>
|
||||
<g id="node-rollback-check">
|
||||
<rect class="node-shape kind-process emphasis-normal role-service" data-evidence="404-406" x="374.0" y="540.0" width="188.0" height="64.0" rx="7" />
|
||||
<text class="node-label" x="468.0" y="570.0">rolledBack · replay 후보</text>
|
||||
</g>
|
||||
<g id="node-determinate-rollback">
|
||||
<rect class="node-shape kind-result emphasis-normal role-sink" data-evidence="407-407" x="127.5" y="700.0" width="167.0" height="64.0" rx="7" />
|
||||
<text class="node-label" x="211.0" y="730.0">DeterminateRollback</text>
|
||||
</g>
|
||||
<g id="node-indeterminate">
|
||||
<rect class="node-shape kind-result emphasis-primary role-sink" data-evidence="391-391,409-409" x="354.5" y="700.0" width="150.0" height="64.0" rx="7" />
|
||||
<text class="node-label" x="429.5" y="730.0">Indeterminate</text>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 8.6 KiB |
+106
@@ -0,0 +1,106 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="680" height="809" viewBox="0 0 680 809" role="img" aria-labelledby="diagram-title diagram-description">
|
||||
<title id="diagram-title">커밋 요청 뒤의 결과 판정</title>
|
||||
<desc id="diagram-description">tracker 가 COMMIT_REQUESTED 를 관측한 뒤 provider commit 을 호출한다. 예외가 없으면 Committed 다. RuntimeException 이 오면 먼저 commitAcknowledged 를 보고, 이미 afterCommit 이 왔으면 CommittedWithPostCommitFailure 다. 그렇지 않으면 rolledBack 과 UnexpectedRollbackException 과 replay 후보 여부를 보고, 하나라도 성립하면 DeterminateRollback 이다. 어느 것도 성립하지 않으면 Indeterminate 로 남는다.</desc>
|
||||
<metadata>{"techviz":{"spec_version":"1.1","id":"commit-evidence-phase-machine","profile":"component-flow"},"source_context":{"document":"docs/clean-architecture-backend-template/final/document.md","document_sha256":"74b4986fd8621f6fd61791232777dc0e6c8ef999cbc2343df050bd5921ea03ac","anchor":{"kind":"heading","value":"3.2 트랜잭션 — `application-core` 포트에서 PostgreSQL local timeout까지","line":352}},"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="809" />
|
||||
<polyline class="edge kind-data style-solid emphasis-normal" points="202.0,444.0 202.0,492.0 192.0,492.0 192.0,540.0" data-evidence="401-402" />
|
||||
<rect class="edge-label-bg" x="141.1" y="450.0" width="111.8" height="22" rx="3" />
|
||||
<text class="edge-label" x="197.0" y="465.0">afterCommit 도착</text>
|
||||
<polyline class="edge kind-request style-solid emphasis-normal" points="316.0,124.0 316.0,172.0 316.0,172.0 316.0,220.0" data-evidence="397-399" />
|
||||
<rect class="edge-label-bg" x="284.1" y="158.0" width="111.8" height="22" rx="3" />
|
||||
<text class="edge-label" x="340.0" y="173.0">commit(status)</text>
|
||||
<polyline class="edge kind-response style-solid emphasis-normal semantic-dashed" points="325.0,284.0 325.0,332.0 426.0,332.0 426.0,380.0" data-evidence="388-388,396-400" />
|
||||
<rect class="edge-label-bg" x="349.8" y="290.0" width="51.5" height="22" rx="3" />
|
||||
<text class="edge-label" x="375.5" y="305.0">예외 없음</text>
|
||||
<polyline class="edge kind-data style-solid emphasis-primary" points="477.0,604.0 477.0,652.0 429.5,652.0 429.5,700.0" data-evidence="409-409" />
|
||||
<rect class="edge-label-bg" x="417.4" y="610.0" width="71.6" height="22" rx="3" />
|
||||
<text class="edge-label" x="453.2" y="625.0">판정 근거 없음</text>
|
||||
<polyline class="edge kind-data style-solid emphasis-normal" points="220.0,444.0 220.0,492.0 468.0,492.0 468.0,540.0" data-evidence="403-404" />
|
||||
<rect class="edge-label-bg" x="322.0" y="450.0" width="44.0" height="22" rx="3" />
|
||||
<text class="edge-label" x="344.0" y="465.0">미도착</text>
|
||||
<polyline class="edge kind-data style-solid emphasis-normal" points="459.0,604.0 459.0,652.0 211.0,652.0 211.0,700.0" data-evidence="404-407" />
|
||||
<rect class="edge-label-bg" x="302.6" y="610.0" width="64.9" height="22" rx="3" />
|
||||
<text class="edge-label" x="335.0" y="625.0">하나라도 성립</text>
|
||||
<polyline class="edge kind-response style-solid emphasis-normal semantic-dashed" points="307.0,284.0 307.0,332.0 211.0,332.0 211.0,380.0" data-evidence="400-401" />
|
||||
<rect class="edge-label-bg" x="196.4" y="290.0" width="125.2" height="22" rx="3" />
|
||||
<text class="edge-label" x="259.0" y="305.0">RuntimeException</text>
|
||||
<g id="node-commit-requested">
|
||||
<rect class="node-shape kind-process emphasis-normal role-source" data-evidence="397-397" x="241.0" y="60.0" width="150.0" height="64.0" rx="7" />
|
||||
<text class="node-label" x="316.0" y="90.0">COMMIT_REQUESTED</text>
|
||||
</g>
|
||||
<g id="node-provider-commit">
|
||||
<rect class="node-shape kind-service emphasis-normal role-service" data-evidence="398-400" x="241.0" y="220.0" width="150.0" height="64.0" rx="7" />
|
||||
<text class="node-label" x="316.0" y="250.0">provider commit</text>
|
||||
</g>
|
||||
<g id="node-ack-check">
|
||||
<rect class="node-shape kind-process emphasis-normal role-service" data-evidence="401-401" x="131.0" y="380.0" width="160.0" height="64.0" rx="7" />
|
||||
<text class="node-label" x="211.0" y="410.0">commitAcknowledged</text>
|
||||
</g>
|
||||
<g id="node-committed">
|
||||
<rect class="node-shape kind-result emphasis-normal role-sink" data-evidence="388-388,396-400" x="351.0" y="380.0" width="150.0" height="64.0" rx="7" />
|
||||
<text class="node-label" x="426.0" y="410.0">Committed</text>
|
||||
</g>
|
||||
<g id="node-post-commit-failure">
|
||||
<rect class="node-shape kind-result emphasis-normal role-sink" data-evidence="402-402" x="70.0" y="540.0" width="244.0" height="64.0" rx="7" />
|
||||
<text class="node-label" x="192.0" y="570.0">CommittedWithPostCommitFailure</text>
|
||||
</g>
|
||||
<g id="node-rollback-check">
|
||||
<rect class="node-shape kind-process emphasis-normal role-service" data-evidence="404-406" x="374.0" y="540.0" width="188.0" height="64.0" rx="7" />
|
||||
<text class="node-label" x="468.0" y="570.0">rolledBack · replay 후보</text>
|
||||
</g>
|
||||
<g id="node-determinate-rollback">
|
||||
<rect class="node-shape kind-result emphasis-normal role-sink" data-evidence="407-407" x="127.5" y="700.0" width="167.0" height="64.0" rx="7" />
|
||||
<text class="node-label" x="211.0" y="730.0">DeterminateRollback</text>
|
||||
</g>
|
||||
<g id="node-indeterminate">
|
||||
<rect class="node-shape kind-result emphasis-primary role-sink" data-evidence="391-391,409-409" x="354.5" y="700.0" width="150.0" height="64.0" rx="7" />
|
||||
<text class="node-label" x="429.5" y="730.0">Indeterminate</text>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 8.6 KiB |
File diff suppressed because it is too large
Load Diff
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "a17-f002-stomp",
|
||||
"kind": "terminal",
|
||||
"command": "set -e\nset -o pipefail\nW=src/adapter/inbound/websocket/src/main/java/dev/caskeleton/adapter/inbound/websocket\nstrip() { sed -E 's#^src/[^:]*/websocket/([^:]*/)?([^:/]+):([0-9]+):# \\2:\\3 #'; }\ncut_range() { awk -v f=\"$2\" -v a=\"$3\" -v b=\"$4\" 'NR>=a && NR<=b {printf \" %s:%d %s\\n\", f, NR, $0}' \"$1\"; }\n\necho \"# ca-skeleton.websocket 어댑터가 등록하는 인터셉터 둘\"\nfor f in AuthenticatedHandshakeInterceptor WebSocketInboundAuthorizationInterceptor; do\n printf \" %-44s %s 줄\\n\" \"$f.java\" \"$(wc -l < $W/stomp/$f.java)\"\ndone\nawk 'NR>=30 && NR<=60 && (/Interceptor/ || /addInterceptors/ || /configureClientInboundChannel/ || /ConditionalOnProperty/) {printf \" stomp/WebSocketConfig.java:%d %s\\n\", NR, $0}' $W/stomp/WebSocketConfig.java\n\necho\necho \"# 같은 채널에 붙는 세 번째 인터셉터와 그 게이트\"\nprintf \" %-44s %s 줄\\n\" \"advanced/stomp/StompSecurityInterceptor.java\" \"$(wc -l < $W/advanced/stomp/StompSecurityInterceptor.java)\"\ncut_range $W/advanced/stomp/StompConfiguration.java advanced/stomp/StompConfiguration.java 24 27\nawk 'NR>=33 && NR<=41 && (/securityInterceptor/ || /configureClientInboundChannel/) {printf \" advanced/stomp/StompConfiguration.java:%d %s\\n\", NR, $0}' $W/advanced/stomp/StompConfiguration.java\n\necho\necho \"# 이 모듈이 출하 런타임 그래프에 있는가\"\nawk 'NR>=196 && NR<=200 {printf \" app-bootstrap/build.gradle:%d %s\\n\", NR, $0}' src/app-bootstrap/build.gradle\ncut_range src/adapter/inbound/websocket/CLAUDE.md websocket/CLAUDE.md 21 23\n\necho\necho \"# 정책 계층 — 네 패키지의 파일과 선언 형태와 줄 수\"\nfor d in security authz idempotency budget; do\n for f in $(find $W/$d -name '*.java' | sort); do\n k=$(grep -oE 'public (final class|record|enum|interface|class)' $f | head -1 || true)\n printf \" %-12s %-38s %-16s %s 줄\\n\" \"$d\" \"$(basename $f)\" \"${k#public }\" \"$(wc -l < $f)\"\n done\ndone\nprintf \" 합계 %s 파일\\n\" \"$(find $W/security $W/authz $W/idempotency $W/budget -name '*.java' | wc -l)\"\n\necho\necho \"# 그 열 타입을 stomp 패키지가 참조하는가, 그리고 어디서 생성되는가\"\nfor f in $(find $W/security $W/authz $W/idempotency $W/budget -name '*.java' | sed 's|.*/||;s|\\.java$||' | sort); do\n s=$(grep -rl \"\\b$f\\b\" $W/stomp 2>/dev/null | wc -l || true)\n n=$(git grep -c \"new $f(\" -- 'src/**/*.java' 2>/dev/null | grep '/main/' | wc -l || true)\n b=$(git grep -l \"$f \" -- 'src/**/*.java' 2>/dev/null | grep '/main/' | xargs grep -l '@Bean' 2>/dev/null | wc -l || true)\n printf \" %-34s stomp참조=%s main생성=%s 같은파일에@Bean있는main=%s\\n\" \"$f\" \"$s\" \"$n\" \"$b\"\ndone\n\necho\necho \"# 원문이 22 로 적은 수의 출처\"\ngrep -n '^# Sub-scope 04' /shared/document-detail/clean-architecture-backend-template/analysis/17-adapter-inbound-websocket.md \\\n | cut -c1-150 | sed 's#^# analysis/17:#'\nt=0; for d in security authz idempotency budget error observability admin release; do\n n=$(find $W/$d -name '*.java' | wc -l); t=$((t+n)); printf \" %-14s %s\\n\" \"$d\" \"$n\"\ndone\necho \" 여덟 패키지 합계 $t\"\n\necho\necho \"# MessageAuthorizationPolicy 를 받는 자리와 그 받는 쪽의 생성자\"\ngrep -n 'public ' $W/authz/MessageAuthorizationPolicy.java | sed -E 's#^([0-9]+): *# authz/MessageAuthorizationPolicy.java:\\1 #'\ngit grep -n 'MessageAuthorizationPolicy' -- 'src/**/*.java' | grep '/main/' | grep -v '/MessageAuthorizationPolicy.java' | strip\ngrep -n 'public WebSocketPlatformStartupValidator\\|public void validate\\|undeclaredAmong' $W/config/WebSocketPlatformStartupValidator.java \\\n | sed -E 's#^([0-9]+): *# config/WebSocketPlatformStartupValidator.java:\\1 #'\ngit grep -n 'new WebSocketPlatformStartupValidator(' -- 'src/**/*.java' | strip\n\necho\necho \"# 리프의 CLAUDE.md 가 적는 범위와 인바운드 정책 절 전체\"\ncut_range src/adapter/inbound/websocket/CLAUDE.md websocket/CLAUDE.md 15 18\ncut_range src/adapter/inbound/websocket/CLAUDE.md websocket/CLAUDE.md 52 60\n",
|
||||
"command": "set -e\nset -o pipefail\nW=src/adapter/inbound/websocket/src/main/java/dev/caskeleton/adapter/inbound/websocket\nstrip() { sed -E 's#^src/[^:]*/websocket/([^:]*/)?([^:/]+):([0-9]+):# \\2:\\3 #'; }\ncut_range() { awk -v f=\"$2\" -v a=\"$3\" -v b=\"$4\" 'NR>=a && NR<=b {printf \" %s:%d %s\\n\", f, NR, $0}' \"$1\"; }\n\necho \"# ca-skeleton.websocket 어댑터가 등록하는 인터셉터 둘\"\nfor f in AuthenticatedHandshakeInterceptor WebSocketInboundAuthorizationInterceptor; do\n printf \" %-44s %s 줄\\n\" \"$f.java\" \"$(wc -l < $W/stomp/$f.java)\"\ndone\nawk 'NR>=30 && NR<=60 && (/Interceptor/ || /addInterceptors/ || /configureClientInboundChannel/ || /ConditionalOnProperty/) {printf \" stomp/WebSocketConfig.java:%d %s\\n\", NR, $0}' $W/stomp/WebSocketConfig.java\n\necho\necho \"# 같은 채널에 붙는 세 번째 인터셉터와 그 게이트\"\nprintf \" %-44s %s 줄\\n\" \"advanced/stomp/StompSecurityInterceptor.java\" \"$(wc -l < $W/advanced/stomp/StompSecurityInterceptor.java)\"\ncut_range $W/advanced/stomp/StompConfiguration.java advanced/stomp/StompConfiguration.java 24 27\nawk 'NR>=33 && NR<=41 && (/securityInterceptor/ || /configureClientInboundChannel/) {printf \" advanced/stomp/StompConfiguration.java:%d %s\\n\", NR, $0}' $W/advanced/stomp/StompConfiguration.java\n\necho\necho \"# 이 모듈이 출하 런타임 그래프에 있는가\"\nawk 'NR>=196 && NR<=200 {printf \" app-bootstrap/build.gradle:%d %s\\n\", NR, $0}' src/app-bootstrap/build.gradle\ncut_range src/adapter/inbound/websocket/CLAUDE.md websocket/CLAUDE.md 21 23\n\necho\necho \"# 정책 계층 — 네 패키지의 파일과 선언 형태와 줄 수\"\nfor d in security authz idempotency budget; do\n for f in $(find $W/$d -name '*.java' | sort); do\n k=$(grep -oE 'public (final class|record|enum|interface|class)' $f | head -1 || true)\n printf \" %-12s %-38s %-16s %s 줄\\n\" \"$d\" \"$(basename $f)\" \"${k#public }\" \"$(wc -l < $f)\"\n done\ndone\nprintf \" 합계 %s 파일\\n\" \"$(find $W/security $W/authz $W/idempotency $W/budget -name '*.java' | wc -l)\"\n\necho\necho \"# 그 열 타입을 stomp 패키지가 참조하는가, 그리고 어디서 생성되는가\"\nfor f in $(find $W/security $W/authz $W/idempotency $W/budget -name '*.java' | sed 's|.*/||;s|\\.java$||' | sort); do\n s=$(grep -rl \"\\b$f\\b\" $W/stomp 2>/dev/null | wc -l || true)\n n=$(git grep -c \"new $f(\" -- 'src/**/*.java' 2>/dev/null | grep '/main/' | wc -l || true)\n b=$(git grep -l \"$f \" -- 'src/**/*.java' 2>/dev/null | grep '/main/' | xargs grep -l '@Bean' 2>/dev/null | wc -l || true)\n printf \" %-34s stomp참조=%s main생성=%s 같은파일에@Bean있는main=%s\\n\" \"$f\" \"$s\" \"$n\" \"$b\"\ndone\n\necho\necho \"# 원문이 22 로 적은 수의 출처\"\ngrep -n '^# Sub-scope 04' /shared/document-detail/clean-architecture-backend-template/final/document.md#a17 \\\n | cut -c1-150 | sed 's#^# final/document.md#a17:#'\nt=0; for d in security authz idempotency budget error observability admin release; do\n n=$(find $W/$d -name '*.java' | wc -l); t=$((t+n)); printf \" %-14s %s\\n\" \"$d\" \"$n\"\ndone\necho \" 여덟 패키지 합계 $t\"\n\necho\necho \"# MessageAuthorizationPolicy 를 받는 자리와 그 받는 쪽의 생성자\"\ngrep -n 'public ' $W/authz/MessageAuthorizationPolicy.java | sed -E 's#^([0-9]+): *# authz/MessageAuthorizationPolicy.java:\\1 #'\ngit grep -n 'MessageAuthorizationPolicy' -- 'src/**/*.java' | grep '/main/' | grep -v '/MessageAuthorizationPolicy.java' | strip\ngrep -n 'public WebSocketPlatformStartupValidator\\|public void validate\\|undeclaredAmong' $W/config/WebSocketPlatformStartupValidator.java \\\n | sed -E 's#^([0-9]+): *# config/WebSocketPlatformStartupValidator.java:\\1 #'\ngit grep -n 'new WebSocketPlatformStartupValidator(' -- 'src/**/*.java' | strip\n\necho\necho \"# 리프의 CLAUDE.md 가 적는 범위와 인바운드 정책 절 전체\"\ncut_range src/adapter/inbound/websocket/CLAUDE.md websocket/CLAUDE.md 15 18\ncut_range src/adapter/inbound/websocket/CLAUDE.md websocket/CLAUDE.md 52 60\n",
|
||||
"cwd": "/shared/codebase/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-04T00:20:53+00:00",
|
||||
|
||||
+1
-1
File diff suppressed because one or more lines are too long
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "adapter-inbound-graphql-c01",
|
||||
"kind": "terminal",
|
||||
"command": "sed -n '130,144p' analysis/16-adapter-inbound-graphql.md",
|
||||
"command": "sed -n '130,144p' final/document.md#a16",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:42:35+00:00",
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "adapter-inbound-grpc-c01",
|
||||
"kind": "terminal",
|
||||
"command": "sed -n '140,154p' analysis/15-adapter-inbound-grpc.md",
|
||||
"command": "sed -n '140,154p' final/document.md#a15",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:42:35+00:00",
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "adapter-inbound-web-c01",
|
||||
"kind": "terminal",
|
||||
"command": "sed -n '116,130p' analysis/14-adapter-inbound-web.md",
|
||||
"command": "sed -n '116,130p' final/document.md#a14",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:42:35+00:00",
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "adapter-inbound-web-c09",
|
||||
"kind": "terminal",
|
||||
"command": "sed -n '864,878p' analysis/14-adapter-inbound-web.md",
|
||||
"command": "sed -n '864,878p' final/document.md#a14",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:42:35+00:00",
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "adapter-inbound-web-c14",
|
||||
"kind": "terminal",
|
||||
"command": "sed -n '1098,1112p' analysis/14-adapter-inbound-web.md",
|
||||
"command": "sed -n '1098,1112p' final/document.md#a14",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:42:35+00:00",
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "adapter-inbound-web-c19",
|
||||
"kind": "terminal",
|
||||
"command": "sed -n '1555,1569p' analysis/14-adapter-inbound-web.md",
|
||||
"command": "sed -n '1555,1569p' final/document.md#a14",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:42:35+00:00",
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "adapter-inbound-websocket-c01",
|
||||
"kind": "terminal",
|
||||
"command": "sed -n '24,38p' analysis/17-adapter-inbound-websocket.md",
|
||||
"command": "sed -n '24,38p' final/document.md#a17",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:42:35+00:00",
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "adapter-inbound-websocket-c05",
|
||||
"kind": "terminal",
|
||||
"command": "sed -n '420,434p' analysis/17-adapter-inbound-websocket.md",
|
||||
"command": "sed -n '420,434p' final/document.md#a17",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:42:35+00:00",
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "adapter-outbound-cache-redis-c02",
|
||||
"kind": "terminal",
|
||||
"command": "sed -n '107,121p' analysis/10-adapter-outbound-cache-redis.md",
|
||||
"command": "sed -n '107,121p' final/document.md#a10",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:42:35+00:00",
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "adapter-outbound-cache-redis-c03",
|
||||
"kind": "terminal",
|
||||
"command": "sed -n '235,249p' analysis/10-adapter-outbound-cache-redis.md",
|
||||
"command": "sed -n '235,249p' final/document.md#a10",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:42:35+00:00",
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "adapter-outbound-cache-redis-c05",
|
||||
"kind": "terminal",
|
||||
"command": "sed -n '324,338p' analysis/10-adapter-outbound-cache-redis.md",
|
||||
"command": "sed -n '324,338p' final/document.md#a10",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:42:35+00:00",
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "adapter-outbound-fileserver-c03",
|
||||
"kind": "terminal",
|
||||
"command": "sed -n '184,198p' analysis/08-adapter-outbound-fileserver.md",
|
||||
"command": "sed -n '184,198p' final/document.md#a08",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:42:35+00:00",
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "adapter-outbound-notification-c04",
|
||||
"kind": "terminal",
|
||||
"command": "sed -n '619,633p' analysis/13-adapter-outbound-notification.md",
|
||||
"command": "sed -n '619,633p' final/document.md#a13",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:42:35+00:00",
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "adapter-outbound-persistence-jpa-c07",
|
||||
"kind": "terminal",
|
||||
"command": "sed -n '639,653p' analysis/05-adapter-outbound-persistence-jpa.md",
|
||||
"command": "sed -n '639,653p' final/document.md#a05",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:42:35+00:00",
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "adapter-outbound-persistence-jpa-c08",
|
||||
"kind": "terminal",
|
||||
"command": "sed -n '721,735p' analysis/05-adapter-outbound-persistence-jpa.md",
|
||||
"command": "sed -n '721,735p' final/document.md#a05",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:42:35+00:00",
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "adapter-outbound-persistence-jpa-c10",
|
||||
"kind": "terminal",
|
||||
"command": "sed -n '763,777p' analysis/05-adapter-outbound-persistence-jpa.md",
|
||||
"command": "sed -n '763,777p' final/document.md#a05",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:42:35+00:00",
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "adapter-outbound-persistence-jpa-c21",
|
||||
"kind": "terminal",
|
||||
"command": "sed -n '1358,1372p' analysis/05-adapter-outbound-persistence-jpa.md",
|
||||
"command": "sed -n '1358,1372p' final/document.md#a05",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:42:35+00:00",
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "adapter-outbound-persistence-jpa-c22",
|
||||
"kind": "terminal",
|
||||
"command": "sed -n '1384,1398p' analysis/05-adapter-outbound-persistence-jpa.md",
|
||||
"command": "sed -n '1384,1398p' final/document.md#a05",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:42:35+00:00",
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "adapter-outbound-persistence-jpa-c32",
|
||||
"kind": "terminal",
|
||||
"command": "sed -n '2217,2231p' analysis/05-adapter-outbound-persistence-jpa.md",
|
||||
"command": "sed -n '2217,2231p' final/document.md#a05",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:42:35+00:00",
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "adapter-outbound-persistence-jpa-c34",
|
||||
"kind": "terminal",
|
||||
"command": "sed -n '2523,2537p' analysis/05-adapter-outbound-persistence-jpa.md",
|
||||
"command": "sed -n '2523,2537p' final/document.md#a05",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:42:35+00:00",
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "adapter-outbound-persistence-jpa-c38",
|
||||
"kind": "terminal",
|
||||
"command": "sed -n '2780,2794p' analysis/05-adapter-outbound-persistence-jpa.md",
|
||||
"command": "sed -n '2780,2794p' final/document.md#a05",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:42:35+00:00",
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "adapter-outbound-persistence-jpa-c39",
|
||||
"kind": "terminal",
|
||||
"command": "sed -n '2805,2819p' analysis/05-adapter-outbound-persistence-jpa.md",
|
||||
"command": "sed -n '2805,2819p' final/document.md#a05",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:42:35+00:00",
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "adapter-outbound-persistence-jpa-c40",
|
||||
"kind": "terminal",
|
||||
"command": "sed -n '2883,2897p' analysis/05-adapter-outbound-persistence-jpa.md",
|
||||
"command": "sed -n '2883,2897p' final/document.md#a05",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:42:35+00:00",
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "adapter-outbound-persistence-jpa-c41",
|
||||
"kind": "terminal",
|
||||
"command": "sed -n '2913,2927p' analysis/05-adapter-outbound-persistence-jpa.md",
|
||||
"command": "sed -n '2913,2927p' final/document.md#a05",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:42:35+00:00",
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "adapter-outbound-persistence-jpa-c47",
|
||||
"kind": "terminal",
|
||||
"command": "sed -n '3354,3368p' analysis/05-adapter-outbound-persistence-jpa.md",
|
||||
"command": "sed -n '3354,3368p' final/document.md#a05",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:42:35+00:00",
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "adapter-outbound-persistence-jpa-c57",
|
||||
"kind": "terminal",
|
||||
"command": "sed -n '4306,4320p' analysis/05-adapter-outbound-persistence-jpa.md",
|
||||
"command": "sed -n '4306,4320p' final/document.md#a05",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:42:35+00:00",
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "adapter-outbound-persistence-jpa-c58",
|
||||
"kind": "terminal",
|
||||
"command": "sed -n '4541,4555p' analysis/05-adapter-outbound-persistence-jpa.md",
|
||||
"command": "sed -n '4541,4555p' final/document.md#a05",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:42:35+00:00",
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "adapter-outbound-support-c05",
|
||||
"kind": "terminal",
|
||||
"command": "sed -n '368,382p' analysis/04-adapter-outbound-support.md",
|
||||
"command": "sed -n '368,382p' final/document.md#a04",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:42:35+00:00",
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "adapter-outbound-support-c06",
|
||||
"kind": "terminal",
|
||||
"command": "sed -n '558,572p' analysis/04-adapter-outbound-support.md",
|
||||
"command": "sed -n '558,572p' final/document.md#a04",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:42:35+00:00",
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "analysis-finding-a06-f026",
|
||||
"kind": "terminal",
|
||||
"command": "sed -n '1383,1397p' analysis/06-adapter-outbound-persistence-mongo.md",
|
||||
"command": "sed -n '1383,1397p' final/document.md#a06",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:42:31+00:00",
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "analysis-finding-a06-f027",
|
||||
"kind": "terminal",
|
||||
"command": "sed -n '1410,1424p' analysis/06-adapter-outbound-persistence-mongo.md",
|
||||
"command": "sed -n '1410,1424p' final/document.md#a06",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:42:31+00:00",
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "analysis-finding-a06-f028",
|
||||
"kind": "terminal",
|
||||
"command": "sed -n '1433,1447p' analysis/06-adapter-outbound-persistence-mongo.md",
|
||||
"command": "sed -n '1433,1447p' final/document.md#a06",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:42:31+00:00",
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "analysis-finding-a07-f005",
|
||||
"kind": "terminal",
|
||||
"command": "sed -n '150,164p' analysis/07-adapter-outbound-identifier.md",
|
||||
"command": "sed -n '150,164p' final/document.md#a07",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:42:31+00:00",
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "analysis-finding-a08-f002",
|
||||
"kind": "terminal",
|
||||
"command": "sed -n '108,122p' analysis/08-adapter-outbound-fileserver.md",
|
||||
"command": "sed -n '108,122p' final/document.md#a08",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:42:32+00:00",
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "analysis-finding-a09-f001",
|
||||
"kind": "terminal",
|
||||
"command": "sed -n '106,120p' analysis/09-adapter-outbound-objectstorage.md",
|
||||
"command": "sed -n '106,120p' final/document.md#a09",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:42:32+00:00",
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "analysis-finding-a09-f004",
|
||||
"kind": "terminal",
|
||||
"command": "sed -n '485,499p' analysis/09-adapter-outbound-objectstorage.md",
|
||||
"command": "sed -n '485,499p' final/document.md#a09",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:42:32+00:00",
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "analysis-finding-a10-f003",
|
||||
"kind": "terminal",
|
||||
"command": "sed -n '251,265p' analysis/10-adapter-outbound-cache-redis.md",
|
||||
"command": "sed -n '251,265p' final/document.md#a10",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:42:32+00:00",
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "analysis-finding-a13-f007",
|
||||
"kind": "terminal",
|
||||
"command": "sed -n '795,809p' analysis/13-adapter-outbound-notification.md",
|
||||
"command": "sed -n '795,809p' final/document.md#a13",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:42:32+00:00",
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "analysis-finding-a14-f003",
|
||||
"kind": "terminal",
|
||||
"command": "sed -n '503,517p' analysis/14-adapter-inbound-web.md",
|
||||
"command": "sed -n '503,517p' final/document.md#a14",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:42:32+00:00",
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "analysis-finding-a14-f009",
|
||||
"kind": "terminal",
|
||||
"command": "sed -n '807,821p' analysis/14-adapter-inbound-web.md",
|
||||
"command": "sed -n '807,821p' final/document.md#a14",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:42:32+00:00",
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "analysis-finding-a14-f019",
|
||||
"kind": "terminal",
|
||||
"command": "sed -n '1575,1589p' analysis/14-adapter-inbound-web.md",
|
||||
"command": "sed -n '1575,1589p' final/document.md#a14",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:42:32+00:00",
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "analysis-finding-a16-f005",
|
||||
"kind": "terminal",
|
||||
"command": "sed -n '511,525p' analysis/16-adapter-inbound-graphql.md",
|
||||
"command": "sed -n '511,525p' final/document.md#a16",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:42:32+00:00",
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "analysis-finding-a16-f006",
|
||||
"kind": "terminal",
|
||||
"command": "sed -n '525,539p' analysis/16-adapter-inbound-graphql.md",
|
||||
"command": "sed -n '525,539p' final/document.md#a16",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:42:32+00:00",
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "analysis-finding-a16-f011",
|
||||
"kind": "terminal",
|
||||
"command": "sed -n '889,903p' analysis/16-adapter-inbound-graphql.md",
|
||||
"command": "sed -n '889,903p' final/document.md#a16",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:42:32+00:00",
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "analysis-finding-a17-f003",
|
||||
"kind": "terminal",
|
||||
"command": "sed -n '426,440p' analysis/17-adapter-inbound-websocket.md",
|
||||
"command": "sed -n '426,440p' final/document.md#a17",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:42:32+00:00",
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "analysis-finding-a18-f002",
|
||||
"kind": "terminal",
|
||||
"command": "sed -n '549,563p' analysis/18-app-bootstrap.md",
|
||||
"command": "sed -n '549,563p' final/document.md#a18",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:42:32+00:00",
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "analysis-finding-a19-f013",
|
||||
"kind": "terminal",
|
||||
"command": "sed -n '682,696p' analysis/19-messaging-platform.md",
|
||||
"command": "sed -n '682,696p' final/document.md#a19",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:42:32+00:00",
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "analysis-finding-a20-f005",
|
||||
"kind": "terminal",
|
||||
"command": "sed -n '321,335p' analysis/20-grpc-platform.md",
|
||||
"command": "sed -n '321,335p' final/document.md#a20",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:42:32+00:00",
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "assigned-id-turns-claim-into-upsert",
|
||||
"kind": "terminal",
|
||||
"command": "sed -n '133,147p' analysis/grpc/grpc-operation-ledger-jpa.md",
|
||||
"command": "sed -n '133,147p' final/document.md#a20-grpc-operation-ledger-jpa",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:42:35+00:00",
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "autoconfiguration-in-name-only",
|
||||
"kind": "terminal",
|
||||
"command": "sed -n '1,16p' analysis/05-adapter-outbound-persistence-jpa.md",
|
||||
"command": "sed -n '1,16p' final/document.md#a05",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:43:08+00:00",
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "bounded-and-unbounded-side-by-side",
|
||||
"kind": "terminal",
|
||||
"command": "sed -n '1,18p' analysis/messaging/messaging-reliability-api.md",
|
||||
"command": "sed -n '1,18p' final/document.md#a19-messaging-reliability-api",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:42:33+00:00",
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "capability-constant-outlives-its-condition",
|
||||
"kind": "terminal",
|
||||
"command": "sed -n '111,125p' analysis/messaging/messaging-nats-experimental.md",
|
||||
"command": "sed -n '111,125p' final/document.md#a19-messaging-nats-experimental",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:42:35+00:00",
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "claim-check-has-no-wiring-line-in-the-starter",
|
||||
"kind": "terminal",
|
||||
"command": "sed -n '926,940p' analysis/19-messaging-platform.md",
|
||||
"command": "sed -n '926,940p' final/document.md#a19",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:42:34+00:00",
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "complete-drain-rolls-back-a-rotation",
|
||||
"kind": "terminal",
|
||||
"command": "sed -n '158,172p' analysis/grpc/grpc-policy.md",
|
||||
"command": "sed -n '158,172p' final/document.md#a20-grpc-policy",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:42:35+00:00",
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "conditionalonbean-evaluated-at-parse-time",
|
||||
"kind": "terminal",
|
||||
"command": "sed -n '1,16p' analysis/05-adapter-outbound-persistence-jpa.md",
|
||||
"command": "sed -n '1,16p' final/document.md#a05",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:43:08+00:00",
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "cursor-verification-order",
|
||||
"kind": "terminal",
|
||||
"command": "grep -n '2.4' analysis/05-adapter-outbound-persistence-jpa.md | head -12",
|
||||
"command": "grep -n '2.4' final/document.md#a05 | head -12",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:42:57+00:00",
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "draining-began-and-a-service-came-back-serving",
|
||||
"kind": "terminal",
|
||||
"command": "sed -n '1,18p' analysis/grpc/grpc-admin.md",
|
||||
"command": "sed -n '1,18p' final/document.md#a20-grpc-admin",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:42:33+00:00",
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "endpoint-check-only-on-upload",
|
||||
"kind": "terminal",
|
||||
"command": "grep -n '39' analysis/09-adapter-outbound-objectstorage.md | head -12",
|
||||
"command": "grep -n '39' final/document.md#a09 | head -12",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:42:57+00:00",
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "four-multitenancy-strategies",
|
||||
"kind": "terminal",
|
||||
"command": "sed -n '1,16p' analysis/05-adapter-outbound-persistence-jpa.md",
|
||||
"command": "sed -n '1,16p' final/document.md#a05",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:43:08+00:00",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "grpc-admin-f02",
|
||||
"kind": "terminal",
|
||||
"command": "sed -n '162,176p' analysis/grpc/grpc-admin.md",
|
||||
"command": "sed -n '162,176p' final/document.md#a20-grpc-admin",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:42:34+00:00",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "grpc-admin-f03",
|
||||
"kind": "terminal",
|
||||
"command": "sed -n '181,195p' analysis/grpc/grpc-admin.md",
|
||||
"command": "sed -n '181,195p' final/document.md#a20-grpc-admin",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:42:33+00:00",
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "grpc-advanced-bootstrap-f02",
|
||||
"kind": "terminal",
|
||||
"command": "sed -n '182,196p' analysis/grpc/grpc-advanced-bootstrap.md",
|
||||
"command": "sed -n '182,196p' final/document.md#a20-grpc-advanced-bootstrap",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:42:34+00:00",
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "grpc-advanced-bootstrap-f04",
|
||||
"kind": "terminal",
|
||||
"command": "sed -n '286,300p' analysis/grpc/grpc-advanced-bootstrap.md",
|
||||
"command": "sed -n '286,300p' final/document.md#a20-grpc-advanced-bootstrap",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:42:33+00:00",
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "grpc-advanced-diagnostics-f01",
|
||||
"kind": "terminal",
|
||||
"command": "sed -n '167,181p' analysis/grpc/grpc-advanced-diagnostics.md",
|
||||
"command": "sed -n '167,181p' final/document.md#a20-grpc-advanced-diagnostics",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:42:34+00:00",
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "grpc-advanced-diagnostics-f02",
|
||||
"kind": "terminal",
|
||||
"command": "sed -n '206,220p' analysis/grpc/grpc-advanced-diagnostics.md",
|
||||
"command": "sed -n '206,220p' final/document.md#a20-grpc-advanced-diagnostics",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:42:34+00:00",
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "grpc-advanced-resilience-f01",
|
||||
"kind": "terminal",
|
||||
"command": "sed -n '136,150p' analysis/grpc/grpc-advanced-resilience.md",
|
||||
"command": "sed -n '136,150p' final/document.md#a20-grpc-advanced-resilience",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:42:34+00:00",
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "grpc-advanced-resilience-f02",
|
||||
"kind": "terminal",
|
||||
"command": "sed -n '155,169p' analysis/grpc/grpc-advanced-resilience.md",
|
||||
"command": "sed -n '155,169p' final/document.md#a20-grpc-advanced-resilience",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:42:33+00:00",
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "grpc-advanced-streaming-f01",
|
||||
"kind": "terminal",
|
||||
"command": "sed -n '125,139p' analysis/grpc/grpc-advanced-streaming.md",
|
||||
"command": "sed -n '125,139p' final/document.md#a20-grpc-advanced-streaming",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:42:33+00:00",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "grpc-client-f01",
|
||||
"kind": "terminal",
|
||||
"command": "sed -n '120,134p' analysis/grpc/grpc-client.md",
|
||||
"command": "sed -n '120,134p' final/document.md#a20-grpc-client",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:42:33+00:00",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "grpc-client-f03",
|
||||
"kind": "terminal",
|
||||
"command": "sed -n '176,190p' analysis/grpc/grpc-client.md",
|
||||
"command": "sed -n '176,190p' final/document.md#a20-grpc-client",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:42:33+00:00",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "grpc-client-f04",
|
||||
"kind": "terminal",
|
||||
"command": "sed -n '199,213p' analysis/grpc/grpc-client.md",
|
||||
"command": "sed -n '199,213p' final/document.md#a20-grpc-client",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:42:34+00:00",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "grpc-codegen-f01",
|
||||
"kind": "terminal",
|
||||
"command": "sed -n '190,204p' analysis/grpc/grpc-codegen.md",
|
||||
"command": "sed -n '190,204p' final/document.md#a20-grpc-codegen",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:42:33+00:00",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "grpc-codegen-f04",
|
||||
"kind": "terminal",
|
||||
"command": "sed -n '287,301p' analysis/grpc/grpc-codegen.md",
|
||||
"command": "sed -n '287,301p' final/document.md#a20-grpc-codegen",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:42:33+00:00",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "grpc-core-api-f01",
|
||||
"kind": "terminal",
|
||||
"command": "sed -n '140,154p' analysis/grpc/grpc-core-api.md",
|
||||
"command": "sed -n '140,154p' final/document.md#a20-grpc-core-api",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:42:33+00:00",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "grpc-core-api-f02",
|
||||
"kind": "terminal",
|
||||
"command": "sed -n '157,171p' analysis/grpc/grpc-core-api.md",
|
||||
"command": "sed -n '157,171p' final/document.md#a20-grpc-core-api",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:42:33+00:00",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "grpc-core-api-f03",
|
||||
"kind": "terminal",
|
||||
"command": "sed -n '180,194p' analysis/grpc/grpc-core-api.md",
|
||||
"command": "sed -n '180,194p' final/document.md#a20-grpc-core-api",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:42:34+00:00",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "grpc-core-api-f04",
|
||||
"kind": "terminal",
|
||||
"command": "sed -n '200,214p' analysis/grpc/grpc-core-api.md",
|
||||
"command": "sed -n '200,214p' final/document.md#a20-grpc-core-api",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:42:34+00:00",
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "grpc-discovery-f03",
|
||||
"kind": "terminal",
|
||||
"command": "sed -n '187,201p' analysis/grpc/grpc-discovery.md",
|
||||
"command": "sed -n '187,201p' final/document.md#a20-grpc-discovery",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:42:33+00:00",
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "grpc-operation-ledger-jpa-f01",
|
||||
"kind": "terminal",
|
||||
"command": "sed -n '184,198p' analysis/grpc/grpc-operation-ledger-jpa.md",
|
||||
"command": "sed -n '184,198p' final/document.md#a20-grpc-operation-ledger-jpa",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:42:33+00:00",
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "grpc-operation-ledger-jpa-f02",
|
||||
"kind": "terminal",
|
||||
"command": "sed -n '192,206p' analysis/grpc/grpc-operation-ledger-jpa.md",
|
||||
"command": "sed -n '192,206p' final/document.md#a20-grpc-operation-ledger-jpa",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:42:33+00:00",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "grpc-policy-f02",
|
||||
"kind": "terminal",
|
||||
"command": "sed -n '204,218p' analysis/grpc/grpc-policy.md",
|
||||
"command": "sed -n '204,218p' final/document.md#a20-grpc-policy",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:42:34+00:00",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "grpc-policy-f03",
|
||||
"kind": "terminal",
|
||||
"command": "sed -n '249,263p' analysis/grpc/grpc-policy.md",
|
||||
"command": "sed -n '249,263p' final/document.md#a20-grpc-policy",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:42:34+00:00",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "grpc-policy-f05",
|
||||
"kind": "terminal",
|
||||
"command": "sed -n '285,299p' analysis/grpc/grpc-policy.md",
|
||||
"command": "sed -n '285,299p' final/document.md#a20-grpc-policy",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:42:34+00:00",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "grpc-policy-f06",
|
||||
"kind": "terminal",
|
||||
"command": "sed -n '305,319p' analysis/grpc/grpc-policy.md",
|
||||
"command": "sed -n '305,319p' final/document.md#a20-grpc-policy",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:42:34+00:00",
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "grpc-proto-contract-f01",
|
||||
"kind": "terminal",
|
||||
"command": "sed -n '175,189p' analysis/grpc/grpc-proto-contract.md",
|
||||
"command": "sed -n '175,189p' final/document.md#a20-grpc-proto-contract",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:42:34+00:00",
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "grpc-proto-contract-f02",
|
||||
"kind": "terminal",
|
||||
"command": "sed -n '191,205p' analysis/grpc/grpc-proto-contract.md",
|
||||
"command": "sed -n '191,205p' final/document.md#a20-grpc-proto-contract",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:42:34+00:00",
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "grpc-proto-contract-f03",
|
||||
"kind": "terminal",
|
||||
"command": "sed -n '203,217p' analysis/grpc/grpc-proto-contract.md",
|
||||
"command": "sed -n '203,217p' final/document.md#a20-grpc-proto-contract",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:42:34+00:00",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "grpc-server-f02",
|
||||
"kind": "terminal",
|
||||
"command": "sed -n '167,181p' analysis/grpc/grpc-server.md",
|
||||
"command": "sed -n '167,181p' final/document.md#a20-grpc-server",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:42:34+00:00",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"assetKey": "grpc-server-f03",
|
||||
"kind": "terminal",
|
||||
"command": "sed -n '196,210p' analysis/grpc/grpc-server.md",
|
||||
"command": "sed -n '196,210p' final/document.md#a20-grpc-server",
|
||||
"cwd": "/shared/document-detail/clean-architecture-backend-template",
|
||||
"exitCode": 0,
|
||||
"executedAt": "2026-09-01T05:42:33+00:00",
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user