rosotacom-dev 2.5.dev73__tar.gz → 2.5.dev75__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 (396) hide show
  1. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/PKG-INFO +1 -1
  2. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/budgets.jsonl +1 -1
  3. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/docs/findings/README.md +1 -0
  4. rosotacom_dev-2.5.dev75/docs/findings/a-fitted-delay-table-never-reached-the-shaper.md +121 -0
  5. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/cli_benchmark.py +29 -11
  6. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/network_profiles.py +38 -1
  7. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom_dev.egg-info/PKG-INFO +1 -1
  8. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom_dev.egg-info/SOURCES.txt +1 -0
  9. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom_dev.egg-info/scm_file_list.json +1 -0
  10. rosotacom_dev-2.5.dev75/src/rosotacom_dev.egg-info/scm_version.json +8 -0
  11. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/tests/unit/test_network_profiles.py +43 -0
  12. rosotacom_dev-2.5.dev73/src/rosotacom_dev.egg-info/scm_version.json +0 -8
  13. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/.devcontainer/devcontainer.json.template +0 -0
  14. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/.devcontainer/re_generate_devcontainer_json.py +0 -0
  15. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/.github/CODEOWNERS +0 -0
  16. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/.github/ISSUE_TEMPLATE/documentation-audit.md +0 -0
  17. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/.github/ISSUE_TEMPLATE/implementation-cleanup.md +0 -0
  18. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/.github/ISSUE_TEMPLATE/quality-workflow.md +0 -0
  19. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/.github/ISSUE_TEMPLATE/redesign.md +0 -0
  20. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/.github/ISSUE_TEMPLATE/release-process.md +0 -0
  21. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/.github/ISSUE_TEMPLATE/repository-diagnosis.md +0 -0
  22. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/.github/ISSUE_TEMPLATE/test-ci-audit.md +0 -0
  23. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/.github/ISSUE_TEMPLATE/work-item.md +0 -0
  24. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  25. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/.github/actions/setup-just/action.yml +0 -0
  26. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/.github/dependabot.yml +0 -0
  27. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/.github/workflows/benchmark-calibrate.yml +0 -0
  28. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/.github/workflows/benchmark-gate.yml +0 -0
  29. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/.github/workflows/dev-release.yml +0 -0
  30. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/.github/workflows/image-scan.yml +0 -0
  31. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/.github/workflows/nightly-e2e.yml +0 -0
  32. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/.github/workflows/pr-lightweight.yml +0 -0
  33. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/.github/workflows/pr-merge-gate.yml +0 -0
  34. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/.github/workflows/release.yml +0 -0
  35. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/.pre-commit-config.yaml +0 -0
  36. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/AGENTS.md +0 -0
  37. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/CONCURRENCY.md +0 -0
  38. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/CONTRIBUTING.md +0 -0
  39. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/DEVELOPMENT_PRINCIPLES.md +0 -0
  40. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/LICENSE.txt +0 -0
  41. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/MANIFEST.in +0 -0
  42. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/README.md +0 -0
  43. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/calibration/README.md +0 -0
  44. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/calibration/capacity-size-tight-cyclone.json +0 -0
  45. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/calibration/probe-loss-gop-tight-cyclone.json +0 -0
  46. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/calibration/probe-loss-nominal-cyclone.json +0 -0
  47. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/calibration/probe-loss-tight-cyclone.json +0 -0
  48. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/calibration/probe-loss-tight-fastdds.json +0 -0
  49. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/calibration/probe-loss-tight-zenoh.json +0 -0
  50. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/codecov.yml +0 -0
  51. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/deployment-configuration.md +0 -0
  52. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/docs/benchmark-ab.md +0 -0
  53. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/docs/benchmark-bag-as-load.md +0 -0
  54. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/docs/ci.md +0 -0
  55. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/docs/ffmpeg-keyframes.md +0 -0
  56. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/docs/findings/a-transport-element-doubles-every-fastdds-sample.md +0 -0
  57. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/docs/findings/cyclone-fragment-equal-to-max-drops-fragmented-samples.md +0 -0
  58. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/docs/findings/cyclone-spdp-discovery-bursts.md +0 -0
  59. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/docs/findings/delay-alone-no-loss.md +0 -0
  60. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/docs/findings/fastdds-datagram-cap-drops-large-samples.md +0 -0
  61. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/docs/findings/graph-derived-types-block-a-non-graph-transport.md +0 -0
  62. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/docs/findings/head-of-line-irregularity.md +0 -0
  63. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/docs/findings/jitter-loss-bandwidth-latency.md +0 -0
  64. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/docs/findings/keyframe-loss-kills-the-next-deltas.md +0 -0
  65. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/docs/findings/lifespan-is-enforced-by-one-reader-and-not-the-other.md +0 -0
  66. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/docs/findings/lighter-message-loss.md +0 -0
  67. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/docs/findings/one-domain-two-cyclone-configs-stop-interoperating.md +0 -0
  68. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/docs/findings/oversubscription-queues-not-losses.md +0 -0
  69. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/docs/findings/reorder-becomes-reader-loss.md +0 -0
  70. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/docs/findings/repro/decode_chain_repro.py +0 -0
  71. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/docs/findings/repro/reorder_drop_repro.py +0 -0
  72. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/docs/findings/sender-rows-make-a-dead-link-look-loss-free.md +0 -0
  73. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/docs/findings/zero-loss-boundaries-18kb-20hz.md +0 -0
  74. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/docs/forensics-report.md +0 -0
  75. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/docs/geo-link-map.md +0 -0
  76. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/docs/github-repository-settings.md +0 -0
  77. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/docs/link-bandwidth.md +0 -0
  78. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/docs/link-trace.md +0 -0
  79. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/docs/ota-pcap.md +0 -0
  80. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/docs/owner-runbook.md +0 -0
  81. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/docs/performance-bands.md +0 -0
  82. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/docs/playbooks/README.md +0 -0
  83. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/docs/quality-model.md +0 -0
  84. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/docs/release-notes/TEMPLATE.md +0 -0
  85. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/docs/release-notes/v2.1.md +0 -0
  86. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/docs/release-notes/v2.2.md +0 -0
  87. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/docs/release-notes/v2.3.md +0 -0
  88. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/docs/release-notes/v2.4.md +0 -0
  89. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/docs/release.md +0 -0
  90. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/docs/rfcs/0001-expectation-driven-test-suite.md +0 -0
  91. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/docs/rfcs/0002-expectation-concepts.md +0 -0
  92. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/docs/rfcs/0003-metric-backbone.md +0 -0
  93. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/docs/rfcs/0004-network-profiles.md +0 -0
  94. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/docs/rfcs/0005-benchmark-genres-and-ci.md +0 -0
  95. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/docs/rfcs/0006-dynamic-qos.md +0 -0
  96. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/docs/rfcs/0007-regression-gate.md +0 -0
  97. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/docs/rfcs/README.md +0 -0
  98. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/docs/testing.md +0 -0
  99. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/docs/work-items.md +0 -0
  100. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/install.sh +0 -0
  101. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/justfile +0 -0
  102. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/media/control_center.png +0 -0
  103. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/media/echo_test.png +0 -0
  104. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/media/forensics-report-example.png +0 -0
  105. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/media/host.png +0 -0
  106. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/media/vehicle.png +0 -0
  107. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/pyproject.toml +0 -0
  108. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/requirements.txt +0 -0
  109. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/rosotacom.yaml +0 -0
  110. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/session-configuration.md +0 -0
  111. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/setup.cfg +0 -0
  112. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/__init__.py +0 -0
  113. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/__main__.py +0 -0
  114. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/anonymize.py +0 -0
  115. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/bag_ground_truth.py +0 -0
  116. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/benched_set.py +0 -0
  117. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/benchmark.py +0 -0
  118. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/benchmark_delta.py +0 -0
  119. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/bundle_check.py +0 -0
  120. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/cli.py +0 -0
  121. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/deployment.py +0 -0
  122. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/ffmpeg_packet.py +0 -0
  123. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/forensics.py +0 -0
  124. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/geomap.py +0 -0
  125. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/image_cache.py +0 -0
  126. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/netem_dist.py +0 -0
  127. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/network_preflight.py +0 -0
  128. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/network_shaper.py +0 -0
  129. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/plots.py +0 -0
  130. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/py.typed +0 -0
  131. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/benched-set.yaml +0 -0
  132. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/examples/.gitignore +0 -0
  133. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/examples/README.md +0 -0
  134. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/examples/__init__.py +0 -0
  135. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/examples/bags/8_drop_reference/metadata.yaml +0 -0
  136. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/examples/deployment.example.yaml +0 -0
  137. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/examples/dist/field-20260817.dist +0 -0
  138. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/examples/profiles.yaml +0 -0
  139. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/examples/ros2docker.json +0 -0
  140. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/examples/ros2docker.lyrical.json +0 -0
  141. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/examples/rosotacom.yaml +0 -0
  142. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/examples/scenarios/2_native_chatter/scenario-definition.yaml +0 -0
  143. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/examples/scripts/1_heartbeat/run_machine_a.sh +0 -0
  144. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/examples/scripts/1_heartbeat/run_machine_b.sh +0 -0
  145. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_a/external.lyrical.ros2docker.json +0 -0
  146. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_a/external.ros2docker.json +0 -0
  147. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_a/run_communication.sh +0 -0
  148. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_a/run_external.py +0 -0
  149. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_a/wait_for_echo_topic.sh +0 -0
  150. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_b/external.lyrical.ros2docker.json +0 -0
  151. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_b/external.ros2docker.json +0 -0
  152. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_b/run_communication.sh +0 -0
  153. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_b/run_external.py +0 -0
  154. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_a/external.ros2docker.json +0 -0
  155. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_a/external_session.yaml +0 -0
  156. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_a/foxglove.json +0 -0
  157. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_a/run_communication.sh +0 -0
  158. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_a/run_external.py +0 -0
  159. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_b/costmap_1second/costmap_1second_0.mcap +0 -0
  160. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_b/costmap_1second/metadata.yaml +0 -0
  161. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_b/external.ros2docker.json +0 -0
  162. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_b/run_communication.sh +0 -0
  163. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_b/run_external.py +0 -0
  164. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_a/external.ros2docker.json +0 -0
  165. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_a/external_session.yaml +0 -0
  166. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_a/foxglove.json +0 -0
  167. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_a/run_communication.sh +0 -0
  168. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_a/run_external.py +0 -0
  169. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_b/costmap_1second/costmap_1second_0.mcap +0 -0
  170. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_b/costmap_1second/metadata.yaml +0 -0
  171. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_b/external.ros2docker.json +0 -0
  172. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_b/run_communication.sh +0 -0
  173. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_b/run_external.py +0 -0
  174. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_a/external.ros2docker.json +0 -0
  175. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_a/external_session.yaml +0 -0
  176. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_a/run_communication.sh +0 -0
  177. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_a/run_external.py +0 -0
  178. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_b/external.ros2docker.json +0 -0
  179. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_b/external_session.yaml +0 -0
  180. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_b/run_communication.sh +0 -0
  181. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_b/run_external.py +0 -0
  182. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_a/external.ros2docker.json +0 -0
  183. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_a/external_session.yaml +0 -0
  184. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_a/run_communication.sh +0 -0
  185. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_a/run_external.py +0 -0
  186. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_b/external.ros2docker.json +0 -0
  187. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_b/external_session.yaml +0 -0
  188. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_b/run_communication.sh +0 -0
  189. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_b/run_external.py +0 -0
  190. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/examples/sessions/10_restamp/session-definition.yaml +0 -0
  191. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/examples/sessions/11_trickle/session-definition.yaml +0 -0
  192. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/examples/sessions/12_content_integrity/session-definition.yaml +0 -0
  193. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/examples/sessions/13_link_latency/session-definition.yaml +0 -0
  194. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/examples/sessions/14_remote_assist_anonymized/session-definition.yaml +0 -0
  195. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/examples/sessions/15_remote_assist_anonymized_costmap/session-definition.yaml +0 -0
  196. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/examples/sessions/16_remote_assist_anonymized_camera/session-definition.yaml +0 -0
  197. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/examples/sessions/17_synthetic_camera_quality/session-definition.yaml +0 -0
  198. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/examples/sessions/1_heartbeat/session-definition.yaml +0 -0
  199. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/examples/sessions/1_heartbeat_status/session-definition.yaml +0 -0
  200. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/examples/sessions/2_native_chatter/session-definition.yaml +0 -0
  201. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/examples/sessions/3_comp_occ_grid/session-definition.yaml +0 -0
  202. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/examples/sessions/4_comp_occ_grid_zen/session-definition.yaml +0 -0
  203. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/examples/sessions/5_sized_payload/session-definition.yaml +0 -0
  204. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/examples/sessions/6_sized_payload_zen/session-definition.yaml +0 -0
  205. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/examples/sessions/7_latched_static/session-definition.yaml +0 -0
  206. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/examples/sessions/8_drop/session-definition.yaml +0 -0
  207. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/examples/sessions/9_throttle/session-definition.yaml +0 -0
  208. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/examples/sessions/bench_1_1_capacity/session-definition.yaml +0 -0
  209. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/examples/sessions/bench_1_2_load_sweep/session-definition.yaml +0 -0
  210. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/examples/sessions/bench_1_3_ramp/session-definition.yaml +0 -0
  211. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/examples/sessions/bench_1_4_recovery/session-definition.yaml +0 -0
  212. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/examples/sessions/bench_1_5_camera/session-definition.yaml +0 -0
  213. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ros2docker.json.example +0 -0
  214. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ros2docker.lyrical.json.example +0 -0
  215. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/.vscode/c_cpp_properties.json +0 -0
  216. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/.vscode/settings.json +0 -0
  217. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_easy_mode.xml.template +0 -0
  218. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_initial_peer_list.xml.template +0 -0
  219. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_v2.xml.template +0 -0
  220. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_v3.xml.template +0 -0
  221. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_v4.xml.template +0 -0
  222. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_v5.xml.template +0 -0
  223. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/ota_configs/create_zenoh_json5.py +0 -0
  224. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/ota_configs/cyclonedds_local_participants.xml.template +0 -0
  225. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/ota_configs/cyclonedds_minimal.xml.template +0 -0
  226. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/ota_configs/cyclonedds_scoped.xml.template +0 -0
  227. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/ota_configs/cyclonedds_tuned.xml.template +0 -0
  228. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/ota_configs/fastdds_easy_mode.xml.template +0 -0
  229. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/ota_configs/fastdds_local.xml.template +0 -0
  230. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/ota_configs/fastdds_tuned.xml.template +0 -0
  231. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/ota_configs/fastdds_unicast.xml.template +0 -0
  232. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/ota_configs/get_ota_xml.py +0 -0
  233. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/ota_configs/utils.py +0 -0
  234. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/ota_configs/zenoh.json5.template +0 -0
  235. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/ros2src/.gitkeep +0 -0
  236. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/ros2src/com_cpp/CMakeLists.txt +0 -0
  237. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/ros2src/com_cpp/COLCON_IGNORE +0 -0
  238. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/ros2src/com_cpp/LICENSE.txt +0 -0
  239. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/ros2src/com_cpp/package.xml +0 -0
  240. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/ros2src/com_cpp/src/hz_monitor.cpp +0 -0
  241. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/ros2src/com_cpp/src/universal_compressor.cpp +0 -0
  242. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/ros2src/com_cpp/src/universal_decompressor.cpp +0 -0
  243. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/ros2src/com_msgs/CMakeLists.txt +0 -0
  244. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/ros2src/com_msgs/LICENSE.txt +0 -0
  245. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/ros2src/com_msgs/msg/CompressedData.msg +0 -0
  246. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/ros2src/com_msgs/msg/EchoHeartbeat.msg +0 -0
  247. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/ros2src/com_msgs/msg/OtaStamped.msg +0 -0
  248. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/ros2src/com_msgs/msg/SizedPayload.msg +0 -0
  249. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/ros2src/com_msgs/package.xml +0 -0
  250. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/ros2src/com_py/LICENSE.txt +0 -0
  251. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/ros2src/com_py/com_py/__init__.py +0 -0
  252. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/ros2src/com_py/com_py/base_bridge_relay.py +0 -0
  253. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/ros2src/com_py/com_py/bridge_in.py +0 -0
  254. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/ros2src/com_py/com_py/bridge_out.py +0 -0
  255. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/ros2src/com_py/com_py/ffmpeg_flags.py +0 -0
  256. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/ros2src/com_py/com_py/heartbeat_echo.py +0 -0
  257. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/ros2src/com_py/com_py/hz_monitor.py +0 -0
  258. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/ros2src/com_py/com_py/image_bandwidth_reducer.py +0 -0
  259. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/ros2src/com_py/com_py/image_pixel_capper.py +0 -0
  260. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/ros2src/com_py/com_py/lanelet_saver.py +0 -0
  261. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/ros2src/com_py/com_py/latch_relay.py +0 -0
  262. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/costmap_remapper.py +0 -0
  263. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/marker_remapper.py +0 -0
  264. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/speed_test.py +0 -0
  265. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/tf_remapper.py +0 -0
  266. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/traffic_monitor.py +0 -0
  267. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/wifi_network_analysis_1.py +0 -0
  268. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/ros2src/com_py/com_py/link_bytes.py +0 -0
  269. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/ros2src/com_py/com_py/link_trace.py +0 -0
  270. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/ros2src/com_py/com_py/local_global_frame_bridge.py +0 -0
  271. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/ros2src/com_py/com_py/localization_map_split_reduce_saver.py +0 -0
  272. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/ros2src/com_py/com_py/msg_transform.py +0 -0
  273. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/ros2src/com_py/com_py/ota_pcap.py +0 -0
  274. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/ros2src/com_py/com_py/pair_management.py +0 -0
  275. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/ros2src/com_py/com_py/playout_pacer.py +0 -0
  276. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/ros2src/com_py/com_py/playout_pacer_core.py +0 -0
  277. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/ros2src/com_py/com_py/pub_sub_pair.py +0 -0
  278. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/ros2src/com_py/com_py/qos.py +0 -0
  279. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/ros2src/com_py/com_py/relay_in.py +0 -0
  280. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/ros2src/com_py/com_py/relay_out.py +0 -0
  281. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/ros2src/com_py/com_py/restamp.py +0 -0
  282. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/ros2src/com_py/com_py/sized_publisher.py +0 -0
  283. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/ros2src/com_py/com_py/stage_latency.py +0 -0
  284. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/ros2src/com_py/com_py/stage_latency_core.py +0 -0
  285. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/ros2src/com_py/com_py/status_overview.py +0 -0
  286. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/ros2src/com_py/com_py/status_overview_core.py +0 -0
  287. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/ros2src/com_py/com_py/tf_map_to_cart_saver.py +0 -0
  288. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/ros2src/com_py/com_py/topic_monitor.py +0 -0
  289. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/ros2src/com_py/com_py/topic_resolution.py +0 -0
  290. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/ros2src/com_py/com_py/trickle.py +0 -0
  291. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/ros2src/com_py/com_py/universal_compressor.py +0 -0
  292. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/ros2src/com_py/com_py/universal_decompressor.py +0 -0
  293. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/ros2src/com_py/com_py/universal_ota_unwrapper.py +0 -0
  294. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/ros2src/com_py/com_py/universal_ota_wrapper.py +0 -0
  295. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/ros2src/com_py/package.xml +0 -0
  296. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/ros2src/com_py/resource/com_py +0 -0
  297. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/ros2src/com_py/setup.cfg +0 -0
  298. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/ros2src/com_py/setup.py +0 -0
  299. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/ros2src/com_py/test/test_copyright.py +0 -0
  300. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/ros2src/com_py/test/test_flake8.py +0 -0
  301. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/ros2src/com_py/test/test_pep257.py +0 -0
  302. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/session/content/base/session_plugin_base.yaml +0 -0
  303. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/session/content/network/up_connectivity.py +0 -0
  304. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/session/content/network/wifi_network_analysis_2.py +0 -0
  305. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/session/creation/anonymize_bag.py +0 -0
  306. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/session/creation/catmux_log_setup.sh +0 -0
  307. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/session/creation/create_session_yaml.py +0 -0
  308. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/session/creation/generate_session_files.py +0 -0
  309. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/session/creation/run_session.py +0 -0
  310. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/session/creation/run_session_in_external_terminal.py +0 -0
  311. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/resources/ws/session/creation/strip_ansi.py +0 -0
  312. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/status_eval.py +0 -0
  313. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/stream_stats.py +0 -0
  314. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/trace_profiles.py +0 -0
  315. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/transit.py +0 -0
  316. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom/video_quality.py +0 -0
  317. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom_dev.egg-info/dependency_links.txt +0 -0
  318. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom_dev.egg-info/entry_points.txt +0 -0
  319. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom_dev.egg-info/requires.txt +0 -0
  320. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/src/rosotacom_dev.egg-info/top_level.txt +0 -0
  321. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/terminology.md +0 -0
  322. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/tests/contract/test_benched_set_registry.py +0 -0
  323. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/tests/contract/test_findings.py +0 -0
  324. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/tests/contract/test_generated_topics_have_a_producer.py +0 -0
  325. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/tests/contract/test_lyrical_runtime_compat.py +0 -0
  326. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/tests/contract/test_markdown_links.py +0 -0
  327. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/tests/contract/test_ota_source_bundle.py +0 -0
  328. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/tests/contract/test_package_metadata.py +0 -0
  329. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/tests/contract/test_packaged_resources.py +0 -0
  330. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/tests/contract/test_profile_covers_generated_commands.py +0 -0
  331. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/tests/contract/test_pytest_policy.py +0 -0
  332. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/tests/contract/test_readme_examples.py +0 -0
  333. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/tests/contract/test_security_maintenance_config.py +0 -0
  334. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/tests/contract/test_session_configuration_doc.py +0 -0
  335. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/tests/contract/test_session_template_substitution.py +0 -0
  336. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/tests/contract/test_workflow_contracts.py +0 -0
  337. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/tests/e2e/conftest.py +0 -0
  338. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/tests/e2e/test_anonymize_e2e.py +0 -0
  339. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/tests/e2e/test_benchmark_ab.py +0 -0
  340. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/tests/e2e/test_benchmark_capacity.py +0 -0
  341. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/tests/e2e/test_benchmark_replay.py +0 -0
  342. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/tests/e2e/test_parallel_smoke.py +0 -0
  343. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/tests/e2e/test_smoke.py +0 -0
  344. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/tests/e2e/test_timeline_stepping.py +0 -0
  345. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/tests/e2e/test_video_quality_e2e.py +0 -0
  346. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/tests/sessions/generate_rmw_matrix.py +0 -0
  347. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/tests/sessions/rmw_matrix/1_heartbeat_cyclone-local_zenoh-ros2dds-ota/session-definition.yaml +0 -0
  348. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/tests/sessions/rmw_matrix/1_heartbeat_cyclone-ota/session-definition.yaml +0 -0
  349. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/tests/sessions/rmw_matrix/1_heartbeat_cyclone-ota-tuned/session-definition.yaml +0 -0
  350. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/tests/sessions/rmw_matrix/1_heartbeat_fastdds/session-definition.yaml +0 -0
  351. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/tests/sessions/rmw_matrix/1_heartbeat_fastdds-default/session-definition.yaml +0 -0
  352. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/tests/sessions/rmw_matrix/1_heartbeat_zen-endpoints/session-definition.yaml +0 -0
  353. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/tests/unit/test_anonymize.py +0 -0
  354. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/tests/unit/test_bag_ground_truth.py +0 -0
  355. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/tests/unit/test_benched_set.py +0 -0
  356. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/tests/unit/test_benchmark.py +0 -0
  357. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/tests/unit/test_benchmark_delta.py +0 -0
  358. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/tests/unit/test_bundle_check.py +0 -0
  359. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/tests/unit/test_catmux_pane_logging.py +0 -0
  360. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/tests/unit/test_cli.py +0 -0
  361. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/tests/unit/test_cli_benchmark.py +0 -0
  362. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/tests/unit/test_concurrency.py +0 -0
  363. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/tests/unit/test_container_shaping.py +0 -0
  364. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/tests/unit/test_deployment.py +0 -0
  365. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/tests/unit/test_ffmpeg_flags.py +0 -0
  366. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/tests/unit/test_ffmpeg_packet.py +0 -0
  367. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/tests/unit/test_field_profiles.py +0 -0
  368. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/tests/unit/test_forensics.py +0 -0
  369. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/tests/unit/test_geomap.py +0 -0
  370. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/tests/unit/test_image_cache.py +0 -0
  371. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/tests/unit/test_link_bytes.py +0 -0
  372. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/tests/unit/test_link_trace.py +0 -0
  373. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/tests/unit/test_netem_dist.py +0 -0
  374. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/tests/unit/test_network_preflight.py +0 -0
  375. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/tests/unit/test_network_shaper.py +0 -0
  376. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/tests/unit/test_ota_link_configs.py +0 -0
  377. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/tests/unit/test_ota_pcap.py +0 -0
  378. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/tests/unit/test_ota_unwrapper.py +0 -0
  379. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/tests/unit/test_ota_wrapper.py +0 -0
  380. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/tests/unit/test_ota_xml.py +0 -0
  381. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/tests/unit/test_playout_pacer.py +0 -0
  382. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/tests/unit/test_plots.py +0 -0
  383. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/tests/unit/test_pub_sub_pair_types.py +0 -0
  384. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/tests/unit/test_qos_fallback_logging.py +0 -0
  385. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/tests/unit/test_relay_optional_parameters.py +0 -0
  386. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/tests/unit/test_ros_node_entity_ownership.py +0 -0
  387. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/tests/unit/test_session_pipeline.py +0 -0
  388. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/tests/unit/test_stage_latency.py +0 -0
  389. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/tests/unit/test_status_eval.py +0 -0
  390. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/tests/unit/test_status_overview.py +0 -0
  391. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/tests/unit/test_status_overview_observer.py +0 -0
  392. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/tests/unit/test_stream_stats.py +0 -0
  393. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/tests/unit/test_terminology_stage_ownership.py +0 -0
  394. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/tests/unit/test_trace_profiles.py +0 -0
  395. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/tests/unit/test_transit.py +0 -0
  396. {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev75}/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.dev73
