learn-ai-observability-with-phoebe / Leader session 4 of 6
Learn AI Observability with Phoebe · Leader track · Session 4 of 6

What AI actually costs you: the invoice is not attribution

Your provider invoice is one true number with no structure in it. It cannot tell you which feature, which tenant or which failed attempt spent the money, and the metric most teams reach for instead - cost per call - is not merely imprecise, it points the wrong way. This session gives you the right denominator, the arithmetic that turns a reliability problem into a cost problem, the caching economics with the four traps that show up as unexplained spend, and the three places an attribution key can actually live. Every price on this page carries the date it was read: 2026-08-13.

🟡 Leader track Heads of engineering · platform leads · SRE managers 45 min
0-3 · Welcome 3-16 · The wrong denominator 16-38 · Caching economics and the four traps 38-45 · Attribution · Q&A
Part 0

An invoice is a total, not an explanation

There is a moment in every AI programme where finance asks a question engineering cannot answer. The invoice says the number. Nobody can say which feature earned it, which tenant consumed it, or how much of it was spent on attempts that failed. That gap is not an accounting problem and it is not a pricing problem. It is an observability problem, and it is the only one in this course where the business consequence is visible on a spreadsheet before it is visible to a user.

Live - presented in session Self-study - read after class Official sources covered
★ What you walk out with today Why cost per call moves the wrong way and will make you reject good fixes, the c / p derivation that converts a success rate into a cost multiplier, what happens when you compose it with the published 4x and 15x agent token multipliers, the caching economics with break-even and the four traps that silently delete your discount, the tokenizer change that raises your bill by roughly 30% at an identical posted price, and the three places an attribution key can live - only one of which is enforced.
One sentence for the whole course Evals tell you whether it works. Observability tells you what actually happened. Cost is the one place where "what actually happened" arrives on its own, once a month, in a form deliberately stripped of everything you need to act on it.
Two labels to keep straight all session

Verified and primary: the caching multipliers and break-even language, the minimum-prefix and invalidation behaviour, the input_tokens accounting, the 4x and 15x token multipliers, the ~30% tokenizer change, and every line item in the table further down. All read from vendor documentation on 2026-08-13.

Derived, not published: the E[cost per success] = c / p table and the ~25x composition that follows from it. That is arithmetic performed on this page, clearly labelled as such wherever it appears. It is sound and it is not a statistic anyone measured.

Part 1 · the denominator

Cost per call moves the wrong way 13 min live

This is the single most valuable idea in the leader track, and it is a sign error rather than a magnitude error. If you set a cost-per-call target, you have built an incentive that fights your reliability work, and it will do that quietly, in a review meeting, using numbers that are all completely correct.

One fix, two verdicts - worked illustration, arithmetic only, nothing measured Before: attempts bail out early 100 attempts, 60 of them succeed 60 successes x $0.40 = $24.00 40 cheap early failures x $0.10 = $4.00 Total spend $28.00 Cost per call $0.280 Cost per success $0.467 After: the bail-out path is fixed 100 attempts, 80 of them succeed 80 successes x $0.40 = $32.00 20 cheap early failures x $0.10 = $2.00 Total spend $34.00 Cost per call $0.340 up 21% Cost per success $0.425 down 9% Same fix. The two dashboards disagree about whether it was a good idea. Cost per call rose 21%, so a cost-per-call target rejects this fix. Cost per successful task fell 9%, and the users got 33% more finished work for 21% more money. Only one of those two numbers is the business. Optimise cost per call and you will reject the fixes that make the product work.
🔍 Click to zoom - the sign flip, with every number in it arithmetic rather than measurement

The mechanism is worth saying in one sentence you can repeat in a budget meeting: short cheap failures leave the denominator. Any fix that stops attempts abandoning early - a retry path that works, a loop that terminates properly, a tool that stops erroring - removes cheap attempts from your average and replaces them with full-price successful ones. Average cost per call goes up. Cost per unit of delivered work goes down. A team measured on the first number learns to leave the bug in.

The same trap in the other direction A runaway-loop fix can flip the sign the other way and it is just as misleading. Cap the loops and your expensive failures get cheaper, so cost per call falls and everyone celebrates - while the tasks that used to eventually succeed on step nine now fail at step five, and cost per successful task rises. Cost per call moved in the "good" direction for a change that made the product worse. The denominator is the whole argument, not the direction of travel.

