rosotacom-dev 2.5.dev81__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.dev81 → rosotacom_dev-2.5.dev83}/PKG-INFO +1 -1
  2. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/cli.py +99 -4
  3. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom_dev.egg-info/PKG-INFO +1 -1
  4. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom_dev.egg-info/scm_version.json +2 -2
  5. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/tests/unit/test_cli.py +26 -0
  6. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/tests/unit/test_ota_benchmark_peer_exec.py +64 -4
  7. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/.devcontainer/devcontainer.json.template +0 -0
  8. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/.devcontainer/re_generate_devcontainer_json.py +0 -0
  9. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/.github/CODEOWNERS +0 -0
  10. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/.github/ISSUE_TEMPLATE/documentation-audit.md +0 -0
  11. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/.github/ISSUE_TEMPLATE/implementation-cleanup.md +0 -0
  12. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/.github/ISSUE_TEMPLATE/quality-workflow.md +0 -0
  13. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/.github/ISSUE_TEMPLATE/redesign.md +0 -0
  14. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/.github/ISSUE_TEMPLATE/release-process.md +0 -0
  15. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/.github/ISSUE_TEMPLATE/repository-diagnosis.md +0 -0
  16. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/.github/ISSUE_TEMPLATE/test-ci-audit.md +0 -0
  17. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/.github/ISSUE_TEMPLATE/work-item.md +0 -0
  18. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  19. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/.github/actions/setup-just/action.yml +0 -0
  20. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/.github/dependabot.yml +0 -0
  21. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/.github/workflows/benchmark-calibrate.yml +0 -0
  22. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/.github/workflows/benchmark-gate.yml +0 -0
  23. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/.github/workflows/dev-release.yml +0 -0
  24. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/.github/workflows/image-scan.yml +0 -0
  25. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/.github/workflows/nightly-e2e.yml +0 -0
  26. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/.github/workflows/pr-lightweight.yml +0 -0
  27. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/.github/workflows/pr-merge-gate.yml +0 -0
  28. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/.github/workflows/release.yml +0 -0
  29. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/.pre-commit-config.yaml +0 -0
  30. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/AGENTS.md +0 -0
  31. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/CONCURRENCY.md +0 -0
  32. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/CONTRIBUTING.md +0 -0
  33. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/DEVELOPMENT_PRINCIPLES.md +0 -0
  34. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/LICENSE.txt +0 -0
  35. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/MANIFEST.in +0 -0
  36. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/README.md +0 -0
  37. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/budgets.jsonl +0 -0
  38. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/calibration/README.md +0 -0
  39. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/calibration/capacity-size-tight-cyclone.json +0 -0
  40. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/calibration/probe-loss-gop-tight-cyclone.json +0 -0
  41. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/calibration/probe-loss-nominal-cyclone.json +0 -0
  42. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/calibration/probe-loss-tight-cyclone.json +0 -0
  43. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/calibration/probe-loss-tight-fastdds.json +0 -0
  44. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/calibration/probe-loss-tight-zenoh.json +0 -0
  45. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/codecov.yml +0 -0
  46. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/deployment-configuration.md +0 -0
  47. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/docs/benchmark-ab.md +0 -0
  48. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/docs/benchmark-bag-as-load.md +0 -0
  49. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/docs/ci.md +0 -0
  50. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/docs/ffmpeg-keyframes.md +0 -0
  51. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/docs/findings/README.md +0 -0
  52. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/docs/findings/a-fitted-delay-table-never-reached-the-shaper.md +0 -0
  53. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/docs/findings/a-shorter-group-does-not-lose-fewer-key-frames.md +0 -0
  54. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/docs/findings/a-transport-element-doubles-every-fastdds-sample.md +0 -0
  55. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/docs/findings/cyclone-fragment-equal-to-max-drops-fragmented-samples.md +0 -0
  56. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/docs/findings/cyclone-spdp-discovery-bursts.md +0 -0
  57. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/docs/findings/delay-alone-no-loss.md +0 -0
  58. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/docs/findings/fastdds-datagram-cap-drops-large-samples.md +0 -0
  59. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/docs/findings/graph-derived-types-block-a-non-graph-transport.md +0 -0
  60. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/docs/findings/head-of-line-irregularity.md +0 -0
  61. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/docs/findings/jitter-loss-bandwidth-latency.md +0 -0
  62. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/docs/findings/keyframe-loss-kills-the-next-deltas.md +0 -0
  63. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/docs/findings/lifespan-is-enforced-by-one-reader-and-not-the-other.md +0 -0
  64. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/docs/findings/lighter-message-loss.md +0 -0
  65. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/docs/findings/neither-a-queue-nor-a-burst-tilts-the-size-law.md +0 -0
  66. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/docs/findings/one-domain-two-cyclone-configs-stop-interoperating.md +0 -0
  67. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/docs/findings/oversubscription-queues-not-losses.md +0 -0
  68. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/docs/findings/queueing-adds-delay-not-loss.md +0 -0
  69. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/docs/findings/reorder-becomes-reader-loss.md +0 -0
  70. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/docs/findings/repro/decode_chain_repro.py +0 -0
  71. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/docs/findings/repro/reorder_drop_repro.py +0 -0
  72. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/docs/findings/sender-rows-make-a-dead-link-look-loss-free.md +0 -0
  73. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/docs/findings/the-size-law-belongs-to-the-transport-not-the-link.md +0 -0
  74. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/docs/findings/zero-loss-boundaries-18kb-20hz.md +0 -0
  75. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/docs/forensics-report.md +0 -0
  76. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/docs/geo-link-map.md +0 -0
  77. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/docs/github-repository-settings.md +0 -0
  78. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/docs/link-bandwidth.md +0 -0
  79. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/docs/link-trace.md +0 -0
  80. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/docs/ota-pcap.md +0 -0
  81. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/docs/owner-runbook.md +0 -0
  82. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/docs/performance-bands.md +0 -0
  83. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/docs/playbooks/README.md +0 -0
  84. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/docs/quality-model.md +0 -0
  85. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/docs/release-notes/TEMPLATE.md +0 -0
  86. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/docs/release-notes/v2.1.md +0 -0
  87. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/docs/release-notes/v2.2.md +0 -0
  88. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/docs/release-notes/v2.3.md +0 -0
  89. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/docs/release-notes/v2.4.md +0 -0
  90. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/docs/release.md +0 -0
  91. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/docs/rfcs/0001-expectation-driven-test-suite.md +0 -0
  92. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/docs/rfcs/0002-expectation-concepts.md +0 -0
  93. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/docs/rfcs/0003-metric-backbone.md +0 -0
  94. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/docs/rfcs/0004-network-profiles.md +0 -0
  95. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/docs/rfcs/0005-benchmark-genres-and-ci.md +0 -0
  96. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/docs/rfcs/0006-dynamic-qos.md +0 -0
  97. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/docs/rfcs/0007-regression-gate.md +0 -0
  98. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/docs/rfcs/README.md +0 -0
  99. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/docs/testing.md +0 -0
  100. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/docs/work-items.md +0 -0
  101. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/install.sh +0 -0
  102. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/justfile +0 -0
  103. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/media/control_center.png +0 -0
  104. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/media/echo_test.png +0 -0
  105. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/media/forensics-report-example.png +0 -0
  106. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/media/host.png +0 -0
  107. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/media/vehicle.png +0 -0
  108. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/pyproject.toml +0 -0
  109. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/requirements.txt +0 -0
  110. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/rosotacom.yaml +0 -0
  111. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/session-configuration.md +0 -0
  112. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/setup.cfg +0 -0
  113. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/__init__.py +0 -0
  114. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/__main__.py +0 -0
  115. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/anonymize.py +0 -0
  116. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/bag_ground_truth.py +0 -0
  117. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/benched_set.py +0 -0
  118. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/benchmark.py +0 -0
  119. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/benchmark_delta.py +0 -0
  120. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/bundle_check.py +0 -0
  121. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/cli_benchmark.py +0 -0
  122. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/deployment.py +0 -0
  123. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/ffmpeg_packet.py +0 -0
  124. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/forensics.py +0 -0
  125. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/geomap.py +0 -0
  126. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/image_cache.py +0 -0
  127. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/netem_dist.py +0 -0
  128. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/network_preflight.py +0 -0
  129. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/network_profiles.py +0 -0
  130. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/network_shaper.py +0 -0
  131. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/plots.py +0 -0
  132. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/py.typed +0 -0
  133. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/benched-set.yaml +0 -0
  134. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/.gitignore +0 -0
  135. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/README.md +0 -0
  136. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/__init__.py +0 -0
  137. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/bags/8_drop_reference/metadata.yaml +0 -0
  138. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/deployment.example.yaml +0 -0
  139. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/dist/field-20260817.dist +0 -0
  140. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/profiles.yaml +0 -0
  141. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/ros2docker.json +0 -0
  142. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/ros2docker.lyrical.json +0 -0
  143. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/rosotacom.yaml +0 -0
  144. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scenarios/2_native_chatter/scenario-definition.yaml +0 -0
  145. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/1_heartbeat/run_machine_a.sh +0 -0
  146. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/1_heartbeat/run_machine_b.sh +0 -0
  147. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_a/external.lyrical.ros2docker.json +0 -0
  148. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_a/external.ros2docker.json +0 -0
  149. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_a/run_communication.sh +0 -0
  150. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_a/run_external.py +0 -0
  151. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_a/wait_for_echo_topic.sh +0 -0
  152. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_b/external.lyrical.ros2docker.json +0 -0
  153. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_b/external.ros2docker.json +0 -0
  154. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_b/run_communication.sh +0 -0
  155. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_b/run_external.py +0 -0
  156. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_a/external.ros2docker.json +0 -0
  157. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_a/external_session.yaml +0 -0
  158. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_a/foxglove.json +0 -0
  159. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_a/run_communication.sh +0 -0
  160. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_a/run_external.py +0 -0
  161. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_b/costmap_1second/costmap_1second_0.mcap +0 -0
  162. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_b/costmap_1second/metadata.yaml +0 -0
  163. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_b/external.ros2docker.json +0 -0
  164. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_b/run_communication.sh +0 -0
  165. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_b/run_external.py +0 -0
  166. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_a/external.ros2docker.json +0 -0
  167. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_a/external_session.yaml +0 -0
  168. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_a/foxglove.json +0 -0
  169. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_a/run_communication.sh +0 -0
  170. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_a/run_external.py +0 -0
  171. {rosotacom_dev-2.5.dev81 → 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
  172. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_b/costmap_1second/metadata.yaml +0 -0
  173. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_b/external.ros2docker.json +0 -0
  174. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_b/run_communication.sh +0 -0
  175. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_b/run_external.py +0 -0
  176. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_a/external.ros2docker.json +0 -0
  177. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_a/external_session.yaml +0 -0
  178. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_a/run_communication.sh +0 -0
  179. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_a/run_external.py +0 -0
  180. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_b/external.ros2docker.json +0 -0
  181. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_b/external_session.yaml +0 -0
  182. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_b/run_communication.sh +0 -0
  183. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_b/run_external.py +0 -0
  184. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_a/external.ros2docker.json +0 -0
  185. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_a/external_session.yaml +0 -0
  186. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_a/run_communication.sh +0 -0
  187. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_a/run_external.py +0 -0
  188. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_b/external.ros2docker.json +0 -0
  189. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_b/external_session.yaml +0 -0
  190. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_b/run_communication.sh +0 -0
  191. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_b/run_external.py +0 -0
  192. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/sessions/10_restamp/session-definition.yaml +0 -0
  193. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/sessions/11_trickle/session-definition.yaml +0 -0
  194. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/sessions/12_content_integrity/session-definition.yaml +0 -0
  195. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/sessions/13_link_latency/session-definition.yaml +0 -0
  196. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/sessions/14_remote_assist_anonymized/session-definition.yaml +0 -0
  197. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/sessions/15_remote_assist_anonymized_costmap/session-definition.yaml +0 -0
  198. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/sessions/16_remote_assist_anonymized_camera/session-definition.yaml +0 -0
  199. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/sessions/17_synthetic_camera_quality/session-definition.yaml +0 -0
  200. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/sessions/1_heartbeat/session-definition.yaml +0 -0
  201. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/sessions/1_heartbeat_status/session-definition.yaml +0 -0
  202. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/sessions/2_native_chatter/session-definition.yaml +0 -0
  203. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/sessions/3_comp_occ_grid/session-definition.yaml +0 -0
  204. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/sessions/4_comp_occ_grid_zen/session-definition.yaml +0 -0
  205. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/sessions/5_sized_payload/session-definition.yaml +0 -0
  206. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/sessions/6_sized_payload_zen/session-definition.yaml +0 -0
  207. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/sessions/7_latched_static/session-definition.yaml +0 -0
  208. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/sessions/8_drop/session-definition.yaml +0 -0
  209. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/sessions/9_throttle/session-definition.yaml +0 -0
  210. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/sessions/bench_1_1_capacity/session-definition.yaml +0 -0
  211. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/sessions/bench_1_2_load_sweep/session-definition.yaml +0 -0
  212. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/sessions/bench_1_3_ramp/session-definition.yaml +0 -0
  213. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/sessions/bench_1_4_recovery/session-definition.yaml +0 -0
  214. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/examples/sessions/bench_1_5_camera/session-definition.yaml +0 -0
  215. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ros2docker.json.example +0 -0
  216. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ros2docker.lyrical.json.example +0 -0
  217. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/.vscode/c_cpp_properties.json +0 -0
  218. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/.vscode/settings.json +0 -0
  219. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_easy_mode.xml.template +0 -0
  220. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_initial_peer_list.xml.template +0 -0
  221. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_v2.xml.template +0 -0
  222. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_v3.xml.template +0 -0
  223. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_v4.xml.template +0 -0
  224. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_v5.xml.template +0 -0
  225. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ota_configs/create_zenoh_json5.py +0 -0
  226. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ota_configs/cyclonedds_local_participants.xml.template +0 -0
  227. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ota_configs/cyclonedds_minimal.xml.template +0 -0
  228. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ota_configs/cyclonedds_scoped.xml.template +0 -0
  229. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ota_configs/cyclonedds_tuned.xml.template +0 -0
  230. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ota_configs/fastdds_easy_mode.xml.template +0 -0
  231. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ota_configs/fastdds_local.xml.template +0 -0
  232. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ota_configs/fastdds_tuned.xml.template +0 -0
  233. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ota_configs/fastdds_unicast.xml.template +0 -0
  234. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ota_configs/get_ota_xml.py +0 -0
  235. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ota_configs/utils.py +0 -0
  236. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ota_configs/zenoh.json5.template +0 -0
  237. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/.gitkeep +0 -0
  238. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_cpp/CMakeLists.txt +0 -0
  239. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_cpp/COLCON_IGNORE +0 -0
  240. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_cpp/LICENSE.txt +0 -0
  241. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_cpp/package.xml +0 -0
  242. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_cpp/src/hz_monitor.cpp +0 -0
  243. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_cpp/src/universal_compressor.cpp +0 -0
  244. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_cpp/src/universal_decompressor.cpp +0 -0
  245. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_msgs/CMakeLists.txt +0 -0
  246. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_msgs/LICENSE.txt +0 -0
  247. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_msgs/msg/CompressedData.msg +0 -0
  248. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_msgs/msg/EchoHeartbeat.msg +0 -0
  249. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_msgs/msg/OtaStamped.msg +0 -0
  250. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_msgs/msg/SizedPayload.msg +0 -0
  251. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_msgs/package.xml +0 -0
  252. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/LICENSE.txt +0 -0
  253. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/com_py/__init__.py +0 -0
  254. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/com_py/base_bridge_relay.py +0 -0
  255. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/com_py/bridge_in.py +0 -0
  256. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/com_py/bridge_out.py +0 -0
  257. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/com_py/ffmpeg_flags.py +0 -0
  258. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/com_py/heartbeat_echo.py +0 -0
  259. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/com_py/hz_monitor.py +0 -0
  260. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/com_py/image_bandwidth_reducer.py +0 -0
  261. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/com_py/image_pixel_capper.py +0 -0
  262. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/com_py/lanelet_saver.py +0 -0
  263. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/com_py/latch_relay.py +0 -0
  264. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/costmap_remapper.py +0 -0
  265. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/marker_remapper.py +0 -0
  266. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/speed_test.py +0 -0
  267. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/tf_remapper.py +0 -0
  268. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/traffic_monitor.py +0 -0
  269. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/wifi_network_analysis_1.py +0 -0
  270. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/com_py/link_bytes.py +0 -0
  271. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/com_py/link_trace.py +0 -0
  272. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/com_py/local_global_frame_bridge.py +0 -0
  273. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/com_py/localization_map_split_reduce_saver.py +0 -0
  274. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/com_py/msg_transform.py +0 -0
  275. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/com_py/ota_pcap.py +0 -0
  276. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/com_py/pair_management.py +0 -0
  277. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/com_py/playout_pacer.py +0 -0
  278. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/com_py/playout_pacer_core.py +0 -0
  279. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/com_py/pub_sub_pair.py +0 -0
  280. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/com_py/qos.py +0 -0
  281. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/com_py/relay_in.py +0 -0
  282. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/com_py/relay_out.py +0 -0
  283. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/com_py/restamp.py +0 -0
  284. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/com_py/sized_publisher.py +0 -0
  285. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/com_py/stage_latency.py +0 -0
  286. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/com_py/stage_latency_core.py +0 -0
  287. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/com_py/status_overview.py +0 -0
  288. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/com_py/status_overview_core.py +0 -0
  289. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/com_py/tf_map_to_cart_saver.py +0 -0
  290. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/com_py/topic_monitor.py +0 -0
  291. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/com_py/topic_resolution.py +0 -0
  292. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/com_py/trickle.py +0 -0
  293. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/com_py/universal_compressor.py +0 -0
  294. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/com_py/universal_decompressor.py +0 -0
  295. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/com_py/universal_ota_unwrapper.py +0 -0
  296. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/com_py/universal_ota_wrapper.py +0 -0
  297. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/package.xml +0 -0
  298. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/resource/com_py +0 -0
  299. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/setup.cfg +0 -0
  300. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/setup.py +0 -0
  301. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/test/test_copyright.py +0 -0
  302. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/test/test_flake8.py +0 -0
  303. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/ros2src/com_py/test/test_pep257.py +0 -0
  304. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/session/content/base/session_plugin_base.yaml +0 -0
  305. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/session/content/network/up_connectivity.py +0 -0
  306. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/session/content/network/wifi_network_analysis_2.py +0 -0
  307. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/session/creation/anonymize_bag.py +0 -0
  308. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/session/creation/catmux_log_setup.sh +0 -0
  309. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/session/creation/create_session_yaml.py +0 -0
  310. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/session/creation/generate_session_files.py +0 -0
  311. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/session/creation/run_session.py +0 -0
  312. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/session/creation/run_session_in_external_terminal.py +0 -0
  313. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/resources/ws/session/creation/strip_ansi.py +0 -0
  314. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/status_eval.py +0 -0
  315. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/stream_stats.py +0 -0
  316. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/trace_profiles.py +0 -0
  317. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/transit.py +0 -0
  318. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom/video_quality.py +0 -0
  319. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom_dev.egg-info/SOURCES.txt +0 -0
  320. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom_dev.egg-info/dependency_links.txt +0 -0
  321. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom_dev.egg-info/entry_points.txt +0 -0
  322. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom_dev.egg-info/requires.txt +0 -0
  323. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom_dev.egg-info/scm_file_list.json +0 -0
  324. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/src/rosotacom_dev.egg-info/top_level.txt +0 -0
  325. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/terminology.md +0 -0
  326. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/tests/contract/test_benched_set_registry.py +0 -0
  327. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/tests/contract/test_findings.py +0 -0
  328. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/tests/contract/test_generated_topics_have_a_producer.py +0 -0
  329. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/tests/contract/test_lyrical_runtime_compat.py +0 -0
  330. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/tests/contract/test_markdown_links.py +0 -0
  331. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/tests/contract/test_ota_source_bundle.py +0 -0
  332. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/tests/contract/test_package_metadata.py +0 -0
  333. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/tests/contract/test_packaged_resources.py +0 -0
  334. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/tests/contract/test_profile_covers_generated_commands.py +0 -0
  335. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/tests/contract/test_pytest_policy.py +0 -0
  336. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/tests/contract/test_readme_examples.py +0 -0
  337. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/tests/contract/test_security_maintenance_config.py +0 -0
  338. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/tests/contract/test_session_configuration_doc.py +0 -0
  339. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/tests/contract/test_session_template_substitution.py +0 -0
  340. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/tests/contract/test_workflow_contracts.py +0 -0
  341. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/tests/e2e/conftest.py +0 -0
  342. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/tests/e2e/test_anonymize_e2e.py +0 -0
  343. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/tests/e2e/test_benchmark_ab.py +0 -0
  344. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/tests/e2e/test_benchmark_capacity.py +0 -0
  345. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/tests/e2e/test_benchmark_replay.py +0 -0
  346. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/tests/e2e/test_parallel_smoke.py +0 -0
  347. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/tests/e2e/test_smoke.py +0 -0
  348. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/tests/e2e/test_timeline_stepping.py +0 -0
  349. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/tests/e2e/test_video_quality_e2e.py +0 -0
  350. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/tests/sessions/generate_rmw_matrix.py +0 -0
  351. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/tests/sessions/rmw_matrix/1_heartbeat_cyclone-local_zenoh-ros2dds-ota/session-definition.yaml +0 -0
  352. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/tests/sessions/rmw_matrix/1_heartbeat_cyclone-ota/session-definition.yaml +0 -0
  353. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/tests/sessions/rmw_matrix/1_heartbeat_cyclone-ota-tuned/session-definition.yaml +0 -0
  354. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/tests/sessions/rmw_matrix/1_heartbeat_fastdds/session-definition.yaml +0 -0
  355. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/tests/sessions/rmw_matrix/1_heartbeat_fastdds-default/session-definition.yaml +0 -0
  356. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/tests/sessions/rmw_matrix/1_heartbeat_zen-endpoints/session-definition.yaml +0 -0
  357. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/tests/unit/test_anonymize.py +0 -0
  358. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/tests/unit/test_bag_ground_truth.py +0 -0
  359. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/tests/unit/test_benched_set.py +0 -0
  360. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/tests/unit/test_benchmark.py +0 -0
  361. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/tests/unit/test_benchmark_delta.py +0 -0
  362. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/tests/unit/test_bundle_check.py +0 -0
  363. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/tests/unit/test_catmux_pane_logging.py +0 -0
  364. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/tests/unit/test_cli_benchmark.py +0 -0
  365. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/tests/unit/test_concurrency.py +0 -0
  366. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/tests/unit/test_container_shaping.py +0 -0
  367. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/tests/unit/test_deployment.py +0 -0
  368. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/tests/unit/test_ffmpeg_flags.py +0 -0
  369. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/tests/unit/test_ffmpeg_packet.py +0 -0
  370. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/tests/unit/test_field_profiles.py +0 -0
  371. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/tests/unit/test_forensics.py +0 -0
  372. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/tests/unit/test_geomap.py +0 -0
  373. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/tests/unit/test_image_cache.py +0 -0
  374. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/tests/unit/test_link_bytes.py +0 -0
  375. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/tests/unit/test_link_trace.py +0 -0
  376. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/tests/unit/test_netem_dist.py +0 -0
  377. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/tests/unit/test_network_preflight.py +0 -0
  378. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/tests/unit/test_network_profiles.py +0 -0
  379. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/tests/unit/test_network_shaper.py +0 -0
  380. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/tests/unit/test_ota_link_configs.py +0 -0
  381. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/tests/unit/test_ota_pcap.py +0 -0
  382. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/tests/unit/test_ota_unwrapper.py +0 -0
  383. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/tests/unit/test_ota_wrapper.py +0 -0
  384. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/tests/unit/test_ota_xml.py +0 -0
  385. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/tests/unit/test_playout_pacer.py +0 -0
  386. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/tests/unit/test_plots.py +0 -0
  387. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/tests/unit/test_pub_sub_pair_types.py +0 -0
  388. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/tests/unit/test_qos_fallback_logging.py +0 -0
  389. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/tests/unit/test_relay_optional_parameters.py +0 -0
  390. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/tests/unit/test_ros_node_entity_ownership.py +0 -0
  391. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/tests/unit/test_session_pipeline.py +0 -0
  392. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/tests/unit/test_stage_latency.py +0 -0
  393. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/tests/unit/test_status_eval.py +0 -0
  394. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/tests/unit/test_status_overview.py +0 -0
  395. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/tests/unit/test_status_overview_observer.py +0 -0
  396. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/tests/unit/test_stream_stats.py +0 -0
  397. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/tests/unit/test_terminology_stage_ownership.py +0 -0
  398. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/tests/unit/test_trace_profiles.py +0 -0
  399. {rosotacom_dev-2.5.dev81 → rosotacom_dev-2.5.dev83}/tests/unit/test_transit.py +0 -0
  400. {rosotacom_dev-2.5.dev81 → 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.dev81
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])])
@@ -3562,6 +3582,35 @@ def _ota_remote_package_dir(peer: OtaSmokePeer, plan: OtaSmokePlan, *, dry_run:
3562
3582
  return located
3563
3583
 
3564
3584
 
3585
+ def _ota_missing_project_message(plan: OtaSmokePlan, peer: OtaSmokePeer) -> str:
3586
+ """Why one peer has no project file, in the terms that make it fixable.
3587
+
3588
+ `test -f` failing is the single most common way a checkout-mode run stops,
3589
+ and the bare "exit code 1" it used to raise says nothing about the contract
3590
+ it broke. The path is not resolved per peer: `--project` is split once, on
3591
+ the orchestrator, into (checkout root, path inside it), and that *relative*
3592
+ path is then asserted inside every peer's own `--peer-checkout`. So the
3593
+ peers do not merely need a rosotacom project each — they need the same
3594
+ repository, with the project at the same place in it.
3595
+
3596
+ The failure therefore has two ordinary causes and they want opposite fixes:
3597
+ the peer is behind (sync it), or the project lives in a repository this peer
3598
+ does not have (move the project, or point the peer at the repository that
3599
+ holds it). Naming both is the difference between a minute and an afternoon.
3600
+ """
3601
+ workdir = _ota_peer_workdir(plan, peer)
3602
+ return (
3603
+ f"{peer.name}: {workdir}/{plan.project} does not exist.\n"
3604
+ f" --install-mode checkout resolves the project once, on this machine, into a checkout root and "
3605
+ f"the path {plan.project!r} inside it, and then asserts that same relative path inside every peer's "
3606
+ f"--peer-checkout. Every peer therefore needs the same repository, with the project at the same "
3607
+ f"place in it -- not a project of its own.\n"
3608
+ f" If {peer.name} has that repository, it is behind: sync it and run again.\n"
3609
+ f" If it does not, the project is in the wrong repository for this run. Move it into the one the "
3610
+ f"peers actually have, or give this peer --peer-checkout for a checkout that holds it."
3611
+ )
3612
+
3613
+
3565
3614
  def _ota_verify_checkouts(plan: OtaSmokePlan, *, dry_run: bool) -> None:
3566
3615
  """Checkout mode's replacement for staging: assert, do not install.
3567
3616
 
@@ -3583,13 +3632,16 @@ def _ota_verify_checkouts(plan: OtaSmokePlan, *, dry_run: bool) -> None:
3583
3632
  dry_run=dry_run,
3584
3633
  batch=True,
3585
3634
  )
3586
- _ota_run(
3635
+ found = _ota_run(
3587
3636
  peer,
3588
3637
  f"test -f {checkout}/{project}",
3589
3638
  label=f"{peer.name}: project config {plan.project} inside the checkout",
3590
3639
  dry_run=dry_run,
3640
+ check=False,
3591
3641
  batch=True,
3592
3642
  )
3643
+ if found.returncode != 0:
3644
+ raise RuntimeError(_ota_missing_project_message(plan, peer))
3593
3645
  _ota_run(
3594
3646
  peer,
3595
3647
  f"{OTA_CHECKOUT_PATH_PREFIX}command -v rosotacom >/dev/null 2>&1",
@@ -7548,6 +7600,33 @@ def _smoke_publish_specs(cfg: dict[str, Any], source_peer_key: str | None = None
7548
7600
  return specs
7549
7601
 
7550
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
+
7551
7630
  def _start_smoke_topic_publishers(
7552
7631
  containers: dict[str, str],
7553
7632
  ros_setups: dict[str, str],
@@ -7574,8 +7653,9 @@ def _start_smoke_topic_publishers(
7574
7653
  f"Starting smoke publisher {spec.source_peer_key}->{spec.receiver_peer_key} "
7575
7654
  f"{spec.publish_topic} ({spec.publish_type}) in {container}{offered}"
7576
7655
  )
7656
+ log_path = _smoke_publisher_log_path(spec.publish_topic)
7577
7657
  subprocess.run(
7578
- ["docker", "exec", "-d", container, "bash", "-c", cmd],
7658
+ ["docker", "exec", "-d", container, "bash", "-c", f"{{ {cmd} ; }} > {shlex.quote(log_path)} 2>&1"],
7579
7659
  capture_output=True,
7580
7660
  text=True,
7581
7661
  check=False,
@@ -7594,6 +7674,7 @@ def _start_smoke_topic_publishers(
7594
7674
  raise RuntimeError(
7595
7675
  f"Smoke publisher {spec.source_peer_key}->{spec.receiver_peer_key} "
7596
7676
  f"{spec.publish_topic} ({spec.publish_type}) did not advertise in {container}."
7677
+ + _smoke_publisher_failure_detail(container, log_path)
7597
7678
  )
7598
7679
  return started
7599
7680
 
@@ -7949,7 +8030,21 @@ def _publish_load_override(args: argparse.Namespace) -> dict[str, Any] | None:
7949
8030
  load["size"] = int(args.load_size)
7950
8031
  load["size_a"] = int(args.load_size)
7951
8032
  if getattr(args, "load_size_pattern", None):
7952
- 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
7953
8048
  if getattr(args, "load_rate_hz", None) is not None:
7954
8049
  load["rate"] = float(args.load_rate_hz)
7955
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.dev81
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": 81,
4
- "node": "g1d38e8a9bd4fb5e3c9a20c0a1603c365996cc296",
3
+ "distance": 83,
4
+ "node": "g5a3561c197b13a9e9d2b6076cde0bc94bfa9afa4",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-09-01"
@@ -3506,6 +3506,32 @@ def test_ota_checkout_mode_runs_each_peer_from_its_own_checkout(tmp_path: Path)
3506
3506
  assert "--rosotacom-config session/rosotacom.yaml" in command
3507
3507
 
3508
3508
 
3509
+ def test_ota_checkout_mode_names_the_shared_repository_when_a_peer_lacks_the_project(
3510
+ tmp_path: Path, monkeypatch: pytest.MonkeyPatch
3511
+ ) -> None:
3512
+ # The path is split once here and asserted on every peer, so a peer whose
3513
+ # checkout is a *different* repository fails this probe -- and used to fail
3514
+ # it as a bare "exit code 1", which reads as a broken machine rather than as
3515
+ # the contract it is. Two runs were spent on that in one afternoon: a bench
3516
+ # driven from the harness checkout, with a peer that only has the fleet
3517
+ # repository, cannot resolve one relative path on both sides.
3518
+ plan = _ota_checkout_plan(_write_checkout_project(tmp_path))
3519
+
3520
+ def fake_run(peer, script, *, label, **kwargs):
3521
+ code = 1 if script.startswith("test -f") and peer.name == "b" else 0
3522
+ return subprocess.CompletedProcess([], code, "", "")
3523
+
3524
+ monkeypatch.setattr(rosotacom, "_ota_run", fake_run)
3525
+
3526
+ with pytest.raises(RuntimeError) as error:
3527
+ rosotacom._ota_verify_checkouts(plan, dry_run=False)
3528
+
3529
+ message = str(error.value)
3530
+ assert "/home/other/fleet_mgmt/session/rosotacom.yaml does not exist" in message
3531
+ assert "the same repository" in message
3532
+ assert "it is behind: sync it" in message
3533
+
3534
+
3509
3535
  def test_ota_checkout_mode_puts_pipx_on_path_because_ssh_is_not_a_login_shell(tmp_path: Path) -> None:
3510
3536
  # `ssh host 'cmd'` skips the login profile, so a pipx install in
3511
3537
  # ~/.local/bin is invisible and the peer answers "command not found" —
@@ -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():