release: 0.22.0 (root capabilities, extend, idempotent materialization) - #71
Merged
Conversation
Bumps __version__ to 0.22.0 (single source of truth), promotes Unreleased to [0.22.0], and adds the tag link definition. #64 node_id callable, so one device can carry two instances of a capability #65 DeviceTreeBuilder contract: model ownership, and the limit of add()'s ordering #66 the builder replaced properties in a model it does not own, discarding live values, callbacks and entity_setters. A producer that wired inbound control lost the actuator while $description kept advertising settable: true. Data loss in 0.21.0's headline feature. #67 a child could silently shadow an ancestor's id, or a sibling's, putting two devices on the same topics. Plus the feature it was filed for: add_root_capabilities(), so a root can carry its own capabilities rather than only parenting children. #68 extend(), so a device that already exists can grow a capability. The previous workaround dropped properties from $description while leaving their retained topics on the broker. Minor rather than patch: three new public methods. #66's fix is the reason not to sit on it, since 0.21.0 is live with that data loss. Materialization is now idempotent at three levels (node, property, and the state transition itself), which is what makes a re-fired incremental lifecycle a genuine no-op. The third matters most: an empty state_transition still emits init -> ready, and that edge forces every controller on the bus to resync. 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__to 0.22.0, promotes[Unreleased]to[0.22.0], adds the tag link. No code changes.node_idcallable, so one device can carry two instances of a capabilityDeviceTreeBuildercontract: model ownership, and the limit ofadd()'s orderingentity_setters. A producer that wired inbound control lost the actuator while$descriptionkept advertisingsettable: true.add_root_capabilities(), the feature it was filed for.extend(), so an existing device can grow a capability. The previous workaround dropped properties from$descriptionwhile leaving their retained topics on the broker.Minor rather than patch: three new public methods. #66 is the reason not to sit on it, since 0.21.0 is live with that data loss.
Worth reading in the diff
Materialization is now idempotent at three levels: the node, the property, and the state transition itself. That last one is the substantive change. An empty
state_transition()still emitsinitthenready, and that edge forces every controller on the bus to resync, so a re-declaration that changes nothing must not cost one. Found by a test assertingextend()publishes nothing on a re-declare, which got two publishes: the content was already idempotent, the state flap was not.Verification
ruff check/ruff format --checkclean; markdownlint cleanpython -m buildproduces both artifacts; wheelMETADATAreadsVersion: 0.22.0ebus_sdk.__version__,pyproject.toml's dynamic attr, and thesetup.pyregex shim🤖 Generated with Claude Code