A contract test answers one question: does the provider still return the response this consumer relies on? The narrow scope is the point. Contract tests touch only the interface layer, run in milliseconds, and stay deterministic because they carry no dependencies (Total Shift Left). That narrowness is also the blind spot. A read-through cache sits between the service and its store, and the service's response is assembled either from the store or from the cache. Both paths go through the same serialization code, so both look structurally identical to a schema check.
Read-through means the application always reads from the cache first, and the cache itself loads missing data from the backend on a miss (ITU Online). The application code no longer contains the cache-fill logic, which is the pattern's main benefit and the reason a contract test cannot see it. When the contract was written against the no-cache behavior, it captured the store's fields. The cache path adds fields or, worse, serves an older version of the same fields.
The general lesson predates caches. Adam Wathan's screencast on contract tests exists because test doubles drift from real implementations: the double's API falls out of sync, interfaces give a false sense of security, and tests make better contracts than interfaces (Adam Wathan). A read-through cache is a test double you shipped.