3
+ Version: 2.5.dev75
4
4
  Summary: Host CLI for ROS OTA communication sessions.
5
5
  Author: develNor
6
6
  License-Expression: BSD-3-Clause
@@ -3,5 +3,5 @@
3
3
  {"better": "lower", "hi": 0.5, "lo": -0.5, "metric": "loss_pct", "profile": "gate-tight", "provenance": {"fingerprint": "github-hosted-linux-x86_64", "floor": 0.5, "k": 3.0, "note": "runner-class calibration, K=5 independent GitHub-hosted runs", "ratcheted_at": "2026-07-08T15:14:07", "repeats": 5, "sigma": 0.04528516758606621, "source_sha": "8e1b41f", "window_s": 60.0}, "row": "probe-loss-gop-tight-cyclone", "schema": 2}
4
4
  {"better": "lower", "hi": 0.5, "lo": -0.5, "metric": "loss_pct", "profile": "gate-nominal", "provenance": {"fingerprint": "github-hosted-linux-x86_64", "floor": 0.5, "k": 3.0, "note": "runner-class calibration, K=5 independent GitHub-hosted runs", "ratcheted_at": "2026-07-08T15:14:07", "repeats": 5, "sigma": 0.0, "source_sha": "8e1b41f", "window_s": 60.0}, "row": "probe-loss-nominal-cyclone", "schema": 2}
