rosotacom-dev 2.5.dev58__tar.gz → 2.5.dev61__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (389) hide show
  1. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/.github/workflows/image-scan.yml +13 -5
  2. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/.github/workflows/nightly-e2e.yml +10 -4
  3. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/.github/workflows/pr-merge-gate.yml +33 -15
  4. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/.github/workflows/release.yml +5 -2
  5. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/.pre-commit-config.yaml +1 -1
  6. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/PKG-INFO +52 -4
  7. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/README.md +50 -2
  8. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/docs/ci.md +31 -16
  9. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/docs/findings/README.md +2 -0
  10. rosotacom_dev-2.5.dev61/docs/findings/a-transport-element-doubles-every-fastdds-sample.md +117 -0
  11. rosotacom_dev-2.5.dev61/docs/findings/lifespan-is-enforced-by-one-reader-and-not-the-other.md +108 -0
  12. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/install.sh +2 -2
  13. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/justfile +2 -0
  14. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/pyproject.toml +1 -1
  15. rosotacom_dev-2.5.dev61/requirements.txt +1 -0
  16. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/cli.py +138 -17
  17. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/examples/README.md +17 -0
  18. rosotacom_dev-2.5.dev61/src/rosotacom/resources/examples/ros2docker.lyrical.json +37 -0
  19. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/examples/scenarios/2_native_chatter/scenario-definition.yaml +4 -0
  20. rosotacom_dev-2.5.dev61/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_a/external.lyrical.ros2docker.json +20 -0
  21. rosotacom_dev-2.5.dev61/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_b/external.lyrical.ros2docker.json +19 -0
  22. rosotacom_dev-2.5.dev61/src/rosotacom/resources/ros2docker.lyrical.json.example +37 -0
  23. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/ota_configs/fastdds_tuned.xml.template +40 -42
  24. rosotacom_dev-2.5.dev61/src/rosotacom/resources/ws/ota_configs/fastdds_unicast.xml.template +93 -0
  25. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/ros2src/com_py/com_py/universal_decompressor.py +6 -5
  26. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/ros2src/com_py/com_py/universal_ota_unwrapper.py +4 -2
  27. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/ros2src/com_py/com_py/universal_ota_wrapper.py +4 -2
  28. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/session/content/base/session_plugin_base.yaml +38 -33
  29. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom_dev.egg-info/PKG-INFO +52 -4
  30. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom_dev.egg-info/SOURCES.txt +8 -0
  31. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom_dev.egg-info/requires.txt +1 -1
  32. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom_dev.egg-info/scm_file_list.json +8 -0
  33. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom_dev.egg-info/scm_version.json +2 -2
  34. rosotacom_dev-2.5.dev61/tests/contract/test_lyrical_runtime_compat.py +30 -0
  35. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/tests/contract/test_packaged_resources.py +80 -19
  36. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/tests/contract/test_profile_covers_generated_commands.py +13 -3
  37. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/tests/contract/test_security_maintenance_config.py +12 -1
  38. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/tests/contract/test_workflow_contracts.py +24 -0
  39. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/tests/unit/test_anonymize.py +17 -0
  40. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/tests/unit/test_cli.py +34 -1
  41. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/tests/unit/test_concurrency.py +94 -0
  42. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/tests/unit/test_image_cache.py +26 -0
  43. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/tests/unit/test_ota_link_configs.py +35 -4
  44. rosotacom_dev-2.5.dev61/tests/unit/test_ros_node_entity_ownership.py +40 -0
  45. rosotacom_dev-2.5.dev58/requirements.txt +0 -1
  46. rosotacom_dev-2.5.dev58/src/rosotacom/resources/ws/ota_configs/fastdds_unicast.xml.template +0 -71
  47. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/.devcontainer/devcontainer.json.template +0 -0
  48. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/.devcontainer/re_generate_devcontainer_json.py +0 -0
  49. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/.github/CODEOWNERS +0 -0
  50. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/.github/ISSUE_TEMPLATE/documentation-audit.md +0 -0
  51. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/.github/ISSUE_TEMPLATE/implementation-cleanup.md +0 -0
  52. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/.github/ISSUE_TEMPLATE/quality-workflow.md +0 -0
  53. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/.github/ISSUE_TEMPLATE/redesign.md +0 -0
  54. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/.github/ISSUE_TEMPLATE/release-process.md +0 -0
  55. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/.github/ISSUE_TEMPLATE/repository-diagnosis.md +0 -0
  56. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/.github/ISSUE_TEMPLATE/test-ci-audit.md +0 -0
  57. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/.github/ISSUE_TEMPLATE/work-item.md +0 -0
  58. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  59. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/.github/actions/setup-just/action.yml +0 -0
  60. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/.github/dependabot.yml +0 -0
  61. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/.github/workflows/benchmark-calibrate.yml +0 -0
  62. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/.github/workflows/benchmark-gate.yml +0 -0
  63. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/.github/workflows/dev-release.yml +0 -0
  64. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/.github/workflows/pr-lightweight.yml +0 -0
  65. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/AGENTS.md +0 -0
  66. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/CONCURRENCY.md +0 -0
  67. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/CONTRIBUTING.md +0 -0
  68. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/DEVELOPMENT_PRINCIPLES.md +0 -0
  69. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/LICENSE.txt +0 -0
  70. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/MANIFEST.in +0 -0
  71. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/budgets.jsonl +0 -0
  72. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/calibration/README.md +0 -0
  73. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/calibration/capacity-size-tight-cyclone.json +0 -0
  74. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/calibration/probe-loss-gop-tight-cyclone.json +0 -0
  75. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/calibration/probe-loss-nominal-cyclone.json +0 -0
  76. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/calibration/probe-loss-tight-cyclone.json +0 -0
  77. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/calibration/probe-loss-tight-fastdds.json +0 -0
  78. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/calibration/probe-loss-tight-zenoh.json +0 -0
  79. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/codecov.yml +0 -0
  80. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/deployment-configuration.md +0 -0
  81. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/docs/benchmark-ab.md +0 -0
  82. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/docs/benchmark-bag-as-load.md +0 -0
  83. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/docs/ffmpeg-keyframes.md +0 -0
  84. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/docs/findings/cyclone-spdp-discovery-bursts.md +0 -0
  85. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/docs/findings/delay-alone-no-loss.md +0 -0
  86. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/docs/findings/fastdds-datagram-cap-drops-large-samples.md +0 -0
  87. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/docs/findings/graph-derived-types-block-a-non-graph-transport.md +0 -0
  88. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/docs/findings/head-of-line-irregularity.md +0 -0
  89. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/docs/findings/jitter-loss-bandwidth-latency.md +0 -0
  90. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/docs/findings/keyframe-loss-kills-the-next-deltas.md +0 -0
  91. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/docs/findings/lighter-message-loss.md +0 -0
  92. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/docs/findings/oversubscription-queues-not-losses.md +0 -0
  93. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/docs/findings/reorder-becomes-reader-loss.md +0 -0
  94. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/docs/findings/repro/decode_chain_repro.py +0 -0
  95. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/docs/findings/repro/reorder_drop_repro.py +0 -0
  96. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/docs/findings/sender-rows-make-a-dead-link-look-loss-free.md +0 -0
  97. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/docs/findings/zero-loss-boundaries-18kb-20hz.md +0 -0
  98. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/docs/forensics-report.md +0 -0
  99. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/docs/geo-link-map.md +0 -0
  100. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/docs/github-repository-settings.md +0 -0
  101. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/docs/link-bandwidth.md +0 -0
  102. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/docs/link-trace.md +0 -0
  103. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/docs/owner-runbook.md +0 -0
  104. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/docs/performance-bands.md +0 -0
  105. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/docs/playbooks/README.md +0 -0
  106. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/docs/quality-model.md +0 -0
  107. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/docs/release-notes/TEMPLATE.md +0 -0
  108. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/docs/release-notes/v2.1.md +0 -0
  109. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/docs/release-notes/v2.2.md +0 -0
  110. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/docs/release-notes/v2.3.md +0 -0
  111. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/docs/release-notes/v2.4.md +0 -0
  112. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/docs/release.md +0 -0
  113. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/docs/rfcs/0001-expectation-driven-test-suite.md +0 -0
  114. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/docs/rfcs/0002-expectation-concepts.md +0 -0
  115. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/docs/rfcs/0003-metric-backbone.md +0 -0
  116. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/docs/rfcs/0004-network-profiles.md +0 -0
  117. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/docs/rfcs/0005-benchmark-genres-and-ci.md +0 -0
  118. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/docs/rfcs/0006-dynamic-qos.md +0 -0
  119. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/docs/rfcs/0007-regression-gate.md +0 -0
  120. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/docs/rfcs/README.md +0 -0
  121. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/docs/testing.md +0 -0
  122. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/docs/work-items.md +0 -0
  123. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/media/control_center.png +0 -0
  124. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/media/echo_test.png +0 -0
  125. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/media/forensics-report-example.png +0 -0
  126. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/media/host.png +0 -0
  127. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/media/vehicle.png +0 -0
  128. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/rosotacom.yaml +0 -0
  129. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/session-configuration.md +0 -0
  130. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/setup.cfg +0 -0
  131. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/__init__.py +0 -0
  132. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/__main__.py +0 -0
  133. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/anonymize.py +0 -0
  134. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/bag_ground_truth.py +0 -0
  135. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/benched_set.py +0 -0
  136. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/benchmark.py +0 -0
  137. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/benchmark_delta.py +0 -0
  138. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/bundle_check.py +0 -0
  139. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/cli_benchmark.py +0 -0
  140. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/deployment.py +0 -0
  141. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/ffmpeg_packet.py +0 -0
  142. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/forensics.py +0 -0
  143. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/geomap.py +0 -0
  144. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/image_cache.py +0 -0
  145. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/netem_dist.py +0 -0
  146. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/network_preflight.py +0 -0
  147. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/network_profiles.py +0 -0
  148. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/network_shaper.py +0 -0
  149. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/plots.py +0 -0
  150. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/py.typed +0 -0
  151. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/benched-set.yaml +0 -0
  152. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/examples/.gitignore +0 -0
  153. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/examples/__init__.py +0 -0
  154. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/examples/bags/8_drop_reference/metadata.yaml +0 -0
  155. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/examples/deployment.example.yaml +0 -0
  156. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/examples/dist/field-20260817.dist +0 -0
  157. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/examples/profiles.yaml +0 -0
  158. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/examples/ros2docker.json +0 -0
  159. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/examples/rosotacom.yaml +0 -0
  160. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/examples/scripts/1_heartbeat/run_machine_a.sh +0 -0
  161. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/examples/scripts/1_heartbeat/run_machine_b.sh +0 -0
  162. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_a/external.ros2docker.json +0 -0
  163. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_a/run_communication.sh +0 -0
  164. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_a/run_external.py +0 -0
  165. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_a/wait_for_echo_topic.sh +0 -0
  166. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_b/external.ros2docker.json +0 -0
  167. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_b/run_communication.sh +0 -0
  168. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_b/run_external.py +0 -0
  169. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_a/external.ros2docker.json +0 -0
  170. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_a/external_session.yaml +0 -0
  171. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_a/foxglove.json +0 -0
  172. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_a/run_communication.sh +0 -0
  173. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_a/run_external.py +0 -0
  174. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_b/costmap_1second/costmap_1second_0.mcap +0 -0
  175. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_b/costmap_1second/metadata.yaml +0 -0
  176. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_b/external.ros2docker.json +0 -0
  177. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_b/run_communication.sh +0 -0
  178. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_b/run_external.py +0 -0
  179. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_a/external.ros2docker.json +0 -0
  180. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_a/external_session.yaml +0 -0
  181. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_a/foxglove.json +0 -0
  182. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_a/run_communication.sh +0 -0
  183. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_a/run_external.py +0 -0
  184. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_b/costmap_1second/costmap_1second_0.mcap +0 -0
  185. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_b/costmap_1second/metadata.yaml +0 -0
  186. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_b/external.ros2docker.json +0 -0
  187. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_b/run_communication.sh +0 -0
  188. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_b/run_external.py +0 -0
  189. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_a/external.ros2docker.json +0 -0
  190. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_a/external_session.yaml +0 -0
  191. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_a/run_communication.sh +0 -0
  192. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_a/run_external.py +0 -0
  193. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_b/external.ros2docker.json +0 -0
  194. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_b/external_session.yaml +0 -0
  195. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_b/run_communication.sh +0 -0
  196. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_b/run_external.py +0 -0
  197. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_a/external.ros2docker.json +0 -0
  198. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_a/external_session.yaml +0 -0
  199. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_a/run_communication.sh +0 -0
  200. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_a/run_external.py +0 -0
  201. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_b/external.ros2docker.json +0 -0
  202. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_b/external_session.yaml +0 -0
  203. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_b/run_communication.sh +0 -0
  204. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_b/run_external.py +0 -0
  205. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/examples/sessions/10_restamp/session-definition.yaml +0 -0
  206. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/examples/sessions/11_trickle/session-definition.yaml +0 -0
  207. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/examples/sessions/12_content_integrity/session-definition.yaml +0 -0
  208. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/examples/sessions/13_link_latency/session-definition.yaml +0 -0
  209. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/examples/sessions/14_remote_assist_anonymized/session-definition.yaml +0 -0
  210. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/examples/sessions/15_remote_assist_anonymized_costmap/session-definition.yaml +0 -0
  211. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/examples/sessions/16_remote_assist_anonymized_camera/session-definition.yaml +0 -0
  212. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/examples/sessions/17_synthetic_camera_quality/session-definition.yaml +0 -0
  213. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/examples/sessions/1_heartbeat/session-definition.yaml +0 -0
  214. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/examples/sessions/1_heartbeat_status/session-definition.yaml +0 -0
  215. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/examples/sessions/2_native_chatter/session-definition.yaml +0 -0
  216. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/examples/sessions/3_comp_occ_grid/session-definition.yaml +0 -0
  217. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/examples/sessions/4_comp_occ_grid_zen/session-definition.yaml +0 -0
  218. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/examples/sessions/5_sized_payload/session-definition.yaml +0 -0
  219. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/examples/sessions/6_sized_payload_zen/session-definition.yaml +0 -0
  220. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/examples/sessions/7_latched_static/session-definition.yaml +0 -0
  221. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/examples/sessions/8_drop/session-definition.yaml +0 -0
  222. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/examples/sessions/9_throttle/session-definition.yaml +0 -0
  223. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/examples/sessions/bench_1_1_capacity/session-definition.yaml +0 -0
  224. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/examples/sessions/bench_1_2_load_sweep/session-definition.yaml +0 -0
  225. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/examples/sessions/bench_1_3_ramp/session-definition.yaml +0 -0
  226. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/examples/sessions/bench_1_4_recovery/session-definition.yaml +0 -0
  227. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/examples/sessions/bench_1_5_camera/session-definition.yaml +0 -0
  228. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ros2docker.json.example +0 -0
  229. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/.vscode/c_cpp_properties.json +0 -0
  230. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/.vscode/settings.json +0 -0
  231. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_easy_mode.xml.template +0 -0
  232. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_initial_peer_list.xml.template +0 -0
  233. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_v2.xml.template +0 -0
  234. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_v3.xml.template +0 -0
  235. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_v4.xml.template +0 -0
  236. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_v5.xml.template +0 -0
  237. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/ota_configs/create_zenoh_json5.py +0 -0
  238. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/ota_configs/cyclonedds_local_participants.xml.template +0 -0
  239. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/ota_configs/cyclonedds_minimal.xml.template +0 -0
  240. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/ota_configs/cyclonedds_tuned.xml.template +0 -0
  241. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/ota_configs/fastdds_easy_mode.xml.template +0 -0
  242. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/ota_configs/fastdds_local.xml.template +0 -0
  243. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/ota_configs/get_ota_xml.py +0 -0
  244. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/ota_configs/utils.py +0 -0
  245. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/ota_configs/zenoh.json5.template +0 -0
  246. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/ros2src/.gitkeep +0 -0
  247. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/ros2src/com_cpp/CMakeLists.txt +0 -0
  248. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/ros2src/com_cpp/COLCON_IGNORE +0 -0
  249. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/ros2src/com_cpp/LICENSE.txt +0 -0
  250. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/ros2src/com_cpp/package.xml +0 -0
  251. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/ros2src/com_cpp/src/hz_monitor.cpp +0 -0
  252. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/ros2src/com_cpp/src/universal_compressor.cpp +0 -0
  253. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/ros2src/com_cpp/src/universal_decompressor.cpp +0 -0
  254. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/ros2src/com_msgs/CMakeLists.txt +0 -0
  255. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/ros2src/com_msgs/LICENSE.txt +0 -0
  256. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/ros2src/com_msgs/msg/CompressedData.msg +0 -0
  257. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/ros2src/com_msgs/msg/EchoHeartbeat.msg +0 -0
  258. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/ros2src/com_msgs/msg/OtaStamped.msg +0 -0
  259. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/ros2src/com_msgs/msg/SizedPayload.msg +0 -0
  260. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/ros2src/com_msgs/package.xml +0 -0
  261. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/ros2src/com_py/LICENSE.txt +0 -0
  262. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/ros2src/com_py/com_py/__init__.py +0 -0
  263. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/ros2src/com_py/com_py/base_bridge_relay.py +0 -0
  264. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/ros2src/com_py/com_py/bridge_in.py +0 -0
  265. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/ros2src/com_py/com_py/bridge_out.py +0 -0
  266. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/ros2src/com_py/com_py/ffmpeg_flags.py +0 -0
  267. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/ros2src/com_py/com_py/heartbeat_echo.py +0 -0
  268. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/ros2src/com_py/com_py/hz_monitor.py +0 -0
  269. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/ros2src/com_py/com_py/image_bandwidth_reducer.py +0 -0
  270. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/ros2src/com_py/com_py/image_pixel_capper.py +0 -0
  271. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/ros2src/com_py/com_py/lanelet_saver.py +0 -0
  272. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/ros2src/com_py/com_py/latch_relay.py +0 -0
  273. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/costmap_remapper.py +0 -0
  274. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/marker_remapper.py +0 -0
  275. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/speed_test.py +0 -0
  276. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/tf_remapper.py +0 -0
  277. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/traffic_monitor.py +0 -0
  278. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/wifi_network_analysis_1.py +0 -0
  279. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/ros2src/com_py/com_py/link_bytes.py +0 -0
  280. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/ros2src/com_py/com_py/link_trace.py +0 -0
  281. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/ros2src/com_py/com_py/local_global_frame_bridge.py +0 -0
  282. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/ros2src/com_py/com_py/localization_map_split_reduce_saver.py +0 -0
  283. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/ros2src/com_py/com_py/msg_transform.py +0 -0
  284. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/ros2src/com_py/com_py/pair_management.py +0 -0
  285. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/ros2src/com_py/com_py/playout_pacer.py +0 -0
  286. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/ros2src/com_py/com_py/playout_pacer_core.py +0 -0
  287. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/ros2src/com_py/com_py/pub_sub_pair.py +0 -0
  288. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/ros2src/com_py/com_py/qos.py +0 -0
  289. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/ros2src/com_py/com_py/relay_in.py +0 -0
  290. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/ros2src/com_py/com_py/relay_out.py +0 -0
  291. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/ros2src/com_py/com_py/restamp.py +0 -0
  292. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/ros2src/com_py/com_py/sized_publisher.py +0 -0
  293. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/ros2src/com_py/com_py/stage_latency.py +0 -0
  294. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/ros2src/com_py/com_py/stage_latency_core.py +0 -0
  295. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/ros2src/com_py/com_py/status_overview.py +0 -0
  296. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/ros2src/com_py/com_py/status_overview_core.py +0 -0
  297. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/ros2src/com_py/com_py/tf_map_to_cart_saver.py +0 -0
  298. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/ros2src/com_py/com_py/topic_monitor.py +0 -0
  299. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/ros2src/com_py/com_py/topic_resolution.py +0 -0
  300. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/ros2src/com_py/com_py/trickle.py +0 -0
  301. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/ros2src/com_py/com_py/universal_compressor.py +0 -0
  302. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/ros2src/com_py/package.xml +0 -0
  303. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/ros2src/com_py/resource/com_py +0 -0
  304. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/ros2src/com_py/setup.cfg +0 -0
  305. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/ros2src/com_py/setup.py +0 -0
  306. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/ros2src/com_py/test/test_copyright.py +0 -0
  307. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/ros2src/com_py/test/test_flake8.py +0 -0
  308. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/ros2src/com_py/test/test_pep257.py +0 -0
  309. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/session/content/network/up_connectivity.py +0 -0
  310. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/session/content/network/wifi_network_analysis_2.py +0 -0
  311. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/session/creation/anonymize_bag.py +0 -0
  312. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/session/creation/catmux_log_setup.sh +0 -0
  313. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/session/creation/create_session_yaml.py +0 -0
  314. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/session/creation/generate_session_files.py +0 -0
  315. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/session/creation/run_session.py +0 -0
  316. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/session/creation/run_session_in_external_terminal.py +0 -0
  317. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/resources/ws/session/creation/strip_ansi.py +0 -0
  318. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/status_eval.py +0 -0
  319. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/stream_stats.py +0 -0
  320. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/trace_profiles.py +0 -0
  321. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/transit.py +0 -0
  322. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom/video_quality.py +0 -0
  323. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom_dev.egg-info/dependency_links.txt +0 -0
  324. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom_dev.egg-info/entry_points.txt +0 -0
  325. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/src/rosotacom_dev.egg-info/top_level.txt +0 -0
  326. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/terminology.md +0 -0
  327. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/tests/contract/test_benched_set_registry.py +0 -0
  328. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/tests/contract/test_findings.py +0 -0
  329. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/tests/contract/test_generated_topics_have_a_producer.py +0 -0
  330. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/tests/contract/test_markdown_links.py +0 -0
  331. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/tests/contract/test_ota_source_bundle.py +0 -0
  332. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/tests/contract/test_package_metadata.py +0 -0
  333. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/tests/contract/test_pytest_policy.py +0 -0
  334. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/tests/contract/test_readme_examples.py +0 -0
  335. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/tests/contract/test_session_configuration_doc.py +0 -0
  336. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/tests/contract/test_session_template_substitution.py +0 -0
  337. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/tests/e2e/conftest.py +0 -0
  338. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/tests/e2e/test_anonymize_e2e.py +0 -0
  339. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/tests/e2e/test_benchmark_ab.py +0 -0
  340. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/tests/e2e/test_benchmark_capacity.py +0 -0
  341. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/tests/e2e/test_benchmark_replay.py +0 -0
  342. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/tests/e2e/test_parallel_smoke.py +0 -0
  343. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/tests/e2e/test_smoke.py +0 -0
  344. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/tests/e2e/test_timeline_stepping.py +0 -0
  345. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/tests/e2e/test_video_quality_e2e.py +0 -0
  346. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/tests/sessions/generate_rmw_matrix.py +0 -0
  347. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/tests/sessions/rmw_matrix/1_heartbeat_cyclone-local_zenoh-ros2dds-ota/session-definition.yaml +0 -0
  348. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/tests/sessions/rmw_matrix/1_heartbeat_cyclone-ota/session-definition.yaml +0 -0
  349. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/tests/sessions/rmw_matrix/1_heartbeat_cyclone-ota-tuned/session-definition.yaml +0 -0
  350. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/tests/sessions/rmw_matrix/1_heartbeat_fastdds/session-definition.yaml +0 -0
  351. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/tests/sessions/rmw_matrix/1_heartbeat_fastdds-default/session-definition.yaml +0 -0
  352. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/tests/sessions/rmw_matrix/1_heartbeat_zen-endpoints/session-definition.yaml +0 -0
  353. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/tests/unit/test_bag_ground_truth.py +0 -0
  354. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/tests/unit/test_benched_set.py +0 -0
  355. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/tests/unit/test_benchmark.py +0 -0
  356. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/tests/unit/test_benchmark_delta.py +0 -0
  357. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/tests/unit/test_bundle_check.py +0 -0
  358. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/tests/unit/test_catmux_pane_logging.py +0 -0
  359. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/tests/unit/test_cli_benchmark.py +0 -0
  360. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/tests/unit/test_container_shaping.py +0 -0
  361. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/tests/unit/test_deployment.py +0 -0
  362. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/tests/unit/test_ffmpeg_flags.py +0 -0
  363. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/tests/unit/test_ffmpeg_packet.py +0 -0
  364. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/tests/unit/test_field_profiles.py +0 -0
  365. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/tests/unit/test_forensics.py +0 -0
  366. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/tests/unit/test_geomap.py +0 -0
  367. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/tests/unit/test_link_bytes.py +0 -0
  368. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/tests/unit/test_link_trace.py +0 -0
  369. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/tests/unit/test_netem_dist.py +0 -0
  370. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/tests/unit/test_network_preflight.py +0 -0
  371. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/tests/unit/test_network_profiles.py +0 -0
  372. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/tests/unit/test_network_shaper.py +0 -0
  373. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/tests/unit/test_ota_unwrapper.py +0 -0
  374. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/tests/unit/test_ota_wrapper.py +0 -0
  375. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/tests/unit/test_ota_xml.py +0 -0
  376. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/tests/unit/test_playout_pacer.py +0 -0
  377. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/tests/unit/test_plots.py +0 -0
  378. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/tests/unit/test_pub_sub_pair_types.py +0 -0
  379. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/tests/unit/test_qos_fallback_logging.py +0 -0
  380. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/tests/unit/test_relay_optional_parameters.py +0 -0
  381. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/tests/unit/test_session_pipeline.py +0 -0
  382. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/tests/unit/test_stage_latency.py +0 -0
  383. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/tests/unit/test_status_eval.py +0 -0
  384. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/tests/unit/test_status_overview.py +0 -0
  385. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/tests/unit/test_status_overview_observer.py +0 -0
  386. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/tests/unit/test_stream_stats.py +0 -0
  387. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/tests/unit/test_trace_profiles.py +0 -0
  388. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/tests/unit/test_transit.py +0 -0
  389. {rosotacom_dev-2.5.dev58 → rosotacom_dev-2.5.dev61}/tests/unit/test_video_quality.py +0 -0
