Sub-scope 02 (cache-redis) sdk/api/operations + sdk/api + codec — manifest and probes
revision=a24ece9cf797f7ea647e33bf846b115208ed1ba5
generatedAt=2026-08-30T04:36:26+00:00

=== OWNED FILES ===
0c1e382d338cc6b6ec5016cc32482cac03169b45 main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/codec/RedisCodec.java 40
a7758f519e49d233a086aef30786fda7f2ecc95e main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/codec/RedisEnvelope.java 124
e21605da9d3b00dd8be3c15b74b2dcebbca23507 main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/codec/RedisPayloadCodec.java 55
1f866e7fe3f6f5d8ad6513862324ebbe4ef9288c main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/operations/BatchItemResult.java 40
e2192872eca898fff4d2a19cb0aa9e6d2637b3a7 main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/operations/BatchOptions.java 44
a1e883ab72bfcaac017796242c2635342008aa67 main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/operations/BitFieldOverflow.java 16
f12a4a606fb7fc9f3ccaa41a7962c88bc5263647 main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/operations/BitFieldResult.java 19
689778b9279041828b8a673a49fb59f996cd5ad8 main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/operations/BitFieldSubcommand.java 39
67e9bda2645e4e7d0171faefe515af4c238e7e2e main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/operations/BitmapOperation.java 13
03be47f50412c07206162891c315d9fae2ed9293 main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/operations/ClaimResult.java 24
71fc8d423bbf45d091ed6d08d03aacba075f6c41 main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/operations/Distance.java 19
ab0ba26a0922a082fac0961e5c94a17e390fd6e2 main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/operations/DistanceUnit.java 13
86d54200dda39bca4b8b45139484cc487ef39494 main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/operations/Expiration.java 52
6cc615b8a7ca0e8e64d82d919c3f1b0b370757b0 main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/operations/ExpirationCondition.java 15
deaf7ca095a8755765b1bb2ff0916c54c0e53720 main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/operations/ExpirationResult.java 13
c498a64096dc10525ed06f2a36e87a24dd8c016e main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/operations/ExpirationUpdatePolicy.java 13
2cb6fae3faa8e221bd669c85e51346e7f111527f main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/operations/GeoLocation.java 18
5d1a9da41fd5ccd2827ecd3f1a3bad425d0233a2 main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/operations/GeoPoint.java 19
83f51f94dcf9ee4f916d5c251818716e1eae1a1b main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/operations/GeoSearchRequest.java 70
80160d488831986e983c5bf6d84af185bdb50384 main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/operations/GeoSearchResult.java 21
b1766e1e55faf21b26134568077bea32c8ee11c9 main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/operations/KeyedValue.java 22
60ccbd1519a1d7dc8e26ec61f0af6155fb727bfa main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/operations/LexRange.java 44
f9bcb2e08d6a29079445c0bd4698646fd39fc7c5 main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/operations/ListSide.java 9
cae241e0a634da08f36824aecc21c441f3bd95b0 main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/operations/LongRange.java 19
25afb2663a38e76fb32778c2c026f6cb2ad5bfc0 main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/operations/PageRequest.java 29
441f89c8cb54a4bb2cce7f1cb5433b584e45dae4 main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/operations/PendingQuery.java 29
45bbf66732d9df2b92ad83b73980c8fb1bca434a main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/operations/PendingRecord.java 28
de5aae4d334d7a64f55afac1ed395a26a07d0de3 main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/operations/PendingSummary.java 30
2ed22a8b8aefec40e356bc2959fc686a59d05f2f main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/operations/PubSubChannel.java 37
d590fe3eb7c7bb06ab60d624b627faea2035d1ed main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/operations/PubSubPattern.java 42
4d353bad642c41bb2ce8cebe61a39fe85e1cc42f main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/operations/RankRange.java 31
4e96b111f8e2deba565356175bf9ec3f08e2568a main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/operations/RedisBatch.java 34
ad7ab2a0ea5963c9c7ca14051ced71d6a270da84 main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/operations/RedisBatchOperations.java 20
00aaa1b0b8c6997502eb4a31ce730a74682a2dca main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/operations/RedisBatchResult.java 29
17b18b0fc9750b066a1dcc532261151fc992f3bd main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/operations/RedisBitFieldOperations.java 24
32816d6a848db75033b6d558bd9247ec84747543 main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/operations/RedisBitmapOperations.java 72
52175dcb0e04f5d3050aeca1974526dc46ce4622 main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/operations/RedisBlockingListOperations.java 48
4072e5b7115d9678508e61fab635d633061a8a6d main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/operations/RedisBlockingStreamOperations.java 46
5cc4b117d9f8484480566ac5033009e35fbf9291 main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/operations/RedisDataType.java 21
cfd95c09655cc8c3f2ec0092e8b7ebf7d5f4f01d main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/operations/RedisGeoOperations.java 79
fe615872f11d64c225d55d267b084bebfc5a5186 main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/operations/RedisHashFieldExpirationOperations.java 55
7fe471ec8a12184953d8ccf6a269bf4ebe8c5ae2 main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/operations/RedisHashOperations.java 148
2d7d484890ba70218f026fe1a55368c1b287076e main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/operations/RedisHyperLogLogOperations.java 46
d81f526ff12e1a7799890dc22d9627974c7cef6c main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/operations/RedisKeyOperations.java 132
a0abf435e4eb26ca222146547217ce9cc35699db main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/operations/RedisListOperations.java 162
45aea0d20341407769b49891eb31354245b0cbf3 main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/operations/RedisMessageHandler.java 18
2c4129a680d69fd550aa09b1368b5942a84ad9df main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/operations/RedisPubSubOperations.java 44
d84ef21129627cc16262310d37fcb17e83dd8ae0 main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/operations/RedisSetOperations.java 173
7e43982d3236082cf88bf826b24d497898c88e99 main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/operations/RedisShardedPubSubOperations.java 33
48e04ec9fba8fe047265c45ab2ceeebdc7a00d29 main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/operations/RedisSortedSetOperations.java 192
28f00d360f401061dd9834a557e30eb0adae8e80 main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/operations/RedisStreamDeletionOperations.java 41
c4a5e0d3266344078940064939082ef0ee6a55c0 main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/operations/RedisStreamOperations.java 191
cb4bc797fc14616aafb630af6fca2ba33372b44d main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/operations/RedisValueOperations.java 158
13c3f3d6191e95ce3ebe43c79c00f46d42a5f55a main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/operations/RenameMode.java 9
f50eaac4f38cb1b575c72bddd4abc5434a02d58b main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/operations/ScanPage.java 29
650267256e01760177e9579730cf2cb02358874e main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/operations/ScanRequest.java 51
07f608d613e569490f9bc8a18b99b647fe720899 main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/operations/ScoreRange.java 42
02ee394f4f70011f17f2ab5066b8888132fc04d0 main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/operations/ScoredValue.java 20
adc28a89a122a4956fff481f1f29def323b835dc main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/operations/ShardedPubSubChannel.java 36
c3a1dc7fd63fd1d378f7ce36e861060684c28911 main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/operations/SortDirection.java 14
e4555dac3959fe118b3d630f9c587b5ff660de56 main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/operations/SortedSetAddOptions.java 41
0e62dfe7d730c09b7c4578d190145bb9a42a26f8 main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/operations/StreamAppendOptions.java 31
f163ed9eeafe917fb0684be6a01a019dc833fbe1 main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/operations/StreamConsumer.java 15
b9b43695642af1d8641d55025a52c43b5a49d4f2 main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/operations/StreamDeletionOutcome.java 13
02e1d3ba95d787a0b50b7546bcc4a4361115ece4 main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/operations/StreamDeletionPolicy.java 17
bba4693f0d800b4926bf8758cb93d7c3c5e74a46 main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/operations/StreamGroup.java 15
2c77aad383f12f86d9a3f3e170ab1db7e0377a01 main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/operations/StreamId.java 52
fc9deaf06784778a1b757389f140a1c5d096563d main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/operations/StreamRange.java 20
3609da5b49d1732ce808d080b09e2a2215853c82 main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/operations/StreamReadOffset.java 23
0899e0a09a78cc9a1c98514bc79e48e7ebe5d504 main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/operations/StreamRecord.java 21
6ca4b968e723dc6dc766ffd0e522efe7b652df2f main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/operations/StreamTrimPolicy.java 38
e2fe27f13f1b82753d5e4c4432fd49dda5c088eb main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/operations/Subscription.java 27
23471ca9073ec594eeb69209be8e01d859f37ff0 main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/ReactiveRedisOperations.java 108
cad3ac5d248ff91da5abee1211062b9e633cdb34 main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/RedisCapabilities.java 119
ad748aebd21b34f21f5c2b98701a7f734ba155d8 main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/RedisCapability.java 72
85f422294fbfc2a6bb17aefec1f5ffec3ba12893 main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/RedisDeploymentMode.java 43
4674a18cc43a02f8114767981d7bd3b9fa10c3b3 main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/RedisOperations.java 109
bb954b313983a7b66d7f3c4f418a9138724ed1a0 main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/RedisVersion.java 84
e366f5e780b21f0fe0f1dd8c904b133acebeca3f test/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/ApiParityInspector.java 157
dc4dd410aedd1f47db7aaea033f81cdbca1c9f63 test/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/ApiParityReport.java 22
ea4317af86395297e464feb955d2cf3dcc8484bc test/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/ApiParityTest.java 142
9b4ca28e6932f264d838c002af6e0c1261feb221 test/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/RedisCapabilitiesTest.java 64
3280c031162a1aaec32df614ac3f582b49e87990 test/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/RedisVersionTest.java 43