5
5
  {"better": "lower", "hi": 90.16056918160436, "lo": 53.625281678816286, "metric": "loss_pct", "profile": "gate-tight", "provenance": {"fingerprint": "github-hosted-linux-x86_64", "floor": 1.4378585086042066, "k": 3.0, "note": "runner-class calibration, K=5 independent GitHub-hosted runs", "ratcheted_at": "2026-07-08T15:14:06", "repeats": 5, "sigma": 6.089214583798013, "source_sha": "8e1b41f", "window_s": 60.0}, "row": "probe-loss-tight-cyclone", "schema": 2}
6
- {"better": "lower", "hi": 67.97722870550751, "lo": 48.049548219083945, "metric": "loss_pct", "profile": "gate-tight", "provenance": {"fingerprint": "github-hosted-linux-x86_64", "floor": 1.1602677692459147, "k": 3.0, "note": "runner-class calibration, K=5 independent GitHub-hosted runs", "ratcheted_at": "2026-07-08T15:14:08", "repeats": 5, "sigma": 3.3212800810705954, "source_sha": "8e1b41f", "window_s": 60.0}, "row": "probe-loss-tight-fastdds", "schema": 2}
6
+ {"better": "lower", "hi": 47.94530896210297, "lo": 28.017628475679402, "metric": "loss_pct", "profile": "gate-tight", "provenance": {"fingerprint": "github-hosted-linux-x86_64", "floor": 1.1602677692459147, "k": 3.0, "note": "banked: #314 removed the Fast DDS profile's duplicate transmission, so this row now loses 37.98% where the band was calibrated at 58.0", "ratcheted_at": "2026-08-30T23:48:19", "repeats": 5, "sigma": 3.3212800810705954, "source_sha": "25251cb", "window_s": 60.0}, "row": "probe-loss-tight-fastdds", "schema": 2}
7
7
  {"better": "lower", "hi": 0.5, "lo": -0.5, "metric": "loss_pct", "profile": "gate-tight", "provenance": {"fingerprint": "github-hosted-linux-x86_64", "floor": 0.5, "k": 3.0, "note": "runner-class calibration, K=5 independent GitHub-hosted runs", "ratcheted_at": "2026-07-08T15:14:08", "repeats": 5, "sigma": 0.0, "source_sha": "8e1b41f", "window_s": 60.0}, "row": "probe-loss-tight-zenoh", "schema": 2}
