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>
101 lines
5.1 KiB
Markdown
101 lines
5.1 KiB
Markdown
---
|
|
kind: CASE
|
|
slug: seven-rows-downgraded-by-the-family-itself
|
|
title: 등급표 13행 중 일곱을 스스로 강등하고 한 행만 관측과 어긋났다
|
|
topic: self-disclosure-grading
|
|
project: clean-architecture-backend-template
|
|
status: 게시 전
|
|
sourceRevision: 21234e38cdb9a926cbc92bb97a2aee2e4a7d2916
|
|
rootTreeNode: case:seven-rows-downgraded-by-the-family-itself
|
|
evidenceCapturedOn: 2026-09-01
|
|
assets:
|
|
- key: seven-rows-downgraded-by-the-family-itself
|
|
file: ../../../final/evidence/rendered/seven-rows-downgraded-by-the-family-itself.svg
|
|
evidence:
|
|
- ../../../final/evidence/raw/seven-rows-downgraded-by-the-family-itself.txt
|
|
source:
|
|
- 원본 분석 절은 final/document.md#7-5 · analysis/16 §20.1, §29.1, §45.2 이다.
|
|
---
|
|
|
|
# 등급표 13행 중 일곱을 스스로 강등하고 한 행만 관측과 어긋났다
|
|
|
|
GraphQL 리프의 능력 등급표는 열세 행 중 일곱을 스스로 낮게 적는다. 분석이 그 표를 관측과 대조했을 때 어긋난 것은 한 행뿐이었다.
|
|
|
|
## 관계
|
|
|
|
- **네 단계 공시 등급 — modelled에서 production-verified까지**
|
|
이 표가 쓰는 등급 체계다.
|
|
- **등급은 네 단계로 나누고 관측보다 높게 적지 않는다**
|
|
이 사례가 검증한 규칙이다.
|
|
- **시작 검증기가 커서 서명 키를 요구하는데 그 키로 서명하는 코드가 없다**
|
|
어긋난 행과 관련된 사례다.
|
|
|
|
## 문제
|
|
|
|
능력 등급표는 자기 신고다. 작성자가 자기 코드의 성숙도를 적는다.
|
|
|
|
자기 신고는 대개 낙관적이다. 그래서 이런 표를 검증할 때의 기대는 실제보다 높게 적혀 있으리라는 것이다.
|
|
|
|
## 결론
|
|
|
|
반대였다.
|
|
|
|
열세 행 중 여섯 행이 스스로 modelled 로 적혀 있다. 그 등급의 정의는 정책과 계약 객체가 있고 단위 테스트가 있으며 요청 경로에는 없다는 것이다.
|
|
|
|
객체 인가는 답하는 계약을 중립 계층이 소유하고 이 리프는 매핑만 가지며 실행 경로에 연결하는 설정이 없다고 적는다
|
|
커서 서명은 자동설정이 둘 중 무엇도 생성하지 않는다고 적고 그 사실을 테스트가 고정한다고 덧붙인다
|
|
변경 멱등성은 인터셉터를 참조하는 설정이 없다고 적는다
|
|
지속 연산은 durable 구현체가 미제공이라고 적는다
|
|
구독과 웹소켓과 SSE 와 RSocket 은 정책과 상태 기계 단위 테스트만 있고 전송 핸들러가 없다고 적으며, 그래서 타입 이름도 승인 계열이라고 덧붙인다
|
|
페더레이션 계열은 단위 테스트만 있다고 적는다
|
|
|
|
일곱 번째 행은 등급조차 아니다. 실부하와 장애는 미달성으로 적히고, 증거가 없으면 릴리스 게이트가 거부한다는 사실이 함께 있다.
|
|
|
|
분석이 이 표를 관측과 대조했을 때 어긋난 것은 한 행뿐이었다.
|
|
|
|
이 결과가 이 사례의 내용이다. 자기 신고 등급표가 관측과 거의 일치했고, 그 일치는 등급을 낮게 적는 규칙과 증거 칸에 구체적인 수를 적는 관행에서 나왔다.
|
|
|
|
부재를 테스트로 고정하는 방식도 그 일치에 기여한다. 자동설정이 아무것도 생성하지 않는다는 사실을 테스트가 붙들고 있으므로, 나중에 누군가 배선하면 그 테스트가 깨지고 등급표를 함께 갱신하게 된다.
|
|
|
|
## 검증 환경
|
|
|
|
OpenJDK : 21.0.12
|
|
확인 방식 : 등급표 각 행과 해당 코드 및 테스트 대조
|
|
소스 수정 : x
|
|
|
|
## 재현 조건
|
|
|
|
원문은 final/evidence/raw/213-inbound-graphql-release-probes.txt 에 있다.
|
|
|
|
1. 리프의 안내 문서에서 등급 정의와 등급표를 읽는다.
|
|
2. 각 행의 등급과 증거 칸을 확인한다.
|
|
3. modelled 로 적힌 행에 대해 실제로 요청 경로에 없는지 확인한다.
|
|
4. wired 로 적힌 행에 대해 증거 칸이 지목하는 테스트를 확인한다.
|
|
|
|
## 본문
|
|
|
|
<!-- body:start -->
|
|
|
|
`CLAUDE.md`가 4등급을 정의하고 "현재 등급보다 높게 표현하지 않는다"를 규칙으로 선언한 뒤 13행 중 일곱을 스스로 `modelled`로 강등했다.
|
|
|
|
## 스스로 강등한 일곱 행
|
|
|
|
:::evidence key="seven-rows-downgraded-by-the-family-itself" alt="분석 문서 final/document.md 에서 이 기록의 근거 절을 그대로 잘라낸 18줄. 코드베이스를 측정한 것이 아니라 원본 판정이 무엇을 적었는지를 보여 준다." caption="final/document.md 발췌 — 18줄" zoom="true"
|
|
:::
|
|
|
|
## 전수 대조 결과 12행이 일치했다
|
|
|
|
sub-scope 02~06의 파일 단위 배선 데이터와 13행을 대조했다. `요청 크기/Accept 협상 (http/)` 한 행만 불일치이고 **어긋나는 방향이 표가 금지한 "높게 표현" 쪽**이다 — 인용된 두 증거가 endpoint 테스트가 아닌 순수 단위 테스트이고 대상 타입은 미배선이다.
|
|
|
|
## 기계 매니페스트와 사람이 읽는 표가 갈린다
|
|
|
|
커서에 대해 서로 다른 답을 준다.
|
|
|
|
## 확인하지 못한 것
|
|
|
|
wired 로 적힌 행 전부에 대해 그 테스트를 실행하지 않았다. 확인한 것은 테스트의 존재와 그것이 무엇을 단언하는지다.
|
|
|
|
없음 — 13행 전수 대조
|
|
|
|
<!-- body:end -->
|