main: 72 + 6
test: 5
=== 8.4 '설계상 부재' 주장 전수 대조 ===
--- KEYS: 'not here and never will be' ---
$ git grep -rn '"KEYS"\|KEYS \|\bkeys()\b' -- 'adapter/outbound/cache-redis/src/main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api' | grep -i 'keys' | head -5
exit=0

$ grep -rn 'KEYS' adapter/outbound/cache-redis/src/main/resources/redis-sdk/redis-command-policy.yml | head -10
3:# Official server metadata (COMMAND DOCS / COMMAND INFO / COMMAND GETKEYSANDFLAGS) decides what a
157:  HKEYS:
885:  KEYS:
1105:  COMMAND GETKEYSANDFLAGS:
1160:  CLUSTER KEYSLOT:
1261:  JSON.OBJKEYS:
exit=0

--- 폐기 명령 이름이 공개 API에 등장하는가 ---
$ git grep -rn 'SETNX\|SETEX\|PSETEX\|ZREVRANGE\|RPOPLPUSH\|BRPOPLPUSH\|GEORADIUS' -- 'adapter/outbound/cache-redis/src/main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api'
adapter/outbound/cache-redis/src/main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/RedisCapability.java:18:  /** Combined hash read/write plus field expiration ({@code HGETEX}/{@code HSETEX}). */
adapter/outbound/cache-redis/src/main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/operations/RedisListOperations.java:13: * <p>{@code RPOPLPUSH} and {@code BRPOPLPUSH} are not exposed; both are expressed through the move
adapter/outbound/cache-redis/src/main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/operations/RedisSortedSetOperations.java:15: * deprecated {@code ZREVRANGE} family never reaches the public API.
adapter/outbound/cache-redis/src/main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/operations/RedisValueOperations.java:12: * <p>Deprecated command names are absent by design. {@code SETNX}, {@code SETEX}, and {@code
adapter/outbound/cache-redis/src/main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/operations/RedisValueOperations.java:13: * PSETEX} are expressed as conditional writes carrying an {@link Expiration}, so a caller cannot
exit=0

