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<String> 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<Capability, Support> capabilitySupport() {
adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/filesystem/FilesystemLocalDevProviderContribution.java:58:  private static EnumMap<ObjectStorageProvider.Capability, ObjectStorageProvider.Support>
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

