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>
2.4 KiB
kind, slug, title, topic, project, status, sourceRevision, rootTreeNode, evidenceCapturedOn, assets, evidence, source, module
| kind | slug | title | topic | project | status | sourceRevision | rootTreeNode | evidenceCapturedOn | assets | evidence | source | module | |||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| CONCEPT | messaging-core-api-c03 | 예약 네임스페이스를 봉투 필드와 헤더 전용으로 쪼갠다 | state-machines-and-ownership | clean-architecture-backend-template | 게시 전 | 21234e38cdb9a926cbc92bb97a2aee2e4a7d2916 | concept:messaging-core-api-c03 | 2026-09-01 |
|
|
|
messaging-core-api |
예약 네임스페이스를 봉투 필드와 헤더 전용으로 쪼갠다
MessageEnvelope<T>가 중심이고 나머지 11개가 그 필드 타입이다. ReservedHeaders의 23개 이름을 CanonicalEnvelopeHeaders가 둘로 쪼갠다.
본문
MessageEnvelope<T>가 중심이고 나머지 11개가 그 필드 타입이다. 봉투는 불변이고 네 가지 파생 메서드가 있다 — withPayload, withContentType, withTenant, withHeaders. 넷 다 messageId를 복사한다.
"Encoding, decoding, Claim Check offloading, and DLQ forwarding all need this, and every one of them must keep
messageId()intact — which is exactly what this method guarantees by construction" (MessageEnvelope.java:80-82)
UuidV7 참조 위치
:::evidence key="messaging-core-api-c03" alt="코드베이스에서 UuidV7 를 검색한 출력 20줄. 이 기록이 세는 참조가 그 출력에 그대로 보인다." caption="UuidV7 코드베이스 검색 — 20줄 · exit 0" zoom="true" :::
예약 네임스페이스가 둘로 쪼개진다
ReservedHeaders는 23개 이름 상수와 msg. prefix 전체를 소유한다. CanonicalEnvelopeHeaders는 그 예약 네임스페이스를 둘로 쪼갠다 — 봉투 필드가 이미 갖고 있는 15개(ENVELOPE_FIELDS)와, 봉투에 대응 필드가 없어서 헤더로만 이동할 수 있는 나머지 8개(REDRIVE_ID, REDRIVE_COUNT, RETRY_ATTEMPT, FIRST_FAILURE_AT, LAST_FAILURE_AT, FAILURE_CATEGORY, FAILURE_CODE, ORIGIN_DESTINATION).
목적지 쪽 어휘
MessageDestination<T>, DestinationName, DestinationKind(7), MessagingCapabilities(boolean 12), DestinationCapabilities, ConfirmationRequirement(3), CapabilityRegistry.