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

