diff --git a/planning/releases/0.10.4.md b/planning/releases/0.10.4.md new file mode 100644 index 0000000..c72bd85 --- /dev/null +++ b/planning/releases/0.10.4.md @@ -0,0 +1,60 @@ +# faststream-outbox 0.10.4 — internal refactors + richer PyPI metadata, no behavior change + +**Patch release.** Every change to the installed package is an **internal refactor** — +the runtime behaves identically to 0.10.3 (same producer, subscriber, lease/terminal-write, +timer, DLQ, and validation behavior). The one user-visible change is **richer PyPI package +metadata**. Drop-in upgrade. + +## Internal refactors (no behavior change) + +These deepen the codebase without changing any observable behavior; they exist to remove +duplication and concentrate logic, verified by the unchanged test suite (and a new +cross-adapter contract suite). + +- **Outbox rules de-duplicated between the real and fake clients.** The genuinely-shared + pure bits are now single-sourced — `_scheduling.py` (activate-args resolution + + validation, shared by the real and fake publish paths) and `_DLQ_PROJECTION` in + `schema.py` (one declarative outbox→DLQ column map both the real DLQ CTE and the fake + build from). The rules that must run server-side in Postgres (eligibility, lease cutoff, + retry timing) stay as two implementations but are now **co-verified** by a single + parametrized contract suite run against both the real client and the in-memory fake. + ([#109](https://github.com/modern-python/faststream-outbox/pull/109)) +- **Lease-lost telemetry has one home.** The byte-identical detect→log→emit block that the + terminal and retry flush paths each carried is consolidated into a single + `_emit_lease_lost(row, *, phase)` helper. ([#110](https://github.com/modern-python/faststream-outbox/pull/110)) +- **`OutboxSubscriberConfig` validates itself.** Subscriber-knob validation moved from the + factory into `OutboxSubscriberConfig.__post_init__`, so *every* construction path is + guarded, not just `@broker.subscriber`. Behavior is preserved exactly; warning + attribution (the warning points at your `@subscriber` call site) is now computed via a + manual stacklevel walk so it's robust across CPython 3.13/3.14 and the FastAPI-router + path. ([#111](https://github.com/modern-python/faststream-outbox/pull/111)) + +## Packaging + +- **Richer PyPI metadata** — keywords, classifiers, and project URLs. Better + discoverability and project links on the PyPI page; no install-time or runtime effect. + ([#108](https://github.com/modern-python/faststream-outbox/pull/108)) + +## Migration + +None. Drop-in upgrade from 0.10.x — no public-API change, no schema change, no config +change. If you don't construct `OutboxSubscriberConfig` directly (the normal case), nothing +about your code changes; if you *do*, it now validates on construction (rejecting the same +impossible values the factory always rejected). + +## Touched surface + +- **Package code (internal only):** `faststream_outbox/_scheduling.py` (new), + `publisher/producer.py`, `broker.py`, `schema.py`, `client.py`, `testing.py`, + `subscriber/usecase.py`, `subscriber/config.py`, `subscriber/factory.py`. +- **Packaging:** `pyproject.toml` (metadata only). +- **Tests:** `tests/test_client_contract.py` (new, cross-adapter contract), plus updates + to `tests/test_unit.py`, `tests/test_fake.py`, `tests/test_integration.py`. +- **Living docs:** `CLAUDE.md`, `architecture/dlq.md`, `architecture/test-broker.md`. + +## See also + +- [#108](https://github.com/modern-python/faststream-outbox/pull/108) — PyPI metadata. +- [#109](https://github.com/modern-python/faststream-outbox/pull/109) — rules de-duplication + client contract suite. +- [#110](https://github.com/modern-python/faststream-outbox/pull/110) — lease-lost telemetry consolidation. +- [#111](https://github.com/modern-python/faststream-outbox/pull/111) — self-validating subscriber config.