Files
DongHyeonkaandClaude Fable 5.1 b25357c48a 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>
2026-09-07 12:39:20 +09:00

71 lines
3.2 KiB
Markdown

---
id:
kind: REFERENCE
slug: unknown-is-a-third-result
title: 모르는 것은 성공도 실패도 아닌 세 번째 결과여야 한다
topic: commit-ambiguity-as-a-result
topicName: 커밋 모호성 — 「모른다」를 결과로 유지하기
project: clean-architecture-backend-template
status: 게시 전
studio: ""
source:
- final/document.md#9
- final/document.md#3-3
sourceRevision: 21234e38cdb9a926cbc92bb97a2aee2e4a7d2916
---
# 모르는 것은 성공도 실패도 아닌 세 번째 결과여야 한다
완료 여부를 알 수 없는 상태를 성공이나 실패로 접으면 그 정보가 영원히 사라진다. 결과 타입에 세 번째 변형을 두고, 그 변형이 조정에 필요한 것을 함께 들고 다니게 한다.
## 관계
- **pg_terminate_backend 가 57P01 로 도착하고 커밋 레코드는 이미 WAL 에 있었다**
세 번째 결과가 필요한 대표 사례다.
- **completion-unknown 은 자동으로도 수동으로도 재시도하지 않는다**
이 규칙을 정책으로 옮긴 결정이다.
## 목적
모르는 것을 실패로 접으면 재시도가 일어나고, 커밋됐을 수도 있는 쓰기가 중복된다. 성공으로 접으면 확인되지 않은 작업이 확인된 것으로 하류에 흘러간다. 어느 쪽도 나중에 되돌릴 수 없다.
## 규칙
### 1. 결과 타입에 세 번째 변형을 둔다
호출자가 재시도와 조정을 구별하려면 그 구별을 담을 값이 필요하다. boolean 하나나 예외 하나로는 표현되지 않는다.
### 2. 세 번째 변형은 조정 정보를 함께 들고 다닌다
상태 이름만으로는 부족하다. 마지막으로 관측된 단계와 조정에 쓸 안정적인 식별자가 값 안에 있어야 조정이 대상을 지목한다.
### 3. 판정 조건을 좁게 유지한다
조정 큐가 커지면 운영자가 읽지 않고 비우는 습관을 배우고, 중요했던 한 건이 나머지와 같이 지워진다.
## 적용 조건
관측이 결과를 확정하지 못할 수 있는 경계 : 커밋, 발행, 전달, 복제 지연 조회
이 저장소의 구현은 다섯이다.
재시도 처분 : RetryDisposition.RECONCILE
트랜잭션 결과 : TransactionResult.Indeterminate
쓰기 처분 : WriteDisposition.UNDETERMINED
발행 완료 : PublishCompletion.AMBIGUOUS
복제 지연 : ReplicaLagMonitor.replayedThrough 의 Optional 반환
## 예외
아무것도 프로세스를 떠나지 않은 실패는 확정이다. 발행 경로에서 access 가 거부되거나 encode 가 실패하면 결과는 REJECTED 이고 ambiguous 가 아니다.
어떤 브로커도 보지 못한 메시지를 모호하다고 보고하면, 호출자는 확인할 것이 없는 조정으로 보내진다.
준비 중에 데드라인이 소진된 경우도 같다. 아직 전송 전이므로 확정 거부다.
## 예시
커밋 증거 열거형은 UNKNOWN 을 실제 상태로 두고, 드라이버가 커밋도 롤백도 확인해 주지 못한 경우를 어느 쪽으로도 접지 않는다.
발행 경로는 transport 단계에서 실패하거나 데드라인이 지나면 AMBIGUOUS 로 보고한다. 요청이 wire 위에 있었으므로 브로커가 들고 있을 수 있기 때문이다.