Why a retried refund runs once

Why a retried refund runs once An architecture diagram generated by Archify. Check pipeline · stages 0 to 5, folded · Check path: No model decides a verdict; never imports poly-io Check pipeline stages 0 to 5, folded poly-ref · reference interpreter · Check path: No model decides a verdict; never imports poly-io poly-ref reference interpreter Retry safety · PL4003 to PL4005, PL6304 · Architecture component Retry safety PL4003 to PL4005, PL6304 Standard library pins · std/PINS.json · Architecture component Standard library pins std/PINS.json Admission · certificate issuer · Check path: No model decides a verdict; never imports poly-io Admission certificate issuer Effect worker · outbox to gate to handler · Architecture component Effect worker outbox to gate to handler Handler capabilities · bounded wrappers · Architecture component Handler capabilities bounded wrappers Host handlers · application effect code · Architecture component Host handlers application effect code validate, deadlock, liveness needs every stage clean call the handler check retry safety is this file pinned? · file give the handler its wrappers Check path: No model decides a verdict; never imports poly-io Legend Backend Database

The short answer

  • • The check refuses an irreversible effect with two or more attempts that names no guarantee, and the runtime puts the same key on every attempt

Not shown here

  • • The certificate and the vendored engines, which carry the finding and the outbox but do not decide it
  • • Connected but out of scope: poly CLI, poly-lang, poly-embed, poly-core, poly-lower, Certified build

What it guarantees

  • • An irreversible effect that may be attempted twice is not admitted unless it names how its target is kept from running it twice: poly-ref reports PL4003 with a witness (a delivery in which the target may execute twice) unless the effect is keyed (an idempotency header and a window that holds the retry horizon) or idempotent by nature in the pinned standard library. The runtime sets the key on every write in a capability the handler cannot bypass. What poly does not verify are the assumptions K17 (the target honours the key) and K18 (an effect declared idempotent by nature is), which a certificate names when an effect declares them
  • • A check that did not run or hit a bound is never CLEAN: the verdict fold ranks INCONCLUSIVE and UNDERPOWERED apart from CLEAN, vacuous properties are INCONCLUSIVE, and admission refuses a build with any check not run