Which attempt just FAILED, 1-based.
OptionalchannelExplicit channel discriminant — see FlowErrorEvent.channel.
Milliseconds the engine will wait before the next attempt. 0 = immediate.
Total attempts the policy allows, including the first.
Human-readable message — the same string onError would carry.
Stable stage identifier from the builder (matches spec node id).
Structured details of the error that ended this attempt.
Optionaltraversal
Event passed to FlowRecorder.onStageRetry — one failed attempt at a stage that carries a declared import('../types.js').RetryPolicy, and which WILL be attempted again.
WHY this event exists: a retry hand-rolled inside a stage function leaves no mark on the trace at all. This event is what makes a declared retry part of the record — which attempt failed, why, how long the engine waited, and how many attempts the policy allows.
Fires only for attempts followed by another attempt. The final failure takes the ordinary error path (
onError), so the two never double-report the same failure: an exhaustedattempts: 3policy emits 2 retry events + 1 error event; aretryOnthat declines emits 0 retry events + 1 error event. Each attempt — retried or not — also fires FlowAttemptEvent first (10.1), which is where a declined stop is recorded (reason: 'declined').