rosotacom-dev 2.5.dev13__tar.gz → 2.5.dev16__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 (342) hide show
  1. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/.github/workflows/nightly-e2e.yml +20 -4
  2. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/.github/workflows/pr-merge-gate.yml +19 -228
  3. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/PKG-INFO +21 -1
  4. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/README.md +20 -0
  5. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/justfile +10 -10
  6. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/session-configuration.md +37 -1
  7. rosotacom_dev-2.5.dev16/src/rosotacom/benchmark_delta.py +279 -0
  8. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/cli_benchmark.py +62 -0
  9. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ws/session/creation/generate_session_files.py +22 -14
  10. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom_dev.egg-info/PKG-INFO +21 -1
  11. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom_dev.egg-info/SOURCES.txt +3 -0
  12. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom_dev.egg-info/scm_file_list.json +3 -0
  13. rosotacom_dev-2.5.dev16/src/rosotacom_dev.egg-info/scm_version.json +8 -0
  14. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/tests/contract/test_security_maintenance_config.py +23 -24
  15. rosotacom_dev-2.5.dev16/tests/contract/test_session_configuration_doc.py +44 -0
  16. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/tests/contract/test_workflow_contracts.py +51 -2
  17. rosotacom_dev-2.5.dev16/tests/unit/test_benchmark_delta.py +172 -0
  18. rosotacom_dev-2.5.dev13/src/rosotacom_dev.egg-info/scm_version.json +0 -8
  19. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/.devcontainer/devcontainer.json.template +0 -0
  20. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/.devcontainer/re_generate_devcontainer_json.py +0 -0
  21. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/.github/CODEOWNERS +0 -0
  22. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/.github/ISSUE_TEMPLATE/documentation-audit.md +0 -0
  23. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/.github/ISSUE_TEMPLATE/implementation-cleanup.md +0 -0
  24. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/.github/ISSUE_TEMPLATE/quality-workflow.md +0 -0
  25. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/.github/ISSUE_TEMPLATE/redesign.md +0 -0
  26. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/.github/ISSUE_TEMPLATE/release-process.md +0 -0
  27. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/.github/ISSUE_TEMPLATE/repository-diagnosis.md +0 -0
  28. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/.github/ISSUE_TEMPLATE/test-ci-audit.md +0 -0
  29. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/.github/ISSUE_TEMPLATE/work-item.md +0 -0
  30. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  31. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/.github/dependabot.yml +0 -0
  32. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/.github/workflows/benchmark-calibrate.yml +0 -0
  33. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/.github/workflows/benchmark-gate.yml +0 -0
  34. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/.github/workflows/dev-release.yml +0 -0
  35. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/.github/workflows/image-scan.yml +0 -0
  36. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/.github/workflows/pr-lightweight.yml +0 -0
  37. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/.github/workflows/release.yml +0 -0
  38. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/.pre-commit-config.yaml +0 -0
  39. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/AGENTS.md +0 -0
  40. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/CONCURRENCY.md +0 -0
  41. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/CONTRIBUTING.md +0 -0
  42. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/DEVELOPMENT_PRINCIPLES.md +0 -0
  43. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/LICENSE.txt +0 -0
  44. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/MANIFEST.in +0 -0
  45. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/budgets.jsonl +0 -0
  46. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/calibration/README.md +0 -0
  47. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/calibration/capacity-size-tight-cyclone.json +0 -0
  48. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/calibration/probe-loss-gop-tight-cyclone.json +0 -0
  49. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/calibration/probe-loss-nominal-cyclone.json +0 -0
  50. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/calibration/probe-loss-tight-cyclone.json +0 -0
  51. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/calibration/probe-loss-tight-fastdds.json +0 -0
  52. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/calibration/probe-loss-tight-zenoh.json +0 -0
  53. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/codecov.yml +0 -0
  54. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/deployment-configuration.md +0 -0
  55. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/docs/benchmark-ab.md +0 -0
  56. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/docs/benchmark-bag-as-load.md +0 -0
  57. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/docs/ci.md +0 -0
  58. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/docs/ffmpeg-keyframes.md +0 -0
  59. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/docs/findings/README.md +0 -0
  60. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/docs/findings/cyclone-spdp-discovery-bursts.md +0 -0
  61. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/docs/findings/delay-alone-no-loss.md +0 -0
  62. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/docs/findings/head-of-line-irregularity.md +0 -0
  63. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/docs/findings/jitter-loss-bandwidth-latency.md +0 -0
  64. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/docs/findings/lighter-message-loss.md +0 -0
  65. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/docs/findings/zero-loss-boundaries-18kb-20hz.md +0 -0
  66. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/docs/forensics-report.md +0 -0
  67. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/docs/geo-link-map.md +0 -0
  68. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/docs/github-repository-settings.md +0 -0
  69. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/docs/link-trace.md +0 -0
  70. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/docs/owner-runbook.md +0 -0
  71. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/docs/performance-bands.md +0 -0
  72. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/docs/playbooks/README.md +0 -0
  73. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/docs/quality-model.md +0 -0
  74. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/docs/release-notes/TEMPLATE.md +0 -0
  75. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/docs/release-notes/v2.1.md +0 -0
  76. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/docs/release-notes/v2.2.md +0 -0
  77. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/docs/release-notes/v2.3.md +0 -0
  78. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/docs/release-notes/v2.4.md +0 -0
  79. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/docs/release.md +0 -0
  80. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/docs/rfcs/0001-expectation-driven-test-suite.md +0 -0
  81. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/docs/rfcs/0002-expectation-concepts.md +0 -0
  82. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/docs/rfcs/0003-metric-backbone.md +0 -0
  83. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/docs/rfcs/0004-network-profiles.md +0 -0
  84. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/docs/rfcs/0005-benchmark-genres-and-ci.md +0 -0
  85. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/docs/rfcs/0006-dynamic-qos.md +0 -0
  86. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/docs/rfcs/0007-regression-gate.md +0 -0
  87. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/docs/rfcs/README.md +0 -0
  88. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/docs/testing.md +0 -0
  89. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/docs/work-items.md +0 -0
  90. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/install.sh +0 -0
  91. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/media/control_center.png +0 -0
  92. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/media/echo_test.png +0 -0
  93. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/media/forensics-report-example.png +0 -0
  94. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/media/host.png +0 -0
  95. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/media/vehicle.png +0 -0
  96. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/pyproject.toml +0 -0
  97. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/requirements.txt +0 -0
  98. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/rosotacom.yaml +0 -0
  99. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/run_session_in_container.py +0 -0
  100. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/setup.cfg +0 -0
  101. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/__init__.py +0 -0
  102. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/__main__.py +0 -0
  103. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/anonymize.py +0 -0
  104. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/bag_ground_truth.py +0 -0
  105. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/benched_set.py +0 -0
  106. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/benchmark.py +0 -0
  107. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/bundle_check.py +0 -0
  108. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/cli.py +0 -0
  109. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/deployment.py +0 -0
  110. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/ffmpeg_packet.py +0 -0
  111. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/forensics.py +0 -0
  112. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/geomap.py +0 -0
  113. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/network_profiles.py +0 -0
  114. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/network_shaper.py +0 -0
  115. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/plots.py +0 -0
  116. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/py.typed +0 -0
  117. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/benched-set.yaml +0 -0
  118. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/examples/.gitignore +0 -0
  119. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/examples/README.md +0 -0
  120. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/examples/__init__.py +0 -0
  121. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/examples/bags/8_drop_reference/metadata.yaml +0 -0
  122. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/examples/deployment.example.yaml +0 -0
  123. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/examples/profiles.yaml +0 -0
  124. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/examples/ros2docker.json +0 -0
  125. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/examples/rosotacom.yaml +0 -0
  126. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/examples/scenarios/2_native_chatter/scenario-definition.yaml +0 -0
  127. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/examples/scripts/1_heartbeat/run_machine_a.sh +0 -0
  128. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/examples/scripts/1_heartbeat/run_machine_b.sh +0 -0
  129. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_a/external.ros2docker.json +0 -0
  130. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_a/run_communication.sh +0 -0
  131. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_a/run_external.py +0 -0
  132. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_a/wait_for_echo_topic.sh +0 -0
  133. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_b/external.ros2docker.json +0 -0
  134. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_b/run_communication.sh +0 -0
  135. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_b/run_external.py +0 -0
  136. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_a/external.ros2docker.json +0 -0
  137. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_a/external_session.yaml +0 -0
  138. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_a/foxglove.json +0 -0
  139. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_a/run_communication.sh +0 -0
  140. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_a/run_external.py +0 -0
  141. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_b/costmap_1second/costmap_1second_0.mcap +0 -0
  142. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_b/costmap_1second/metadata.yaml +0 -0
  143. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_b/external.ros2docker.json +0 -0
  144. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_b/run_communication.sh +0 -0
  145. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_b/run_external.py +0 -0
  146. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_a/external.ros2docker.json +0 -0
  147. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_a/external_session.yaml +0 -0
  148. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_a/foxglove.json +0 -0
  149. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_a/run_communication.sh +0 -0
  150. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_a/run_external.py +0 -0
  151. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_b/costmap_1second/costmap_1second_0.mcap +0 -0
  152. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_b/costmap_1second/metadata.yaml +0 -0
  153. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_b/external.ros2docker.json +0 -0
  154. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_b/run_communication.sh +0 -0
  155. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_b/run_external.py +0 -0
  156. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_a/external.ros2docker.json +0 -0
  157. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_a/external_session.yaml +0 -0
  158. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_a/run_communication.sh +0 -0
  159. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_a/run_external.py +0 -0
  160. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_b/external.ros2docker.json +0 -0
  161. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_b/external_session.yaml +0 -0
  162. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_b/run_communication.sh +0 -0
  163. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_b/run_external.py +0 -0
  164. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_a/external.ros2docker.json +0 -0
  165. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_a/external_session.yaml +0 -0
  166. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_a/run_communication.sh +0 -0
  167. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_a/run_external.py +0 -0
  168. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_b/external.ros2docker.json +0 -0
  169. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_b/external_session.yaml +0 -0
  170. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_b/run_communication.sh +0 -0
  171. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_b/run_external.py +0 -0
  172. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/examples/sessions/10_restamp/session-definition.yaml +0 -0
  173. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/examples/sessions/11_trickle/session-definition.yaml +0 -0
  174. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/examples/sessions/12_content_integrity/session-definition.yaml +0 -0
  175. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/examples/sessions/13_link_latency/session-definition.yaml +0 -0
  176. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/examples/sessions/14_remote_assist_anonymized/session-definition.yaml +0 -0
  177. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/examples/sessions/15_remote_assist_anonymized_costmap/session-definition.yaml +0 -0
  178. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/examples/sessions/16_remote_assist_anonymized_camera/session-definition.yaml +0 -0
  179. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/examples/sessions/17_synthetic_camera_quality/session-definition.yaml +0 -0
  180. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/examples/sessions/1_heartbeat/session-definition.yaml +0 -0
  181. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/examples/sessions/1_heartbeat_status/session-definition.yaml +0 -0
  182. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/examples/sessions/2_native_chatter/session-definition.yaml +0 -0
  183. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/examples/sessions/3_comp_occ_grid/session-definition.yaml +0 -0
  184. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/examples/sessions/4_comp_occ_grid_zen/session-definition.yaml +0 -0
  185. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/examples/sessions/5_sized_payload/session-definition.yaml +0 -0
  186. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/examples/sessions/6_sized_payload_zen/session-definition.yaml +0 -0
  187. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/examples/sessions/7_latched_static/session-definition.yaml +0 -0
  188. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/examples/sessions/8_drop/session-definition.yaml +0 -0
  189. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/examples/sessions/9_throttle/session-definition.yaml +0 -0
  190. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/examples/sessions/bench_1_1_capacity/session-definition.yaml +0 -0
  191. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/examples/sessions/bench_1_2_load_sweep/session-definition.yaml +0 -0
  192. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/examples/sessions/bench_1_3_ramp/session-definition.yaml +0 -0
  193. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/examples/sessions/bench_1_4_recovery/session-definition.yaml +0 -0
  194. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/examples/sessions/bench_1_5_camera/session-definition.yaml +0 -0
  195. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ros2docker.json.example +0 -0
  196. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ws/.vscode/c_cpp_properties.json +0 -0
  197. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ws/.vscode/settings.json +0 -0
  198. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_easy_mode.xml.template +0 -0
  199. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_initial_peer_list.xml.template +0 -0
  200. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_v2.xml.template +0 -0
  201. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_v3.xml.template +0 -0
  202. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_v4.xml.template +0 -0
  203. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_v5.xml.template +0 -0
  204. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ws/ota_configs/create_zenoh_json5.py +0 -0
  205. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ws/ota_configs/cyclonedds_minimal.xml.template +0 -0
  206. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ws/ota_configs/cyclonedds_tuned.xml.template +0 -0
  207. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ws/ota_configs/fastdds_unicast.xml.template +0 -0
  208. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ws/ota_configs/get_ota_xml.py +0 -0
  209. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ws/ota_configs/utils.py +0 -0
  210. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ws/ota_configs/zenoh.json5.template +0 -0
  211. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ws/ros2src/.gitkeep +0 -0
  212. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ws/ros2src/com_cpp/CMakeLists.txt +0 -0
  213. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ws/ros2src/com_cpp/COLCON_IGNORE +0 -0
  214. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ws/ros2src/com_cpp/LICENSE.txt +0 -0
  215. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ws/ros2src/com_cpp/package.xml +0 -0
  216. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ws/ros2src/com_cpp/src/hz_monitor.cpp +0 -0
  217. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ws/ros2src/com_cpp/src/universal_compressor.cpp +0 -0
  218. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ws/ros2src/com_cpp/src/universal_decompressor.cpp +0 -0
  219. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ws/ros2src/com_msgs/CMakeLists.txt +0 -0
  220. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ws/ros2src/com_msgs/LICENSE.txt +0 -0
  221. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ws/ros2src/com_msgs/msg/CompressedData.msg +0 -0
  222. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ws/ros2src/com_msgs/msg/EchoHeartbeat.msg +0 -0
  223. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ws/ros2src/com_msgs/msg/OtaStamped.msg +0 -0
  224. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ws/ros2src/com_msgs/msg/SizedPayload.msg +0 -0
  225. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ws/ros2src/com_msgs/package.xml +0 -0
  226. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ws/ros2src/com_py/LICENSE.txt +0 -0
  227. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ws/ros2src/com_py/com_py/__init__.py +0 -0
  228. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ws/ros2src/com_py/com_py/base_bridge_relay.py +0 -0
  229. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ws/ros2src/com_py/com_py/bridge_in.py +0 -0
  230. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ws/ros2src/com_py/com_py/bridge_out.py +0 -0
  231. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ws/ros2src/com_py/com_py/heartbeat_echo.py +0 -0
  232. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ws/ros2src/com_py/com_py/hz_monitor.py +0 -0
  233. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ws/ros2src/com_py/com_py/image_bandwidth_reducer.py +0 -0
  234. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ws/ros2src/com_py/com_py/image_pixel_capper.py +0 -0
  235. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ws/ros2src/com_py/com_py/lanelet_saver.py +0 -0
  236. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ws/ros2src/com_py/com_py/latch_relay.py +0 -0
  237. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/costmap_remapper.py +0 -0
  238. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/marker_remapper.py +0 -0
  239. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/speed_test.py +0 -0
  240. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/tf_remapper.py +0 -0
  241. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/traffic_monitor.py +0 -0
  242. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/wifi_network_analysis_1.py +0 -0
  243. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ws/ros2src/com_py/com_py/link_bytes.py +0 -0
  244. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ws/ros2src/com_py/com_py/link_trace.py +0 -0
  245. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ws/ros2src/com_py/com_py/local_global_frame_bridge.py +0 -0
  246. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ws/ros2src/com_py/com_py/localization_map_split_reduce_saver.py +0 -0
  247. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ws/ros2src/com_py/com_py/msg_transform.py +0 -0
  248. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ws/ros2src/com_py/com_py/pair_management.py +0 -0
  249. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ws/ros2src/com_py/com_py/pub_sub_pair.py +0 -0
  250. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ws/ros2src/com_py/com_py/qos.py +0 -0
  251. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ws/ros2src/com_py/com_py/relay_in.py +0 -0
  252. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ws/ros2src/com_py/com_py/relay_out.py +0 -0
  253. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ws/ros2src/com_py/com_py/restamp.py +0 -0
  254. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ws/ros2src/com_py/com_py/sized_publisher.py +0 -0
  255. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ws/ros2src/com_py/com_py/stage_latency.py +0 -0
  256. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ws/ros2src/com_py/com_py/stage_latency_core.py +0 -0
  257. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ws/ros2src/com_py/com_py/status_overview.py +0 -0
  258. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ws/ros2src/com_py/com_py/status_overview_core.py +0 -0
  259. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ws/ros2src/com_py/com_py/tf_map_to_cart_saver.py +0 -0
  260. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ws/ros2src/com_py/com_py/topic_monitor.py +0 -0
  261. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ws/ros2src/com_py/com_py/topic_resolution.py +0 -0
  262. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ws/ros2src/com_py/com_py/trickle.py +0 -0
  263. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ws/ros2src/com_py/com_py/universal_compressor.py +0 -0
  264. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ws/ros2src/com_py/com_py/universal_decompressor.py +0 -0
  265. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ws/ros2src/com_py/com_py/universal_ota_unwrapper.py +0 -0
  266. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ws/ros2src/com_py/com_py/universal_ota_wrapper.py +0 -0
  267. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ws/ros2src/com_py/package.xml +0 -0
  268. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ws/ros2src/com_py/resource/com_py +0 -0
  269. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ws/ros2src/com_py/setup.cfg +0 -0
  270. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ws/ros2src/com_py/setup.py +0 -0
  271. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ws/ros2src/com_py/test/test_copyright.py +0 -0
  272. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ws/ros2src/com_py/test/test_flake8.py +0 -0
  273. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ws/ros2src/com_py/test/test_pep257.py +0 -0
  274. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ws/session/content/base/session_plugin_base.yaml +0 -0
  275. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ws/session/content/network/up_connectivity.py +0 -0
  276. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ws/session/content/network/wifi_network_analysis_2.py +0 -0
  277. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ws/session/creation/anonymize_bag.py +0 -0
  278. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ws/session/creation/catmux_log_setup.sh +0 -0
  279. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ws/session/creation/create_session_yaml.py +0 -0
  280. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ws/session/creation/run_session.py +0 -0
  281. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ws/session/creation/run_session_in_external_terminal.py +0 -0
  282. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/resources/ws/session/creation/strip_ansi.py +0 -0
  283. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/status_eval.py +0 -0
  284. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/stream_stats.py +0 -0
  285. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/trace_profiles.py +0 -0
  286. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/transit.py +0 -0
  287. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom/video_quality.py +0 -0
  288. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom_dev.egg-info/dependency_links.txt +0 -0
  289. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom_dev.egg-info/entry_points.txt +0 -0
  290. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom_dev.egg-info/requires.txt +0 -0
  291. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/src/rosotacom_dev.egg-info/top_level.txt +0 -0
  292. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/stop_session_in_container.py +0 -0
  293. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/terminology.md +0 -0
  294. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/tests/contract/test_benched_set_registry.py +0 -0
  295. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/tests/contract/test_findings.py +0 -0
  296. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/tests/contract/test_markdown_links.py +0 -0
  297. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/tests/contract/test_ota_source_bundle.py +0 -0
  298. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/tests/contract/test_package_metadata.py +0 -0
  299. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/tests/contract/test_packaged_resources.py +0 -0
  300. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/tests/contract/test_profile_covers_generated_commands.py +0 -0
  301. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/tests/contract/test_pytest_policy.py +0 -0
  302. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/tests/contract/test_readme_examples.py +0 -0
  303. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/tests/e2e/conftest.py +0 -0
  304. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/tests/e2e/test_anonymize_e2e.py +0 -0
  305. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/tests/e2e/test_benchmark_ab.py +0 -0
  306. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/tests/e2e/test_benchmark_capacity.py +0 -0
  307. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/tests/e2e/test_benchmark_replay.py +0 -0
  308. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/tests/e2e/test_parallel_smoke.py +0 -0
  309. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/tests/e2e/test_smoke.py +0 -0
  310. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/tests/e2e/test_timeline_stepping.py +0 -0
  311. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/tests/e2e/test_video_quality_e2e.py +0 -0
  312. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/tests/sessions/generate_rmw_matrix.py +0 -0
  313. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/tests/sessions/rmw_matrix/1_heartbeat_cyclone-local_zenoh-ros2dds-ota/session-definition.yaml +0 -0
  314. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/tests/sessions/rmw_matrix/1_heartbeat_cyclone-ota/session-definition.yaml +0 -0
  315. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/tests/sessions/rmw_matrix/1_heartbeat_cyclone-ota-tuned/session-definition.yaml +0 -0
  316. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/tests/sessions/rmw_matrix/1_heartbeat_fastdds/session-definition.yaml +0 -0
  317. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/tests/sessions/rmw_matrix/1_heartbeat_zen-endpoints/session-definition.yaml +0 -0
  318. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/tests/unit/test_anonymize.py +0 -0
  319. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/tests/unit/test_bag_ground_truth.py +0 -0
  320. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/tests/unit/test_benched_set.py +0 -0
  321. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/tests/unit/test_benchmark.py +0 -0
  322. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/tests/unit/test_bundle_check.py +0 -0
  323. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/tests/unit/test_cli.py +0 -0
  324. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/tests/unit/test_cli_benchmark.py +0 -0
  325. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/tests/unit/test_concurrency.py +0 -0
  326. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/tests/unit/test_deployment.py +0 -0
  327. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/tests/unit/test_ffmpeg_packet.py +0 -0
  328. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/tests/unit/test_forensics.py +0 -0
  329. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/tests/unit/test_geomap.py +0 -0
  330. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/tests/unit/test_link_bytes.py +0 -0
  331. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/tests/unit/test_link_trace.py +0 -0
  332. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/tests/unit/test_network_profiles.py +0 -0
  333. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/tests/unit/test_network_shaper.py +0 -0
  334. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/tests/unit/test_ota_xml.py +0 -0
  335. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/tests/unit/test_plots.py +0 -0
  336. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/tests/unit/test_stage_latency.py +0 -0
  337. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/tests/unit/test_status_eval.py +0 -0
  338. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/tests/unit/test_status_overview.py +0 -0
  339. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/tests/unit/test_stream_stats.py +0 -0
  340. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/tests/unit/test_trace_profiles.py +0 -0
  341. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/tests/unit/test_transit.py +0 -0
  342. {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev16}/tests/unit/test_video_quality.py +0 -0
