diff --git a/src/main/java/com/clearfolio/viewer/lifecycle/ArtifactDeletionState.java b/src/main/java/com/clearfolio/viewer/lifecycle/ArtifactDeletionState.java new file mode 100644 index 000000000..0f45c46f6 --- /dev/null +++ b/src/main/java/com/clearfolio/viewer/lifecycle/ArtifactDeletionState.java @@ -0,0 +1,33 @@ +package com.clearfolio.viewer.lifecycle; + +/** + * Durable states in the artifact-deletion receipt lifecycle. + */ +public enum ArtifactDeletionState { + /** + * An authorized deletion request has been durably accepted. The receipt may + * still carry the controlled pre-snapshot marker until an exact artifact + * checksum is captured; metadata cannot be tombstoned before that binding. + */ + DELETION_REQUESTED, + + /** + * Tenant-owned job metadata has been tombstoned. + */ + METADATA_TOMBSTONED, + + /** + * Exact-generation artifact cleanup is ready for a worker attempt. + */ + ARTIFACT_CLEANUP_PENDING, + + /** + * Artifact cleanup completed and the receipt is terminal. + */ + ARTIFACT_CLEANUP_COMPLETED, + + /** + * Artifact cleanup failed and remains eligible for a controlled retry. + */ + ARTIFACT_CLEANUP_FAILED +} diff --git a/src/test/java/com/clearfolio/viewer/lifecycle/ArtifactDeletionStateTest.java b/src/test/java/com/clearfolio/viewer/lifecycle/ArtifactDeletionStateTest.java new file mode 100644 index 000000000..2531c49c8 --- /dev/null +++ b/src/test/java/com/clearfolio/viewer/lifecycle/ArtifactDeletionStateTest.java @@ -0,0 +1,28 @@ +package com.clearfolio.viewer.lifecycle; + +import static org.junit.jupiter.api.Assertions.assertArrayEquals; +import static org.junit.jupiter.api.Assertions.assertSame; + +import org.junit.jupiter.api.Test; + +/** + * Verifies the durable deletion state vocabulary used by lifecycle receipts. + */ +class ArtifactDeletionStateTest { + + @Test + void exposesOnlyTheMonotonicDeletionLifecycleStates() { + ArtifactDeletionState[] expected = { + ArtifactDeletionState.DELETION_REQUESTED, + ArtifactDeletionState.METADATA_TOMBSTONED, + ArtifactDeletionState.ARTIFACT_CLEANUP_PENDING, + ArtifactDeletionState.ARTIFACT_CLEANUP_COMPLETED, + ArtifactDeletionState.ARTIFACT_CLEANUP_FAILED + }; + + assertArrayEquals(expected, ArtifactDeletionState.values()); + for (ArtifactDeletionState state : expected) { + assertSame(state, ArtifactDeletionState.valueOf(state.name())); + } + } +}