- 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>
255 lines
6.2 KiB
JSON
255 lines
6.2 KiB
JSON
{
|
|
"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": {}
|
|
} |