typed failure(ADR-03):本类产出 {@link CacheResult#failure(CacheOperation, FailureKind, Throwable)} + *
typed failure contract:本类产出 {@link CacheResult#failure(CacheOperation, FailureKind, Throwable)} * — operation/kind 均为 typed 枚举,失败必须可归类、可分流。 */ @Slf4j @@ -106,7 +106,7 @@ static void finalizeFailure( /** - * 统一失败指标上报(ADR-06)— null 表示未装配(测试/registry 缺失 → no-op)。 + * 统一失败指标上报 contract— null 表示未装配(测试/registry 缺失 → no-op)。 * 每个失败事件在此唯一出口上报一次,不重复计数。 */ private final io.github.davidhlp.spring.cache.redis.cache.CacheFailureReporter failureReporter; @@ -160,13 +160,13 @@ private CacheResult handleException( FailureKind failureKind) { CacheResult result = CacheResult.failure(operation, failureKind, e); String operationName = operation == null ? "UNKNOWN" : operation.name(); - // ADR-06:每次失败恰好一次统一指标(operation/kind/strategy 有限枚举 tag) + // Failure-metrics contract:每次失败恰好一次统一指标(operation/kind/strategy 有限枚举 tag) if (failureReporter != null) { failureReporter.report(operation, failureKind, strategy); } return switch (strategy) { case FAIL_FAST -> { - // ADR-06 key 隐私:ERROR 不打印 raw key / 异常 message(可能嵌 key); + // Key-privacy contract:ERROR 不打印 raw key / 异常 message(可能嵌 key); // 完整栈(含 cause message)仅留 DEBUG 供开发诊断 log.error("Cache {} failed: cacheName={}, kind={}, cause={}", operationName, cacheName, failureKind, @@ -176,7 +176,7 @@ private CacheResult handleException( yield result; } case GRACEFUL_DEGRADATION -> { - // key 隐私:WARN 不打印 raw key / exception message(ADR-06) + // Key-privacy contract:WARN 不打印 raw key / exception message log.warn("Cache {} failed, degrading to miss: cacheName={}, kind={}, cause={}", operationName, cacheName, failureKind, e == null ? "null" : e.getClass().getSimpleName()); diff --git a/src/main/java/io/github/davidhlp/spring/cache/redis/cache/CacheFailureReporter.java b/src/main/java/io/github/davidhlp/spring/cache/redis/cache/CacheFailureReporter.java index e35cce87..af1b2111 100644 --- a/src/main/java/io/github/davidhlp/spring/cache/redis/cache/CacheFailureReporter.java +++ b/src/main/java/io/github/davidhlp/spring/cache/redis/cache/CacheFailureReporter.java @@ -13,7 +13,7 @@ import java.util.concurrent.ConcurrentMap; /** - * 内部失败上报单点(ADR-06)— 不进入 public allowlist。 + * 内部失败上报单点— 不进入 public allowlist。 * *
唯一指标 {@code resicache.cache.failure},tag 仅低基数有限枚举: * {@code operation}({@link CacheOperation})、{@code kind}({@link FailureKind})、 @@ -24,7 +24,7 @@ * {@code CacheErrorHandler} 是唯一报告出口;{@code LoaderOrchestrator} 只保留脱敏 WARN * 与 {@code LoadedWithWriteBackFailure},不重复计数。 * - *
边界(ADR-06):本指标只统计缓存操作失败(GET degrade / 写 fail-fast / + *
边界:本指标只统计缓存操作失败(GET degrade / 写 fail-fast / * REMOVE best-effort / write-back failure)。Bloom 过滤器底层 Redis 位操作的 * {@code bloomsift.*} counter 与 fail-open 路径({@code BloomSupport} 吞异常放行 loader) * 不属于本指标 — fail-open 是成功的保护行为而非缓存失败,误报会污染降级告警。 diff --git a/src/main/java/io/github/davidhlp/spring/cache/redis/cache/CacheOperationException.java b/src/main/java/io/github/davidhlp/spring/cache/redis/cache/CacheOperationException.java index 6514d3ad..a2059658 100644 --- a/src/main/java/io/github/davidhlp/spring/cache/redis/cache/CacheOperationException.java +++ b/src/main/java/io/github/davidhlp/spring/cache/redis/cache/CacheOperationException.java @@ -12,10 +12,10 @@ * Typed failure for a cache write operation that cannot be reported as success. * *
调用方可捕获本异常并按 {@link #getOperation()} / {@link #getFailureKind()} / cause - * 分流(ADR-07)。GET 失败有意不翻译为本异常 — 读降级为 miss,诊断留在 + * 分流(typed-exception contract)。GET 失败有意不翻译为本异常 — 读降级为 miss,诊断留在 * {@code CacheResult}。 * - *
Key 隐私(ADR-06):本异常不持有/暴露 raw key;message 也不含 raw key — + *
Key 隐私:本异常不持有/暴露 raw key;message 也不含 raw key — * 仅 operation/kind 与 cacheName(配置级低基数)。调用方如需关联具体请求,用 MDC requestId。 * *
构造限制:构造器 package-private — 仅框架内部(cache writer)可创建;
@@ -41,7 +41,7 @@ public final class CacheOperationException extends RuntimeException {
private static String message(
CacheOperation operation, FailureKind failureKind, String cacheName) {
String kind = failureKind == null ? "UNKNOWN" : failureKind.name();
- // 不含 raw key — ADR-06 key 隐私
+ // 不含 raw key — key-privacy contract
return "Cache " + operation + " failed (" + kind + ") for cacheName=" + cacheName;
}
diff --git a/src/main/java/io/github/davidhlp/spring/cache/redis/cache/ChainEngine.java b/src/main/java/io/github/davidhlp/spring/cache/redis/cache/ChainEngine.java
index b2e70cf3..9910a225 100644
--- a/src/main/java/io/github/davidhlp/spring/cache/redis/cache/ChainEngine.java
+++ b/src/main/java/io/github/davidhlp/spring/cache/redis/cache/ChainEngine.java
@@ -364,7 +364,7 @@ private void runPostProcess(CacheResult mainResult) {
log.debug("Post-processing executed for: {}",
CacheHandlerChain.handlerTag(handler));
} catch (Exception e) {
- // ADR-0001 §15 key 隐私:ERROR 只带 cacheName + 异常类型链,不带 raw key;
+ // Key-privacy contract: ERROR includes cacheName and exception types only;
// 完整栈留 DEBUG(异常 message 可能内嵌 key)。
log.error("Post-processing failed for: {}, operation: {}, cacheName: {}, cause={}",
CacheHandlerChain.handlerTag(handler),
@@ -421,7 +421,7 @@ void finish(String hookName, Object[] scopeTokens, Object result,
}
private void logFailure(ChainObserver observer, String hookName, Exception ex) {
- // ADR-0001 §15:ERROR 只渲染异常类型链(异常 message 可能内嵌 raw key),完整栈留 DEBUG
+ // Key-privacy contract: ERROR renders only exception types;
log.error("Observer {} {} failed: {}",
observer.getClass().getSimpleName(), hookName,
FailureDiagnostics.sanitizedFailure(ex));
diff --git a/src/main/java/io/github/davidhlp/spring/cache/redis/cache/DistributedLockManager.java b/src/main/java/io/github/davidhlp/spring/cache/redis/cache/DistributedLockManager.java
index 2d5d3763..8538ea8f 100644
--- a/src/main/java/io/github/davidhlp/spring/cache/redis/cache/DistributedLockManager.java
+++ b/src/main/java/io/github/davidhlp/spring/cache/redis/cache/DistributedLockManager.java
@@ -64,7 +64,7 @@ public Optional 边界(ADR-0001 §11):线程池 / 去重 / 重试 / 清理调度 / shutdown 仍归
- * {@link ThreadPoolEarlyExpirationExecutor};chain 侧取消仍只经 {@link RefreshCancellation}
- * 单一方法 seam。本模块不新增对外 SPI,只是把「谁拥有提前过期这个概念」讲清楚。
+ * Boundary: thread pool / deduplication / retry / cleanup scheduling /
+ * shutdown remain owned by {@link ThreadPoolEarlyExpirationExecutor}; chain-side
+ * cancellation still goes through the single {@link RefreshCancellation} method seam.
+ * This module only clarifies ownership of the early-expiration concept.
*/
@Slf4j
@Component
@@ -266,7 +267,7 @@ void performAsyncRefresh(String redisKey, String cacheName, CachedValue captured
log.debug("Async early-expiration skipped: value changed: {}", redisKey);
}
} catch (Exception ex) {
- // ADR-0001 §15 key 隐私:ERROR 只带 cacheName + keyFingerprint + 异常类型链 ——
+ // Key-privacy contract: ERROR includes only cacheName + keyFingerprint + exception type chain —
// 异常 message / 栈可能内嵌 raw key(如 Cache.ValueRetrievalException),故不进 ERROR;
// 完整栈留 DEBUG 供诊断。
log.error("Async early-expiration failed: cacheName={}, keyFingerprint={}, cause={}",
diff --git a/src/main/java/io/github/davidhlp/spring/cache/redis/cache/FailureDiagnostics.java b/src/main/java/io/github/davidhlp/spring/cache/redis/cache/FailureDiagnostics.java
index 0c86031e..30d396ae 100644
--- a/src/main/java/io/github/davidhlp/spring/cache/redis/cache/FailureDiagnostics.java
+++ b/src/main/java/io/github/davidhlp/spring/cache/redis/cache/FailureDiagnostics.java
@@ -6,7 +6,7 @@
import org.springframework.lang.Nullable;
/**
- * 失败诊断的 key 隐私 helper(ADR-0001 §15)— 唯一 key 脱敏单点。
+ * 失败诊断的 key 隐私 helper(key-privacy contract)— 唯一 key 脱敏单点。
*
* 契约:WARN/ERROR 与 typed exception message 不得出现 raw key;配置级低基数的
* {@code cacheName} 保留用于关联。当一条诊断既没有 cacheName、又需要与 DEBUG 原始日志关联时,
diff --git a/src/main/java/io/github/davidhlp/spring/cache/redis/cache/LoaderOrchestrator.java b/src/main/java/io/github/davidhlp/spring/cache/redis/cache/LoaderOrchestrator.java
index 130ff26f..65f63a2e 100644
--- a/src/main/java/io/github/davidhlp/spring/cache/redis/cache/LoaderOrchestrator.java
+++ b/src/main/java/io/github/davidhlp/spring/cache/redis/cache/LoaderOrchestrator.java
@@ -98,7 +98,7 @@ public record Loaded {@code value} 仍为 loader 产出的业务值,必须返回给调用方;{@code cause}
* 为写回失败的原始异常,供 caller 记录诊断;若失败来自 writer PUT chain,指标已由
diff --git a/src/main/java/io/github/davidhlp/spring/cache/redis/cache/RedisProCache.java b/src/main/java/io/github/davidhlp/spring/cache/redis/cache/RedisProCache.java
index 051c45c6..819a726e 100644
--- a/src/main/java/io/github/davidhlp/spring/cache/redis/cache/RedisProCache.java
+++ b/src/main/java/io/github/davidhlp/spring/cache/redis/cache/RedisProCache.java
@@ -194,7 +194,7 @@ private Cache.ValueWrapper doubleCheckLookup(Object key) {
*/
RuntimeException translateFailure(Throwable cause, String cacheName) {
if (cause instanceof Cache.ValueRetrievalException vre) {
- // ADR-06 key 隐私:重建 VRE,key 位以 cacheName 代替原始 raw key,
+ // Key-privacy contract:重建 VRE,key 位以 cacheName 代替原始 raw key,
// 保留类型(Spring 抽象层契约)与原始 cause。
return new Cache.ValueRetrievalException(cacheName, null, vre.getCause());
}
diff --git a/src/main/java/io/github/davidhlp/spring/cache/redis/cache/RedisProCacheConfiguration.java b/src/main/java/io/github/davidhlp/spring/cache/redis/cache/RedisProCacheConfiguration.java
index 964bf302..25bd4b59 100644
--- a/src/main/java/io/github/davidhlp/spring/cache/redis/cache/RedisProCacheConfiguration.java
+++ b/src/main/java/io/github/davidhlp/spring/cache/redis/cache/RedisProCacheConfiguration.java
@@ -83,7 +83,7 @@ public MethodMetadataResolver methodMetadataResolver() {
@ConditionalOnMissingBean(CacheErrorHandler.class)
public CacheErrorHandler cacheErrorHandler(ResolvedMetrics resolvedMetrics) {
MeterRegistry registry = resolvedMetrics.meterRegistry();
- // ADR-06:统一失败指标 reporter(registry 缺失 → 内部 no-op)
+ // Failure-metrics contract:统一失败指标 reporter(registry 缺失 → 内部 no-op)
return new CacheErrorHandler(
registry == null ? null
: new io.github.davidhlp.spring.cache.redis.cache.CacheFailureReporter(registry));
diff --git a/src/main/java/io/github/davidhlp/spring/cache/redis/cache/RedisProCacheWriter.java b/src/main/java/io/github/davidhlp/spring/cache/redis/cache/RedisProCacheWriter.java
index d62b298f..7d3ba522 100644
--- a/src/main/java/io/github/davidhlp/spring/cache/redis/cache/RedisProCacheWriter.java
+++ b/src/main/java/io/github/davidhlp/spring/cache/redis/cache/RedisProCacheWriter.java
@@ -81,7 +81,7 @@ public byte[] get(
}
/**
- * Read-through loader 入口 —— availability-first(ADR-0001 §13)。
+ * Read-through loader 入口 —— availability-first read-through contract。
*
* {@code RedisProCache.get(key, loader)} 与本方法都委派
* {@link LoaderOrchestrator#readThrough} 的同一条「读 → 回源 → 写回」协议。
diff --git a/src/main/java/io/github/davidhlp/spring/cache/redis/cache/RefreshRetryPolicy.java b/src/main/java/io/github/davidhlp/spring/cache/redis/cache/RefreshRetryPolicy.java
index 429c8dbb..a5c22268 100644
--- a/src/main/java/io/github/davidhlp/spring/cache/redis/cache/RefreshRetryPolicy.java
+++ b/src/main/java/io/github/davidhlp/spring/cache/redis/cache/RefreshRetryPolicy.java
@@ -47,7 +47,7 @@ public void executeWithRetry(String key, Runnable task) {
return; // 成功,退出
} catch (Exception ex) {
lastException = ex;
- // ADR-0001 §15 key 隐私:WARN/ERROR 只带 keyFingerprint,不带 raw key
+ // Key-privacy contract: WARN/ERROR includes only keyFingerprint, never raw key
log.warn("Async early-expiration failed (attempt {}/{}): keyFingerprint={}, cause={}",
attempt, MAX_RETRY_COUNT, FailureDiagnostics.keyFingerprint(key),
FailureDiagnostics.sanitizedFailure(ex));
diff --git a/src/main/java/io/github/davidhlp/spring/cache/redis/cache/SerializationMigrationEngine.java b/src/main/java/io/github/davidhlp/spring/cache/redis/cache/SerializationMigrationEngine.java
index c506ed89..5fbf8a6a 100644
--- a/src/main/java/io/github/davidhlp/spring/cache/redis/cache/SerializationMigrationEngine.java
+++ b/src/main/java/io/github/davidhlp/spring/cache/redis/cache/SerializationMigrationEngine.java
@@ -130,8 +130,8 @@ private void migrateSource(RedisConnection connection, byte[] key, MutableReport
} catch (Exception ex) {
report.failed++;
record("failed");
- // ADR-0001 §15:WARN 不带 raw key,也不带异常 message(可能内嵌 key);
- // 只留类型链 + 指纹,完整栈在 DEBUG。
+ // Key-privacy contract: WARN omits raw key and exception message (it may contain the key);
+ // only the type chain and fingerprint remain; the full stack stays at DEBUG.
log.warn("[ResiCache] Serialization migration rejected key fingerprint={}, cause={}",
keyFingerprint(key), FailureDiagnostics.sanitizedFailure(ex));
log.debug("[ResiCache] Serialization migration rejection detail", ex);
@@ -327,7 +327,7 @@ private static boolean endsWith(byte[] key, String suffix) {
}
/**
- * key 内容指纹 — 委托 {@link FailureDiagnostics} 的单一实现(ADR-0001 §15),
+ * key 内容指纹 — 委托 {@link FailureDiagnostics} 的单一实现(key-privacy contract),
* 使 migration 路径与锁/刷新路径的指纹形式不再各自漂移。
*/
private static String keyFingerprint(byte[] key) {
diff --git a/src/main/java/io/github/davidhlp/spring/cache/redis/cache/SyncRole.java b/src/main/java/io/github/davidhlp/spring/cache/redis/cache/SyncRole.java
index 56c3c0d5..a487723a 100644
--- a/src/main/java/io/github/davidhlp/spring/cache/redis/cache/SyncRole.java
+++ b/src/main/java/io/github/davidhlp/spring/cache/redis/cache/SyncRole.java
@@ -93,7 +93,7 @@ public T run() {
failure = e;
} catch (final InterruptedException e) {
Thread.currentThread().interrupt();
- // ADR-0001 §15:异常 message 不带 raw key,只带 keyFingerprint
+ // Key-privacy contract: exception message omits raw key and keeps keyFingerprint
failure = new IllegalStateException(
"Thread interrupted while acquiring distributed lock: keyFingerprint="
+ FailureDiagnostics.keyFingerprint(key), e);
@@ -143,7 +143,7 @@ public T run() {
long timeoutSeconds = timeout.seconds();
try {
if (timeoutSeconds <= 0 && !leader.isDone()) {
- // ADR-0001 §15:异常 message 不带 raw key,只带 keyFingerprint
+ // Key-privacy contract: exception message omits raw key and keeps keyFingerprint
throw new IllegalStateException(
"In-flight single-flight loader still running; waitTimeoutSeconds="
+ timeoutSeconds
@@ -261,7 +261,7 @@ static 合法状态模型(ADR-03):本类是不可变 {@code final} 值类型,合法状态由
+ * 合法状态模型:本类是不可变 {@code final} 值类型,合法状态由
* 受控静态工厂 + 嵌套 {@link Outcome} / {@link FailureKind} 枚举表达,非法组合
* (如「失败但没有 kind」「success + failure 字段并存」)在类型层面不可表示:
*
diff --git a/src/test/java/com/example/extension/ExternalCacheOperationExceptionContractTest.java b/src/test/java/com/example/extension/ExternalCacheOperationExceptionContractTest.java
index 393fa51d..98e9b72e 100644
--- a/src/test/java/com/example/extension/ExternalCacheOperationExceptionContractTest.java
+++ b/src/test/java/com/example/extension/ExternalCacheOperationExceptionContractTest.java
@@ -13,13 +13,13 @@
import static org.assertj.core.api.Assertions.assertThatThrownBy;
/**
- * 外部包 typed-exception 契约测试(ADR-07) — 外部扩展方可捕获并按 operation/kind 分流。
+ * 外部包 typed-exception 契约测试 — 外部扩展方可捕获并按 operation/kind 分流。
*
* 从 {@code com.example.extension}(框架根包之外)验证:
* 编译后反射枚举 {@code io.github.davidhlp.spring.cache.redis} 下所有 public 顶层类型,
* 与审定 allowlist({@code src/test/resources/allowlist/public-surface.txt})精确比较。
diff --git a/src/test/java/io/github/davidhlp/spring/cache/redis/cache/BloomFailureLogKeyPrivacyTest.java b/src/test/java/io/github/davidhlp/spring/cache/redis/cache/BloomFailureLogKeyPrivacyTest.java
index dc2cb560..1b14981e 100644
--- a/src/test/java/io/github/davidhlp/spring/cache/redis/cache/BloomFailureLogKeyPrivacyTest.java
+++ b/src/test/java/io/github/davidhlp/spring/cache/redis/cache/BloomFailureLogKeyPrivacyTest.java
@@ -15,7 +15,7 @@
import static org.mockito.Mockito.mock;
/**
- * Bloom 失败日志 key 隐私契约(ADR-06)。
+ * Bloom 失败日志 key 隐私契约。
*
* Bloom add/check/clear 失败时,ERROR 日志不得包含 raw key(测试 key 必须不出现);
* cacheName(配置级低基数)可保留。用 Logback {@link ListAppender} 捕获日志事件断言。
@@ -52,7 +52,7 @@ void bloomSupport_addFailure_logOmitsRawKey() {
.map(ILoggingEvent::getFormattedMessage)
.reduce("", String::concat);
assertThat(allLogs)
- .as("ERROR 日志不得包含 raw key(ADR-06 key 隐私)")
+ .as("ERROR 日志不得包含 raw key(key-privacy contract)")
.doesNotContain(SECRET_KEY);
} finally {
((Logger) LoggerFactory.getLogger(BloomSupport.class.getName())).detachAppender(captured);
@@ -85,7 +85,7 @@ void redisBloomFilter_checkFailure_logOmitsRawKey() {
.map(ILoggingEvent::getFormattedMessage)
.reduce("", String::concat);
assertThat(allLogs)
- .as("ERROR 日志不得包含 raw key(ADR-06 key 隐私)")
+ .as("ERROR 日志不得包含 raw key(key-privacy contract)")
.doesNotContain(SECRET_KEY);
} finally {
((Logger) LoggerFactory.getLogger(RedisBloomIFilter.class.getName())).detachAppender(captured);
diff --git a/src/test/java/io/github/davidhlp/spring/cache/redis/cache/BloomFilterHandlerTest.java b/src/test/java/io/github/davidhlp/spring/cache/redis/cache/BloomFilterHandlerTest.java
index 33d74d6d..820e48a1 100644
--- a/src/test/java/io/github/davidhlp/spring/cache/redis/cache/BloomFilterHandlerTest.java
+++ b/src/test/java/io/github/davidhlp/spring/cache/redis/cache/BloomFilterHandlerTest.java
@@ -23,7 +23,7 @@
import static org.mockito.Mockito.when;
/**
- * BloomFilterHandler 单元测试 — marker-free 语义(ADR-01)。
+ * BloomFilterHandler 单元测试 — marker-free 语义。
*
* 锁定契约:
* ADR-01 删除 rebuilding marker/window 后,任何 Bloom 操作都不得读写
- * {@code *rebuild*} marker 键空间。flushDb 后该 keyspace 必须始终为空。
+ * Marker-free Bloom semantics: after removing the rebuilding marker/window,
+ * Bloom operations must never read or write the {@code *rebuild*} marker keyspace.
*/
private void assertNoRebuildMarkerKeys() {
assertThat(redisTemplate.keys("*rebuild*")).isEmpty();
@@ -205,7 +205,7 @@ void falsePositiveRateWithinBounds() {
}
@Nested
- @DisplayName("Marker-free Bloom semantics (ADR-01)")
+ @DisplayName("Marker-free Bloom semantics")
class MarkerFreeSemanticsTests {
@Test
diff --git a/src/test/java/io/github/davidhlp/spring/cache/redis/cache/CacheErrorHandlerTest.java b/src/test/java/io/github/davidhlp/spring/cache/redis/cache/CacheErrorHandlerTest.java
index bd942f2a..10cee3bb 100644
--- a/src/test/java/io/github/davidhlp/spring/cache/redis/cache/CacheErrorHandlerTest.java
+++ b/src/test/java/io/github/davidhlp/spring/cache/redis/cache/CacheErrorHandlerTest.java
@@ -320,11 +320,11 @@ void finalizeFailure_remove_doesNotThrow() {
@Nested
- @DisplayName("ADR-06 count-once failure metric")
+ @DisplayName("count-once failure metric")
class FailureMetricTests {
@Test
- @DisplayName("cache-path WARN/ERROR 日志不含 raw key / exception message(ADR-06)")
+ @DisplayName("cache-path WARN/ERROR 日志不含 raw key / exception message")
void cachePathLogs_omitRawKeyAndCauseMessage() {
String secretKey = "secret-cache-key-77";
ch.qos.logback.classic.Logger logger =
diff --git a/src/test/java/io/github/davidhlp/spring/cache/redis/cache/CacheFailureReporterTest.java b/src/test/java/io/github/davidhlp/spring/cache/redis/cache/CacheFailureReporterTest.java
index ad2848c5..40fd413e 100644
--- a/src/test/java/io/github/davidhlp/spring/cache/redis/cache/CacheFailureReporterTest.java
+++ b/src/test/java/io/github/davidhlp/spring/cache/redis/cache/CacheFailureReporterTest.java
@@ -17,7 +17,7 @@
import static org.assertj.core.api.Assertions.assertThat;
/**
- * CacheFailureReporter 单元测试(ADR-06)。
+ * CacheFailureReporter 单元测试。
*
* 锁定契约:
* 契约:WARN/ERROR 日志与 typed exception message 不得出现 raw key;
* 配置级低基数的 {@code cacheName} 或 {@link FailureDiagnostics#keyFingerprint} 关联令牌可保留。
@@ -47,7 +47,7 @@
* 本测试覆盖此前直接打印 raw key 的路径:分布式锁获取/释放、single-flight 角色失败、
* 异步提前过期重试、链后置处理。每条路径用 logback {@link ListAppender} 捕获实际日志事件断言。
*/
-@DisplayName("Failure Log Key Privacy Tests (ADR-0001 §15)")
+@DisplayName("Failure Log Key Privacy Tests (key-privacy contract)")
class FailureLogKeyPrivacyTest {
/** 必须不出现的原始 key(测试专用哨兵值)。 */
@@ -118,7 +118,7 @@ private void assertErrorSites(ListAppender 两条 loader 路径(sync / 非 sync)共用 {@code LoaderOrchestrator} 内的同一协议,
* 因此非 sync 路径也必须:走带 metrics 的 {@code put} 写回、缓存命中不调 loader、
@@ -246,7 +246,7 @@ void nonSyncWriteBackFailure_returnsLoaderValueWithRedactedWarning() {
String value = cache.get(SENTINEL_KEY, () -> "business-value");
assertThat(value)
- .as("availability-first:写回失败不得覆盖已加载值(ADR-02)")
+ .as("availability-first:写回失败不得覆盖已加载值")
.isEqualTo("business-value");
String warnText = captured.list.stream()
@@ -255,7 +255,7 @@ void nonSyncWriteBackFailure_returnsLoaderValueWithRedactedWarning() {
assertThat(warnText)
.as("写回失败必须可观测")
.contains("write-back failed")
- .as("ADR-0001 §15:WARN 不带 raw key")
+ .as("key-privacy contract: WARN 不带 raw key")
.doesNotContain(SENTINEL_KEY);
} finally {
logger.detachAppender(captured);
diff --git a/src/test/java/io/github/davidhlp/spring/cache/redis/cache/TestCacheService.java b/src/test/java/io/github/davidhlp/spring/cache/redis/cache/TestCacheService.java
index 56d2ce18..4d6829c6 100644
--- a/src/test/java/io/github/davidhlp/spring/cache/redis/cache/TestCacheService.java
+++ b/src/test/java/io/github/davidhlp/spring/cache/redis/cache/TestCacheService.java
@@ -64,7 +64,7 @@ public void evictAll() {
}
/**
- * CLEAN(allEntries) + useBloomFilter —— ADR-01 场景契约。
+ * CLEAN(allEntries) + useBloomFilter —— 场景契约。
*
* 与普通 CLEAN 相同(注解使用方仍需显式开启 bloom 才会触发
* {@code BloomFilterHandler});本方法用于验证 CLEAN 即便启用 bloom
diff --git a/src/test/java/io/github/davidhlp/spring/cache/redis/chain/CacheResultTest.java b/src/test/java/io/github/davidhlp/spring/cache/redis/chain/CacheResultTest.java
index 5ee64a43..b61629a1 100644
--- a/src/test/java/io/github/davidhlp/spring/cache/redis/chain/CacheResultTest.java
+++ b/src/test/java/io/github/davidhlp/spring/cache/redis/chain/CacheResultTest.java
@@ -9,7 +9,7 @@
import static org.assertj.core.api.Assertions.assertThat;
/**
- * CacheResult 单元测试 — 合法状态模型(ADR-03)。
+ * CacheResult 单元测试 — 合法状态模型。
*
* 锁定契约:
*
*
*/
diff --git a/src/test/java/io/github/davidhlp/spring/cache/redis/PublicSurfaceContractTest.java b/src/test/java/io/github/davidhlp/spring/cache/redis/PublicSurfaceContractTest.java
index 8213dd39..af6dc981 100644
--- a/src/test/java/io/github/davidhlp/spring/cache/redis/PublicSurfaceContractTest.java
+++ b/src/test/java/io/github/davidhlp/spring/cache/redis/PublicSurfaceContractTest.java
@@ -26,7 +26,7 @@
import static org.assertj.core.api.Assertions.fail;
/**
- * Public-surface allowlist Gate(ADR-04)。
+ * Public-surface allowlist Gate。
*
*
@@ -300,7 +300,7 @@ void afterChainExecution_nullResult_doesNothing() {
}
@Nested
- @DisplayName("CLEAN→GET scenarios (ADR-01)")
+ @DisplayName("CLEAN→GET scenarios (marker-free)")
class CleanGetScenarios {
/**
diff --git a/src/test/java/io/github/davidhlp/spring/cache/redis/cache/BloomFilterIntegrationTest.java b/src/test/java/io/github/davidhlp/spring/cache/redis/cache/BloomFilterIntegrationTest.java
index b06bba5f..45738026 100644
--- a/src/test/java/io/github/davidhlp/spring/cache/redis/cache/BloomFilterIntegrationTest.java
+++ b/src/test/java/io/github/davidhlp/spring/cache/redis/cache/BloomFilterIntegrationTest.java
@@ -43,8 +43,8 @@ void setUp() {
/**
* 断言 Redis 中不存在任何 rebuilding marker 键(无 marker I/O 架构约束)。
*
- *
diff --git a/src/test/java/io/github/davidhlp/spring/cache/redis/cache/FailureLogKeyPrivacyTest.java b/src/test/java/io/github/davidhlp/spring/cache/redis/cache/FailureLogKeyPrivacyTest.java
index 7d64b679..17b835d8 100644
--- a/src/test/java/io/github/davidhlp/spring/cache/redis/cache/FailureLogKeyPrivacyTest.java
+++ b/src/test/java/io/github/davidhlp/spring/cache/redis/cache/FailureLogKeyPrivacyTest.java
@@ -39,7 +39,7 @@
import static org.mockito.Mockito.when;
/**
- * 失败诊断 key 隐私回归(ADR-0001 §15)。
+ * 失败诊断 key 隐私回归(key-privacy contract)。
*
*