Files
document-haness/docs/clean-architecture-backend-template/final/evidence/raw/a20-f003-claude.txt
T
DongHyeonkaandClaude Opus 5 b2963105a8 docs(keycloak-session-store): import the session-storage lab as a new project
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>
2026-09-04 22:51:59 +09:00

135 lines
8.2 KiB
Plaintext

# gradle 판
Gradle 9.0.0
# grpc-testkit 이 등록하는 레인 넷과 각각의 태그
grpc-testkit/build.gradle:15 lane('grpcInProcessContractTest') {
grpc-testkit/build.gradle:16 tag = 'grpc-inprocess'
grpc-testkit/build.gradle:20 lane('grpcNettyContractTest') {
grpc-testkit/build.gradle:21 tag = 'grpc-netty'
grpc-testkit/build.gradle:25 lane('grpcFaultTest') {
grpc-testkit/build.gradle:26 tag = 'grpc-fault'
grpc-testkit/build.gradle:30 lane('grpcPerformanceTest') {
grpc-testkit/build.gradle:31 tag = 'grpc-performance'
# 기본 test 에 실제로 걸리는 제외 태그는 두 곳에서 온다
build.gradle:548: // (the skeleton default) excludeTags is a no-op.
build.gradle:551: excludeTags 'quarantine'
grpc/grpc-testkit/build.gradle:42: excludeTags 'grpc-performance'
grpc-testkit/build.gradle:37 // The performance lane is excluded from the default `test` task. It measures a running server
grpc-testkit/build.gradle:38 // under load, and a measurement in the release gate is a flaky test on a shared CI runner; it runs
grpc-testkit/build.gradle:39 // when somebody asks for it, by name.
grpc-testkit/build.gradle:40 tasks.named('test') {
grpc-testkit/build.gradle:41 useJUnitPlatform {
grpc-testkit/build.gradle:42 excludeTags 'grpc-performance'
grpc-testkit/build.gradle:43 }
grpc-testkit/build.gradle:44 }
grpc-testkit 안의 quarantine 태그 : 0 건
# 레인 태그는 클래스 단위인가
testkit/GrpcInProcessContractFixtureTest.java:22:@Tag("grpc-inprocess")
testkit/GrpcInProcessContractFixtureTest.java-23-class GrpcInProcessContractFixtureTest {
testkit/GrpcNettyContractProfileTest.java:24:@Tag("grpc-netty")
testkit/GrpcNettyContractProfileTest.java-25-class GrpcNettyContractProfileTest {
testkit/GrpcTransportEvidenceClassifierTest.java:37:@Tag("grpc-fault")
testkit/GrpcTransportEvidenceClassifierTest.java-38-class GrpcTransportEvidenceClassifierTest {
performance/GrpcPerformanceLaneTest.java:32:@Tag("grpc-performance")
performance/GrpcPerformanceLaneTest.java-33-class GrpcPerformanceLaneTest {
# check 의 태스크 그래프 — 시험을 돌리지 않고 확인한다
$ ./gradlew :grpc:grpc-testkit:check --dry-run GRADLE_EXIT=0
:grpc:grpc-testkit:compileJava SKIPPED
:grpc:grpc-testkit:processResources SKIPPED
:grpc:grpc-testkit:classes SKIPPED
:grpc:grpc-testkit:checkstyleMain SKIPPED
:grpc:grpc-testkit:compileTestJava SKIPPED
:grpc:grpc-testkit:processTestResources SKIPPED
:grpc:grpc-testkit:testClasses SKIPPED
:grpc:grpc-testkit:checkstyleTest SKIPPED
:grpc:grpc-testkit:spotbugsMain SKIPPED
:grpc:grpc-testkit:spotbugsTest SKIPPED
:grpc:grpc-testkit:spotlessJava SKIPPED
:grpc:grpc-testkit:spotlessJavaCheck SKIPPED
:grpc:grpc-testkit:spotlessCheck SKIPPED
:grpc:grpc-testkit:test SKIPPED
:grpc:grpc-testkit:check SKIPPED
그 그래프 안의 레인 태스크 : 0 건
# 낡은 결과를 지우고 세 레인을 이름으로 돌린다
실행 전 남아 있는 결과 XML : 0 건
$ ./gradlew :grpc:grpc-testkit:{grpcInProcessContractTest,grpcNettyContractTest,grpcFaultTest}
BUILD SUCCESSFUL
GRADLE_EXIT=0
[grpcInProcessContractTest]
GrpcInProcessContractFixtureTest tests=7 failures=0 errors=0 skipped=0
시험 7 개
[grpcNettyContractTest]
GrpcNettyContractProfileTest tests=9 failures=0 errors=0 skipped=0
시험 9 개
[grpcFaultTest]
GrpcTransportEvidenceClassifierTest tests=9 failures=0 errors=0 skipped=0
시험 9 개
# 같은 leaf 의 기본 test 를 돌린다
$ ./gradlew :grpc:grpc-testkit:test
BUILD SUCCESSFUL
GRADLE_EXIT=0
GrpcPerformanceGateTest tests=7 failures=0 errors=0 skipped=0
GrpcStableReleaseGateTest tests=9 failures=0 errors=0 skipped=0
GrpcInProcessContractFixtureTest tests=7 failures=0 errors=0 skipped=0
GrpcNettyContractProfileTest tests=9 failures=0 errors=0 skipped=0
GrpcServerStreamingContractTest tests=7 failures=0 errors=0 skipped=0
GrpcTransportEvidenceClassifierTest tests=9 failures=0 errors=0 skipped=0
GrpcUnaryReliabilityContractTest tests=8 failures=0 errors=0 skipped=0
시험 56 개
# 레인이 돌린 시험이 기본 test 가 돌린 시험의 부분집합인가
레인 25 개 · 기본 test 56 개
레인이 돌린 시험이 기본 test 안에 전부 있는가 : True
기본 test 에만 있는 시험 : 31 개
성능 레인 클래스가 기본 test 결과에 있는가 : 0 건
# 레인 태스크만 거는 보증
ca.strict-test-lane.gradle:4 // useJUnitPlatform { includeTags }, failOnNoDiscoveredTests, outputs.upToDateWhen { false } — once per
ca.strict-test-lane.gradle:6 // `failOnNoDiscoveredTests` and `upToDateWhen { false }`, and a lane that is added by copy-paste is a
ca.strict-test-lane.gradle:23 // What a leaf may still not do is opt out of failing closed. There is no `failOnNoDiscoveredTests`
ca.strict-test-lane.gradle:237 failOnNoDiscoveredTests = true
ca.strict-test-lane.gradle:239 // And it is not sufficient, which a TestKit fixture established. `failOnNoDiscoveredTests`
ca.strict-test-lane.gradle:240 // applies to discovery; a tag filter excludes tests *after* discovery, so a lane whose tag
ca.strict-test-lane.gradle:245 // So the lane counts what it actually executed and refuses zero.
ca.strict-test-lane.gradle:246 def executedTests = new java.util.concurrent.atomic.AtomicLong(0L)
ca.strict-test-lane.gradle:247 def executedSelectors =
ca.strict-test-lane.gradle:250 executedTests.incrementAndGet()
ca.strict-test-lane.gradle:252 executedSelectors.add(descriptor.className as String)
ca.strict-test-lane.gradle:253 executedSelectors.add("${descriptor.className}.${descriptor.name}" as String)
ca.strict-test-lane.gradle:257 if (executedTests.get() == 0L) {
ca.strict-test-lane.gradle:258 throw new GradleException(
ca.strict-test-lane.gradle:276 !executedSelectors.any { String executed ->
ca.strict-test-lane.gradle:285 throw new GradleException(
ca.strict-test-lane.gradle:293 outputs.upToDateWhen { false }
ca.strict-test-lane.gradle:299 // failOnNoDiscoveredTests is not enough on its own, which a TestKit fixture established rather
ca.strict-test-lane.gradle:320 throw new GradleException(
ca.strict-test-lane.gradle:333 throw new GradleException(
ca.strict-test-lane.gradle:342 throw new GradleException(
ca.strict-test-lane.gradle:347 throw new GradleException(
# 레인 태스크를 자동으로 부르는 경로
grpc-testkit/build.gradle 이 check 를 언급하는가 : 0 건
워크플로 28 개 중 grpc 를 언급하는 것 : 0 건
ci-quality-gates.yml:48 - name: Check quality, public paths, and dependency locks
ci-quality-gates.yml:49 working-directory: src
ci-quality-gates.yml:50 run: ./gradlew check verifyPublicPathSnapshot verifyDependencyLocks --warning-mode=fail --no-daemon --stacktrace
ci-quality-gates.yml:51 # Named as its own step because nothing else runs it: `check` does not depend on
ci-quality-gates.yml:52 # graphqlStableTest, so the lane's required-class guard — the check that its module-boundary
ci-quality-gates.yml:53 # suite has not silently stopped being discovered — protected nothing in CI. A separate step
ci-quality-gates.yml:54 # keeps the aggregate invocation below byte-identical, which ConditionalTransportQualification
ci-quality-gates.yml:55 # ContractTest asserts on, and the two tasks do not overlap.
ci-quality-gates.yml:56 - name: Qualify the GraphQL Stable lane
ci-quality-gates.yml:57 working-directory: src
ci-quality-gates.yml:58 run: ./gradlew :adapter:inbound:graphql:graphqlStableTest --no-daemon --stacktrace
ci-quality-gates.yml:59 - name: Qualify opt-in inbound transports without skips
ci-quality-gates.yml:60 working-directory: src
ci-quality-gates.yml:61 run: ./gradlew conditionalTransportQualification --no-daemon --stacktrace
그 마지막 스텝이 부르는 태스크가 무엇을 요구하는가 :
src/build.gradle:594 'test-results/grpcTransportQualificationTest'),
src/build.gradle:606 dependsOn ':adapter:inbound:grpc:grpcTransportQualificationTest'