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

