Sub-scope 05 (objectstorage) direct/** + multipart/** — manifest and negative-space probes revision=a24ece9cf797f7ea647e33bf846b115208ed1ba5 generatedAt=2026-08-30T02:51:17+00:00 cwd=/shared/codebase/clean-architecture-backend-template/src === OWNED FILES === a383f614ffbe34051a5fd340db70554e96f9b6d1 main/java/dev/caskeleton/adapter/outbound/objectstorage/direct/DirectGrantGeneration.java 38 ebf7f8ca1e5c9cd35c95bb92edd183a370e7e067 main/java/dev/caskeleton/adapter/outbound/objectstorage/direct/DirectGrantProvider.java 91 4078d3d3f61f4dbd627be3ac1702a35108519682 main/java/dev/caskeleton/adapter/outbound/objectstorage/direct/DirectMultipartCompletionVerifier.java 57 038e985585103fedb18fcaacc0d4711c84e69e4f main/java/dev/caskeleton/adapter/outbound/objectstorage/direct/DirectMultipartCoordinator.java 509 4708542e986845196d4245ca049f837cc35d9b3b main/java/dev/caskeleton/adapter/outbound/objectstorage/direct/DirectMultipartGrantLedger.java 107 d98d11e29fe674ec8fd0fc8986432a83a9f6eccc main/java/dev/caskeleton/adapter/outbound/objectstorage/direct/DirectMultipartProvider.java 100 f039dc14b5ca2a653d77a40bb988c21b91937da8 main/java/dev/caskeleton/adapter/outbound/objectstorage/direct/DirectPartAcknowledgementVerifier.java 32 44097b32375e6e97f9bcc817fe4a44106c22d88d main/java/dev/caskeleton/adapter/outbound/objectstorage/direct/DirectPublishedObjectResolver.java 67 768779d2f64094cfc5e3ce149638b47130e56fc8 main/java/dev/caskeleton/adapter/outbound/objectstorage/direct/DirectTransferCoordinator.java 335 94bb156ce8d61a77f685ace80228d4611645460c main/java/dev/caskeleton/adapter/outbound/objectstorage/direct/DirectTransferCorsPolicy.java 26 b94094684e287803bfd8ac01c17bb40714181583 main/java/dev/caskeleton/adapter/outbound/objectstorage/direct/DirectTransferPolicy.java 120 225bd1024bdb30b9633948f3a99d86c4bf435ad3 main/java/dev/caskeleton/adapter/outbound/objectstorage/direct/DirectTransferSessionRecord.java 166 2cf1d611f180570cc98df81dc8c685504bbc7103 main/java/dev/caskeleton/adapter/outbound/objectstorage/direct/PresignedGrantRedactor.java 22 d6e5c166372a6c315fa57923d223380fa9752a93 main/java/dev/caskeleton/adapter/outbound/objectstorage/multipart/ManagedMultipartCoordinator.java 77 9236dc512954a46804f811d9ae0c7d299c779a8d main/java/dev/caskeleton/adapter/outbound/objectstorage/multipart/MultipartCompletionEvidence.java 19 9642d221600fd2ea0974d61a1f004268d3c818dd main/java/dev/caskeleton/adapter/outbound/objectstorage/multipart/MultipartOperationResolver.java 67 a6b251092d0b511de9ca7286e229c0e614588a51 main/java/dev/caskeleton/adapter/outbound/objectstorage/multipart/MultipartPartLedger.java 86 27e7f34cefbfbf198bd2a4069f79c357475a9fd2 main/java/dev/caskeleton/adapter/outbound/objectstorage/multipart/MultipartUploadPlan.java 69 dc9f9f566b8ff4ba1dbe6fe256dcb648af082074 test/java/dev/caskeleton/adapter/outbound/objectstorage/direct/DirectMultipartCoordinatorTest.java 327 d5c64c0bbc68ef0dec9197b241fdab398342919c test/java/dev/caskeleton/adapter/outbound/objectstorage/direct/DirectMultipartRaceTest.java 35 8c02e0a78967e3f0405734c984d9c4d8240b928b test/java/dev/caskeleton/adapter/outbound/objectstorage/direct/DirectTransferCoordinatorTest.java 251 dbbfa053ea245173ad62943c2360080c2c0010f4 test/java/dev/caskeleton/adapter/outbound/objectstorage/direct/DirectTransferCorsContractTest.java 23 8e3e3a280752af008efa3ac5a6f89daa26a19342 test/java/dev/caskeleton/adapter/outbound/objectstorage/direct/PresignedGrantRedactionTest.java 68 4a57af09f29a0902cdd831c8abdd98842ae694b5 test/java/dev/caskeleton/adapter/outbound/objectstorage/multipart/ManagedMultipartCoordinatorTest.java 178 325e11d1443c4f2b3d1ff5ded69d13cac3c7c415 test/java/dev/caskeleton/adapter/outbound/objectstorage/multipart/MultipartResponseLossTest.java 65 main: 18 test: 7 main LOC: 1988 total === 8.1 reachability: who constructs the two coordinators === $ git grep -n 'new DirectTransferCoordinator\|new DirectMultipartCoordinator\|new ManagedMultipartCoordinator\|new MultipartOperationResolver\|new DirectPublishedObjectResolver' -- 'adapter/outbound/objectstorage/src' 'app' 'application' 'adapter' adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3ObjectStorageProviderContribution.java:141: new DirectPublishedObjectResolver( adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/direct/DirectMultipartCoordinatorTest.java:64: new DirectMultipartCoordinator( adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/direct/DirectMultipartCoordinatorTest.java:109: new DirectMultipartCoordinator( adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/direct/DirectMultipartCoordinatorTest.java:126: new DirectMultipartCoordinator( adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/direct/DirectTransferCoordinatorTest.java:57: new DirectTransferCoordinator(ROUTE, store, policy(), provider, CLOCK); adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/direct/DirectTransferCoordinatorTest.java:77: new DirectTransferCoordinator( adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/direct/DirectTransferCoordinatorTest.java:113: new DirectTransferCoordinator( adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/multipart/ManagedMultipartCoordinatorTest.java:96: ManagedMultipartCoordinator coordinator = new ManagedMultipartCoordinator(store); adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/multipart/MultipartResponseLossTest.java:17: MultipartOperationResolver resolver = new MultipartOperationResolver(); adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/multipart/MultipartResponseLossTest.java:21: new MultipartOperationResolver.UploadCandidate( adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/multipart/MultipartResponseLossTest.java:28: new MultipartOperationResolver.InitiateResolution( adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/multipart/MultipartResponseLossTest.java:33: new MultipartOperationResolver.InitiateResolution( adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/multipart/MultipartResponseLossTest.java:37: new MultipartOperationResolver.InitiateResolution( adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/multipart/MultipartResponseLossTest.java:43: MultipartOperationResolver resolver = new MultipartOperationResolver(); exit=0 $ git grep -rn 'DirectMultipartUploadPort\|DirectObjectUploadPort\|DirectObjectDownloadGrantPort' -- 'adapter/outbound/objectstorage/src/main' 'application/core/src/main' adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/direct/DirectMultipartCoordinator.java:27:import dev.caskeleton.application.objectstorage.port.DirectMultipartUploadPort; adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/direct/DirectMultipartCoordinator.java:46:public final class DirectMultipartCoordinator implements DirectMultipartUploadPort { adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/direct/DirectTransferCoordinator.java:19:import dev.caskeleton.application.objectstorage.port.DirectObjectDownloadGrantPort; adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/direct/DirectTransferCoordinator.java:20:import dev.caskeleton.application.objectstorage.port.DirectObjectUploadPort; adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/direct/DirectTransferCoordinator.java:39: implements DirectObjectUploadPort, DirectObjectDownloadGrantPort { exit=0 === 8.2 conditional sibling: the same part-size policy, two call sites === $ grep -n 'MINIMUM_NON_FINAL_PART_BYTES\s*=' adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3ClientPolicy.java 13: public static final long MINIMUM_NON_FINAL_PART_BYTES = 5L * 1024 * 1024; exit=0 $ grep -n 'requirePartSize' adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3ClientPolicy.java adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/multipart/MultipartUploadPlan.java adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/direct/DirectMultipartCoordinator.java adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3ClientPolicy.java:47: public static void requirePartSize(long partBytes, boolean finalPart) { adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/multipart/MultipartUploadPlan.java:61: S3ClientPolicy.requirePartSize(result, partNumber == partCount); adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/direct/DirectMultipartCoordinator.java:163: S3ClientPolicy.requirePartSize(request.exactPartLength(), false); exit=0 $ git grep -n 'requirePartSize' -- 'adapter/outbound/objectstorage/src' adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/direct/DirectMultipartCoordinator.java:163: S3ClientPolicy.requirePartSize(request.exactPartLength(), false); adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/multipart/MultipartUploadPlan.java:61: S3ClientPolicy.requirePartSize(result, partNumber == partCount); adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3ClientPolicy.java:47: public static void requirePartSize(long partBytes, boolean finalPart) { adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3ManagedMultipartProvider.java:80: S3ClientPolicy.requirePartSize( adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3SdkApiCharacterizationTest.java:93: S3ClientPolicy.requirePartSize(S3ClientPolicy.MINIMUM_NON_FINAL_PART_BYTES, false); adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3SdkApiCharacterizationTest.java:94: S3ClientPolicy.requirePartSize(S3ClientPolicy.MINIMUM_NON_FINAL_PART_BYTES - 1, true); adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3SdkApiCharacterizationTest.java:98: S3ClientPolicy.requirePartSize( exit=0 --- does the grant request carry a final-part signal? --- $ sed -n '1,80p' application/core/src/main/java/dev/caskeleton/application/objectstorage/request/PartUploadGrantRequest.java sed: can't read application/core/src/main/java/dev/caskeleton/application/objectstorage/request/PartUploadGrantRequest.java: No such file or directory exit=2 === 8.2b conditional sibling: signed-grant endpoint validation, upload vs download === $ grep -n 'validateSignedGrant\|planningEndpoint\|signUpload\|signDownload\|signPart' adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/direct/DirectTransferCoordinator.java adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/direct/DirectMultipartCoordinator.java adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/direct/DirectTransferCoordinator.java:68: policy.planningEndpoint(), adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/direct/DirectTransferCoordinator.java:94: DirectGrantProvider.DirectGrantMaterial material = provider.signUpload(current.session()); adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/direct/DirectTransferCoordinator.java:95: policy.validateSignedGrant(material.requestUri(), current.session().expiresAt()); adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/direct/DirectTransferCoordinator.java:142: policy.planningEndpoint(), adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/direct/DirectTransferCoordinator.java:180: provider.signDownload(prepared.session(), published); adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/direct/DirectMultipartCoordinator.java:191: DirectGrantProvider.DirectGrantMaterial material = provider.signPart(session, grant.record()); exit=0 $ git grep -n 'validateSignedGrant' -- 'adapter/outbound/objectstorage/src' adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/direct/DirectTransferCoordinator.java:95: policy.validateSignedGrant(material.requestUri(), current.session().expiresAt()); adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/direct/DirectTransferPolicy.java:84: public void validateSignedGrant(URI uri, Instant expectedExpiry) { exit=0 === 8.3 duplicate mechanism: two independent process-local bearer caches === $ git grep -n 'new ConcurrentHashMap' -- 'adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/direct' adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/direct/DirectMultipartCoordinator.java:55: new ConcurrentHashMap<>(); adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/direct/DirectTransferCoordinator.java:47: new ConcurrentHashMap<>(); exit=0 $ git grep -n 'unavailable after process restart' -- 'adapter/outbound/objectstorage/src' adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/direct/DirectMultipartCoordinator.java:183: "issued direct multipart bearer is unavailable after process restart"); adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/direct/DirectTransferCoordinator.java:87: "issued direct grant bearer material is unavailable after process restart"); exit=0 === 8.4 declared-but-unused policy bounds === $ git grep -n 'maximumOutstandingGenerations' -- 'adapter/outbound/objectstorage/src' adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/direct/DirectTransferPolicy.java:18: int maximumOutstandingGenerations, adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/direct/DirectTransferPolicy.java:46: if (maximumOutstandingGenerations < 1 || maximumOutstandingGenerations > 16) { exit=0 $ git grep -n 'maximumExposureBytes\|providerHardCeilingEnforced\|signatureAgeCeiling' -- 'adapter/outbound/objectstorage/src/main' adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/direct/DirectTransferPolicy.java:14: Duration signatureAgeCeiling, adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/direct/DirectTransferPolicy.java:19: long maximumExposureBytes, adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/direct/DirectTransferPolicy.java:20: boolean providerHardCeilingEnforced, adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/direct/DirectTransferPolicy.java:38: requirePositive("signatureAgeCeiling", signatureAgeCeiling); adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/direct/DirectTransferPolicy.java:49: if (maximumExposureBytes < 1) { adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/direct/DirectTransferPolicy.java:66: || requestedTtl.compareTo(signatureAgeCeiling) > 0) { adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/direct/DirectTransferPolicy.java:69: if (exactBytes < 1 || exactBytes > maximumExposureBytes) { adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/direct/DirectTransferPolicy.java:72: if (uploadProfile == UploadProfile.DIRECT_SINGLE_HARD_CEILING && !providerHardCeilingEnforced) { exit=0 $ git grep -n 'DirectTransferCorsPolicy' -- 'adapter/outbound/objectstorage/src' 'adapter' 'app' adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/direct/DirectTransferCorsPolicy.java:6:public final class DirectTransferCorsPolicy { adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/direct/DirectTransferCorsPolicy.java:8: private DirectTransferCorsPolicy() {} adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/direct/DirectTransferCorsContractTest.java:11: assertThat(DirectTransferCorsPolicy.allowedMethods()) adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/direct/DirectTransferCorsContractTest.java:13: assertThat(DirectTransferCorsPolicy.allowedRequestHeaders()) adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/direct/DirectTransferCorsContractTest.java:20: assertThat(DirectTransferCorsPolicy.exposedResponseHeaders()) exit=0 === 8.4b test coverage of this sub-scope === $ git ls-files 'adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/direct' 'adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/multipart' adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/direct/DirectMultipartCoordinatorTest.java adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/direct/DirectMultipartRaceTest.java adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/direct/DirectTransferCoordinatorTest.java adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/direct/DirectTransferCorsContractTest.java adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/direct/PresignedGrantRedactionTest.java adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/multipart/ManagedMultipartCoordinatorTest.java adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/multipart/MultipartResponseLossTest.java exit=0 $ git grep -hn 'void [a-z][A-Za-z0-9]*(' -- 'adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/direct' 'adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/multipart' | sed 's/^ *//' | head -60 60: void initiateIntentGrantAcknowledgementAndCompletionAreDurablyOrdered() { 105: void startReplayResolvesTheDurableInitiationInsteadOfBlindlyCreatingAgain() { 122: void lostCompleteResponseIsResolvedBeforeTheTerminalVersionIsPersisted() { 268: public void abort(ObjectDirectMultipartSessionRecord session) {} 321: private void capture(ObjectControlRecord record) { 14: void completionHorizonRejectsWhileIssuedPartRequestsMayStillArrive() { 27: void lateGrantAdmissionRejectsAfterCompletionFence() { 51: void preparedCasPrecedesSigningAndIssuedCasPrecedesReturningTheBearerGrant() { 74: void completionIgnoresClientSuccessAndAdvancesOnlyAfterExactProviderVerification() { 96: void unhealthyQualifiedClockRejectsBeforePersistingOrSigning() { 244: private void capture(ObjectControlRecord record) { 10: void browserContractContainsOnlyTheSignedUploadAndCompletionEvidenceSurface() { 18: void bearerUriAndSignedValuesAreNeverRendered() { 32: void endpointExpiryCredentialHorizonClockAndHardCeilingFailClosed() { 37: void freezesSingleVersusMultipartAndEveryS3ResourceBoundary() { 74: void immutableShardedPartLedgerReplaysSameEvidenceAndConflictsOnDifferentEvidence() { 90: void initiationIntentIsDurableBeforeTheProviderCall() { 16: void initiateLossAdoptsOnlyOneExactBoundedCandidate() { 42: void completionLossUsesExactHeadAndNeverRetriesAnOldUploadId() { exit=0 === 8.1b follow-up: nothing outside direct/** names the coordinators or the policy === $ git grep -n 'DirectTransferCoordinator\|DirectMultipartCoordinator\|DirectTransferPolicy' -- . | grep -v '/objectstorage/direct/' | wc -l 0 exit=0 === 8.1c the capability is operator-declarable and allocates a credentialed presigner === $ grep -n 'DIRECT_UPLOAD\|DIRECT_MULTIPART' adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/config/ObjectStorageBindingCompiler.java 206: case DIRECT_UPLOAD -> ObjectStorageProvider.Capability.DIRECT_UPLOAD; 207: case DIRECT_MULTIPART -> ObjectStorageProvider.Capability.DIRECT_MULTIPART; exit=0 $ grep -n 'directUploadEnabled\|directMultipartEnabled\|presignerFactory.apply' adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3ObjectStorageProviderContribution.java 112: boolean directUploadEnabled = 121: boolean directMultipartEnabled = 131: directUploadEnabled || directMultipartEnabled 132: ? presignerFactory.apply(clientPolicy) 135: !directUploadEnabled 148: !directMultipartEnabled exit=0 $ grep -n 'DIRECT_UPLOAD\|DIRECT_MULTIPART\|cannot claim native conditional' adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3ProviderBinding.java 196: || config.capabilities().contains(ObjectStorageProvider.Capability.DIRECT_UPLOAD) 199: .contains(ObjectStorageProvider.Capability.DIRECT_MULTIPART))) { 201: "the exact MinIO release cannot claim native conditional managed mutation support"); exit=0 --- are the built direct providers ever retrieved from the factory? --- $ git grep -n 'directMultipartProvider(\|directTransferProvider(' -- 'adapter/outbound/objectstorage/src' | grep -v 'config/SelectedObjectStorageProviderFactory.java' | grep -v 'S3ObjectStorageProviderContribution.java' adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3ProviderCompositionTest.java:112: .directTransferProvider(S3DirectTransferProvider.class)) adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3ProviderCompositionTest.java:120: .directMultipartProvider(S3DirectMultipartProvider.class)) exit=0 === 8.4c what the leaf README declares about this sub-scope === $ grep -n 'remain R0\|no direct-grant port is registered' adapter/outbound/objectstorage/README.md 28:production reconciliation cards remain R0. 39:privileged purge composition remain separate and empty; no direct-grant port is registered. exit=0