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

