Skip to content
Ironflow is pre-1.0: APIs can change between releases. Pin a version. What is ready →

Ironflow v0.48.0

Ironflow v0.48.0 is the 1.0 groundwork release: pull workers pick up jobs at once through a long-poll, consumer groups get a bidirectional ack stream, and SDKs now tolerate values from a newer server. It also removes a set of deprecated APIs and makes ironflow skills sync write to the project by default.

  • ironflow skills sync writes to .agents/skills at the project root, not $HOME/.agents/skills. Pass --global for the old location. Sync refuses, without --force, to replace a bundled skill it never wrote (#3024)
  • PubSubService.SubscribeBidirectional takes SubscribeBidirectionalRequest and returns SubscribeBidirectionalResponse. It was never implemented, so no working client breaks (#2982)
  • Removed TriggerResult from @ironflow/core, @ironflow/node and @ironflow/browser. Use InvokeResult (#3011)
  • Removed TimeTravelRunState, TimeTravelStepOutput and AuditTrailEntry from @ironflow/core. Use TimeTravelRunStateSnapshot, TimeTravelStepOutputSnapshot and AuditTrailResult (#3011)
  • Removed RUN_STATUS.PENDING (JS) and RunStatusPending (Go). The engine has not produced pending since #1222 (#3011)
  • Removed the recording_retention field from the API and every SDK. It never controlled deletion; IRONFLOW_AUDIT_RETENTION_DAYS does. Delete it from function definitions (#3011)
  • Removed the browser agents.invoke() options replay and onRunStarted. Read runId from the result; open agents.subscribe(runId, { replay }) to replay events (#3011)
  • Removed the spec.license key from server YAML. A file that still has it fails ironflow validate and serve. Delete the license: block (#3011)
  • @ironflow/core AckModeSchema, BackpressureModeSchema and ConsumerGroupStatusSchema accept unknown values, so their zod type is a union: .options, .enum, .extract and .exclude are gone (#3021)
  • Pull workers pick up new jobs at once. GET /api/v1/workers/{workerId}/jobs?wait=<seconds> holds an idle poll up to 25 seconds, and the Go, Node and Python workers use a 20-second wait instead of sleeping 1 second after every empty poll. Options: Node pollWaitSeconds, Go PollWait, Python poll_wait (#2995)
  • SubscribeBidirectional joins a consumer group and carries its acks on one stream, in the Go SDK (WithJoinTransport("grpc")) and Node (@ironflow/node/consumer-group-stream). Each ack gets a server result (#2982)
  • ironflow serve --headless runs the engine without the dashboard, for apps that use Ironflow as a backend. YAML: spec.headless: true (#2976)
  • A newer SDK on an older server raises SERVER_TOO_OLD, naming the first server version that serves the call (#2982, #3010)
  • Every SDK names itself on every HTTP request with X-Ironflow-SDK (browser: X-User-Agent). The server reads neither (#3008)
  • ironflow serve refuses a database whose schema is newer than the binary, instead of running on a schema it cannot read (#3009)
  • ironflow version links to the release notes for the running version (#3027)
  • A subscription with startAfterSequence no longer skips events when the subscriber falls behind. The server and the Go SDK wait up to 5 seconds for room, then end the subscription so the SDK resumes from the last delivered event (#2985)
  • Entity stream appends no longer slow down as the stream grows. An append reads only the newest event, not the whole stream (#3019, #3026)
  • PostgreSQL: concurrent appends to one entity stream no longer fail with version conflict, and concurrent updates of one function both apply (#2974)
  • PostgreSQL: registering a deployment returns the stored creation time (#2981)
  • Node and Python: a managed projection no longer loses events after a save whose response was lost (#2984)
  • Go, Node and browser: an unknown run status or consumer-group enum value from a newer server no longer fails the call (#3021)
  • JoinConsumerGroup returns NotFound, not Internal, for a missing group
  • Go: a ConnectRPC event whose payload is not a JSON object now arrives with its data; Nak with an out-of-range delay returns an AckError
  • Consumer-group events over ConnectRPC carry metadata, so Go and Node set event.Meta with its sequence
  • Local make ci and make ci-full run independent groups concurrently and reuse builds (#2971)
  • make test-upgrade runs the previous release’s data through the new binary on SQLite and PostgreSQL; make test-skew runs previous-release SDKs against the new server and the reverse (#3009, #3010)
  • Benchmarks cover embedded SQLite and PostgreSQL in every run, with a hardened harness (#2993, #2987)