The derivation, and it is a derivation

If c is the mean cost of one attempt and p is the probability that an attempt succeeds, then in expectation you pay for 1 / p attempts per success, so E[cost per success] = c / p. That is all it is - a line of arithmetic, not a finding. It is on this page because the numbers it produces are much larger than people expect and because it converts an engineering conversation into a finance one.

Task success rate pCost per success, as a multiple of cost per attemptWhat it means in a budget conversation
95%1.05xFailures are a rounding error. Optimise the model and the prompt
80%1.25xA quarter of your spend is buying nothing. Noticeable, tolerable
60%1.67xTwo thirds of a second run, on average, before anything ships. Reliability is now your cost lever
40%2.50xYou are paying two and a half times list price for delivered work
25%4.00xThree of every four dollars are spent on attempts nobody can use

Now compose that derivation with two numbers somebody actually measured, and the leader-track punchline arrives.

Two published measurements, multiplied by one derivation Chat interaction 1x tokens - the baseline Single agent about 4x more tokens than chat Multi-agent system about 15x more tokens than chat Multi-agent at 60% about 25x per SUCCESSFUL task - 15x x 1.67, derived The 4x and 15x figures are published measurements of ONE production system - Anthropic's own Research feature, circa 2025 - and not a universal law. The 1.67x divisor is arithmetic from c / p and not a measurement. Treat the composition as an order-of-magnitude planning number, not a quoted statistic. The failed 40% are your most expensive attempts, because failures run long before they give up.
🔍 Click to zoom - two measurements and one derivation, kept clearly apart

Read the bottom line of that figure carefully, because it makes the table optimistic rather than pessimistic. The c / p arithmetic assumes a failed attempt costs the same as a successful one. In agent systems it usually costs more: the failure modes that dominate are loops, repeated steps, retries and timeouts, all of which burn tokens for longer before giving up. So the real ratio at 60% success is worse than 1.67x, and the honest way to present the ~25x number is as a floor with a wide error bar rather than as an estimate.

The consequence that funds your reliability roadmap Reliability work is cost work. Holding the price of an attempt constant, moving task success from 60% to 80% cuts cost per successful task by 25% - 1.67x down to 1.25x - with no renegotiation, no model swap and no engineering on the prompt. That is a bigger discount than most teams get from a year of provider negotiation, and it is available to a team that fixes its termination conditions. It also does not appear on any cost-per-call dashboard, which is the point of the whole session.
LiveAttribute at the task level, not the call level4 min▶

A task is what the user asked for and what you charge for. A call is an implementation detail that your engineers can change ten times this quarter. If your unit of cost is the call, then every architectural improvement looks like a cost regression and every architectural regression looks like a saving.

This is also where a real telemetry trap lives, and it is builder session b4's territory: in the agent conventions, token attribution double-counts by design. The invoke_agent span carries aggregate token usage and each child inference span carries its own. Sum across depths and you inflate your own cost figures, then spend a week explaining a variance that you created. Sum at one level only.

The metrics worth asking your team to emit, each sliced by tenant, feature and model: cost_per_task_attempt, task_success_rate, cost_per_successful_task, cost_per_failed_task, tokens_per_task, cache_hit_rate, retries_per_task, steps_per_task. Note the fourth one. Cost per failed task is the number that tells you whether your failures are cheap and fast or expensive and stubborn, and it is the one nobody thinks to ask for.

Part 2 · caching economics

The discount that quietly is not applied 22 min live

Prompt caching is the largest single lever on an AI bill and the most fragile. The pricing is simple enough to fit in three lines. The four ways it silently stops working are the reason your spend chart has a step change in it that nobody can explain, and three of the four return no error at all.

Anthropic prompt caching, read 2026-08-13 - multipliers against base input Cache read (hit) 0.1x base input tokens 5-minute cache write 1.25x base input tokens 1-hour cache write 2x base input tokens Break-even, quoted from the documentation Caching pays off after ONE cache read at the 5-minute duration (1.25x write), or after TWO cache reads at the 1-hour duration (2x write). Below that you have paid a write premium and received nothing. A 0.1x read is a discount only if the read happens. Each trap below is a read that did not.
🔍 Click to zoom - three multipliers and one break-even rule, priced 2026-08-13