@@ -28,6 +28,7 @@ living verification hook.
28
28
 
29
29
  ## Findings
30
30
 
31
+ - [A fitted delay table never reached the shaper](a-fitted-delay-table-never-reached-the-shaper.md) - every profile carrying a custom netem distribution failed at arming: the table was installed as `/usr/lib/tc/<name>.dist` while iproute2 on a multiarch image reads `/usr/lib/<triplet>/tc`, so the drive-fitted delay tail was never actually in use.
31
32
  - [Sender-side transit rows made a dead link report zero loss](sender-rows-make-a-dead-link-look-loss-free.md) - `delivered = rows - lost` counted the sender's own `sent` rows as deliveries, so a topic the receiver never saw summarised as `delivered == expected` at 0.0% loss, with the publisher's timer reported as arrival spacing.
32
33
  - [A bridge that learns types from the graph cannot use a transport that does not carry the graph](graph-derived-types-block-a-non-graph-transport.md) - over `zenoh_ros2dds` the payload topic never arrived in either run: the bridge routes a topic once a local reader exists and the reader waited for the bridge, leaving only `Pending=1` in a log.
33
34
  - [A Fast DDS datagram cap stops every message larger than it](fastdds-datagram-cap-drops-large-samples.md) - copying CycloneDDS's 1200 B fragment size into the Fast DDS OTA profile makes every sample above the cap never arrive, at 1200 B and at 8192 B, sync and async — while the 84 B heartbeat keeps flowing at 10 Hz.
