release: 0.20.0 (publish-on-change gate + declare_lost teardown) - #54
Merged
Conversation
dcj
force-pushed
the
docs/correct-stale-claims
branch
from
August 13, 2026 06:34
6f80238 to
301c07b
Compare
Two API-visible changes, both minor-bump-worthy. Property values are no longer republished when the wire payload is unchanged (#50). The comparison is on the final payload, after rounding, coercion and empty-string encoding, so it catches what a caller cannot see for itself. The retained state on the broker is byte-for-byte identical; there are simply fewer messages. Non-retained (event) properties are never gated, retraction always publishes, and every whole-tree republish forces, so a broker restarted with an empty retained store is still fully repopulated. Device.declare_lost() and Device.stop(announce=False) close the teardown gap (#46): a producer that knows it is dying can now say so instead of announcing `disconnected` or reaching around the SDK to its client. Also corrects four stale documentation claims found along the way, including a README dependency floor that had been wrong since 0.18.0. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Bumps
__version__to0.20.0(the single source of truth;pyproject.tomlreads it dynamically and thesetup.pyshim parses the same literal), promotes theUnreleasedsection to[0.20.0], and adds the compare/tag link definitions — which nothing in CI verifies, so they are the easy ones to forget.What's in it
Publish-on-change for property values (#50). A retained property whose wire payload is byte-identical to the one it last published is no longer republished. The comparison is on the final payload, after rounding, coercion and empty-string encoding, which is why the SDK owns it: a caller holding a raw reading cannot know whether it will change what goes on the wire. The retained state on the broker is byte-for-byte identical either way; there are simply fewer messages. Non-retained (event) properties are never gated, retraction always publishes, and every whole-tree republish forces, so a broker restarted with an empty retained store is still fully repopulated.
declare_lost()andstop(announce=False)(#46).Devicemodeled three teardowns and implemented one. A producer that knows it is dying can now announcelostinstead of announcingdisconnected(a lie) or reaching around the SDK to its client — which is whatebus-panel-simhad to do, and where four downstream bugs came from.Four stale doc claims corrected (#53), including a README dependency floor that had been wrong since 0.18.0. The local build confirms the fix:
Requires-Dist: ebus-mqtt-client>=0.4.0.Pre-flight
ruff format --checkclean on 0.16.1, every Markdown file passes markdownlint.python -m buildproducesebus_sdk-0.20.0.tar.gzandebus_sdk-0.20.0-py3-none-any.whlwithVersion: 0.20.0, so the publish workflow's tag-equals-version check will pass forv0.20.0.Pushing the
v0.20.0tag after this merges is what triggers the PyPI publish.🤖 Generated with Claude Code