Most teams pick an invalidation mechanism first: a webhook, a change data capture stream, a short TTL. Then they discover weeks later that nobody agreed what "fresh" means for that source, so nobody knows whether the pipeline is working. The SRE literature is blunt about the ordering: a service level objective specifies a target level for reliability, and it exists so engineering effort goes to the characteristics that matter most, not the ones that are easiest to instrument (Google SRE Workbook, Implementing SLOs).
The same discipline applies to data quality. A data SLO is a specific, measurable goal such as a percentage of records or time that meets a condition, and the error budget is the tolerable amount of failure below that goal (Muness Castle, SLOs for data quality). For freshness, the condition is simple: at the moment of the read, was the record younger than its source's tolerance?
Write the contract first, per source. Once the numbers are agreed, the mechanism question (TTL, webhook or change data capture) answers itself, because each mechanism has a known worst-case lag you can compare against the contract.



