Effect identity
effect("generate", fn) has an identity: the name at that position in the Program. After the outcome commits, recovery returns the stored value and does not call fn again.
If the process dies after fn started and before the outcome commits, fn can run again. The external system sees that. Trigora does not add exactly-once delivery to Stripe, email, or any other API.
Use a stable name. Do not build the name from data that changes across a retry of the same logical step, or you will get a second effect instead of a reuse.
Unnamed effect(fn) is rejected. See Effects and Production considerations.