Everything about caching economics follows from the asymmetry in that figure. The write costs more than an uncached request and the read costs almost nothing, so caching is a bet that the read will happen. When the bet pays you get a 10x discount on the cached portion. When it does not, you have paid a 25% or 100% premium for the privilege of trying. Nothing in your telemetry announces which of the two occurred unless you put the token quartet on the span.

1 · The TTL clock streaming counts too The TTL runs from the START of the writing request, and streaming time counts against it. If a response takes 4 minutes to stream, a follow-up reusing that prefix must start within about 1 minute. A latency problem becomes a cost bug. 2 · Minimum prefix no error is returned Below the minimum cacheable prefix - 512 to 4,096 tokens depending on model - the request is processed WITHOUT caching and no error is returned. A silent input-cost regression whose only symptom is the invoice, weeks later. 3 · Tool definitions they invalidate all The invalidation hierarchy runs tools, then system, then messages. Changing a tool definition invalidates the ENTIRE cache. Adding one tool can double your input bill before anyone connects the deploy to the line item. 4 · input_tokens counts after the cut input_tokens counts only the tokens AFTER the last cache breakpoint. A 200k cached document plus a 50-token question reports input_tokens: 50 - so a dashboard reading that field under-reports the request by roughly 4000x. Log the quartet: cache creation, cache read, input tokens, and their sum. One alone lies.
🔍 Click to zoom - four traps, three of which return no error at all

Trap four is the one to take back to your team today, because it is not a cost bug, it is a measurement bug that makes every other cost investigation unreliable. A dashboard reading input_tokens on a request that reuses a 200k cached document reports 50 tokens instead of roughly 200,050. Under-reporting by a factor of about four thousand on your highest-volume request pattern is enough to make token-per-request charts, per-tenant attribution and capacity forecasts all quietly wrong in the same direction.

Trap one is the sneaky one, because it crosses domains The cache TTL starts when the writing request starts, and the time spent streaming the response counts against it. So a change that makes responses longer - a better prompt, a more thorough answer, a reasoning model - can push your follow-up requests past the TTL and turn cache hits into cache writes. Nobody will look for a cost regression in a quality improvement. This is the clearest example in the course of a latency property causing a cost outcome, and it is why cost and latency belong on the same span rather than in two different tools owned by two different teams.
LiveThe tokenizer trap: a 30% increase at an identical posted price5 min▶

Claude 4.7 and later models use a newer tokenizer, and the documentation states plainly that it produces approximately 30% more tokens for the same text. Sit with what that means for a migration decision. You move to a newer model at an identical posted dollars-per-token price, your traffic does not change by a single request, and your bill goes up by roughly 30%.

Now the observability point, which is the reason this belongs in this course rather than in a procurement deck. Your dollars-per-token chart looks perfectly fine, because the price per token really did not change. The chart that moves is tokens per request - and most teams do not have that chart, because tokens per request feels like an engineering detail rather than a financial one. If your only cost telemetry is the invoice and a price list, this change is undetectable until the month closes, and then it is indistinguishable from a usage increase.

It also breaks anything you threshold on token counts. Alerts on tokens per request, context-window headroom warnings, per-tenant token quotas and truncation-risk monitors all shift by about 30% for a reason that is not a bug and will not appear in any changelog you own.

Self-studyLine items that never appear on a token dashboard4 min read▶

All figures below were read from vendor documentation on 2026-08-13 and every one of them should be re-verified before you quote it internally.

Line itemWhat it costsWhy it surprises people
Batch API50% off input and output, and it stacks with caching. 24-hour expiry, and expired requests are unbilledThe largest uncontroversial discount available. Observed batch cache hit rates run 30-98%, so the two discounts compound unpredictably
Web search$10 per 1,000 searches, and results count as input tokens again on subsequent turnsYou pay for the search once and for its results on every following turn of the conversation
Web fetchTokens only, but roughly 125,000 tokens for a 500 kB research PDFOne unbounded fetch can consume a context window, which is a quality incident and a cost incident at once
Code execution1,550 free container-hours per organisation per month, then $0.05 per hour - and it is billed even if never called when files are attachedA cost you incur by configuration rather than by use, which no per-call attribution model will find
Geographic routinginference_geo: "us" applies 1.1x on every token categoryA compliance decision made by one team appears as a 10% cost increase owned by another
Tool-use overhead286-804 tokens per request depending on model and tool_choice settingIt is invisible in your own prompt text, so your token estimates are low by a fixed amount on every single request