@@ -19,9 +19,25 @@ concurrency:
19
19
 
20
20
  jobs:
21
21
  smoke-e2e:
22
- name: smoke-e2e
22
+ # The same six slices the merge gate and the release run, instead of one
23
+ # sequential `just test-e2e-smoke` over the whole suite (#198). Keeping the
24
+ # monolith here was deliberate while the slices were hand-maintained `-k`
25
+ # expressions that had silently stopped covering three files; #197's
26
+ # test_e2e_slices_partition_the_whole_suite closed that, so the union is
27
+ # now guaranteed to be the monolith.
28
+ #
29
+ # The gain is diagnosis: a red monolith says "e2e broke", six slices say
30
+ # which area did. It also removes a load-induced flake. On 2026-08-11 the
31
+ # nightly failed with nine "Timed out waiting for container readiness"
32
+ # errors after 1h12m on one runner, while the same tests on the same commit
33
+ # passed in the merge gate — where they are spread over six.
34
+ name: smoke-e2e-${{ matrix.slice }}
23
35
  runs-on: ubuntu-latest
24
36
  timeout-minutes: 90
37
+ strategy:
38
+ fail-fast: false
39
+ matrix:
40
+ slice: [core, transforms, remote-assist, runtime-tools, concurrency, media]
25
41
 
