Findings No. 58
Recording spend and gating spend need separate counters
One skipBudget flag meant 'don't count and don't block', so cache warmers were invisible to the spend counter: it read 331 while about 1,559 strings were billed.
A single flag that turns off both measurement and enforcement will eventually make your telemetry lie, because the traffic you exempt from the limit also disappears from the count.
The CCRTA website caps fresh LLM translation with a daily budget. Our own cache warmers, which translate the sitemap into 14 languages each day and make up most real volume, passed a skipBudget flag so they would not use up riders' budget. But the flag meant "don't count and don't block". The warmers were invisible to the only spend signal we had: the counter read 331 while a single verification run billed about 1,559 strings through the Gateway.
The fix separated the two concerns into different keys. Every caller is now recorded to tr:spend:<service day>, while only organic traffic is checked against tr:budget:<service day>. They are deliberately different, because counting warmers against the ceiling that gates riders would let one warmer run lock riders out for the rest of the day. The option was renamed firstParty, which describes the caller rather than the policy.
The general rule: keep "should this be recorded?" and "should this be blocked?" as separate decisions with separate counters, even when today they happen to agree.
Receipt: CCRTA Website translation spend counter (CHANGELOG, "The translation spend counter now sees first-party traffic"; FINDINGS.md, "Translation pipeline").