Skip to main content

RemotiveTopology framework

0.20.0 - 2026-06-15

Breaking changes
  • 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's remotive-release CLI driving two release flows for this repo, both kicked off by tag push:

    • remotive-release ecu-simulations topology-python-framework release bumps remotivelabs-topology/pyproject.toml, regenerates CHANGELOG.md, validates uv build, commits, tags remotivelabs-topology-v<ver>, and pushes.

    • remotive-release ecu-simulations topology-examples release tags the current HEAD with remotivelabs-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 bumps remotivelabs-topology / remotivelabs-broker pins across examples/**/pyproject.toml — queries PyPI for available versions, prompts per package, re-locks each affected example, runs ./run.py projects lint/test --prod and ./run.py topologies generate against affected example roots, and lands the bumps as a single chore(examples): bump deps (...) commit ahead of the tag step. Mirrors signalbroker_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-build task scoped to remotivelabs.topology (the old poe docs, since renamed to poe docs-serve, ran pdoc remotivelabs and would have leaked sibling-namespace symbols like remotivelabs.broker). The publish workflow's build-docs job calls the new task and uploads a versioned tree as the remotivelabs-topology-docs-<version> artifact (was documentation). 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.py script 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.sh is replaced with examples/export.py, a PEP 723 uv-script invoked by CI and devs. It honours the same .examples-rsync-filter as before.

    Workspace and dev-doc cleanup:

    • run.py's project discovery skips release/.
    • remotivelabs-topology/release/README.md and examples/DEVELOPMENT.md are 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 main branch.

  • 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

Breaking changes
  • 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_label through Namespace._subscribe so input handlers surface their handler name (not the internal _wrapped closure) in the callback tag of handler.duration
    • bind handler.duration to second-scale buckets via a View; the OTel SDK ignores explicit_bucket_boundaries_advisory and 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
  • 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 the Namespace base class
    • add subscribe_input_handler / unsubscribe_input_handler and an input_handlers constructor param on GenericNamespace
    • define InputHandlerSpec alongside InputHandler in input_handlers.py so BM and namespaces share one definition
    • replace per-subclass open() overrides with a _validate(info) hook on the base, removing duplicate get_namespace() round-trips
    • delete NamespaceClient; BehavioralModel now 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

Breaking changes
  • 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_change option, defaulting to true (OnChangeMode.MERGED) so subscriptions only deliver frames whose subscribed signals actually changed.

  • 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 pattern
    • capture_frames() / wait_for_frame() / wait_for_frames() / wait_for_signal_value() / wait_for_signal_values() in frames.py
    • capture_events() / wait_for_event() / wait_for_event_parameter_values() in some_ip.py for SOME/IP event assertions
    • Refactors retry into a standalone generic utility (removes hamcrest dependency from the retry path)
    • Deletes SignalValueAccumulator, async_utils, and the old await_at_most accumulator 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

    1. Subscribe to a signal
    2. Do something
    3. 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