26
42
  steps:
27
43
  - name: Check out repository
@@ -46,14 +62,14 @@ jobs:
46
62
  - name: Show Docker environment
47
63
  run: docker info
48
64
 
49
- - name: Run local smoke slice
50
- run: just test-e2e-smoke
65
+ - name: Run E2E slice
66
+ run: just test-e2e-slice ${{ matrix.slice }}
51
67
 
52
68
  - name: Upload smoke session artifacts
53
69
  if: failure()
54
70
  uses: actions/upload-artifact@v7
55
71
  with:
56
- name: session-instances-smoke
72
+ name: session-instances-smoke-${{ matrix.slice }}
57
73
  path: session-instances/
58
74
  if-no-files-found: ignore
59
75
 
@@ -189,212 +189,24 @@ jobs:
189
189
  fi
190
190
  echo "All preflight checks passed"
191
191
 
192
- e2e-core:
193
- name: e2e-core
192
+ e2e:
193
+ # One matrix job, not six near-identical copies. The copies were how
194
+ # `e2e-media` ended up listed in ci-success's `needs` with no check on its
195
+ # result: a failing media slice did not fail the gate. A matrix has one
196
+ # result for all slices, so that hole cannot be reopened by forgetting a
197
+ # paragraph. The slice list is the same one release.yml expands, and
198
+ # tests/contract/test_workflow_contracts.py keeps the three workflows and
199
+ # the justfile agreeing.
200
+ name: e2e-${{ matrix.slice }}
194
201
  runs-on: ubuntu-latest
