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<String, String> 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<? super ByteBuffer> 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<R> 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

