Skip to content

TopicForge 0.4.0

Choose a tag to compare

@yaniswav yaniswav released this 15 May 20:10
· 144 commits to main since this release

The DDS observability release: participant lifecycle tracking, per-topic metrics, and multi-format bag analysis, taking the read-only tool surface from eight to eleven tools.

Highlights

  • New participant lifecycle tracking (discovered/lost events) and a composite adapter that serves ROS2 and DDS tools from a single live process.
  • peek_dds_samples can now decode arbitrary user-defined DDS topics (not just the builtin discovery topics), reporting a full/partial/raw decode status per sample.
  • DDS backend auto-detection now probes eight vendor bindings in priority order and falls back to mock when none are present.
  • New per-topic metrics tool: observed frequency, sequence-gap count, and latency percentiles. Caveat carried into the tool description: neither the Cyclone nor Fast DDS Python bindings expose sample-receive callbacks, so metrics only accumulate opportunistically, as peek_dds_samples is called on that topic.
  • analyze_bag enriched with format detection, recording duration, and embedded-participant info; a new tool peeks decoded samples directly out of a recorded bag file for post-mortem inspection.
  • A real-bus integration test rig (Docker Compose, per-vendor publisher scripts) was added for maintainer validation; it runs on a manually-triggered CI workflow, not on every push.

Known limitations

  • OpenDDS and Dust DDS adapters ship as stubs: neither vendor has a usable PyPI Python binding yet, so their optional install extras (pip install topicforge[dds-opendds] / [dds-dust]) are expected to fail today; they exist to anchor auto-detection for when upstream ships.
  • Cyclone's dynamic XTypes decode path is best-effort and falls back to raw bytes on failure; Fast DDS's equivalent path is not yet functional pending upstream binding support.
pip install topicforge==0.4.0

Full details: https://github.com/yaniswav/TopicForge/blob/main/CHANGELOG.md#040---2026-05-15