195
202
  timeout-minutes: 90
196
203
  needs: preflight-success
197
204
  if: always() && !cancelled() && needs.preflight-success.result == 'success'
198
- steps:
199
- - name: Check out repository
200
- uses: actions/checkout@v6
201
- with:
202
- fetch-depth: 0
203
-
204
- - name: Set up Python
205
- uses: actions/setup-python@v6
206
- with:
207
- python-version: "3.12"
208
- cache: pip
209
-
210
- - name: Install just and tmux
211
- run: |
212
- sudo apt-get update
213
- sudo apt-get install -y just tmux
214
-
215
- - name: Set up local environment
216
- run: just setup
217
-
218
- - name: Show Docker environment
219
- run: docker info
220
-
221
- - name: Run core E2E tests
222
- run: just test-e2e-core
223
-
224
- - name: Upload session artifacts
225
- if: failure()
226
- uses: actions/upload-artifact@v7
227
- with:
228
- name: session-instances-e2e-core
229
- path: session-instances/
230
- if-no-files-found: ignore
231
-
232
- e2e-transforms:
233
- name: e2e-transforms
234
- runs-on: ubuntu-latest
235
- timeout-minutes: 90
236
- needs: preflight-success
237
- if: always() && !cancelled() && needs.preflight-success.result == 'success'
238
- steps:
239
- - name: Check out repository
240
- uses: actions/checkout@v6
241
- with:
242
- fetch-depth: 0
243
-
244
- - name: Set up Python
245
- uses: actions/setup-python@v6
246
- with:
247
- python-version: "3.12"
248
- cache: pip
249
-
250
- - name: Install just and tmux
251
- run: |
252
- sudo apt-get update
253
- sudo apt-get install -y just tmux
254
-
255
- - name: Set up local environment
256
- run: just setup
257
-
258
- - name: Show Docker environment
259
- run: docker info
260
-
261
- - name: Run transform E2E tests
262
- run: just test-e2e-transforms
263
-
264
- - name: Upload session artifacts
265
- if: failure()
266
- uses: actions/upload-artifact@v7
267
- with:
268
- name: session-instances-e2e-transforms
269
- path: session-instances/
270
- if-no-files-found: ignore
271
-
272
- e2e-remote-assist:
273
- name: e2e-remote-assist
274
- runs-on: ubuntu-latest
275
- timeout-minutes: 90
276
- needs: preflight-success
277
- if: always() && !cancelled() && needs.preflight-success.result == 'success'
278
- steps:
279
- - name: Check out repository
280
- uses: actions/checkout@v6
281
- with:
282
- fetch-depth: 0
283
-
284
- - name: Set up Python
285
- uses: actions/setup-python@v6
286
- with:
287
- python-version: "3.12"
288
- cache: pip
289
-
290
- - name: Install just and tmux
291
- run: |
292
- sudo apt-get update
293
- sudo apt-get install -y just tmux
294
-
295
- - name: Set up local environment
296
- run: just setup
297
-
298
- - name: Show Docker environment
299
- run: docker info
300
-
301
- - name: Run remote assist E2E tests
302
- run: just test-e2e-remote-assist
303
-
304
- - name: Upload session artifacts
305
- if: failure()
306
- uses: actions/upload-artifact@v7
307
- with:
308
- name: session-instances-e2e-remote-assist
309
- path: session-instances/
310
- if-no-files-found: ignore
311
-
312
- e2e-runtime-tools:
313
- name: e2e-runtime-tools
314
- runs-on: ubuntu-latest
315
- timeout-minutes: 90
316
- needs: preflight-success
317
- if: always() && !cancelled() && needs.preflight-success.result == 'success'
318
- steps:
319
- - name: Check out repository
320
- uses: actions/checkout@v6
321
- with:
322
- fetch-depth: 0
323
-
324
- - name: Set up Python
325
- uses: actions/setup-python@v6
326
- with:
327
- python-version: "3.12"
328
- cache: pip
329
-
330
- - name: Install just and tmux
331
- run: |
332
- sudo apt-get update
333
- sudo apt-get install -y just tmux
334
-
335
- - name: Set up local environment
336
- run: just setup
337
-
338
- - name: Show Docker environment
339
- run: docker info
340
-
341
- - name: Run runtime tools E2E tests
342
- run: just test-e2e-runtime-tools
343
-
344
- - name: Upload session artifacts
345
- if: failure()
346
- uses: actions/upload-artifact@v7
347
- with:
348
- name: session-instances-e2e-runtime-tools
349
- path: session-instances/
350
- if-no-files-found: ignore
351
-
352
- e2e-concurrency:
353
- name: e2e-concurrency
354
- runs-on: ubuntu-latest
355
- timeout-minutes: 90
356
- needs: preflight-success
357
- if: always() && !cancelled() && needs.preflight-success.result == 'success'
358
- steps:
359
- - name: Check out repository
360
- uses: actions/checkout@v6
361
- with:
362
- fetch-depth: 0
363
-
364
- - name: Set up Python
365
- uses: actions/setup-python@v6
366
- with:
367
- python-version: "3.12"
368
- cache: pip
369
-
370
- - name: Install just and tmux
371
- run: |
372
- sudo apt-get update
373
- sudo apt-get install -y just tmux
374
-
375
- - name: Set up local environment
376
- run: just setup
377
-
378
- - name: Show Docker environment
379
- run: docker info
380
-
381
- - name: Run concurrency E2E tests
382
- run: just test-e2e-concurrency
383
-
384
- - name: Upload session artifacts
385
- if: failure()
386
- uses: actions/upload-artifact@v7
387
- with:
388
- name: session-instances-e2e-concurrency
389
- path: session-instances/
390
- if-no-files-found: ignore
205
+ strategy:
206
+ fail-fast: false
207
+ matrix:
208
+ slice: [core, transforms, remote-assist, runtime-tools, concurrency, media]
391
209
 
