RemotiveTopology framework
0.20.0 - 2026-06-15
- LinNamespace no longer automatically populated the cache with all frames. You must now explicitly configure which frames to cache via cache_config.
Features
-
LinNamespace cache population is configured with cache_config
- BREAKING: LinNamespace no longer automatically populated the cache with all frames. You must now explicitly configure which frames to cache via cache_config.
Previously, LinNamespace automatically populated the LIN cache with all frames on open(), even frames not belonging to this ECU. This behavior is now controlled by the cache_config parameter, which fixes the problem and also allows more fine-grained control over the cache seeding.
0.19.3 - 2026-06-10
Bug fixes
-
docs: Tuck the theme toggle and version nav into the hamburger menu
On small screens the fixed-position toggle and version nav overlapped pdoc's hamburger button. Render them in the nav footer (new module.html.jinja2) so on mobile they sit inside the opened hamburger menu; on desktop they still float top-right as before.
Addresses the same overlap as remotiveplatform-docs ac8c76c.
-
Make it easier to import FMUBehavioralModel etc
Documentation
- Refresh CLAUDE.md files to match current workspace
0.19.2 - 2026-05-26
Features
- New FMUBehavioralModel
0.19.1 - 2026-05-22
Features
- topology: Publish versioned API docs via sync-docs action
0.19.0 - 2026-05-22
Features
-
Metrics package is no longer optional, all related packages are always included
Keep the [metrics] for backward compat, we can remove later if we want to
-
Removed optional backwards compat, [metrics] not longer supported
0.18.0 - 2026-05-20
Features
-
release: Add ECU-simulations release plugin and tooling
Adds a
release/plugin for basecamp'sremotive-releaseCLI driving two release flows for this repo, both kicked off by tag push:-
remotive-release ecu-simulations topology-python-framework releasebumpsremotivelabs-topology/pyproject.toml, regeneratesCHANGELOG.md, validatesuv build, commits, tagsremotivelabs-topology-v<ver>, and pushes. -
remotive-release ecu-simulations topology-examples releasetags the current HEAD withremotivelabs-topology-examples-v<ver>. The examples bundle has no source-of-truth version file; the version lives in git tags only. Before tagging, the command interactively bumpsremotivelabs-topology/remotivelabs-brokerpins acrossexamples/**/pyproject.toml— queries PyPI for available versions, prompts per package, re-locks each affected example, runs./run.py projects lint/test --prodand./run.py topologies generateagainst affected example roots, and lands the bumps as a singlechore(examples): bump deps (...)commit ahead of the tag step. Mirrorssignalbroker_release.topology.bump_docker_versions.
Both publish workflows trigger exclusively on tag push — the CLI's
git push <tag>is the only entry point. workflow_dispatch is not supported.Topology docs build:
- pdoc is now invoked via a
poe docs-buildtask scoped toremotivelabs.topology(the oldpoe docs, since renamed topoe docs-serve, ranpdoc remotivelabsand would have leaked sibling-namespace symbols likeremotivelabs.broker). The publish workflow'sbuild-docsjob calls the new task and uploads a versioned tree as theremotivelabs-topology-docs-<version>artifact (wasdocumentation). Publishing to docs.remotivelabs.com is intentionally deferred; the artifact is the deliverable until a hosting target is wired up. - The PEP 723
docs/build.pyscript and the poetry/Docker-era docs scripts (build_api_docs.sh,run_dev_server.sh,docker/) are removed; the new poe tasks cover their use cases.
Examples publishing:
examples/deploy-examples.shis replaced withexamples/export.py, a PEP 723 uv-script invoked by CI and devs. It honours the same.examples-rsync-filteras before.
Workspace and dev-doc cleanup:
run.py's project discovery skipsrelease/.remotivelabs-topology/release/README.mdandexamples/DEVELOPMENT.mdare removed; their content lives in the root README under## Release.- GitHub Action versions bumped to clear the Node 20 deprecation
warning:
actions/checkout@v6,astral-sh/setup-uv@v8.
The plugin is registered in basecamp via a separate commit on the basecamp repo's
mainbranch. -
-
topology: Add LinNamespace
Encapsulates LIN-specific behavior that previously leaked into ECUMock: type validation on open, automatic broker-side cache priming with each signal's database start_value, header subscription, and set_schedule.
ECUMock now dispatches on broker namespace type to the protocol-specific namespace class (CanNamespace/LinNamespace/SomeIPNamespace/ ScriptedNamespace), falling back to GenericNamespace for unknown types. The LIN init-cache loop is gone since LinNamespace.open() handles it.
Example LIN ECUs (rl, rlcm, polestar_backlight) updated to use LinNamespace and inherit BehavioralModel directly.
Also fix subtle bugs in someip tests surfacing when bumping broker version from 1.19 to 1.24 in integration tests.
0.17.0 - 2026-05-13
- topology: Register input handlers directly on namespaces
Bug fixes
-
topology: Restore subscription metrics on SubscriptionMonitor
The frames-received counter and handler-duration histogram lived in NamespaceClient until the namespace refactor (61717812) deleted that class — the metrics went with it. SubscriptionMonitor is the new shared home for subscription plumbing, so move the instrumentation there. Both BehavioralModel input handlers and direct namespace subscriptions now emit the same metrics.
Also:
- plumb
callback_labelthrough Namespace._subscribe so input handlers surface their handler name (not the internal_wrappedclosure) in thecallbacktag of handler.duration - bind handler.duration to second-scale buckets via a View; the OTel SDK
ignores
explicit_bucket_boundaries_advisoryand falls back to ms-scale defaults, which collapses sub-5ms latencies into one bucket and makes histogram_quantile return the bucket midpoint - regression test asserts second-scale histogram buckets in the export
- plumb
-
Install [metrics] extras in topology docker image
Features
-
topology: Register input handlers directly on namespaces
- BREAKING: register input handlers directly on namespaces
Users can now attach input handlers to a namespace without routing them through a BehavioralModel. Filters + callback go straight onto the namespace (via constructor or
subscribe_input_handler), using the same FrameHandler pipeline as BM — so signal filters and named-value decoding behave identically on both paths. This makes standalone namespaces useful on their own and keeps one mental model for input handling.Under the hood, every namespace now owns a SubscriptionMonitor in the base class that runs each callback in its own task with centralized exception propagation. BehavioralModel wires its input_handlers through the same monitor instead of reimplementing subscription management, which let us delete NamespaceClient entirely.
- add
SubscriptionMonitor(namespaces/monitor.py) and move shared subscription plumbing onto theNamespacebase class - add
subscribe_input_handler/unsubscribe_input_handlerand aninput_handlersconstructor param onGenericNamespace - define
InputHandlerSpecalongsideInputHandlerin input_handlers.py so BM and namespaces share one definition - replace per-subclass
open()overrides with a_validate(info)hook on the base, removing duplicateget_namespace()round-trips - delete
NamespaceClient;BehavioralModelnow owns namespace lifecycle directly (breaking for any external NamespaceClient users) - add unit tests for the new API and an integration test that asserts namespace- and BM-level input handlers coexist on the same namespace
0.16.0 - 2026-04-29
Features
-
Accept (SignalName, SignalValue) tuples in publish() and TransactionContext
GenericNamespace.publish() now accepts tuples alongside WriteSignal, consistent with the existing pattern in Restbus.update_signals() and TransactionContext.update(). TransactionContext.updates field type widened to match what .update() already accepted.
-
Intrumenting python libs with open-telemetry and prometheus
Intial metrics that we can build upon. Grafana dashboard in signal-broker gets copied during generate.
0.15.0 - 2026-04-23
- topology: Subscriptions no longer deliver every frame by default.
Callbacks that relied on firing on unchanged frames (e.g. for cycle-time
heartbeats) must opt back in by passing
on_change=False.
Bug fixes
- Subscribe_frames() now respects constructor decode_named_values
Documentation
-
topology: Cover on_change default and E2eSignalsFilter usage
-
Add module h1/h2 headers and includable content markers
Introduces
<!-- start-include -->/<!-- end-include -->HTML comment markers in module docstrings so parent modules can pull in just the relevant sections via:start-after:/:end-before:instead of:start-line:/ literal-quote boundaries. Also promotes module docstring titles to h1 and structures longer docstrings with h2 section headers so the module-level pdoc page reads as a standalone page, while included excerpts remain header-free where appropriate. -
Include input handlers in docs
- Snippet was never included
Features
-
topology: Add input_filters to BehavioralModel
BehavioralModel accepts a cross-cutting input_filters sequence that is appended to every input handler via a new InputHandler.extend_filters hook. Useful for cross-cutting concerns like excluding E2E signals:
input_filters=[E2eSignalsFilter(exclude=True)].Re-export E2eSignalsFilter, FrameSignalFilter.
-
topology: Default BehavioralModel to use on changed
- BREAKING: subscriptions no longer deliver every frame by default.
Callbacks that relied on firing on unchanged frames (e.g. for cycle-time
heartbeats) must opt back in by passing
on_change=False.
BehavioralModel and NamespaceClient accept an
on_changeoption, defaulting to true (OnChangeMode.MERGED) so subscriptions only deliver frames whose subscribed signals actually changed. - BREAKING: subscriptions no longer deliver every frame by default.
Callbacks that relied on firing on unchanged frames (e.g. for cycle-time
heartbeats) must opt back in by passing
-
Added anchor to headers in pydocs
0.14.0 - 2026-04-14
Bug fixes
-
Tester images now correctly installs dev version of lib
Also removes duplicate filters implementation to use filters from broker lib instead. The current filters module is kept as a proxy module for backwards compability.
Features
-
testing: Replace SignalValueAccumulator with Capture-based test helpers
Introduces a composable testing API for asserting async signal sequences:
Capture[T]— generic async iterator consumer with stateful cursor and retry-based waiting; replaces the old SignalValueAccumulator patterncapture_frames()/wait_for_frame()/wait_for_frames()/wait_for_signal_value()/wait_for_signal_values()inframes.pycapture_events()/wait_for_event()/wait_for_event_parameter_values()insome_ip.pyfor SOME/IP event assertions- Refactors
retryinto a standalone generic utility (removes hamcrest dependency from the retry path) - Deletes
SignalValueAccumulator,async_utils, and the oldawait_at_mostaccumulator pattern
All integration and example tests updated to use the new API.
0.13.1 - 2026-04-01
Documentation
- Improved docs
0.12.0 - 2026-01-27
Features
-
Default initial_empty to True in subscribe calls
In a flow when the user wants to
- Subscribe to a signal
- Do something
- Verify that the signal was received The subscribe needs to be blocking until the broker has done what it should do, e.g. in some/ip do a subscribe call
Refactor
-
Filters now works with built-ins
remotivelabs.topology.namespaces.filters now works with python built-in functions like
filter().
0.10.0 - 2025-10-15
Bug fixes
-
Clean up scripted namespace
Remove some parts that were copied from generic namespace but are not relevant for scripted.
-
Update scripted namespace documentation
Features
- topology: Add support for scripted namespace in namespace client
0.9.4 - 2025-10-09
Bug fixes
- Added link to license in root
- Dont use symlink for license in private examples
- Simple NamespaceClient
- BehavioralModel error when missing virt
0.9.3 - 2025-08-28
Bug fixes
- Fix dependencies that could be considered circular
0.9.2 - 2025-08-27
Bug fixes
-
remotivelabs-topology: Bump broker version
- fix accidental breaking change
-
Handle empty event
-
Import statements
- import from leafe inside own module
Documentation
- Added examples to documentation
Features
- Add BCM reboot to lighting and steering
- BehavioralModel args only parses known args
0.9.1 - 2025-06-10
Documentation
- Moved docs from docs.remotivelabs to examples
0.9.0 - 2025-06-09
Documentation
-
Added snippets to package and docs to init.py
- So that it is possible to generate docs from the wheel