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>
146 lines
11 KiB
Plaintext
146 lines
11 KiB
Plaintext
Sub-scope 02 (inbound-graphql) schema + scalar + compat
|
|
revision=a24ece9cf797f7ea647e33bf846b115208ed1ba5
|
|
generatedAt=2026-08-30T08:31:40+00:00
|
|
|
|
=== OWNED FILES ===
|
|
e47efeefc3586f233c7d348c8f185a621723859e src/main/java/dev/caskeleton/compat/GraphQlChangeKind.java 285
|
|
f47a29a0236d8ae96babe444de03f60a457681c2 src/main/java/dev/caskeleton/compat/GraphQlClientOwnerApproval.java 40
|
|
f1c0d907cf440e0cd408c779d3b5b9817bed6c19 src/main/java/dev/caskeleton/compat/GraphQlCompatibilityImpact.java 20
|
|
1476785faadce59d8a6f68a9b29d6de7ed7fee91 src/main/java/dev/caskeleton/compat/GraphQlCompatibilityPolicy.java 63
|
|
a3a72d7526427ed25a9e77b637f12cb37b763a93 src/main/java/dev/caskeleton/compat/GraphQlCompatibilityReport.java 50
|
|
79f2b155be11b607a4b734092efd14052540c45f src/main/java/dev/caskeleton/compat/GraphQlDeprecationGate.java 91
|
|
8258b3359088bc1abb994281f6d3dfc19e940bc1 src/main/java/dev/caskeleton/compat/GraphQlRemovalDecision.java 51
|
|
64fe8efa32273982c0fd5fb801ea55bbd63bdca1 src/main/java/dev/caskeleton/compat/GraphQlRemovalRequest.java 39
|
|
6a3e086faf77f5a3b09d96b2b2d3c93df61593ed src/main/java/dev/caskeleton/compat/GraphQlSchemaChange.java 61
|
|
177cd5f3b5bc48995a6df3d57f522b148142b7eb src/main/java/dev/caskeleton/compat/GraphQlSchemaComparator.java 791
|
|
5d728d6c04208d8047af5012d1856ae89be86ef3 src/main/java/dev/caskeleton/compat/GraphQlSchemaUsage.java 71
|
|
8d2e51a997a30b030fb60094f42c63073023cd40 src/main/java/dev/caskeleton/scalar/BigDecimalScalar.java 211
|
|
e1a93151a07fa71dd0c00b17a1ef0e40d8fb9a65 src/main/java/dev/caskeleton/scalar/DateScalar.java 105
|
|
7a8907d3c07d9659b097a2fc6b77bc413d1f7fda src/main/java/dev/caskeleton/scalar/GraphQlDecimalBounds.java 69
|
|
99fd7c63bf4b7c411eba8b5a49d518b51ee6d0d2 src/main/java/dev/caskeleton/scalar/GraphQlScalarWiringConfigurer.java 84
|
|
5e4a6608bb0b3b01d2edd71614f0ffd9ab604103 src/main/java/dev/caskeleton/scalar/InstantScalar.java 117
|
|
48356a0f4e3e9adb219c2d38c3db3ace7bbb3395 src/main/java/dev/caskeleton/scalar/LongScalar.java 189
|
|
29f48b4eff25f5f07ee71d013418332494109062 src/main/java/dev/caskeleton/scalar/UuidScalar.java 109
|
|
772376b683e92de6988d77ba789b4b0a2e871ab9 src/main/java/dev/caskeleton/schema/GraphQlContractVersion.java 29
|
|
652af3bd3ad05296b3370369c5bbd64cc1557b32 src/main/java/dev/caskeleton/schema/GraphQlMappingInspectionGate.java 52
|
|
b1eb5a2565aa19c0f6d761bd0880b9d19b375712 src/main/java/dev/caskeleton/schema/GraphQlMappingIssue.java 102
|
|
60f76512c3335b925bbcb57105f10d142cdf618f src/main/java/dev/caskeleton/schema/GraphQlMappingPolicy.java 30
|
|
abc186cfcd5b2be828a22b03c395659a41f06107 src/main/java/dev/caskeleton/schema/GraphQlOneOfInputValidator.java 55
|
|
228405fe469bbd3e14609f96f7af2bf084a7e2d9 src/main/java/dev/caskeleton/schema/GraphQlOneOfPolicy.java 35
|
|
73de6ccaf8d753b5eec448424dc57b642cb9ff47 src/main/java/dev/caskeleton/schema/GraphQlOneOfSchemaGate.java 77
|
|
3bf90c365a5ca498fb0595092ac2f8d842fea939 src/main/java/dev/caskeleton/schema/GraphQlOneOfViolationException.java 41
|
|
8969810a607e282bb61c51e6e0a1c8620bcde3ea src/main/java/dev/caskeleton/schema/GraphQlScalarDefinition.java 43
|
|
2f9f1cbaca2aab0b4898d2058ff18390ddecf2cc src/main/java/dev/caskeleton/schema/GraphQlScalarManifest.java 141
|
|
9de5a34f734e1770b6010ceeffe08e16e25d29de src/main/java/dev/caskeleton/schema/GraphQlScalarPolicy.java 37
|
|
1869a247c37cc53df916bf8bee08b5c771761db4 src/main/java/dev/caskeleton/schema/GraphQlSchemaAssembler.java 39
|
|
eb2256250d6b6e5e55089559fe7183dc404d1c6d src/main/java/dev/caskeleton/schema/GraphQlSchemaAssemblyException.java 52
|
|
fc09a237fd39e8ace0e153f4fa19133bb2ab7ede src/main/java/dev/caskeleton/schema/GraphQlSchemaAssemblyResult.java 189
|
|
24907e279619760e06dbd4c8e12c65aa5942cebb src/main/java/dev/caskeleton/schema/GraphQlSchemaContract.java 46
|
|
6b71fd3ecc60aed5b34cc2843874316aae05a8c5 src/main/java/dev/caskeleton/schema/GraphQlSchemaHash.java 46
|
|
a808ab5f80d6702e144bf1a76246a9cd3ae14cc5 src/main/java/dev/caskeleton/schema/GraphQlSchemaMappingException.java 34
|
|
3062ccea72f2a7b0f8a9777d9790bb9a843b0b51 src/main/java/dev/caskeleton/schema/GraphQlSchemaOwnership.java 29
|
|
4960c6cf963ced0e5f101bb7427492b62d63e9a6 src/main/java/dev/caskeleton/schema/GraphQlSchemaResource.java 82
|
|
00dbd91228499cec7562c5cd26c125d46a24605f src/test/java/dev/caskeleton/compat/GraphQlDeprecationGateTest.java 172
|
|
5dbaee0ae713d288d6b685bb33002c577ac41b29 src/test/java/dev/caskeleton/compat/GraphQlSchemaComparatorTest.java 343
|
|
eb56b126ee81eadf9ee782a426c273c98c835658 src/test/java/dev/caskeleton/scalar/GraphQlScalarContractTest.java 132
|
|
62a05f39cc5455916ba727e947a3e56e28631784 src/test/java/dev/caskeleton/scalar/GraphQlScalarSymmetryTest.java 131
|
|
c5aef66492904a9f75ba3d25c6efd6fd35116c57 src/test/java/dev/caskeleton/schema/GraphQlMappingInspectionGateTest.java 70
|
|
0608ec6545f5ee48d7f0ec1e46830002484d7903 src/test/java/dev/caskeleton/schema/GraphQlOneOfInputValidatorTest.java 131
|
|
be971ec8e0d7c8e26f88d7646caab97302e272e5 src/test/java/dev/caskeleton/schema/GraphQlScalarManifestTest.java 100
|
|
ea0d6ba9f36059ce25e1d9c6e1c8e51372d2ba9d src/test/java/dev/caskeleton/schema/GraphQlSchemaAssemblerTest.java 124
|
|
a2dc50376dc57ee072b2370c980eb05ba1052a1a src/test/java/dev/caskeleton/schema/GraphQlSchemaContractTest.java 74
|
|
file_count=46
|
|
|
|
=== 8.1 파일 단위 배선 (autoconf / main_other / test) ===
|
|
TYPE autoconf main_other test
|
|
GraphQlContractVersion 0 2 2
|
|
GraphQlMappingInspectionGate 3 0 2
|
|
GraphQlMappingIssue 0 3 3
|
|
GraphQlMappingPolicy 0 1 1
|
|
GraphQlOneOfInputValidator 0 0 1
|
|
GraphQlOneOfPolicy 0 2 1
|
|
GraphQlOneOfSchemaGate 0 0 2
|
|
GraphQlOneOfViolationException 0 2 1
|
|
GraphQlScalarDefinition 3 1 2
|
|
GraphQlScalarManifest 4 1 2
|
|
GraphQlScalarPolicy 0 1 1
|
|
GraphQlSchemaAssembler 0 0 3
|
|
GraphQlSchemaAssemblyException 0 3 1
|
|
GraphQlSchemaAssemblyResult 0 1 2
|
|
GraphQlSchemaContract 0 0 1
|
|
GraphQlSchemaHash 3 2 2
|
|
GraphQlSchemaMappingException 0 1 1
|
|
GraphQlSchemaOwnership 0 2 2
|
|
GraphQlSchemaResource 0 2 3
|
|
BigDecimalScalar 0 1 2
|
|
DateScalar 0 1 1
|
|
GraphQlDecimalBounds 0 1 1
|
|
GraphQlScalarWiringConfigurer 7 0 2
|
|
InstantScalar 0 2 1
|
|
LongScalar 0 1 2
|
|
UuidScalar 0 1 2
|
|
GraphQlChangeKind 0 4 1
|
|
GraphQlClientOwnerApproval 0 1 1
|
|
GraphQlCompatibilityImpact 0 2 1
|
|
GraphQlCompatibilityPolicy 0 0 2
|
|
GraphQlCompatibilityReport 0 3 1
|
|
GraphQlDeprecationGate 0 0 1
|
|
GraphQlRemovalDecision 0 1 1
|
|
GraphQlRemovalRequest 0 1 1
|
|
GraphQlSchemaChange 0 4 1
|
|
GraphQlSchemaComparator 0 0 3
|
|
GraphQlSchemaUsage 0 2 1
|
|
|
|
=== 8.2 스키마 해시 사슬 ===
|
|
$ grep -rn 'GraphQlSchemaHash' adapter/inbound/graphql/src/main --include=*.java | sed 's|adapter/inbound/graphql/src/main/java/dev/caskeleton/adapter/inbound/graphql/||'
|
|
autoconfigure/GraphQlPlatformActuatorEndpoint.java:4:import dev.caskeleton.adapter.inbound.graphql.schema.GraphQlSchemaHash;
|
|
autoconfigure/GraphQlPlatformActuatorEndpoint.java:24: private final GraphQlSchemaHash schemaHash;
|
|
autoconfigure/GraphQlPlatformActuatorEndpoint.java:40: GraphQlSchemaHash schemaHash,
|
|
schema/GraphQlSchemaContract.java:20: GraphQlSchemaHash schemaHash,
|
|
schema/GraphQlSchemaHash.java:18:public record GraphQlSchemaHash(String value) {
|
|
schema/GraphQlSchemaHash.java:22: public GraphQlSchemaHash {
|
|
schema/GraphQlSchemaHash.java:33: public static GraphQlSchemaHash sha256(String canonicalSdl) {
|
|
schema/GraphQlSchemaHash.java:41: return new GraphQlSchemaHash(HexFormat.of().formatHex(digest));
|
|
schema/GraphQlSchemaAssemblyResult.java:94: public GraphQlSchemaHash schemaHash() {
|
|
schema/GraphQlSchemaAssemblyResult.java:95: return GraphQlSchemaHash.sha256(canonicalSdl);
|
|
exit=0
|
|
|
|
$ grep -rn 'GraphQlPlatformActuatorEndpoint' adapter/inbound/graphql/src --include=*.java | sed 's|adapter/inbound/graphql/src/[a-z]*/java/dev/caskeleton/adapter/inbound/graphql/||'
|
|
autoconfigure/GraphQlPolicyRequestPathTest.java:28: * a production deployment without it, and {@link GraphQlPlatformActuatorEndpoint}, which reports it
|
|
autoconfigure/GraphQlPlatformStartupValidatorTest.java:108: new GraphQlPlatformActuatorEndpoint(
|
|
autoconfigure/GraphQlPlatformActuatorEndpoint.java:18:public final class GraphQlPlatformActuatorEndpoint {
|
|
autoconfigure/GraphQlPlatformActuatorEndpoint.java:38: public GraphQlPlatformActuatorEndpoint(
|
|
exit=0
|
|
|
|
$ grep -c '@Bean' adapter/inbound/graphql/src/main/java/dev/caskeleton/adapter/inbound/graphql/autoconfigure/GraphQlPlatformAutoConfiguration.java
|
|
39
|
|
exit=0
|
|
|
|
=== 8.3 oneOf: 라이브러리 버전과 스키마 사용 ===
|
|
$ grep -n 'graphql-java:' adapter/inbound/graphql/gradle.lockfile | head -2
|
|
32:com.graphql-java:graphql-java:25.0=compileClasspath,runtimeClasspath,testCompileClasspath,testFixturesCompileClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath
|
|
33:com.graphql-java:java-dataloader:6.0.0=compileClasspath,runtimeClasspath,testCompileClasspath,testFixturesCompileClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath
|
|
exit=0
|
|
|
|
$ grep -rn 'oneOf' adapter/inbound/graphql/src/main/resources adapter/inbound/graphql/src/test/resources 2>/dev/null | wc -l
|
|
0
|
|
exit=0
|
|
|
|
$ grep -n 'the platform enforces' adapter/inbound/graphql/src/main/java/dev/caskeleton/adapter/inbound/graphql/schema/GraphQlOneOfPolicy.java
|
|
4: * The September 2025 {@code @oneOf} input rules the platform enforces (design §7.5).
|
|
exit=0
|
|
|
|
=== 8.4 조립기가 막겠다고 선언한 위험 ===
|
|
$ sed -n '1,12p' adapter/inbound/graphql/src/main/java/dev/caskeleton/adapter/inbound/graphql/schema/GraphQlSchemaAssembler.java | grep -vE '^import|^package'
|
|
|
|
|
|
/**
|
|
* Assembles module-owned SDL fragments into one schema, deterministically.
|
|
*
|
|
* <p>Fragments are sorted by owning module and path before parsing. Filesystem and classpath
|
|
* enumeration order is not stable across machines or packaging formats, and an unstable order would
|
|
* both move the schema hash and change which of two conflicting declarations "wins" — so the order
|
|
* is imposed here rather than inherited from discovery.
|
|
exit=0
|
|
|