392
- e2e-media:
393
- name: e2e-media
394
- runs-on: ubuntu-latest
395
- timeout-minutes: 90
396
- needs: preflight-success
397
- if: always() && !cancelled() && needs.preflight-success.result == 'success'
398
210
  steps:
399
211
  - name: Check out repository
400
212
  uses: actions/checkout@v6
@@ -418,14 +230,14 @@ jobs:
418
230
  - name: Show Docker environment
419
231
  run: docker info
420
232
 
421
- - name: Run media E2E tests
422
- run: just test-e2e-media
233
+ - name: Run E2E slice
234
+ run: just test-e2e-slice ${{ matrix.slice }}
423
235
 
424
236
  - name: Upload session artifacts
425
237
  if: failure()
426
238
  uses: actions/upload-artifact@v7
427
239
  with:
428
- name: session-instances-e2e-media
240
+ name: session-instances-e2e-${{ matrix.slice }}
429
241
  path: session-instances/
430
242
  if-no-files-found: ignore
431
243
 
@@ -439,12 +251,7 @@ jobs:
439
251
  - merge-lightweight
440
252
  - package
441
253
  - preflight-success
442
- - e2e-core
443
- - e2e-transforms
444
- - e2e-remote-assist
445
- - e2e-runtime-tools
446
- - e2e-concurrency
447
- - e2e-media
254
+ - e2e
448
255
  if: always() && (github.event_name != 'pull_request' || github.event.pull_request.draft == false)
