[0.19.0] — 2026-04-03
Added
-
Configurable Kafka commit policies (
errorHandling.commitPolicy).
Three modes are available for Kafka-source flows:Policy Offset committed when… sinkSink delivery succeeds (strict; pipeline stalls on failure) sink_or_dlqSink succeeds or DLQ write succeeds (default) kafka_transactionAtomically with the sink produce (EOS) The default when
commitPolicyis omitted issink_or_dlq, preserving
backward-compatible behaviour for existing flows. -
Transactional exactly-once semantics (EOS) for Kafka-to-Kafka flows
viacommitPolicy: kafka_transaction. Uses franz-go's
GroupTransactSessionto wrap the consumer-offset commit and the sink
Producein a single Kafka transaction. Requires:source.type: kafkaandsink.type: kafkaon the same cluster.errorHandling.transactionalIdset to a unique, stable identifier
per consumer instance.
-
errorHandling.transactionalIdconfig field — required when
commitPolicy: kafka_transaction; validated at startup. -
internal/deliverypackage — new package exposing:CommitPolicytype with constantssink,sink_or_dlq,
kafka_transaction.NormalizeCommitPolicy/ValidateCommitPolicyhelpers.WithKafkaTransactionalProducer/KafkaTransactionalProducerFromContext
for propagating a transactional producer through the call stack via
context.Context.
-
E2E tests for all commit policy modes in
test/e2e/kafka-commit-policies/:sink— verifies delivery and consumer-group lag reaches zero.sink_or_dlq— verifies good messages reach the sink and deliberately
failed messages land in the DLQ topic.kafka_transaction— verifies committed messages appear in the sink
topic underread_committedisolation.
-
all-tests-passingCI gate job — lightweight job that depends on
every other CI job. The branch-protection ruleset formainnow
requires only this single check, automatically covering all current and
future jobs. -
Example flow configs in
examples/flow/kafka-commit-policies/with
thorough inline comments explaining each policy's trade-offs and
operational requirements.
Fixed
-
fiso-wasmer-aiosink type switch — added missingdefaultbranch;
previously an unrecognised sink type would silently leave the sink as
nil, causing a nil-pointer panic insidepipeline.New. -
fiso-wasmer-aioDLQ publisher — replaced the no-op DLQ publisher
stub with a realkafka_source.NewPublisherfor Kafka-source flows,
matching the behaviour offiso-flowandfiso-flow-wasmer. -
fiso-wasmer-aioWASM factory — movedwasmruntime.NewFactory()
outside the interceptor loop so the factory is created once and reused
across all WASM interceptors instead of once per interceptor. -
Lint (SA1012) —
internal/delivery/tx_context_test.gonil-context
guard test now carries a//nolint:staticcheckdirective; the function
explicitly handlesnilas a valid input and the test is intentional.
Security
- Go 1.25.8 — upgraded the Go toolchain in
go.modand all CI jobs
from 1.25.7 to 1.25.8, which fixes three standard-library CVEs:GO-2026-4601: incorrect parsing of IPv6 host literals innet/url.GO-2026-4602:FileInfocan escape from aRootinos.GO-2026-4603: URLs in<meta>content attribute not escaped in
html/template.
Changed
- All Go dependencies updated to their latest available versions
(go get -u ./... && go mod tidy). Notable upgrades include
go.opentelemetry.io/otelv1.35 → v1.43,
google.golang.org/grpcv1.74-dev → v1.80,
go.temporal.io/sdkv1.39 → v1.41, and
sigs.k8s.io/controller-runtimev0.22 → v0.23.
Full Changelog: v0.18.0...v0.19.0