Sub-scope 04 (objectstorage) s3/** - provider binding, client policy, async bridges, providers revision=a24ece9cf797f7ea647e33bf846b115208ed1ba5 generatedAt=2026-08-30T02:46:24+00:00 === OWNED FILES === c736a00af636ce33932ac81fdb639a9f8571f36b s3/S3AsyncClientFactory.java 69 019d11138e010247723336164a6bb675d39946ed s3/S3AsyncRequestBodyBridge.java 270 eb4a06038a10ef7ad968a9c65dc3a2933b1b71a7 s3/S3AsyncResponseBodyBridge.java 342 8921803dceeba2839db95f1a46a38875938cac1b s3/S3CapabilityProbe.java 42 f1b13054e3a2457d94cb84d9ae4cf6d444d75683 s3/S3ChecksumPolicy.java 43 84396fadf519bb404fc368b8270705b12e8d4ad4 s3/S3ClientLifecycle.java 59 329d53f84103c542c1e1f534e7abce2b2e997f10 s3/S3ClientPolicy.java 367 f7a57a87928e2bec0491664cbf10ae97befce4fe s3/S3ConditionalObjectControlStore.java 279 a4180450809282b4e95a8fccc104e13d3c203e5c s3/S3ConditionalRequestMapper.java 65 5d8d35240d5a4a43b607a55fcdbfc27a532a61e8 s3/S3DirectCompletionVerifier.java 74 9db6d172c12fc5cc7fe4468e2888d697c55a1cbd s3/S3DirectMultipartProvider.java 324 acad97412bf662866837f3c651fcf093b0d13cf6 s3/S3DirectTransferProvider.java 144 acd82d10d52a8973daf3d6b913c155fa94f64972 s3/S3ManagedMultipartProvider.java 281 dc987d674d1a33a28448d231b54dd3f913bcba89 s3/S3ManagedObjectProvider.java 213 669b7a0781a112505cbc05e3bc49e2d8ea334066 s3/S3ObjectEvidenceMapper.java 82 4772bcd70265b1292bf81506a9495d0c910b2e48 s3/S3ObjectOperationResolver.java 53 09eccbeefeb9fa283eb63eafdafbe9b7284217a5 s3/S3ObjectStorageProviderContribution.java 190 f999696a46d9f76b0ea7e3fa730ea179ddae8021 s3/S3PresignerFactory.java 24 482bf89618e84d0fe6e7d64a25bab82efe582426 s3/S3ProviderBinding.java 361 d68446f26ddb6d5e6d8e98061c77c4deb589142c s3/S3ProviderCapabilityConfig.java 41 54964c9b1f4f8453e09b77eb7dae7d4c31cd59e9 s3/S3ProviderErrorMapper.java 78 b2ee18c3ee94c4a85cb0a681e21a1a445fd151a2 s3/S3ProviderQualifier.java 58 00de3d38a968368c363142f23c3e9895671396c3 s3/S3ProviderSettings.java 52 6ee78a77458349929666c8a744fcc3850d993d5b s3/S3ProviderType.java 26 6c75433066baaa0b14c4872536ee0de3847bb6cd s3/S3ProviderVersion.java 29 6fdba8a52a6f2ef514fa4468fc24eae203a86962 s3/S3QualificationEvidence.java 15 2acf00be0158ab5c1c468f2f0b71a9e8a74fc402 test/s3/S3AsyncClientFactoryTest.java 179 d389c9af956cd6711556f0851c751dfaf2013c77 test/s3/S3AsyncRequestBodyBridgeTest.java 165 ae891add40c16119793e61bdc6ea8bcb85a38c77 test/s3/S3AsyncResponseBodyBridgeTest.java 133 68fa30eb3d9796f69b5b61c06b008fce59adfe5e test/s3/S3ConditionalObjectControlStoreTest.java 172 d60074a7f815098d2a7e59cb4f31bd1e9680c158 test/s3/S3DirectMultipartProviderTest.java 72 d4c3d86158b3f46aedff8bcd31c6fabe180426e3 test/s3/S3DirectTransferProviderTest.java 123 71bd20f2f9c33ff8e8f2f0f06577bae3a532829c test/s3/S3ManagedMultipartProviderTest.java 134 b18c3224b13b701167cd047b28f1936f17280c69 test/s3/S3ManagedObjectProviderTest.java 255 405c3e935cf997d8b08746be3922656a18d457ae test/s3/S3ObjectOperationResolverTest.java 151 23fd021ff93fa5ee59637aa35add37685ed89872 test/s3/S3ProviderBindingTest.java 468 fa7c910a87c64dec61d3cc8762718ab882ea9e7c test/s3/S3ProviderCompositionTest.java 197 f63aa1c373c887fef82fbfcad86788ac64e6be46 test/s3/S3ProviderErrorMapperTest.java 63 a9796529253b2d9b159a17606af1256d42c171b3 test/s3/S3ProviderQualifierTest.java 96 9fc3ebe5e8b0ba05937577c2d59e71ca82e88834 test/s3/S3SdkApiCharacterizationTest.java 115 main LOC: 3581 total === 8.1 reachability: SDK types confined to this package? === $ git grep -rln 'software.amazon.awssdk' -- 'adapter/outbound/objectstorage/src/main' | sed 's|.*/objectstorage/||' | sort | uniq -c 1 ObjectStorageConfig.java 1 S3ObjectStorageAdapter.java 1 config/ObjectStorageCapabilityConfig.java 1 s3/S3AsyncClientFactory.java 1 s3/S3AsyncRequestBodyBridge.java 1 s3/S3AsyncResponseBodyBridge.java 1 s3/S3ChecksumPolicy.java 1 s3/S3ClientLifecycle.java 1 s3/S3ClientPolicy.java 1 s3/S3ConditionalObjectControlStore.java 1 s3/S3ConditionalRequestMapper.java 1 s3/S3DirectCompletionVerifier.java 1 s3/S3DirectMultipartProvider.java 1 s3/S3DirectTransferProvider.java 1 s3/S3ManagedMultipartProvider.java 1 s3/S3ManagedObjectProvider.java 1 s3/S3ObjectEvidenceMapper.java 1 s3/S3ObjectStorageProviderContribution.java 1 s3/S3PresignerFactory.java 1 s3/S3ProviderErrorMapper.java exit=0 $ git grep -rln 'software.amazon.awssdk' -- . | grep -v "^adapter/outbound/objectstorage/" | head adapter/inbound/graphql/src/main/java/dev/caskeleton/adapter/inbound/graphql/architecture/GraphQlReturnTypePolicy.java adapter/inbound/web/src/testkit/java/dev/caskeleton/adapter/inbound/web/testkit/arch/WebForbiddenTypeCatalog.java app-bootstrap/build.gradle app-bootstrap/gradle.lockfile app-bootstrap/src/test/java/dev/caskeleton/bootstrap/architecture/NotificationArchitectureTest.java application-core/src/test/java/dev/caskeleton/application/objectstorage/ObjectStorageArchitectureContractTest.java build.gradle sample-portfolio/build.gradle sample-portfolio/gradle.lockfile exit=0 === 8.2 client policy: the retry budget is checked against the parent call budget === $ grep -n 'retryWorstCase' -B 4 -A 6 adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3ClientPolicy.java 151- } 152- if (source.retryBaseDelay.compareTo(source.retryMaximumBackoff) > 0) { 153- throw invalid("retry base delay exceeds maximum backoff"); 154- } 155: Duration retryWorstCase = 156- multiply(source.apiCallAttemptTimeout, source.maximumAttempts) 157- .plus(multiply(source.retryMaximumBackoff, source.maximumAttempts - 1L)); 158: if (retryWorstCase.compareTo(source.apiCallTimeout) > 0) { 159- throw invalid("retry attempts and backoff exceed the parent call budget"); 160- } 161- validateEndpoint(source.endpointOverride); 162- boolean accessPresent = source.accessKeyId != null && !source.accessKeyId.isBlank(); 163- boolean secretPresent = source.secretAccessKey != null && !source.secretAccessKey.isBlank(); 164- if (accessPresent != secretPresent) { exit=0 $ grep -n 'transport timeout exceeds the per-attempt timeout\|per-attempt timeout must be shorter' -B 4 adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3ClientPolicy.java 130- requirePositive("retryBaseDelay", source.retryBaseDelay); 131- requirePositive("retryMaximumBackoff", source.retryMaximumBackoff); 132- requirePositive("shutdownGrace", source.shutdownGrace); 133- if (source.apiCallAttemptTimeout.compareTo(source.apiCallTimeout) >= 0) { 134: throw invalid("per-attempt timeout must be shorter than the parent call timeout"); -- 140- source.connectionAcquireTimeout, 141- source.readTimeout, 142- source.writeTimeout)) { 143- if (transport.compareTo(source.apiCallAttemptTimeout) > 0) { 144: throw invalid("transport timeout exceeds the per-attempt timeout"); exit=0 $ grep -n 'plaintext AWS endpoint is forbidden' -B 6 adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3ClientPolicy.java 190- || endpoint.getQuery() != null 191- || endpoint.getFragment() != null) { 192- throw invalid("endpoint override is not canonical"); 193- } 194- if ("http".equalsIgnoreCase(scheme) 195- && (host.equals("amazonaws.com") || host.endsWith(".amazonaws.com"))) { 196: throw invalid("plaintext AWS endpoint is forbidden"); exit=0 $ grep -n 'credentials=' -A 2 adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3ClientPolicy.java 225: + ", credentials=" 226- + (source.accessKeyId == null ? "default-chain" : "[REDACTED]") 227- + "]"; exit=0 === 8.2b provider binding: per-provider-type identity rules === $ grep -n 'AWS expected owner must be an exact 12-digit\|MinIO binding cannot claim\|AWS endpoint override is not part\|MinIO endpoint is required\|MinIO requires explicit environment credential' -B 3 adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3ProviderBinding.java 229- requireToken("deploymentIdentity", settings.deploymentIdentity(), 256); 230- if (type == S3ProviderType.AWS_S3_GENERAL_PURPOSE) { 231- if (settings.expectedOwner() == null || !settings.expectedOwner().matches("[0-9]{12}")) { 232: throw invalid("AWS expected owner must be an exact 12-digit account ID"); 233- } 234- } else if (settings.expectedOwner() != null && !settings.expectedOwner().isBlank()) { 235: throw invalid("MinIO binding cannot claim an AWS expected owner"); -- 238- 239- private static void validateEndpoint(S3ProviderType type, URI endpoint) { 240- if (type == S3ProviderType.AWS_S3_GENERAL_PURPOSE && endpoint != null) { 241: throw invalid("AWS endpoint override is not part of the qualified profile"); 242- } 243- if (type == S3ProviderType.MINIO_COMMUNITY_2024_01_16 && endpoint == null) { 244: throw invalid("MinIO endpoint is required"); -- 279- throw invalid("default-chain credentials cannot include static references"); 280- } 281- if (type != S3ProviderType.AWS_S3_GENERAL_PURPOSE) { 282: throw invalid("MinIO requires explicit environment credential references"); exit=0 $ grep -n 'runtime provisioning and public ACLs are forbidden' -B 4 adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3ProviderBinding.java 265- } 266- 267- private static void validateProvisioning(S3ProviderSettings settings) { 268- if (settings.autoCreateBucket() || settings.publicAcl()) { 269: throw invalid("runtime provisioning and public ACLs are forbidden"); exit=0 === 8.2c mutation uncertainty is preserved === $ grep -n 'if (mutation)' -B 4 -A 4 adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3ProviderErrorMapper.java 17- Objects.requireNonNull(failure, "failure must be non-null"); 18- if (failure instanceof AwsServiceException service) { 19- return mapService(service, mutation); 20- } 21: if (mutation) { 22- return new Mapping(Failure.INDETERMINATE, false, "S3 mutation outcome is indeterminate"); 23- } 24- Throwable cause = failure.getCause(); 25- if (cause instanceof SocketTimeoutException exit=0 $ grep -n 'authoritative' -B 2 -A 2 adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3ProviderErrorMapper.java | head -20 52- default -> mapStatus(status, mutation); 53- }; 54: boolean authoritative = normalized != Failure.INDETERMINATE; 55: return new Mapping(normalized, authoritative, "S3 request failed: " + normalized.name()); 56- } 57- -- 68- } 69- 70: /** Provider-neutral classification plus whether the observation is authoritative. */ 71: public record Mapping(Failure failure, boolean authoritative, String safeMessage) { 72- 73- public Mapping { exit=0 $ grep -n 'Failure.INDETERMINATE' adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/*.java adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3ConditionalObjectControlStore.java:114: if (exception.failure() == ObjectStorageProviderException.Failure.INDETERMINATE) { adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3ConditionalObjectControlStore.java:131: ObjectStorageProviderException.Failure.INDETERMINATE, adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3DirectMultipartProvider.java:142: ObjectStorageProviderException.Failure.INDETERMINATE, adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3ManagedMultipartProvider.java:121: ObjectStorageProviderException.Failure.INDETERMINATE, adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3ProviderErrorMapper.java:22: return new Mapping(Failure.INDETERMINATE, false, "S3 mutation outcome is indeterminate"); adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3ProviderErrorMapper.java:54: boolean authoritative = normalized != Failure.INDETERMINATE; adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3ProviderErrorMapper.java:66: default -> mutation ? Failure.INDETERMINATE : Failure.UNKNOWN; exit=0 === 8.3 evidence: logical digest kept distinct from provider checksum === $ grep -n 'LOGICAL_SHA_256_METADATA\|requireMatchingEvidence' -A 10 adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3ChecksumPolicy.java | head -26 12: public static final String LOGICAL_SHA_256_METADATA = "ca-logical-sha256"; 13- 14- private S3ChecksumPolicy() {} 15- 16- public static ChecksumAlgorithm requireSha256(ObjectContentIdentity identity) { 17- Objects.requireNonNull(identity, "identity must be non-null"); 18- if (identity.fullDigest().algorithm() != ObjectDigestAlgorithm.SHA_256) { 19- throw new IllegalArgumentException("managed S3 profile requires logical SHA-256"); 20- } 21- return ChecksumAlgorithm.SHA256; 22- } -- 26: return Map.of(LOGICAL_SHA_256_METADATA, identity.fullDigest().base64Value()); 27- } 28- 29: public static void requireMatchingEvidence( 30- ObjectContentIdentity expected, String providerChecksum, Map metadata) { 31- requireSha256(expected); 32: String logical = metadata == null ? null : metadata.get(LOGICAL_SHA_256_METADATA); 33- if (!expected.fullDigest().base64Value().equals(logical) 34- || (providerChecksum != null 35- && !expected.fullDigest().base64Value().equals(providerChecksum))) { 36- throw new dev.caskeleton.adapter.outbound.objectstorage.provider 37- .ObjectStorageProviderException( 38- dev.caskeleton.adapter.outbound.objectstorage.provider.ObjectStorageProviderException 39- .Failure.CONTENT_MISMATCH, exit=0 $ grep -n 'ServerSideEncryption.AES256\|ETag evidence is absent' -B 3 adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3ObjectEvidenceMapper.java 41- } 42- S3ChecksumPolicy.requireMatchingEvidence( 43- identity, response.checksumSHA256(), response.metadata()); 44: if (response.serverSideEncryption() != ServerSideEncryption.AES256) { 45- throw corrupt("S3 HEAD encryption evidence does not match the managed profile"); 46- } 47- if (response.eTag() == null || response.eTag().isBlank()) { 48: throw corrupt("S3 HEAD ETag evidence is absent"); exit=0 === 8.3b async bridges: single subscription, bounded buffer, backpressure === $ grep -n 'subscribed.compareAndSet(false, true)\|prepared.compareAndSet(false, true)' -B 3 adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3AsyncRequestBodyBridge.java adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3AsyncResponseBodyBridge.java adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3AsyncRequestBodyBridge.java-57- @Override adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3AsyncRequestBodyBridge.java-58- public void subscribe(Subscriber subscriber) { adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3AsyncRequestBodyBridge.java-59- Objects.requireNonNull(subscriber, "subscriber must be non-null"); adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3AsyncRequestBodyBridge.java:60: if (!subscribed.compareAndSet(false, true)) { -- adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3AsyncResponseBodyBridge.java-54- adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3AsyncResponseBodyBridge.java-55- @Override adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3AsyncResponseBodyBridge.java-56- public CompletableFuture prepare() { adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3AsyncResponseBodyBridge.java:57: if (!prepared.compareAndSet(false, true)) { exit=0 $ grep -n 'maximumBufferedBytesObserved\|S3 producer exceeded its exact bound\|MAXIMUM_CONTROL_BYTES' adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3AsyncRequestBodyBridge.java adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3ConditionalObjectControlStore.java adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3AsyncRequestBodyBridge.java:38: private final AtomicInteger maximumBufferedBytesObserved = new AtomicInteger(); adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3AsyncRequestBodyBridge.java:75: public int maximumBufferedBytesObserved() { adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3AsyncRequestBodyBridge.java:76: return maximumBufferedBytesObserved.get(); adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3AsyncRequestBodyBridge.java:135: throw new ObjectChunkWriteException("S3 producer exceeded its exact bound"); adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3AsyncRequestBodyBridge.java:139: maximumBufferedBytesObserved.accumulateAndGet(copy.length, Math::max); adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3ConditionalObjectControlStore.java:32: private static final int MAXIMUM_CONTROL_BYTES = 64 * 1024; adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3ConditionalObjectControlStore.java:82: if (encoded.length > MAXIMUM_CONTROL_BYTES) { adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3ConditionalObjectControlStore.java:213: || response.contentLength() > MAXIMUM_CONTROL_BYTES adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3ConditionalObjectControlStore.java:239: if (next > MAXIMUM_CONTROL_BYTES) { exit=0 === 8.4 test coverage === $ grep -nE '@Test| void ' adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/s3/*.java | sed 's|.*/s3/||' | head -60 S3AsyncClientFactoryTest.java:21: @Test S3AsyncClientFactoryTest.java:22: void buildsExplicitNettyAsyncClientWithoutCrtAndOwnsCloseOrder() { S3AsyncClientFactoryTest.java:42: @Test S3AsyncClientFactoryTest.java:43: void assemblesRetriesV2WithExactAttemptsAndSeparateHalfJitterPaths() throws Exception { S3AsyncClientFactoryTest.java:66: @Test S3AsyncClientFactoryTest.java:67: void rejectsMissingNonPositiveAndContradictoryTimeoutPoolAndRetryPolicy() { S3AsyncClientFactoryTest.java:114: @Test S3AsyncClientFactoryTest.java:115: void rejectsUnsafeEndpointAndPartialStaticCredentialsWithoutExposingSecrets() { S3AsyncRequestBodyBridgeTest.java:24: @Test S3AsyncRequestBodyBridgeTest.java:25: void streamsOnceOffTheSubscriberThreadWithOneChunkOfProducerLead() throws Exception { S3AsyncRequestBodyBridgeTest.java:65: @Test S3AsyncRequestBodyBridgeTest.java:66: void cancellationAndDigestMismatchFailWithoutProducerReplay() throws Exception { S3AsyncResponseBodyBridgeTest.java:23: @Test S3AsyncResponseBodyBridgeTest.java:24: void deliversAnExactBoundedBodyOnTheWorkerAndInvalidatesTheSource() throws Exception { S3AsyncResponseBodyBridgeTest.java:90: @Test S3AsyncResponseBodyBridgeTest.java:91: void truncatedAndOversizedSdkChunksFailClosed() throws Exception { S3ConditionalObjectControlStoreTest.java:50: @Test S3ConditionalObjectControlStoreTest.java:51: void createAndCasUseExactConditionalHeadersAndPrivateEtags() { S3ConditionalObjectControlStoreTest.java:79: @Test S3ConditionalObjectControlStoreTest.java:80: void droppedCreateResponseResolvesByExactGetAndDigestComparison() { S3ConditionalObjectControlStoreTest.java:97: @Test S3ConditionalObjectControlStoreTest.java:98: void staleWriterConflictAndCorruptControlNeverBecomeAbsence() { S3ConditionalObjectControlStoreTest.java:121: @Test S3ConditionalObjectControlStoreTest.java:122: void exact404IsTheOnlyAbsentRead() { S3DirectMultipartProviderTest.java:26: @Test S3DirectMultipartProviderTest.java:27: void presignsOneExactPartWithoutReturningTheProviderUploadIdentity() throws Exception { S3DirectTransferProviderTest.java:43: @Test S3DirectTransferProviderTest.java:44: void signsExactChecksumMediaEncryptionLengthAndCreateOnlyPutAndVerifiesWithHead() S3ManagedMultipartProviderTest.java:40: @Test S3ManagedMultipartProviderTest.java:41: void mapsCreatePartAndCreateOnlyCompletionToLowLevelSdkCalls() { S3ManagedObjectProviderTest.java:49: @Test S3ManagedObjectProviderTest.java:50: void mapsImmutablePutAndExactHeadWithoutExposingProviderEvidence() { S3ManagedObjectProviderTest.java:100: @Test S3ManagedObjectProviderTest.java:101: void exactFullAndRangeReadsUseHeadEvidenceAndConditionalGet() { S3ManagedObjectProviderTest.java:180: @Test S3ManagedObjectProviderTest.java:181: void absentHeadIsOptionalEmpty() { S3ObjectOperationResolverTest.java:24: @Test S3ObjectOperationResolverTest.java:25: void resolvesDataCreateFromExactHeadEvidenceWithoutReplayingAProducer() { S3ObjectOperationResolverTest.java:50: @Test S3ObjectOperationResolverTest.java:51: void resolvesControlMutationOnlyFromExactRecordEvidence() { S3ProviderBindingTest.java:26: @Test S3ProviderBindingTest.java:27: void acceptsOnlyTheTwoFrozenProviderIdentitiesAndTheirExactVersions() { S3ProviderBindingTest.java:67: @Test S3ProviderBindingTest.java:68: void rejectsUnsafeOrIncompleteProviderBindingsBeforeResourceConstruction() { S3ProviderBindingTest.java:166: @Test S3ProviderBindingTest.java:167: void exactNamedProfileRequiresCurrentSupportedEvidence() { S3ProviderCompositionTest.java:31: @Test S3ProviderCompositionTest.java:32: void disabledUnselectedAndInvalidBindingsConstructNoS3Resource() { S3ProviderCompositionTest.java:58: @Test S3ProviderCompositionTest.java:59: void selectedExactBindingConstructsAndClosesOneOwnedClientExactlyOnce() { S3ProviderCompositionTest.java:80: @Test S3ProviderCompositionTest.java:81: void selectedDirectProfileConstructsAndClosesOneOwnedPresigner() { S3ProviderErrorMapperTest.java:16: @Test S3ProviderErrorMapperTest.java:17: void mapsStableS3FailuresWithoutLeakingProviderDetails() { S3ProviderErrorMapperTest.java:29: @Test S3ProviderErrorMapperTest.java:30: void finalMutationTransportFailureIsIndeterminateRatherThanAuthoritativeFailure() { S3ProviderQualifierTest.java:18: @Test S3ProviderQualifierTest.java:19: void staticCiEvidenceIsValidatedWithoutRunningAProbe() { S3ProviderQualifierTest.java:41: @Test S3ProviderQualifierTest.java:42: void startupProbeIsConfinedToAReservedPrefixAndSafeActions() { exit=0