449
256
 
450
257
  steps:
@@ -474,24 +281,8 @@ jobs:
474
281
  echo "preflight-success failed or was skipped: ${{ needs.preflight-success.result }}"
475
282
  exit 1
476
283
  fi
477
- if [[ "${{ needs.e2e-core.result }}" != "success" ]]; then
478
- echo "e2e-core failed or was skipped: ${{ needs.e2e-core.result }}"
479
- exit 1
480
- fi
481
- if [[ "${{ needs.e2e-transforms.result }}" != "success" ]]; then
482
- echo "e2e-transforms failed or was skipped: ${{ needs.e2e-transforms.result }}"
483
- exit 1
484
- fi
485
- if [[ "${{ needs.e2e-remote-assist.result }}" != "success" ]]; then
486
- echo "e2e-remote-assist failed or was skipped: ${{ needs.e2e-remote-assist.result }}"
487
- exit 1
488
- fi
489
- if [[ "${{ needs.e2e-runtime-tools.result }}" != "success" ]]; then
490
- echo "e2e-runtime-tools failed or was skipped: ${{ needs.e2e-runtime-tools.result }}"
491
- exit 1
492
- fi
493
- if [[ "${{ needs.e2e-concurrency.result }}" != "success" ]]; then
494
- echo "e2e-concurrency failed or was skipped: ${{ needs.e2e-concurrency.result }}"
284
+ if [[ "${{ needs.e2e.result }}" != "success" ]]; then
285
+ echo "one or more e2e slices failed or were skipped: ${{ needs.e2e.result }}"
495
286
  exit 1
496
287
  fi
497
288
  echo "ci-success passed"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rosotacom-dev
3
- Version: 2.5.dev13
3
+ Version: 2.5.dev16
4
4
  Summary: Host CLI for ROS OTA communication sessions.
5
5
  Author: develNor
6
6
  License-Expression: BSD-3-Clause
