用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/ben-manes/caffeine --skill audit-contract-drift命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
Regenerate the window climber's adversarial trap traces and run the behavioral gate against the real cache in the simulator
Adversarial workload search for eviction-policy regret. Crafts, shrinks, and classifies workloads on which the adaptive window climber fails to close the gap to its achievable optimum, and routes each failure class to the mechanism responsible (controller, policy structure, or recovery layer)
Price each algorithmic step of the window climber by removing it, to find steps that no longer earn their keep and branches that no longer fire
基于 SOC 职业分类
正在显示 SKILL.md
| name | audit-contract-drift |
| description | Find places where documented API contracts and the implementation diverge |
| context | fork |
| agent | auditor |
| disable-model-invocation | true |
Most audits read code; this one reads documentation first and then traces each promise to every implementation path that should honor it. The bugs caught here are not concurrency or arithmetic defects — they are quiet contradictions between what the javadoc promises and what the code does.
Build a list of behavioral promises from public API docs, then trace each one to every code path that should honor it.
Sources of contracts to enumerate:
Caffeine.java — every <b>Note:</b> and <b>Warning:</b> block in a
builder method's javadoc. Pay particular attention to:
weakKeys, weakValues, softValues — equality semantics flip to
identity (==) for the configured strengthexpireAfter*, refreshAfterWrite — duration constraints, what
"expired" means at boundariesmaximumSize, maximumWeight — eviction triggering and amortizationremovalListener, evictionListener — when and how notifications fireCache.java, LoadingCache.java, AsyncCache.java, AsyncLoadingCache.java
— javadoc of every method, especially "must", "will", "guarantees",
"for any reason" language.Policy.java — every method's documented behavior.Weigher.java, Expiry.java, RemovalListener.java, RemovalCause.java
— user-facing contracts referenced by the cache..claude/rules/*.md and in internal-class javadoc across all modules (e.g.
jcache's EventDispatcher requires every publishing thread to drain via
awaitSynchronous/ignoreSynchronous; async operations must register with the
in-flight set). Enumerate each obligation, then verify every call site honors
it — including executor-thread and refresh paths that don't flow through the
obvious entry points.For each contract, record the exact wording, the configurations that activate it, and the set of operations affected.
Then trace each promise through every code path that should honor it:
Cache / LoadingCache / AsyncCacheasMap() view methods (size, isEmpty, containsKey, containsValue,
get, put, remove(k), remove(k,v), replace, compute*, merge,
equals, hashCode)asMap().keySet() / values() / entrySet() — contains, remove,
removeAll, retainAll, removeIf, iterator, spliteratorputAll, getAll, getAllPresent, invalidateAll)AsyncCache.synchronous() round-trip — does the sync view honor the same
contract as the async cache?A path that uses a different equivalence, ordering, or visibility from what the contract promises is a contract drift finding. So is a path that silently downgrades a configuration on round-trip.
Common drift patterns to check explicitly:
weakKeys/weakValues/
softValues promise identity, but view collections that use
o.equals(value) or Collection.contains(value) may apply the user's
equality semantics instead.size, isEmpty,
equals, hashCode, and iterators on the same view.removalListener documented to fire
for any cause, but async paths may drop notifications for null or
exceptional completions.compute(k, (k,v) -> v) is
documented one way but updates timestamps/weight regardless.size() documented as estimate: this is an explicit out — verify it
is actually documented as an estimate everywhere it diverges from logical
presence.synchronous()
view's asMap() may treat in-flight entries inconsistently across query,
mutation, and cardinality methods.Each finding should anchor both sides of the drift — the source of the contract (file + javadoc snippet) and the divergent implementation (file + method) — and include a minimal user-observable scenario where the docs and the code disagree.