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>
8.8 KiB
kind, slug, title, topic, project, status, sourceRevision, rootTreeNode, evidenceCapturedOn, assets, evidence, source
| kind | slug | title | topic | project | status | sourceRevision | rootTreeNode | evidenceCapturedOn | assets | evidence | source | |||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| CASE | a-soak-threshold-written-for-a-grade-that-does-not-exist | 담금 임계값이 열거형에 없는 등급을 위해 쓰여 중간 등급으로 올라가는 것이 더 어려워졌다 | self-disclosure-grading | clean-architecture-backend-template | 게시 전 | 21234e38cdb9a926cbc92bb97a2aee2e4a7d2916 | case:a-soak-threshold-written-for-a-grade-that-does-not-exist | 2026-09-02 |
|
|
|
담금 임계값이 열거형에 없는 등급을 위해 쓰여 중간 등급으로 올라가는 것이 더 어려워졌다
승격 게이트가 담금 기간 임계값 둘을 갖는다. 긴 쪽은 열거형에 없는 등급을 위해 쓰였고, 선택이 그 등급이 아닌 나머지 전부를 긴 쪽으로 보낸다. 그래서 담금 기록이 가장 적을 등급이 밟아야 하는 첫 걸음이 상위 등급으로 가는 것보다 엄격해졌다.
관계
- 등급은 네 단계로 나누고 관측보다 높게 적지 않는다 같은 주제의 규칙이고 이 사례는 그 반대편이다. 여기서는 낮은 등급으로 올라가는 것이 더 어렵다.
- 지원 등급은 추론이 아니라 선언이고 증거 없이는 올라가지 않는다 등급 체계를 코드로 두는 결정이다.
- 이름이 검사한다고 말하는 것을 본문이 검사하지 않는 테스트 넷 이 결함을 덮은 테스트가 그 목록의 넷째다.
문제
게이트 javadoc 의 모형은 등급 둘이다. 하나는 능력이 동작하고 문서화되었다는 것이고, 다른 하나는 모든 배포가 그것을 받게 된다는 것이다. 둘째가 의존성을 모든 클래스패스에 올리고 실패 양식을 모든 당직에 올리므로 첫째에 더해 더 긴 담금을 요구한다는 설명이 붙어 있다.
상수도 둘이다. 짧은 쪽이 이레, 긴 쪽이 서른 날이다.
결론
둘째 등급이 열거형에 없다. 값은 넷이고 그중 어느 것도 그 이름이 아니다.
담금 선택은 목표 등급이 첫째 등급이면 짧은 쪽, 아니면 긴 쪽이다. 그러므로 첫째가 아닌 나머지 세 등급 전부가 긴 쪽으로 떨어진다.
증거 항목 일곱 개는 목표 등급과 무관하게 요구된다. 그래서 결과가 뒤집힌다. 중간 등급에서 첫째 등급으로 올라가려면 일곱 항목과 이레가 필요하고, 추적 등급에서 중간 등급으로 올라가려면 일곱 항목과 서른 날이 필요하다.
같은 메서드의 셋째 차단 사유가 추적 등급의 능력은 다른 무엇보다 먼저 중간 등급을 밟아야 한다고 적는다. 그 강제된 첫 걸음이 상위 등급으로 가는 것보다 엄격하다. 추적 등급의 뜻이 추적할 뿐 구현되지 않았다는 것이므로, 정의상 담금 기록이 가장 적을 등급에 가장 긴 담금이 붙는다.
테스트가 그 뒤틀림을 그대로 보여 준다. 긴 갈래를 실행하려고 고른 전이가 철회 방향인데 표시 이름은 둘째 등급이 되는 것이라고 말한다. 그리고 중간 등급으로 올라가는 테스트는 담금을 예순 날로 준다.
검증 환경
OpenJDK : 21.0.12 Gradle : 9.0.0 확인 방식 : 평가 메서드 본문과 등급 열거형 대조, 두 테스트가 고른 숫자 확인, 해당 테스트 실행 소스 수정 : x
재현 조건
- 승격 게이트의 두 담금 상수와 그 javadoc 의 등급 모형을 읽는다.
- 등급 열거형의 값을 전부 나열하고 javadoc 의 둘째 등급이 그 안에 있는지 센다.
- 증거 검사와 담금 선택을 잇는 구간을 읽고, 어느 쪽에 목표 등급 조건이 있는지 확인한다.
- 추적 등급 차단 사유의 조건과 문구를 확인한다.
- 긴 갈래를 실행하는 테스트가 고른 전이와 표시 이름을 대조하고, 중간 등급 테스트가 담금에 넣은 값을 확인한다.
- 그 테스트들을 실행한다.
본문
승격 게이트는 능력 하나의 등급 이동을 판정한다. 그 판정에 담금 기간 임계값이 둘 들어간다.
javadoc 이 말하는 둘째 등급이 열거형에 없다
:::evidence key="a-soak-threshold-written-for-a-grade-that-does-not-exist" alt="코드베이스에서 승격 게이트 javadoc 의 두 등급 모형과 담금 상수 둘, 등급 열거형의 값 넷과 둘째 등급에 해당하는 값의 수, 증거 검사와 담금 선택을 잇는 여섯 줄과 증거 항목 일곱, 추적 등급이 중간 등급을 먼저 밟게 하는 차단 사유, 긴 갈래를 실행하는 테스트가 고른 전이와 표시 이름, 중간 등급으로 올라가는 테스트가 준 담금 값, 그리고 그 테스트들을 실제로 돌린 결과를 뽑은 출력 66줄. 증거 검사에는 목표 등급 조건이 없고 담금 선택에만 있다는 것이 그 여섯 줄에 그대로 보인다." caption="두 등급 모형과 상수 둘 · 열거형 값 넷 · 증거 검사에는 목표 조건 없음 · 테스트가 고른 전이와 담금 · 실행 결과 8건 전부 통과 — 66줄 · exit 0" zoom="true" :::
javadoc 의 모형은 이렇다. 첫째 등급에 도달한다는 것은 능력이 동작하고 문서화되었다는 뜻이고, 둘째 등급이 된다는 것은 모든 배포가 그것을 받아 의존성이 모든 클래스패스에 오르고 실패 양식이 모든 당직에 오른다는 뜻이다. 그래서 둘째는 첫째에 더해 더 긴 담금을 요구한다.
상수 이름도 그 모형을 따른다. 하나는 첫째 등급용 이레, 다른 하나는 둘째 등급용 서른 날이다.
등급 열거형의 값은 넷이다. 증거가 갖춰진 것(첫째 등급), 실패 양식이 규명되지 않은 것(중간 등급), 추적만 하는 것(추적 등급), 철회되었거나 거부된 것이다. 둘째 등급에 해당하는 값은 0 이다.
그래서 조건이 나머지 세 등급을 전부 받는다
담금을 고르는 식은 삼항 하나다. 목표 등급이 첫째 등급이면 이레, 아니면 서른 날.
없는 등급을 위해 만든 갈래가 있는 세 등급을 전부 받는다. 중간 등급으로 올라가는 것도, 추적 등급으로 내려가는 것도, 철회되는 것도 서른 날이다.
증거 요구는 목표를 보지 않는다
증거 검사와 담금 선택이 여섯 줄 안에 나란히 있다. 앞의 셋은 빠진 증거를 그대로 차단 사유로 옮기고, 목표 등급을 보지 않는다. 뒤의 둘만 목표 등급을 본다.
요구되는 항목은 일곱이다. 호환성 증거, 보안 검토, 결함 증거, 성능 증거, 결정 기록, 런북, 실환경 시험이다.
그래서 두 승격의 차이가 담금 기간뿐이 되고, 그 기간이 뒤집혀 있다. 중간 등급에서 위 등급으로 올라가는 데 이레, 추적 등급에서 중간 등급으로 올라오는 데 서른 날이다.
담금 기록이 가장 적을 등급에 가장 긴 담금이 걸린다
같은 메서드의 셋째 차단 사유가 추적 등급을 다룬다. 추적 등급의 능력은 다른 무엇보다 먼저 중간 등급이 되어야 한다는 것이다.
그 강제된 첫 걸음의 목표가 첫째 등급이 아니므로 서른 날이 걸린다.
추적 등급의 뜻은 추적할 뿐 구현되지 않았다는 것이다. 정의상 담금 기록이 가장 적을 등급에 가장 긴 담금이 붙는다.
테스트가 그 뒤틀림을 그대로 보여 준다
긴 임계값을 실행하는 테스트가 있다. 표시 이름은 둘째 등급이 되는 것이 첫째 등급이 되는 것보다 긴 담금을 요구한다고 말한다.
실제로 고른 전이는 첫째 등급에서 철회로 가는 것이다. 그 전이가 긴 갈래에 떨어지는 이유는 둘째 등급이어서가 아니라 첫째 등급이 아니어서다. 이름이 가리키는 전이와 검사하는 전이가 다르다.
추적 등급 테스트도 마찬가지다. 중간 등급으로 올라가는 쪽이 통과해야 하는데, 담금에 예순 날을 넣는다. 요구치의 두 배다.
두 테스트를 돌리면 여덟 건이 전부 통과한다. 무엇을 통과시키는지는 단언 대상이 정하고, 여기서는 그 대상이 이름과 다르다.
확인하지 못한 것
담금 값을 바꿔 가며 게이트를 직접 불러 보지는 않았다. 판정은 갈래 조건과 두 테스트가 고른 숫자에 근거하고, 위 실행은 저장소가 가진 테스트를 그대로 돌린 것이다. 이레를 넣었을 때 무엇이 실패하는지는 갈래 조건으로 판정했다.