Releases: microsoft/pg_durable
Release list
Release v0.2.5
Highlights
- Richer HTTP workflows:
df.http_multipart()sends form and file uploads, while HTTP nodes preserve binary responses as base64 with an explicitencodingfield. - Audio round-trip example: chains Azure OpenAI text-to-speech output directly into a Whisper multipart transcription request.
- Independent starts:
df.start(..., transaction_mode => 'new')commits on a separate session, allowing asynchronously started work to survive a caller rollback. - Direct HTTP result access: response fields such as
$resp.body,$resp.status,$resp.ok, and$resp.encodingwork with dot notation.
Reliability
- Nested and non-root
df.loop()workflows that previously failed now execute and restart correctly, with consistentdf.break()behavior. - Workers can connect when
PGHOSTnames a Unix-socket directory.
Upgrade Notes
Drain in-flight work before upgrading when continuity is required. JOIN/RACE branches started on v0.2.4 will fail on replay, and in-flight loops may fail. See
docs/upgrade-testing.mdfor details.
Acknowledgements
Thanks to everyone who contributed to this release: Pino de Candia (@pinodeca) Han Qiao (@sweatybridge) Todd J. Green (@tjgreen42).
New Contributors
- Han Qiao (@sweatybridge) made their first contribution in #302
Full Changelog: v0.2.4...v0.2.5
Release v0.2.4
Highlights
- Bounded instance history: retention and hard-cap pruning prevent unbounded growth of
df.instances. - Better instance listing:
df.list_instances()adds label filtering and keyset pagination, with a configurable page-size limit that now fails loudly instead of silently truncating results. - More accurate monitoring: node status follows durable execution lineage, and
df.start()reports engine hand-off failures immediately. - Correct schedule timing: recurring schedules calculate their next tick when execution begins.
- Safer completion waits: use
df.await_instance()in place ofdf.wait_for_completion().
Reliability and Security
- Hardened instance and node ID allocation against collisions.
- Added loop and result-expansion limits, improved connection recovery, and sped up instance listing.
- Extended HTTP SSRF protection to the CGNAT range and restricted
df.metrics()to explicitly authorized roles.
Upgrade Notes
Drain all in-flight instances before upgrading. Durable-history input changes make work started on earlier versions incompatible with v0.2.4 replay, including instances waiting on schedules. The node-key migration also takes an
ACCESS EXCLUSIVElock ondf.nodes; schedule the upgrade in a maintenance window. Seedocs/upgrade-testing.mdfor details.
Acknowledgements
Thanks to everyone who contributed to this release: Prashant Chinnam (@crprashant) Ismaël Mejía (@iemejia) nanookclaw Pino de Candia (@pinodeca) Saithej (@Saithej2k) Haoqian (@snvtac) Todd J. Green (@tjgreen42).
New Contributors
- Haoqian (@snvtac) made their first contribution in #262
- nanookclaw made their first contribution in #265
- Saithej (@Saithej2k) made their first contribution in #276
Full Changelog: v0.2.3...v0.2.4
Release v0.2.3
Highlights
- Installable packages: release assets now include validated AMD64 Debian packages for PostgreSQL 17 and 18.
- Public evaluation images:
ghcr.io/microsoft/pg_durableprovides PostgreSQL 17 and 18 images for learning and evaluation. - Documentation website: refreshed guides, examples, terminology, and security guidance make pg_durable easier to evaluate and operate.
Reliability and Security
- Empty SQL condition results now evaluate as false, and graph depth, graph size, and connection timeouts are bounded.
- Non-finite SQL floats map safely to JSON
null, and execution-history lookup failures are surfaced instead of hidden. - Published container images include hardened permissions, provenance, and SBOM attestations.
Upgrade Notes
Fresh installs use the _duroxide provider schema; upgraded installations keep the existing duroxide schema automatically. No operator action is required.
Acknowledgements
Thanks to everyone who contributed to this release: Abraham Omorogbe (@AbeOmor) Prashant Chinnam (@crprashant) Gourav Suresh (@darkdevil3610) Ismaël Mejía (@iemejia) Pino de Candia (@pinodeca) Todd J. Green (@tjgreen42).
New Contributors
- Abraham Omorogbe (@AbeOmor) made their first contribution in #194
- Gourav Suresh (@darkdevil3610) made their first contribution in #211
Full Changelog: v0.2.2...v0.2.3