@@ -778,6 +778,26 @@ performance bands in `budgets.jsonl` via `rosotacom benchmark compare`, and
778
778
  bands move only through `rosotacom benchmark ratchet` — see
779
779
  [docs/performance-bands.md](docs/performance-bands.md) for the band schema,
780
780
  verdicts, and the ratchet workflow (RFC 0007).
781
+
782
+ Two result sets taken in **different environments** — emulated versus a real
783
+ link, or shaped versus unshaped — are compared with `rosotacom benchmark delta`:
784
+
785
+ ```bash
786
+ rosotacom benchmark delta emulated/ ota/ \
787
+ --label-reference emulated --label-measured ota \
788
+ --out delta.json --markdown delta.md
789
+ ```
790
+
791
+ It pairs runs on genre, profile, RMW and session name, so a row that ran in one
792
+ environment and not the other is reported as unmatched rather than silently
793
+ dropped — "it got faster" and "it did not run" must not look the same. Every
794
+ report is labelled `monitor_only` and carries each side's command and profile
795
+ file, so a table pasted into a paper or an issue can be traced back without the
796
+ directory it came from.
797
+
798
+ It exits 0 whatever the numbers say, and non-zero only when the two sets share
799
+ no rows at all — a delta is an observation to explain, and an exit code would
800
+ turn "explain this" into "re-run until it is quiet".
781
801
  For live benchmark probes, `--duration` is the shaped publish window; after that
782
802
  rosotacom stops synthetic publishers and waits `--drain-s` seconds before
783
803
  tearing down shaping, so delayed in-flight messages are not miscounted as loss.
@@ -733,6 +733,26 @@ performance bands in `budgets.jsonl` via `rosotacom benchmark compare`, and
733
733
  bands move only through `rosotacom benchmark ratchet` — see
734
734
  [docs/performance-bands.md](docs/performance-bands.md) for the band schema,
735
735
  verdicts, and the ratchet workflow (RFC 0007).
736
+
737
+ Two result sets taken in **different environments** — emulated versus a real
738
+ link, or shaped versus unshaped — are compared with `rosotacom benchmark delta`:
739
+
740
+ ```bash
741
+ rosotacom benchmark delta emulated/ ota/ \
742
+ --label-reference emulated --label-measured ota \
743
+ --out delta.json --markdown delta.md
744
+ ```
745
+
746
+ It pairs runs on genre, profile, RMW and session name, so a row that ran in one
747
+ environment and not the other is reported as unmatched rather than silently
748
+ dropped — "it got faster" and "it did not run" must not look the same. Every
749
+ report is labelled `monitor_only` and carries each side's command and profile
750
+ file, so a table pasted into a paper or an issue can be traced back without the
751
+ directory it came from.
752
+
753
+ It exits 0 whatever the numbers say, and non-zero only when the two sets share
754
+ no rows at all — a delta is an observation to explain, and an exit code would
755
+ turn "explain this" into "re-run until it is quiet".
736
756
  For live benchmark probes, `--duration` is the shaped publish window; after that
737
757
  rosotacom stops synthetic publishers and waits `--drain-s` seconds before
738
758
  tearing down shaping, so delayed in-flight messages are not miscounted as loss.
@@ -38,34 +38,34 @@ test-nondocker-cov:
38
38
  {{python}} -m pytest -q tests/unit tests/contract --cov=rosotacom --cov-report=term-missing --cov-report=xml:coverage.xml
39
39
 
40
40
  test-e2e-smoke:
41
- ROSOTACOM_RUN_E2E=1 {{python}} -m pytest -q tests/e2e/ -m e2e
41
+ ROSOTACOM_RUN_E2E=1 {{python}} -m pytest -q --durations=0 tests/e2e/ -m e2e
42
42
 
43
43
  test-e2e-fast: test-e2e-smoke
44
44
 
45
45
  test-e2e-core:
46
- ROSOTACOM_RUN_E2E=1 {{python}} -m pytest -q tests/e2e/test_smoke.py -k "heartbeat or chatter"
46
+ ROSOTACOM_RUN_E2E=1 {{python}} -m pytest -q --durations=0 tests/e2e/test_smoke.py -k "heartbeat or chatter"
47
47
 
48
48
  test-e2e-transforms:
49
- ROSOTACOM_RUN_E2E=1 {{python}} -m pytest -q tests/e2e/test_smoke.py -k "occupancy_grid or sized_payload"
49
+ ROSOTACOM_RUN_E2E=1 {{python}} -m pytest -q --durations=0 tests/e2e/test_smoke.py -k "occupancy_grid or sized_payload"
50
50
 
51
51
  test-e2e-remote-assist:
52
- ROSOTACOM_RUN_E2E=1 {{python}} -m pytest -q tests/e2e/test_smoke.py -k "remote_assist"
52
+ ROSOTACOM_RUN_E2E=1 {{python}} -m pytest -q --durations=0 tests/e2e/test_smoke.py -k "remote_assist"
53
53
 
54
54
  # Two invocations on purpose: a shared `-k` filter would silently deselect
55
55
  # every test in the other files (contract-tested in test_benched_set_registry).
56
56
  test-e2e-runtime-tools:
57
- ROSOTACOM_RUN_E2E=1 {{python}} -m pytest -q tests/e2e/test_smoke.py -k "link_latency"
58
- ROSOTACOM_RUN_E2E=1 {{python}} -m pytest -q tests/e2e/test_timeline_stepping.py tests/e2e/test_benchmark_capacity.py tests/e2e/test_benchmark_ab.py tests/e2e/test_benchmark_replay.py
57
+ ROSOTACOM_RUN_E2E=1 {{python}} -m pytest -q --durations=0 tests/e2e/test_smoke.py -k "link_latency"
58
+ ROSOTACOM_RUN_E2E=1 {{python}} -m pytest -q --durations=0 tests/e2e/test_timeline_stepping.py tests/e2e/test_benchmark_capacity.py tests/e2e/test_benchmark_ab.py tests/e2e/test_benchmark_replay.py
59
59
 
