- 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>
122 lines
5.2 KiB
Markdown
122 lines
5.2 KiB
Markdown
---
|
|
kind: CASE
|
|
slug: analysis-finding-a19-f001
|
|
title: capability 12개 중 main 코드가 읽는 것은 3개, 거부하는 것은 1개
|
|
topic: messaging-and-outbox
|
|
project: clean-architecture-backend-template
|
|
status: 게시 전
|
|
sourceRevision: 21234e38cdb9a926cbc92bb97a2aee2e4a7d2916
|
|
rootTreeNode: case:analysis-finding-a19-f001
|
|
evidenceCapturedOn: 2026-09-01
|
|
body: case-analysis-finding-a19-f001.body.md
|
|
assets:
|
|
- key: analysis-finding-a19-f001
|
|
file: ../../../final/evidence/rendered/analysis-finding-a19-f001.svg
|
|
evidence:
|
|
- ../../../final/evidence/raw/analysis-finding-a19-f001.txt
|
|
source:
|
|
- 원본 분석 절은 final/document.md#a19#L231 이다.
|
|
---
|
|
|
|
# capability 12개 중 main 코드가 읽는 것은 3개, 거부하는 것은 1개
|
|
|
|
능력 레코드의 자바독이 없는 능력을 요구하면 플랫폼이 크게 실패한다고 선언한다. 열두 깃발 중 아홉을 주 코드가 읽지 않고, 읽는 셋 중 둘은 거부가 아니라 분기다. 거부하는 것은 하나뿐이다.
|
|
|
|
## 관계
|
|
|
|
- **선언된 Advanced 능력 11개 중 9개는 켜는 방법이 없다**
|
|
같은 형태의 능력 선언과 실제 어긋남이다.
|
|
- **조용히 약해진 보증은 사고 전까지 동작하는 것과 구분되지 않는다**
|
|
자바독이 적은 근거다.
|
|
- **분기와 거부는 다른 답이다**
|
|
이 사례가 그 규칙의 형태다.
|
|
|
|
## 문제
|
|
|
|
능력 레코드의 클래스 자바독이 계약을 선언한다.
|
|
|
|
프로파일이 여기 없는 것을 요구하면 플랫폼이 크게 실패한다는 것이다. 가능하면 시작 시점에, 아니면 능력 예외로 실패하지 조용히 저하되지 않는다는 것이다.
|
|
|
|
그 근거도 적는다. 조용히 약해진 보증은 사고가 나기 전까지 동작하는 보증과 구분되지 않기 때문이라는 것이다.
|
|
|
|
열두 깃발 전체에 대해 주 코드와 테스트 참조를 셌다.
|
|
|
|
## 결론
|
|
|
|
읽는 것은 셋이다.
|
|
|
|
순서 있는 흐름은 재시도 결정 엔진에서 읽고, 있으면 순서 보존 재시도를 고른다.
|
|
|
|
지연 배달도 같은 엔진에서 읽고, 있으면 브로커 지연 방식을 쓴다.
|
|
|
|
중복 제거 발행은 발행자에서 읽고, 없으면 예외를 던진다.
|
|
|
|
나머지 아홉은 모든 브로커 어댑터가 선언하지만 주 코드 어디서도 읽지 않는다.
|
|
|
|
브로커 확인과 복제 또는 지속 증거와 메시지 단위 정산과 배치 정산, 키 기반 순서와 재생과 브로커 트랜잭션과 기본 죽은 편지와 위상 관리다.
|
|
|
|
읽는 셋 중 둘은 거부가 아니라 분기다.
|
|
|
|
없으면 재시도 엔진이 조용히 다른 방식을 고른다. 자바독이 조용한 저하라고 부른 그 동작이다.
|
|
|
|
거부하는 것은 중복 제거 발행 하나뿐이다.
|
|
|
|
계수에는 주의할 점이 하나 있다. 순서 있는 흐름의 주 참조 다섯 건 중 넷은 프레임워크의 동명 메서드로 잡힌 오탐이다. 실제 깃발 참조는 한 건이다.
|
|
|
|
판정은 P2 다.
|
|
|
|
## 검증 환경
|
|
|
|
확인 방식 : 깃발별 참조 계수와 동명 오탐 제거
|
|
소스 수정 : x
|
|
|
|
## 재현 조건
|
|
|
|
원문은 final/evidence/raw/252 계열에 있다.
|
|
|
|
1. 능력 레코드의 클래스 자바독을 읽는다.
|
|
2. 열두 깃발 이름을 나열한다.
|
|
3. 각 이름의 주 참조와 테스트 참조를 센다.
|
|
4. 동명 메서드로 잡힌 오탐을 제거한다.
|
|
5. 읽는 지점에서 무엇을 하는지 확인한다.
|
|
|
|
## 본문
|
|
|
|
<!-- body:start -->
|
|
|
|
`MessagingCapabilities`의 클래스 javadoc이 이 record의 계약을 선언한다.
|
|
|
|
> "When a profile asks for something absent here **the platform fails loudly** — at startup where possible, otherwise with a capability exception — rather than quietly degrading, because **a silently weakened guarantee is indistinguishable from a working one until the incident.**"
|
|
|
|
## MessagingCapabilities 참조 위치
|
|
|
|
:::evidence key="analysis-finding-a19-f001" alt="코드베이스에서 MessagingCapabilities 를 검색한 출력 13줄. 이 기록이 세는 참조가 그 출력에 그대로 보인다." caption="MessagingCapabilities 코드베이스 검색 — 13줄 · exit 0" zoom="true"
|
|
:::
|
|
|
|
## 12개 플래그의 참조를 전수로 셌다
|
|
|
|
| 플래그 | main | test | main에서 하는 일 |
|
|
|---|---|---|---|
|
|
| `brokerAcknowledgement` | 0 | 1 | — |
|
|
| `replicationOrPersistenceEvidence` | 0 | 0 | — |
|
|
| `perMessageSettlement` | 0 | 1 | — |
|
|
| `batchSettlement` | 0 | 0 | — |
|
|
| `orderedStream` | **1** | 1 | `DefaultRetryDecisionEngine:49` — 있으면 순서보존 재시도 선택 |
|
|
| `keyedOrdering` | 0 | 3 | — |
|
|
| `replay` | 0 | 2 | — |
|
|
| `delayedDelivery` | **1** | 0 | `DefaultRetryDecisionEngine:64` — 있으면 BROKER_DELAYED 사용 |
|
|
| `brokerTransaction` | 0 | 3 | — |
|
|
| `deduplicatedPublish` | **1** | 1 | `DefaultMessagePublisher:250` — **없으면 예외** |
|
|
| `nativeDeadLetter` | 0 | 1 | — |
|
|
| `topologyManagement` | 0 | 0 | — |
|
|
|
|
## 읽는 것은 셋, 거부하는 것은 하나
|
|
|
|
javadoc이 선언한 "fails loudly"가 실제로 성립하는 플래그는 `deduplicatedPublish` 하나다. P2.
|
|
|
|
## 확인하지 못한 것
|
|
|
|
능력이 없는 브로커로 프로파일을 구성해 각 깃발의 동작 차이를 재현하지 않았다. 참조 계수상 아홉은 차이가 없다.
|
|
|
|
<!-- body:end -->
|