@@ -14,11 +14,19 @@ concurrency:
14
14
 
15
15
  jobs:
16
16
  trivy-image:
17
- name: trivy-image
17
+ name: trivy-image-${{ matrix.variant }}
18
18
  runs-on: ubuntu-latest
19
19
  timeout-minutes: 180
20
+ strategy:
21
+ fail-fast: false
22
+ matrix:
23
+ include:
24
+ - variant: kilted
25
+ config: src/rosotacom/resources/ros2docker.json.example
26
+ - variant: lyrical
27
+ config: src/rosotacom/resources/ros2docker.lyrical.json.example
20
28
  env:
21
- IMAGE_TAG: rosotacom:scan-${{ github.sha }}
29
+ IMAGE_TAG: rosotacom:scan-${{ matrix.variant }}-${{ github.sha }}
22
30
 
23
31
  steps:
24
32
  - name: Check out repository
@@ -41,10 +49,10 @@ jobs:
41
49
  - name: Show Docker environment
42
50
  run: docker info
43
51
 
44
- - name: Build default rosotacom image
52
+ - name: Build rosotacom image
45
53
  run: |
46
54
  .venv/bin/ros2docker build \
47
- -f src/rosotacom/resources/ros2docker.json.example \
55
+ -f "${{ matrix.config }}" \
48
56
  -o "{\"image_name\":\"${IMAGE_TAG}\"}"
