chore: 이전 세션이 남긴 변경을 커밋한다

이번 파이프라인 작업과 무관하게 작업 트리에 남아 있던 것을 그대로 올린다.
사용자가 「전부 커밋」으로 정했고, 이번 작업과 섞이지 않게 커밋만 나눴다.

대부분은 clean-architecture-backend-template 의 그림 정본 재배치다 —
final/assets/diagrams/<이름>/ 에 있던 것이 CLAUDE.md 가 적은 배치인
final/assets/<이름>/ 로 옮겨졌고 .techviz/<이름>/ 이 함께 들어왔다.
삽입 줄의 대부분(3.15M)이 그 .techviz context.json 이다.

그 밖에 ca-tmpl·document-haness 의 정리, .claude/agents/ 열한 개,
writing-practitioner-guides 스킬, .playwright-mcp 세션 산출물,
scripts/check-ssot-facts.py 와 그 시험이 들어 있다.

이 커밋의 내용은 내가 만든 것이 아니라 이전 세션이 남긴 것이고 검증하지 않았다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
DongHyeonka
2026-09-17 11:02:02 +09:00
co-authored by Claude Opus 5
parent 2109f726fe
commit ab59130196
1524 changed files with 3160026 additions and 8369 deletions
@@ -6,13 +6,14 @@ topic: assembly-ownership
project: clean-architecture-backend-template
status: 게시 전
sourceRevision: 21234e38cdb9a926cbc92bb97a2aee2e4a7d2916
basisVersion: Spring Boot 4.0.8 · Java 21 · 리비전 21234e38
rootTreeNode: concept:three-assembly-paths
evidenceCapturedOn: 2026-09-01
assets:
- key: three-assembly-paths
file: ../../../final/evidence/rendered/three-assembly-paths.svg
- key: three-assembly-paths-diagram
file: ../../../final/assets/diagrams/three-assembly-paths.svg
file: ../../../final/assets/diagrams/three-assembly-paths/three-assembly-paths.svg
evidence:
- ../../../final/evidence/raw/three-assembly-paths.txt
- ../../../final/evidence/raw/tl-web-six-unowned-components.txt
@@ -21,6 +21,8 @@ source:
# 마스터 스위치는 루트 하나가 소유하고 자식 설정은 조건을 갖지 않는다
능력의 활성 여부는 자동설정 루트 하나가 판정하고, 그 루트가 임포트하는 자식 설정은 같은 조건을 갖지 않는다. 같은 속성을 읽는 주체가 여럿이면 각자가 다른 것이 켜졌다고 믿는 상태가 생기고, mongo 리프에서 실제로 그랬다.
## 결정문
능력의 활성 여부는 자동설정 루트 하나가 판정하고, 그 루트가 임포트하는 자식 설정은 같은 조건을 갖지 않는다.
@@ -18,6 +18,8 @@ source:
# 풀이 필요한지는 "JPA가 켜졌나"가 아니라 "커넥션이 필요한 capability가 있나"로 묻는다
관계형 커넥션 풀을 열지 말지는 활성 능력 중 커넥션을 요구하는 것이 하나라도 있는지로 판정한다. JPA 가 꺼졌는지만 물으면 아무도 쓰지 않는 풀을 열거나, 정당하게 쓰고 있던 능력을 조용히 망가뜨린다.
## 결정문
관계형 커넥션 풀을 열지 말지는 활성 능력 중 커넥션을 요구하는 것이 하나라도 있는지로 판정한다.
@@ -12,6 +12,8 @@ verifiedOn: # 이 기록은 이번 회차에 실행 확인을 하지
# @Bean이 있다는 것은 조립 증거가 아니다
클래스에 붙은 애너테이션이나 팩토리의 존재를 그것이 실행 컨텍스트에 있다는 증거로 읽는 것을 막는다. 애너테이션은 후보를 만들 뿐이고, 확인은 세 경로 중 어느 것이 그 클래스를 소유하는지로 한다.
## 목적
클래스에 붙은 애너테이션이나 팩토리의 존재를 그것이 실행 컨텍스트에 있다는 증거로 읽는 것을 막는다.
@@ -12,6 +12,8 @@ verifiedOn: # 이 기록은 이번 회차에 실행 확인을 하지
# @ConditionalOnBean은 조건이 만족될 수 있는지까지 확인해야 한다
조건부 빈을 선언해 두고 그 조건을 만족시킬 수 있는 경로가 있는지 확인하지 않아, 능력 전체가 조용히 없는 상태를 막는다. Spring 은 조건 불만족을 정상 동작으로 보므로 로그에도 액추에이터에도 신호가 남지 않는다.
## 목적
조건부 빈을 선언해 두고 그 조건을 만족시킬 수 있는 경로가 있는지 확인하지 않아, 능력 전체가 조용히 없는 상태를 막는다.
@@ -12,6 +12,8 @@ verifiedOn: # 이 기록은 이번 회차에 실행 확인을 하지
# "꺼짐"은 조건의 반복이 아니라 구조여야 한다
능력을 끄는 일을 빈마다 조건을 반복하는 방식으로 처리해서, 다음 달에 추가된 빈이 조건을 잊는 것을 막는다. 루트 하나가 조건을 소유하고 자식을 컴포넌트 스캔 밖에 두면, 제외와 소유가 한 쌍으로 관리되는 한 꺼짐이 구조가 된다.
## 목적
능력을 끄는 일을 빈마다 조건을 반복하는 방식으로 처리해서, 다음 달에 추가된 빈이 조건을 잊는 것을 막는다.
@@ -12,6 +12,8 @@ verifiedOn: # 이 기록은 이번 회차에 실행 확인을 하지
# 조립 결함을 판정하려면 조립하는 쪽을 먼저 읽어야 한다
조립되는 쪽만 읽고 결함을 판정해서 원인을 잘못 지목하는 것을 막는다. 조립하는 쪽이 원인을 갖고, 조건 결함으로 읽느냐 중복으로 읽느냐에서 수정 방향이 갈린다.
## 목적
조립되는 쪽만 읽고 결함을 판정해서, 원인을 잘못 지목하고 수정 방향을 반대로 잡는 것을 막는다.
@@ -12,6 +12,8 @@ verifiedOn: # 이 기록은 이번 회차에 실행 확인을 하지
# 시작 검증기가 도는지는 그 능력에 자동설정 루트가 있는지와 일치한다
검증기 파일이 존재하고 그 테스트가 통과한다는 사실을 검증이 실행된다는 증거로 읽는 것을 막는다. 규칙이 많고 잘 테스트되어 있다는 것은 품질의 증거이지 실행의 증거가 아니다.
## 목적
검증기 파일이 존재하고 그 테스트가 통과한다는 사실을 검증이 실행된다는 증거로 읽는 것을 막는다.
@@ -6,13 +6,14 @@ topic: bounding-by-type
project: clean-architecture-backend-template
status: 게시 전
sourceRevision: 21234e38cdb9a926cbc92bb97a2aee2e4a7d2916
basisVersion: Java 21 · Spring Boot 4.0.8 · 리비전 21234e38
rootTreeNode: concept:cardinality-bounds-as-types
evidenceCapturedOn: 2026-09-01
assets:
- key: cardinality-bounds-as-types
file: ../../../final/evidence/rendered/cardinality-bounds-as-types.svg
- key: cardinality-bounds-as-types-diagram
file: ../../../final/assets/diagrams/cardinality-bounds-as-types.svg
file: ../../../final/assets/diagrams/cardinality-bounds-as-types/cardinality-bounds-as-types.svg
evidence:
- ../../../final/evidence/raw/cardinality-bounds-as-types.txt
source:
@@ -6,13 +6,14 @@ topic: bounding-by-type
project: clean-architecture-backend-template
status: 게시 전
sourceRevision: 21234e38cdb9a926cbc92bb97a2aee2e4a7d2916
basisVersion: Java 21 · Spring Boot 4.0.8 · 리비전 21234e38
rootTreeNode: concept:signed-cursor-structure
evidenceCapturedOn: 2026-09-01
assets:
- key: signed-cursor-structure
file: ../../../final/evidence/rendered/signed-cursor-structure.svg
- key: signed-cursor-structure-diagram
file: ../../../final/assets/diagrams/signed-cursor-structure.svg
file: ../../../final/assets/diagrams/signed-cursor-structure/signed-cursor-structure.svg
evidence:
- ../../../final/evidence/raw/signed-cursor-structure.txt
source:
@@ -18,6 +18,8 @@ source:
# 커서에 서명하는 이유는 기밀성이 아니라 무결성이다
페이징 커서는 서명하되 암호화하지 않는다. 목적은 내용을 숨기는 것이 아니라 변조를 감지하는 것이고, 페이로드가 읽히는 것을 감수하는 대신 디버깅 때 토큰을 읽을 수 있고 키 관리가 서명 키 하나로 끝난다.
## 결정문
페이징 커서는 서명하되 암호화하지 않는다. 목적은 내용을 숨기는 것이 아니라 변조를 감지하는 것이다.
@@ -21,6 +21,8 @@ source:
# tenant id는 메트릭 태그가 되지 않는다
원시 tenant 식별자는 메트릭 태그가 되지 않고, 태그가 될 수 있는 것은 경계가 있는 매핑 테이블 id 나 코호트 버킷이다. tenant 카디널리티는 정의상 무한해서, 원시 식별자를 태그로 쓰면 tenant 하나가 늘 때마다 시계열 집합 전체가 복제된다.
## 결정문
원시 tenant 식별자는 메트릭 태그가 되지 않는다. 태그가 될 수 있는 것은 경계가 있는 매핑 테이블 id 나 코호트 버킷이다.
@@ -12,6 +12,8 @@ verifiedOn: # 이 기록은 이번 회차에 실행 확인을 하지
# 이름은 값이 아니라 registry key다
연산 이름이나 쿼리 이름 같은 식별자를 자유 문자열로 두어, 오타가 새 시계열을 만들거나 정책이 조용히 적용되지 않는 것을 막는다. 검사는 사용처가 아니라 값이 만들어지는 도입 지점에 두고, 열거할 수 없는 이름 집합은 레지스트리가 아니라 관행이다.
## 목적
연산 이름이나 쿼리 이름 같은 식별자를 자유 문자열로 두어, 오타가 새 시계열을 만들거나 정책이 조용히 적용되지 않는 것을 막는다.
@@ -12,6 +12,8 @@ verifiedOn: # 이 기록은 이번 회차에 실행 확인을 하지
# path·identifier는 등록하고 value는 바인딩한다
구조를 가리키는 것과 데이터를 담는 것을 같은 방식으로 다루어, 구조 자리에 임의 문자열이 들어가거나 값 자리에 코드가 들어가는 것을 막는다. 경로와 정렬 키와 컬럼 이름은 등록된 집합에서만 고르고, 비교 대상과 필터 값은 파라미터로 넘긴다.
## 목적
구조를 가리키는 것과 데이터를 담는 것을 같은 방식으로 다루어, 구조 자리에 임의 문자열이 들어가거나 값 자리에 코드가 들어가는 것을 막는다.
@@ -12,6 +12,8 @@ verifiedOn: # 이 기록은 이번 회차에 실행 확인을 하지
# 관측을 위해 수집한 데이터가 관측 대상보다 위험할 수 있다
로그와 메트릭과 리포트가 원본보다 더 오래 보관되고 더 넓게 공유된다는 사실을 잊고, 관측 경로로 민감한 데이터를 흘리는 것을 막는다. 공개 시점에 지울 것을 정하는 대신 애초에 들어올 수 없는 타입을 쓴다.
## 목적
로그와 메트릭과 리포트가 원본보다 더 오래 보관되고 더 넓게 공유된다는 사실을 잊고, 관측 경로로 민감한 데이터를 흘리는 것을 막는다.
@@ -21,6 +21,8 @@ source:
# 지원 등급은 추론이 아니라 선언이고 증거 없이는 올라가지 않는다
능력의 지원 등급은 코드가 존재한다는 사실에서 추론하지 않고 명시적으로 선언하며, 승격은 정해진 증거를 요구한다. 등급을 추론하면 조립되지 않은 능력과 소비자가 없는 코디네이터와 적용 지점이 없는 검증기가 전부 지원으로 보고된다.
## 결정문
능력의 지원 등급은 코드가 존재한다는 사실에서 추론하지 않고 명시적으로 선언하며, 승격은 정해진 증거를 요구한다.
@@ -12,6 +12,8 @@ verifiedOn: # 이 기록은 이번 회차에 실행 확인을 하지
# 과대 진술 문서를 과소보다 먼저 고친다
문서 드리프트를 발견 순서대로 고치다가, 읽는 사람에게 위험한 방향의 드리프트를 뒤로 미루는 것을 막는다. 문서를 믿고 자기 방어를 생략한 사람이 손해를 보므로 과대 진술이 먼저고, 과소 진술은 불편을 주지만 안전한 쪽으로 틀린다.
## 목적
문서 드리프트를 발견 순서대로 고치다가, 읽는 사람에게 위험한 방향의 드리프트를 뒤로 미루는 것을 막는다.
@@ -12,6 +12,8 @@ verifiedOn: # 이 기록은 이번 회차에 실행 확인을 하지
# Atomic* 타입의 존재는 원자성의 증거가 아니다
Atomic 계열 타입이 쓰였다는 것을 그 연산이 원자적이라는 증거로 읽어, 여러 연산에 걸친 경합을 놓치는 것을 막는다. 원자성의 단위는 타입이 아니라 연산 묶음이고, 각각의 읽기와 쓰기가 원자적이어도 둘을 잇는 판단은 원자적이지 않다.
## 목적
Atomic 계열 타입이 쓰였다는 것을 그 연산이 원자적이라는 증거로 읽어, 여러 연산에 걸친 경합을 놓치는 것을 막는다.
@@ -12,6 +12,8 @@ verifiedOn: # 이 기록은 이번 회차에 실행 확인을 하지
# 중복 장치를 찾으면 어느 쪽이 조립됐는지 먼저 확인한다
같은 일을 하는 구현이 둘 있을 때 정교한 쪽을 읽고 판정해서, 실제로 도는 약한 쪽을 놓치는 것을 막는다. 정교한 구현은 늦게 만들어지고 배선이 뒤따르지 않는 경우가 많아, 그동안 원래 있던 사본이 계속 돈다.
## 목적
같은 일을 하는 구현이 둘 있을 때 정교한 쪽을 읽고 판정해서, 실제로 도는 약한 쪽을 놓치는 것을 막는다.
@@ -6,13 +6,14 @@ topic: fileserver-state-and-fencing
project: clean-architecture-backend-template
status: 게시 전
sourceRevision: 21234e38cdb9a926cbc92bb97a2aee2e4a7d2916
basisVersion: PostgreSQL 16 · Spring Boot 4.0.8 · 리비전 21234e38
rootTreeNode: concept:file-state-machine-and-ready
evidenceCapturedOn: 2026-09-01
assets:
- key: file-state-machine-and-ready
file: ../../../final/evidence/rendered/file-state-machine-and-ready.svg
- key: file-state-machine-and-ready-diagram
file: ../../../final/assets/diagrams/file-state-machine-and-ready.svg
file: ../../../final/assets/diagrams/file-state-machine-and-ready/file-state-machine-and-ready.svg
evidence:
- ../../../final/evidence/raw/file-state-machine-and-ready.txt
source:
@@ -6,13 +6,14 @@ topic: http-failure-classification
project: clean-architecture-backend-template
status: 게시 전
sourceRevision: 21234e38cdb9a926cbc92bb97a2aee2e4a7d2916
basisVersion: Spring Boot 4.0.8 · Java 21 · 리비전 21234e38
rootTreeNode: concept:transport-failure-stage-and-category
evidenceCapturedOn: 2026-09-01
assets:
- key: transport-failure-stage-and-category
file: ../../../final/evidence/rendered/transport-failure-stage-and-category.svg
- key: transport-failure-stage-and-category-diagram
file: ../../../final/assets/diagrams/transport-failure-stage-and-category.svg
file: ../../../final/assets/diagrams/transport-failure-stage-and-category/transport-failure-stage-and-category.svg
evidence:
- ../../../final/evidence/raw/transport-failure-stage-and-category.txt
source:
@@ -21,6 +21,8 @@ source:
# 재시도 안전성은 증거에 기반해 판정한다
재시도 여부는 무엇이 실패했는지가 아니라 무엇이 관측됐는지로 판정한다. 요청이 서버에 닿지 않았으면 재시도는 첫 시도이고 닿았을지도 모르면 중복인데, 예외 타입은 그 구분을 담지 않는다.
## 결정문
재시도 여부는 무엇이 실패했는지가 아니라 무엇이 관측됐는지로 판정한다.
@@ -20,6 +20,8 @@ source:
# gRPC 플랫폼은 build-only로 두고 애플리케이션 도달 경로를 먼저 정한다
gRPC 가족의 18개 리프는 어떤 런타임 컴포지션에도 넣지 않고, 배선하려면 레지스트리를 먼저 바꾸고 게이트를 통과시켜야 한다. messaging 가족은 스타터를 컴포지션 루트의 의존으로 넣어 25개 리프가 출하 아티팩트에 실렸고, 그 선을 넘지 않기로 했다.
## 결정문
gRPC 가족의 18개 리프는 어떤 런타임 컴포지션에도 넣지 않고, 배선하려면 레지스트리를 먼저 바꾸고 게이트를 통과시켜야 한다.
@@ -12,6 +12,8 @@ verifiedOn: # 이 기록은 이번 회차에 실행 확인을 하지
# 레지스트리로 표현된 규칙은 전이되고 CI로 표현된 규칙은 전이되지 않는다
구조를 복제할 때 검증 배선이 함께 오지 않는 것을, 복제 시점에 알아채도록 한다. 다음 사람이 같은 파일을 편집하면서 마주치는 규칙은 따라 하게 되고, 새 모듈을 만들면서 워크플로 파일을 열 이유는 없다.
## 목적
구조를 복제할 때 검증 배선이 함께 오지 않는 것을, 복제 시점에 알아채도록 한다.
@@ -6,13 +6,14 @@ topic: multitenancy-isolation
project: clean-architecture-backend-template
status: 게시 전
sourceRevision: 21234e38cdb9a926cbc92bb97a2aee2e4a7d2916
basisVersion: PostgreSQL 16 · 리비전 21234e38
rootTreeNode: concept:rls-three-preconditions
evidenceCapturedOn: 2026-09-01
assets:
- key: rls-three-preconditions
file: ../../../final/evidence/rendered/rls-three-preconditions.svg
- key: rls-three-preconditions-diagram
file: ../../../final/assets/diagrams/rls-three-preconditions.svg
file: ../../../final/assets/diagrams/rls-three-preconditions/rls-three-preconditions.svg
evidence:
- ../../../final/evidence/raw/rls-three-preconditions.txt
source:
@@ -18,6 +18,8 @@ source:
# 클래스패스에 있는 것은 실행 동의가 아니다
실험 모듈은 명시적 플래그가 설정될 때만 동작하고, 플래그가 없으면 조용히 꺼지는 대신 오류로 실패한다. 실험 모듈은 전이 의존으로 도착할 수 있어서, 테넌트 격리가 jar 가 있다는 이유로 스스로 켜지면 켜졌는지 모르는 격리를 신뢰하게 된다.
## 결정문
실험 모듈은 명시적 플래그가 설정될 때만 동작하고, 플래그가 없으면 조용히 꺼지는 대신 오류로 실패한다.
@@ -6,13 +6,14 @@ topic: objectstorage-staged-lifecycle
project: clean-architecture-backend-template
status: 게시 전
sourceRevision: 21234e38cdb9a926cbc92bb97a2aee2e4a7d2916
basisVersion: Spring Boot 4.0.8 · Java 21 · 리비전 21234e38
rootTreeNode: concept:staged-lifecycle-and-signed-grants
evidenceCapturedOn: 2026-09-01
assets:
- key: staged-lifecycle-and-signed-grants
file: ../../../final/evidence/rendered/staged-lifecycle-and-signed-grants.svg
- key: staged-lifecycle-and-signed-grants-diagram
file: ../../../final/assets/diagrams/staged-lifecycle-and-signed-grants.svg
file: ../../../final/assets/diagrams/staged-lifecycle-and-signed-grants/staged-lifecycle-and-signed-grants.svg
evidence:
- ../../../final/evidence/raw/staged-lifecycle-and-signed-grants.txt
source:
@@ -6,13 +6,14 @@ topic: owner-safe-state-machines
project: clean-architecture-backend-template
status: 게시 전
sourceRevision: 21234e38cdb9a926cbc92bb97a2aee2e4a7d2916
basisVersion: Flyway 11.14.1 · PostgreSQL 16 · 리비전 21234e38
rootTreeNode: concept:capability-schema-registry
evidenceCapturedOn: 2026-09-01
assets:
- key: capability-schema-registry
file: ../../../final/evidence/rendered/capability-schema-registry.svg
- key: capability-schema-registry-diagram
file: ../../../final/assets/diagrams/capability-schema-registry.svg
file: ../../../final/assets/diagrams/capability-schema-registry/capability-schema-registry.svg
evidence:
- ../../../final/evidence/raw/capability-schema-registry.txt
source:
@@ -6,13 +6,14 @@ topic: owner-safe-state-machines
project: clean-architecture-backend-template
status: 게시 전
sourceRevision: 21234e38cdb9a926cbc92bb97a2aee2e4a7d2916
basisVersion: PostgreSQL 16 · Spring Boot 4.0.8 · 리비전 21234e38
rootTreeNode: concept:cas-tuple-and-update-count
evidenceCapturedOn: 2026-09-01
assets:
- key: cas-tuple-and-update-count
file: ../../../final/evidence/rendered/cas-tuple-and-update-count.svg
- key: cas-tuple-and-update-count-diagram
file: ../../../final/assets/diagrams/cas-tuple-and-update-count.svg
file: ../../../final/assets/diagrams/cas-tuple-and-update-count/cas-tuple-and-update-count.svg
evidence:
- ../../../final/evidence/raw/cas-tuple-and-update-count.txt
source:
@@ -6,6 +6,7 @@ topic: owner-safe-state-machines
project: clean-architecture-backend-template
status: 게시 전
sourceRevision: 21234e38cdb9a926cbc92bb97a2aee2e4a7d2916
basisVersion: PostgreSQL 16 · Flyway 11.14.1 · 리비전 21234e38
rootTreeNode: concept:fenced-lease
evidenceCapturedOn: 2026-09-01
assets:
@@ -18,6 +18,8 @@ source:
# capability는 스키마 적용과 사용 승인을 분리한다
능력의 스키마가 설치되었다는 사실과 그 능력을 사용해도 된다는 승인을 별개의 기록으로 둔다. 설치는 마이그레이션이 돌면 일어나고 승인은 운영자가 정하는데, 하나로 묶으면 단계적 활성화나 롤백 같은 운영 판단이 스키마 배포 일정에 묶인다.
## 결정문
능력의 스키마가 설치되었다는 사실과 그 능력을 사용해도 된다는 승인을 별개의 기록으로 둔다.
@@ -12,6 +12,8 @@ verifiedOn: # 이 기록은 이번 회차에 실행 확인을 하지
# CAS 튜플을 where 절에 전부 반복하고 update count를 답으로 쓴다
행을 읽고 나서 갱신하는 형태를 없애, 리스가 만료된 작업자가 인계받은 작업자의 상태를 덮는 것을 막는다. 소유자 튜플 전체를 where 절에 반복하고 갱신 건수를 답으로 받으며, 0 건은 예외가 아니라 정상 경로다.
## 목적
행을 읽고 나서 갱신하는 형태를 없애, 리스가 만료된 작업자가 인계받은 작업자의 상태를 덮는 것을 막는다.
@@ -12,6 +12,8 @@ verifiedOn: # 이 기록은 이번 회차에 실행 확인을 하지
# 시간은 DB에서, 그리고 행을 잠근 다음에 읽는다
애플리케이션 시계로 리스 만료를 판단하거나 잠그기 전의 시각으로 판단해, 서로 다른 노드가 같은 행에 대해 다른 답을 내는 것을 막는다. 시각은 데이터베이스에서 읽고, 행을 잠근 다음에 읽으며, 판정과 갱신을 한 문장 안에 둔다.
## 목적
애플리케이션 시계로 리스 만료를 판단하거나 잠그기 전의 시각으로 판단해, 서로 다른 노드가 같은 행에 대해 다른 답을 내는 것을 막는다.
@@ -6,13 +6,14 @@ topic: redis-command-admission
project: clean-architecture-backend-template
status: 게시 전
sourceRevision: 21234e38cdb9a926cbc92bb97a2aee2e4a7d2916
basisVersion: Lettuce 6.8.2.RELEASE · Spring Boot 4.0.8 · 리비전 21234e38
rootTreeNode: concept:redis-admission-stages
evidenceCapturedOn: 2026-09-01
assets:
- key: redis-admission-stages
file: ../../../final/evidence/rendered/redis-admission-stages.svg
- key: redis-admission-stages-diagram
file: ../../../final/assets/diagrams/redis-admission-stages.svg
file: ../../../final/assets/diagrams/redis-admission-stages/redis-admission-stages.svg
evidence:
- ../../../final/evidence/raw/redis-admission-stages.txt
source:
@@ -6,6 +6,7 @@ topic: schema-ownership-and-capability-streams
project: clean-architecture-backend-template
status: 게시 전
sourceRevision: 21234e38cdb9a926cbc92bb97a2aee2e4a7d2916
basisVersion: Flyway 11.14.1 · PostgreSQL 16 · 리비전 21234e38
rootTreeNode: concept:independent-flyway-streams
evidenceCapturedOn: 2026-09-01
assets:
@@ -18,6 +18,8 @@ source:
# Flyway가 스키마를 소유하고 런타임 롤은 DDL 권한을 갖지 않는다
스키마 변경은 Flyway 마이그레이션으로만 하고, 애플리케이션이 실행 시 쓰는 데이터베이스 롤에는 DDL 권한을 주지 않는다. 스키마 소유자가 둘이면 어느 쪽이 현재 상태를 만들었는지 알 수 없고, 권한 분리가 그 결정을 강제한다.
## 결정문
스키마 변경은 Flyway 마이그레이션으로만 하고, 애플리케이션이 실행 시 쓰는 데이터베이스 롤에는 DDL 권한을 주지 않는다.
@@ -12,6 +12,8 @@ verifiedOn: # 이 기록은 이번 회차에 실행 확인을 하지
# 로컬이 다른 DB면 로컬 테스트는 다른 시스템에 대한 진술이다
로컬에서 초록불이라는 사실을 배포 대상에 대한 증거로 읽는 것을 막는다. 로컬 데이터베이스가 다르면 방언과 타입 매핑과 제약 처리와 잠금 동작이 다르고, 스키마를 엔티티에서 만드는 구성은 스키마 불일치를 원리적으로 발견하지 못한다.
## 목적
로컬에서 초록불이라는 사실을 배포 대상에 대한 증거로 읽는 것을 막는다.
@@ -6,13 +6,14 @@ topic: self-disclosure-grading
project: clean-architecture-backend-template
status: 게시 전
sourceRevision: 21234e38cdb9a926cbc92bb97a2aee2e4a7d2916
basisVersion: Spring Boot 4.0.8 · Java 21 · 리비전 21234e38
rootTreeNode: concept:four-grade-disclosure
evidenceCapturedOn: 2026-09-01
assets:
- key: four-grade-disclosure
file: ../../../final/evidence/rendered/four-grade-disclosure.svg
- key: four-grade-disclosure-diagram
file: ../../../final/assets/diagrams/four-grade-disclosure.svg
file: ../../../final/assets/diagrams/four-grade-disclosure/four-grade-disclosure.svg
evidence:
- ../../../final/evidence/raw/four-grade-disclosure.txt
source:
@@ -19,6 +19,8 @@ source:
# 능력 등급은 코드가 아니라 실행된 증거에서 파생한다
능력의 등급은 그 능력을 구현한 코드의 존재가 아니라 실행된 테스트와 그 결과에서 파생한다. 코드가 있다는 사실은 가장 약한 증거이고, 이 저장소에는 코드가 있고 조립되지 않은 사례도 조립되었으나 호출되지 않는 사례도 있다.
## 결정문
능력의 등급은 그 능력을 구현한 코드의 존재가 아니라 실행된 테스트와 그 결과에서 파생한다.
@@ -12,6 +12,8 @@ verifiedOn: # 이 기록은 이번 회차에 실행 확인을 하지
# 등급은 네 단계로 나누고 관측보다 높게 적지 않는다
능력 성숙도를 자기 신고할 때 낙관적으로 적어, 그 표를 읽고 배포를 결정하는 사람이 없는 것을 있다고 믿는 것을 막는다. 단계마다 요구하는 증거를 정의하고, 낮게 적는 것은 허용하되 높게 적는 것은 금지한다.
## 목적
능력 성숙도를 자기 신고할 때 낙관적으로 적어, 그 표를 읽고 배포를 결정하는 사람이 없는 것을 있다고 믿는 것을 막는다.
@@ -12,6 +12,8 @@ verifiedOn: # 이 기록은 이번 회차에 실행 확인을 하지
# runtime_memberships를 먼저 읽고 심각도를 정한다
같은 형태의 결함에 같은 심각도를 매겨, 배포되지 않는 코드의 문제와 지금 도는 코드의 문제를 구별하지 못하는 것을 막는다. 멤버십이 비어 있으면 오늘의 사고가 아니지만, 배선되는 날 한꺼번에 오늘의 사고가 되므로 그날의 목록이 지금 있어야 한다.
## 목적
같은 형태의 결함에 같은 심각도를 매겨, 배포되지 않는 코드의 문제와 지금 도는 코드의 문제를 구별하지 못하는 것을 막는다.
@@ -7,7 +7,7 @@
"revision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verified": "git rev-parse HEAD 가 이 값과 같다 (2026-09-07 확인)"
},
"ssotSha256": "68c09e69b095f50e030a3b7454417d07f9ecb1a9c9ed4c04197b0f406ecc2405",
"ssotSha256": "8071fe71b3359d9cf60b95909c26c7b50653ce2f22bbc5fcf6988719bb91236d",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"generatedAt": "2026-09-11",
"candidateScope": {
@@ -6,13 +6,14 @@ topic: transaction-deadline-and-pool
project: clean-architecture-backend-template
status: 게시 전
sourceRevision: 21234e38cdb9a926cbc92bb97a2aee2e4a7d2916
basisVersion: Spring Boot 4.0.8 · PostgreSQL 16 · 리비전 21234e38
rootTreeNode: concept:deadline-propagation
evidenceCapturedOn: 2026-09-01
assets:
- key: deadline-propagation
file: ../../../final/evidence/rendered/deadline-propagation.svg
- key: deadline-propagation-diagram
file: ../../../final/assets/diagrams/deadline-propagation.svg
file: ../../../final/assets/diagrams/deadline-propagation/deadline-propagation.svg
evidence:
- ../../../final/evidence/raw/deadline-propagation.txt
source:
@@ -6,6 +6,7 @@ topic: transaction-deadline-and-pool
project: clean-architecture-backend-template
status: 게시 전
sourceRevision: 21234e38cdb9a926cbc92bb97a2aee2e4a7d2916
basisVersion: Spring Boot 4.0.8 · PostgreSQL 16 · 리비전 21234e38
rootTreeNode: concept:requires-new-connection-cost
evidenceCapturedOn: 2026-09-01
assets:
@@ -17,6 +17,8 @@ source:
# inRootWrite는 suspend하지 않고 fail-fast한다
루트 쓰기 연산은 이미 트랜잭션이 열려 있으면 바깥을 일시 중단하지 않고 예외를 던진다. 일시 중단하면 바깥 커넥션이 핀되고, 호출자는 자기가 루트라고 믿는데 실제로는 중첩 안에 있게 된다.
## 결정문
루트 쓰기 연산은 이미 트랜잭션이 열려 있으면 바깥을 일시 중단하지 않고 예외를 던진다.
@@ -17,6 +17,8 @@ source:
# 트랜잭션 템플릿은 모드별로 미리 만들어 둔다
트랜잭션 템플릿을 모드마다 하나씩 미리 만들어 두고, 호출마다 템플릿의 속성을 바꾸지 않는다. 템플릿은 가변 객체라 하나를 공유하면서 호출마다 전파 방식이나 타임아웃을 바꾸면 두 스레드가 서로의 설정을 본다.
## 결정문
트랜잭션 템플릿을 모드마다 하나씩 미리 만들어 두고, 호출마다 템플릿의 속성을 바꾸지 않는다.
@@ -6,13 +6,14 @@ topic: what-a-gate-does-not-prove
project: clean-architecture-backend-template
status: 게시 전
sourceRevision: 21234e38cdb9a926cbc92bb97a2aee2e4a7d2916
basisVersion: Gradle 9.0.0 · Java 21 · 리비전 21234e38
rootTreeNode: concept:evidence-grades-and-provenance
evidenceCapturedOn: 2026-09-01
assets:
- key: evidence-grades-and-provenance
file: ../../../final/evidence/rendered/evidence-grades-and-provenance.svg
- key: evidence-grades-and-provenance-diagram
file: ../../../final/assets/diagrams/evidence-grades-and-provenance.svg
file: ../../../final/assets/diagrams/evidence-grades-and-provenance/evidence-grades-and-provenance.svg
evidence:
- ../../../final/evidence/raw/evidence-grades-and-provenance.txt
source:
@@ -6,6 +6,7 @@ topic: what-a-gate-does-not-prove
project: clean-architecture-backend-template
status: 게시 전
sourceRevision: 21234e38cdb9a926cbc92bb97a2aee2e4a7d2916
basisVersion: Gradle 9.0.0 · Java 21 · 리비전 21234e38
rootTreeNode: concept:strict-test-lane
evidenceCapturedOn: 2026-09-01
assets:
@@ -18,6 +18,8 @@ source:
# 후보 증거는 통과해도 R1에 머무르고 R2는 별도 게이트가 판정한다
후보 검증을 전부 통과한 증거도 등급은 R1 을 유지하고, R2 승격은 provenance 조건을 갖춘 별도 게이트만 판정한다. 후보 검증은 결과의 내용을 보고 R2 는 출처를 보는데, 내용이 완벽해도 출처를 알 수 없으면 나중에 그 결과를 다시 확인할 수 없다.
## 결정문
후보 검증을 전부 통과한 증거도 등급은 R1 을 유지하고, R2 승격은 provenance 조건을 갖춘 별도 게이트만 판정한다.
@@ -19,6 +19,8 @@ source:
# 인증 레인만 Docker 가드를 달지 않는다
컨테이너를 쓰는 모든 suite 는 Docker 가 없으면 이유를 적고 건너뛰되, 인증 레인만은 건너뛰지 않는다. 건너뛰는 레인은 아무도 시작하지 않은 브로커에 대해 성공을 보고하고, 주장의 근거가 없을 때 성공을 내는 것은 인증의 반대다.
## 결정문
컨테이너를 쓰는 모든 suite 는 Docker 가 없으면 이유를 적고 건너뛰되, 인증 레인만은 건너뛰지 않는다.
@@ -19,6 +19,8 @@ source:
# 성능 측정은 릴리스 게이트에 넣지 않는다
성능 레인은 릴리스 게이트에 포함하지 않고, 기계 의존적인 측정을 게이트 판정의 입력으로 삼지 않는다. 불안정한 게이트는 꺼지고, 꺼진 게이트는 목록에 남아 누군가 그것이 지키고 있다고 믿게 하므로 없는 게이트보다 나쁘다.
## 결정문
성능 레인은 릴리스 게이트에 포함하지 않고, 기계 의존적인 측정을 게이트 판정의 입력으로 삼지 않는다.
@@ -12,6 +12,8 @@ verifiedOn: # 이 기록은 이번 회차에 실행 확인을 하지
# 계약 테스트는 어댑터가 실제로 돌리는 statement를 실행해야 한다
테스트가 직접 만든 statement 나 픽스처 경로를 검증하고, 프로덕션 어댑터가 실제로 실행하는 경로는 검증하지 않는 상태를 막는다. 테스트가 SQL 이나 요청을 직접 구성하면 어댑터의 구성 로직이 검증되지 않는다.
## 목적
테스트가 직접 만든 statement 나 픽스처 경로를 검증하고, 프로덕션 어댑터가 실제로 실행하는 경로는 검증하지 않는 상태를 막는다.
@@ -12,6 +12,8 @@ verifiedOn: # 이 기록은 이번 회차에 실행 확인을 하지
# 산문이 선언한 게이트는 빌드에 있는 게이트가 아니다
주석이나 문서가 검사의 실행을 단언할 때 그것을 관찰로 읽지 않게 한다. 게이트가 도는지를 묻기 전에 그 문장이 지목한 심볼 이름으로 빌드 스크립트와 CI 정의를 검색하고, 나오지 않으면 그 문장은 지금 사실이 아니다.
## 목적
주석이나 문서가 검사의 실행을 단언할 때 그것을 관찰로 읽지 않게 한다. 게이트가 도는지를 묻기 전에 게이트가 존재한다는 문장이 무엇에 근거하는지 묻는다.
@@ -12,6 +12,8 @@ verifiedOn: # 이 기록은 이번 회차에 실행 확인을 하지
# 아무도 돌리지 않는 레인의 게이트는 마지막으로 돌린 사람이 본 것을 보고한다
게이트가 존재한다는 사실을 그것이 주기적으로 판정한다는 증거로 읽는 것을 막는다. 결과에 provenance 가 없으면 언제 어디서 나온 결과인지 알 수 없어, 오래된 산출물이 현재 판정으로 읽힌다.
## 목적
게이트가 존재한다는 사실을 그것이 주기적으로 판정한다는 증거로 읽는 것을 막는다.
@@ -12,6 +12,8 @@ verifiedOn: # 이 기록은 이번 회차에 실행 확인을 하지
# 아무것도 발견하지 못한 레인은 성공이 아니라 실패여야 한다
선택 조건에 맞는 테스트가 0개인 레인이 초록불을 내어, 아무도 테스트하지 않은 것에 대해 성공이 보고되는 것을 막는다. 발견 0 은 실패이고, 레인은 업투데이트를 주장하지 않으며, 리프가 이 두 설정을 끌 수 없게 만든다.
## 목적
선택 조건에 맞는 테스트가 0개인 레인이 초록불을 내어, 아무도 테스트하지 않은 것에 대해 성공이 보고되는 것을 막는다.
@@ -12,6 +12,8 @@ verifiedOn: # 이 기록은 이번 회차에 실행 확인을 하지
# 문서와 상수가 서로 일치하는 것으로는 아무것도 증명되지 않는다
두 선언이 서로 같다는 것을 그 선언이 실제 동작과 같다는 증거로 읽는 것을 막는다. 문서와 상수가 같다는 것은 둘을 같이 고쳤다는 뜻이므로, 비교 대상 중 한쪽은 실행 결과이거나 실행 경로에서 읽히는 값이어야 한다.
## 목적
두 선언이 서로 같다는 것을 그 선언이 실제 동작과 같다는 증거로 읽는 것을 막는다.
@@ -12,6 +12,8 @@ verifiedOn: # 이 기록은 이번 회차에 실행 확인을 하지
# 빠뜨림이 통과가 되는 게이트는 게이트가 아니다
검사 대상 목록에서 빠진 것이 통과로 처리되어, 규칙이 새로 추가된 것에 대해 아무 말도 하지 않는 상태를 막는다. 목록은 실제 트리와 정확히 같은지 비교하고, 검사가 대상을 찾지 못하면 실패시킨다.
## 목적
검사 대상 목록에서 빠진 것이 통과로 처리되어, 규칙이 새로 추가된 것에 대해 아무 말도 하지 않는 상태를 막는다.