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: *

{@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: *

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 key, GeoSearchRequest 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 key, Collection fields, PersistentKeyPermit permit); RedisHashOperations.java:147: HashKey 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> 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 scan(ScanRequest request, AdvancedOperationPermit permit); RedisKeyOperations.java:36: long exists(Collection 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 keys, MultiKeyPermit permit); RedisKeyOperations.java:70: long unlink(Collection keys, MultiKeyPermit permit); RedisListOperations.java:147: List range(ListKey key, long start, long end, OperationBudget budget); RedisListOperations.java:161: ListKey source, ListKey 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: boolean move(SetKey source, SetKey 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 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 key, String suffix, OperationBudget budget); RedisValueOperations.java:146: byte[] getRange(ValueKey key, long start, long end, OperationBudget budget); RedisValueOperations.java:157: long setRange(ValueKey key, long offset, byte[] value, OperationBudget budget); RedisValueOperations.java:35: List> multiGet(List> 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