--- 구현/정책 계층에는 등장하는가 ---
$ git grep -rln 'SETNX\|SETEX\|PSETEX\|ZREVRANGE\|RPOPLPUSH\|BRPOPLPUSH\|GEORADIUS\|"KEYS"' -- 'adapter/outbound/cache-redis/src/main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/lettuce' 'adapter/outbound/cache-redis/src/main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/raw' 'adapter/outbound/cache-redis/src/main/resources'
adapter/outbound/cache-redis/src/main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/lettuce/operations/HashOperationRequests.java
adapter/outbound/cache-redis/src/main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/lettuce/operations/WritePresence.java
adapter/outbound/cache-redis/src/main/resources/redis-sdk/redis-command-policy.yml
exit=0

=== 8.2 RedisOperations vs ReactiveRedisOperations: method for method ===
$ grep -oE '^  [A-Za-z<>, ?]+ [a-zA-Z]+\(\);' adapter/outbound/cache-redis/src/main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/RedisOperations.java | sed 's/.* //' | sort
batches();
bitFields();
bitmaps();
geo();
hashes();
hyperLogLogs();
keys();
lists();
sets();
sortedSets();
streams();
values();
exit=0

$ grep -oE '^  [A-Za-z<>, ?]+ [a-zA-Z]+\(\);' adapter/outbound/cache-redis/src/main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/ReactiveRedisOperations.java | sed 's/.* //' | sort
batches();
bitFields();
bitmaps();
geo();
hashes();
hyperLogLogs();
keys();
lists();
sets();
sortedSets();
streams();
values();
exit=0

