Sub-scope 06 (objectstorage) filesystem + maintenance + readiness + provider + root — manifest and probes revision=a24ece9cf797f7ea647e33bf846b115208ed1ba5 generatedAt=2026-08-30T02:57:19+00:00 cwd=/shared/codebase/clean-architecture-backend-template/src === OWNED FILES (main) === f5c77750961b83e3fde720cdc34ae080f61027db main/java/dev/caskeleton/adapter/outbound/objectstorage/filesystem/FilesystemLocalDevProviderContribution.java 81 91cae2205b26ddae6c0d9c0968863dfa0bfdb47d main/java/dev/caskeleton/adapter/outbound/objectstorage/filesystem/LocalDevObjectControlStore.java 115 8c0e5d93e163cbf0509f7e68a313559b1c27b0fa main/java/dev/caskeleton/adapter/outbound/objectstorage/filesystem/LocalDevObjectDataStore.java 188 e559bd8b78fddfb364d2885d436be040accba0a0 main/java/dev/caskeleton/adapter/outbound/objectstorage/filesystem/LocalDevObjectStorageProvider.java 106 8e3b9fc5b36ca2f638d77d558dec2e9b24dc129c main/java/dev/caskeleton/adapter/outbound/objectstorage/filesystem/LocalObjectPathGuard.java 158 ab238c3d53ee1c23245fa2b8dd2037afff881ee0 main/java/dev/caskeleton/adapter/outbound/objectstorage/filesystem/LocalObjectStreamTransfer.java 193 8b8b164cee901b373039a3690c0729fdb5f3857a main/java/dev/caskeleton/adapter/outbound/objectstorage/maintenance/Ed25519LegacyAdoptionApprovalVerifier.java 119 4332c6cc3f2f81ed460c3df136af8f6d486b6b5d main/java/dev/caskeleton/adapter/outbound/objectstorage/maintenance/LegacyAdoptionApprovalCodec.java 169 a96a2a891d9b0374e08f43f4e72c50125c37379d main/java/dev/caskeleton/adapter/outbound/objectstorage/maintenance/LegacyAdoptionApprovalDocument.java 112 9c19cf8a3f428134003079ef8353e2fce52c9e40 main/java/dev/caskeleton/adapter/outbound/objectstorage/maintenance/LegacyAdoptionApprovalReplayRecord.java 39 83b67717e32806fd52396023a84cf4a6c78a5c62 main/java/dev/caskeleton/adapter/outbound/objectstorage/maintenance/LegacyAdoptionApprovalReplayStore.java 16 93dc1ebac98d9f6edb3a6d686ae2affc89d56ee8 main/java/dev/caskeleton/adapter/outbound/objectstorage/maintenance/LegacyObjectAdoptionService.java 122 e11be7109baa8b0251e8690c5c3468da50229a4e main/java/dev/caskeleton/adapter/outbound/objectstorage/maintenance/LegacyObjectInspection.java 20 d518feeed84a1b234daaa5971a84d6857f295e09 main/java/dev/caskeleton/adapter/outbound/objectstorage/maintenance/LegacyObjectInspector.java 12 95a00035aa6f388a992c043cd2fea3c93f74cf1d main/java/dev/caskeleton/adapter/outbound/objectstorage/provider/ObjectStorageProvider.java 99 46013987d2b87fb882137975d82b85f394f1876e main/java/dev/caskeleton/adapter/outbound/objectstorage/provider/ObjectStorageProviderDescriptor.java 56 82afb574a2c5e902cfe4e0b517942ac4f6940e3d main/java/dev/caskeleton/adapter/outbound/objectstorage/provider/ObjectStorageProviderException.java 43 08961f7dc0277b6ebc6974a224a82f1720983f79 main/java/dev/caskeleton/adapter/outbound/objectstorage/provider/ObjectStorageProviderOperation.java 46 dc53066f499c7ff758292c0228aa234c0e560ae7 main/java/dev/caskeleton/adapter/outbound/objectstorage/readiness/CapabilityEvidence.java 64 5371d00836e05e24e2c0fe257f24adf4d478c0c7 main/java/dev/caskeleton/adapter/outbound/objectstorage/readiness/CapabilityEvidenceSource.java 8 0be1dcc013142e946f234fdc937607634283e477 main/java/dev/caskeleton/adapter/outbound/objectstorage/readiness/CapabilityEvidenceStatus.java 8 354ba7ec7b5700e136319b790f8b2b5a5165f5c5 main/java/dev/caskeleton/adapter/outbound/objectstorage/readiness/ObjectStorageCapabilityCard.java 41 a11b85bc25a10e56de10fdb2adb93ff1dd33be58 main/java/dev/caskeleton/adapter/outbound/objectstorage/readiness/ObjectStorageCapabilityDescriptor.java 69 55e5092e7d43c10bc020fe5b2181ec09f6853d3d main/java/dev/caskeleton/adapter/outbound/objectstorage/readiness/ObjectStorageCapabilityEvidence.java 71 eb2acc4d447a9f07b56cd0fffd384fb4b5f629cd main/java/dev/caskeleton/adapter/outbound/objectstorage/readiness/ObjectStorageOperationProfile.java 24 8f6f807c770b5806be739cbc85f2eb4fdd1ca515 main/java/dev/caskeleton/adapter/outbound/objectstorage/readiness/ObjectStorageReadinessLevel.java 9 96e3713897b0e8a7b49b373d3ab1db7a6dd333f1 main/java/dev/caskeleton/adapter/outbound/objectstorage/FilesystemObjectStorageAdapter.java 111 73f8f5957a26e8b847b4fc7278ce9b57b243f13a main/java/dev/caskeleton/adapter/outbound/objectstorage/ObjectStorageConfig.java 73 9c30d68532834e86015e16fe93e28b033201d1ef main/java/dev/caskeleton/adapter/outbound/objectstorage/ObjectStorageSettings.java 119 d4e9346f832cc2a9cbd0780096379829a0eced3f main/java/dev/caskeleton/adapter/outbound/objectstorage/S3ObjectStorageAdapter.java 129 === OWNED FILES (test + resources) === ace0020defa378a1510f6ca6040f129e042cb7e8 test/java/dev/caskeleton/adapter/outbound/objectstorage/contract/ObjectStorageProviderContract.java 247 8c7560b9be41fbc8d952784faaae8634ab6dbdfb test/java/dev/caskeleton/adapter/outbound/objectstorage/filesystem/LocalDevObjectStorageProviderTest.java 77 91eb70284a74e0cc262a0b33b4f7a1edfbb4ffc9 test/java/dev/caskeleton/adapter/outbound/objectstorage/filesystem/LocalDevObjectStorageRecoveryTest.java 153 4e1d428672fea90e9b92ddc98874f11f0b0ab501 test/java/dev/caskeleton/adapter/outbound/objectstorage/maintenance/LegacyAdoptionApprovalVerifierTest.java 145 e062e3f31a5fea30158239b1695ff2814b655be8 test/java/dev/caskeleton/adapter/outbound/objectstorage/maintenance/LegacyObjectAdoptionServiceTest.java 109 ee44b4988b56babe46ac436c242fd2069b43ce4b test/java/dev/caskeleton/adapter/outbound/objectstorage/readiness/ObjectStorageReadinessRegistryTest.java 196 110b8e4bfefe96f013fe2917d7ab70dc93788a74 test/java/dev/caskeleton/adapter/outbound/objectstorage/FilesystemObjectStorageAdapterTest.java 87 6c218260e7f11c4eeeba321210f77f0090c87633 test/java/dev/caskeleton/adapter/outbound/objectstorage/LegacyObjectStorageBehaviorTest.java 68 4ede9de7f100b30be9e8ec7a9863524cef485629 test/java/dev/caskeleton/adapter/outbound/objectstorage/LegacyObjectStorageConfigTest.java 58 15efccb9cd361f8e77716301fa6276914713c079 test/java/dev/caskeleton/adapter/outbound/objectstorage/ObjectStorageArchitectureTest.java 44 62ef07fd72f6315d02855f28a0dd674e9ae35504 test/java/dev/caskeleton/adapter/outbound/objectstorage/S3ObjectStorageAdapterIT.java 102 3ae16ed6b35f3112d8d165082971d600a54c77f1 test/java/dev/caskeleton/adapter/outbound/objectstorage/S3ObjectStorageAdapterTest.java 99 f4e41f21b45750363e967561a863f5d880c1c601 test/resources/object-storage/minio-provider-evidence.json 25 main: 30 test+resources: 13 main LOC: 2420 total === 8.1 reachability: maintenance/** === $ git grep -n 'LegacyObjectAdoptionService\|Ed25519LegacyAdoptionApprovalVerifier\|LegacyAdoptionApprovalReplayStore\|LegacyObjectInspector' -- . | grep -v '/objectstorage/maintenance/' adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/config/ObjectStorageLegacyMigrationConfig.java:3:import dev.caskeleton.adapter.outbound.objectstorage.maintenance.LegacyAdoptionApprovalReplayStore; adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/config/ObjectStorageLegacyMigrationConfig.java:4:import dev.caskeleton.adapter.outbound.objectstorage.maintenance.LegacyObjectAdoptionService; adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/config/ObjectStorageLegacyMigrationConfig.java:5:import dev.caskeleton.adapter.outbound.objectstorage.maintenance.LegacyObjectInspector; adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/config/ObjectStorageLegacyMigrationConfig.java:31: LegacyObjectInspector inspector, adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/config/ObjectStorageLegacyMigrationConfig.java:33: LegacyAdoptionApprovalReplayStore replayStore, adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/config/ObjectStorageLegacyMigrationConfig.java:35: return new LegacyObjectAdoptionService(inspector, publications, replayStore, clock); adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/config/ObjectStorageLegacyMigrationConfigTest.java:6:import dev.caskeleton.adapter.outbound.objectstorage.maintenance.LegacyAdoptionApprovalReplayStore; adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/config/ObjectStorageLegacyMigrationConfigTest.java:7:import dev.caskeleton.adapter.outbound.objectstorage.maintenance.LegacyObjectInspector; adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/config/ObjectStorageLegacyMigrationConfigTest.java:30: .withBean(LegacyObjectInspector.class, () -> mock(LegacyObjectInspector.class)) adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/config/ObjectStorageLegacyMigrationConfigTest.java:34: LegacyAdoptionApprovalReplayStore.class, adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/config/ObjectStorageLegacyMigrationConfigTest.java:35: () -> mock(LegacyAdoptionApprovalReplayStore.class)) adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/config/ObjectStorageLegacyMigrationConfigTest.java:53: .withBean(LegacyObjectInspector.class, () -> mock(LegacyObjectInspector.class)) adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/config/ObjectStorageLegacyMigrationConfigTest.java:57: LegacyAdoptionApprovalReplayStore.class, adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/config/ObjectStorageLegacyMigrationConfigTest.java:58: () -> mock(LegacyAdoptionApprovalReplayStore.class)) exit=0 $ git grep -n 'LegacyObjectAdoptionApprovalVerifierPort\|LegacyObjectAdoptionPort' -- . | grep -v '/objectstorage/maintenance/' adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/config/ObjectStorageLegacyMigrationConfig.java:7:import dev.caskeleton.application.storage.migration.LegacyObjectAdoptionPort; adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/config/ObjectStorageLegacyMigrationConfig.java:30: public LegacyObjectAdoptionPort legacyObjectAdoptionPort( adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/config/ObjectStorageLegacyMigrationConfigTest.java:9:import dev.caskeleton.application.storage.migration.LegacyObjectAdoptionPort; adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/config/ObjectStorageLegacyMigrationConfigTest.java:23: .run(context -> assertThat(context).doesNotHaveBean(LegacyObjectAdoptionPort.class)); adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/config/ObjectStorageLegacyMigrationConfigTest.java:45: assertThat(context).hasSingleBean(LegacyObjectAdoptionPort.class); application-core/src/main/java/dev/caskeleton/application/storage/migration/LegacyObjectAdoptionApprovalVerifierPort.java:5:public interface LegacyObjectAdoptionApprovalVerifierPort { application-core/src/main/java/dev/caskeleton/application/storage/migration/LegacyObjectAdoptionPort.java:5:public interface LegacyObjectAdoptionPort { application-core/src/test/java/dev/caskeleton/application/objectstorage/ObjectStorageArchitectureContractTest.java:49: "dev.caskeleton.application.storage.migration.LegacyObjectAdoptionApprovalVerifierPort", application-core/src/test/java/dev/caskeleton/application/objectstorage/ObjectStorageArchitectureContractTest.java:50: "dev.caskeleton.application.storage.migration.LegacyObjectAdoptionPort", sample-portfolio/src/main/java/dev/caskeleton/sample/portfolio/application/poster/migration/AdoptLegacyPosterImageUseCase.java:8:import dev.caskeleton.application.storage.migration.LegacyObjectAdoptionApprovalVerifierPort; sample-portfolio/src/main/java/dev/caskeleton/sample/portfolio/application/poster/migration/AdoptLegacyPosterImageUseCase.java:9:import dev.caskeleton.application.storage.migration.LegacyObjectAdoptionPort; sample-portfolio/src/main/java/dev/caskeleton/sample/portfolio/application/poster/migration/AdoptLegacyPosterImageUseCase.java:35: private final LegacyObjectAdoptionPort adoptions; sample-portfolio/src/main/java/dev/caskeleton/sample/portfolio/application/poster/migration/AdoptLegacyPosterImageUseCase.java:36: private final LegacyObjectAdoptionApprovalVerifierPort approvals; sample-portfolio/src/main/java/dev/caskeleton/sample/portfolio/application/poster/migration/AdoptLegacyPosterImageUseCase.java:43: LegacyObjectAdoptionPort adoptions, sample-portfolio/src/main/java/dev/caskeleton/sample/portfolio/application/poster/migration/AdoptLegacyPosterImageUseCase.java:44: LegacyObjectAdoptionApprovalVerifierPort approvals, exit=0 === 8.1b reachability: readiness/** and the declared registry file === $ git grep -n 'ObjectStorageCapabilityEvidence\|ObjectStorageCapabilityCard\|ObjectStorageReadinessLevel' -- . | grep -v '/objectstorage/readiness/' exit=1 $ git grep -rn 'object-storage-readiness' -- . | head -20 adapter/outbound/objectstorage/CLAUDE.md:13:`docs/registries/object-storage-readiness.yaml`. adapter/outbound/objectstorage/CLAUDE.md:44:- Claims above the exact rows in `docs/registries/object-storage-readiness.yaml`. adapter/outbound/objectstorage/README.md:11:evidence claims in `docs/registries/object-storage-readiness.yaml`. adapter/outbound/objectstorage/build.gradle:46: .resolve('docs/registries/object-storage-readiness.yaml').toFile() app-bootstrap/src/test/java/dev/caskeleton/bootstrap/contract/ContractRegistrySchemaGovernanceTest.java:32: "object-storage-readiness.yaml", app-bootstrap/src/test/java/dev/caskeleton/bootstrap/contract/ContractRegistrySchemaGovernanceTest.java:165: invalidSpecialized.resolve("object-storage-readiness.yaml"), app-bootstrap/src/test/java/dev/caskeleton/bootstrap/contract/ContractRegistrySchemaGovernanceTest.java:174: .hasMessageContaining("object-storage-readiness.yaml"); app-bootstrap/src/test/java/dev/caskeleton/bootstrap/contract/ContractRegistrySchemaGovernanceTest.java:179: fractionalSpecializedVersion.resolve("object-storage-readiness.yaml"), app-bootstrap/src/test/java/dev/caskeleton/bootstrap/contract/ContractRegistrySchemaGovernanceTest.java:187: .hasMessageContaining("object-storage-readiness.yaml"); app-bootstrap/src/test/java/dev/caskeleton/bootstrap/contract/ContractRegistrySchemaGovernanceTest.java:192: duplicateSpecializedIdentity.resolve("object-storage-readiness.yaml"), app-bootstrap/src/test/java/dev/caskeleton/bootstrap/contract/ContractRegistrySchemaGovernanceTest.java:204: String specialized = Files.readString(falseProvenance.resolve("object-storage-readiness.yaml")); app-bootstrap/src/test/java/dev/caskeleton/bootstrap/contract/ContractRegistrySchemaGovernanceTest.java:206: falseProvenance.resolve("object-storage-readiness.yaml"), app-bootstrap/src/test/java/dev/caskeleton/bootstrap/contract/ContractRegistrySchemaGovernanceTest.java:213: .hasMessageContaining("object-storage-readiness.yaml"); app-bootstrap/src/test/java/dev/caskeleton/bootstrap/contract/ContractRegistrySchemaGovernanceTest.java:218: Files.readString(embeddedFalseProvenance.resolve("object-storage-readiness.yaml")) app-bootstrap/src/test/java/dev/caskeleton/bootstrap/contract/ContractRegistrySchemaGovernanceTest.java:221: embeddedFalseProvenance.resolve("object-storage-readiness.yaml"), app-bootstrap/src/test/java/dev/caskeleton/bootstrap/contract/ContractRegistrySchemaGovernanceTest.java:233: .hasMessageContaining("object-storage-readiness.yaml"); app-bootstrap/src/test/java/dev/caskeleton/bootstrap/contract/ContractRegistrySchemaGovernanceTest.java:236: Path fabricatedHeaderFile = fabricatedBranchHeader.resolve("object-storage-readiness.yaml"); app-bootstrap/src/test/java/dev/caskeleton/bootstrap/contract/ContractRegistrySchemaGovernanceTest.java:243: .hasMessageContaining("object-storage-readiness.yaml"); app-bootstrap/src/test/java/dev/caskeleton/bootstrap/contract/ContractRegistrySchemaGovernanceTest.java:246: Path reorderedHeaderFile = reorderedHeader.resolve("object-storage-readiness.yaml"); app-bootstrap/src/test/java/dev/caskeleton/bootstrap/contract/ContractRegistrySchemaGovernanceTest.java:260: .hasMessageContaining("object-storage-readiness.yaml"); exit=0 $ git ls-files | grep -i 'registries/' | head -20 exit=0 === 8.2 conditional sibling: legacy root adapters vs the new capability === $ grep -n 'autoCreateBucket\|publicAcl' adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3ProviderBinding.java adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/ObjectStorageSettings.java adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/ObjectStorageConfig.java adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3ProviderBinding.java:268: if (settings.autoCreateBucket() || settings.publicAcl()) { adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/ObjectStorageSettings.java:46: private boolean autoCreateBucket = true; adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/ObjectStorageSettings.java:113: return autoCreateBucket; adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/ObjectStorageSettings.java:116: public void setAutoCreateBucket(boolean autoCreateBucket) { adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/ObjectStorageSettings.java:117: this.autoCreateBucket = autoCreateBucket; exit=0 $ cat -n adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/config/LegacyObjectStorageActivationGuard.java 1 package dev.caskeleton.adapter.outbound.objectstorage.config; 2 3 import java.util.Arrays; 4 import org.springframework.context.annotation.Condition; 5 import org.springframework.context.annotation.ConditionContext; 6 import org.springframework.core.env.ConfigurableEnvironment; 7 import org.springframework.core.env.EnumerablePropertySource; 8 import org.springframework.core.type.AnnotatedTypeMetadata; 9 10 /** Activates the deprecated alias only when explicitly present and rejects mixed namespaces. */ 11 public final class LegacyObjectStorageActivationGuard implements Condition { 12 13 private static final String LEGACY_PREFIX = "ca-skeleton.objectstorage."; 14 private static final String CANONICAL_PREFIX = "app.object-storage."; 15 16 @Override 17 public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { 18 boolean legacy = hasPrefix(context, LEGACY_PREFIX); 19 boolean canonical = hasPrefix(context, CANONICAL_PREFIX); 20 if (legacy && canonical) { 21 throw new IllegalStateException( 22 "legacy and canonical object-storage configuration cannot be combined"); 23 } 24 return legacy; 25 } 26 27 private static boolean hasPrefix(ConditionContext context, String prefix) { 28 if (context.getEnvironment() instanceof ConfigurableEnvironment environment) { 29 for (var propertySource : environment.getPropertySources()) { 30 if (propertySource instanceof EnumerablePropertySource enumerable 31 && Arrays.stream(enumerable.getPropertyNames()) 32 .anyMatch(name -> name.startsWith(prefix))) { 33 return true; 34 } 35 } 36 } 37 return knownProperties(prefix).stream().anyMatch(context.getEnvironment()::containsProperty); 38 } 39 40 private static java.util.List knownProperties(String prefix) { 41 if (LEGACY_PREFIX.equals(prefix)) { 42 return java.util.List.of( 43 prefix + "backend", 44 prefix + "base-path", 45 prefix + "bucket", 46 prefix + "endpoint", 47 prefix + "region", 48 prefix + "access-key", 49 prefix + "secret-key", 50 prefix + "path-style-access", 51 prefix + "auto-create-bucket"); 52 } 53 return java.util.List.of( 54 prefix + "enabled", 55 prefix + "default-destination", 56 prefix + "legacy.enabled", 57 prefix + "legacy.backend", 58 prefix + "legacy.base-path"); 59 } 60 } exit=0 $ grep -n 'symbolic link\|isSymbolicLink' adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/filesystem/LocalObjectPathGuard.java adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/FilesystemObjectStorageAdapter.java adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/filesystem/LocalObjectPathGuard.java:23: if (Files.isSymbolicLink(root)) { adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/filesystem/LocalObjectPathGuard.java:24: throw new IllegalArgumentException("local object-storage root cannot be a symbolic link"); adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/filesystem/LocalObjectPathGuard.java:73: if (Files.isSymbolicLink(target)) { adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/filesystem/LocalObjectPathGuard.java:74: throw new IllegalArgumentException("local object target cannot be a symbolic link"); adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/filesystem/LocalObjectPathGuard.java:86: if (Files.isSymbolicLink(current)) { adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/filesystem/LocalObjectPathGuard.java:87: throw new IllegalArgumentException("local object parent cannot be a symbolic link"); adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/filesystem/LocalObjectPathGuard.java:95: || Files.isSymbolicLink(current)) { adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/filesystem/LocalObjectPathGuard.java:109: if (Files.isSymbolicLink(current)) { adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/filesystem/LocalObjectPathGuard.java:110: throw new IllegalArgumentException("local object parent cannot be a symbolic link"); exit=0 === 8.3 duplicate mechanism: two capability tables for filesystem-local-dev === $ grep -c 'Support.SUPPORTED' adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/filesystem/LocalDevObjectStorageProvider.java adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/filesystem/FilesystemLocalDevProviderContribution.java adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/filesystem/LocalDevObjectStorageProvider.java:6 adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/filesystem/FilesystemLocalDevProviderContribution.java:6 exit=0 $ grep -n 'private static EnumMap' adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/filesystem/LocalDevObjectStorageProvider.java adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/filesystem/FilesystemLocalDevProviderContribution.java adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/filesystem/LocalDevObjectStorageProvider.java:93: private static EnumMap capabilitySupport() { adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/filesystem/FilesystemLocalDevProviderContribution.java:58: private static EnumMap exit=0 === 8.4 declared-but-unenforced: adoption claim result === $ grep -n 'ClaimResult claim\|claim !=\|markTerminal\|publications.publish' adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/maintenance/LegacyObjectAdoptionService.java 68: LegacyAdoptionApprovalReplayStore.ClaimResult claim = replayStore.claim(replay); 69: var published = publications.publish(request.publicationRequest(), inspected.producer()); 70: if (claim != LegacyAdoptionApprovalReplayStore.ClaimResult.TERMINAL_REPLAY) { 71: replayStore.markTerminal( exit=0 $ grep -n 'ObjectStorageLegacyMigrationConfig' -B 2 -A 30 adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/config/ObjectStorageLegacyMigrationConfig.java | head -45 25-// This explicit adoption wiring remains active until data/API migration is complete. 26-@SuppressWarnings("deprecation") 27:public class ObjectStorageLegacyMigrationConfig { 28- 29- @Bean 30- public LegacyObjectAdoptionPort legacyObjectAdoptionPort( 31- LegacyObjectInspector inspector, 32- ManagedObjectPublicationPort publications, 33- LegacyAdoptionApprovalReplayStore replayStore, 34- Clock clock) { 35- return new LegacyObjectAdoptionService(inspector, publications, replayStore, clock); 36- } 37-} exit=0