Changelog
Releases
Control plane, agent and CLI are versioned together. Agents one minor version behind the control plane are always supported, so you are never forced into a same-day upgrade.
current
Late-run budgets and a quieter agent
late_afteris now a workflow-level budget that can page while every step is still green. Previously the only way to express "this should have finished by now" was a timeout, which killed the run instead of warning about it.- Idle
PULSEinterval on the agent attachment lowered from 40 s to 25 s. A customer's reverse proxy was closing idle connections at 30 s, and agents looked like they were flapping while every step was in fact succeeding. - The agent persists its attach cursor across restarts, so a host reboot no longer marks in-flight steps as lost.
- Run pages show the previous fourteen durations for each step inline.
Matrix steps, per-step idempotency
- A step can expand over a list with
matrix, producing one instance per entry; downstream steps may wait for all instances or for the first success. idempotency_keyadded at step level and exposed to the step as an environment variable, for work that must not be duplicated by a retry.retry_onaccepts exit-code classes, so "bad input, skip it" is no longer indistinguishable from "transient failure, try again".- CLI:
spindle logs --follownow reconnects by cursor instead of restarting the stream from the beginning.
Transport v3
- Agents attach over a single long-lived stream with length-prefixed records multiplexed
by
track, replacing the per-step polling of transport v2. Connection setup had grown to more than half the bytes on the wire for agents with many short steps. - Records carry an explicit
sizerather than relying on a delimiter. Transport v2 agents cannot attach to a v3 control plane and must be upgraded first. - Reattach by cursor replaced reattach by agent identity; a dropped connection no longer re-assigns work that is already running.
Overlap policy, DST handling
- Explicit
overlappolicy per workflow:skip,queue,cancel_previousorallow. Behaviour before this release was alwaysallow, which surprised everybody who migrated a crontab. - Daylight-saving transitions handled per schedule: a run in a skipped hour moves forward, a run in a repeated hour fires once. Two customers had been double-processing one night a year.
- Audit log records the previous value of a changed field, not just that it changed.
Conditional steps and artifacts
- Steps may be gated on an expression over previous step outputs.
$SPINDLE_OUTintroduced: files a step writes there are retained with the run, which is where most failure reports turn out to live.- A step whose dependency failed is now reported as skipped rather than failed.
Release policy
A minor release lands roughly every eight weeks. Patch releases go out as needed and never change behaviour deliberately — if a patch changes something observable, that is a bug in the patch.
Breaking changes appear only in minor releases, are announced at least one release in advance, and come with a migration note in the release itself. The transport is the one place where we have had to break compatibility, in v3.6, and agents had the whole v3.5 cycle to upgrade.
| Component | Supported versions |
|---|---|
| Control plane (hosted) | current only |
| Control plane (self-hosted) | current and two previous minors |
| Agent | current and one previous minor |
| CLI | current and two previous minors |
| REST API v3 | no sunset date announced |
Hosted upgrades
Applied on Tuesdays between 06:00 and 08:00 UTC, rolling, with no scheduling pause. Runs in flight are not interrupted; an agent that loses its attachment during the roll reattaches by cursor within a few seconds.
Deprecations in flight
Transport v2 is refused as of v3.6. The
schedule_utc field, superseded by timezone in v3.5, still parses
but is no longer documented and will be removed in v4.0.