$ diff <(grep -oE '[a-zA-Z]+\(\);' adapter/outbound/cache-redis/src/main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/RedisOperations.java | sort) <(grep -oE '[a-zA-Z]+\(\);' adapter/outbound/cache-redis/src/main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/ReactiveRedisOperations.java | sort)
exit=0

=== 8.2b permit/budget 요구의 형제 비교 (다중 키 · 고비용) ===
$ grep -rn 'MultiKeyPermit\|AdvancedOperationPermit\|OperationBudget\|PersistentKeyPermit' adapter/outbound/cache-redis/src/main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/operations/*.java | sed 's|.*/operations/||' | sort
Expiration.java:13: * that has to be approved by a {@link PersistentKeyPermit} and cannot be reached by omission.
Expiration.java:22:  record Persistent(PersistentKeyPermit permit) implements Expiration {
Expiration.java:3:import dev.caskeleton.adapter.outbound.cache.redis.sdk.api.command.PersistentKeyPermit;
RedisBitFieldOperations.java:23:      OperationBudget budget);
RedisBitFieldOperations.java:3:import dev.caskeleton.adapter.outbound.cache.redis.sdk.api.command.OperationBudget;
RedisBitmapOperations.java:3:import dev.caskeleton.adapter.outbound.cache.redis.sdk.api.command.MultiKeyPermit;
RedisBitmapOperations.java:4:import dev.caskeleton.adapter.outbound.cache.redis.sdk.api.command.OperationBudget;
RedisBitmapOperations.java:70:      MultiKeyPermit permit,
RedisBitmapOperations.java:71:      OperationBudget budget);
RedisBlockingListOperations.java:3:import dev.caskeleton.adapter.outbound.cache.redis.sdk.api.command.MultiKeyPermit;
RedisBlockingListOperations.java:47:      MultiKeyPermit permit);
RedisGeoOperations.java:3:import dev.caskeleton.adapter.outbound.cache.redis.sdk.api.command.MultiKeyPermit;
RedisGeoOperations.java:4:import dev.caskeleton.adapter.outbound.cache.redis.sdk.api.command.OperationBudget;
RedisGeoOperations.java:60:      GeoKey<V> key, GeoSearchRequest<V> request, OperationBudget budget);
RedisGeoOperations.java:77:      MultiKeyPermit permit,
RedisGeoOperations.java:78:      OperationBudget budget);
RedisHashFieldExpirationOperations.java:3:import dev.caskeleton.adapter.outbound.cache.redis.sdk.api.command.PersistentKeyPermit;
RedisHashFieldExpirationOperations.java:54:      HashKey<F, V> key, Collection<F> fields, PersistentKeyPermit permit);
RedisHashOperations.java:147:      HashKey<F, V> key, AdvancedOperationPermit permit, OperationBudget budget);
RedisHashOperations.java:3:import dev.caskeleton.adapter.outbound.cache.redis.sdk.api.command.AdvancedOperationPermit;
RedisHashOperations.java:4:import dev.caskeleton.adapter.outbound.cache.redis.sdk.api.command.OperationBudget;
RedisHyperLogLogOperations.java:33:  long count(Collection<? extends HyperLogLogKey<?>> keys, MultiKeyPermit permit);
RedisHyperLogLogOperations.java:3:import dev.caskeleton.adapter.outbound.cache.redis.sdk.api.command.MultiKeyPermit;
RedisHyperLogLogOperations.java:45:      MultiKeyPermit permit);
RedisKeyOperations.java:107:  boolean persist(QualifiedRedisKey key, PersistentKeyPermit permit);
RedisKeyOperations.java:122:      MultiKeyPermit permit);
RedisKeyOperations.java:131:  ScanPage<QualifiedRedisKey> scan(ScanRequest request, AdvancedOperationPermit permit);
RedisKeyOperations.java:36:  long exists(Collection<QualifiedRedisKey> keys, MultiKeyPermit permit);
RedisKeyOperations.java:3:import dev.caskeleton.adapter.outbound.cache.redis.sdk.api.command.AdvancedOperationPermit;
RedisKeyOperations.java:4:import dev.caskeleton.adapter.outbound.cache.redis.sdk.api.command.MultiKeyPermit;
RedisKeyOperations.java:5:import dev.caskeleton.adapter.outbound.cache.redis.sdk.api.command.PersistentKeyPermit;
RedisKeyOperations.java:61:  long delete(Collection<QualifiedRedisKey> keys, MultiKeyPermit permit);
RedisKeyOperations.java:70:  long unlink(Collection<QualifiedRedisKey> keys, MultiKeyPermit permit);
RedisListOperations.java:147:  <V> List<V> range(ListKey<V> key, long start, long end, OperationBudget budget);
RedisListOperations.java:161:      ListKey<V> source, ListKey<V> destination, ListSide from, ListSide to, MultiKeyPermit permit);
RedisListOperations.java:3:import dev.caskeleton.adapter.outbound.cache.redis.sdk.api.command.MultiKeyPermit;
RedisListOperations.java:4:import dev.caskeleton.adapter.outbound.cache.redis.sdk.api.command.OperationBudget;
RedisSetOperations.java:121:  <V> boolean move(SetKey<V> source, SetKey<V> destination, V value, MultiKeyPermit permit);
RedisSetOperations.java:136:      AdvancedOperationPermit permit,
RedisSetOperations.java:137:      MultiKeyPermit multiKeyPermit,
RedisSetOperations.java:138:      OperationBudget budget);
RedisSetOperations.java:153:      AdvancedOperationPermit permit,
RedisSetOperations.java:154:      MultiKeyPermit multiKeyPermit,
RedisSetOperations.java:155:      OperationBudget budget);
RedisSetOperations.java:170:      AdvancedOperationPermit permit,
RedisSetOperations.java:171:      MultiKeyPermit multiKeyPermit,
RedisSetOperations.java:172:      OperationBudget budget);
RedisSetOperations.java:3:import dev.caskeleton.adapter.outbound.cache.redis.sdk.api.command.AdvancedOperationPermit;
RedisSetOperations.java:4:import dev.caskeleton.adapter.outbound.cache.redis.sdk.api.command.MultiKeyPermit;
RedisSetOperations.java:5:import dev.caskeleton.adapter.outbound.cache.redis.sdk.api.command.OperationBudget;
RedisSortedSetOperations.java:125:      SortedSetKey<V> key, RankRange range, SortDirection direction, OperationBudget budget);
RedisSortedSetOperations.java:143:      OperationBudget budget);
RedisSortedSetOperations.java:161:      OperationBudget budget);
RedisSortedSetOperations.java:3:import dev.caskeleton.adapter.outbound.cache.redis.sdk.api.command.OperationBudget;
RedisValueOperations.java:127:  long append(ValueKey<String> key, String suffix, OperationBudget budget);
RedisValueOperations.java:146:  byte[] getRange(ValueKey<byte[]> key, long start, long end, OperationBudget budget);
RedisValueOperations.java:157:  long setRange(ValueKey<byte[]> key, long offset, byte[] value, OperationBudget budget);
RedisValueOperations.java:35:  <V> List<Optional<V>> multiGet(List<ValueKey<V>> keys, MultiKeyPermit permit);
RedisValueOperations.java:3:import dev.caskeleton.adapter.outbound.cache.redis.sdk.api.command.MultiKeyPermit;
RedisValueOperations.java:4:import dev.caskeleton.adapter.outbound.cache.redis.sdk.api.command.OperationBudget;
exit=0