@@ -0,0 +1,121 @@
1
+ # A Fitted Delay Table Never Reached The Shaper
2
+
3
+ ## Claim
4
+
5
+ Every profile carrying a custom netem delay distribution failed at arming time,
6
+ on every image this project ships, since the feature was added. The runner
7
+ installed the table as `/usr/lib/tc/<name>.dist`; iproute2 compiles its library
8
+ directory in, and on a multiarch Debian or Ubuntu build that directory is
9
+ `/usr/lib/<triplet>/tc`. `/usr/lib/tc` does not exist there at all, so the copy
10
+ created it, succeeded, and put the file where nothing reads it:
11
+
12
+ ```
13
+ rosotacom: error: network shaping command failed in …_com_to_b:
14
+ tc qdisc replace dev eth0 root handle 10: netem delay 25ms 18ms
15
+ distribution field-20260817 loss gemodel 0.102% 2.5% 2.7% 0.098%
16
+ -> No distribution data for field-20260817
17
+ (/usr/lib/x86_64-linux-gnu/tc//field-20260817.dist: No such file or directory)
18
+ ```
19
+
20
+ The error names the directory `tc` wanted, one line after the runner printed
21
+ that it had installed the table somewhere else, and the two paths were never
22
+ compared. What made it survive is that no committed finding needed the table:
23
+ `field-20260817-case3-delay-jam`, the one field profile a published run used,
24
+ carries `rate` and `delay` and no `distribution`. The three profiles that do
25
+ carry one — `-steady`, `-events`, `-soggy` — are exactly the ones nothing had
26
+ run end to end.
27
+
28
+ The consequence is not a wrong number anywhere. It is that the drive-derived
29
+ delay distribution, whose whole purpose is that a normal jitter model
30
+ under-tails this link by about a factor of two, could not be used, so every
31
+ replay of the 2026-08-17 link either omitted its tail or fell back to a builtin
32
+ shape.
33
+
34
+ ## Setup
35
+
36
+ - Host pair / topology: one host, the packaged local benchmark rig — two
37
+ communication containers on their own Docker network, `tc` applied inside
38
+ each container's own netns (`--sudo-mode container`), no host privileges.
39
+ - Session: `bench_1_1_capacity` from the packaged example project, one
40
+ `a->b:/bench_capacity` stream at 12000 B and 10 Hz.
41
+ - rosotacom SHA: present up to `25251cb`, fixed in this commit. The defect
42
+ reaches back to the commit that introduced custom distribution tables.
43
+ - Profile: `field-20260817-events` from the packaged example set — the one that
44
+ names `distribution: field-20260817` with
45
+ `distribution_file: dist/field-20260817.dist`.
46
+ - Seed policy: not applicable — the failure is present/absent at arming time,
47
+ before any traffic is offered.
48
+
49
+ ## Evidence
50
+
51
+ Evidence grade: reproduction on packaged material, plus the image's own answer
52
+ about where its `tc` looks.
53
+
54
+ The image is asked rather than assumed:
55
+
56
+ ```bash
57
+ docker run --rm --entrypoint sh <communication image> -c \
58
+ 'tc -V; ls -d /usr/lib/tc /usr/lib/*-linux-gnu*/tc; strings $(command -v tc) | grep /tc/$'
59
+ ```
60
+
61
+ ```
62
+ tc utility, iproute2-6.1.0, libbpf 1.3.0
63
+ ls: cannot access '/usr/lib/tc': No such file or directory
64
+ /usr/lib/x86_64-linux-gnu/tc
65
+ /usr/lib/x86_64-linux-gnu/tc/
66
+ ```
67
+
68
+ The directory the runner wrote to did not exist before the runner created it;
69
+ the directory `tc` reads already held iproute2's own `normal.dist` and
70
+ `pareto.dist`. That asymmetry is the fix: the directory holding those tables is
71
+ proof, where a triplet derived from the host would be a guess — the containers
72
+ need not share the host's architecture.
73
+
74
+ Before and after, same command, same profile:
75
+
76
+ | | arming | 30 s probe at 12 kB / 10 Hz |
77
+ |---|---|---|
78
+ | before | `No distribution data for field-20260817` | run aborted |
79
+ | after | table installed in `/usr/lib/x86_64-linux-gnu/tc` | 300 of 306 delivered, 1.96 % loss, p50 55.4 ms, p95 102.5 ms |
80
+
81
+ The delivered numbers are the second half of the evidence: 1.96 % against the
82
+ fitted drive's own 1.9–2.7 %, and a p95 the builtin `normal` distribution does
83
+ not produce at this mean and standard deviation.
84
+
85
+ Verification: automated:
86
+ `pytest tests/unit/test_network_profiles.py -k tc_lib_dir` builds the resolver's
87
+ shell program against a temporary root and asserts all three rungs — a directory
88
+ carrying iproute2's own tables wins over one that merely exists, and an image
89
+ with neither gets `/usr/lib/tc` created. Manual, for the effect itself: run
90
+ `rosotacom benchmark probe --profile field-20260817-events --size 12000
91
+ --rate-hz 10 --duration 30 --sudo-mode container` from the packaged example
92
+ project; the run must reach a delivery figure rather than fail at arming, and
93
+ the line it prints must name the directory that already holds `normal.dist`.
94
+
95
+ ## Status
96
+
97
+ confirmed, 2026-08-30.
98
+
99
+ Fixed by resolving the directory inside the container instead of hard-coding
100
+ it, in three rungs: a candidate that already carries one of iproute2's own
101
+ tables, a candidate that merely exists, and finally `/usr/lib/tc`, created, for
102
+ an image that has neither.
103
+
104
+ ## Publication notes
105
+
106
+ Two things are worth reporting, and the smaller one is the bug.
107
+
108
+ The first is about what a green run proves. Every layer here reported success —
109
+ the copy succeeded, the directory was created, the runner printed the path it
110
+ had written to — and the only component that knew the path was wrong was the
111
+ one that read it, one line later, in a message nobody was comparing against the
112
+ line above it. An installation step that does not verify against the consumer's
113
+ own view of where it looks is not an installation step.
114
+
115
+ The second is for anyone replaying a cellular trace through `netem`. The reason
116
+ this defect matters is that the builtin `normal` distribution is the wrong
117
+ shape for this link: at the 2026-08-17 drive's mean and standard deviation it
118
+ predicts a p99 about half of what was measured, which is the half a deadline
119
+ cares about. A trace-driven emulation that reports its delay model as
120
+ "delay X ± Y, normal" is therefore not reproducing the tail it was fitted to,
121
+ and the table that would have fixed it was, here, silently not in use.
@@ -5614,22 +5614,40 @@ def _make_live_run_point(args: argparse.Namespace, session_name: str) -> RunPoin
5614
5614
  dist_installs = required_dist_installs(profile_obj)