The pattern across all six: none of them are visible in the prompt your engineers wrote, several are billed by configuration rather than by use, and every one of them lands on a shared invoice with no feature or tenant attached.

Dating discipline, with a live example

Every price on this page carries the date 2026-08-13, and here is the reason stated by a vendor about itself: the Anthropic pricing page's own footnote records that a planned Sonnet 5 increase to $3/$15 on 1 September 2026 "will not occur". A published, dated, scheduled price change was cancelled. Any internal document that quotes a model price without a date is already wrong or shortly will be, and the same holds for the multipliers, the free tiers and the minimum prefix sizes on this page.

Part 3 · attribution

Where the key can actually live 7 min live

Attribution has exactly three places to put the key, and they trade off along the same axis every time: the more enforced a boundary is, the coarser it is. Choosing one is a real architectural decision, not a tooling preference, and most teams need two of the three.

Attribution has exactly three places to put the key Provider-side workspaces the only ENFORCED boundary Per-workspace spend and rate limits, plus the workspace id on the response header. The only boundary that anything actually enforces. Coarse: one key per team or product. Not per user, not per feature, not per task. Span attributes fine-grained, unenforced tenant.id, a pseudonymous user.id, feature.id, plus the token quartet and the model name, on your own spans. Arbitrarily fine, and this is what buys cost per successful task. Enforces nothing: a bug can still spend elsewhere. Cache-key affinity efficiency and attribution Route a tenant's traffic to a stable prefix and cache key. You get the 0.1x reads AND a natural attribution seam. On a provider with automatic caching, a varying prefix - a timestamp, a name - costs you the whole discount. The enforced boundary is coarse. The fine-grained one is advisory. You need both.
🔍 Click to zoom - three placements, and the enforcement-versus-granularity trade that never goes away

The distinction that matters in a governance conversation is between enforced and reported. A workspace with its own spend and rate limits will stop a runaway loop from spending another product's budget, because the provider refuses the request. A tenant.id span attribute will tell you afterwards, beautifully, exactly which tenant's budget got consumed by someone else's bug. Both are worth having and only one of them is a control.

Where the third one earns its place Cache-key affinity is the only lever on the page that improves two things at once. Routing a tenant's traffic to a stable prefix means the cached prefix is reused, so you get the 0.1x reads, and the routing key doubles as an attribution seam you did not have to invent. The mirror-image warning belongs in the same breath: on a provider whose caching is automatic rather than explicit, a prefix that varies per request - a timestamp at the top of the system prompt, a user's name, a session counter - silently costs you the entire discount, with no write premium to notice and no error to catch.
Decision drill 1 of 2

Approve the fix, or reject it ◐ 8 min · in pairs

Commit to a decision before you discuss it, and notice what your instinct does with the first number you are shown. That instinct is the thing this drill is trying to change.

The proposal on your desk

An engineer wants two weeks to fix the retry path in your document-analysis agent. Their write-up says: task success rate goes from about 60% to about 80%, average cost per call rises about 21%, monthly spend rises from $28k to $34k. Your quarterly commitment to finance was to hold cost per call flat. Your product lead has been asking for two weeks of that engineer's time for a feature.

Decide, alone, in one line. Approve or reject. Then write down which number you used to decide, and whether you would have decided differently if the write-up had led with cost per successful task instead of cost per call.

Do the arithmetic on the delivered work. At 60% success, 100 attempts deliver 60 finished tasks. At 80% they deliver 80. Work out the change in cost per finished task and say the two verdicts out loud in the same sentence: cost per call up 21%, cost per successful task down. One of those is the sentence finance was actually asking about.

Find the commitment error. The promise to hold cost per call flat was made in good faith and it is the actual obstacle here. Draft the one-paragraph renegotiation: what you would commit to instead, and what evidence you would show monthly to prove it. Note that the replacement commitment requires telemetry you may not have yet.

Now the version with teeth. Suppose the same two weeks would instead cap runaway loops, cutting cost per call by 15% while task success drops from 60% to 52% because runs that used to succeed on step nine now stop at step five. Cost per call improves. Does anything else? This is the same trap with its sign reversed, and it is the one that gets approved.

