Sub-scope 03 (objectstorage) kernel/** + codec/** - operation kernel, state machines, key codecs revision=a24ece9cf797f7ea647e33bf846b115208ed1ba5 generatedAt=2026-08-30T02:44:26+00:00 === OWNED FILES === c3501c608256b2d613a796ba1780473277462f1d kernel/DirectGrantSessionState.java 13 e0ab04a08511e31886371e8313e88af67570e9d5 kernel/KernelValueSupport.java 13 f655f016d5fee108d6db7ddacaa3ef4ba7b5eb54 kernel/MultipartUploadState.java 15 080de5e2e3ae3b4b2327551097df6b4bc41cec8b kernel/ObjectBindingRevision.java 13 03f1b0b50d72ce86f2207cc1fb29b745e5407543 kernel/ObjectEffectCertainty.java 9 d2c91ffed9395a8b2bf34324a03eb633cbfef8ab kernel/ObjectIntegrityVerificationService.java 24 2a97c1225f2bae8e1f7735a8414bbbc2a8fc7378 kernel/ObjectOperationEpochRecord.java 150 f4eb50d4c63111337ce61990dd8b17e929692471 kernel/ObjectOperationEpochState.java 10 e07d3437a0b8dbd0deb0abaa665c9f08b2d06320 kernel/ObjectOperationKernel.java 127 5b1a0bd818ed389b2253c80a8d41d9d30b6cd739 kernel/ObjectOperationKernelResult.java 20 e3dde3130a6ee9f07160222bf8b10999b15523b3 kernel/ObjectOperationResolutionService.java 48 9056501607f36fb98502d43faa0b94b3f1056867 kernel/ObjectOperationStateMachine.java 142 fdec949b9932020139db1f0a3232ad71183b0763 kernel/ObjectPolicyRevision.java 13 d3e8ae64c16d525affe64bb9d0643ba908f1d470 kernel/ObjectPolicySnapshot.java 46 5601b9a4b0af344140c0fa90d4346299f703ed71 kernel/ObjectPublicationHandoffService.java 171 42aee3cf15f368fd0ef1fde98501ba266ffb73ff kernel/ObjectReferencePublicationService.java 93 9cb624211f262dc79d5ba5666d1c29961c749643 kernel/ObjectRouteToken.java 15 41e544e2ef167045f8e6fcae21baa58d5915f38a kernel/ObjectScanVerdictPolicy.java 25 18d7784220dd0c69dfa3a8d46b3afdadd3c840f0 kernel/PendingObjectEffect.java 55 cce69c84728e4792a69838549a04ca6b7bc89ee9 kernel/PublicationOperationState.java 25 3634318c775848339ebd6245fc56b794df901413 kernel/PublishedReferenceState.java 10 0f91e0901a8525b28083dfad3d5601283a108ef3 kernel/ScanOperationState.java 10 154068770157574dabe54145527b32b5e05039dd kernel/StagedObjectPublicationKernel.java 416 f4e47e0f5da2dec0ae6bfed2d06dbf394e89ae52 codec/CrockfordBase32.java 57 e9e12e86008c7244f215a8c60f51b9430470dc98 codec/ObjectControlKeyCodec.java 172 2ebb7dfd85eb8c3c98a0900e4773b367787aff1c codec/ObjectDataKeyCodec.java 43 f35a1fb4b2cd680f8d9ccb2075ea989f3c4ecfcb codec/ObjectHandleCodec.java 69 67067d538132afbf7a9695ead59d006a926fcfc4 codec/ObjectPolicySnapshotCodec.java 42 0e6077e8b7c575644e6e89aaa255f9f4f5f70a3a codec/ObjectReferenceCodec.java 24 3704a0a2a08ad0e7b7b0a67e4746206f3f9f631c codec/ObjectRequestFingerprintCodec.java 132 a690e9099fd931e6fecdb1ea8cacece7cf8fc532 test/kernel/ObjectMutationResponseLossTest.java 130 f553a33ce3bfbbf74b8c2c2ad894d687bc2abd21 test/kernel/ObjectOperationEpochTest.java 79 1624b66f798f2cb61bb2deb6a12441ea630315c2 test/kernel/ObjectOperationKernelTest.java 124 85a81a906794630495322223e10d2bdd233289f5 test/kernel/ObjectOperationStateMachineTest.java 71 f24f217938ed948bc112b1dfcb62477db7549d92 test/kernel/ObjectPublicationHandoffRaceTest.java 48 c9ce5db4a5d943cb3123e14442741c374e5353ce test/kernel/ObjectScanVerdictFenceTest.java 67 5ff36c72334c2a8c6ab3f2047e7e0b97e93f8e3a test/kernel/StagedObjectPublicationKernelTest.java 24 605fc6f92ba48381d884dc0d61110940563fd66e test/codec/ObjectNamespaceCodecTest.java 116 cdfd6c8d5ca143cf304f7229d65435dee26c19d7 test/codec/ObjectRequestFingerprintCodecTest.java 177 === 8.1 reachability === $ git grep -rln 'objectstorage.kernel\|objectstorage.codec' -- . | grep -v "^adapter/outbound/objectstorage/" exit=1 === 8.2 five closed transition tables; are terminals really terminal? === $ grep -n 'current.terminal()\|currentTerminal' -B 2 -A 2 adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/kernel/ObjectOperationStateMachine.java | head -30 10- public static PublicationOperationState advancePublication( 11- PublicationOperationState current, PublicationOperationState next) { 12: if (current.terminal()) { 13- throw invalid(); 14- } -- 65- public static DirectGrantSessionState advanceDirectGrant( 66- DirectGrantSessionState current, DirectGrantSessionState next) { 67: boolean currentTerminal = 68- Set.of( 69- DirectGrantSessionState.DATA_UPLOADED, -- 79- .contains(next); 80- boolean allowed = 81: !currentTerminal 82- && (branch 83- || switch (current) { -- 95- public static MultipartUploadState advanceMultipart( 96- MultipartUploadState current, MultipartUploadState next) { 97: boolean currentTerminal = 98- Set.of( 99- MultipartUploadState.COMPLETED, -- 111- .contains(next); 112- boolean allowed = 113: !currentTerminal 114- && (branch 115- || switch (current) { exit=0 $ grep -n 'case CLEAN, MALICIOUS -> false\|case PURGED -> false\|default -> false' adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/kernel/ObjectOperationStateMachine.java 30: default -> false; 47: case CLEAN, MALICIOUS -> false; 60: case PURGED -> false; 90: default -> false; 120: default -> false; exit=0 $ grep -n 'requireNextRevision' -A 6 adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/kernel/ObjectOperationStateMachine.java 125: public static long requireNextRevision(long current, long next) { 126- if (current < 0 || next != current + 1) { 127- throw invalid(); 128- } 129- return next; 130- } 131- exit=0 === 8.2b pending effect: persist intent before mutating, confirm after === $ grep -n 'markEffectSent\|confirmEffect\|markResponseLost' -A 4 adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/kernel/ObjectOperationKernel.java 84: public ObjectOperationRecord markEffectSent( 85- ObjectOperationRecord current, PendingObjectEffect effect) { 86- return replace(current, current.withPendingEffect(effect, current.updatedAt())); 87- } 88- 89: public ObjectOperationRecord markResponseLost(ObjectOperationRecord current) { 90- return replace( 91- current, 92- current.withEffectCertainty(ObjectEffectCertainty.INDETERMINATE, current.updatedAt())); 93- } -- 95: public ObjectOperationRecord confirmEffect(ObjectOperationRecord current, Instant now) { 96- return replace(current, current.withEffectCertainty(ObjectEffectCertainty.CONFIRMED, now)); 97- } 98- 99- public ObjectOperationRecord advancePublication( exit=0 $ grep -n 'operation.pendingEffect() == null' -B 2 -A 12 adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/kernel/StagedObjectPublicationKernel.java 102- runtime.providerBinding().chunkBytes(), 103- runtime.providerBinding().maximumObjectBytes()); 104: if (operation.pendingEffect() == null) { 105- operation = 106- operations.markEffectSent( 107- operation, 108- new PendingObjectEffect( 109- PendingObjectEffect.Kind.DATA_PUT, 110- request.operationKey().operationId().value(), 111- sha256Hex(dataKey), 112- PublicationOperationState.DATA_UPLOADED.name(), 113- "create-if-absent", 114- fingerprint)); 115- } 116- ObjectStorageProvider.StoredData stored = resolveOrCreate(providerOperation, producer); exit=0 $ grep -n 'private ObjectOperationRecord replace' -A 16 adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/kernel/ObjectOperationKernel.java 112: private ObjectOperationRecord replace( 113- ObjectOperationRecord expected, ObjectOperationRecord replacement) { 114- String key = ObjectControlKeyCodec.operation(expected.route(), expected.operationKey()); 115- ObjectControlStore.StoredControlRecord stored = 116- controlStore 117- .read(key) 118- .orElseThrow(() -> new ObjectControlConflictException("operation record is absent")); 119- if (!stored.record().equals(expected)) { 120- throw new ObjectControlConflictException("operation record is stale"); 121- } 122- return (ObjectOperationRecord) 123- controlStore 124- .compareAndSet(key, new ObjectControlMutation(stored.version(), replacement)) 125- .record(); 126- } 127-} exit=0 === 8.2c reserve: replay classification by fingerprint === $ grep -n 'Decision.CONFLICT\|Decision.REPLAY_TERMINAL\|Decision.REPLAY_NON_TERMINAL\|Decision.RESERVED' adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/kernel/ObjectOperationKernel.java adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/kernel/ObjectOperationKernelResult.java adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/kernel/ObjectOperationKernel.java:59: ObjectOperationKernelResult.Decision.RESERVED, adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/kernel/ObjectOperationKernel.java:74: ObjectOperationKernelResult.Decision.CONFLICT, existing); adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/kernel/ObjectOperationKernel.java:78: ? ObjectOperationKernelResult.Decision.REPLAY_TERMINAL adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/kernel/ObjectOperationKernel.java:79: : ObjectOperationKernelResult.Decision.REPLAY_NON_TERMINAL, exit=0 === 8.2d markEffectSent / markResponseLost keep the old updatedAt === $ grep -n 'current.updatedAt()' adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/kernel/ObjectOperationKernel.java 86: return replace(current, current.withPendingEffect(effect, current.updatedAt())); 92: current.withEffectCertainty(ObjectEffectCertainty.INDETERMINATE, current.updatedAt())); exit=0 === 8.3 sole key encoders and cross-route protection === $ grep -n 'requireMatchingRoute' -A 6 adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/codec/ObjectControlKeyCodec.java | head -14 31: requireMatchingRoute(route, reference.canonicalText()); 32- return prefix("references", route) 33- + "/" 34- + CrockfordBase32.shard(referenceToken(reference)) 35- + "/" 36- + reference.canonicalText(); 37- } -- 58: requireMatchingRoute(route, sessionId.canonicalText()); 59- return prefix("multipart", route) 60- + "/" 61- + CrockfordBase32.shard(referenceToken(sessionId.canonicalText())) 62- + "/" 63- + sessionId.canonicalText(); exit=0 $ git grep -rn '"control/v1/\|"data/v1/' -- 'adapter/outbound/objectstorage/src/main' adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/codec/ObjectControlKeyCodec.java:121: return "control/v1/" + family + "/" + route.canonicalText(); adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/codec/ObjectDataKeyCodec.java:16: return "data/v1/" adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/control/ObjectDirectMultipartSessionRecord.java:40: || !canonicalDataKey.startsWith("data/v1/")) { adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/control/ObjectStagedObjectRecord.java:42: || !canonicalDataKey.startsWith("data/v1/")) { adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/direct/DirectGrantProvider.java:78: || !canonicalDataKey.startsWith("data/v1/")) { adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/direct/DirectTransferSessionRecord.java:47: || !canonicalDataKey.startsWith("data/v1/")) { adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/filesystem/LocalObjectPathGuard.java:122: || !key.startsWith("control/v1/") adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/provider/ObjectStorageProviderOperation.java:40: "data/v1/[0-9abcdefghjkmnpqrstvwxyz]{12}/[0-9a-f]{2}/" adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3ConditionalObjectControlStore.java:162: || !key.matches("control/v1/[a-z-]+/[a-zA-Z0-9._/-]+") exit=0 $ grep -n 'Sole encoder' adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/codec/*.java adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/codec/ObjectControlKeyCodec.java:13:/** Sole encoder for bounded object-storage control namespaces. */ adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/codec/ObjectDataKeyCodec.java:7:/** Sole encoder for immutable provider data keys. */ exit=0 === 8.3b Crockford Base32: canonical alphabet and overflow check === $ grep -n 'ALPHABET\|value.signum() != 0' -B 2 -A 3 adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/codec/CrockfordBase32.java 10-public final class CrockfordBase32 { 11- 12: private static final String ALPHABET = "0123456789abcdefghjkmnpqrstvwxyz"; 13- 14- private CrockfordBase32() {} 15- -- 21- char[] result = new char[outputLength]; 22- for (int index = outputLength - 1; index >= 0; index--) { 23: result[index] = ALPHABET.charAt(value.and(BigInteger.valueOf(31)).intValue()); 24- value = value.shiftRight(5); 25- } 26: if (value.signum() != 0) { 27- throw new IllegalArgumentException("base32 output length is too small"); 28- } 29- return new String(result); exit=0 === 8.4 test coverage of the kernel and codecs === $ grep -nE '@Test| void ' adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/kernel/*.java | head -40 adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/kernel/ObjectMutationResponseLossTest.java:29: @Test adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/kernel/ObjectMutationResponseLossTest.java:30: void everyPendingMutationIsResolvedOnceWithoutBlindMutationReplay() { adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/kernel/ObjectOperationEpochTest.java:18: @Test adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/kernel/ObjectOperationEpochTest.java:19: void epochMovesOnlyThroughTheFrozenTransitionChain() { adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/kernel/ObjectOperationEpochTest.java:39: @Test adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/kernel/ObjectOperationEpochTest.java:40: void invalidTransitionsSealConditionsAndEarlyCompactionFailClosed() { adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/kernel/ObjectOperationEpochTest.java:52: @Test adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/kernel/ObjectOperationEpochTest.java:53: void issuedEpochTokensCannotBeReused() { adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/kernel/ObjectOperationKernelTest.java:47: @Test adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/kernel/ObjectOperationKernelTest.java:48: void reserveReplaysSameFingerprintAndConflictsOnDifferentIntent() { adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/kernel/ObjectOperationKernelTest.java:65: @Test adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/kernel/ObjectOperationKernelTest.java:66: void pendingEffectIsDurableBeforeIoAndResponseLossRemainsPhaseSpecific() { adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/kernel/ObjectOperationStateMachineTest.java:10: @Test adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/kernel/ObjectOperationStateMachineTest.java:11: void publicationFollowsScanFreeAndScanRequiredPaths() { adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/kernel/ObjectOperationStateMachineTest.java:34: @Test adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/kernel/ObjectOperationStateMachineTest.java:35: void terminalOutOfOrderAndStaleRevisionTransitionsFailClosed() { adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/kernel/ObjectOperationStateMachineTest.java:51: @Test adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/kernel/ObjectOperationStateMachineTest.java:52: void independentStateFamiliesDoNotImplyEachOther() { adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/kernel/ObjectPublicationHandoffRaceTest.java:23: @Test adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/kernel/ObjectPublicationHandoffRaceTest.java:24: void expiredClaimTakeoverRaisesTheFenceAndRejectsTheStaleWorker() { adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/kernel/ObjectScanVerdictFenceTest.java:28: @Test adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/kernel/ObjectScanVerdictFenceTest.java:29: void duplicateExactVerdictReplaysButDifferentScannerEvidenceConflicts() { adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/kernel/StagedObjectPublicationKernelTest.java:11: @Test adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/kernel/StagedObjectPublicationKernelTest.java:12: void scanRequiredPublicationCannotFinalizeWithoutAnExactCleanVerdict() { exit=0 $ grep -nE '@Test| void ' adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/codec/*.java | head -20 adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/codec/ObjectNamespaceCodecTest.java:26: @Test adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/codec/ObjectNamespaceCodecTest.java:27: void dataAndControlKeysHaveFrozenCanonicalGrammars() { adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/codec/ObjectNamespaceCodecTest.java:60: @Test adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/codec/ObjectNamespaceCodecTest.java:61: void referenceAndHandleFamiliesRemainSeparated() { adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/codec/ObjectNamespaceCodecTest.java:79: @Test adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/codec/ObjectNamespaceCodecTest.java:80: void dataKeyApiHasNoRawNameStringParameter() { adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/codec/ObjectNamespaceCodecTest.java:92: void routeParserRejectsArbitraryNonCanonicalText(@ForAll String candidate) { adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/codec/ObjectNamespaceCodecTest.java:98: @Test adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/codec/ObjectNamespaceCodecTest.java:99: void namespaceRejectsAliasesAndTraversalInputs() { adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/codec/ObjectRequestFingerprintCodecTest.java:27: @Test adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/codec/ObjectRequestFingerprintCodecTest.java:28: void canonicalIntentHasAFrozenGoldenVector() { adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/codec/ObjectRequestFingerprintCodecTest.java:53: @Test adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/codec/ObjectRequestFingerprintCodecTest.java:54: void sameIntentIsStableAndEverySemanticChangeChangesTheFingerprint() { adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/codec/ObjectRequestFingerprintCodecTest.java:78: @Test adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/codec/ObjectRequestFingerprintCodecTest.java:79: void absenceEmptyOverflowAndR1MarkerAreExplicit() { adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/codec/ObjectRequestFingerprintCodecTest.java:122: @Test adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/codec/ObjectRequestFingerprintCodecTest.java:123: void policySnapshotCodecIsCanonicalAndContainsNoCredentialSurface() { exit=0