How you see it

A hit is a number in usage. Not a feeling.

// OpenAI · a hit
usage: {
  prompt_tokens: 20000,
  prompt_tokens_details: {
    cached_tokens: 19840
  }
}

// Claude · a hit
usage: {
  cache_read_input_tokens: 19840,
  cache_creation_input_tokens: 0,
  input_tokens: 160   // tail after breakpoint
}

HIT

cached_tokens or cache_read_input_tokens greater than zero. That count is the prefix that skipped prefill.

WRITE

cache_creation_input_tokens or cache_write_tokens greater than zero. You paid a small premium to store the prefix.

MISS

Both read fields are zero. Either the prefix changed, it was too short, the TTL expired, or this was the first write.