Inspecting compiled semantics
No matching nodes
Choose up to two semantic kinds. One reveals its real traffic; two compare only direct authored relationships.
Choose a kind to inspect its nodes and touching relationships.
Semantic radar needs more MAP space.
How does poly keep an effect that cannot be undone from running twice when a delivery is retried?
A worker retries an effect when an answer is lost. For a read that costs nothing. For a refund the target may have done the work already, and a second request moves the money twice. The question is where in poly that is decided, and what is left to trust.
Retry safety is decided in poly-ref, from the semantics, with no code shared with the compiler. For every effect of class irreversible, poly-ref reads the number of attempts the effect declares (or the default of five). One attempt is at most once and needs no finding. Two or more need a guarantee: a keyed one, which names the header and a window longer than the retry horizon, or idempotent by nature, which only a pinned standard-library file may declare. Otherwise the check reports PL4003 with a path to the step that emits the effect and the delivery in which the target may execute twice. An effect that reaches outside without a class is PL6304.
The pipeline tells poly-ref whether the module is a pinned library file, by comparing its digest with std/PINS.json. Admission then refuses a build with such a finding unless a person has signed an acceptance.
At run time the worker retries the effect and the capabilities wrapper gives the handler an egress call that sets the key header, the intent id, on every write. A handler that supplies the header has it replaced, and the replacement is audited. A second write in one attempt is refused. This is why the rule is a rule about what runs: the manifest entry the runtime reads is compared with the same declarations by the read-back of artefacts.
Two things stay outside the check. The target must honour the key (K17) and an effect declared idempotent by nature must be (K18). And the key belongs to an intent, not to an order: a second request is a second intent. That is the lesson of the v1.3.0 concierge, and the reason v1.3.1 adds a ledger to the program itself.