Files
DongHyeonkaandClaude Opus 5 b2963105a8 docs(keycloak-session-store): import the session-storage lab as a new project
The keycloak project ended with four open questions that design could not
settle. A two-VM lab was built to answer them by measurement, and this is
that material: 26 experiments, 125 raw command outputs, 22 browser captures.

Follows the import procedure in README.md.

  source/     the originating repository verbatim — 78 documents, 28 SVGs,
              8 manifests, plus .source-revision recording the commit
  final/      the SSOT
    document.md   729 lines written from the 29 experiment documents, not
                  concatenated: what was predicted, what was measured, and
                  where the measurement itself was wrong
    evidence/raw    125 outputs, flattened to <experiment>__<file> because
                    the originals collided (01-baseline.txt appeared three
                    times) and the audit only globs the top level
    evidence/meta   one per raw file; command and exitCode are null and the
                    README says why rather than inventing them
    evidence/browser  22 captures
    assets/       three diagrams through techviz
    .techviz/     their VizSpecs

A separate project rather than an addition to keycloak: the B-layer answers
that project's four questions, but the A, C and D layers are about cluster
failure, SSO and operations, and one document.md should hold one subject.
The four question records there can point here through 관계.

Recorded rather than papered over: only three of the 28 diagrams were
remade. The repository forbids hand-drawn SVG and forbids titles inside the
canvas; all 28 originals carry both, so converting them is redrawing, not
reformatting. They stay in source/ and the gap is written into the document.

verify-pipeline.py passes. audit-records.py reports no issues.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-04 22:51:59 +09:00

275 lines
21 KiB
Plaintext

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