# Object Storage Batch A Checkpoint - Date: 2026-07-28 - Branch: `codex/objectstorage-production-capability` - Worktree: `/home/donghyeon/workspace/clean-architecture-backend-template-objectstorage` - Claimed level: R0 application contract only - Provider readiness advanced: no ## Implemented scope - Characterized the legacy caller-key overwrite, whole-object materialization, locator exposure, eager filesystem directory creation, optional S3 bucket provisioning, and Poster transaction/API coupling without changing those behaviors. - Added provider-neutral identities, opaque checked references/handles, bounded streaming callbacks, content identity, digest/range values, requests, receipts, outcomes, and narrow ports under `dev.caskeleton.application.objectstorage`. - Required an `ObjectOperationKey` on mutation requests and separated normal publication, scan-maintenance, purge-maintenance, direct, and staged privilege surfaces. - Added recursive contract-purity tests and an ArchUnit freeze for the one existing sample legacy import. - Marked the legacy `ObjectStoragePort` and `StoredObject` as removal boundaries without adapting new semantic calls back to raw keys. No provider-neutral kernel, canonical namespace/control codec, local R1 provider, S3/MinIO qualification, sample migration, or R2 readiness claim is included. ## TDD evidence The planned RED checks failed only for the intentionally missing types or removal annotations: - `ObjectStorageIdentityContractTest`: missing identity types before Task 2 implementation. - `ObjectContentContractTest` and `ObjectStorageValueContractTest`: missing content/value types before Task 3 implementation. - `ObjectStoragePortContractTest`: missing request/receipt/port family before Task 4 implementation. - `ObjectStorageArchitectureContractTest`: missing legacy removal annotations before Task 5 implementation. An initial ArchUnit DSL compilation error was a test-authoring error, not accepted as a RED result; the rule was corrected and rerun. ## GREEN verification All commands ran from `src/` and completed with `BUILD SUCCESSFUL`: ```bash ./gradlew :application-core:resolveAndLockAll --write-locks ./gradlew :application-core:verifyDependencyLocks --console=plain ./gradlew :application-core:test --tests '*ObjectStorageIdentityContractTest' --console=plain ./gradlew :application-core:test \ --tests '*ObjectContentContractTest' \ --tests '*ObjectStorageValueContractTest' --console=plain ./gradlew :application-core:test --tests '*ObjectStoragePortContractTest' --console=plain ./gradlew :application-core:test \ --tests '*ObjectStorageArchitectureContractTest' --console=plain ./gradlew :app-bootstrap:test --tests '*CleanArchitectureTest' --console=plain ./gradlew :application-core:check --console=plain ./gradlew verifyCleanArchitectureDependencies --console=plain ./gradlew :adapter:outbound:objectstorage:test :sample-portfolio:test --console=plain ``` The final combined legacy focused suites completed in 27 seconds. Deprecation-for-removal warnings are expected evidence that legacy consumers remain visible; they are not suppressed. ## LLM Wiki capture The canonical vault required by repository policy, `/home/donghyeon/workspace/ai-tool/llm-wiki-private/`, and its parent `/home/donghyeon/workspace/ai-tool/` do not exist in this environment. Therefore the required `raw/branch-notes/codex-objectstorage-production-capability.md` could not be created or updated. No similarly named non-canonical clone was used. This exact access block is recorded in both the plan and design headers and here at the Batch A boundary. ## Remaining gates and risks - External broker and REST consumers and deployed legacy data were not inspected; Gate A remains blocked for legacy removal or public API versioning. - The new contracts have no provider implementation yet. - The current legacy adapter retains whole-object and raw-locator behavior by design until the later migration batch. - No readiness registry row is promoted by this checkpoint.