releases.shpreview

Rollback handlers now receive step context via ctx

1 featureThis release1 featureNew capabilitiesAI-tallied from the release notes

Workflows makes it easier to build reliable multi-step applications that can recover when downstream systems fail. Rollback handlers now receive the original step context via a ctx object for the step being rolled back. This includes ctx.step.name, ctx.step.count, ctx.attempt, and the step config with defaults applied.

The step configuration includes the retry and timeout settings used for that step, so you can customize your step recovery logic according to those fields.

<div><div><span>await</span><span> </span><span>step</span><span>.</span><span>do</span><span>(</span></div></div><div><div><span>  </span><span>"create charge"</span><span>,</span></div></div><div><div><span>  </span><span>async</span><span> </span><span>()</span><span> </span><span>=></span><span> </span><span>{</span></div></div><div><div><span>    </span><span>const</span><span> </span><span>charge</span><span> </span><span>=</span><span> </span><span>await</span><span> </span><span>createCharge</span><span>()</span><span>;</span></div></div><div><div><span>    </span><span>return</span><span> </span><span>{</span><span> chargeId</span><span>:</span><span> </span><span>charge</span><span>.</span><span>id</span><span> </span><span>};</span></div></div><div><div><span>  </span><span>},</span></div></div><div><div><span>  </span><span>{</span></div></div><div><div><span>    </span><span>rollback</span><span>:</span><span> </span><span>async</span><span> </span><span>({</span><span> </span><span>ctx</span><span>,</span><span> </span><span>output</span><span>,</span><span> </span><span>error</span><span> </span><span>})</span><span> </span><span>=></span><span> </span><span>{</span></div></div><div><div><span>      </span><span>// `output` is the value returned by the step being rolled back.</span></div></div><div><div><span>      </span><span>const</span><span> </span><span>{</span><span> </span><span>chargeId</span><span> </span><span>}</span><span> </span><span>=</span><span> </span><span>output</span><span> </span><span>as</span><span> </span><span>{</span><span> </span><span>chargeId</span><span>:</span><span> </span><span>string</span><span><span> </span><span>};</span></span></div></div><div><div><span>      </span><span>await</span><span> </span><span>refundCharge</span><span>(</span><span>chargeId</span><span>,</span><span> </span><span>{</span></div></div><div><div><span>        </span><span>// `ctx` is the original step context, including step name, count, attempt, and config.</span></div></div><div><div><span><span>        </span></span><span>reason</span><span>:</span><span> </span><span>`</span><span>${</span><span>ctx</span><span>.</span><span>step</span><span>.</span><span>name</span><span>}</span><span>: </span><span>${</span><span>error</span><span>.</span><span>message</span><span>}</span><span>`</span><span>,</span></div></div><div><div><span>      </span><span>}</span><span>)</span><span>;</span></div></div><div><div><span>    </span><span>},</span></div></div><div><div><span><span>    </span></span><span>rollbackConfig</span><span>:</span><span> </span><span>{</span></div></div><div><div><span>      </span><span>// `rollbackConfig` controls retries and timeout for the rollback handler.</span></div></div><div><div><span><span>      </span></span><span>retries</span><span>:</span><span> </span><span>{</span><span> limit</span><span>:</span><span> </span><span>3</span><span>,</span><span> delay</span><span>:</span><span> </span><span>"30 seconds"</span><span>,</span><span> backoff</span><span>:</span><span> </span><span>"linear"</span><span> </span><span>},</span></div></div><div><div><span><span>      </span></span><span>timeout</span><span>:</span><span> </span><span>"5 minutes"</span><span>,</span></div></div><div><div><span>    </span><span>},</span></div></div><div><div><span>  </span><span>},</span></div></div><div><div><span>)</span><span>;</span></div></div>

Refer to rollback options to learn more.

Fetched June 23, 2026