Skip to content

Hatchet v0.90.13

Latest

Choose a tag to compare

@github-actions github-actions released this 30 Jun 14:37
f34b10a

Hatchet v0.90.13 is a stability-focused release. It keeps long-running deployments healthy by bounding session-table growth, reduces scheduling latency under load, fixes a duration-parsing bug that could silently shorten your timeouts, and ships a batch of dashboard fixes.

Highlights

  • The UserSession table no longer grows unbounded: an hourly cleanup job now removes expired and orphaned sessions automatically. See Upgrade Notes for an optional one-time bulk cleanup to run before upgrading.
  • Multi-unit duration strings such as 42m30s are now parsed correctly and enforce their full value, rather than silently truncating to a shorter duration. See Upgrade Notes for the related behavior and validation changes.
  • Reduced engine cold-start latency when moving runs from QUEUED to ASSIGNED_TO_WORKER under load, and stale concurrency state is now cleaned up automatically so it can no longer build up and slow scheduling.
  • Fixed a dashboard race that could return a 500 when triggering a run, alongside several quality-of-life improvements: a system theme option in account settings, a scrollable workflow settings page, persisted sidebar scroll position across navigation, a tooltip for long tenant names, and CodeEditor theming and border fixes in light mode.
  • The Go SDK now retries bodyless GET and HEAD reads with backoff on transient failures, which can be disabled via the HATCHET_CLIENT_NO_RETRY environment variable.
  • Durable execution is sturdier: dead-lettered callback messages are now handled gracefully instead of erroring, and a failing child task correctly raises an error in its durable parent, matching the behavior of regular tasks.
  • Hatchet Cloud now has self-serve support for tenant-scoped Prometheus metrics and an audit logs API available on the Scale plan.

Upgrade Notes

Stricter duration validation

Registration now rejects duration strings that were previously accepted and silently coerced: signed values, bare numbers, sub-millisecond units (ns/us), and mixed forms using d/w/y. If you register durations in any of these forms, they'll now fail at registration — check your workflow definitions before upgrading.

UserSession bulk cleanup

This update includes an additional cleanup job for the UserSession table to correctly remove expired/invalid user sessions from the table -- addressing unbounded growth. However, you can optionally run the following query as many times as needed against your Postgres instance to ensure a bulk-cleanup prior to upgrade:

DELETE FROM "UserSession"
WHERE ctid IN (
    SELECT ctid
    FROM "UserSession"
    WHERE NOT (
        ("userId" IS NOT NULL AND "expiresAt" >= NOW())
        OR
        ("userId" IS NULL AND "createdAt" >= NOW() - INTERVAL '24 hours')
    )
    LIMIT 10000
);

Note: the 10000 limit can be adjusted as needed.