Release v0.1.7
Focus
Runtime correctness, API clarity, and docs overhaul.
Runtime Fixes
- Buffered pipeline: bare
await futurein_commit_next_buffered_recordbypassed DLQ routing on middleware failure — removed - Buffered pipeline: producer
finallyblock usedawait put()which could block on cancellation, leaving consumer stuck — switched toput_nowait - Checkpoint:
LOG_AND_CONTINUEpath did not callmark_saved(), causing retry storm on every subsequent record after a failed save - Delivery:
on_successhook fired underLOG_AND_CONTINUEeven when both sink and DLQ writes failed — hook now only fires when the record was durably routed - Retry:
asyncio.iscoroutinemissedFuture/Taskawaitables inon_retrycallbacks — replaced withinspect.isawaitable - Span stack:
_PipelineSpanScope.__exit__popped without identity check — silent corruption on out-of-order exits - Checkpoint load: corrupted checkpoint data raised bare
KeyErrorwith no context — now raises descriptiveTypeError - Health server:
writer.close()withoutawait writer.wait_closed()leaked file descriptors under high connection rates - Runner: cancelled pipeline run stored a synthetic
CancelledErrorinRunRecord.error, discarding the original traceback
API Clarity
- Removed phase-scoped headers and forward-looking language from
dlq.py,writer.py,registry.py,state/backend.py,schema/metrics.py - Fixed
0.1.4changelog entry — was labeled "planned hardening release"
Docs
Full docs overhaul: new guides/ section covering pipelines, failure handling, checkpointing, scheduling, testing, and observability. Reference pages restructured with decision tables and common mistakes. mkdocs.yml nav updated.