Caching matches from the very beginning
Prompt caching is a prefix cache. The match must start at the first character and run contiguously, so a single variable token near the top invalidates everything after it.
This is overwhelmingly the reason teams conclude that caching does not work for them. The feature is enabled, the prompt looks stable, and a request id on line two means nothing is ever reused.
The order that works
System prompt, then tool definitions, then stable reference documents, then conversation history, then the current user input. Everything fixed by construction goes first; everything that varies per request goes last.
If you genuinely need the current date in the prompt, put it immediately before the user input rather than in the system prompt — or round it to the day, so it invalidates the cache once every twenty-four hours instead of on every call.