Files
document-haness/docs/clean-architecture-backend-template/final/evidence/raw/154-objectstorage-direct-multipart-probes.txt
T
DongHyeonkaandClaude Opus 5 b2963105a8 docs(keycloak-session-store): import the session-storage lab as a new project
The keycloak project ended with four open questions that design could not
settle. A two-VM lab was built to answer them by measurement, and this is
that material: 26 experiments, 125 raw command outputs, 22 browser captures.

Follows the import procedure in README.md.

  source/     the originating repository verbatim — 78 documents, 28 SVGs,
              8 manifests, plus .source-revision recording the commit
  final/      the SSOT
    document.md   729 lines written from the 29 experiment documents, not
                  concatenated: what was predicted, what was measured, and
                  where the measurement itself was wrong
    evidence/raw    125 outputs, flattened to <experiment>__<file> because
                    the originals collided (01-baseline.txt appeared three
                    times) and the audit only globs the top level
    evidence/meta   one per raw file; command and exitCode are null and the
                    README says why rather than inventing them
    evidence/browser  22 captures
    assets/       three diagrams through techviz
    .techviz/     their VizSpecs

A separate project rather than an addition to keycloak: the B-layer answers
that project's four questions, but the A, C and D layers are about cluster
failure, SSO and operations, and one document.md should hold one subject.
The four question records there can point here through 관계.

Recorded rather than papered over: only three of the 28 diagrams were
remade. The repository forbids hand-drawn SVG and forbids titles inside the
canvas; all 28 originals carry both, so converting them is redrawing, not
reformatting. They stay in source/ and the gap is written into the document.

verify-pipeline.py passes. audit-records.py reports no issues.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-04 22:51:59 +09:00

212 lines
23 KiB
Plaintext

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