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>
275 lines
21 KiB
Plaintext
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
|
|
|