5615
5615
  if dist_installs:
5616
5616
  # Custom delay-distribution tables must exist inside the
5617
- # shaping netns before netem references them by name.
5617
+ # shaping netns before netem references them by name, and
5618
+ # in the directory this image's `tc` was compiled to read
5619
+ # -- see tc_lib_dir_probe for why that is not a constant.
5620
+ from .network_profiles import tc_lib_dir_probe
5621
+
5618
5622
  for dist_container in (a_container, b_container):
5619
5623
  if not dist_container:
5620
5624
  continue
5625
+ probe = subprocess.run(
5626
+ ["docker", "exec", "-u", "root", dist_container, "sh", "-c", tc_lib_dir_probe()],
5627
+ capture_output=True,
5628
+ text=True,
5629
+ check=False,
5630
+ )
5631
+ tc_lib_dir = probe.stdout.strip()
5632
+ if probe.returncode != 0 or not tc_lib_dir.startswith("/"):
5633
+ raise RuntimeError(
5634
+ f"could not locate the tc library directory in {dist_container}: "
5635
+ f"{probe.stderr or probe.stdout}"
5636
+ )
5621
5637
  for table_name, file_path in dist_installs:
5622
- dist_target = f"/usr/lib/tc/{table_name}.dist"
5623
- for install_cmd in (
5624
- ["docker", "exec", "-u", "root", dist_container, "mkdir", "-p", "/usr/lib/tc"],
5638
+ dist_target = f"{tc_lib_dir}/{table_name}.dist"
5639
+ res = subprocess.run(
5625
5640
  ["docker", "cp", file_path, f"{dist_container}:{dist_target}"],
5626
- ):
5627
- res = subprocess.run(install_cmd, capture_output=True, text=True, check=False)
5628
- if res.returncode != 0:
5629
- raise RuntimeError(
5630
- f"failed to install netem distribution table {table_name!r} in "
5631
- f"{dist_container}: {' '.join(install_cmd)} -> {res.stderr or res.stdout}"
5632
- )
5641
+ capture_output=True,
5642
+ text=True,
5643
+ check=False,
5644
+ )
5645
+ if res.returncode != 0:
5646
+ raise RuntimeError(
5647
+ f"failed to install netem distribution table {table_name!r} in "
5648
+ f"{dist_container}: {file_path} -> {dist_target}: "
5649
+ f"{res.stderr or res.stdout}"
5650
+ )
5633
5651
  print(
5634
5652
  f" netem distribution {table_name!r} installed in {dist_container}: {dist_target}"
5635
5653
  )
