rosotacom-dev 2.5.dev82__tar.gz → 2.5.dev83__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 (400) hide show
  1. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/PKG-INFO +1 -1
  2. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/cli.py +66 -3
  3. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom_dev.egg-info/PKG-INFO +1 -1
  4. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom_dev.egg-info/scm_version.json +2 -2
  5. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/tests/unit/test_ota_benchmark_peer_exec.py +64 -4
  6. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/.devcontainer/devcontainer.json.template +0 -0
  7. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/.devcontainer/re_generate_devcontainer_json.py +0 -0
  8. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/.github/CODEOWNERS +0 -0
  9. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/.github/ISSUE_TEMPLATE/documentation-audit.md +0 -0
  10. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/.github/ISSUE_TEMPLATE/implementation-cleanup.md +0 -0
  11. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/.github/ISSUE_TEMPLATE/quality-workflow.md +0 -0
  12. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/.github/ISSUE_TEMPLATE/redesign.md +0 -0
  13. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/.github/ISSUE_TEMPLATE/release-process.md +0 -0
  14. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/.github/ISSUE_TEMPLATE/repository-diagnosis.md +0 -0
  15. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/.github/ISSUE_TEMPLATE/test-ci-audit.md +0 -0
  16. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/.github/ISSUE_TEMPLATE/work-item.md +0 -0
  17. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  18. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/.github/actions/setup-just/action.yml +0 -0
  19. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/.github/dependabot.yml +0 -0
  20. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/.github/workflows/benchmark-calibrate.yml +0 -0
  21. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/.github/workflows/benchmark-gate.yml +0 -0
  22. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/.github/workflows/dev-release.yml +0 -0
  23. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/.github/workflows/image-scan.yml +0 -0
  24. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/.github/workflows/nightly-e2e.yml +0 -0
  25. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/.github/workflows/pr-lightweight.yml +0 -0
  26. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/.github/workflows/pr-merge-gate.yml +0 -0
  27. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/.github/workflows/release.yml +0 -0
  28. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/.pre-commit-config.yaml +0 -0
  29. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/AGENTS.md +0 -0
  30. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/CONCURRENCY.md +0 -0
  31. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/CONTRIBUTING.md +0 -0
  32. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/DEVELOPMENT_PRINCIPLES.md +0 -0
  33. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/LICENSE.txt +0 -0
  34. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/MANIFEST.in +0 -0
  35. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/README.md +0 -0
  36. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/budgets.jsonl +0 -0
  37. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/calibration/README.md +0 -0
  38. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/calibration/capacity-size-tight-cyclone.json +0 -0
  39. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/calibration/probe-loss-gop-tight-cyclone.json +0 -0
  40. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/calibration/probe-loss-nominal-cyclone.json +0 -0
  41. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/calibration/probe-loss-tight-cyclone.json +0 -0
  42. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/calibration/probe-loss-tight-fastdds.json +0 -0
  43. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/calibration/probe-loss-tight-zenoh.json +0 -0
  44. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/codecov.yml +0 -0
  45. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/deployment-configuration.md +0 -0
  46. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/docs/benchmark-ab.md +0 -0
  47. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/docs/benchmark-bag-as-load.md +0 -0
  48. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/docs/ci.md +0 -0
  49. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/docs/ffmpeg-keyframes.md +0 -0
  50. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/docs/findings/README.md +0 -0
  51. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/docs/findings/a-fitted-delay-table-never-reached-the-shaper.md +0 -0
  52. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/docs/findings/a-shorter-group-does-not-lose-fewer-key-frames.md +0 -0
  53. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/docs/findings/a-transport-element-doubles-every-fastdds-sample.md +0 -0
  54. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/docs/findings/cyclone-fragment-equal-to-max-drops-fragmented-samples.md +0 -0
  55. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/docs/findings/cyclone-spdp-discovery-bursts.md +0 -0
  56. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/docs/findings/delay-alone-no-loss.md +0 -0
  57. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/docs/findings/fastdds-datagram-cap-drops-large-samples.md +0 -0
  58. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/docs/findings/graph-derived-types-block-a-non-graph-transport.md +0 -0
  59. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/docs/findings/head-of-line-irregularity.md +0 -0
  60. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/docs/findings/jitter-loss-bandwidth-latency.md +0 -0
  61. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/docs/findings/keyframe-loss-kills-the-next-deltas.md +0 -0
  62. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/docs/findings/lifespan-is-enforced-by-one-reader-and-not-the-other.md +0 -0
  63. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/docs/findings/lighter-message-loss.md +0 -0
  64. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/docs/findings/neither-a-queue-nor-a-burst-tilts-the-size-law.md +0 -0
  65. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/docs/findings/one-domain-two-cyclone-configs-stop-interoperating.md +0 -0
  66. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/docs/findings/oversubscription-queues-not-losses.md +0 -0
  67. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/docs/findings/queueing-adds-delay-not-loss.md +0 -0
  68. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/docs/findings/reorder-becomes-reader-loss.md +0 -0
  69. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/docs/findings/repro/decode_chain_repro.py +0 -0
  70. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/docs/findings/repro/reorder_drop_repro.py +0 -0
  71. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/docs/findings/sender-rows-make-a-dead-link-look-loss-free.md +0 -0
  72. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/docs/findings/the-size-law-belongs-to-the-transport-not-the-link.md +0 -0
  73. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/docs/findings/zero-loss-boundaries-18kb-20hz.md +0 -0
  74. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/docs/forensics-report.md +0 -0
  75. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/docs/geo-link-map.md +0 -0
  76. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/docs/github-repository-settings.md +0 -0
  77. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/docs/link-bandwidth.md +0 -0
  78. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/docs/link-trace.md +0 -0
  79. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/docs/ota-pcap.md +0 -0
  80. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/docs/owner-runbook.md +0 -0
  81. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/docs/performance-bands.md +0 -0
  82. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/docs/playbooks/README.md +0 -0
  83. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/docs/quality-model.md +0 -0
  84. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/docs/release-notes/TEMPLATE.md +0 -0
  85. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/docs/release-notes/v2.1.md +0 -0
  86. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/docs/release-notes/v2.2.md +0 -0
  87. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/docs/release-notes/v2.3.md +0 -0
  88. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/docs/release-notes/v2.4.md +0 -0
  89. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/docs/release.md +0 -0
  90. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/docs/rfcs/0001-expectation-driven-test-suite.md +0 -0
  91. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/docs/rfcs/0002-expectation-concepts.md +0 -0
  92. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/docs/rfcs/0003-metric-backbone.md +0 -0
  93. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/docs/rfcs/0004-network-profiles.md +0 -0
  94. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/docs/rfcs/0005-benchmark-genres-and-ci.md +0 -0
  95. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/docs/rfcs/0006-dynamic-qos.md +0 -0
  96. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/docs/rfcs/0007-regression-gate.md +0 -0
  97. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/docs/rfcs/README.md +0 -0
  98. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/docs/testing.md +0 -0
  99. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/docs/work-items.md +0 -0
  100. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/install.sh +0 -0
  101. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/justfile +0 -0
  102. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/media/control_center.png +0 -0
  103. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/media/echo_test.png +0 -0
  104. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/media/forensics-report-example.png +0 -0
  105. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/media/host.png +0 -0
  106. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/media/vehicle.png +0 -0
  107. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/pyproject.toml +0 -0
  108. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/requirements.txt +0 -0
  109. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/rosotacom.yaml +0 -0
  110. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/session-configuration.md +0 -0
  111. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/setup.cfg +0 -0
  112. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/__init__.py +0 -0
  113. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/__main__.py +0 -0
  114. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/anonymize.py +0 -0
  115. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/bag_ground_truth.py +0 -0
  116. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/benched_set.py +0 -0
  117. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/benchmark.py +0 -0
  118. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/benchmark_delta.py +0 -0
  119. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/bundle_check.py +0 -0
  120. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/cli_benchmark.py +0 -0
  121. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/deployment.py +0 -0
  122. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/ffmpeg_packet.py +0 -0
  123. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/forensics.py +0 -0
  124. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/geomap.py +0 -0
  125. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/image_cache.py +0 -0
  126. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/netem_dist.py +0 -0
  127. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/network_preflight.py +0 -0
  128. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/network_profiles.py +0 -0
  129. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/network_shaper.py +0 -0
  130. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/plots.py +0 -0
  131. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/py.typed +0 -0
  132. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/benched-set.yaml +0 -0
  133. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/.gitignore +0 -0
  134. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/README.md +0 -0
  135. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/__init__.py +0 -0
  136. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/bags/8_drop_reference/metadata.yaml +0 -0
  137. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/deployment.example.yaml +0 -0
  138. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/dist/field-20260817.dist +0 -0
  139. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/profiles.yaml +0 -0
  140. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/ros2docker.json +0 -0
  141. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/ros2docker.lyrical.json +0 -0
  142. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/rosotacom.yaml +0 -0
  143. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scenarios/2_native_chatter/scenario-definition.yaml +0 -0
  144. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/1_heartbeat/run_machine_a.sh +0 -0
  145. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/1_heartbeat/run_machine_b.sh +0 -0
  146. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_a/external.lyrical.ros2docker.json +0 -0
  147. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_a/external.ros2docker.json +0 -0
  148. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_a/run_communication.sh +0 -0
  149. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_a/run_external.py +0 -0
  150. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_a/wait_for_echo_topic.sh +0 -0
  151. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_b/external.lyrical.ros2docker.json +0 -0
  152. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_b/external.ros2docker.json +0 -0
  153. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_b/run_communication.sh +0 -0
  154. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_b/run_external.py +0 -0
  155. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_a/external.ros2docker.json +0 -0
  156. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_a/external_session.yaml +0 -0
  157. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_a/foxglove.json +0 -0
  158. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_a/run_communication.sh +0 -0
  159. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_a/run_external.py +0 -0
  160. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_b/costmap_1second/costmap_1second_0.mcap +0 -0
  161. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_b/costmap_1second/metadata.yaml +0 -0
  162. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_b/external.ros2docker.json +0 -0
  163. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_b/run_communication.sh +0 -0
  164. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_b/run_external.py +0 -0
  165. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_a/external.ros2docker.json +0 -0
  166. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_a/external_session.yaml +0 -0
  167. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_a/foxglove.json +0 -0
  168. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_a/run_communication.sh +0 -0
  169. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_a/run_external.py +0 -0
  170. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_b/costmap_1second/costmap_1second_0.mcap +0 -0
  171. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_b/costmap_1second/metadata.yaml +0 -0
  172. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_b/external.ros2docker.json +0 -0
  173. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_b/run_communication.sh +0 -0
  174. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_b/run_external.py +0 -0
  175. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_a/external.ros2docker.json +0 -0
  176. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_a/external_session.yaml +0 -0
  177. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_a/run_communication.sh +0 -0
  178. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_a/run_external.py +0 -0
  179. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_b/external.ros2docker.json +0 -0
  180. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_b/external_session.yaml +0 -0
  181. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_b/run_communication.sh +0 -0
  182. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_b/run_external.py +0 -0
  183. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_a/external.ros2docker.json +0 -0
  184. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_a/external_session.yaml +0 -0
  185. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_a/run_communication.sh +0 -0
  186. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_a/run_external.py +0 -0
  187. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_b/external.ros2docker.json +0 -0
  188. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_b/external_session.yaml +0 -0
  189. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_b/run_communication.sh +0 -0
  190. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_b/run_external.py +0 -0
  191. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/sessions/10_restamp/session-definition.yaml +0 -0
  192. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/sessions/11_trickle/session-definition.yaml +0 -0
  193. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/sessions/12_content_integrity/session-definition.yaml +0 -0
  194. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/sessions/13_link_latency/session-definition.yaml +0 -0
  195. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/sessions/14_remote_assist_anonymized/session-definition.yaml +0 -0
  196. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/sessions/15_remote_assist_anonymized_costmap/session-definition.yaml +0 -0
  197. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/sessions/16_remote_assist_anonymized_camera/session-definition.yaml +0 -0
  198. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/sessions/17_synthetic_camera_quality/session-definition.yaml +0 -0
  199. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/sessions/1_heartbeat/session-definition.yaml +0 -0
  200. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/sessions/1_heartbeat_status/session-definition.yaml +0 -0
  201. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/sessions/2_native_chatter/session-definition.yaml +0 -0
  202. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/sessions/3_comp_occ_grid/session-definition.yaml +0 -0
  203. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/sessions/4_comp_occ_grid_zen/session-definition.yaml +0 -0
  204. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/sessions/5_sized_payload/session-definition.yaml +0 -0
  205. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/sessions/6_sized_payload_zen/session-definition.yaml +0 -0
  206. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/sessions/7_latched_static/session-definition.yaml +0 -0
  207. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/sessions/8_drop/session-definition.yaml +0 -0
  208. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/sessions/9_throttle/session-definition.yaml +0 -0
  209. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/sessions/bench_1_1_capacity/session-definition.yaml +0 -0
  210. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/sessions/bench_1_2_load_sweep/session-definition.yaml +0 -0
  211. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/sessions/bench_1_3_ramp/session-definition.yaml +0 -0
  212. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/sessions/bench_1_4_recovery/session-definition.yaml +0 -0
  213. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/sessions/bench_1_5_camera/session-definition.yaml +0 -0
  214. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ros2docker.json.example +0 -0
  215. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ros2docker.lyrical.json.example +0 -0
  216. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/.vscode/c_cpp_properties.json +0 -0
  217. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/.vscode/settings.json +0 -0
  218. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_easy_mode.xml.template +0 -0
  219. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_initial_peer_list.xml.template +0 -0
  220. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_v2.xml.template +0 -0
  221. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_v3.xml.template +0 -0
  222. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_v4.xml.template +0 -0
  223. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_v5.xml.template +0 -0
  224. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ota_configs/create_zenoh_json5.py +0 -0
  225. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ota_configs/cyclonedds_local_participants.xml.template +0 -0
  226. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ota_configs/cyclonedds_minimal.xml.template +0 -0
  227. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ota_configs/cyclonedds_scoped.xml.template +0 -0
  228. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ota_configs/cyclonedds_tuned.xml.template +0 -0
  229. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ota_configs/fastdds_easy_mode.xml.template +0 -0
  230. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ota_configs/fastdds_local.xml.template +0 -0
  231. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ota_configs/fastdds_tuned.xml.template +0 -0
  232. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ota_configs/fastdds_unicast.xml.template +0 -0
  233. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ota_configs/get_ota_xml.py +0 -0
  234. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ota_configs/utils.py +0 -0
  235. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ota_configs/zenoh.json5.template +0 -0
  236. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/.gitkeep +0 -0
  237. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_cpp/CMakeLists.txt +0 -0
  238. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_cpp/COLCON_IGNORE +0 -0
  239. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_cpp/LICENSE.txt +0 -0
  240. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_cpp/package.xml +0 -0
  241. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_cpp/src/hz_monitor.cpp +0 -0
  242. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_cpp/src/universal_compressor.cpp +0 -0
  243. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_cpp/src/universal_decompressor.cpp +0 -0
  244. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_msgs/CMakeLists.txt +0 -0
  245. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_msgs/LICENSE.txt +0 -0
  246. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_msgs/msg/CompressedData.msg +0 -0
  247. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_msgs/msg/EchoHeartbeat.msg +0 -0
  248. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_msgs/msg/OtaStamped.msg +0 -0
  249. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_msgs/msg/SizedPayload.msg +0 -0
  250. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_msgs/package.xml +0 -0
  251. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/LICENSE.txt +0 -0
  252. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/com_py/__init__.py +0 -0
  253. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/com_py/base_bridge_relay.py +0 -0
  254. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/com_py/bridge_in.py +0 -0
  255. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/com_py/bridge_out.py +0 -0
  256. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/com_py/ffmpeg_flags.py +0 -0
  257. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/com_py/heartbeat_echo.py +0 -0
  258. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/com_py/hz_monitor.py +0 -0
  259. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/com_py/image_bandwidth_reducer.py +0 -0
  260. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/com_py/image_pixel_capper.py +0 -0
  261. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/com_py/lanelet_saver.py +0 -0
  262. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/com_py/latch_relay.py +0 -0
  263. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/costmap_remapper.py +0 -0
  264. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/marker_remapper.py +0 -0
  265. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/speed_test.py +0 -0
  266. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/tf_remapper.py +0 -0
  267. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/traffic_monitor.py +0 -0
  268. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/wifi_network_analysis_1.py +0 -0
  269. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/com_py/link_bytes.py +0 -0
  270. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/com_py/link_trace.py +0 -0
  271. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/com_py/local_global_frame_bridge.py +0 -0
  272. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/com_py/localization_map_split_reduce_saver.py +0 -0
  273. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/com_py/msg_transform.py +0 -0
  274. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/com_py/ota_pcap.py +0 -0
  275. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/com_py/pair_management.py +0 -0
  276. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/com_py/playout_pacer.py +0 -0
  277. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/com_py/playout_pacer_core.py +0 -0
  278. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/com_py/pub_sub_pair.py +0 -0
  279. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/com_py/qos.py +0 -0
  280. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/com_py/relay_in.py +0 -0
  281. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/com_py/relay_out.py +0 -0
  282. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/com_py/restamp.py +0 -0
  283. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/com_py/sized_publisher.py +0 -0
  284. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/com_py/stage_latency.py +0 -0
  285. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/com_py/stage_latency_core.py +0 -0
  286. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/com_py/status_overview.py +0 -0
  287. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/com_py/status_overview_core.py +0 -0
  288. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/com_py/tf_map_to_cart_saver.py +0 -0
  289. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/com_py/topic_monitor.py +0 -0
  290. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/com_py/topic_resolution.py +0 -0
  291. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/com_py/trickle.py +0 -0
  292. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/com_py/universal_compressor.py +0 -0
  293. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/com_py/universal_decompressor.py +0 -0
  294. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/com_py/universal_ota_unwrapper.py +0 -0
  295. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/com_py/universal_ota_wrapper.py +0 -0
  296. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/package.xml +0 -0
  297. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/resource/com_py +0 -0
  298. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/setup.cfg +0 -0
  299. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/setup.py +0 -0
  300. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/test/test_copyright.py +0 -0
  301. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/test/test_flake8.py +0 -0
  302. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/test/test_pep257.py +0 -0
  303. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/session/content/base/session_plugin_base.yaml +0 -0
  304. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/session/content/network/up_connectivity.py +0 -0
  305. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/session/content/network/wifi_network_analysis_2.py +0 -0
  306. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/session/creation/anonymize_bag.py +0 -0
  307. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/session/creation/catmux_log_setup.sh +0 -0
  308. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/session/creation/create_session_yaml.py +0 -0
  309. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/session/creation/generate_session_files.py +0 -0
  310. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/session/creation/run_session.py +0 -0
  311. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/session/creation/run_session_in_external_terminal.py +0 -0
  312. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/session/creation/strip_ansi.py +0 -0
  313. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/status_eval.py +0 -0
  314. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/stream_stats.py +0 -0
  315. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/trace_profiles.py +0 -0
  316. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/transit.py +0 -0
  317. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom/video_quality.py +0 -0
  318. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom_dev.egg-info/SOURCES.txt +0 -0
  319. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom_dev.egg-info/dependency_links.txt +0 -0
  320. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom_dev.egg-info/entry_points.txt +0 -0
  321. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom_dev.egg-info/requires.txt +0 -0
  322. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom_dev.egg-info/scm_file_list.json +0 -0
  323. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/src/rosotacom_dev.egg-info/top_level.txt +0 -0
  324. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/terminology.md +0 -0
  325. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/tests/contract/test_benched_set_registry.py +0 -0
  326. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/tests/contract/test_findings.py +0 -0
  327. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/tests/contract/test_generated_topics_have_a_producer.py +0 -0
  328. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/tests/contract/test_lyrical_runtime_compat.py +0 -0
  329. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/tests/contract/test_markdown_links.py +0 -0
  330. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/tests/contract/test_ota_source_bundle.py +0 -0
  331. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/tests/contract/test_package_metadata.py +0 -0
  332. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/tests/contract/test_packaged_resources.py +0 -0
  333. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/tests/contract/test_profile_covers_generated_commands.py +0 -0
  334. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/tests/contract/test_pytest_policy.py +0 -0
  335. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/tests/contract/test_readme_examples.py +0 -0
  336. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/tests/contract/test_security_maintenance_config.py +0 -0
  337. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/tests/contract/test_session_configuration_doc.py +0 -0
  338. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/tests/contract/test_session_template_substitution.py +0 -0
  339. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/tests/contract/test_workflow_contracts.py +0 -0
  340. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/tests/e2e/conftest.py +0 -0
  341. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/tests/e2e/test_anonymize_e2e.py +0 -0
  342. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/tests/e2e/test_benchmark_ab.py +0 -0
  343. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/tests/e2e/test_benchmark_capacity.py +0 -0
  344. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/tests/e2e/test_benchmark_replay.py +0 -0
  345. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/tests/e2e/test_parallel_smoke.py +0 -0
  346. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/tests/e2e/test_smoke.py +0 -0
  347. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/tests/e2e/test_timeline_stepping.py +0 -0
  348. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/tests/e2e/test_video_quality_e2e.py +0 -0
  349. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/tests/sessions/generate_rmw_matrix.py +0 -0
  350. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/tests/sessions/rmw_matrix/1_heartbeat_cyclone-local_zenoh-ros2dds-ota/session-definition.yaml +0 -0
  351. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/tests/sessions/rmw_matrix/1_heartbeat_cyclone-ota/session-definition.yaml +0 -0
  352. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/tests/sessions/rmw_matrix/1_heartbeat_cyclone-ota-tuned/session-definition.yaml +0 -0
  353. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/tests/sessions/rmw_matrix/1_heartbeat_fastdds/session-definition.yaml +0 -0
  354. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/tests/sessions/rmw_matrix/1_heartbeat_fastdds-default/session-definition.yaml +0 -0
  355. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/tests/sessions/rmw_matrix/1_heartbeat_zen-endpoints/session-definition.yaml +0 -0
  356. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/tests/unit/test_anonymize.py +0 -0
  357. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/tests/unit/test_bag_ground_truth.py +0 -0
  358. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/tests/unit/test_benched_set.py +0 -0
  359. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/tests/unit/test_benchmark.py +0 -0
  360. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/tests/unit/test_benchmark_delta.py +0 -0
  361. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/tests/unit/test_bundle_check.py +0 -0
  362. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/tests/unit/test_catmux_pane_logging.py +0 -0
  363. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/tests/unit/test_cli.py +0 -0
  364. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/tests/unit/test_cli_benchmark.py +0 -0
  365. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/tests/unit/test_concurrency.py +0 -0
  366. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/tests/unit/test_container_shaping.py +0 -0
  367. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/tests/unit/test_deployment.py +0 -0
  368. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/tests/unit/test_ffmpeg_flags.py +0 -0
  369. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/tests/unit/test_ffmpeg_packet.py +0 -0
  370. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/tests/unit/test_field_profiles.py +0 -0
  371. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/tests/unit/test_forensics.py +0 -0
  372. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/tests/unit/test_geomap.py +0 -0
  373. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/tests/unit/test_image_cache.py +0 -0
  374. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/tests/unit/test_link_bytes.py +0 -0
  375. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/tests/unit/test_link_trace.py +0 -0
  376. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/tests/unit/test_netem_dist.py +0 -0
  377. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/tests/unit/test_network_preflight.py +0 -0
  378. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/tests/unit/test_network_profiles.py +0 -0
  379. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/tests/unit/test_network_shaper.py +0 -0
  380. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/tests/unit/test_ota_link_configs.py +0 -0
  381. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/tests/unit/test_ota_pcap.py +0 -0
  382. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/tests/unit/test_ota_unwrapper.py +0 -0
  383. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/tests/unit/test_ota_wrapper.py +0 -0
  384. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/tests/unit/test_ota_xml.py +0 -0
  385. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/tests/unit/test_playout_pacer.py +0 -0
  386. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/tests/unit/test_plots.py +0 -0
  387. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/tests/unit/test_pub_sub_pair_types.py +0 -0
  388. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/tests/unit/test_qos_fallback_logging.py +0 -0
  389. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/tests/unit/test_relay_optional_parameters.py +0 -0
  390. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/tests/unit/test_ros_node_entity_ownership.py +0 -0
  391. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/tests/unit/test_session_pipeline.py +0 -0
  392. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/tests/unit/test_stage_latency.py +0 -0
  393. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/tests/unit/test_status_eval.py +0 -0
  394. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/tests/unit/test_status_overview.py +0 -0
  395. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/tests/unit/test_status_overview_observer.py +0 -0
  396. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/tests/unit/test_stream_stats.py +0 -0
  397. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/tests/unit/test_terminology_stage_ownership.py +0 -0
  398. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/tests/unit/test_trace_profiles.py +0 -0
  399. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/tests/unit/test_transit.py +0 -0
  400. {rosotacom_dev-2.5.dev82 → rosotacom_dev-2.5.dev83}/tests/unit/test_video_quality.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rosotacom-dev
