Files

4.0 KiB

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:

./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.