What the drill is teaching Neither the approve nor the reject answer is the lesson. The lesson is that a cost-per-call commitment made to finance is a technical decision with an incentive built into it, made by people who had no idea they were choosing an incentive - and that you can only renegotiate it if you can produce cost per successful task, sliced by feature, which is a telemetry capability rather than a spreadsheet.
Decision drill 2 of 2

The unexplained step change ◐ 7 min · in pairs

A cost investigation with four plausible causes, three of which return no error. Your job is to order the questions, not to guess the answer.

The situation

Input-token spend on your customer-support assistant rose 34% between Tuesday and Wednesday. Request volume is flat. Your dollars-per-token figures are unchanged. In the same week the team shipped a new tool for order lookups, switched the system prompt to include the current timestamp for freshness, moved to a newer model at an identical posted price, and enabled streaming so answers feel faster.

Write down the four hypotheses the four changes suggest, and mark which of them would produce an error, a warning, or any log line at all. You should end up with a very short list in the first column and a long one in the third.

Name the one measurement that separates most of them. One chart splits the tokenizer story from the cache-invalidation story immediately, and almost nobody has it on a wall. Say which chart, and say why the dollars-per-token view cannot do it.

Reason through the streaming change. Explain to a sceptical colleague how making answers feel faster could raise the input bill. If your explanation does not mention where the TTL clock starts, try again.

Decide what you fund. You can have one of: a per-request token chart broken down into the cache quartet, an alert on cache hit rate step changes, or a per-tenant cost attribution project. Pick one, name the incident class it would not have caught, and say who you would tell about that gap before it happens.

The point of the ordering Three of the four changes here are cost regressions with no error signal, and two of them were shipped by people improving the product. This is the normal case rather than the pathological one. The reason the cache quartet on the span is such a good first investment is that it distinguishes several of these hypotheses at once, without anyone having to guess which of Wednesday's four deploys to look at first.
Homework

Try it yourself - this week ◐ 45-60 min total

Source material

Official sources covered

Every price, multiplier and mechanism on this page was read from primary vendor documentation on 2026-08-13 and is catalogued in this course's source map. The arithmetic built on top of them is labelled as arithmetic. This page covers:

✓Prompt caching multipliers: 5-minute write 1.25x, 1-hour write 2x, cache read 0.1x of base inputPart 2 · primary vendor documentation, priced 2026-08-13
✓Break-even quoted from the docs: one read at 5 minutes, two reads at 1 hourPart 2 · below that you have paid a write premium for nothing
✓The four silent traps: TTL from the start of the writing request with streaming counted, the minimum cacheable prefix of 512 to 4,096 tokens enforced with no error returned, tool definitions invalidating the entire cache, and input_tokens counting only tokens after the last breakpointPart 2 · three of the four return no error at all
✓Agent token multipliers: agents about 4x more tokens than chat, multi-agent systems about 15xPart 1 · published measurement of Anthropic's own Research feature circa 2025, explicitly not a universal law
✓The tokenizer change: Claude 4.7 and later produce approximately 30% more tokens for the same textPart 2 · a ~30% cost increase on identical traffic at an identical posted price
✓Line items outside the token dashboard: Batch API 50% off stacking with caching, web search $10 per 1,000 searches, ~125,000 tokens for a 500 kB PDF fetch, code execution 1,550 free container-hours then $0.05/hour and billed when files are attached, inference_geo: "us" at 1.1x, tool-use overhead of 286-804 tokens per requestSelf-study · all read 2026-08-13, all to be re-verified
✓Attribution placements: provider-side Workspaces with per-workspace spend and rate limits and a workspace id response header, span attributes on your own telemetry, cache-key affinityPart 3 · only the first is enforced, and it is the coarsest
◐E[cost per success] = c / p and the 1.05x / 1.25x / 1.67x / 2.50x / 4.00x table, plus the ~25x composition with the 15x multiplierPart 1 · a DERIVATION performed on this page, not a published statistic. Sound arithmetic, nobody's measurement
◐The before-and-after cost-per-call illustration, and the 60% to 80% reliability figurePart 1 · a worked illustration with invented inputs, chosen to show the sign flip. The 25% saving holds the price of an attempt constant
◐Token double-counting across invoke_agent and its child inference spansNamed here · the full trap and the fix are builder session b4
◐Cardinality limits on which cost breakdowns can be a metric at allAssumed from leader session a3 · unbounded ids on spans, never as metric labels
○Per-platform observability vendor pricingNot covered · could not be verified beyond one vendor's "volume of spans" basis, so no numbers are quoted. Session a6 handles the platform decision without them