=== 8.3 렌더 크기 검증의 형제 비교 (channel vs pattern) ===
$ grep -n 'requireRenderedSize\|render()' adapter/outbound/cache-redis/src/main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/operations/PubSubChannel.java adapter/outbound/cache-redis/src/main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/operations/ShardedPubSubChannel.java adapter/outbound/cache-redis/src/main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/operations/PubSubPattern.java
adapter/outbound/cache-redis/src/main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/operations/PubSubChannel.java:34:  public String render() {
adapter/outbound/cache-redis/src/main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/operations/ShardedPubSubChannel.java:33:  public String render() {
adapter/outbound/cache-redis/src/main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/operations/PubSubPattern.java:30:    RedisKeyRules.requireRenderedSize(
adapter/outbound/cache-redis/src/main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/operations/PubSubPattern.java:39:  public String render() {
exit=0

=== 8.1 이 API를 구현하는 타입 ===
$ git grep -ln 'implements RedisValueOperations\|implements RedisHashOperations\|implements RedisKeyOperations\|implements RedisOperations\|implements ReactiveRedisOperations' -- 'adapter/outbound/cache-redis/src'
adapter/outbound/cache-redis/src/main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/lettuce/operations/LettuceRedisHashOperations.java
adapter/outbound/cache-redis/src/main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/lettuce/operations/LettuceRedisKeyOperations.java
adapter/outbound/cache-redis/src/main/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/lettuce/operations/LettuceRedisValueOperations.java
exit=0

=== 8.4b api 루트 test ===
$ git ls-files 'adapter/outbound/cache-redis/src/test/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api' | grep -E "^adapter/outbound/cache-redis/src/test/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api/[^/]+\.java$" | xargs -n1 basename
ApiParityInspector.java
ApiParityReport.java
ApiParityTest.java
RedisCapabilitiesTest.java
RedisVersionTest.java
exit=0

$ git grep -h '  void [a-z]' -- 'adapter/outbound/cache-redis/src/test/java/dev/caskeleton/adapter/outbound/cache/redis/sdk/api' | sed 's/^ *//'
void everySyncOperationHasReactiveCounterpart() {
void everyTypedSurfaceIsInParity() {
void theTwoEntryPointsExposeTheSameStructureAccessors() {
void everyReactiveMethodReturnsAPublisher() {
void theInspectorDetectsADivergentReturnShape() {
void rejectsAServerBelowTheSupportedBaseline() {
void rejectsACapabilityThatCannotExistOnTheProbedVersion() {
void reportsProvenCapabilitiesOnly() {
void aVersionAloneNeverProvesAnExtensionCapability() {
void clusterConstraintsAreExpressedOnTheDeploymentMode() {
void parsesAndOrdersVersions() {
void parsesTwoComponentPolicyProfiles() {
void rejectsNonStrictVersions() {
void comparesAgainstTheSupportedBaseline() {
void rendersCanonicalText() {
void rejectsNonPositiveBudget() {
void boundsElementsAndBytes() {
void rendersClusterSlotTagOnlyInsideBraces() {
void rendersPlainKeyWithoutBraces() {
void taggedKeysShareASlotSourceAndPlainKeysDoNot() {
void rejectsARenderedKeyAboveTheConfiguredSize() {
void rejectsAnUnsupportedMaximumSize() {
void rejectsEmailInIdentifier() {
void rejectsAuthenticationMaterialInIdentifier() {
void rejectsInternationalPhoneNumbersInIdentifier() {
void rejectsSeparatorInjectionInEveryKeyPart() {
void rejectsMalformedNamespaceTokens() {
void acceptsOrdinarySurrogateIdentifiers() {
void rejectsAnIdentifierAboveTheTokenLimit() {
exit=0

