v0.4.1
Ops hygiene for long-running deployments
Clean shutdown everywhere. aclose() on both bridge adapters, WebhookBackend, WebhookChannel, and ElevenLabsChannel, plus AgentApp.aclose() (unwraps the redactor, closes pooled and injected adapters and the handover backend) and ChannelHub.aclose(). Embedders that build and discard apps (tests, notebooks, workers) no longer leak connection pools.
Production metrics stay production. scorecard and feedback auto-capture skip eval-/synthetic- prefixed sessions by default (opt out via exclude_session_prefixes), so CI runs and nightly synthetics can't pollute SARR.
Redacted training exports. export_dataset(redactor=...) and zolva export-dataset --redaction mask PII in the fine-tuning JSONL while the database keeps the true transcripts.
Blocked channel traffic escalates. A guardrail block at the channel boundary now routes through the public AgentApp.escalate(), the same degrade-to-humans contract as blocks inside the agent loop.
Also: PyPI sidebar links (docs, repo, changelog, issues) in the project metadata.
249 tests, mypy --strict, ruff, bandit clean.