effectKey

val effectKey: suspend (C, S) -> String?

Optional lambda that computes a stable effect-key from context and state.

When non-null, the engine uses the returned string to look up whether the step's side effect has already been recorded in the journal (F004). The lambda receives the current context and the pre-step saga state.

The key must be non-blank; blank keys are rejected at Intent-append time (T010).

Attach via the effectKey infix extension:

step(OrderStep.CHARGE) { ctx -> ... } effectKey { ctx, state -> "charge:${ctx.orderId}" }