60
60
  # The remaining e2e files. Without this slice the partition is not one: the
61
61
  # monolithic `test-e2e-smoke` collects 28 tests, the other five collect 25, and
62
62
  # anonymization/video-quality/replay ran only in nightly and the release.
63
63
  test-e2e-media:
64
- ROSOTACOM_RUN_E2E=1 {{python}} -m pytest -q tests/e2e/test_anonymize_e2e.py tests/e2e/test_video_quality_e2e.py
65
- ROSOTACOM_RUN_E2E=1 {{python}} -m pytest -q tests/e2e/test_smoke.py -k "anonymized"
64
+ ROSOTACOM_RUN_E2E=1 {{python}} -m pytest -q --durations=0 tests/e2e/test_anonymize_e2e.py tests/e2e/test_video_quality_e2e.py
65
+ ROSOTACOM_RUN_E2E=1 {{python}} -m pytest -q --durations=0 tests/e2e/test_smoke.py -k "anonymized"
66
66
 
67
67
  test-e2e-concurrency:
68
- ROSOTACOM_RUN_E2E=1 {{python}} -m pytest -q tests/e2e/test_parallel_smoke.py
68
+ ROSOTACOM_RUN_E2E=1 {{python}} -m pytest -q --durations=0 tests/e2e/test_parallel_smoke.py
69
69
 
70
70
  # The five slices partition `test-e2e-smoke`; the merge gate and the release
71
71
  # both run them in parallel. This wrapper exists so a workflow matrix can select
@@ -77,7 +77,7 @@ test-e2e-slice slice:
77
77
  just test-e2e-{{slice}}
78
78
 
79
79
  test-e2e-node nodeid:
80
- ROSOTACOM_RUN_E2E=1 {{python}} -m pytest -q "{{nodeid}}"
80
+ ROSOTACOM_RUN_E2E=1 {{python}} -m pytest -q --durations=0 "{{nodeid}}"
81
81
 
82
82
  test-e2e-rmw session:
83
83
  ROSOTACOM_RUN_E2E=1 ROSOTACOM_RUN_FULL_E2E=1 {{python}} -m pytest -q "tests/e2e/test_smoke.py::test_full_rmw_heartbeat_smoke_matrix[{{session}}]"
@@ -417,17 +417,22 @@ message types for `/com/...` topics. For that reason, user-defined topic entries
417
417
  The auto-generated heartbeat topic is the only exception because its type is known by the generator.
418
418
 
419
419
  #### Allowed `processing` keys
420
- Only these keys are allowed:
420
+ Only these keys are allowed. The list is checked against the generator's
421
+ `KNOWN_PROCESSING_KEYS` by `tests/contract/test_session_configuration_doc.py`,
422
+ so a new knob cannot ship undocumented.
421
423
 
422
424
  ```yaml
423
425
  processing:
424
426
  restamp_if: true # bool OR common bool strings OR "<VAR_NAME>" (template param name)
427
+ latch: false # bool, re-publish on value change only
428
+ trickle_hz: 1 # number > 0, receiver-side periodic re-publish
425
429
  drop: # optional, message drop configuration
426
430
  drop_count: 2 # int >= 0, number of messages to drop
427
431
  window_size: 3 # int > 0, window size (drop_count must be < window_size)
428
432
  framebridge: local_to_global # local_to_global | global_to_local
429
433
  normalize_on_target: false # bool
430
434
  compress: false # bool
435
+ use_ota_wrapper: false # bool, wrap the payload for the OTA hop
431
436
  throttle_hz: 10 # int > 0
432
437
  pixel_cap_preset: "wsvga" # scalar, used as suffix only,
433
438
  transport:
@@ -436,6 +441,37 @@ processing:
436
441
  # plus type-specific params (see below)
437
442
  ```
438
443
 
444
+ ##### `latch` and `trickle_hz`: two answers to "the value did not change"
445
+
446
+ Both address a topic that publishes rarely, and they sit on opposite ends of
447
+ the link:
448
+
449
+ - **`latch` is a sender-side filter.** The latch stage forwards a message only
450
+ when its value differs from the last one, to `<topic>{shared.processing_suffixes.latched}`
451
+ (default `/latched`). It saves OTA bandwidth on a state topic that repeats
452
+ itself. Its cost is that a receiver which subscribes *after* the last change
453
+ gets nothing — what the delivered value is then depends entirely on the OTA
454
+ QoS for the role (`depth`, `lifespan`, `durability`).
455
+ - **`trickle_hz` is a receiver-side re-publish.** A local timer republishes the
456
+ last *delivered* value to `<final>/trickle` at that rate, whether or not
457
+ anything new arrived. Nothing extra crosses the link: the trickle topic is
458
+ not in the OTA topic lists. It exists for consumers that expect a steady
459
+ stream — visualization, state diagrams, watchdogs — and would otherwise treat
460
+ an unchanged value as a dead one.
461
+
462
+ They compose: `latch: true` with `trickle_hz: 1` sends a message only on change
463
+ and still gives the receiving side a 1 Hz stream.
464
+
465
+ Because the trickle output is the real delivered topic, it is the monitored
466
+ `native_in` stage rather than the pre-trickle `final` — otherwise the
467
+ re-publish would be an observability blind spot whose rate no `expect` could
468
+ assert. `expect.hz` on such a topic therefore describes the trickle rate plus
469
+ whatever arrives over the link, which is why `examples/sessions/11_trickle`
470
+ asserts `hz: {min: 2, max: 8}` for a 1 Hz source at `trickle_hz: 4`.
471
+
472
+ `trickle_hz` must be greater than 0. It also sets the expected rate for a topic
473
+ that has no `throttle_hz`.
474
+
439
475
  #### Processing pipeline order (exact)
440
476
  Given a base topic like `/tf`, stages are applied in this order:
441
477