The keycloak project ended with four open questions that design could not
settle. A two-VM lab was built to answer them by measurement, and this is
that material: 26 experiments, 125 raw command outputs, 22 browser captures.
Follows the import procedure in README.md.
source/ the originating repository verbatim — 78 documents, 28 SVGs,
8 manifests, plus .source-revision recording the commit
final/ the SSOT
document.md 729 lines written from the 29 experiment documents, not
concatenated: what was predicted, what was measured, and
where the measurement itself was wrong
evidence/raw 125 outputs, flattened to <experiment>__<file> because
the originals collided (01-baseline.txt appeared three
times) and the audit only globs the top level
evidence/meta one per raw file; command and exitCode are null and the
README says why rather than inventing them
evidence/browser 22 captures
assets/ three diagrams through techviz
.techviz/ their VizSpecs
A separate project rather than an addition to keycloak: the B-layer answers
that project's four questions, but the A, C and D layers are about cluster
failure, SSO and operations, and one document.md should hold one subject.
The four question records there can point here through 관계.
Recorded rather than papered over: only three of the 28 diagrams were
remade. The repository forbids hand-drawn SVG and forbids titles inside the
canvas; all 28 originals carry both, so converting them is redrawing, not
reformatting. They stay in source/ and the gap is written into the document.
verify-pipeline.py passes. audit-records.py reports no issues.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
64 lines
3.6 KiB
Markdown
64 lines
3.6 KiB
Markdown
---
|
|
kind: REFERENCE
|
|
slug: a-gate-declared-in-prose-is-not-in-the-build
|
|
title: 산문이 선언한 게이트는 빌드에 있는 게이트가 아니다
|
|
topic: what-a-gate-does-not-prove
|
|
project: clean-architecture-backend-template
|
|
status: 게시 전
|
|
sourceRevision: 21234e38cdb9a926cbc92bb97a2aee2e4a7d2916
|
|
rootTreeNode: reference:a-gate-declared-in-prose-is-not-in-the-build
|
|
verifiedOn: # 이 기록은 이번 회차에 실행 확인을 하지 않았다
|
|
---
|
|
|
|
# 산문이 선언한 게이트는 빌드에 있는 게이트가 아니다
|
|
|
|
## 목적
|
|
|
|
주석이나 문서가 검사의 실행을 단언할 때 그것을 관찰로 읽지 않게 한다. 게이트가 도는지를 묻기 전에 게이트가 존재한다는 문장이 무엇에 근거하는지 묻는다.
|
|
|
|
## 규칙
|
|
|
|
1. 실행을 단언하는 문장을 먼저 찾는다
|
|
빌드를 실패시킨다, 기동 시점에 거부한다, 다른 방식으로 조립된 런타임도 확인한다 같은 현재 시제 문장이 대상이다.
|
|
|
|
2. 그 문장이 지목한 심볼 이름으로 빌드 스크립트와 CI 정의를 검색한다
|
|
나오지 않으면 그 문장은 지금 사실이 아니다.
|
|
|
|
3. 실행하는 것이 테스트뿐이면 그 테스트의 대상 집합을 확인한다
|
|
목록이 하드코딩되어 있으면 게이트의 범위는 그 목록이지 저장소가 아니다.
|
|
|
|
4. 미래를 서술하는 선언과 구분한다
|
|
아직 돌지 않는다고 시제로 밝힌 선언은 이 규칙의 대상이 아니다.
|
|
|
|
## 적용 조건
|
|
|
|
주석 밀도가 높은 저장소의 모든 검증 코드. 근거를 문장으로 남기는 관행이 자산인 만큼, 그 문장이 실행을 단언할 때 비용도 같이 커진다. 읽는 사람이 게이트의 존재를 근거 있게 믿기 때문이다.
|
|
|
|
## 예외
|
|
|
|
의도적으로 미래를 서술하는 선언은 문제가 아니다. 다만 시제가 달라야 한다. 코드 생성 매니페스트가 좋은 예다. 이 빌드에서는 아직 돌지 않는다고 적고, 왜 돌지 않는지를 결정 기록으로 지목하며, 이 매니페스트는 그것을 켜기로 하는 미래의 결정이 대체가 아니라 만족시켜야 할 선언이라고 적는다.
|
|
|
|
## 예시
|
|
|
|
이 저장소에서 다섯 곳이 걸렸다.
|
|
|
|
스키마 규칙 엔진은 두 파일이 빌드를 실패시킨다고 적는데 빌드 스크립트에 이름이 없다.
|
|
|
|
스키마 거버넌스 정책의 네 수명주기 태스크 이름은 어떤 빌드 파일에도 없고, 그 javadoc 은 이름을 정책에 두면 단계가 사라질 때 테스트가 실패한다고 적는다.
|
|
|
|
고급 모듈 가드의 런타임 확인 메서드는 팻 자와 셰이드 산출물과 테스트 하네스도 확인한다고 적는데 호출자가 없다.
|
|
|
|
두 실험 어댑터의 프로파일 검증기는 전송 javadoc 이 기동 시점 거부를 단언하는데, 한쪽은 흔적이 javadoc 링크 한 줄이고 다른 쪽은 자기 선언 말고 아무 데도 없다.
|
|
|
|
## 관계
|
|
|
|
- **두 파일이 같은 검증기를 빌드를 실패시키는 것이라 적고 어떤 빌드도 그것을 부르지 않는다**
|
|
이 규칙을 만든 사례다.
|
|
- **아무도 돌리지 않는 레인의 게이트는 마지막으로 돌린 사람이 본 것을 보고한다**
|
|
이 규칙의 다음 단계다. 게이트가 존재한 뒤에 무엇이 그것을 주기적으로 돌리는가를 묻는다.
|
|
- **시작 검증기가 네 설정 키의 유일한 소비자인데 시작 시 실행되지 않는다**
|
|
같은 형태가 구성 경계에서 나타난 사례다.
|
|
- **검증기는 발행이 아니라 주입이 강제다**
|
|
실행 경로를 묻는 같은 계열의 규칙이다.
|
|
|