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>
127 lines
9.0 KiB
Plaintext
127 lines
9.0 KiB
Plaintext
Command: printf '%s\n' '--- baseline API entries ---'; grep 'dev.caskeleton.adapter.outbound.persistence.api' docs/architecture/jpa-api-surface.txt; printf '%s\n' '--- current API declarations ---'; python3 - <<'PY'
|
|
from pathlib import Path
|
|
import re
|
|
root=Path('src/adapter/outbound/persistence-jpa/src/main/java/dev/caskeleton/adapter/outbound/persistence/api')
|
|
for p in sorted(root.rglob('*.java')):
|
|
t=p.read_text(); m=re.search(r'public\s+(?:final\s+)?(?:record|class|interface|enum)\s+(\w+)',t)
|
|
if m:
|
|
pkg=re.search(r'package\s+([^;]+);',t).group(1); print(pkg+'.'+m.group(1))
|
|
PY
|
|
printf '%s\n' '--- intended external statement ---'; sed -n '1,8p' docs/architecture/jpa-api-surface.txt
|
|
Working directory: /shared/codebase/clean-architecture-backend-template
|
|
Executed at: 2026-08-29T07:48:10Z
|
|
Source revision: a24ece9cf797f7ea647e33bf846b115208ed1ba5
|
|
Observation boundary: Compares the intended external api surface baseline with current public top-level api declarations and records named API/design references; it does not evaluate behavioral correctness of those types.
|
|
--- stdout/stderr ---
|
|
--- baseline API entries ---
|
|
dev.caskeleton.adapter.outbound.persistence.api.PersistenceOperationName
|
|
dev.caskeleton.adapter.outbound.persistence.api.capability.CapabilitySupport
|
|
dev.caskeleton.adapter.outbound.persistence.api.capability.JpaCapability
|
|
dev.caskeleton.adapter.outbound.persistence.api.capability.SupportLevel
|
|
dev.caskeleton.adapter.outbound.persistence.api.error.CheckConstraintViolationException
|
|
dev.caskeleton.adapter.outbound.persistence.api.error.ConnectionUnavailableException
|
|
dev.caskeleton.adapter.outbound.persistence.api.error.ConstraintCode
|
|
dev.caskeleton.adapter.outbound.persistence.api.error.ConstraintViolationDetails
|
|
dev.caskeleton.adapter.outbound.persistence.api.error.DataCorruptionException
|
|
dev.caskeleton.adapter.outbound.persistence.api.error.DeadlockDetectedException
|
|
dev.caskeleton.adapter.outbound.persistence.api.error.FailureCategory
|
|
dev.caskeleton.adapter.outbound.persistence.api.error.ForeignKeyViolationException
|
|
dev.caskeleton.adapter.outbound.persistence.api.error.JpaEntityNotFoundException
|
|
dev.caskeleton.adapter.outbound.persistence.api.error.JpaFailureContext
|
|
dev.caskeleton.adapter.outbound.persistence.api.error.JpaPersistenceException
|
|
dev.caskeleton.adapter.outbound.persistence.api.error.NotNullConstraintViolationException
|
|
dev.caskeleton.adapter.outbound.persistence.api.error.OptimisticConflictException
|
|
dev.caskeleton.adapter.outbound.persistence.api.error.PessimisticLockTimeoutException
|
|
dev.caskeleton.adapter.outbound.persistence.api.error.QueryTimeoutException
|
|
dev.caskeleton.adapter.outbound.persistence.api.error.SchemaMismatchException
|
|
dev.caskeleton.adapter.outbound.persistence.api.error.SerializationFailureException
|
|
dev.caskeleton.adapter.outbound.persistence.api.error.SqlExceptionSqlStateResolver
|
|
dev.caskeleton.adapter.outbound.persistence.api.error.SqlStateResolver
|
|
dev.caskeleton.adapter.outbound.persistence.api.error.TransactionCompletionUnknownException
|
|
dev.caskeleton.adapter.outbound.persistence.api.error.TransactionTimeoutException
|
|
dev.caskeleton.adapter.outbound.persistence.api.error.UniqueConstraintViolationException
|
|
dev.caskeleton.adapter.outbound.persistence.api.error.VendorFailureTranslator
|
|
dev.caskeleton.adapter.outbound.persistence.api.query.CursorCodec
|
|
dev.caskeleton.adapter.outbound.persistence.api.query.CursorPayloadCodec
|
|
dev.caskeleton.adapter.outbound.persistence.api.query.KeysetPageRequest
|
|
dev.caskeleton.adapter.outbound.persistence.api.query.KeysetSlice
|
|
dev.caskeleton.adapter.outbound.persistence.api.query.NoopQueryObservation
|
|
dev.caskeleton.adapter.outbound.persistence.api.query.QueryName
|
|
dev.caskeleton.adapter.outbound.persistence.api.query.QueryObservation
|
|
dev.caskeleton.adapter.outbound.persistence.api.query.QueryScope
|
|
dev.caskeleton.adapter.outbound.persistence.api.query.SignedJsonCursorCodec
|
|
dev.caskeleton.adapter.outbound.persistence.api.query.SortDirection
|
|
dev.caskeleton.adapter.outbound.persistence.api.transaction.IsolationLevel
|
|
dev.caskeleton.adapter.outbound.persistence.api.transaction.JitterMode
|
|
dev.caskeleton.adapter.outbound.persistence.api.transaction.JpaRetryPolicy
|
|
dev.caskeleton.adapter.outbound.persistence.api.transaction.JpaTransactionExecutor
|
|
dev.caskeleton.adapter.outbound.persistence.api.transaction.PropagationMode
|
|
dev.caskeleton.adapter.outbound.persistence.api.transaction.RetryDecision
|
|
dev.caskeleton.adapter.outbound.persistence.api.transaction.RetryDisposition
|
|
dev.caskeleton.adapter.outbound.persistence.api.transaction.RetryEventListener
|
|
dev.caskeleton.adapter.outbound.persistence.api.transaction.RetryProfile
|
|
dev.caskeleton.adapter.outbound.persistence.api.transaction.TransactionAttempt
|
|
dev.caskeleton.adapter.outbound.persistence.api.transaction.TransactionCompletionEvidence
|
|
dev.caskeleton.adapter.outbound.persistence.api.transaction.TransactionProfile
|
|
--- current API declarations ---
|
|
dev.caskeleton.adapter.outbound.persistence.api.PersistenceOperationName
|
|
dev.caskeleton.adapter.outbound.persistence.api.capability.CapabilitySupport
|
|
dev.caskeleton.adapter.outbound.persistence.api.capability.JpaCapability
|
|
dev.caskeleton.adapter.outbound.persistence.api.capability.SupportLevel
|
|
dev.caskeleton.adapter.outbound.persistence.api.error.CheckConstraintViolationException
|
|
dev.caskeleton.adapter.outbound.persistence.api.error.ConnectionUnavailableException
|
|
dev.caskeleton.adapter.outbound.persistence.api.error.ConstraintCode
|
|
dev.caskeleton.adapter.outbound.persistence.api.error.ConstraintViolationDetails
|
|
dev.caskeleton.adapter.outbound.persistence.api.error.DataCorruptionException
|
|
dev.caskeleton.adapter.outbound.persistence.api.error.DeadlockDetectedException
|
|
dev.caskeleton.adapter.outbound.persistence.api.error.FailureCategory
|
|
dev.caskeleton.adapter.outbound.persistence.api.error.ForeignKeyViolationException
|
|
dev.caskeleton.adapter.outbound.persistence.api.error.JpaEntityNotFoundException
|
|
dev.caskeleton.adapter.outbound.persistence.api.error.JpaFailureContext
|
|
dev.caskeleton.adapter.outbound.persistence.api.error.JpaPersistenceException
|
|
dev.caskeleton.adapter.outbound.persistence.api.error.NotNullConstraintViolationException
|
|
dev.caskeleton.adapter.outbound.persistence.api.error.OptimisticConflictException
|
|
dev.caskeleton.adapter.outbound.persistence.api.error.PessimisticLockTimeoutException
|
|
dev.caskeleton.adapter.outbound.persistence.api.error.QueryTimeoutException
|
|
dev.caskeleton.adapter.outbound.persistence.api.error.SchemaMismatchException
|
|
dev.caskeleton.adapter.outbound.persistence.api.error.SerializationFailureException
|
|
dev.caskeleton.adapter.outbound.persistence.api.error.SqlExceptionSqlStateResolver
|
|
dev.caskeleton.adapter.outbound.persistence.api.error.SqlStateResolver
|
|
dev.caskeleton.adapter.outbound.persistence.api.error.TransactionCompletionUnknownException
|
|
dev.caskeleton.adapter.outbound.persistence.api.error.TransactionTimeoutException
|
|
dev.caskeleton.adapter.outbound.persistence.api.error.UniqueConstraintViolationException
|
|
dev.caskeleton.adapter.outbound.persistence.api.error.VendorFailureTranslator
|
|
dev.caskeleton.adapter.outbound.persistence.api.query.CursorCodec
|
|
dev.caskeleton.adapter.outbound.persistence.api.query.CursorPayloadCodec
|
|
dev.caskeleton.adapter.outbound.persistence.api.query.KeysetPageRequest
|
|
dev.caskeleton.adapter.outbound.persistence.api.query.KeysetSlice
|
|
dev.caskeleton.adapter.outbound.persistence.api.query.NoopQueryObservation
|
|
dev.caskeleton.adapter.outbound.persistence.api.query.QueryName
|
|
dev.caskeleton.adapter.outbound.persistence.api.query.QueryObservation
|
|
dev.caskeleton.adapter.outbound.persistence.api.query.QueryScope
|
|
dev.caskeleton.adapter.outbound.persistence.api.query.SignedJsonCursorCodec
|
|
dev.caskeleton.adapter.outbound.persistence.api.query.SortDirection
|
|
dev.caskeleton.adapter.outbound.persistence.api.transaction.IsolationLevel
|
|
dev.caskeleton.adapter.outbound.persistence.api.transaction.JitterMode
|
|
dev.caskeleton.adapter.outbound.persistence.api.transaction.JpaRetryPolicy
|
|
dev.caskeleton.adapter.outbound.persistence.api.transaction.JpaTransactionExecutor
|
|
dev.caskeleton.adapter.outbound.persistence.api.transaction.PropagationMode
|
|
dev.caskeleton.adapter.outbound.persistence.api.transaction.RetryDecision
|
|
dev.caskeleton.adapter.outbound.persistence.api.transaction.RetryDisposition
|
|
dev.caskeleton.adapter.outbound.persistence.api.transaction.RetryEventListener
|
|
dev.caskeleton.adapter.outbound.persistence.api.transaction.RetryProfile
|
|
dev.caskeleton.adapter.outbound.persistence.api.transaction.TransactionAttempt
|
|
dev.caskeleton.adapter.outbound.persistence.api.transaction.TransactionCompletionEvidence
|
|
dev.caskeleton.adapter.outbound.persistence.api.transaction.TransactionProfile
|
|
--- intended external statement ---
|
|
# JPA persistence leaf public API surface — every public top-level type in src/main/java.
|
|
# A public type in a single-jar leaf is reachable from every adopter's code, so
|
|
# additions are reviewed rather than discovered. `api` is the intended external
|
|
# surface; the rest is implementation that has not been moved under an internal
|
|
# root yet.
|
|
# Update only after review with:
|
|
# ./gradlew :adapter:outbound:persistence-jpa:updateJpaApiSurface -PapproveJpaApiSurfaceChange
|
|
# types: 338
|
|
|
|
Exit code: 0
|