Three honesty flags to carry out of the room. The 4x and 15x multipliers describe one production system - Anthropic's own Research feature, circa 2025 - and are a well-documented order-of-magnitude data point rather than a law of agent design. The c / p table and the ~25x composition are arithmetic performed here, and the composition is a floor rather than an estimate, because failed attempts typically cost more than successful ones. And every price, free tier and multiplier above carries the date 2026-08-13 for a documented reason: a scheduled, published price change for 1 September 2026 was subsequently cancelled by the same page that announced it.

Check yourself

Three questions before you go 🎯 ◐ 90 seconds

1 · A fix raises average cost per call by 21% and lowers cost per successful task by 9%. What is going on, and what do you do?

This is the sign error at the heart of the session. Attempts that used to bail out early were cheap, and they were dragging the average down while delivering nothing. Fixing that path replaces cheap failures with full-price successes: the average per call rises, the cost per unit of delivered work falls. A team measured on cost per call learns, entirely rationally, to leave the bug in. The trap also runs in reverse - capping runaway loops can lower cost per call while raising cost per successful task, and that version usually gets approved.

2 · You migrate to a Claude 4.7 or later model at an identical posted price. Traffic is unchanged. What happens, and which chart shows it?

The price per token really did not change, which is exactly why this is an observability problem rather than a procurement one. Your dollars-per-token dashboard stays flat and correct while the bill grows by about a third. The signal lives in tokens per request, a chart most teams treat as an engineering detail and therefore do not have. It also shifts everything you threshold on token counts - context-headroom warnings, per-tenant quotas, truncation-risk monitors - by roughly 30%, for a reason that is documented behaviour rather than a bug.

3 · Your cost dashboard reads input_tokens. A common request reuses a 200k-token cached document and adds a 50-token question. What is your dashboard telling you?

This one is not a cost bug, it is a measurement bug, and it contaminates every cost investigation you run afterwards. Under-reporting your highest-volume request pattern by a factor of roughly four thousand makes tokens-per-request charts, per-tenant attribution and capacity forecasts all wrong in the same direction, with no error anywhere to indicate it. The cached tokens are billed - at 0.1x on a read - they are simply accounted for in different fields. Log all four numbers or none of them mean anything.

Leader session 4 cheat sheet · pin this

The wrong denominatorCost per call moves the wrong way. Short cheap failures leave the denominator, so a good fix raises the average while lowering the cost of delivered work. Optimise cost per call and you will reject the fixes that make the product work.
c / p - a derivationE[cost per success] = c / p. 95% gives 1.05x, 80% gives 1.25x, 60% gives 1.67x, 40% gives 2.50x, 25% gives 4.00x. Arithmetic performed here, not a published statistic.
The compositionAgents use about 4x the tokens of chat and multi-agent systems about 15x, measured on one production system circa 2025. At 60% success a multi-agent design costs about 25x per successful task versus chat - and that is a floor, because the failed 40% run long before giving up.
Reliability is cost workHolding the price of an attempt constant, 60% to 80% task success cuts cost per successful task by 25% with no pricing change at all. Bigger than most negotiated discounts, and invisible on a cost-per-call chart.
Caching prices, 2026-08-135-minute write 1.25x, 1-hour write 2x, read 0.1x of base input. Break-even after one read at 5 minutes, two reads at 1 hour. Below that you paid a premium for nothing.
The four silent trapsTTL starts when the writing request starts and streaming counts against it. The minimum prefix (512-4,096 tokens) is enforced with no error returned. Changing a tool definition invalidates the entire cache. input_tokens counts only after the last breakpoint - roughly 4000x under-report on a 200k cached document.
The tokenizer trapClaude 4.7 and later produce about 30% more tokens for the same text. Migrating at an identical posted price is a ~30% increase on identical traffic. Dollars per token looks fine; tokens per request is the chart that moves.
Three places for the keyProvider-side Workspaces are the only enforced boundary and the coarsest. Span attributes are arbitrarily fine and enforce nothing. Cache-key affinity buys efficiency and attribution at once. Every price you quote carries a date, because a published change for 1 Sep 2026 was cancelled.