@@ -440,9 +440,46 @@ def _resolve_distribution_files(profile: Profile, base: Path) -> Profile:
440
440
  return replace(profile, uplink=fix(profile.uplink), downlink=fix(profile.downlink))
441
441
 
442
442
 
443
+ #: Where `tc` looks for a delay-distribution table, in the order to try.
444
+ #: iproute2 compiles the directory in (``LIBDIR "/tc"``), so on a multiarch
445
+ #: Debian or Ubuntu build it is ``/usr/lib/<triplet>/tc`` and ``/usr/lib/tc``
446
+ #: does not exist at all. A table written to the latter is then invisible with
447
+ #: no error of its own: netem answers ``No distribution data for <name>`` and
448
+ #: the run dies at arming time, which is what every profile carrying a fitted
449
+ #: table did until this was found. The directory holding iproute2's own tables
450
+ #: is the one it reads, so that is the evidence to look for rather than a
451
+ #: guessed triplet.
452
+ TC_LIB_DIR_CANDIDATES = ("/usr/lib/*-linux-gnu*/tc", "/usr/lib/tc")
453
+
454
+ #: A table iproute2 ships, used as the marker for "this is the directory".
455
+ TC_LIB_DIR_MARKERS = ("normal.dist", "pareto.dist")
456
+
457
+
458
+ def tc_lib_dir_probe(root: str = "") -> str:
459
+ """A ``sh -c`` program that prints the directory ``tc`` reads tables from.
460
+
461
+ Three rungs, in order: a candidate that already holds one of iproute2's own
462
+ tables (proof, not inference); a candidate that merely exists; and finally
463
+ ``/usr/lib/tc``, created, for an image that has neither. `root` exists so
464
+ the rungs are testable without a container.
465
+ """
466
+ cands = " ".join(f"{root}{c}" for c in TC_LIB_DIR_CANDIDATES)
467
+ marker = " || ".join(f'[ -f "$d/{m}" ]' for m in TC_LIB_DIR_MARKERS)
468
+ fallback = f"{root}/usr/lib/tc"
469
+ return (
470
+ f"for d in {cands}; do "
471
+ f' if {marker}; then printf %s "$d"; exit 0; fi; '
472
+ f"done; "
473
+ f"for d in {cands}; do "
474
+ f' if [ -d "$d" ]; then printf %s "$d"; exit 0; fi; '
475
+ f"done; "
476
+ f"mkdir -p {fallback} && printf %s {fallback}"
477
+ )
478
+
479
+
443
480
  def required_dist_installs(profile: Profile) -> list[tuple[str, str]]:
