0.4.3 (July 3, 2026)¶
This release hardens checkpoint and DLQ correctness, improves worker and health server lifecycle safety, and promotes several runtime helpers to public API status so integrations and tests can rely on supported accessors instead of white-box internals.
Runtime correctness¶
- Middleware failures that cannot be durably routed to the DLQ no longer allow later records to advance checkpoint state past the unresolved failure.
- Fail-closed batch delivery now stops at the first unrouted failed record in a failed batch instead of letting later records in that batch advance checkpoints or success hooks.
- Sink write result normalization now returns fresh per-record
WriteResultobjects instead of reusing shared mutable success or error state.
Recovery and state¶
- DLQ replay no longer increments replay attempts when replay pipeline construction fails before the retry can actually run.
- SQLite DLQ storage now upgrades legacy schemas in place to add retry-tracking
columns such as
attemptandmax_attempts. - Memory and SQLite state backends now ignore expired entries in
count_prefixresults. - In-memory dedup LRU tracking now respects TTL expiry, and HTTP cache stats no longer count expired rows as live cache entries.
Worker and health lifecycle¶
WorkerPoolnow rejects duplicate pipeline registration by object identity orpipeline_id.- Worker startup cleans up coordinator state, signal handlers, and background tasks correctly when partial initialization fails.
- Worker live metrics and lease-gating hooks now compose with user-provided callbacks instead of overwriting them.
Schedule.wait_after_skip()keeps skipped interval and cron runs on their configured cadence while still preventing hot-spin for continuous schedules.HealthServernow returns405 Method Not Allowedfor non-GETrequests, authenticates only/health,/metrics, and/ready, and can be stopped and started again safely on the same instance.
Public API and typing¶
Pipeline.pipe()andMiddlewareChainnow expose tighter middleware typing via public middleware protocols.BoundPipeline.configis now a public accessor for the normalized runtime configuration.PipelineContextnow exposestrace_depth,start_trace_span(), andfinish_trace_span().MetricsCollector.pipeline_stats()andMetricsCollector.pipeline_stats_map()are now public snapshot accessors, withget()andall()retained as compatibility aliases.AIMiddleware.provider,AIMiddleware.cache, andAIMiddleware.render_prompt()are now supported public helpers.WorkerPool.health_portis now exposed as a public property.
Upgrade notes¶
- No config migration is required for existing
0.4.xpipelines. - SQLite-backed DLQ and state stores are upgraded in place when opened.
- Teams with custom middleware extensions may see stricter type-checking around
Pipeline.pipe()andMiddlewareChain; adopting the public middleware protocols is the forward-compatible path.