49
57
 
50
58
  - name: Run Trivy vulnerability scanner
@@ -61,6 +69,6 @@ jobs:
61
69
  if: always()
62
70
  uses: actions/upload-artifact@v7
63
71
  with:
64
- name: trivy-image-report
72
+ name: trivy-image-report-${{ matrix.variant }}
65
73
  path: trivy-image-report.txt
66
74
  if-no-files-found: warn
@@ -32,12 +32,13 @@ jobs:
32
32
  # nightly failed with nine "Timed out waiting for container readiness"
33
33
  # errors after 1h12m on one runner, while the same tests on the same commit
34
34
  # passed in the merge gate — where they were spread over six at the time.
35
- name: smoke-e2e-${{ matrix.slice }}
35
+ name: smoke-e2e-${{ matrix.variant }}-${{ matrix.slice }}
36
36
  runs-on: ubuntu-latest
37
37
  timeout-minutes: 90
38
38
  strategy:
39
39
  fail-fast: false
40
40
  matrix:
41
+ variant: [kilted, lyrical]
41
42
  slice:
42
43
  - heartbeat
43
44
  - chatter
@@ -86,24 +87,27 @@ jobs:
86
87
  run: docker info
87
88
 
88
89
  - name: Run E2E slice
90
+ env:
91
+ ROSOTACOM_ROS2DOCKER_CONFIG: ${{ matrix.variant == 'lyrical' && format('{0}/src/rosotacom/resources/examples/ros2docker.lyrical.json', github.workspace) || '' }}
89
92
  run: just test-e2e-slice ${{ matrix.slice }}
90
93
 
91
94
  - name: Upload smoke session artifacts
92
95
  if: failure()
93
96
  uses: actions/upload-artifact@v7
94
97
  with:
95
- name: session-instances-smoke-${{ matrix.slice }}
98
+ name: session-instances-smoke-${{ matrix.variant }}-${{ matrix.slice }}
96
99
  path: session-instances/
97
100
  if-no-files-found: ignore
98
101
 
99
102
  rmw-matrix:
100
- name: rmw-${{ matrix.session }}
103
+ name: rmw-${{ matrix.variant }}-${{ matrix.session }}
101
104
  runs-on: ubuntu-latest
102
105
  timeout-minutes: 90
103
106
  if: github.event_name != 'schedule' || github.event.inputs.full-rmw-matrix != 'false'
104
107
  strategy:
105
108
  fail-fast: false
106
109
  matrix:
110
+ variant: [kilted, lyrical]
107
111
  session:
108
112
  - cyclone-local-zenoh-ros2dds-ota
109
113
  - cyclone-ota
@@ -139,12 +143,14 @@ jobs:
139
143
  run: docker info
140
144
 
141
145
  - name: Run generated RMW matrix session
146
+ env:
147
+ ROSOTACOM_ROS2DOCKER_CONFIG: ${{ matrix.variant == 'lyrical' && format('{0}/src/rosotacom/resources/examples/ros2docker.lyrical.json', github.workspace) || '' }}
142
148
  run: just test-e2e-rmw ${{ matrix.session }}
143
149
 
144
150
  - name: Upload RMW session artifacts
145
151
  if: failure()
146
152
  uses: actions/upload-artifact@v7
147
153
  with:
148
- name: session-instances-rmw-${{ matrix.session }}
154
+ name: session-instances-rmw-${{ matrix.variant }}-${{ matrix.session }}
149
155
  path: session-instances/
150
156
  if-no-files-found: ignore
@@ -159,7 +159,8 @@ jobs:
159
159
  quick-gate:
160
160
  # Everything `e2e` waits for that is not the image, and deliberately no
161
161
  # more. It exists to answer one question — is the tree obviously broken,
162
- # such that seventeen slices would burn roughly 73 runner-minutes to say so.
162
+ # such that two variants across seventeen slices would burn roughly 146
163
+ # runner-minutes to say so.
163
164
  #
164
165
  # It replaced a `needs: preflight-success` edge that made e2e wait for the
165
166
  # whole five-version matrix. That barrier cost 2.15 min of every gate run
@@ -204,7 +205,8 @@ jobs:
204
205
  # ROS base from Docker Hub, 40s exporting layers, 47s of apt and pip. A pull
205
206
  # from GHCR — co-located with the runners, no Hub rate limit, one transfer
206
207
  # instead of a transfer plus a build — replaces all of it. The benefit
207
- # grows with the diagnostic matrix; seventeen jobs still build only once.
208
+ # grows with the diagnostic matrix; both distribution variants still build
209
+ # only once each.
208
210
  #
209
211
  # The tag is a hash of everything that decides the image (base digest,
210
212
  # package lists, Dockerfile, entrypoint, ros2docker version, build UID):
@@ -255,18 +257,32 @@ jobs:
255
257
  # artifacts that live beside the checkout in the private harness, so it
256
258
  # does not resolve here.
257
259
  project="$(.venv/bin/rosotacom resources path examples)/rosotacom.yaml"
258
- .venv/bin/rosotacom image references --project "$project" --repository "$repository" > references.txt
259
- cat references.txt
260
-
261
- while read -r reference; do
262
- if docker manifest inspect "$reference" >/dev/null 2>&1; then
263
- echo "present: $reference"
264
- continue
260
+ lyrical_config="$(.venv/bin/rosotacom resources path ros2docker-lyrical)"
261
+ for variant in kilted lyrical; do
262
+ config=""
263
+ if [[ "$variant" == "lyrical" ]]; then
264
+ config="$lyrical_config"
265
265
  fi
266
- echo "missing, building: $reference"
267
- .venv/bin/rosotacom image build --project "$project" --reference "$reference"
268
- docker push "$reference" || echo "::warning::could not push $reference"
269
- done < references.txt
266
+ variant_references="references-${variant}.txt"
267
+ ROSOTACOM_ROS2DOCKER_CONFIG="$config" \
268
+ .venv/bin/rosotacom image references \
269
+ --project "$project" \
270
+ --repository "$repository" > "$variant_references"
271
+
272
+ while read -r reference; do
273
+ if docker manifest inspect "$reference" >/dev/null 2>&1; then
274
+ echo "present ($variant): $reference"
275
+ continue
276
+ fi
277
+ echo "missing ($variant), building: $reference"
278
+ ROSOTACOM_ROS2DOCKER_CONFIG="$config" \
279
+ .venv/bin/rosotacom image build --project "$project" --reference "$reference"
280
+ docker push "$reference" || echo "::warning::could not push $reference"
281
+ done < "$variant_references"
282
+ done
283
+
284
+ sort -u references-kilted.txt references-lyrical.txt > references.txt
285
+ cat references.txt
270
286
 
271
287
  # Report the repository only when every reference resolves. A
272
288
  # read-only GITHUB_TOKEN (a fork PR, Dependabot) can log in and pull
@@ -301,7 +317,7 @@ jobs:
301
317
  # reaches the measured floor: #253 split the four overloaded themes along
302
318
  # transport, stream, or concurrency semantics. Which tests a slice owns and
303
319
  # what each costs is E2E_SLICES in tests/e2e/conftest.py.
304
- name: e2e-${{ matrix.slice }}
320
+ name: e2e-${{ matrix.variant }}-${{ matrix.slice }}
305
321
  runs-on: ubuntu-latest
306
322
  timeout-minutes: 90
307
323
  needs: [quick-gate, image]
@@ -312,6 +328,7 @@ jobs:
312
328
  strategy:
313
329
  fail-fast: false
314
330
  matrix:
331
+ variant: [kilted, lyrical]
315
332
  slice:
316
333
  - heartbeat
317
334
  - chatter
@@ -371,13 +388,14 @@ jobs:
371
388
  # that tag itself and never accepts one, so it cannot be pointed at an
372
389
  # image built from something else.
373
390
  ROSOTACOM_IMAGE_CACHE: ${{ needs.image.outputs.repository }}
391
+ ROSOTACOM_ROS2DOCKER_CONFIG: ${{ matrix.variant == 'lyrical' && format('{0}/src/rosotacom/resources/examples/ros2docker.lyrical.json', github.workspace) || '' }}
374
392
  run: just test-e2e-slice ${{ matrix.slice }}
375
393
 
376
394
  - name: Upload session artifacts
377
395
  if: failure()
378
396
  uses: actions/upload-artifact@v7
379
397
  with:
380
- name: session-instances-e2e-${{ matrix.slice }}
398
+ name: session-instances-e2e-${{ matrix.variant }}-${{ matrix.slice }}
381
399
  path: session-instances/
382
400
  if-no-files-found: ignore
383
401
 
@@ -115,12 +115,13 @@ jobs:
115
115
  # identical to nightly-e2e.yml's smoke-e2e job, so the release used to be
116
116
  # the third sequential run of the same tests against the same tree; it
117
117
  # dominated release wall-clock at roughly an hour. See issue #196.
118
- name: e2e-${{ matrix.slice }}
118
+ name: e2e-${{ matrix.variant }}-${{ matrix.slice }}
119
119
  runs-on: ubuntu-latest
120
120
  timeout-minutes: 90
121
121
  strategy:
122
122
  fail-fast: false
123
123
  matrix:
124
+ variant: [kilted, lyrical]
124
125
  slice:
125
126
  - heartbeat
126
127
  - chatter
@@ -169,13 +170,15 @@ jobs:
169
170
  run: docker info
170
171
 
171
172
  - name: Run E2E slice
173
+ env:
174
+ ROSOTACOM_ROS2DOCKER_CONFIG: ${{ matrix.variant == 'lyrical' && format('{0}/src/rosotacom/resources/examples/ros2docker.lyrical.json', github.workspace) || '' }}
172
175
  run: just test-e2e-slice ${{ matrix.slice }}
173
176
 
174
177
  - name: Upload session artifacts
175
178
  if: failure()
176
179
  uses: actions/upload-artifact@v7
177
180
  with:
178
- name: session-instances-e2e-${{ matrix.slice }}
181
+ name: session-instances-e2e-${{ matrix.variant }}-${{ matrix.slice }}
179
182
  path: session-instances/
180
183
  if-no-files-found: ignore
181
184
 
@@ -7,7 +7,7 @@ repos:
7
7
  - id: check-yaml
8
8
  - id: check-toml
9
9
  - id: check-json
10
- exclude: ^src/rosotacom/resources/(examples/ros2docker\.json|ros2docker\.json\.example)$
10
+ exclude: ^src/rosotacom/resources/(examples/ros2docker(?:\.lyrical)?\.json|ros2docker(?:\.lyrical)?\.json\.example)$
11
11
  - id: check-merge-conflict
12
12
  - id: debug-statements
13
13
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rosotacom-dev
3
- Version: 2.5.dev58
3
+ Version: 2.5.dev61
4
4
  Summary: Host CLI for ROS OTA communication sessions.
5
5
  Author: develNor
6
6
  License-Expression: BSD-3-Clause
@@ -27,7 +27,7 @@ Requires-Dist: argcomplete<4,>=3.6
27
27
  Requires-Dist: mcap<2,>=1.4
28
28
  Requires-Dist: Pillow<13,>=10
29
29
  Requires-Dist: PyYAML>=6
30
- Requires-Dist: ros2docker<0.2,>=0.1.5.dev8
30
+ Requires-Dist: ros2docker<0.2,>=0.1.5.dev10
31
31
  Provides-Extra: dev
32
32
  Requires-Dist: build>=1.2; extra == "dev"
33
33
  Requires-Dist: check-wheel-contents>=0.6; extra == "dev"
@@ -73,7 +73,7 @@ The ROS Communication DevContainer is a Docker-based solution designed to stream
73
73
  - Git for configuration management
74
74
  - Python 3 with virtual environment support (`python3-venv` on Debian/Ubuntu;
75
75
  for versioned Python packages this may be named like `python3.14-venv`)
76
- - `ros2docker` v0.1.4 or newer. The local installer below installs the pinned
76
+ - `ros2docker` v0.1.5.dev10 or newer (below v0.2). The local installer below installs the pinned
77
77
  supported range into this checkout's virtual environment.
78
78
  - `tmux` for the optional `rosotacom scenario` orchestration commands
79
79
  - Machines connected to the same network (VPN or local WLAN)
@@ -216,6 +216,7 @@ The copied packaged example project uses this layout:
216
216
  ```text
217
217
  rosotacom.yaml
218
218
  ros2docker.json
219
+ ros2docker.lyrical.json
219
220
  deployment.example.yaml
220
221
  sessions/
221
222
  scenarios/
@@ -246,6 +247,7 @@ composes directly in a shell:
246
247
  ```bash
247
248
  rosotacom resources path com_msgs # the ROS 2 message package
248
249
  rosotacom resources path ws # the packaged runtime workspace
250
+ rosotacom resources path ros2docker-lyrical # the opt-in ROS 2 Lyrical image config
249
251
  ```
250
252
 
251
253
  Use this wherever another project needs rosotacom's files on the host, for
@@ -253,6 +255,44 @@ example to bake `com_msgs` into its own container image. Ask for the resource by
253
255
  name rather than reconstructing a path: the names are part of the CLI contract,
254
256
  the layout behind them is not.
255
257
 
258
+ ### ROS 2 distribution variants
259
+
260
+ ROS 2 Kilted remains the default. The packaged Lyrical/Ubuntu Resolute image is
261
+ an explicit opt-in and uses a separate image name, so trying it does not replace
262
+ the default image. To select it for one command, including the built-in example:
263
+
264
+ ```bash
265
+ ROSOTACOM_ROS2DOCKER_CONFIG="$(rosotacom resources path ros2docker-lyrical)" \
266
+ rosotacom smoke
267
+ ```
268
+
269
+ An example project copied with `rosotacom examples create` also contains
270
+ `ros2docker.lyrical.json`. To opt that project in persistently, select it in
271
+ `rosotacom.yaml`:
272
+
273
+ ```yaml
274
+ ros2docker_config: ros2docker.lyrical.json
275
+ ```
276
+
277
+ The Lyrical config keeps every available ROS dependency on the official binary
278
+ packages. `domain_bridge` is the current exception: because no Lyrical binary
279
+ package exists, ros2docker's `domain-bridge` profile builds a pinned upstream
280
+ commit with a pinned compatibility patch. The build fails closed outside
281
+ Lyrical or if that patch no longer applies. Replace this fallback with
282
+ `ros-lyrical-domain-bridge` once the official package is released.
283
+
284
+ The communication container and any scenario application with a matching
285
+ `ros2docker_config_by_distro` entry follow this variant selection together.
286
+ The packaged chatter scenario supplies Lyrical application configs, because
287
+ [ROS 2 does not guarantee cross-distribution communication](https://docs.ros.org/en/ros2_documentation/rolling/Releases.html#cross-distribution-communications).
288
+ Applications without a matching entry retain their explicit default config.
289
+
290
+ The default switch is intentionally not part of this change. Before promoting
291
+ Lyrical, keep the two-variant E2E and RMW matrices green, point the packaged
292
+ default and example project at the Lyrical configs, and recalibrate the
293
+ distribution-specific performance budgets. Existing copied projects continue
294
+ to name their own config and do not change when the package default changes.
295
+
256
296
  ### Reusing an image instead of rebuilding it
257
297
 
258
298
  Somewhere that starts many rosotacom sessions from the same tree — CI above all
@@ -362,9 +402,13 @@ applications:
362
402
  a:
363
403
  - name: native_application
364
404
  ros2docker_config: ../../scripts/2_native_chatter/machine_a/external.ros2docker.json
405
+ ros2docker_config_by_distro:
406
+ lyrical: ../../scripts/2_native_chatter/machine_a/external.lyrical.ros2docker.json
365
407
  b:
366
408
  - name: native_application
367
409
  ros2docker_config: ../../scripts/2_native_chatter/machine_b/external.ros2docker.json
410
+ ros2docker_config_by_distro:
411
+ lyrical: ../../scripts/2_native_chatter/machine_b/external.lyrical.ros2docker.json
368
412
  ```
369
413
 
370
414
  Start one identity's communication and local application together:
@@ -379,7 +423,11 @@ rosotacom scenario stop
379
423
  `scenario list` shows both configured scenarios and currently active
380
424
  scenario/identity pairs. `attach` and `stop` infer omitted values when exactly
381
425
  one active choice exists; otherwise their completions and error messages show
382
- the eligible active choices.
426
+ the eligible active choices. `ros2docker_config` is always the fallback;
427
+ `ros2docker_config_by_distro` selects a matching application image from the
428
+ communication config's `BASE_IMAGE` distro, so changing the project between
429
+ Kilted and Lyrical changes the complete scenario rather than creating an
430
+ unsupported mixed-distro data path.
383
431
 
384
432
  The outer view uses an isolated host tmux server with one full window for
385
433
  communication and one full window per local application. Its prefix remains
@@ -28,7 +28,7 @@ The ROS Communication DevContainer is a Docker-based solution designed to stream
28
28
  - Git for configuration management
29
29
  - Python 3 with virtual environment support (`python3-venv` on Debian/Ubuntu;
30
30
  for versioned Python packages this may be named like `python3.14-venv`)
31
- - `ros2docker` v0.1.4 or newer. The local installer below installs the pinned
31
+ - `ros2docker` v0.1.5.dev10 or newer (below v0.2). The local installer below installs the pinned
32
32
  supported range into this checkout's virtual environment.
33
33
  - `tmux` for the optional `rosotacom scenario` orchestration commands
34
34
  - Machines connected to the same network (VPN or local WLAN)
@@ -171,6 +171,7 @@ The copied packaged example project uses this layout:
171
171
  ```text
172
172
  rosotacom.yaml
173
173
  ros2docker.json
174
+ ros2docker.lyrical.json
174
175
  deployment.example.yaml
175
176
  sessions/
176
177
  scenarios/
@@ -201,6 +202,7 @@ composes directly in a shell:
201
202
  ```bash
202
203
  rosotacom resources path com_msgs # the ROS 2 message package
203
204
  rosotacom resources path ws # the packaged runtime workspace
205
+ rosotacom resources path ros2docker-lyrical # the opt-in ROS 2 Lyrical image config
204
206
  ```
205
207
 
206
208
  Use this wherever another project needs rosotacom's files on the host, for
@@ -208,6 +210,44 @@ example to bake `com_msgs` into its own container image. Ask for the resource by
208
210
  name rather than reconstructing a path: the names are part of the CLI contract,
209
211
  the layout behind them is not.
210
212
 
213
+ ### ROS 2 distribution variants
214
+
215
+ ROS 2 Kilted remains the default. The packaged Lyrical/Ubuntu Resolute image is
216
+ an explicit opt-in and uses a separate image name, so trying it does not replace
217
+ the default image. To select it for one command, including the built-in example:
218
+
219
+ ```bash
220
+ ROSOTACOM_ROS2DOCKER_CONFIG="$(rosotacom resources path ros2docker-lyrical)" \
221
+ rosotacom smoke
222
+ ```
223
+
224
+ An example project copied with `rosotacom examples create` also contains
225
+ `ros2docker.lyrical.json`. To opt that project in persistently, select it in
226
+ `rosotacom.yaml`:
227
+
228
+ ```yaml
229
+ ros2docker_config: ros2docker.lyrical.json
230
+ ```
231
+
232
+ The Lyrical config keeps every available ROS dependency on the official binary
233
+ packages. `domain_bridge` is the current exception: because no Lyrical binary
234
+ package exists, ros2docker's `domain-bridge` profile builds a pinned upstream
235
+ commit with a pinned compatibility patch. The build fails closed outside
236
+ Lyrical or if that patch no longer applies. Replace this fallback with
237
+ `ros-lyrical-domain-bridge` once the official package is released.
238
+
239
+ The communication container and any scenario application with a matching
240
+ `ros2docker_config_by_distro` entry follow this variant selection together.
241
+ The packaged chatter scenario supplies Lyrical application configs, because
242
+ [ROS 2 does not guarantee cross-distribution communication](https://docs.ros.org/en/ros2_documentation/rolling/Releases.html#cross-distribution-communications).
243
+ Applications without a matching entry retain their explicit default config.
244
+
245
+ The default switch is intentionally not part of this change. Before promoting
246
+ Lyrical, keep the two-variant E2E and RMW matrices green, point the packaged
247
+ default and example project at the Lyrical configs, and recalibrate the
248
+ distribution-specific performance budgets. Existing copied projects continue
249
+ to name their own config and do not change when the package default changes.
250
+
211
251
  ### Reusing an image instead of rebuilding it
212
252
 
213
253
  Somewhere that starts many rosotacom sessions from the same tree — CI above all
@@ -317,9 +357,13 @@ applications:
317
357
  a:
318
358
  - name: native_application
319
359
  ros2docker_config: ../../scripts/2_native_chatter/machine_a/external.ros2docker.json
360
+ ros2docker_config_by_distro:
361
+ lyrical: ../../scripts/2_native_chatter/machine_a/external.lyrical.ros2docker.json
320
362
  b:
321
363
  - name: native_application
322
364
  ros2docker_config: ../../scripts/2_native_chatter/machine_b/external.ros2docker.json
365
+ ros2docker_config_by_distro:
366
+ lyrical: ../../scripts/2_native_chatter/machine_b/external.lyrical.ros2docker.json
323
367
  ```
324
368
 
325
369
  Start one identity's communication and local application together:
@@ -334,7 +378,11 @@ rosotacom scenario stop
334
378
  `scenario list` shows both configured scenarios and currently active
335
379
  scenario/identity pairs. `attach` and `stop` infer omitted values when exactly
336
380
  one active choice exists; otherwise their completions and error messages show
337
- the eligible active choices.
381
+ the eligible active choices. `ros2docker_config` is always the fallback;
382
+ `ros2docker_config_by_distro` selects a matching application image from the
383
+ communication config's `BASE_IMAGE` distro, so changing the project between
384
+ Kilted and Lyrical changes the complete scenario rather than creating an
385
+ unsupported mixed-distro data path.
338
386
 
339
387
  The outer view uses an isolated host tmux server with one full window for
340
388
  communication and one full window per local application. Its prefix remains
@@ -43,22 +43,28 @@ check is:
43
43
  ci-success
44
44
  ```
45
45
 
46
- The merge gate runs workflow lint, dependency/security review, runtime/build asset lint, Python 3.10 through 3.14 non-Docker checks, package validation, and the Docker single-machine smoke matrix (one matrix job per slice, seventeen in parallel):
46
+ The merge gate runs workflow lint, dependency/security review, runtime/build
47
+ asset lint, Python 3.10 through 3.14 non-Docker checks, package validation, and
48
+ the Docker single-machine smoke matrix: seventeen diagnostic slices for each of
49
+ the `kilted` and `lyrical` variants, 34 jobs in parallel. Scenario application
50
+ images follow the selected communication distro through
51
+ `ros2docker_config_by_distro`, so each variant is end-to-end rather than a
52
+ cross-distro combination.
47
53
 
48
54
  Python 3.10–3.14 are supported for the host CLI; Python 3.12 is the reference
49
55
  interpreter for packaging and Docker E2E jobs.
50
56
 
51
57
  ### What the e2e slices wait for
52
58
 
53
- The only explicit barriers before the seventeen slices are their `needs`. They
54
- wait for exactly two jobs:
59
+ The only explicit barriers before the 34 variant/slice jobs are their `needs`.
60
+ They wait for exactly two jobs:
55
61
 
56
62
  - **`image`**, because a slice adopts the published image rather than building
57
63
  it, so it cannot start before that image is known to exist. On a hit this is
58
64
  two manifest inspections, and it is what sets the floor.
59
65
  - **`quick-gate`**, `just lint && just typecheck` on one interpreter: the
60
- cheapest signal that the tree is not obviously broken, so seventeen runners
61
- do not spend roughly 73 minutes discovering a syntax error. Four seconds of work,
66
+ cheapest signal that the tree is not obviously broken, so 34 runners do not
67
+ spend roughly 146 minutes discovering a syntax error. Four seconds of work,
62
68
  sized to finish inside `image` and therefore free.
63
69
 
64
70
  They used to wait for `preflight-success`, which meant the whole five-version
@@ -105,19 +111,23 @@ Docker E2E is not collected for coverage.
105
111
 
106
112
  ## Docker E2E
107
113
 
108
- `just test-e2e-smoke` runs the entire local single-machine smoke matrix through Docker. In the CI merge gate, the same collection runs as seventeen parallel
109
- jobs, one per slice, named `e2e-<slice>`. Each smoke run writes generated
110
- config, catmux pane logs, Docker logs when available, and the smoke verification
111
- log under `session-instances/`; collect that directory as the first debugging
112
- artifact when an E2E job fails.
114
+ `just test-e2e-smoke` runs the entire local single-machine smoke matrix through
115
+ Docker using the selected config (Kilted by default). In the CI merge gate, the
116
+ same collection runs for both Kilted and Lyrical as 34 parallel jobs, one per
117
+ variant/slice pair, named `e2e-<variant>-<slice>`. Each smoke run writes
118
+ generated config, catmux pane logs, Docker logs when available, and the smoke
119
+ verification log under `session-instances/`; collect that directory as the
120
+ first debugging artifact when an E2E job fails.
113
121
 
114
122
  ### The e2e image is published once, not rebuilt per job
115
123
 
116
124
  Every e2e job used to build the project image from scratch. #236 measured that
117
125
  at 154s per job — 57s pulling the multi-GB ROS base from Docker Hub, 40s
118
126
  exporting layers, 47s of apt and pip — which was 33 minutes of runner time and
119
- thirteen Hub pulls with the matrix at that time. The image is still published
120
- only once now that the diagnostic matrix has seventeen jobs.
127
+ thirteen Hub pulls with the matrix at that time. Each distribution-specific
128
+ communication image is now published once, despite the 17 consumers per
129
+ variant; scenario application images common to both variants are deduplicated
130
+ by their content-addressed references.
121
131
 
122
132
  The `image` job now publishes those images to
123
133
  `ghcr.io/<owner>/rosotacom-e2e` and each slice pulls instead of building. GHCR
@@ -161,6 +171,9 @@ Two properties are worth keeping in mind when changing this:
161
171
  image from a different package list, so `rosotacom image references` walks the
162
172
  project config *and* every scenario application. Publishing only the project
163
173
  image would leave that slice adopting something nobody published.
174
+ - **Both ROS variants are published.** The publisher resolves the project once
175
+ with the default Kilted config and once with the opt-in Lyrical config. A
176
+ variant's reference is built under the same selection that derived it.
164
177
  - **The release and nightly lanes still build from scratch**, as does the
165
178
  nightly `image-scan`. That is deliberate: they are what would notice if a
166
179
  published image and a fresh build ever stopped agreeing.
@@ -256,10 +269,12 @@ The deterministic benchmark rows gate against committed two-sided bands
256
269
  ## Nightly And Maintenance Checks
257
270
 
258
271
  `.github/workflows/nightly-e2e.yml` runs the local smoke slice plus the generated
259
- RMW matrix nightly on GitHub-hosted infrastructure and also supports manual
260
- dispatch. It is not the private OTA promotion gate.
261
- `.github/workflows/image-scan.yml` builds the default communication image and
262
- uploads an advisory Trivy report.
272
+ RMW matrix for both Kilted and Lyrical nightly on GitHub-hosted infrastructure
273
+ and also supports manual dispatch. It is not the private OTA promotion gate.
274
+ `.github/workflows/image-scan.yml` builds both communication variants and
275
+ uploads one advisory Trivy report per image. The dedicated performance gate
276
+ remains on the default Kilted config because its committed budgets are
277
+ distribution-specific; switching the default requires a fresh calibration.
263
278
 
264
279
  Dependabot is configured for weekly grouped GitHub Actions and Python dependency
265
280
  updates.
@@ -32,6 +32,8 @@ living verification hook.
32
32
  - [A bridge that learns types from the graph cannot use a transport that does not carry the graph](graph-derived-types-block-a-non-graph-transport.md) - over `zenoh_ros2dds` the payload topic never arrived in either run: the bridge routes a topic once a local reader exists and the reader waited for the bridge, leaving only `Pending=1` in a log.
33
33
  - [A Fast DDS datagram cap stops every message larger than it](fastdds-datagram-cap-drops-large-samples.md) - copying CycloneDDS's 1200 B fragment size into the Fast DDS OTA profile makes every sample above the cap never arrive, at 1200 B and at 8192 B, sync and async — while the 84 B heartbeat keeps flowing at 10 Hz.
34
34
  - [A lost keyframe silences exactly the next gop_size−2 deltas](keyframe-loss-kills-the-next-deltas.md) - libavcodec emits nothing for them, the last delta decodes with artifacts, the next keyframe restores clean decode; a lost delta never blocks decode — so the display hole is gop_size × frame period, deterministically.
35
+ - [Any transport element in a Fast DDS profile doubles every sample on the wire](a-transport-element-doubles-every-fastdds-sample.md) - 366 datagrams for 180 samples against 183 without it; `<builtinTransports>DEFAULT` is a no-op selection and doubles too, so the trigger is the element's presence — removing it takes the shipped OTA profile from 2.10x the payload to 1.04x at identical delivery.
36
+ - [Lifespan is enforced by one DDS reader and not the other](lifespan-is-enforced-by-one-reader-and-not-the-other.md) - under the same 20% oversubscription both stacks queue alike (472 and 433 delivered at ~1.1-1.2 s); with `lifespan: 0.7` CycloneDDS is unchanged and delivers 9.1% inside the bound, while Fast DDS drops to 4 delivered and never exceeds 570 ms — the policy decides shown-vs-suppressed, not how long the wait is.
35
37
  - [Oversubscription queues — it does not lose until the queue itself dies](oversubscription-queues-not-losses.md) - 16% over an emulated cap climbed one-way delay 340 → 3250 ms across twelve bins with zero loss in every one; the losses arrived only when the queue died, all at once.
36
38
  - [Best-effort reordering becomes reader-side loss, independent of history depth](reorder-becomes-reader-loss.md) - under pure delay jitter a Cyclone best-effort reader discards every overtaken sample (57% at 100 Hz under 50+-45 ms), delivery stays strictly monotonic, and depth 50 loses the same as depth 1.
37
39
  - [Jitter causes loss while bandwidth shortage builds latency](jitter-loss-bandwidth-latency.md) - 18 KB at 20 Hz separates jitter-induced loss from bandwidth-induced queueing.