The 1-hour cache you already have, and the one that would cost more
Issue #3876. CC 2.1.243 added promptCacheTtl and subagentPromptCacheTtl. The Fable 5.1 divergence review ranked "both unset" as the top cost exposure and asked for a measurement of idle gaps before any policy. This is that measurement.
What the usage payload already says
Every assistant turn carries usage.cache_creation.ephemeral_5m_input_tokens and ephemeral_1h_input_tokens, so the TTL each write used is observable from any transcript. 14 days, one workstation, 1,657 main and 1,972 subagent transcripts, 170,367 turns.
| kind | turns | writes on 1h TTL | turns after a 5 to 60 min gap | write tokens in those turns | share of all writes |
|---|---|---|---|---|---|
| main sessions | 92,053 | 94% (no setting present) | 1,860 (2.0%) | 87.1 MTok | 7.6% |
| subagents | 78,314 | 0.01% | 161 (0.2%) | 27.6 MTok | 2.8% |
Two facts the review did not have. On a subscription the main conversation is already on the 1-hour cache; the setting is for API-key and cloud-provider users. Subagents do evict (in the 5 to 15 minute bucket their writes are 22.7 MTok against 4.6 MTok of reads, the shape of a gone prefix), but that is 134 turns in two weeks.
Break-even slider
A 1-hour TTL makes every write cost 2x input instead of 1.25x, and turns re-writes after 5 to 60 minute gaps into 0.025x reads. Drag the share of write tokens that are such re-writes; the meter shows the 14-day delta at Fable 5.1 list price on the subagent write volume measured above (974 MTok).
Break-even from the ratios alone: (2.0 - 1.25) / (2.0 - 0.025) = 38%. Opus tiers (read 0.1x) land at 39.5%. Prices are list arithmetic, not a measured bill.
Verdict and how to re-check
Leave both keys unset. The eviction cost is real and small; the premium on every write is large and certain. Re-measure when fan-out patterns change, for example long Monitor waits inside subagents:
python3 scripts/measure-cache-gaps.py --days 14
Method note: streaming writes several assistant rows per API turn with identical usage; the script keeps the first row of each turn (rows under 0.5 s apart are dropped) or the turn count inflates.