Files
document-haness/docs/clean-architecture-backend-template/final/evidence/raw/149-objectstorage-module-inventory.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

287 lines
20 KiB
Plaintext

Scope adapter-outbound-objectstorage - module inventory and denominator
revision=a24ece9cf797f7ea647e33bf846b115208ed1ba5
generatedAt=2026-08-30T02:35:56+00:00
total tracked: 206
$ git ls-files 'adapter/outbound/objectstorage' | sed "s|^adapter/outbound/objectstorage/||" | awk -F/ '{print $1}' | sort | uniq -c | sort -rn
202 src
1 gradle.lockfile
1 build.gradle
1 README.md
1 CLAUDE.md
exit=0
$ git ls-files 'adapter/outbound/objectstorage/src' | sed "s|^adapter/outbound/objectstorage/src/||" | awk -F/ '{print $1}' | sort | uniq -c | sort -rn
147 main
49 test
2 objectStorageMinioFaultTest
2 objectStorageMinioContractTest
2 objectStorageAwsQualificationTest
exit=0
=== per source set ===
main: java=147 loc=14336 nonjava=0
objectStorageAwsQualificationTest: java=2 loc=51 nonjava=0
objectStorageMinioContractTest: java=2 loc=316 nonjava=0
objectStorageMinioFaultTest: java=2 loc=179 nonjava=0
test: java=48 loc=6753 nonjava=1
=== package map (main) ===
$ git ls-files 'adapter/outbound/objectstorage/src/main' | grep '\.java$' | sed 's|.*/java/||;s|/[^/]*\.java$||' | sort | uniq -c | sort -rn
26 dev/caskeleton/adapter/outbound/objectstorage/s3
24 dev/caskeleton/adapter/outbound/objectstorage/control
23 dev/caskeleton/adapter/outbound/objectstorage/kernel
19 dev/caskeleton/adapter/outbound/objectstorage/config
13 dev/caskeleton/adapter/outbound/objectstorage/direct
8 dev/caskeleton/adapter/outbound/objectstorage/readiness
8 dev/caskeleton/adapter/outbound/objectstorage/maintenance
7 dev/caskeleton/adapter/outbound/objectstorage/codec
6 dev/caskeleton/adapter/outbound/objectstorage/filesystem
5 dev/caskeleton/adapter/outbound/objectstorage/multipart
4 dev/caskeleton/adapter/outbound/objectstorage/provider
4 dev/caskeleton/adapter/outbound/objectstorage
exit=0
=== package map (test) ===
--- objectStorageAwsQualificationTest
2 dev/caskeleton/adapter/outbound/objectstorage/qualification
--- objectStorageMinioContractTest
2 dev/caskeleton/adapter/outbound/objectstorage/qualification
--- objectStorageMinioFaultTest
2 dev/caskeleton/adapter/outbound/objectstorage/qualification
--- test
14 dev/caskeleton/adapter/outbound/objectstorage/s3
7 dev/caskeleton/adapter/outbound/objectstorage/kernel
6 dev/caskeleton/adapter/outbound/objectstorage
5 dev/caskeleton/adapter/outbound/objectstorage/direct
5 dev/caskeleton/adapter/outbound/objectstorage/config
2 dev/caskeleton/adapter/outbound/objectstorage/multipart
2 dev/caskeleton/adapter/outbound/objectstorage/maintenance
2 dev/caskeleton/adapter/outbound/objectstorage/filesystem
2 dev/caskeleton/adapter/outbound/objectstorage/codec
1 dev/caskeleton/adapter/outbound/objectstorage/readiness
1 dev/caskeleton/adapter/outbound/objectstorage/control
1 dev/caskeleton/adapter/outbound/objectstorage/contract
$ git ls-files 'adapter/outbound/objectstorage' | grep -v '\.java$'
adapter/outbound/objectstorage/CLAUDE.md
adapter/outbound/objectstorage/README.md
adapter/outbound/objectstorage/build.gradle
adapter/outbound/objectstorage/gradle.lockfile
adapter/outbound/objectstorage/src/test/resources/object-storage/minio-provider-evidence.json
exit=0
=== main files by size ===
$ git ls-files 'adapter/outbound/objectstorage/src/main' | grep '\.java$' | xargs wc -l | sort -rn | head -40
14336 total
898 adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/control/CanonicalJsonObjectControlRecordCodec.java
523 adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/config/RoutingObjectMutationAdapter.java
509 adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/direct/DirectMultipartCoordinator.java
416 adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/kernel/StagedObjectPublicationKernel.java
367 adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3ClientPolicy.java
361 adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3ProviderBinding.java
342 adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3AsyncResponseBodyBridge.java
335 adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/direct/DirectTransferCoordinator.java
324 adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3DirectMultipartProvider.java
281 adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3ManagedMultipartProvider.java
279 adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3ConditionalObjectControlStore.java
276 adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/config/ObjectStorageBindingCompiler.java
270 adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3AsyncRequestBodyBridge.java
213 adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3ManagedObjectProvider.java
210 adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/control/ObjectOperationRecord.java
198 adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/control/ObjectDirectMultipartSessionRecord.java
193 adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/filesystem/LocalObjectStreamTransfer.java
190 adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3ObjectStorageProviderContribution.java
188 adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/filesystem/LocalDevObjectDataStore.java
188 adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/control/ObjectPublicationHandoffRecord.java
180 adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/control/ObjectStagedObjectRecord.java
172 adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/codec/ObjectControlKeyCodec.java
171 adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/kernel/ObjectPublicationHandoffService.java
169 adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/maintenance/LegacyAdoptionApprovalCodec.java
166 adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/direct/DirectTransferSessionRecord.java
164 adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/config/ObjectStorageCapabilityConfig.java
158 adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/filesystem/LocalObjectPathGuard.java
150 adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/kernel/ObjectOperationEpochRecord.java
147 adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/config/RoutingObjectScanMaintenanceAdapter.java
147 adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/config/RoutingObjectReadAdapter.java
144 adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3DirectTransferProvider.java
144 adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/control/CanonicalJsonReader.java
142 adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/kernel/ObjectOperationStateMachine.java
132 adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/config/ObjectStorageCapabilityAssembler.java
132 adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/codec/ObjectRequestFingerprintCodec.java
129 adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/S3ObjectStorageAdapter.java
127 adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/kernel/ObjectOperationKernel.java
122 adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/maintenance/LegacyObjectAdoptionService.java
120 adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/direct/DirectTransferPolicy.java
exit=0
=== test files by size ===
$ git ls-files 'adapter/outbound/objectstorage/src' | grep '\.java$' | grep -v '/main/' | xargs wc -l | sort -rn | head -30
7299 total
480 adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/config/ObjectStorageCapabilityConfigTest.java
468 adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3ProviderBindingTest.java
339 adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/control/ObjectControlRecordCodecTest.java
327 adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/direct/DirectMultipartCoordinatorTest.java
291 adapter/outbound/objectstorage/src/objectStorageMinioContractTest/java/dev/caskeleton/adapter/outbound/objectstorage/qualification/MinioManagedObjectContractTest.java
255 adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3ManagedObjectProviderTest.java
251 adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/direct/DirectTransferCoordinatorTest.java
247 adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/contract/ObjectStorageProviderContract.java
197 adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3ProviderCompositionTest.java
196 adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/readiness/ObjectStorageReadinessRegistryTest.java
179 adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3AsyncClientFactoryTest.java
178 adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/multipart/ManagedMultipartCoordinatorTest.java
177 adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/codec/ObjectRequestFingerprintCodecTest.java
172 adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3ConditionalObjectControlStoreTest.java
167 adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/config/ObjectStorageBindingCompilerTest.java
165 adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3AsyncRequestBodyBridgeTest.java
154 adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/config/RoutingObjectStorageAdapterTest.java
153 adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/filesystem/LocalDevObjectStorageRecoveryTest.java
151 adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3ObjectOperationResolverTest.java
147 adapter/outbound/objectstorage/src/objectStorageMinioFaultTest/java/dev/caskeleton/adapter/outbound/objectstorage/qualification/MinioManagedObjectFaultTest.java
145 adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/maintenance/LegacyAdoptionApprovalVerifierTest.java
134 adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3ManagedMultipartProviderTest.java
133 adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3AsyncResponseBodyBridgeTest.java
130 adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/kernel/ObjectMutationResponseLossTest.java
124 adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/kernel/ObjectOperationKernelTest.java
123 adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3DirectTransferProviderTest.java
116 adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/codec/ObjectNamespaceCodecTest.java
115 adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3SdkApiCharacterizationTest.java
109 adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/maintenance/LegacyObjectAdoptionServiceTest.java
exit=0
=== registry + consumers ===
$ python3 -c "
import json;d=json.load(open('config/architecture/modules.json'))
def f(o):
if isinstance(o,dict):
if o.get('id','')=='adapter-outbound-objectstorage': return o
for v in o.values():
r=f(v)
if r: return r
elif isinstance(o,list):
for v in o:
r=f(v)
if r: return r
print(json.dumps(f(d), ensure_ascii=False, indent=2))
"
{
"id": "adapter-outbound-objectstorage",
"gradle_path": ":adapter:outbound:objectstorage",
"source_path": "src/adapter/outbound/objectstorage",
"allowed_dependencies": [
"application-core",
"shared-contract"
],
"runtime_memberships": [
"sample-portfolio"
]
}
exit=0
$ git grep -rn ':adapter:outbound:objectstorage' -- . | grep -v "^adapter/outbound/objectstorage/" | head
app-bootstrap/src/test/java/dev/caskeleton/bootstrap/contract/ContractRegistrySchemaGovernanceTest.java:208: "# Semantic owner Gradle path: :adapter:outbound:objectstorage:test",
app-bootstrap/src/test/java/dev/caskeleton/bootstrap/contract/ContractRegistrySchemaGovernanceTest.java:219: .replace("# Semantic owner Gradle path: :adapter:outbound:objectstorage:test\n", "");
app-bootstrap/src/test/java/dev/caskeleton/bootstrap/contract/ContractRegistrySchemaGovernanceTest.java:228: # Semantic owner Gradle path: :adapter:outbound:objectstorage:test
app-bootstrap/src/test/java/dev/caskeleton/bootstrap/contract/ContractRegistrySchemaGovernanceTest.java:326: + "# Semantic owner Gradle path: :adapter:outbound:objectstorage:test\n";
app-bootstrap/src/test/java/dev/caskeleton/bootstrap/contract/RegistryGovernanceCatalog.java:32: "# Semantic owner Gradle path: :adapter:outbound:objectstorage:test");
app-bootstrap/src/test/java/dev/caskeleton/bootstrap/contract/RegistryGovernanceCatalog.java:230: if (!":adapter:outbound:objectstorage:test".equals(definition.ownerGradlePath())
app-bootstrap/src/test/java/dev/caskeleton/bootstrap/contract/RegistryGovernanceCatalog.java:260: ":adapter:outbound:objectstorage:test",
config/architecture/modules.json:103: "gradle_path": ":adapter:outbound:objectstorage",
sample-portfolio/build.gradle:41: runtimeOnly project(':adapter:outbound:objectstorage')
exit=0
$ git grep -rln 'dev.caskeleton.adapter.outbound.objectstorage' -- . | grep -v "^adapter/outbound/objectstorage/" | head -20
app-bootstrap/src/main/java/dev/caskeleton/bootstrap/CaSkeletonApplication.java
app-bootstrap/src/test/java/dev/caskeleton/bootstrap/contract/ContractRegistrySchemaGovernanceTest.java
app-bootstrap/src/test/java/dev/caskeleton/bootstrap/contract/RegistryGovernanceCatalog.java
exit=0
$ cat adapter/outbound/objectstorage/build.gradle
// Driven adapter: provider-neutral semantic object-storage ports plus a bounded local-development
// provider. Canonical app.object-storage activation is disabled by default. The old whole-byte[]
// filesystem/S3 adapters remain isolated, explicit legacy compatibility only.
//
// software.amazon.awssdk:* versions are NOT managed by the Spring Boot BOM, and this repo has no
// version catalog, so the AWS SDK v2 BOM platform is imported HERE (module scope) using the root
// `ext.awsSdkVersion` SSOT — this keeps the strict-locking blast radius to this module (the shared
// root dependencyManagement block stays awssdk-free), mirroring the grpc module's grpc-bom import.
description = 'Outbound adapter: object storage (S3/MinIO + local filesystem)'
strictTestLanes {
sourceSet('objectStorageMinioContractTest') { compilesAgainst 'main', 'test' }
sourceSet('objectStorageMinioFaultTest') { compilesAgainst 'main', 'test' }
sourceSet('objectStorageAwsQualificationTest') { compilesAgainst 'main', 'test' }
}
dependencyManagement {
imports {
mavenBom "software.amazon.awssdk:bom:${awsSdkVersion}"
}
}
dependencies {
implementation project(':application-core')
implementation project(':shared-contract')
implementation 'org.springframework.boot:spring-boot-autoconfigure'
implementation 'org.slf4j:slf4j-api'
implementation 'software.amazon.awssdk:s3'
implementation 'software.amazon.awssdk:netty-nio-client'
annotationProcessor 'org.springframework.boot:spring-boot-configuration-processor'
// test-only: Testcontainers MinIO integration test for the S3 backend. Uses the core
// GenericContainer (no dedicated module) so the S3 round-trip runs against a real MinIO when
// Docker is available and is skipped (disabledWithoutDocker) otherwise.
testImplementation 'org.testcontainers:testcontainers'
testImplementation 'org.testcontainers:testcontainers-junit-jupiter'
testImplementation 'org.testcontainers:testcontainers-toxiproxy'
testImplementation 'com.tngtech.archunit:archunit-junit5:1.3.0'
testImplementation 'net.jqwik:jqwik:1.9.1'
}
def objectStorageReadinessRegistry = rootProject.projectDir.parentFile.toPath()
.resolve('docs/registries/object-storage-readiness.yaml').toFile()
tasks.named('test') {
inputs.file(objectStorageReadinessRegistry)
.withPathSensitivity(PathSensitivity.RELATIVE)
systemProperty 'objectstorage.readiness.registry', objectStorageReadinessRegistry.absolutePath
}
def objectStorageMinioContractQualification = registerStrictQualificationTest(
name: 'objectStorageMinioContractTest',
sourceSet: sourceSets.objectStorageMinioContractTest,
requiredClasses: [
'dev.caskeleton.adapter.outbound.objectstorage.qualification.MinioDirectTransferContractTest',
'dev.caskeleton.adapter.outbound.objectstorage.qualification.MinioManagedObjectContractTest'
],
description: 'Runs the non-skipping exact-release MinIO managed object contract.')
objectStorageMinioContractQualification.configure {
shouldRunAfter tasks.named('test')
}
def objectStorageMinioFaultQualification = registerStrictQualificationTest(
name: 'objectStorageMinioFaultTest',
sourceSet: sourceSets.objectStorageMinioFaultTest,
requiredClasses: [
'dev.caskeleton.adapter.outbound.objectstorage.qualification.MinioDirectTransferFaultTest',
'dev.caskeleton.adapter.outbound.objectstorage.qualification.MinioManagedObjectFaultTest'
],
description: 'Runs the non-skipping digest-pinned MinIO/Toxiproxy fault contract.')
objectStorageMinioFaultQualification.configure {
shouldRunAfter objectStorageMinioContractQualification
}
registerStrictQualificationTest(
name: 'objectStorageAwsQualificationTest',
sourceSet: sourceSets.objectStorageAwsQualificationTest,
requiredClasses: [
'dev.caskeleton.adapter.outbound.objectstorage.qualification.AwsS3DirectTransferQualificationTest',
'dev.caskeleton.adapter.outbound.objectstorage.qualification.AwsS3ManagedCommonSubsetQualificationTest'
],
description: 'Runs only with explicit protected AWS sandbox authority and exact inputs.')
exit=0