Hatchet v0.106.5 is a concurrency-focused release, adding support for dynamic concurrency limits, shared concurrency across workflows, and two new queue-depth concurrency strategies.
Highlights
- Dynamic concurrency limits: set concurrency limits on a per-key basis using a CEL expression. For example, let premium-tier users run 10 workflows simultaneously while other users run one:
input.tier == 'premium' ? 10 : 1(#4863, #4873). - Shared concurrency across workflows: create concurrency rules that many tasks and workflows consume simultaneously, e.g. limiting
workflow_aandworkflow_bto 10 concurrent runs per user total. Previously this pattern required a parent router task; shared concurrency replaces it (#4845, #4873). - Two new concurrency strategies,
CANCEL_QUEUED_EXCEPT_NEWESTandCANCEL_QUEUED_EXCEPT_OLDEST: configure the queue depth for each concurrency key, keeping only the most or least recent queued item until in-progress runs complete — conceptually similar to debouncing (#4793).
Security
- Engine: satisfied durable event lookups are now filtered by tenant, enforcing tenant isolation on the durable event log (GHSA-992g-9cr3-vm5x).
Fixed
- Engine: partitions are pruned in
UpdateDurableEventLogEntriesSatisfied(#4891). - Engine: CEL evaluation inconsistencies (#4864).
- Engine: duplicate rows no longer cause an on-conflict error during task assignment (#4829).
- Engine: allocated crons are counted against the latest workflow version only (#4859).
- Go SDK: all required symbols are exported and deprecated constructs are no longer depended on (#4875).
What's Changed
- feat: stamp cloud.region on OpenTelemetry resources by @grutt in #4780
- fix(engine): duped rows causing on conflict error on assign by @mrkaye97 in #4829
- refactor(engine): buffer durable event ingestion by @mrkaye97 in #4854
- chore(engine): decrease durable flush interval, add more spans by @mrkaye97 in #4858
- fix: count allocated crons via DISTINCT ON latest workflow version by @grutt in #4859
- docs: prioritize embedded mode by @abelanger5 in #4846
- refactor(engine): bulk operation for
UpsertDurableChildSignalCreatedEventsby @mrkaye97 in #4860 - chore: Bump google.golang.org/grpc from 1.82.1 to 1.83.1 by @dependabot[bot] in #4866
- fix: dependabot alert by @mnafees in #4869
- fix: dependabot alert by @mnafees in #4870
- feat(engine): shared concurrency strategies by @abelanger5 in #4845
- feat: count ingested log and OTLP bytes after persist by @grutt in #4876
- feat(engine): enable durable tasks running on the dag operator to be evicted by @mrkaye97 in #4872
- chore: update skills to include embedded mode references by @abelanger5 in #4861
- feat(docs): add a reference overview page for each SDK reference by @abelanger5 in #4862
- fix: make sure Go SDK exports all required symbols and does not depend on deprecated constructs by @mnafees in #4875
- ci: no verbose
go testoutput required by @mnafees in #4878 - chore: Bump qs from 6.15.2 to 6.16.0 in /frontend/app by @dependabot[bot] in #4877
- feat(engine): dynamic per-group max runs via CEL expression by @abelanger5 in #4863
- feat(dashboard): dag operator visibility by @mrkaye97 in #4881
- fix(python,ts): use a queue for ordering durable callbacks by @mrkaye97 in #4821
- feat(sdks): new concurrency features (dynamic max runs, tenant-scoped concurrency) by @abelanger5 in #4873
- fix: bumps
qsin the TS SDK to fix Dependabot alerts by @mnafees in #4884 - chore: Bump github.com/rabbitmq/amqp091-go from 1.10.0 to 1.13.0 in /examples/go/embedded by @dependabot[bot] in #4885
- fix(python): concurrent workflow registration, flaky test improvement by @mrkaye97 in #4888
- ci: dont fail fast by @mrkaye97 in #4889
- fix: CEL inconsistencies / bugs in the engine by @abelanger5 in #4864
- feat(dashboard): add query params as span attributes on rest api requests by @mrkaye97 in #4892
- fix(engine): prune partitions in
UpdateDurableEventLogEntriesSatisfiedby @mrkaye97 in #4891 - fix: add new dag shapes to load test to stress test dag operator by @juliusgeo in #4857
- docs: link CEL feature clients on reference overview pages by @abelanger5 in #4893
- feat(dashboard): allow posthog flags to target users by email / id by @mrkaye97 in #4896
- feat(docs): index files w/ backlinks in the SDKs by @abelanger5 in #4895
- chore: pre-reqs for operators work (remove http operator, shared dispatcher types) by @abelanger5 in #4914
- chore: remove dependabot update PRs by @mnafees in #4919
- chore: Bump the github-actions group with 2 updates by @dependabot[bot] in #4906
- chore: Bump the npm-dev-deps group across 2 directories with 4 updates by @dependabot[bot] in #4835
- fix(engine): durable child spawn hang by @mrkaye97 in #4918
- fix: guard worker
isActiveusing a session id instead of just a timestamp by @abelanger5 in #4916 - chore: Bump the go-modules group across 1 directory with 55 updates by @dependabot[bot] in #4921
- fix: Go SDK's
RunManyshould return results in the same order of the inputs by @mnafees in #4825 - chore: changelog for next release by @mnafees in #4915
- fix: correct OSS release tag by @mnafees in #4924
Full Changelog: v0.105.16...v0.106.5