444
481
  """``(table_name, file_path)`` pairs a runner must install as
445
- ``/usr/lib/tc/<table_name>.dist`` inside the shaping netns before arming.
482
+ ``<tc lib dir>/<table_name>.dist`` inside the shaping netns before arming.
446
483
 
447
484
  Builtin distributions need nothing; duplicates collapse; conflicting files
448
485
  for one name are an error (two segments must mean the same table).
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rosotacom-dev
3
- Version: 2.5.dev73
3
+ Version: 2.5.dev75
4
4
  Summary: Host CLI for ROS OTA communication sessions.
5
5
  Author: develNor
6
6
  License-Expression: BSD-3-Clause
@@ -62,6 +62,7 @@ docs/release.md
62
62
  docs/testing.md
63
63
  docs/work-items.md
64
64
  docs/findings/README.md
65
+ docs/findings/a-fitted-delay-table-never-reached-the-shaper.md
65
66
  docs/findings/a-transport-element-doubles-every-fastdds-sample.md
66
67
  docs/findings/cyclone-fragment-equal-to-max-drops-fragmented-samples.md
67
68
  docs/findings/cyclone-spdp-discovery-bursts.md
@@ -46,6 +46,7 @@
46
46
  "docs/ci.md",
47
47
  "docs/ffmpeg-keyframes.md",
48
48
  "docs/findings/README.md",
49
+ "docs/findings/a-fitted-delay-table-never-reached-the-shaper.md",
49
50
  "docs/findings/a-transport-element-doubles-every-fastdds-sample.md",
50
51
  "docs/findings/cyclone-fragment-equal-to-max-drops-fragmented-samples.md",
51
52
  "docs/findings/cyclone-spdp-discovery-bursts.md",
@@ -0,0 +1,8 @@
1
+ {
2
+ "tag": "2.4",
3
+ "distance": 75,
4
+ "node": "g7bb420c5753ae28a6c162fd2aeedbb18e46cf1b3",
5
+ "dirty": false,
6
+ "branch": "HEAD",
7
+ "node_date": "2026-08-30"
8
+ }
@@ -3,6 +3,8 @@
3
3
 
4
4
  from __future__ import annotations
5
5
 
6
+ import subprocess
7
+
6
8
  import pytest
7
9
 
8
10
  from rosotacom.network_profiles import (
@@ -25,6 +27,7 @@ from rosotacom.network_profiles import (
25
27
  required_dist_installs,
26
28
  resolve_profile_selection,
27
29
  shaping_commands,
30
+ tc_lib_dir_probe,
28
31
  teardown_command,
29
32
  )
30
33
 
@@ -518,3 +521,43 @@ def test_load_profiles_file_resolves_distribution_files_and_lists_installs(tmp_p
518
521
  )
519
522
  == []
520
523
  )
524
+
525
+
526
+ def _probe(root) -> str:
527
+ return subprocess.run(
528
+ ["sh", "-c", tc_lib_dir_probe(str(root))],
529
+ capture_output=True,
530
+ text=True,
531
+ check=True,
532
+ ).stdout
533
+
534
+
535
+ def test_the_distribution_table_goes_where_tc_reads_it(tmp_path):
536
+ """A table installed into `/usr/lib/tc` on a multiarch image is invisible.
537
+
538
+ iproute2 compiles its library directory in, so a Debian or Ubuntu build
539
+ reads `/usr/lib/<triplet>/tc` and never looks at `/usr/lib/tc`. netem then
540
+ fails at arming time with "No distribution data", which reads like a broken
541
+ profile rather than a misplaced file -- so the directory is resolved from
542
+ the image instead of assumed.
543
+ """
544
+ multiarch = tmp_path / "usr/lib/x86_64-linux-gnu/tc"
545
+ multiarch.mkdir(parents=True)
546
+ (multiarch / "normal.dist").write_text("0\n", encoding="utf-8")
547
+ (tmp_path / "usr/lib/tc").mkdir(parents=True)
548
+
549
+ # Both exist; the one carrying iproute2's own table is the one tc reads.
550
+ assert _probe(tmp_path) == str(multiarch)
551
+
552
+
553
+ def test_a_directory_that_merely_exists_is_the_second_choice(tmp_path):
554
+ multiarch = tmp_path / "usr/lib/aarch64-linux-gnu/tc"
555
+ multiarch.mkdir(parents=True)
556
+ assert _probe(tmp_path) == str(multiarch)
557
+
558
+
559
+ def test_an_image_with_neither_gets_one_created(tmp_path):
560
+ (tmp_path / "usr/lib").mkdir(parents=True)
561
+ out = _probe(tmp_path)
562
+ assert out == str(tmp_path / "usr/lib/tc")
563
+ assert (tmp_path / "usr/lib/tc").is_dir()
@@ -1,8 +0,0 @@
1
- {
2
- "tag": "2.4",
3
- "distance": 73,
4
- "node": "g25251cbc0967cd74a2417b707e9062c0b520491e",
5
- "dirty": false,
6
- "branch": "HEAD",
7
- "node_date": "2026-08-22"
8
- }