RemotiveTopology framework
0.21.0 - 2026-07-03
Bug fixes
-
Updated LICENSE text
-
(remotive-topology-lib) Skip e2e signals when initializing LIN cache
Since LIN namespaces can force e2e signal values, initializing them might break the e2e functionality.
Features
-
release: Render commit bodies and decouple changelog publishing
The dev changelog now renders each commit body beneath its subject. A dedicated workflow publishes the checked-in topology changelog to the docs site on push to main, so the release workflow only publishes the versioned API docs. README recommends the basecamp commit-msg hook.
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
0.19.2 - 2026-05-26
Features
- New FMUBehavioralModel
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
-
Removed optional backwards compat, [metrics] not longer supported
0.18.0 - 2026-05-20
Features
-
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
-
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
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
- 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