# Changelog
## 0.8.0.0 — 2026-06-15
### Breaking Changes
- `PgmqAdapterConfig` gained a `pollRetry :: PollRetryConfig` field. Callers
that construct the config by record literal must add it (or start from a
smart constructor / default that includes it).
- `pgmqAdapter` now requires `Error PgmqRuntimeError :> es` in its effect row
so transient poll errors can be caught and retried before being rethrown.
### Bug Fixes
- Transient PGMQ poll errors are retried with bounded exponential backoff
before the adapter gives up. The default policy makes five total attempts,
starting at 100ms and capping at five seconds. Permanent errors and
exhausted retry budgets still surface to shibuya supervision.
## 0.7.0.0 — 2026-06-05
Paired with `shibuya-core 0.7.0.0`.
### Breaking Changes
- Tracks the new `Envelope.headers :: Maybe Headers` field added in
`shibuya-core 0.7.0.0`. `pgmqMessageToEnvelope` sets it to `Nothing`:
pgmq does not deliver an ordered, duplicate-allowing raw broker-header
stream. The per-message JSONB `headers` object is unordered user
metadata and is consumed only to derive `partition` and
`traceContext`, so it is deliberately not re-presented as broker
headers. Callers that construct `Envelope` by record literal (e.g.
test fixtures) must add `headers = Nothing`. A `Future:` note in
`Shibuya.Adapter.Pgmq.Convert` records the option of surfacing
producer-supplied pgmq headers later — deferred because the JSONB
object's unordered, unique-key shape maps lossily onto the ordered,
duplicate-allowing `Headers` type.
### Compatibility
- Requires `shibuya-core ^>=0.7.0.0` for the `headers` field on
`Envelope`. The bound is bumped in the library and test stanzas.
- Lowers `cabal-version` from `3.14` to `3.12` so Nix toolchains with an
older bundled Cabal can build the adapter. No package-description
syntax requiring 3.14 was in use.
### Tests
- `Shibuya.Adapter.Pgmq.ConvertSpec` gains two cases asserting `headers`
is `Nothing`, including one where the pgmq JSONB `headers` object is
non-empty.
## 0.6.0.0 — 2026-05-31
Paired with `shibuya-core 0.6.0.0`.
### Compatibility
- Upgrades the adapter package to the current dependency family:
`shibuya-core ^>=0.6.0.0`, `pgmq-core ^>=0.3`,
`pgmq-hasql ^>=0.3`, `pgmq-effectful ^>=0.3`, and
test-only `pgmq-migration ^>=0.3`.
- No adapter API changes were required. `pgmqAdapter` and the
`Envelope` conversion behavior remain the same.
### OpenTelemetry
- Shibuya processor spans now use the stable
`messaging.operation.type = "process"` key from
`shibuya-core 0.6.0.0`.
- PGMQ operation spans are provided by `pgmq-effectful 0.3.0.0`, which
builds on `hs-opentelemetry` 1.0 and supports old, stable, or
duplicate messaging/database semantic-convention attributes via
`OTEL_SEMCONV_STABILITY_OPT_IN`.
## 0.4.0.0 — 2026-04-29
Paired with `shibuya-core 0.4.0.0`.
### Additions
- Envelopes now carry the delivery `attempt` counter (from pgmq's
`readCount`, zero-indexed), enabling exponential backoff via
`Shibuya.Core.Retry`. The first delivery sees `Just (Attempt 0)`, the
first retry `Just (Attempt 1)`, and so on.
### Internal
- `nominalToSeconds` (in `Shibuya.Adapter.Pgmq.Internal`) now clamps to
the `Int32` range instead of silently wrapping. Misconfigured
retry/lease durations cap at ~68 years rather than producing
undefined behavior on the visibility-timeout offset passed to pgmq.
### Compatibility
- Requires `shibuya-core ^>=0.4.0.0` for the `Attempt` type and the
`attempt` field on `Envelope`.
## 0.3.0.0 — 2026-04-24
Upgraded to `pgmq-hs` 0.2.0.0 series
(`pgmq-core`, `pgmq-hasql`, `pgmq-effectful`, `pgmq-migration`
all at `0.2.0.0`).
### Breaking Changes
- Consumers that pin the `Pgmq.Effectful.PgmqError` name in their own
`runError` / `runErrorNoCallStack` stack must migrate to
`PgmqRuntimeError`. The old type is still re-exported as a
deprecated alias for one release.
- Spans emitted by the traced interpreter now follow OpenTelemetry
semantic-conventions v1.24. Span names (`"publish my-queue"`,
`"receive my-queue"`) and attribute keys (`messaging.operation`,
`messaging.system`, `messaging.destination.name`) have changed.
Dashboards and alerts keyed on the old names will need updating.
- Callers of `Pgmq.Effectful.Traced.sendMessageTraced` must pass an
`OpenTelemetry.Trace.TracerProvider` instead of an
`OpenTelemetry.Trace.Tracer`. If you only have a `Tracer` in scope,
use `OpenTelemetry.Trace.Core.getTracerTracerProvider` to derive the
provider.
### Other Changes
- No user-visible changes to `shibuya-pgmq-adapter`'s own API.
## 0.2.0.0 — 2026-04-22
Version bumped to track `shibuya-core` 0.2.0.0. No user-visible changes
to `shibuya-pgmq-adapter` itself.
## 0.1.0.0 — 2026-02-24
Initial release.
### New Features
- PGMQ adapter for PostgreSQL message queue integration
- Visibility timeout-based leasing with automatic retry handling
- Optional dead-letter queue support
- Configurable prefetching via PrefetchConfig
- Concurrent prefetching with streamly parBuffered
- OpenTelemetry trace context propagation
- Topic routing support (pgmq-hs 0.1.1.0)
- Comprehensive test suite with property-based and integration tests
### Bug Fixes
- Fix batch wastage using streamly unfoldEach