3
- Version: 2.5.dev82
3
+ Version: 2.5.dev83
4
4
  Summary: Host CLI for ROS OTA communication sessions.
5
5
  Author: develNor
6
6
  License-Expression: BSD-3-Clause
@@ -2437,9 +2437,19 @@ def _ota_stop_parts(
2437
2437
  #: How a benchmark's load maps onto `publish-test-topics` flags. The keys are
2438
2438
  #: `_sized_publisher_param_args`'s own, so a load dict travels from the
2439
2439
  #: benchmark to the peer's publisher without being rewritten on the way.
2440
+ #:
2441
+ #: `size_pattern` and not `pattern`, and that distinction is the whole reason a
2442
+ #: mixed-size load never reached a peer. `parse_size_pattern_load` turns one CLI
2443
+ #: string into five keys -- `sizes`, `pattern`, `size_pattern`, and one
2444
+ #: `size_<label>` per distinct size -- and only three of them used to cross the
2445
+ #: hop. A two-size pattern therefore arrived as `pattern=a*6,b*1` with `size_a`
2446
+ #: and no `size_b`, and the publisher died on `Pattern references size 'b' but
2447
+ #: it was not provided` inside a detached `docker exec`, which the orchestrator
2448
+ #: reported as the topic not advertising. Sending the *source* string instead
2449
+ #: cannot lose a size, whatever the pattern turns out to contain.
2440
2450
  _OTA_LOAD_FLAGS: tuple[tuple[str, str], ...] = (
2441
2451
  ("size", "--load-size"),
2442
- ("pattern", "--load-size-pattern"),
2452
+ ("size_pattern", "--load-size-pattern"),
2443
2453
  ("rate", "--load-rate-hz"),
2444
2454
  ("streams", "--load-streams"),
2445
2455
  ("interval_jitter_ms", "--load-interval-jitter-ms"),
@@ -2469,6 +2479,16 @@ def _ota_publish_parts(
2469
2479
  merged = dict(load or {})
2470
2480
  if "size" not in merged and merged.get("size_a") is not None:
2471
2481
  merged["size"] = merged["size_a"]
2482
+ if merged.get("pattern") and not merged.get("size_pattern"):
2483
+ # Only `parse_size_pattern_load` produces `pattern`, and it always
2484
+ # produces `size_pattern` beside it. A load carrying one without the
2485
+ # other was assembled by hand, and sending the expanded form would
2486
+ # drop every size but the first -- loudly here rather than as a peer
2487
+ # whose publisher will not start.
2488
+ raise RuntimeError(
2489
+ f"load carries pattern {merged['pattern']!r} without the size pattern it came from; "
2490
+ "build it with parse_size_pattern_load so every size reaches the peer."
2491
+ )
2472
2492
  for key, flag in _OTA_LOAD_FLAGS:
2473
2493
  if merged.get(key) is not None:
2474
2494
  parts.extend([flag, str(merged[key])])
@@ -7580,6 +7600,33 @@ def _smoke_publish_specs(cfg: dict[str, Any], source_peer_key: str | None = None
7580
7600
  return specs
7581
7601
 
7582
7602
 
7603
+ #: Where a detached smoke publisher's own output goes inside its container.
7604
+ #: `docker exec -d` returns before the process says anything and keeps nothing,
7605
+ #: so without this the only evidence of a publisher that refused to start is the
7606
+ #: topic never appearing -- which reads as a broken graph rather than as a bad
7607
+ #: parameter. One file per topic, overwritten per attempt.
7608
+ _SMOKE_PUBLISHER_LOG_DIR = "/tmp"
7609
+
7610
+
7611
+ def _smoke_publisher_log_path(topic: str) -> str:
7612
+ slug = re.sub(r"[^A-Za-z0-9]+", "_", topic).strip("_") or "topic"
7613
+ return f"{_SMOKE_PUBLISHER_LOG_DIR}/rosotacom-smoke-publisher-{slug}.log"
7614
+
7615
+
7616
+ def _smoke_publisher_failure_detail(container: str, log_path: str) -> str:
7617
+ """What the publisher said before it stopped, if it said anything."""
7618
+ result = subprocess.run(
7619
+ ["docker", "exec", container, "tail", "-n", "20", log_path],
7620
+ capture_output=True,
7621
+ text=True,
7622
+ check=False,
7623
+ )
7624
+ detail = ((result.stdout or "") + (result.stderr or "")).strip()
7625
+ if not detail:
7626
+ return f" Nothing was written to {log_path} in the container, so it never got as far as starting."
7627
+ return f"\nWhat it wrote to {log_path}:\n{detail}"
7628
+
7629
+
7583
7630
  def _start_smoke_topic_publishers(
7584
7631
  containers: dict[str, str],
7585
7632
  ros_setups: dict[str, str],
@@ -7606,8 +7653,9 @@ def _start_smoke_topic_publishers(
7606
7653
  f"Starting smoke publisher {spec.source_peer_key}->{spec.receiver_peer_key} "
7607
7654
  f"{spec.publish_topic} ({spec.publish_type}) in {container}{offered}"
7608
7655
  )
7656
+ log_path = _smoke_publisher_log_path(spec.publish_topic)
7609
7657
  subprocess.run(
7610
- ["docker", "exec", "-d", container, "bash", "-c", cmd],
7658
+ ["docker", "exec", "-d", container, "bash", "-c", f"{{ {cmd} ; }} > {shlex.quote(log_path)} 2>&1"],
7611
7659
  capture_output=True,
7612
7660
  text=True,
7613
7661
  check=False,
@@ -7626,6 +7674,7 @@ def _start_smoke_topic_publishers(
7626
7674
  raise RuntimeError(
7627
7675
  f"Smoke publisher {spec.source_peer_key}->{spec.receiver_peer_key} "
7628
7676
  f"{spec.publish_topic} ({spec.publish_type}) did not advertise in {container}."
7677
+ + _smoke_publisher_failure_detail(container, log_path)
7629
7678
  )
7630
7679
  return started
7631
7680
 
@@ -7981,7 +8030,21 @@ def _publish_load_override(args: argparse.Namespace) -> dict[str, Any] | None:
7981
8030
  load["size"] = int(args.load_size)
7982
8031
  load["size_a"] = int(args.load_size)
7983
8032
  if getattr(args, "load_size_pattern", None):
7984
- load["pattern"] = args.load_size_pattern
8033
+ # Re-derived here rather than carried in pieces: the orchestrator sends
8034
+ # the pattern it was given, and this side expands it into `sizes`,
8035
+ # `pattern` and every `size_<label>` the publisher needs. `size_a` from
8036
+ # `--load-size` above is overwritten on purpose -- a pattern names its
8037
+ # own sizes, and the scalar is only a fallback for callers without one.
8038
+ from .benchmark import parse_size_pattern_load
8039
+
8040
+ try:
8041
+ load.update(parse_size_pattern_load(str(args.load_size_pattern)))
8042
+ except ValueError as error:
8043
+ raise RuntimeError(
8044
+ f"--load-size-pattern {args.load_size_pattern!r} is not a size pattern ({error}). "
8045
+ "An orchestrator older than this peer sends the expanded token form here instead of the "
8046
+ "pattern; the two sides have to agree, so bring them to the same rosotacom."
8047
+ ) from error
7985
8048
  if getattr(args, "load_rate_hz", None) is not None:
7986
8049
  load["rate"] = float(args.load_rate_hz)
7987
8050
  if getattr(args, "load_streams", None) is not None:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rosotacom-dev
3
- Version: 2.5.dev82
3
+ Version: 2.5.dev83
4
4
  Summary: Host CLI for ROS OTA communication sessions.
5
5
  Author: develNor
6
6
  License-Expression: BSD-3-Clause
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "tag": "2.4",
3
- "distance": 82,
4
- "node": "g0bd86d806f93ae00ec7f7009dd35fe5a018852e8",
3
+ "distance": 83,
4
+ "node": "g5a3561c197b13a9e9d2b6076cde0bc94bfa9afa4",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-09-01"
@@ -11,12 +11,16 @@ from __future__ import annotations
11
11
 
12
12
  import argparse
13
13
 
14
+ import pytest
15
+
16
+ from rosotacom.benchmark import parse_size_pattern_load
14
17
  from rosotacom.cli import (
15
18
  _ota_instances_rel,
16
19
  _ota_publish_parts,
17
20
  _profile_directions_for,
18
21
  _publish_load_override,
19
22
  )
23
+ from rosotacom.cli_benchmark import _sized_publisher_param_args
20
24
 
21
25
 
22
26
  class _Target:
@@ -72,11 +76,67 @@ def test_the_benchmark_load_reaches_the_peer_command():
72
76
  assert "--load-streams" in parts and parts[parts.index("--load-streams") + 1] == "2"
73
77
 
74
78
 
75
- def test_a_size_pattern_travels_as_itself():
76
- parts = _ota_publish_parts(_Target(), "a", [], load={"pattern": "a*4,b*1", "size_a": 5000})
77
- assert parts[parts.index("--load-size-pattern") + 1] == "a*4,b*1"
79
+ def test_a_size_pattern_travels_as_the_string_it_was_given():
80
+ """The source pattern, not the expanded token form it was compiled into.
81
+
82
+ `parse_size_pattern_load` turns one string into `sizes`, `pattern`,
83
+ `size_pattern` and a `size_<label>` per distinct size, and only three of
84
+ those used to cross the hop. A two-size pattern arrived as `a*6,b*1` with a
85
+ `size_a` and no `size_b`, so the peer's publisher died on `Pattern
86
+ references size 'b' but it was not provided` -- inside a detached
87
+ `docker exec`, which the orchestrator could only report as the topic never
88
+ advertising. Sending the source string cannot lose a size.
89
+ """
90
+ load = parse_size_pattern_load("6x200B+1x28000B")
91
+ parts = _ota_publish_parts(_Target(), "a", [], load=load)
92
+
93
+ assert parts[parts.index("--load-size-pattern") + 1] == "6x200B+1x28000B"
94
+ assert "a*6,b*1" not in parts
78
95
  # `size_a` is the pattern's own base size and must reach the peer as --load-size.
79
- assert parts[parts.index("--load-size") + 1] == "5000"
96
+ assert parts[parts.index("--load-size") + 1] == "200"
97
+
98
+
99
+ def test_a_hand_built_pattern_load_is_refused_rather_than_silently_truncated():
100
+ with pytest.raises(RuntimeError, match="without the size pattern it came from"):
101
+ _ota_publish_parts(_Target(), "a", [], load={"pattern": "a*4,b*1", "size_a": 5000})
102
+
103
+
104
+ def test_every_size_of_a_pattern_survives_the_round_trip_to_the_publisher():
105
+ """Orchestrator load -> peer flags -> peer load -> publisher parameters.
106
+
107
+ The end the defect lived at: each step looked right on its own, and only
108
+ the whole chain shows that the second size never arrives.
109
+ """
110
+ parts = _ota_publish_parts(_Target(), "a", [], load=parse_size_pattern_load("6x200B+1x28000B"))
111
+ args = argparse.Namespace(
112
+ load_size=int(parts[parts.index("--load-size") + 1]),
113
+ load_size_pattern=parts[parts.index("--load-size-pattern") + 1],
114
+ load_rate_hz=None,
115
+ load_streams=None,
116
+ load_interval_jitter_ms=None,
117
+ load_interval_jitter_seed=None,
118
+ )
119
+ peer_load = _publish_load_override(args)
120
+ assert peer_load is not None
121
+
122
+ params = _sized_publisher_param_args("/bench_capacity", dict(peer_load))
123
+
124
+ assert "size_a:=200" in params
125
+ assert "size_b:=28000" in params
126
+ assert "pattern:=a*6,b*1" in params
127
+
128
+
129
+ def test_a_peer_newer_than_its_orchestrator_says_so_instead_of_failing_obscurely():
130
+ args = argparse.Namespace(
131
+ load_size=5000,
132
+ load_size_pattern="a*4,b*1",
133
+ load_rate_hz=None,
134
+ load_streams=None,
135
+ load_interval_jitter_ms=None,
136
+ load_interval_jitter_seed=None,
137
+ )
138
+ with pytest.raises(RuntimeError, match="same rosotacom"):
139
+ _publish_load_override(args)
80
140
 
81
141
 
82
142
  def test_no_load_leaves_the_session_to_say_what_it_expects():