Trigger.dev version skew protection and in-flight Sume jobs
Trigger.dev pins each run to the deployment from the same commit. What that means for tasks that created a Sume job before a deploy, and what to store.

With Trigger.dev's Version Skew Protection, a run stays on the deployment built from the same commit, so a deploy mid-run does not change the code that finishes your Sume task. The September 23, 2026 changelog says it pins every run to that deployment. That helps a task that created a Sume job and is waiting for it, but the job itself lives at Sume, so its id is what survives anything.
What gets pinned and what does not
| Thing | Behaviour |
|---|---|
| Trigger.dev run code | Pinned to the deployment from the same commit |
| Sume job | Runs on at Sume, independent of your deploy |
| Cancelling a Trigger.dev run | Does not cancel the Sume job |
| Sume Idempotency-Key | Returns the original job for the same key and body |
Failure the pin prevents
Imagine a task that submits a create call with body shape A, waits, then reads the result expecting shape A. A deploy changes the body shape to B. A resumed run on new code would reuse the same key with a different body and get 409 idempotency_conflict. With pinning, the old run keeps old code, so create and read stay consistent.
New runs use new code. If the key included a code version and you want a clean break, give the new version a new key.
What to store before you wait
Persist the Sume job id as soon as the create call returns 202. Then if a run is cancelled, retried or restarted, the next attempt can read GET /v1/jobs/:id/status instead of creating another job.
- Cancelling a Trigger.dev run does not stop Sume generation. Use
POST /v1/jobs/:id/cancel, which returns 409job_generation_already_startedonce generation has begun. - A client timeout leaves the job running and billing.
- Prefer webhook mode with
job.completedover holding a task open.
Waiting well
Use Sume's next_poll_after_seconds for the poll interval, and use waitForJob from @sume-com/sdk if you are in TypeScript. Verify webhooks with the SDK's async verifyWebhook. Either way, end with a terminal status check rather than assuming success.
Sources
Related posts
More in Developers
- TTS boundary_lead_ms: why sentence slices end 70 ms after a word
Sume TTS sentence segments cut boundary_lead_ms after a sentence's last word: 70 ms by default, 0 to 500. The next segment absorbs the pause, and no gap opens.
- tts_duration_exceeded: split long scripts for Sume TTS
Sume TTS fails with tts_duration_exceeded when audio would pass 1,200 seconds, and takes at most 20,000 characters. Split rules and how to join the parts.
- TTS language omitted: Spanish text comes out with an English default
On Sume TTS, an omitted language defaults to English at the provider, with a ko or ja fallback only for Hangul or kana text. Set language for all others.
- TTS sentence slices have no audio_url: emit_audio needs wav or raw
With segmentation on, Sume TTS only returns a sample-exact audio_url per sentence for wav or raw output. For mp3 you get timings and a warning instead.
Written by Sume