Skip to content

release: 0.20.0 (publish-on-change gate + declare_lost teardown) - #54

Merged
dcj merged 1 commit into
mainfrom
release/0.20.0
Aug 13, 2026
Merged

release: 0.20.0 (publish-on-change gate + declare_lost teardown)#54
dcj merged 1 commit into
mainfrom
release/0.20.0

Conversation

@dcj

@dcj dcj commented Aug 13, 2026

Copy link
Copy Markdown
Contributor

Top of the stack. Merge order: #51#52#53 → this.

Bumps __version__ to 0.20.0 (the single source of truth; pyproject.toml reads it dynamically and the setup.py shim parses the same literal), promotes the Unreleased section 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() and stop(announce=False) (#46). Device modeled three teardowns and implemented one. A producer that knows it is dying can now announce lost instead of announcing disconnected (a lie) or reaching around the SDK to its client — which is what ebus-panel-sim had 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

  • 596 tests pass (560 at 0.19.0), ruff check + ruff format --check clean on 0.16.1, every Markdown file passes markdownlint.
  • python -m build produces ebus_sdk-0.20.0.tar.gz and ebus_sdk-0.20.0-py3-none-any.whl with Version: 0.20.0, so the publish workflow's tag-equals-version check will pass for v0.20.0.
  • Both feature branches were mutation-tested: every load-bearing line fails at least one test when broken.

Pushing the v0.20.0 tag after this merges is what triggers the PyPI publish.

🤖 Generated with Claude Code

@dcj
dcj force-pushed the docs/correct-stale-claims branch from 6f80238 to 301c07b Compare August 13, 2026 06:34
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>
@dcj
dcj changed the base branch from docs/correct-stale-claims to main August 13, 2026 06:35
@dcj
dcj merged commit 67300e0 into main Aug 13, 2026
5 checks passed
@dcj
dcj deleted the release/0.20.0 branch August 13, 2026 06:39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant