rosotacom-dev 2.5.dev23__tar.gz → 2.5.dev26__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 (343) hide show
  1. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/CONCURRENCY.md +20 -0
  2. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/PKG-INFO +10 -1
  3. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/README.md +9 -0
  4. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/cli.py +73 -8
  5. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/ros2docker.json +11 -3
  6. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_a/external.ros2docker.json +2 -2
  7. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_b/external.ros2docker.json +2 -2
  8. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_a/external.ros2docker.json +1 -1
  9. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_b/external.ros2docker.json +1 -1
  10. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_a/external.ros2docker.json +1 -1
  11. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_b/external.ros2docker.json +1 -1
  12. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ros2docker.json.example +11 -3
  13. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom_dev.egg-info/PKG-INFO +10 -1
  14. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom_dev.egg-info/scm_version.json +2 -2
  15. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/tests/contract/test_packaged_resources.py +9 -1
  16. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/tests/unit/test_cli.py +59 -0
  17. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/tests/unit/test_concurrency.py +128 -2
  18. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/.devcontainer/devcontainer.json.template +0 -0
  19. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/.devcontainer/re_generate_devcontainer_json.py +0 -0
  20. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/.github/CODEOWNERS +0 -0
  21. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/.github/ISSUE_TEMPLATE/documentation-audit.md +0 -0
  22. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/.github/ISSUE_TEMPLATE/implementation-cleanup.md +0 -0
  23. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/.github/ISSUE_TEMPLATE/quality-workflow.md +0 -0
  24. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/.github/ISSUE_TEMPLATE/redesign.md +0 -0
  25. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/.github/ISSUE_TEMPLATE/release-process.md +0 -0
  26. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/.github/ISSUE_TEMPLATE/repository-diagnosis.md +0 -0
  27. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/.github/ISSUE_TEMPLATE/test-ci-audit.md +0 -0
  28. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/.github/ISSUE_TEMPLATE/work-item.md +0 -0
  29. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  30. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/.github/dependabot.yml +0 -0
  31. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/.github/workflows/benchmark-calibrate.yml +0 -0
  32. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/.github/workflows/benchmark-gate.yml +0 -0
  33. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/.github/workflows/dev-release.yml +0 -0
  34. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/.github/workflows/image-scan.yml +0 -0
  35. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/.github/workflows/nightly-e2e.yml +0 -0
  36. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/.github/workflows/pr-lightweight.yml +0 -0
  37. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/.github/workflows/pr-merge-gate.yml +0 -0
  38. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/.github/workflows/release.yml +0 -0
  39. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/.pre-commit-config.yaml +0 -0
  40. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/AGENTS.md +0 -0
  41. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/CONTRIBUTING.md +0 -0
  42. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/DEVELOPMENT_PRINCIPLES.md +0 -0
  43. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/LICENSE.txt +0 -0
  44. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/MANIFEST.in +0 -0
  45. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/budgets.jsonl +0 -0
  46. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/calibration/README.md +0 -0
  47. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/calibration/capacity-size-tight-cyclone.json +0 -0
  48. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/calibration/probe-loss-gop-tight-cyclone.json +0 -0
  49. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/calibration/probe-loss-nominal-cyclone.json +0 -0
  50. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/calibration/probe-loss-tight-cyclone.json +0 -0
  51. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/calibration/probe-loss-tight-fastdds.json +0 -0
  52. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/calibration/probe-loss-tight-zenoh.json +0 -0
  53. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/codecov.yml +0 -0
  54. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/deployment-configuration.md +0 -0
  55. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/docs/benchmark-ab.md +0 -0
  56. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/docs/benchmark-bag-as-load.md +0 -0
  57. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/docs/ci.md +0 -0
  58. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/docs/ffmpeg-keyframes.md +0 -0
  59. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/docs/findings/README.md +0 -0
  60. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/docs/findings/cyclone-spdp-discovery-bursts.md +0 -0
  61. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/docs/findings/delay-alone-no-loss.md +0 -0
  62. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/docs/findings/head-of-line-irregularity.md +0 -0
  63. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/docs/findings/jitter-loss-bandwidth-latency.md +0 -0
  64. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/docs/findings/lighter-message-loss.md +0 -0
  65. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/docs/findings/zero-loss-boundaries-18kb-20hz.md +0 -0
  66. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/docs/forensics-report.md +0 -0
  67. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/docs/geo-link-map.md +0 -0
  68. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/docs/github-repository-settings.md +0 -0
  69. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/docs/link-trace.md +0 -0
  70. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/docs/owner-runbook.md +0 -0
  71. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/docs/performance-bands.md +0 -0
  72. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/docs/playbooks/README.md +0 -0
  73. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/docs/quality-model.md +0 -0
  74. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/docs/release-notes/TEMPLATE.md +0 -0
  75. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/docs/release-notes/v2.1.md +0 -0
  76. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/docs/release-notes/v2.2.md +0 -0
  77. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/docs/release-notes/v2.3.md +0 -0
  78. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/docs/release-notes/v2.4.md +0 -0
  79. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/docs/release.md +0 -0
  80. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/docs/rfcs/0001-expectation-driven-test-suite.md +0 -0
  81. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/docs/rfcs/0002-expectation-concepts.md +0 -0
  82. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/docs/rfcs/0003-metric-backbone.md +0 -0
  83. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/docs/rfcs/0004-network-profiles.md +0 -0
  84. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/docs/rfcs/0005-benchmark-genres-and-ci.md +0 -0
  85. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/docs/rfcs/0006-dynamic-qos.md +0 -0
  86. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/docs/rfcs/0007-regression-gate.md +0 -0
  87. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/docs/rfcs/README.md +0 -0
  88. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/docs/testing.md +0 -0
  89. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/docs/work-items.md +0 -0
  90. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/install.sh +0 -0
  91. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/justfile +0 -0
  92. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/media/control_center.png +0 -0
  93. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/media/echo_test.png +0 -0
  94. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/media/forensics-report-example.png +0 -0
  95. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/media/host.png +0 -0
  96. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/media/vehicle.png +0 -0
  97. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/pyproject.toml +0 -0
  98. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/requirements.txt +0 -0
  99. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/rosotacom.yaml +0 -0
  100. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/run_session_in_container.py +0 -0
  101. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/session-configuration.md +0 -0
  102. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/setup.cfg +0 -0
  103. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/__init__.py +0 -0
  104. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/__main__.py +0 -0
  105. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/anonymize.py +0 -0
  106. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/bag_ground_truth.py +0 -0
  107. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/benched_set.py +0 -0
  108. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/benchmark.py +0 -0
  109. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/benchmark_delta.py +0 -0
  110. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/bundle_check.py +0 -0
  111. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/cli_benchmark.py +0 -0
  112. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/deployment.py +0 -0
  113. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/ffmpeg_packet.py +0 -0
  114. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/forensics.py +0 -0
  115. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/geomap.py +0 -0
  116. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/image_cache.py +0 -0
  117. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/network_profiles.py +0 -0
  118. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/network_shaper.py +0 -0
  119. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/plots.py +0 -0
  120. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/py.typed +0 -0
  121. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/benched-set.yaml +0 -0
  122. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/.gitignore +0 -0
  123. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/README.md +0 -0
  124. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/__init__.py +0 -0
  125. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/bags/8_drop_reference/metadata.yaml +0 -0
  126. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/deployment.example.yaml +0 -0
  127. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/profiles.yaml +0 -0
  128. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/rosotacom.yaml +0 -0
  129. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scenarios/2_native_chatter/scenario-definition.yaml +0 -0
  130. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/1_heartbeat/run_machine_a.sh +0 -0
  131. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/1_heartbeat/run_machine_b.sh +0 -0
  132. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_a/run_communication.sh +0 -0
  133. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_a/run_external.py +0 -0
  134. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_a/wait_for_echo_topic.sh +0 -0
  135. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_b/run_communication.sh +0 -0
  136. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_b/run_external.py +0 -0
  137. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_a/external.ros2docker.json +0 -0
  138. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_a/external_session.yaml +0 -0
  139. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_a/foxglove.json +0 -0
  140. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_a/run_communication.sh +0 -0
  141. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_a/run_external.py +0 -0
  142. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_b/costmap_1second/costmap_1second_0.mcap +0 -0
  143. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_b/costmap_1second/metadata.yaml +0 -0
  144. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_b/external.ros2docker.json +0 -0
  145. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_b/run_communication.sh +0 -0
  146. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_b/run_external.py +0 -0
  147. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_a/external.ros2docker.json +0 -0
  148. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_a/external_session.yaml +0 -0
  149. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_a/foxglove.json +0 -0
  150. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_a/run_communication.sh +0 -0
  151. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_a/run_external.py +0 -0
  152. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_b/costmap_1second/costmap_1second_0.mcap +0 -0
  153. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_b/costmap_1second/metadata.yaml +0 -0
  154. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_b/external.ros2docker.json +0 -0
  155. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_b/run_communication.sh +0 -0
  156. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_b/run_external.py +0 -0
  157. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_a/external_session.yaml +0 -0
  158. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_a/run_communication.sh +0 -0
  159. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_a/run_external.py +0 -0
  160. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_b/external_session.yaml +0 -0
  161. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_b/run_communication.sh +0 -0
  162. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_b/run_external.py +0 -0
  163. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_a/external_session.yaml +0 -0
  164. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_a/run_communication.sh +0 -0
  165. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_a/run_external.py +0 -0
  166. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_b/external_session.yaml +0 -0
  167. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_b/run_communication.sh +0 -0
  168. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_b/run_external.py +0 -0
  169. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/sessions/10_restamp/session-definition.yaml +0 -0
  170. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/sessions/11_trickle/session-definition.yaml +0 -0
  171. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/sessions/12_content_integrity/session-definition.yaml +0 -0
  172. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/sessions/13_link_latency/session-definition.yaml +0 -0
  173. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/sessions/14_remote_assist_anonymized/session-definition.yaml +0 -0
  174. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/sessions/15_remote_assist_anonymized_costmap/session-definition.yaml +0 -0
  175. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/sessions/16_remote_assist_anonymized_camera/session-definition.yaml +0 -0
  176. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/sessions/17_synthetic_camera_quality/session-definition.yaml +0 -0
  177. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/sessions/1_heartbeat/session-definition.yaml +0 -0
  178. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/sessions/1_heartbeat_status/session-definition.yaml +0 -0
  179. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/sessions/2_native_chatter/session-definition.yaml +0 -0
  180. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/sessions/3_comp_occ_grid/session-definition.yaml +0 -0
  181. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/sessions/4_comp_occ_grid_zen/session-definition.yaml +0 -0
  182. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/sessions/5_sized_payload/session-definition.yaml +0 -0
  183. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/sessions/6_sized_payload_zen/session-definition.yaml +0 -0
  184. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/sessions/7_latched_static/session-definition.yaml +0 -0
  185. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/sessions/8_drop/session-definition.yaml +0 -0
  186. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/sessions/9_throttle/session-definition.yaml +0 -0
  187. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/sessions/bench_1_1_capacity/session-definition.yaml +0 -0
  188. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/sessions/bench_1_2_load_sweep/session-definition.yaml +0 -0
  189. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/sessions/bench_1_3_ramp/session-definition.yaml +0 -0
  190. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/sessions/bench_1_4_recovery/session-definition.yaml +0 -0
  191. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/sessions/bench_1_5_camera/session-definition.yaml +0 -0
  192. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/.vscode/c_cpp_properties.json +0 -0
  193. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/.vscode/settings.json +0 -0
  194. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_easy_mode.xml.template +0 -0
  195. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_initial_peer_list.xml.template +0 -0
  196. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_v2.xml.template +0 -0
  197. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_v3.xml.template +0 -0
  198. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_v4.xml.template +0 -0
  199. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_v5.xml.template +0 -0
  200. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ota_configs/create_zenoh_json5.py +0 -0
  201. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ota_configs/cyclonedds_minimal.xml.template +0 -0
  202. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ota_configs/cyclonedds_tuned.xml.template +0 -0
  203. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ota_configs/fastdds_unicast.xml.template +0 -0
  204. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ota_configs/get_ota_xml.py +0 -0
  205. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ota_configs/utils.py +0 -0
  206. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ota_configs/zenoh.json5.template +0 -0
  207. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/.gitkeep +0 -0
  208. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_cpp/CMakeLists.txt +0 -0
  209. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_cpp/COLCON_IGNORE +0 -0
  210. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_cpp/LICENSE.txt +0 -0
  211. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_cpp/package.xml +0 -0
  212. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_cpp/src/hz_monitor.cpp +0 -0
  213. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_cpp/src/universal_compressor.cpp +0 -0
  214. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_cpp/src/universal_decompressor.cpp +0 -0
  215. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_msgs/CMakeLists.txt +0 -0
  216. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_msgs/LICENSE.txt +0 -0
  217. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_msgs/msg/CompressedData.msg +0 -0
  218. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_msgs/msg/EchoHeartbeat.msg +0 -0
  219. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_msgs/msg/OtaStamped.msg +0 -0
  220. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_msgs/msg/SizedPayload.msg +0 -0
  221. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_msgs/package.xml +0 -0
  222. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/LICENSE.txt +0 -0
  223. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/com_py/__init__.py +0 -0
  224. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/com_py/base_bridge_relay.py +0 -0
  225. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/com_py/bridge_in.py +0 -0
  226. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/com_py/bridge_out.py +0 -0
  227. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/com_py/heartbeat_echo.py +0 -0
  228. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/com_py/hz_monitor.py +0 -0
  229. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/com_py/image_bandwidth_reducer.py +0 -0
  230. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/com_py/image_pixel_capper.py +0 -0
  231. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/com_py/lanelet_saver.py +0 -0
  232. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/com_py/latch_relay.py +0 -0
  233. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/costmap_remapper.py +0 -0
  234. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/marker_remapper.py +0 -0
  235. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/speed_test.py +0 -0
  236. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/tf_remapper.py +0 -0
  237. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/traffic_monitor.py +0 -0
  238. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/wifi_network_analysis_1.py +0 -0
  239. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/com_py/link_bytes.py +0 -0
  240. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/com_py/link_trace.py +0 -0
  241. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/com_py/local_global_frame_bridge.py +0 -0
  242. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/com_py/localization_map_split_reduce_saver.py +0 -0
  243. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/com_py/msg_transform.py +0 -0
  244. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/com_py/pair_management.py +0 -0
  245. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/com_py/pub_sub_pair.py +0 -0
  246. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/com_py/qos.py +0 -0
  247. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/com_py/relay_in.py +0 -0
  248. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/com_py/relay_out.py +0 -0
  249. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/com_py/restamp.py +0 -0
  250. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/com_py/sized_publisher.py +0 -0
  251. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/com_py/stage_latency.py +0 -0
  252. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/com_py/stage_latency_core.py +0 -0
  253. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/com_py/status_overview.py +0 -0
  254. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/com_py/status_overview_core.py +0 -0
  255. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/com_py/tf_map_to_cart_saver.py +0 -0
  256. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/com_py/topic_monitor.py +0 -0
  257. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/com_py/topic_resolution.py +0 -0
  258. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/com_py/trickle.py +0 -0
  259. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/com_py/universal_compressor.py +0 -0
  260. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/com_py/universal_decompressor.py +0 -0
  261. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/com_py/universal_ota_unwrapper.py +0 -0
  262. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/com_py/universal_ota_wrapper.py +0 -0
  263. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/package.xml +0 -0
  264. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/resource/com_py +0 -0
  265. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/setup.cfg +0 -0
  266. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/setup.py +0 -0
  267. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/test/test_copyright.py +0 -0
  268. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/test/test_flake8.py +0 -0
  269. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/test/test_pep257.py +0 -0
  270. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/session/content/base/session_plugin_base.yaml +0 -0
  271. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/session/content/network/up_connectivity.py +0 -0
  272. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/session/content/network/wifi_network_analysis_2.py +0 -0
  273. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/session/creation/anonymize_bag.py +0 -0
  274. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/session/creation/catmux_log_setup.sh +0 -0
  275. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/session/creation/create_session_yaml.py +0 -0
  276. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/session/creation/generate_session_files.py +0 -0
  277. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/session/creation/run_session.py +0 -0
  278. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/session/creation/run_session_in_external_terminal.py +0 -0
  279. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/session/creation/strip_ansi.py +0 -0
  280. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/status_eval.py +0 -0
  281. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/stream_stats.py +0 -0
  282. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/trace_profiles.py +0 -0
  283. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/transit.py +0 -0
  284. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom/video_quality.py +0 -0
  285. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom_dev.egg-info/SOURCES.txt +0 -0
  286. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom_dev.egg-info/dependency_links.txt +0 -0
  287. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom_dev.egg-info/entry_points.txt +0 -0
  288. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom_dev.egg-info/requires.txt +0 -0
  289. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom_dev.egg-info/scm_file_list.json +0 -0
  290. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/src/rosotacom_dev.egg-info/top_level.txt +0 -0
  291. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/stop_session_in_container.py +0 -0
  292. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/terminology.md +0 -0
  293. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/tests/contract/test_benched_set_registry.py +0 -0
  294. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/tests/contract/test_findings.py +0 -0
  295. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/tests/contract/test_markdown_links.py +0 -0
  296. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/tests/contract/test_ota_source_bundle.py +0 -0
  297. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/tests/contract/test_package_metadata.py +0 -0
  298. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/tests/contract/test_profile_covers_generated_commands.py +0 -0
  299. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/tests/contract/test_pytest_policy.py +0 -0
  300. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/tests/contract/test_readme_examples.py +0 -0
  301. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/tests/contract/test_security_maintenance_config.py +0 -0
  302. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/tests/contract/test_session_configuration_doc.py +0 -0
  303. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/tests/contract/test_workflow_contracts.py +0 -0
  304. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/tests/e2e/conftest.py +0 -0
  305. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/tests/e2e/test_anonymize_e2e.py +0 -0
  306. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/tests/e2e/test_benchmark_ab.py +0 -0
  307. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/tests/e2e/test_benchmark_capacity.py +0 -0
  308. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/tests/e2e/test_benchmark_replay.py +0 -0
  309. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/tests/e2e/test_parallel_smoke.py +0 -0
  310. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/tests/e2e/test_smoke.py +0 -0
  311. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/tests/e2e/test_timeline_stepping.py +0 -0
  312. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/tests/e2e/test_video_quality_e2e.py +0 -0
  313. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/tests/sessions/generate_rmw_matrix.py +0 -0
  314. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/tests/sessions/rmw_matrix/1_heartbeat_cyclone-local_zenoh-ros2dds-ota/session-definition.yaml +0 -0
  315. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/tests/sessions/rmw_matrix/1_heartbeat_cyclone-ota/session-definition.yaml +0 -0
  316. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/tests/sessions/rmw_matrix/1_heartbeat_cyclone-ota-tuned/session-definition.yaml +0 -0
  317. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/tests/sessions/rmw_matrix/1_heartbeat_fastdds/session-definition.yaml +0 -0
  318. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/tests/sessions/rmw_matrix/1_heartbeat_zen-endpoints/session-definition.yaml +0 -0
  319. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/tests/unit/test_anonymize.py +0 -0
  320. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/tests/unit/test_bag_ground_truth.py +0 -0
  321. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/tests/unit/test_benched_set.py +0 -0
  322. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/tests/unit/test_benchmark.py +0 -0
  323. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/tests/unit/test_benchmark_delta.py +0 -0
  324. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/tests/unit/test_bundle_check.py +0 -0
  325. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/tests/unit/test_cli_benchmark.py +0 -0
  326. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/tests/unit/test_deployment.py +0 -0
  327. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/tests/unit/test_ffmpeg_packet.py +0 -0
  328. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/tests/unit/test_forensics.py +0 -0
  329. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/tests/unit/test_geomap.py +0 -0
  330. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/tests/unit/test_image_cache.py +0 -0
  331. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/tests/unit/test_link_bytes.py +0 -0
  332. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/tests/unit/test_link_trace.py +0 -0
  333. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/tests/unit/test_network_profiles.py +0 -0
  334. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/tests/unit/test_network_shaper.py +0 -0
  335. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/tests/unit/test_ota_xml.py +0 -0
  336. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/tests/unit/test_plots.py +0 -0
  337. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/tests/unit/test_stage_latency.py +0 -0
  338. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/tests/unit/test_status_eval.py +0 -0
  339. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/tests/unit/test_status_overview.py +0 -0
  340. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/tests/unit/test_stream_stats.py +0 -0
  341. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/tests/unit/test_trace_profiles.py +0 -0
  342. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/tests/unit/test_transit.py +0 -0
  343. {rosotacom_dev-2.5.dev23 → rosotacom_dev-2.5.dev26}/tests/unit/test_video_quality.py +0 -0
@@ -39,6 +39,26 @@ commands *discover* the matching containers from Docker instead of recomputing
39
39
  fixed names — they clean up every instance for the requested identity/target,
40
40
  including leftovers from crashed runs.
41
41
 
42
+ ## Opting out: fixed, human-readable names
43
+
44
+ A project whose machines are read by people rather than by CI — a demo or
45
+ operations project — can set `com_container_prefix` in its `rosotacom.yaml`:
46
+
47
+ ```yaml
48
+ com_container_prefix: remote-assist
49
+ ```
50
+
51
+ Session communication containers are then named
52
+ `<prefix>_com-to-<remote-peer>` (e.g. `remote-assist_com-to-center`): stable
53
+ across runs and legible in `docker ps`, at the price of parallelism — a second
54
+ start of the same session on the same host is a name conflict. That conflict is
55
+ detected in the same preflight as everything else: `--force` (the session
56
+ default) replaces the running container, `--no-force` aborts with its name.
57
+ Conflict discovery matches **both** naming schemes, so a leftover
58
+ instance-scoped container is still found and replaced after a project switches
59
+ modes. Test and CI projects should leave the key unset and keep the
60
+ collision-free instance-scoped names.
61
+
42
62
  ## How conflicts are detected (fail-safe preflight)
43
63
 
44
64
  Each start command checks Docker before it allocates anything, and aborts with
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rosotacom-dev
3
- Version: 2.5.dev23
3
+ Version: 2.5.dev26
4
4
  Summary: Host CLI for ROS OTA communication sessions.
5
5
  Author: develNor
6
6
  License-Expression: BSD-3-Clause
@@ -227,6 +227,15 @@ scripts/
227
227
  project-local directories first and shared/example directories later when one
228
228
  project should discover both.
229
229
 
230
+ `com_container_prefix` (optional) trades concurrency for readability: when set,
231
+ session communication containers get the stable name
232
+ `<prefix>_com-to-<remote-peer>` (e.g. `remote-assist_com-to-center`) instead of
233
+ the default workspace- and instance-scoped unique name. Set it in projects whose
234
+ machines are read by people (`docker ps` during a demo, next to colleagues'
235
+ containers); leave it unset in test/CI projects, where concurrent instances must
236
+ never collide on a name. [CONCURRENCY.md](CONCURRENCY.md) has the exact
237
+ conflict semantics.
238
+
230
239
  ### Locating packaged resources
231
240
 
232
241
  rosotacom is installed in an isolated environment (pipx, or a project venv), so
@@ -182,6 +182,15 @@ scripts/
182
182
  project-local directories first and shared/example directories later when one
183
183
  project should discover both.
184
184
 
185
+ `com_container_prefix` (optional) trades concurrency for readability: when set,
186
+ session communication containers get the stable name
187
+ `<prefix>_com-to-<remote-peer>` (e.g. `remote-assist_com-to-center`) instead of
188
+ the default workspace- and instance-scoped unique name. Set it in projects whose
189
+ machines are read by people (`docker ps` during a demo, next to colleagues'
190
+ containers); leave it unset in test/CI projects, where concurrent instances must
191
+ never collide on a name. [CONCURRENCY.md](CONCURRENCY.md) has the exact
192
+ conflict semantics.
193
+
185
194
  ### Locating packaged resources
186
195
 
187
196
  rosotacom is installed in an isolated environment (pipx, or a project venv), so
@@ -181,6 +181,7 @@ class RuntimeConfig:
181
181
  scenario_configs_dir: tuple[Path, ...] = ()
182
182
  profiles_file: Path | None = None
183
183
  benchmarks_dir: Path | None = None
184
+ com_container_prefix: str | None = None
184
185
 
185
186
 
186
187
  @dataclass(frozen=True)
@@ -485,6 +486,22 @@ def _resolve_project_config_source(args: argparse.Namespace) -> tuple[str | None
485
486
  return None, None
486
487
 
487
488
 
489
+ _DOCKER_NAME_RE = re.compile(r"^[a-zA-Z0-9][a-zA-Z0-9_.-]*$")
490
+
491
+
492
+ def _validated_com_container_prefix(raw: Any) -> str | None:
493
+ if raw is None:
494
+ return None
495
+ value = str(raw).strip()
496
+ if not value:
497
+ return None
498
+ if not _DOCKER_NAME_RE.match(value):
499
+ raise RuntimeError(
500
+ f"com_container_prefix must be a valid docker name ([a-zA-Z0-9][a-zA-Z0-9_.-]*), got: {raw!r}"
501
+ )
502
+ return value
503
+
504
+
488
505
  def _load_runtime_config(args: argparse.Namespace | None = None) -> RuntimeConfig:
489
506
  args = args or argparse.Namespace()
490
507
  rosotacom_config_raw, project_source = _resolve_project_config_source(args)
@@ -499,6 +516,7 @@ def _load_runtime_config(args: argparse.Namespace | None = None) -> RuntimeConfi
499
516
  "deployment",
500
517
  "profiles",
501
518
  "benchmarks_dir",
519
+ "com_container_prefix",
502
520
  }
503
521
  unknown_project_keys = sorted(set(cfg) - allowed_project_keys)
504
522
  if unknown_project_keys:
@@ -543,6 +561,10 @@ def _load_runtime_config(args: argparse.Namespace | None = None) -> RuntimeConfi
543
561
  os.environ.get("ROSOTACOM_BENCHMARKS_DIR"),
544
562
  cfg.get("benchmarks_dir"),
545
563
  )
564
+ com_container_prefix_raw = _first_value(
565
+ os.environ.get("ROSOTACOM_COM_CONTAINER_PREFIX"),
566
+ cfg.get("com_container_prefix"),
567
+ )
546
568
 
547
569
  ros2docker_config = _resolve_path(ros2docker_config_raw, config_base, must_exist=True)
548
570
  if ros2docker_config is None:
@@ -575,6 +597,7 @@ def _load_runtime_config(args: argparse.Namespace | None = None) -> RuntimeConfi
575
597
  ),
576
598
  profiles_file=_resolve_path(profiles_raw, config_base, must_exist=True),
577
599
  benchmarks_dir=_resolve_path(benchmarks_dir_raw, config_base, must_exist=False),
600
+ com_container_prefix=_validated_com_container_prefix(com_container_prefix_raw),
578
601
  )
579
602
 
580
603
 
@@ -663,7 +686,23 @@ def _workspace_container_prefix(runtime: RuntimeConfig) -> str:
663
686
  return f"rosotacom_{runtime.install_id}_"
664
687
 
665
688
 
689
+ def _fixed_com_container_name(runtime: RuntimeConfig, remote_peer_name: str) -> str | None:
690
+ """The stable, human-readable com container name, when the project opts in.
691
+
692
+ A project sets ``com_container_prefix`` when people read ``docker ps`` on its
693
+ machines (demos, operations). The price is concurrency: two instances of the
694
+ same session cannot run side by side on one host, which is why test/CI
695
+ projects leave the key unset and keep the instance-scoped names.
696
+ """
697
+ if not runtime.com_container_prefix:
698
+ return None
699
+ return _sanitize_docker_name(f"{runtime.com_container_prefix}_com-to-{remote_peer_name}")
700
+
701
+
666
702
  def _container_name(remote_peer_name: str, runtime: RuntimeConfig, instance_id: str) -> str:
703
+ fixed = _fixed_com_container_name(runtime, remote_peer_name)
704
+ if fixed is not None:
705
+ return fixed
667
706
  return _sanitize_docker_name(
668
707
  f"rosotacom_{runtime.install_id}_{_instance_name_token(instance_id)}_com_to_{remote_peer_name}"
669
708
  )
@@ -697,10 +736,19 @@ def _list_docker_containers(*, all_states: bool = False) -> list[tuple[str, list
697
736
 
698
737
 
699
738
  def _matching_com_containers(runtime: RuntimeConfig, remote_peer_name: str, *, all_states: bool = False) -> list[str]:
700
- """Workspace communication containers for `remote_peer_name`, any instance."""
739
+ """Workspace communication containers for `remote_peer_name`, any instance.
740
+
741
+ Matches both naming schemes — the instance-scoped default and the fixed
742
+ ``com_container_prefix`` name — so a leftover container from the other mode
743
+ is still found after a project toggles the key.
744
+ """
701
745
  suffix = _sanitize_docker_name(f"com_to_{remote_peer_name}")
746
+ fixed = _fixed_com_container_name(runtime, remote_peer_name)
702
747
  names = []
703
748
  for name, _networks in _list_docker_containers(all_states=all_states):
749
+ if fixed is not None and name == fixed:
750
+ names.append(name)
751
+ continue
704
752
  parts = _split_workspace_container(name, runtime)
705
753
  if parts is not None and parts[1] == suffix:
706
754
  names.append(name)
@@ -4350,7 +4398,13 @@ def _load_scenario_definition(resolved: ResolvedScenario) -> ScenarioDefinition:
4350
4398
  assert config_path is not None
4351
4399
  if not config_path.is_file():
4352
4400
  raise RuntimeError(f"{context}.ros2docker_config must resolve to a file: {config_path}")
4353
- load_config(config_path)
4401
+ # Structural validation only. A definition names applications for
4402
+ # every peer, and a `-v` host path (a staged replay bag, a local
4403
+ # workspace) is only required to exist on the machine that starts
4404
+ # that application — which validates it in `_run-application`.
4405
+ # Resolving run args here would make every peer demand every other
4406
+ # peer's machine-local artifacts (#249).
4407
+ load_config(config_path, resolve_run_args=False)
4354
4408
  seen_names.add(name)
4355
4409
  parsed_entries.append(ScenarioApplication(name=name, ros2docker_config=config_path))
4356
4410
  applications[identity] = tuple(parsed_entries)
@@ -4900,7 +4954,13 @@ def start_session(args: argparse.Namespace) -> str:
4900
4954
  container_name = _container_name(remote_name, runtime, instance.instance_id)
4901
4955
  network_isolated = bool(getattr(args, "network_name", None))
4902
4956
  if not network_isolated and not getattr(args, "skip_conflict_check", False):
4903
- conflicts = [name for name in _matching_com_containers(runtime, remote_name) if name != container_name]
4957
+ matching = _matching_com_containers(runtime, remote_name)
4958
+ if _fixed_com_container_name(runtime, remote_name) is not None:
4959
+ # A fixed name cannot coexist with itself: a running container with
4960
+ # this exact name is a conflict too, not a rejoinable instance.
4961
+ conflicts = matching
4962
+ else:
4963
+ conflicts = [name for name in matching if name != container_name]
4904
4964
  if conflicts and args.force:
4905
4965
  for conflict in conflicts:
4906
4966
  _stop_container_name(conflict, runtime, quiet_missing=True)
@@ -5616,15 +5676,20 @@ def ps_command(args: argparse.Namespace) -> int:
5616
5676
  """Answer "can I start something?" by classifying active rosotacom containers."""
5617
5677
  runtime = _load_runtime_config(args)
5618
5678
  prefix = _workspace_container_prefix(runtime)
5679
+ fixed_com_prefix = (
5680
+ f"{_sanitize_docker_name(runtime.com_container_prefix)}_com-to-" if runtime.com_container_prefix else None
5681
+ )
5619
5682
  smoke_isolated: list[tuple[str, str]] = []
5620
5683
  host_shared: list[str] = []
5621
5684
  other_workspaces: list[str] = []
5622
5685
  for name, networks in _list_docker_containers():
5623
- if not name.startswith("rosotacom_"):
5624
- continue
5625
- if not name.startswith(prefix):
5626
- other_workspaces.append(name)
5627
- continue
5686
+ fixed_named = fixed_com_prefix is not None and name.startswith(fixed_com_prefix)
5687
+ if not fixed_named:
5688
+ if not name.startswith("rosotacom_"):
5689
+ continue
5690
+ if not name.startswith(prefix):
5691
+ other_workspaces.append(name)
5692
+ continue
5628
5693
  smoke_nets = [net for net in networks if net.startswith("rosotacom_smoke_") or net == SMOKE_NETWORK_NAME]
5629
5694
  if smoke_nets:
5630
5695
  smoke_isolated.append((name, smoke_nets[0]))
@@ -23,11 +23,19 @@
23
23
  // using ros2docker profiles (like 'zenoh' or 'project-develnor') because upstream profiles
24
24
  // are currently ROS Lyrical-oriented. Adoption of profiles will be evaluated when
25
25
  // Kilted-compatible profiles are available upstream.
26
+ //
27
+ // The base is ros-base, not desktop-full: 299 MB compressed against 1422 MB,
28
+ // and nothing here runs a GUI (enable_gui_forwarding is false above). The
29
+ // e2e suite was run against both to find out what desktop-full had been
30
+ // providing without anyone declaring it — one package, ros-kilted-gps-msgs,
31
+ // which the anonymized remote-assist session needs for gps_msgs/msg/GPSFix.
32
+ // It is declared below. Add rviz2 or a simulator here if you want them; that
33
+ // is a project's decision, not a default.
26
34
  "build_args": {
27
- "BASE_IMAGE": "osrf/ros:kilted-desktop-full-noble",
28
- "DIGEST": "@sha256:29eb6f48bb06549aba004a7a4b12c00ece23b156731df12cf1f3c1ae1b0fd178",
35
+ "BASE_IMAGE": "ros:kilted-ros-base-noble",
36
+ "DIGEST": "@sha256:4ca53d5b084bdbe92a7a7d7186f56db6a716a6c7c33ad401ddb0ec82d6e9e479",
29
37
  "INSTALL_ZENOH": "1",
30
- "APT_PACKAGES": "iputils-ping psmisc net-tools snmp iw nload iftop iproute2 tshark ros-kilted-domain-bridge ros-kilted-rmw-cyclonedds-cpp ros-kilted-rmw-zenoh-cpp ros-kilted-topic-tools ros-kilted-image-transport ros-kilted-ffmpeg-image-transport ros-kilted-ffmpeg-image-transport-msgs",
38
+ "APT_PACKAGES": "iputils-ping psmisc net-tools snmp iw nload iftop iproute2 tshark ros-kilted-domain-bridge ros-kilted-rmw-cyclonedds-cpp ros-kilted-rmw-zenoh-cpp ros-kilted-topic-tools ros-kilted-image-transport ros-kilted-ffmpeg-image-transport ros-kilted-ffmpeg-image-transport-msgs ros-kilted-gps-msgs",
31
39
  "PIP_PACKAGES": "numpy>=1.26,<2 lz4 pysnmp speedtest-cli psutil zstandard opencv-python"
32
40
  }
33
41
  }
@@ -14,8 +14,8 @@
14
14
  ],
15
15
 
16
16
  "build_args": {
17
- "BASE_IMAGE": "osrf/ros:kilted-desktop-full-noble",
18
- "DIGEST": "@sha256:29eb6f48bb06549aba004a7a4b12c00ece23b156731df12cf1f3c1ae1b0fd178",
17
+ "BASE_IMAGE": "ros:kilted-ros-base-noble",
18
+ "DIGEST": "@sha256:4ca53d5b084bdbe92a7a7d7186f56db6a716a6c7c33ad401ddb0ec82d6e9e479",
19
19
  "APT_PACKAGES": "ros-kilted-rmw-cyclonedds-cpp"
20
20
  }
21
21
  }
@@ -12,8 +12,8 @@
12
12
  ],
13
13
 
14
14
  "build_args": {
15
- "BASE_IMAGE": "osrf/ros:kilted-desktop-full-noble",
16
- "DIGEST": "@sha256:29eb6f48bb06549aba004a7a4b12c00ece23b156731df12cf1f3c1ae1b0fd178",
15
+ "BASE_IMAGE": "ros:kilted-ros-base-noble",
16
+ "DIGEST": "@sha256:4ca53d5b084bdbe92a7a7d7186f56db6a716a6c7c33ad401ddb0ec82d6e9e479",
17
17
  "APT_PACKAGES": "ros-kilted-rmw-cyclonedds-cpp"
18
18
  }
19
19
  }
@@ -15,6 +15,6 @@
15
15
  ],
16
16
 
17
17
  "build_args": {
18
- "BASE_IMAGE": "osrf/ros:kilted-desktop-full-noble"
18
+ "BASE_IMAGE": "ros:kilted-ros-base-noble"
19
19
  }
20
20
  }
@@ -15,6 +15,6 @@
15
15
  ],
16
16
 
17
17
  "build_args": {
18
- "BASE_IMAGE": "osrf/ros:kilted-desktop-full-noble"
18
+ "BASE_IMAGE": "ros:kilted-ros-base-noble"
19
19
  }
20
20
  }
@@ -13,6 +13,6 @@
13
13
  ],
14
14
 
15
15
  "build_args": {
16
- "BASE_IMAGE": "osrf/ros:kilted-desktop-full-noble"
16
+ "BASE_IMAGE": "ros:kilted-ros-base-noble"
17
17
  }
18
18
  }
@@ -13,6 +13,6 @@
13
13
  ],
14
14
 
15
15
  "build_args": {
16
- "BASE_IMAGE": "osrf/ros:kilted-desktop-full-noble"
16
+ "BASE_IMAGE": "ros:kilted-ros-base-noble"
17
17
  }
18
18
  }
@@ -23,11 +23,19 @@
23
23
  // using ros2docker profiles (like 'zenoh' or 'project-develnor') because upstream profiles
24
24
  // are currently ROS Lyrical-oriented. Adoption of profiles will be evaluated when
25
25
  // Kilted-compatible profiles are available upstream.
26
+ //
27
+ // The base is ros-base, not desktop-full: 299 MB compressed against 1422 MB,
28
+ // and nothing here runs a GUI (enable_gui_forwarding is false above). The
29
+ // e2e suite was run against both to find out what desktop-full had been
30
+ // providing without anyone declaring it — one package, ros-kilted-gps-msgs,
31
+ // which the anonymized remote-assist session needs for gps_msgs/msg/GPSFix.
32
+ // It is declared below. Add rviz2 or a simulator here if you want them; that
33
+ // is a project's decision, not a default.
26
34
  "build_args": {
27
- "BASE_IMAGE": "osrf/ros:kilted-desktop-full-noble",
28
- "DIGEST": "@sha256:29eb6f48bb06549aba004a7a4b12c00ece23b156731df12cf1f3c1ae1b0fd178",
35
+ "BASE_IMAGE": "ros:kilted-ros-base-noble",
36
+ "DIGEST": "@sha256:4ca53d5b084bdbe92a7a7d7186f56db6a716a6c7c33ad401ddb0ec82d6e9e479",
29
37
  "INSTALL_ZENOH": "1",
30
- "APT_PACKAGES": "iputils-ping psmisc net-tools snmp iw nload iftop iproute2 tshark ros-kilted-domain-bridge ros-kilted-rmw-cyclonedds-cpp ros-kilted-rmw-zenoh-cpp ros-kilted-topic-tools ros-kilted-image-transport ros-kilted-ffmpeg-image-transport ros-kilted-ffmpeg-image-transport-msgs",
38
+ "APT_PACKAGES": "iputils-ping psmisc net-tools snmp iw nload iftop iproute2 tshark ros-kilted-domain-bridge ros-kilted-rmw-cyclonedds-cpp ros-kilted-rmw-zenoh-cpp ros-kilted-topic-tools ros-kilted-image-transport ros-kilted-ffmpeg-image-transport ros-kilted-ffmpeg-image-transport-msgs ros-kilted-gps-msgs",
31
39
  "PIP_PACKAGES": "numpy>=1.26,<2 lz4 pysnmp speedtest-cli psutil zstandard opencv-python"
32
40
  }
33
41
  }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rosotacom-dev
3
- Version: 2.5.dev23
3
+ Version: 2.5.dev26
4
4
  Summary: Host CLI for ROS OTA communication sessions.
5
5
  Author: develNor
6
6
  License-Expression: BSD-3-Clause
@@ -227,6 +227,15 @@ scripts/
227
227
  project-local directories first and shared/example directories later when one
228
228
  project should discover both.
229
229
 
230
+ `com_container_prefix` (optional) trades concurrency for readability: when set,
231
+ session communication containers get the stable name
232
+ `<prefix>_com-to-<remote-peer>` (e.g. `remote-assist_com-to-center`) instead of
233
+ the default workspace- and instance-scoped unique name. Set it in projects whose
234
+ machines are read by people (`docker ps` during a demo, next to colleagues'
235
+ containers); leave it unset in test/CI projects, where concurrent instances must
236
+ never collide on a name. [CONCURRENCY.md](CONCURRENCY.md) has the exact
237
+ conflict semantics.
238
+
230
239
  ### Locating packaged resources
231
240
 
232
241
  rosotacom is installed in an isolated environment (pipx, or a project venv), so
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "tag": "2.4",
3
- "distance": 23,
4
- "node": "g2e88f13f7a30ccf46675b7e89e012f4ce408f59e",
3
+ "distance": 26,
4
+ "node": "g78896a3820ecc07358d123fd0b0df6710b2d15fe",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-08-13"
@@ -83,7 +83,11 @@ def test_default_ros2docker_config_pins_supported_kilted_noble_image() -> None:
83
83
  default_build_args = default_config["build_args"]
84
84
  example_build_args = example_config["build_args"]
85
85
 
86
- assert default_build_args["BASE_IMAGE"] == "osrf/ros:kilted-desktop-full-noble"
86
+ # ros-base rather than desktop-full: nothing rosotacom ships runs a GUI, and
87
+ # the difference is 299 MB compressed against 1422 MB — bytes every peer
88
+ # transfers on a cold build and every e2e slice pulls from the published
89
+ # image.
90
+ assert default_build_args["BASE_IMAGE"] == "ros:kilted-ros-base-noble"
87
91
  assert default_build_args["DIGEST"].startswith("@sha256:")
88
92
  assert default_build_args["BASE_IMAGE"] == example_build_args["BASE_IMAGE"]
89
93
  assert default_build_args["DIGEST"] == example_build_args["DIGEST"]
@@ -98,6 +102,10 @@ def test_default_ros2docker_config_pins_supported_kilted_noble_image() -> None:
98
102
  # the -msgs package alone only provides FFMPEGPacket definitions.
99
103
  assert "ros-kilted-ffmpeg-image-transport" in apt_packages
100
104
  assert "ros-kilted-ffmpeg-image-transport-msgs" in apt_packages
105
+ # gps_msgs/msg/GPSFix, published by the anonymized remote-assist
106
+ # session. desktop-full carried it, so nothing declared it; on ros-base
107
+ # its absence is a missing type at runtime, not a build error.
108
+ assert "ros-kilted-gps-msgs" in apt_packages
101
109
 
102
110
 
103
111
  def test_external_ros2docker_configs_install_selected_rmw_implementations() -> None:
@@ -158,6 +158,31 @@ def test_rosotacom_yaml_rejects_removed_data_dict_key(tmp_path: Path) -> None:
158
158
  rosotacom._load_runtime_config(argparse.Namespace(rosotacom_config=str(config)))
159
159
 
160
160
 
161
+ def test_rosotacom_yaml_accepts_com_container_prefix(tmp_path: Path) -> None:
162
+ (tmp_path / "ros2docker.json").write_text('{"image_name": "test"}\n', encoding="utf-8")
163
+ config = tmp_path / "rosotacom.yaml"
164
+ config.write_text(
165
+ "ros2docker_config: ros2docker.json\ncom_container_prefix: remote-assist\n",
166
+ encoding="utf-8",
167
+ )
168
+
169
+ runtime = rosotacom._load_runtime_config(argparse.Namespace(rosotacom_config=str(config)))
170
+
171
+ assert runtime.com_container_prefix == "remote-assist"
172
+
173
+
174
+ def test_rosotacom_yaml_rejects_invalid_com_container_prefix(tmp_path: Path) -> None:
175
+ (tmp_path / "ros2docker.json").write_text('{"image_name": "test"}\n', encoding="utf-8")
176
+ config = tmp_path / "rosotacom.yaml"
177
+ config.write_text(
178
+ "ros2docker_config: ros2docker.json\ncom_container_prefix: 'has space'\n",
179
+ encoding="utf-8",
180
+ )
181
+
182
+ with pytest.raises(RuntimeError, match="com_container_prefix must be a valid docker name"):
183
+ rosotacom._load_runtime_config(argparse.Namespace(rosotacom_config=str(config)))
184
+
185
+
161
186
  def test_session_definition_rejects_physical_address_field() -> None:
162
187
  with pytest.raises(RuntimeError, match="Unsupported keys in peers.a.*address"):
163
188
  rosotacom.session_gen._validate_session_template_cfg({"peers": {"a": {"address": "10.0.0.1"}, "b": {}}})
@@ -411,6 +436,40 @@ def test_scenario_definition_resolves_and_validates_strictly(tmp_path: Path) ->
411
436
  rosotacom._load_scenario_definition(resolved)
412
437
 
413
438
 
439
+ def test_scenario_definition_ignores_foreign_peers_host_paths(tmp_path: Path) -> None:
440
+ """Loading a definition must not require other peers' machine-local mounts.
441
+
442
+ Application b mounts a host path that exists only on b's machine (a staged
443
+ replay bag). Peer a still has to be able to parse the definition and start
444
+ its own applications; the mount is validated where b actually starts
445
+ (#249).
446
+ """
447
+ runtime, resolved = _write_test_scenario_project(tmp_path)
448
+ foreign_config = tmp_path / "apps" / "b.json"
449
+ foreign_config.write_text(
450
+ "\n".join(
451
+ [
452
+ "{",
453
+ ' "container_name": "b_app",',
454
+ ' "run_type": "command",',
455
+ ' "command": ["true"],',
456
+ ' "run_args": ["-v", "./only-on-machine-b:/bag:ro"]',
457
+ "}",
458
+ "",
459
+ ]
460
+ ),
461
+ encoding="utf-8",
462
+ )
463
+
464
+ definition = rosotacom._load_scenario_definition(resolved)
465
+ assert definition.applications["b"][0].name == "local_app"
466
+
467
+ # The start path still refuses the missing mount on the machine that runs
468
+ # the application: full resolution stays where it is meaningful.
469
+ with pytest.raises(FileNotFoundError, match="Host path does not exist"):
470
+ rosotacom.load_config(foreign_config)
471
+
472
+
414
473
  def test_scenario_name_completion_uses_active_project(
415
474
  tmp_path: Path,
416
475
  monkeypatch: pytest.MonkeyPatch,
@@ -17,8 +17,20 @@ import rosotacom.cli as rosotacom
17
17
  from rosotacom import cli_benchmark
18
18
 
19
19
 
20
- def _runtime(tmp_path: Path, install_id: str = "abc") -> rosotacom.RuntimeConfig:
21
- return rosotacom.RuntimeConfig(None, tmp_path / "ros2docker.json", (), None, install_id, tmp_path / "instances")
20
+ def _runtime(
21
+ tmp_path: Path,
22
+ install_id: str = "abc",
23
+ com_container_prefix: str | None = None,
24
+ ) -> rosotacom.RuntimeConfig:
25
+ return rosotacom.RuntimeConfig(
26
+ None,
27
+ tmp_path / "ros2docker.json",
28
+ (),
29
+ None,
30
+ install_id,
31
+ tmp_path / "instances",
32
+ com_container_prefix=com_container_prefix,
33
+ )
22
34
 
23
35
 
24
36
  def test_container_name_is_instance_scoped(tmp_path: Path) -> None:
@@ -34,6 +46,42 @@ def test_container_name_is_instance_scoped(tmp_path: Path) -> None:
34
46
  assert rosotacom._container_name("remote", runtime, "my_run") == "rosotacom_abc_my-run_com_to_remote"
35
47
 
36
48
 
49
+ def test_container_name_is_fixed_with_com_container_prefix(tmp_path: Path) -> None:
50
+ runtime = _runtime(tmp_path, com_container_prefix="remote-assist")
51
+ first = rosotacom._container_name("center", runtime, "run1")
52
+ second = rosotacom._container_name("center", runtime, "run2")
53
+
54
+ # No install id, no instance token: the name is stable across runs and
55
+ # readable next to colleagues' containers in `docker ps`.
56
+ assert first == "remote-assist_com-to-center"
57
+ assert second == first
58
+ assert rosotacom._container_name("ella", runtime, "run1") == "remote-assist_com-to-ella"
59
+
60
+
61
+ def test_matching_com_containers_includes_fixed_names(
62
+ tmp_path: Path,
63
+ monkeypatch: pytest.MonkeyPatch,
64
+ ) -> None:
65
+ runtime = _runtime(tmp_path, com_container_prefix="remote-assist")
66
+ monkeypatch.setattr(
67
+ rosotacom,
68
+ "_list_docker_containers",
69
+ lambda all_states=False: [
70
+ ("remote-assist_com-to-remote", ["bridge"]),
71
+ ("remote-assist_com-to-other", ["bridge"]),
72
+ ("rosotacom_abc_run1_com_to_remote", ["bridge"]),
73
+ ("unrelated", ["bridge"]),
74
+ ],
75
+ )
76
+
77
+ # Both schemes match, so a leftover instance-scoped container is still
78
+ # found after the project switched to fixed names (and vice versa).
79
+ assert rosotacom._matching_com_containers(runtime, "remote") == [
80
+ "remote-assist_com-to-remote",
81
+ "rosotacom_abc_run1_com_to_remote",
82
+ ]
83
+
84
+
37
85
  def test_scenario_container_name_is_instance_scoped(tmp_path: Path) -> None:
38
86
  runtime = _runtime(tmp_path)
39
87
  first = rosotacom._scenario_container_name(runtime, "demo", "a", "app", "run1")
@@ -209,6 +257,58 @@ def test_start_session_force_replaces_conflicting_identity_container(
209
257
  assert [name for name, _ in calls] == ["build", "run", "exec"]
210
258
 
211
259
 
260
+ def test_start_session_fixed_name_conflicts_with_itself_without_force(
261
+ tmp_path: Path,
262
+ monkeypatch: pytest.MonkeyPatch,
263
+ ) -> None:
264
+ runtime = _runtime(tmp_path, install_id="id", com_container_prefix="remote-assist")
265
+ session = rosotacom.ResolvedSession(tmp_path, "/session/current", "absolute")
266
+ cfg = {"peers": {"a": {}, "b": {"com-name": "remote"}}}
267
+ calls: list[tuple[str, dict[str, object]]] = []
268
+ _patch_start_session_collaborators(monkeypatch, runtime, session, cfg, calls)
269
+ monkeypatch.setattr(
270
+ rosotacom,
271
+ "_list_docker_containers",
272
+ lambda all_states=False: [("remote-assist_com-to-remote", ["bridge"])],
273
+ )
274
+
275
+ with pytest.raises(RuntimeError) as excinfo:
276
+ rosotacom.start_session(_start_session_args())
277
+
278
+ # A fixed name cannot coexist with itself, so the running container is a
279
+ # conflict rather than a rejoinable instance.
280
+ assert "remote-assist_com-to-remote" in str(excinfo.value)
281
+ assert calls == []
282
+
283
+
284
+ def test_start_session_fixed_name_force_replaces_running_container(
285
+ tmp_path: Path,
286
+ monkeypatch: pytest.MonkeyPatch,
287
+ ) -> None:
288
+ runtime = _runtime(tmp_path, install_id="id", com_container_prefix="remote-assist")
289
+ session = rosotacom.ResolvedSession(tmp_path, "/session/current", "absolute")
290
+ cfg = {"peers": {"a": {}, "b": {"com-name": "remote"}}}
291
+ calls: list[tuple[str, dict[str, object]]] = []
292
+ stopped: list[str] = []
293
+ _patch_start_session_collaborators(monkeypatch, runtime, session, cfg, calls)
294
+ monkeypatch.setattr(
295
+ rosotacom,
296
+ "_list_docker_containers",
297
+ lambda all_states=False: [("remote-assist_com-to-remote", ["bridge"])],
298
+ )
299
+ monkeypatch.setattr(
300
+ rosotacom,
301
+ "_stop_container_name",
302
+ lambda name, runtime, **kwargs: stopped.append(name) or True,
303
+ )
304
+
305
+ container = rosotacom.start_session(_start_session_args(force=True))
306
+
307
+ assert container == "remote-assist_com-to-remote"
308
+ assert stopped[0] == "remote-assist_com-to-remote"
309
+ assert [name for name, _ in calls] == ["build", "run", "exec"]
310
+
311
+
212
312
  def test_start_session_skips_identity_conflicts_on_isolated_networks(
213
313
  tmp_path: Path,
214
314
  monkeypatch: pytest.MonkeyPatch,
@@ -318,6 +418,32 @@ def test_ps_command_classifies_active_containers(
318
418
  assert "onedrive" not in output
319
419
 
320
420
 
421
+ def test_ps_command_lists_fixed_named_com_containers(
422
+ tmp_path: Path,
423
+ monkeypatch: pytest.MonkeyPatch,
424
+ capsys: pytest.CaptureFixture[str],
425
+ ) -> None:
426
+ runtime = _runtime(tmp_path, com_container_prefix="remote-assist")
427
+ monkeypatch.setattr(rosotacom, "_load_runtime_config", lambda args: runtime)
428
+ monkeypatch.setattr(
429
+ rosotacom,
430
+ "_list_docker_containers",
431
+ lambda all_states=False: [
432
+ ("remote-assist_com-to-center", ["bridge"]),
433
+ ("rosotacom_abc_run2_com_to_b", ["bridge"]),
434
+ ("onedrive", ["bridge"]),
435
+ ],
436
+ )
437
+
438
+ assert rosotacom.ps_command(argparse.Namespace()) == 0
439
+ output = capsys.readouterr().out
440
+
441
+ assert "Host-shared" in output
442
+ assert "remote-assist_com-to-center" in output
443
+ assert "rosotacom_abc_run2_com_to_b" in output
444
+ assert "onedrive" not in output
445
+
446
+
321
447
  def test_ps_command_reports_empty_workspace(
322
448
  tmp_path: Path,
323
449
  monkeypatch: pytest.MonkeyPatch,