rosotacom-dev 2.5.dev75__tar.gz → 2.5.dev77__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 (399) hide show
  1. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/PKG-INFO +1 -1
  2. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/findings/README.md +3 -0
  3. rosotacom_dev-2.5.dev77/docs/findings/a-shorter-group-does-not-lose-fewer-key-frames.md +116 -0
  4. rosotacom_dev-2.5.dev77/docs/findings/neither-a-queue-nor-a-burst-tilts-the-size-law.md +182 -0
  5. rosotacom_dev-2.5.dev77/docs/findings/the-size-law-belongs-to-the-transport-not-the-link.md +140 -0
  6. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/profiles.yaml +147 -0
  7. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom_dev.egg-info/PKG-INFO +1 -1
  8. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom_dev.egg-info/SOURCES.txt +3 -0
  9. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom_dev.egg-info/scm_file_list.json +3 -0
  10. rosotacom_dev-2.5.dev77/src/rosotacom_dev.egg-info/scm_version.json +8 -0
  11. rosotacom_dev-2.5.dev75/src/rosotacom_dev.egg-info/scm_version.json +0 -8
  12. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/.devcontainer/devcontainer.json.template +0 -0
  13. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/.devcontainer/re_generate_devcontainer_json.py +0 -0
  14. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/.github/CODEOWNERS +0 -0
  15. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/.github/ISSUE_TEMPLATE/documentation-audit.md +0 -0
  16. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/.github/ISSUE_TEMPLATE/implementation-cleanup.md +0 -0
  17. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/.github/ISSUE_TEMPLATE/quality-workflow.md +0 -0
  18. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/.github/ISSUE_TEMPLATE/redesign.md +0 -0
  19. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/.github/ISSUE_TEMPLATE/release-process.md +0 -0
  20. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/.github/ISSUE_TEMPLATE/repository-diagnosis.md +0 -0
  21. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/.github/ISSUE_TEMPLATE/test-ci-audit.md +0 -0
  22. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/.github/ISSUE_TEMPLATE/work-item.md +0 -0
  23. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  24. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/.github/actions/setup-just/action.yml +0 -0
  25. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/.github/dependabot.yml +0 -0
  26. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/.github/workflows/benchmark-calibrate.yml +0 -0
  27. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/.github/workflows/benchmark-gate.yml +0 -0
  28. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/.github/workflows/dev-release.yml +0 -0
  29. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/.github/workflows/image-scan.yml +0 -0
  30. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/.github/workflows/nightly-e2e.yml +0 -0
  31. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/.github/workflows/pr-lightweight.yml +0 -0
  32. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/.github/workflows/pr-merge-gate.yml +0 -0
  33. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/.github/workflows/release.yml +0 -0
  34. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/.pre-commit-config.yaml +0 -0
  35. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/AGENTS.md +0 -0
  36. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/CONCURRENCY.md +0 -0
  37. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/CONTRIBUTING.md +0 -0
  38. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/DEVELOPMENT_PRINCIPLES.md +0 -0
  39. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/LICENSE.txt +0 -0
  40. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/MANIFEST.in +0 -0
  41. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/README.md +0 -0
  42. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/budgets.jsonl +0 -0
  43. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/calibration/README.md +0 -0
  44. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/calibration/capacity-size-tight-cyclone.json +0 -0
  45. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/calibration/probe-loss-gop-tight-cyclone.json +0 -0
  46. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/calibration/probe-loss-nominal-cyclone.json +0 -0
  47. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/calibration/probe-loss-tight-cyclone.json +0 -0
  48. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/calibration/probe-loss-tight-fastdds.json +0 -0
  49. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/calibration/probe-loss-tight-zenoh.json +0 -0
  50. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/codecov.yml +0 -0
  51. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/deployment-configuration.md +0 -0
  52. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/benchmark-ab.md +0 -0
  53. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/benchmark-bag-as-load.md +0 -0
  54. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/ci.md +0 -0
  55. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/ffmpeg-keyframes.md +0 -0
  56. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/findings/a-fitted-delay-table-never-reached-the-shaper.md +0 -0
  57. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/findings/a-transport-element-doubles-every-fastdds-sample.md +0 -0
  58. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/findings/cyclone-fragment-equal-to-max-drops-fragmented-samples.md +0 -0
  59. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/findings/cyclone-spdp-discovery-bursts.md +0 -0
  60. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/findings/delay-alone-no-loss.md +0 -0
  61. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/findings/fastdds-datagram-cap-drops-large-samples.md +0 -0
  62. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/findings/graph-derived-types-block-a-non-graph-transport.md +0 -0
  63. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/findings/head-of-line-irregularity.md +0 -0
  64. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/findings/jitter-loss-bandwidth-latency.md +0 -0
  65. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/findings/keyframe-loss-kills-the-next-deltas.md +0 -0
  66. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/findings/lifespan-is-enforced-by-one-reader-and-not-the-other.md +0 -0
  67. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/findings/lighter-message-loss.md +0 -0
  68. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/findings/one-domain-two-cyclone-configs-stop-interoperating.md +0 -0
  69. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/findings/oversubscription-queues-not-losses.md +0 -0
  70. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/findings/reorder-becomes-reader-loss.md +0 -0
  71. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/findings/repro/decode_chain_repro.py +0 -0
  72. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/findings/repro/reorder_drop_repro.py +0 -0
  73. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/findings/sender-rows-make-a-dead-link-look-loss-free.md +0 -0
  74. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/findings/zero-loss-boundaries-18kb-20hz.md +0 -0
  75. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/forensics-report.md +0 -0
  76. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/geo-link-map.md +0 -0
  77. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/github-repository-settings.md +0 -0
  78. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/link-bandwidth.md +0 -0
  79. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/link-trace.md +0 -0
  80. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/ota-pcap.md +0 -0
  81. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/owner-runbook.md +0 -0
  82. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/performance-bands.md +0 -0
  83. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/playbooks/README.md +0 -0
  84. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/quality-model.md +0 -0
  85. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/release-notes/TEMPLATE.md +0 -0
  86. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/release-notes/v2.1.md +0 -0
  87. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/release-notes/v2.2.md +0 -0
  88. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/release-notes/v2.3.md +0 -0
  89. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/release-notes/v2.4.md +0 -0
  90. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/release.md +0 -0
  91. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/rfcs/0001-expectation-driven-test-suite.md +0 -0
  92. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/rfcs/0002-expectation-concepts.md +0 -0
  93. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/rfcs/0003-metric-backbone.md +0 -0
  94. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/rfcs/0004-network-profiles.md +0 -0
  95. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/rfcs/0005-benchmark-genres-and-ci.md +0 -0
  96. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/rfcs/0006-dynamic-qos.md +0 -0
  97. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/rfcs/0007-regression-gate.md +0 -0
  98. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/rfcs/README.md +0 -0
  99. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/testing.md +0 -0
  100. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/work-items.md +0 -0
  101. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/install.sh +0 -0
  102. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/justfile +0 -0
  103. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/media/control_center.png +0 -0
  104. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/media/echo_test.png +0 -0
  105. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/media/forensics-report-example.png +0 -0
  106. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/media/host.png +0 -0
  107. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/media/vehicle.png +0 -0
  108. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/pyproject.toml +0 -0
  109. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/requirements.txt +0 -0
  110. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/rosotacom.yaml +0 -0
  111. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/session-configuration.md +0 -0
  112. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/setup.cfg +0 -0
  113. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/__init__.py +0 -0
  114. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/__main__.py +0 -0
  115. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/anonymize.py +0 -0
  116. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/bag_ground_truth.py +0 -0
  117. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/benched_set.py +0 -0
  118. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/benchmark.py +0 -0
  119. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/benchmark_delta.py +0 -0
  120. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/bundle_check.py +0 -0
  121. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/cli.py +0 -0
  122. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/cli_benchmark.py +0 -0
  123. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/deployment.py +0 -0
  124. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/ffmpeg_packet.py +0 -0
  125. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/forensics.py +0 -0
  126. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/geomap.py +0 -0
  127. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/image_cache.py +0 -0
  128. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/netem_dist.py +0 -0
  129. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/network_preflight.py +0 -0
  130. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/network_profiles.py +0 -0
  131. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/network_shaper.py +0 -0
  132. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/plots.py +0 -0
  133. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/py.typed +0 -0
  134. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/benched-set.yaml +0 -0
  135. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/.gitignore +0 -0
  136. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/README.md +0 -0
  137. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/__init__.py +0 -0
  138. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/bags/8_drop_reference/metadata.yaml +0 -0
  139. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/deployment.example.yaml +0 -0
  140. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/dist/field-20260817.dist +0 -0
  141. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/ros2docker.json +0 -0
  142. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/ros2docker.lyrical.json +0 -0
  143. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/rosotacom.yaml +0 -0
  144. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scenarios/2_native_chatter/scenario-definition.yaml +0 -0
  145. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/1_heartbeat/run_machine_a.sh +0 -0
  146. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/1_heartbeat/run_machine_b.sh +0 -0
  147. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_a/external.lyrical.ros2docker.json +0 -0
  148. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_a/external.ros2docker.json +0 -0
  149. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_a/run_communication.sh +0 -0
  150. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_a/run_external.py +0 -0
  151. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_a/wait_for_echo_topic.sh +0 -0
  152. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_b/external.lyrical.ros2docker.json +0 -0
  153. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_b/external.ros2docker.json +0 -0
  154. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_b/run_communication.sh +0 -0
  155. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_b/run_external.py +0 -0
  156. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_a/external.ros2docker.json +0 -0
  157. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_a/external_session.yaml +0 -0
  158. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_a/foxglove.json +0 -0
  159. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_a/run_communication.sh +0 -0
  160. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_a/run_external.py +0 -0
  161. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_b/costmap_1second/costmap_1second_0.mcap +0 -0
  162. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_b/costmap_1second/metadata.yaml +0 -0
  163. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_b/external.ros2docker.json +0 -0
  164. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_b/run_communication.sh +0 -0
  165. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_b/run_external.py +0 -0
  166. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_a/external.ros2docker.json +0 -0
  167. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_a/external_session.yaml +0 -0
  168. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_a/foxglove.json +0 -0
  169. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_a/run_communication.sh +0 -0
  170. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_a/run_external.py +0 -0
  171. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/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.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_b/costmap_1second/metadata.yaml +0 -0
  173. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_b/external.ros2docker.json +0 -0
  174. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_b/run_communication.sh +0 -0
  175. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_b/run_external.py +0 -0
  176. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_a/external.ros2docker.json +0 -0
  177. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_a/external_session.yaml +0 -0
  178. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_a/run_communication.sh +0 -0
  179. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_a/run_external.py +0 -0
  180. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_b/external.ros2docker.json +0 -0
  181. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_b/external_session.yaml +0 -0
  182. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_b/run_communication.sh +0 -0
  183. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_b/run_external.py +0 -0
  184. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_a/external.ros2docker.json +0 -0
  185. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_a/external_session.yaml +0 -0
  186. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_a/run_communication.sh +0 -0
  187. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_a/run_external.py +0 -0
  188. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_b/external.ros2docker.json +0 -0
  189. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_b/external_session.yaml +0 -0
  190. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_b/run_communication.sh +0 -0
  191. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_b/run_external.py +0 -0
  192. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/sessions/10_restamp/session-definition.yaml +0 -0
  193. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/sessions/11_trickle/session-definition.yaml +0 -0
  194. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/sessions/12_content_integrity/session-definition.yaml +0 -0
  195. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/sessions/13_link_latency/session-definition.yaml +0 -0
  196. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/sessions/14_remote_assist_anonymized/session-definition.yaml +0 -0
  197. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/sessions/15_remote_assist_anonymized_costmap/session-definition.yaml +0 -0
  198. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/sessions/16_remote_assist_anonymized_camera/session-definition.yaml +0 -0
  199. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/sessions/17_synthetic_camera_quality/session-definition.yaml +0 -0
  200. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/sessions/1_heartbeat/session-definition.yaml +0 -0
  201. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/sessions/1_heartbeat_status/session-definition.yaml +0 -0
  202. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/sessions/2_native_chatter/session-definition.yaml +0 -0
  203. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/sessions/3_comp_occ_grid/session-definition.yaml +0 -0
  204. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/sessions/4_comp_occ_grid_zen/session-definition.yaml +0 -0
  205. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/sessions/5_sized_payload/session-definition.yaml +0 -0
  206. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/sessions/6_sized_payload_zen/session-definition.yaml +0 -0
  207. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/sessions/7_latched_static/session-definition.yaml +0 -0
  208. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/sessions/8_drop/session-definition.yaml +0 -0
  209. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/sessions/9_throttle/session-definition.yaml +0 -0
  210. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/sessions/bench_1_1_capacity/session-definition.yaml +0 -0
  211. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/sessions/bench_1_2_load_sweep/session-definition.yaml +0 -0
  212. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/sessions/bench_1_3_ramp/session-definition.yaml +0 -0
  213. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/sessions/bench_1_4_recovery/session-definition.yaml +0 -0
  214. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/sessions/bench_1_5_camera/session-definition.yaml +0 -0
  215. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ros2docker.json.example +0 -0
  216. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ros2docker.lyrical.json.example +0 -0
  217. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/.vscode/c_cpp_properties.json +0 -0
  218. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/.vscode/settings.json +0 -0
  219. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_easy_mode.xml.template +0 -0
  220. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_initial_peer_list.xml.template +0 -0
  221. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_v2.xml.template +0 -0
  222. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_v3.xml.template +0 -0
  223. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_v4.xml.template +0 -0
  224. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_v5.xml.template +0 -0
  225. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ota_configs/create_zenoh_json5.py +0 -0
  226. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ota_configs/cyclonedds_local_participants.xml.template +0 -0
  227. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ota_configs/cyclonedds_minimal.xml.template +0 -0
  228. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ota_configs/cyclonedds_scoped.xml.template +0 -0
  229. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ota_configs/cyclonedds_tuned.xml.template +0 -0
  230. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ota_configs/fastdds_easy_mode.xml.template +0 -0
  231. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ota_configs/fastdds_local.xml.template +0 -0
  232. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ota_configs/fastdds_tuned.xml.template +0 -0
  233. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ota_configs/fastdds_unicast.xml.template +0 -0
  234. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ota_configs/get_ota_xml.py +0 -0
  235. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ota_configs/utils.py +0 -0
  236. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ota_configs/zenoh.json5.template +0 -0
  237. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/.gitkeep +0 -0
  238. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_cpp/CMakeLists.txt +0 -0
  239. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_cpp/COLCON_IGNORE +0 -0
  240. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_cpp/LICENSE.txt +0 -0
  241. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_cpp/package.xml +0 -0
  242. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_cpp/src/hz_monitor.cpp +0 -0
  243. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_cpp/src/universal_compressor.cpp +0 -0
  244. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_cpp/src/universal_decompressor.cpp +0 -0
  245. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_msgs/CMakeLists.txt +0 -0
  246. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_msgs/LICENSE.txt +0 -0
  247. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_msgs/msg/CompressedData.msg +0 -0
  248. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_msgs/msg/EchoHeartbeat.msg +0 -0
  249. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_msgs/msg/OtaStamped.msg +0 -0
  250. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_msgs/msg/SizedPayload.msg +0 -0
  251. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_msgs/package.xml +0 -0
  252. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/LICENSE.txt +0 -0
  253. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/com_py/__init__.py +0 -0
  254. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/com_py/base_bridge_relay.py +0 -0
  255. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/com_py/bridge_in.py +0 -0
  256. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/com_py/bridge_out.py +0 -0
  257. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/com_py/ffmpeg_flags.py +0 -0
  258. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/com_py/heartbeat_echo.py +0 -0
  259. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/com_py/hz_monitor.py +0 -0
  260. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/com_py/image_bandwidth_reducer.py +0 -0
  261. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/com_py/image_pixel_capper.py +0 -0
  262. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/com_py/lanelet_saver.py +0 -0
  263. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/com_py/latch_relay.py +0 -0
  264. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/costmap_remapper.py +0 -0
  265. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/marker_remapper.py +0 -0
  266. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/speed_test.py +0 -0
  267. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/tf_remapper.py +0 -0
  268. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/traffic_monitor.py +0 -0
  269. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/wifi_network_analysis_1.py +0 -0
  270. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/com_py/link_bytes.py +0 -0
  271. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/com_py/link_trace.py +0 -0
  272. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/com_py/local_global_frame_bridge.py +0 -0
  273. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/com_py/localization_map_split_reduce_saver.py +0 -0
  274. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/com_py/msg_transform.py +0 -0
  275. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/com_py/ota_pcap.py +0 -0
  276. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/com_py/pair_management.py +0 -0
  277. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/com_py/playout_pacer.py +0 -0
  278. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/com_py/playout_pacer_core.py +0 -0
  279. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/com_py/pub_sub_pair.py +0 -0
  280. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/com_py/qos.py +0 -0
  281. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/com_py/relay_in.py +0 -0
  282. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/com_py/relay_out.py +0 -0
  283. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/com_py/restamp.py +0 -0
  284. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/com_py/sized_publisher.py +0 -0
  285. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/com_py/stage_latency.py +0 -0
  286. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/com_py/stage_latency_core.py +0 -0
  287. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/com_py/status_overview.py +0 -0
  288. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/com_py/status_overview_core.py +0 -0
  289. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/com_py/tf_map_to_cart_saver.py +0 -0
  290. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/com_py/topic_monitor.py +0 -0
  291. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/com_py/topic_resolution.py +0 -0
  292. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/com_py/trickle.py +0 -0
  293. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/com_py/universal_compressor.py +0 -0
  294. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/com_py/universal_decompressor.py +0 -0
  295. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/com_py/universal_ota_unwrapper.py +0 -0
  296. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/com_py/universal_ota_wrapper.py +0 -0
  297. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/package.xml +0 -0
  298. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/resource/com_py +0 -0
  299. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/setup.cfg +0 -0
  300. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/setup.py +0 -0
  301. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/test/test_copyright.py +0 -0
  302. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/test/test_flake8.py +0 -0
  303. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/test/test_pep257.py +0 -0
  304. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/session/content/base/session_plugin_base.yaml +0 -0
  305. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/session/content/network/up_connectivity.py +0 -0
  306. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/session/content/network/wifi_network_analysis_2.py +0 -0
  307. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/session/creation/anonymize_bag.py +0 -0
  308. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/session/creation/catmux_log_setup.sh +0 -0
  309. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/session/creation/create_session_yaml.py +0 -0
  310. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/session/creation/generate_session_files.py +0 -0
  311. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/session/creation/run_session.py +0 -0
  312. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/session/creation/run_session_in_external_terminal.py +0 -0
  313. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/session/creation/strip_ansi.py +0 -0
  314. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/status_eval.py +0 -0
  315. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/stream_stats.py +0 -0
  316. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/trace_profiles.py +0 -0
  317. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/transit.py +0 -0
  318. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/video_quality.py +0 -0
  319. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom_dev.egg-info/dependency_links.txt +0 -0
  320. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom_dev.egg-info/entry_points.txt +0 -0
  321. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom_dev.egg-info/requires.txt +0 -0
  322. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom_dev.egg-info/top_level.txt +0 -0
  323. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/terminology.md +0 -0
  324. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/contract/test_benched_set_registry.py +0 -0
  325. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/contract/test_findings.py +0 -0
  326. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/contract/test_generated_topics_have_a_producer.py +0 -0
  327. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/contract/test_lyrical_runtime_compat.py +0 -0
  328. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/contract/test_markdown_links.py +0 -0
  329. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/contract/test_ota_source_bundle.py +0 -0
  330. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/contract/test_package_metadata.py +0 -0
  331. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/contract/test_packaged_resources.py +0 -0
  332. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/contract/test_profile_covers_generated_commands.py +0 -0
  333. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/contract/test_pytest_policy.py +0 -0
  334. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/contract/test_readme_examples.py +0 -0
  335. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/contract/test_security_maintenance_config.py +0 -0
  336. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/contract/test_session_configuration_doc.py +0 -0
  337. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/contract/test_session_template_substitution.py +0 -0
  338. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/contract/test_workflow_contracts.py +0 -0
  339. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/e2e/conftest.py +0 -0
  340. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/e2e/test_anonymize_e2e.py +0 -0
  341. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/e2e/test_benchmark_ab.py +0 -0
  342. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/e2e/test_benchmark_capacity.py +0 -0
  343. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/e2e/test_benchmark_replay.py +0 -0
  344. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/e2e/test_parallel_smoke.py +0 -0
  345. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/e2e/test_smoke.py +0 -0
  346. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/e2e/test_timeline_stepping.py +0 -0
  347. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/e2e/test_video_quality_e2e.py +0 -0
  348. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/sessions/generate_rmw_matrix.py +0 -0
  349. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/sessions/rmw_matrix/1_heartbeat_cyclone-local_zenoh-ros2dds-ota/session-definition.yaml +0 -0
  350. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/sessions/rmw_matrix/1_heartbeat_cyclone-ota/session-definition.yaml +0 -0
  351. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/sessions/rmw_matrix/1_heartbeat_cyclone-ota-tuned/session-definition.yaml +0 -0
  352. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/sessions/rmw_matrix/1_heartbeat_fastdds/session-definition.yaml +0 -0
  353. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/sessions/rmw_matrix/1_heartbeat_fastdds-default/session-definition.yaml +0 -0
  354. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/sessions/rmw_matrix/1_heartbeat_zen-endpoints/session-definition.yaml +0 -0
  355. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_anonymize.py +0 -0
  356. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_bag_ground_truth.py +0 -0
  357. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_benched_set.py +0 -0
  358. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_benchmark.py +0 -0
  359. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_benchmark_delta.py +0 -0
  360. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_bundle_check.py +0 -0
  361. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_catmux_pane_logging.py +0 -0
  362. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_cli.py +0 -0
  363. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_cli_benchmark.py +0 -0
  364. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_concurrency.py +0 -0
  365. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_container_shaping.py +0 -0
  366. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_deployment.py +0 -0
  367. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_ffmpeg_flags.py +0 -0
  368. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_ffmpeg_packet.py +0 -0
  369. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_field_profiles.py +0 -0
  370. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_forensics.py +0 -0
  371. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_geomap.py +0 -0
  372. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_image_cache.py +0 -0
  373. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_link_bytes.py +0 -0
  374. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_link_trace.py +0 -0
  375. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_netem_dist.py +0 -0
  376. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_network_preflight.py +0 -0
  377. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_network_profiles.py +0 -0
  378. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_network_shaper.py +0 -0
  379. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_ota_link_configs.py +0 -0
  380. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_ota_pcap.py +0 -0
  381. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_ota_unwrapper.py +0 -0
  382. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_ota_wrapper.py +0 -0
  383. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_ota_xml.py +0 -0
  384. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_playout_pacer.py +0 -0
  385. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_plots.py +0 -0
  386. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_pub_sub_pair_types.py +0 -0
  387. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_qos_fallback_logging.py +0 -0
  388. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_relay_optional_parameters.py +0 -0
  389. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_ros_node_entity_ownership.py +0 -0
  390. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_session_pipeline.py +0 -0
  391. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_stage_latency.py +0 -0
  392. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_status_eval.py +0 -0
  393. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_status_overview.py +0 -0
  394. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_status_overview_observer.py +0 -0
  395. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_stream_stats.py +0 -0
  396. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_terminology_stage_ownership.py +0 -0
  397. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_trace_profiles.py +0 -0
  398. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_transit.py +0 -0
  399. {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/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.dev75
3
+ Version: 2.5.dev77
4
4
  Summary: Host CLI for ROS OTA communication sessions.
5
5
  Author: develNor
6
6
  License-Expression: BSD-3-Clause
@@ -28,6 +28,9 @@ living verification hook.
28
28
 
29
29
  ## Findings
30
30
 
31
+ - [The size law belongs to the transport, not to the link](the-size-law-belongs-to-the-transport-not-the-link.md) - one emulated link, three OTA middlewares: CycloneDDS follows `1-(1-p)^N` with a flat residual over three decades of size, Fast DDS keeps the form and loses the fit, and zenoh is flat from 300 B to 12 kB and then falls off a cliff at 38 kB.
32
+ - [Neither a queue nor a burst tilts the size law](neither-a-queue-nor-a-burst-tilts-the-size-law.md) - the field's size-systematic residual is reproduced by none of the three candidates: independent per-packet loss fits flat, a token bucket a burst can fill changes nothing systematic, and a serialisation constraint does not tilt the curve but truncates it (38 kB goes from 32% to 97.5% while 1 kB pays 10% more).
33
+ - [A shorter group does not lose fewer key frames](a-shorter-group-does-not-lose-fewer-key-frames.md) - shortening the group cuts the large message's loss from 29.5% to 12.5% and leaves the rate at which large messages go missing unchanged (0.59, 0.79, 0.62 per second), while doubling the link's per-packet rate moves it by 1.8x.
31
34
  - [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.
32
35
  - [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.
33
36
  - [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.
@@ -0,0 +1,116 @@
1
+ # A Shorter Group Does Not Lose Fewer Key Frames
2
+
3
+ ## Claim
4
+
5
+ Shortening the group of pictures is the design lever the fragment law hands a
6
+ video stream: fewer bytes in the largest message class, so a smaller fragment
7
+ count, so a lower loss probability for the frame everything else depends on.
8
+ The lever works on that probability and **not on the rate at which key frames
9
+ go missing**, because the same change makes proportionally more of them.
10
+
11
+ Three size distributions at one cadence, each standing in for a group length,
12
+ under an unchanged link:
13
+
14
+ | link | pattern | large msg | per second | loss of it | **lost per second** | offered |
15
+ |---|---|---:|---:|---:|---:|---:|
16
+ | p = 1 % | 4 small + 1 large | 38.1 kB | 2.00 | 29.52 % | **0.590** | 0.936 Mbit/s |
17
+ | p = 1 % | 2 small + 1 large | 24.1 kB | 3.33 | 23.82 % | **0.794** | 0.915 Mbit/s |
18
+ | p = 1 % | 1 small + 1 large | 14.1 kB | 5.00 | 12.45 % | **0.623** | 0.768 Mbit/s |
19
+ | p = 2 % | 4 small + 1 large | 38.1 kB | 2.00 | 56.43 % | **1.127** | 0.935 Mbit/s |
20
+ | p = 2 % | 2 small + 1 large | 24.1 kB | 3.34 | 37.95 % | **1.266** | 0.915 Mbit/s |
21
+ | p = 2 % | 1 small + 1 large | 14.1 kB | 5.00 | 21.98 % | **1.099** | 0.768 Mbit/s |
22
+
23
+ Read the two bold columns together. **The loss of the large message falls by
24
+ more than half — 29.5 % to 12.5 % — while the rate at which large messages are
25
+ lost does not move: 0.590, 0.794, 0.623 per second.** The lever's two factors
26
+ cancel to within a few per cent, by construction rather than by accident: a
27
+ message 2.7× smaller occupies 2.7× fewer packets, and there are 2.5× more of
28
+ them.
29
+
30
+ **The factor that does move the answer is the one the designer does not set.**
31
+ Doubling the link's per-packet rate moves the same quantity by 1.8–1.9× in
32
+ every pattern.
33
+
34
+ The rule is therefore usable and its limit is exactly stated: it predicts
35
+ *which* term changes and by how much, and it does not predict that the outcome
36
+ improves. What a shorter group buys is the length of each hole, not their
37
+ number — and, worth having, about 18 % less offered bandwidth for the same
38
+ cadence.
39
+
40
+ ## Setup
41
+
42
+ - Host pair / topology: one host, the packaged local benchmark rig — two
43
+ communication containers on their own Docker network, `tc` inside each
44
+ container's own netns (`--sudo-mode container`).
45
+ - Session: `bench_1_1_capacity` from the packaged example project, one
46
+ `a->b:/bench_capacity` stream at 10 Hz with `--size-pattern`, CycloneDDS,
47
+ OTA QoS best_effort / KEEP_LAST depth 1. The patterns are
48
+ `4x5KB+1x38KB`, `2x5KB+1x24KB` and `1x5KB+1x14KB` — a large class against a
49
+ fixed small one, in the three ratios a group length of five, three and two
50
+ produces.
51
+ - rosotacom SHA: measured at `7bb420c`; needs 2.5.dev74 or later for the fitted
52
+ delay table to arm.
53
+ - Profiles: `tilt-iid` and `tilt-iid-worse` in
54
+ [`src/rosotacom/resources/examples/profiles.yaml`](../../src/rosotacom/resources/examples/profiles.yaml)
55
+ — the 2026-08-17 drive's own delay table at 25 ms ± 18 ms with 1 % and 2 %
56
+ independent per-packet loss. Nothing else differs between the two links.
57
+ - Seed policy: netem `loss` is unseeded, `n=1` per cell; each cell offers about
58
+ 2100 messages of which 420–1680 are of the large class, so the intervals on
59
+ the large-class figures are 3–5 points wide and on the per-second rates
60
+ correspondingly.
61
+
62
+ ## Evidence
63
+
64
+ Evidence grade: per-message counts from the receiving peer's own RFC 0003
65
+ transit records. Lost rows carry no payload and therefore no size, so the size
66
+ classes are learnt from the delivered rows as the publisher's repeating pattern
67
+ against the sequence number, and every row — delivered or lost — is then
68
+ assigned by its position in that cycle. The window is taken in sequence numbers
69
+ (first 300, last 50 dropped).
70
+
71
+ The transfer function itself holds throughout, so the cancellation is not a
72
+ breakdown of the model but a consequence of it: fitting one `(p, F)` over the
73
+ mixed workload leaves residuals of 0.86–1.11 at p = 1 % and 0.99–1.03 at
74
+ p = 2 %.
75
+
76
+ Verification: manual, from a source checkout with Docker:
77
+
78
+ ```bash
79
+ for prof in tilt-iid tilt-iid-worse; do
80
+ for patt in 4x5KB+1x38KB 2x5KB+1x24KB 1x5KB+1x14KB; do
81
+ rosotacom benchmark probe \
82
+ --project src/rosotacom/resources/examples/rosotacom.yaml \
83
+ --profile "$prof" --size-pattern "$patt" --rate-hz 10 --duration 240 \
84
+ --repeats 1 --sudo-mode container --no-plot
85
+ done
86
+ done
87
+ ```
88
+
89
+ Split each run's transit rows by size class and divide the large class's losses
90
+ by the window in seconds. Within one link the three patterns must agree on that
91
+ rate to within about a quarter; between the two links it must roughly double.
92
+
93
+ ## Status
94
+
95
+ confirmed, 2026-08-31.
96
+
97
+ ## Publication notes
98
+
99
+ This is the bench form of a field result that reads, without it, like an
100
+ excuse. A campaign that shortened its group of pictures and then measured no
101
+ improvement in the aggregate can attribute that to the link having been worse
102
+ on the days that followed — which is true and unsatisfying, because it is
103
+ unfalsifiable from one campaign. Here the link is held still by construction
104
+ and the aggregate still does not move, so the cancellation is a property of the
105
+ lever rather than of those evenings.
106
+
107
+ Stated positively, it is the sentence that makes the design rule usable: the
108
+ fragment law tells you what will change and by how much, and the thing it
109
+ changes is not the thing an operator counts. For a video path the honest
110
+ formulation is that a shorter group trades hole *length* against hole *count*
111
+ at constant link, and pays for it in nothing — the offered bandwidth falls by
112
+ about a fifth at the same cadence and quality target.
113
+
114
+ The 2× row is the other half and belongs with it wherever the rule is offered
115
+ as advice: the term the designer does not control moved the outcome by more
116
+ than the term they do.
@@ -0,0 +1,182 @@
1
+ # Neither A Queue Nor A Burst Tilts The Size Law
2
+
3
+ ## Claim
4
+
5
+ The field fit of `1-(1-p)^N` carries a residual that is systematic in size: the
6
+ smallest class loses about half of what the fit predicts and the largest about
7
+ 2.9× more, a spread of roughly six across the ladder. Three candidate causes
8
+ were emulated against the same measurement chain, and none of them produces it.
9
+
10
+ | | 300 B | 1.1 kB | 3.1 kB | 6.1 kB | 12.1 kB | 38.1 kB |
11
+ |---|---:|---:|---:|---:|---:|---:|
12
+ | independent per packet | 1.05 % | 1.47 % | 3.47 % | 6.28 % | 11.23 % | 31.92 % |
13
+ | a two-state process, same mean, 105 ms bad runs | 1.47 % | 1.76 % | 2.76 % | 5.09 % | 10.00 % | **21.98 %** |
14
+ | + a token bucket a burst can fill (4 Mbit/s) | 1.14 % | 1.33 % | 2.57 % | 4.99 % | 13.43 % | 32.92 % |
15
+ | a serialisation constraint (1.5 Mbit/s) | — | 1.62 % | — | — | 11.60 % | **97.54 %** |
16
+
17
+ - **The chain is not the cause.** Under independent per-packet loss the fitted
18
+ law is reproduced with residuals of 1.20, 0.85, 1.01, 1.06, 0.97 and 1.00 —
19
+ flat over three decades of size. Whatever tilts the field, it is not the
20
+ wrapper, the join, or the way the fit is taken.
21
+ - **Clustered loss is not the cause, and it bends the curve the other way.**
22
+ A two-state process at the same 1 % mean, with its chain rescaled per cell so
23
+ that a bad run is the same 105 ms of wall clock in every one of them, makes
24
+ the largest class lose **31 % less** than the independent law rather than
25
+ more: 21.98 % against 31.92 %, intervals 20.3–23.8 against 30.0–33.9. The
26
+ reason is the one that makes it a mechanism rather than a coincidence — a
27
+ 38-packet message occupies about the length of one bad run, so its packets
28
+ share a fate and the message is lost once instead of thirty-eight times
29
+ independently. The field's residual has the opposite sign, so burstiness at
30
+ this scale does not explain it; it makes it harder to explain.
31
+ - **A burst meeting a queue is not the cause.** A token bucket at 4 Mbit/s —
32
+ above the largest class's mean offered rate of 3.0 Mbit/s and far below its
33
+ instantaneous one, so a 38-packet message meets a queue and a 1-packet
34
+ message does not — changes nothing systematic: 1.09, 0.90, 0.74, 0.80, 1.20,
35
+ 1.03 against the unqueued arm. The queue defers rather than drops, which is
36
+ the same statement as
37
+ [oversubscription queues, it does not lose](oversubscription-queues-not-losses.md),
38
+ seen per size.
39
+ - **A serialisation constraint does not tilt it either — it removes the class.**
40
+ At 1.5 Mbit/s the one-packet message pays 10 % more than unshaped and the
41
+ 13-packet message 3 % more, while the 38-packet message goes from 31.9 % to
42
+ **97.5 %**. That is not a slope, it is a threshold: below the constraint
43
+ nothing changes, above it the stream is gone.
44
+
45
+ The last row is worth naming for what it is *shaped* like. A link whose
46
+ transmission opportunities are a fraction of the wall clock presents from above
47
+ as exactly this — a small probe crossing unharmed while a large burst does not
48
+ — which is the signature an uplink moved onto a duty-cycled carrier would leave
49
+ in an application's own numbers. This reproduces the signature; it does not
50
+ demonstrate the mechanism, because a sustained rate cap and a duty cycle are
51
+ not the same thing and this cell is oversubscribed on the mean as well as on
52
+ the burst.
53
+
54
+ ## Setup
55
+
56
+ - Host pair / topology: one host, the packaged local benchmark rig — two
57
+ communication containers on their own Docker network, `tc` inside each
58
+ container's own netns (`--sudo-mode container`).
59
+ - Session: `bench_1_1_capacity` from the packaged example project, one
60
+ `a->b:/bench_capacity` stream at 10 Hz, CycloneDDS, OTA QoS best_effort /
61
+ KEEP_LAST depth 1.
62
+ - rosotacom SHA: measured at `7bb420c`; needs 2.5.dev74 or later for the fitted
63
+ delay table to arm at all.
64
+ - Profiles: `tilt-iid`, `tilt-iid-queued` and `tilt-iid-tight` in
65
+ [`src/rosotacom/resources/examples/profiles.yaml`](../../src/rosotacom/resources/examples/profiles.yaml).
66
+ All three carry the 2026-08-17 drive's own delay table at 25 ms ± 18 ms and
67
+ 1 % independent per-packet loss; they differ only in the rate cap in front of
68
+ it — none, 4 Mbit/s, 1.5 Mbit/s.
69
+ - Seed policy: netem `loss` is unseeded, `n=1` per cell, about 2100 messages
70
+ inside the measured window of each.
71
+
72
+ ## Evidence
73
+
74
+ Evidence grade: per-message counts from the receiving peer's own RFC 0003
75
+ transit records, windowed in sequence numbers (first 300 and last 50 dropped)
76
+ so that the unshaped messages before the shaper is armed leave both the
77
+ delivered and the lost class at once.
78
+
79
+ The independent arm, with one `(p, F)` fitted by maximum likelihood over the
80
+ whole ladder (`p = 0.870 %` per packet, `F = 872 B`):
81
+
82
+ | wrapped | N | offered | lost | observed | 95 % CI | obs/pred |
83
+ |---:|---:|---:|---:|---:|---:|---:|
84
+ | 300 B | 1 | 2101 | 22 | 1.047 % | 0.69–1.58 | 1.20 |
85
+ | 1.1 kB | 2 | 2102 | 31 | 1.475 % | 1.04–2.09 | 0.85 |
86
+ | 3.1 kB | 4 | 2105 | 73 | 3.468 % | 2.77–4.34 | 1.01 |
87
+ | 6.1 kB | 7 | 2103 | 132 | 6.277 % | 5.32–7.40 | 1.06 |
88
+ | 12.1 kB | 14 | 2102 | 236 | 11.227 % | 9.95–12.65 | 0.97 |
89
+ | 38.1 kB | 44 | 2102 | 671 | 31.922 % | 29.96–33.95 | 1.00 |
90
+
91
+ The queued arm on the same ladder: 24, 28, 54, 105, 283 and 693 losses of about
92
+ 2100 offered, giving the second row of the claim table. The tight arm: 34 of
93
+ 2104, 244 of 2103, and 1826 of 1872.
94
+
95
+ **Measuring the two-state arm took two attempts, and the reason is worth
96
+ recording.** `netem`'s Gilbert–Elliott model advances its chain once per
97
+ *packet*, not once per second, so a size ladder at a fixed message rate runs the
98
+ chain at a different speed in every cell — 10 packets/s for a one-fragment
99
+ message against 380 for a 38-fragment one. The cells then do not share a loss
100
+ process. The arm measured that way duly reported a per-packet mean of 0.33 % in
101
+ its smallest cell against a stationary 1.00 %, because that cell never sampled
102
+ enough of the chain.
103
+
104
+ Holding the offered *packet* rate constant instead was the obvious fix and it
105
+ measured something else entirely: **the pipeline serves messages, not packets.**
106
+ At 60 messages/s the one-packet cell lost 10.774 % under the bursty profile and
107
+ 10.626 % under the independent one, and at 380 messages/s 48.391 % and 48.430 %.
108
+ Two different loss processes cannot agree to three digits; what both were
109
+ reporting is the depth-1 OTA queue overwriting its own backlog before the link
110
+ sees it. That is the depth-1 overwrite of bundled publications, which the
111
+ operator harness's ledger records against a real drive, reached here by
112
+ accident and against a synthetic one.
113
+
114
+ What works is to leave the message rate at the field's 10 Hz and rescale the
115
+ chain: multiplying `p` and `r` by `380/(N × 10)` in each cell leaves the
116
+ stationary bad fraction at 3.92 % and the mean loss at 1 % while making the bad
117
+ run 105 ms of wall clock everywhere, which is the drive's own figure. The six
118
+ `bp-frag-*` profiles are that ladder.
119
+
120
+ Verification: manual, from a source checkout with Docker:
121
+
122
+ ```bash
123
+ for prof in tilt-iid tilt-iid-queued; do
124
+ for size in 200 1000 3000 6000 12000 38000; do
125
+ rosotacom benchmark probe \
126
+ --project src/rosotacom/resources/examples/rosotacom.yaml \
127
+ --profile "$prof" --size "$size" --rate-hz 10 --duration 240 \
128
+ --repeats 1 --sudo-mode container --no-plot
129
+ done
130
+ done
131
+ rosotacom benchmark probe --project src/rosotacom/resources/examples/rosotacom.yaml \
132
+ --profile tilt-iid-tight --size 38000 --rate-hz 10 --duration 240 \
133
+ --repeats 1 --sudo-mode container --no-plot
134
+ ```
135
+
136
+ ```bash
137
+ for pair in 200:one 1000:two 3000:four 6000:six 12000:twelve 38000:thirtyeight; do
138
+ rosotacom benchmark probe \
139
+ --project src/rosotacom/resources/examples/rosotacom.yaml \
140
+ --profile "bp-frag-${pair##*:}" --size "${pair%%:*}" --rate-hz 10 \
141
+ --duration 240 --repeats 1 --sudo-mode container --no-plot
142
+ done
143
+ ```
144
+
145
+ The independent ladder must fit one `(p, F)` to within about ten per cent at
146
+ every point; the queued ladder must not differ from it systematically; the
147
+ rescaled two-state ladder must fall below it at the large end and not above; and
148
+ the tight cell at 38 kB must be near-total loss while its 1 kB cell is not.
149
+
150
+ ## Status
151
+
152
+ confirmed, 2026-08-31.
153
+
154
+ ## Publication notes
155
+
156
+ This is a set of negative results and the negative is the point: a residual
157
+ that survives three plausible explanations is worth more than one that has not
158
+ been attacked. What it licenses is a narrower claim than "we do not know why" —
159
+ the tilt is not an artefact of the accounting, it is not what a queue does to a
160
+ burst, and it is not a serialisation limit, because a serialisation limit does
161
+ not tilt a curve, it truncates it.
162
+
163
+ The clustered arm is the one that changes the reading rather than confirming
164
+ it. A reviewer's first guess for a size-systematic residual is burstiness, and
165
+ burstiness at the drive's own time scale produces the **opposite sign**: it
166
+ protects large messages, because a message long enough to span a bad run is lost
167
+ once rather than in each of its packets. So the field's residual is not
168
+ explained by the mechanism that the field's own two-layer model already
169
+ contains, which is worth saying out loud.
170
+
171
+ What is left to attack is correlation at a scale *shorter* than a large
172
+ message's own time on the wire — short enough that a message straddles a loss
173
+ event more often than a single packet does, without its packets sharing one.
174
+ `netem` cannot express that at all: its chain advances per packet, so a run is
175
+ always measured in packets rather than in milliseconds, and the two coincide
176
+ only at one message size.
177
+
178
+ The serialisation row deserves one sentence wherever a duty-cycled uplink is
179
+ discussed. It shows that the observable signature of such a link — small
180
+ messages unaffected, large messages gone, round-trip time unchanged — is
181
+ reproducible from a rate constraint alone, which means the signature on its own
182
+ does not identify the mechanism.
@@ -0,0 +1,140 @@
1
+ # The Size Law Belongs To The Transport, Not To The Link
2
+
3
+ ## Claim
4
+
5
+ On one emulated link, with the impairment held byte-identical and only the OTA
6
+ middleware changed, message loss against message size takes three different
7
+ shapes:
8
+
9
+ | wrapped size | fragments | CycloneDDS | Fast DDS | zenoh native |
10
+ |---:|---:|---:|---:|---:|
11
+ | 300 B | 1 | 1.05 % | 1.05 % | 0.57 % |
12
+ | 1.1 kB | 2 | 1.47 % | 1.14 % | 1.00 % |
13
+ | 3.1 kB | 4 | 3.47 % | 3.80 % | 0.71 % |
14
+ | 6.1 kB | 7 | 6.28 % | 4.81 % | 1.00 % |
15
+ | 12.1 kB | 13 | 11.23 % | 8.74 % | **0.47 %** |
16
+ | 38.1 kB | 38 | 31.92 % | 39.25 % | **61.69 %** |
17
+
18
+ **CycloneDDS follows `1-(1-p)^N` and nothing else.** Fitting one per-packet
19
+ rate and one effective packet size over the whole ladder leaves residuals of
20
+ 1.20, 0.85, 1.01, 1.06, 0.97 and 1.00 — flat across three decades of size and
21
+ a factor of 44 in packet count, with no trend.
22
+
23
+ **Fast DDS keeps the form and loses the fit.** It carries no RTPS fragment size
24
+ at all, so the effective packet is the datagram; one `(p, F)` describes the
25
+ ladder to within 0.71–1.14, and the misfit is systematic rather than noise
26
+ (at 12 kB the Wilson interval is 7.61–10.02 % against a predicted 12.32 %).
27
+
28
+ **zenoh does not obey the law.** Its loss is flat at 0.5–1.0 % from 300 B to
29
+ 12 kB — a 13-packet message loses what a 1-packet message loses, which is what
30
+ a transport that repairs its own losses looks like — and then falls off a cliff
31
+ to 61.7 % at 38 kB, where the offered rate leaves the regime the repair can
32
+ carry.
33
+
34
+ So the transfer function this project reports from the field is not a property
35
+ of the link. It is what a **best-effort, fragmenting, unrepaired** transport
36
+ does to a link, and the same link answers a repairing transport completely
37
+ differently. Any design rule of the form *a stream's availability follows from
38
+ its largest message class* carries that scope with it.
39
+
40
+ ## Setup
41
+
42
+ - Host pair / topology: one host, the packaged local benchmark rig — two
43
+ communication containers on their own Docker network, `tc` inside each
44
+ container's own netns (`--sudo-mode container`), no host privileges.
45
+ - Session: `bench_1_1_capacity` from the packaged example project, one
46
+ `a->b:/bench_capacity` stream at 10 Hz, OTA QoS best_effort / KEEP_LAST
47
+ depth 1, `--rmw` the only thing that differs between the three ladders.
48
+ - rosotacom SHA: measured at `7bb420c`; re-runs record theirs. The runs need
49
+ 2.5.dev74 or later, because before it a profile carrying a fitted delay table
50
+ could not be armed at all
51
+ ([a fitted delay table never reached the shaper](a-fitted-delay-table-never-reached-the-shaper.md)).
52
+ - Profile: `tilt-iid` in
53
+ [`src/rosotacom/resources/examples/profiles.yaml`](../../src/rosotacom/resources/examples/profiles.yaml)
54
+ — the 2026-08-17 drive's own delay table at 25 ms ± 18 ms, with independent
55
+ per-packet loss raised to 1 % so that a 240 s run resolves the one-packet
56
+ cell. The *form* of the law is under test, and it does not depend on the
57
+ level.
58
+ - Seed policy: netem `loss` is unseeded; each cell offers about 2100 messages
59
+ inside the measured window, so the Wilson intervals in the table below carry
60
+ the run-to-run spread. `n=1` per cell.
61
+
62
+ ## Evidence
63
+
64
+ Evidence grade: per-message counts read from the **receiving** peer's own RFC
65
+ 0003 transit records, not from the runner's summary — a summary over rows from
66
+ two observers is exactly what has been wrong in this harness before
67
+ ([sender rows](sender-rows-make-a-dead-link-look-loss-free.md)). The window is
68
+ taken in sequence numbers (first 300, last 50 dropped), because a lost row
69
+ carries no timestamp of its own and the shaper is armed after discovery.
70
+
71
+ CycloneDDS, one `(p, F)` fitted by maximum likelihood over the whole ladder —
72
+ `p = 0.870 %` per packet, `F = 1008–872 B` against a declared 1024 B fragment,
73
+ the difference being the per-packet header the fragment size does not count:
74
+
75
+ | wrapped | N | offered | lost | observed | 95 % CI | predicted | obs/pred |
76
+ |---:|---:|---:|---:|---:|---:|---:|---:|
77
+ | 300 B | 1 | 2101 | 22 | 1.047 % | 0.69–1.58 | 0.870 % | 1.20 |
78
+ | 1.1 kB | 2 | 2102 | 31 | 1.475 % | 1.04–2.09 | 1.733 % | 0.85 |
79
+ | 3.1 kB | 4 | 2105 | 73 | 3.468 % | 2.77–4.34 | 3.435 % | 1.01 |
80
+ | 6.1 kB | 7 | 2103 | 132 | 6.277 % | 5.32–7.40 | 5.934 % | 1.06 |
81
+ | 12.1 kB | 14 | 2102 | 236 | 11.227 % | 9.95–12.65 | 11.515 % | 0.97 |
82
+ | 38.1 kB | 44 | 2102 | 671 | 31.922 % | 29.96–33.95 | 31.921 % | 1.00 |
83
+
84
+ Fast DDS on the identical profile, `p = 1.306 %`, `F = 1224 B`: 0.80, 0.87,
85
+ 0.98, 0.76, **0.71**, **1.14**. The two ends of the ladder sit on opposite
86
+ sides of the fit and their intervals exclude it, so a single effective packet
87
+ size does not describe this stack.
88
+
89
+ zenoh native on the identical profile: 0.571, 0.998, 0.712, 0.996, 0.475,
90
+ **61.693 %**. No fit is reported because there is nothing of this family to
91
+ fit — five points are flat and the sixth is a cliff.
92
+
93
+ **The effective packet is smaller than the fragment, and by a measurable
94
+ amount.** CycloneDDS's fitted `F` lands at 872–1008 B against a configured
95
+ 1024 B fragment, i.e. every packet carries roughly 15 % of itself in headers.
96
+ That is the same quantity as the wire-to-payload ratio measured on the tunnel
97
+ (1.13–1.17×), reached from the opposite direction: one from counting bytes on
98
+ an interface, one from fitting a loss curve.
99
+
100
+ Verification: manual, and it needs a source checkout with Docker:
101
+
102
+ ```bash
103
+ for size in 200 1000 3000 6000 12000 38000; do
104
+ for rmw in cyclone fastdds zenoh; do
105
+ rosotacom benchmark probe \
106
+ --project src/rosotacom/resources/examples/rosotacom.yaml \
107
+ --profile tilt-iid --size "$size" --rate-hz 10 --duration 240 \
108
+ --repeats 1 --rmw "$rmw" --sudo-mode container --no-plot
109
+ done
110
+ done
111
+ ```
112
+
113
+ Read the per-size counts from `logs/b/status/events.jsonl` of each instance
114
+ (`kind: transit`, `status` delivered or lost, `size_bytes` on the delivered
115
+ rows) rather than from `result.json`. The CycloneDDS ladder must fit one
116
+ `(p, F)` to within about ten per cent at every point; the zenoh ladder must be
117
+ flat below 12 kB.
118
+
119
+ ## Status
120
+
121
+ confirmed, 2026-08-31.
122
+
123
+ ## Publication notes
124
+
125
+ The useful sentence is the scope one. `1-(1-p)^N` is textbook and the field fit
126
+ of it is a real result, but reporting it without naming the transport invites
127
+ the reading that it describes the *link*. It does not: on one link, at one
128
+ impairment, three transports produce a clean power law, a distorted one, and no
129
+ law at all. A paper that quotes a per-fragment rate should therefore quote the
130
+ middleware and its QoS beside it, and a design rule derived from the law should
131
+ say that it holds for a best-effort path that fragments and does not repair.
132
+
133
+ Two smaller points travel with it. The **effective packet is not the fragment**:
134
+ the fitted size falls about 15 % below the configured one, which is the header
135
+ share, and it is the same 15 % an interface counter reports as wire-over-payload
136
+ — so a fragment budget computed from the configured size understates exposure
137
+ by that much. And zenoh's shape is the more interesting half of the comparison
138
+ rather than a footnote: a transport that repairs turns a size-dependent
139
+ availability problem into a capacity cliff, which is a different failure to
140
+ design against, not a smaller one.
@@ -169,3 +169,150 @@ profiles:
169
169
  # camera stream - a source-side case. Deliberately unshaped: play the case
170
170
  # bag with `--profile none` to see that the link is not the cause.
171
171
  field-20260817-case6-source-gap: {}
172
+
173
+ # ---- fragment-law tilt (B1): three loss processes, one delay model -------
174
+ # The field fit says message loss follows 1-(1-p)^ceil(size/F) and the field
175
+ # residual is systematic in size: the smallest class loses about half of what
176
+ # the fit predicts and the largest about 2.9x more. The campaign cannot
177
+ # separate an accounting artefact from a property of the link. These three
178
+ # can: the delay model is the drive's own table in all of them, and the only
179
+ # thing that moves is how the loss is distributed over packets.
180
+ #
181
+ # The rate is raised to ~1% per packet in every arm so a 240 s run at 10 Hz
182
+ # resolves the small end; the law's *form* is what is under test, and it does
183
+ # not depend on the level.
184
+
185
+ # A -- independent per packet. The law is exact by construction here, so this
186
+ # arm measures the measurement chain and nothing else.
187
+ tilt-iid:
188
+ uplink:
189
+ delay: 25ms
190
+ jitter: 18ms
191
+ distribution: field-20260817
192
+ distribution_file: dist/field-20260817.dist
193
+ loss: 1%
194
+ downlink: { delay: 7ms, jitter: 5ms }
195
+
196
+ # B -- the drive's own two-state process, scaled to the same mean. Clustering
197
+ # correlates the fragments of one message, so large messages should lose
198
+ # *less* than the independent law predicts -- the opposite sign to the field.
199
+ # p and r are the drive's, so the runs and gaps keep their measured lengths.
200
+ tilt-bursty:
201
+ uplink:
202
+ delay: 25ms
203
+ jitter: 18ms
204
+ distribution: field-20260817
205
+ distribution_file: dist/field-20260817.dist
206
+ loss_gemodel: { p: 0.102%, r: 2.5%, loss_bad: 13.5%, loss_good: 0.49% }
207
+ downlink: { delay: 7ms, jitter: 5ms }
208
+
209
+ # C -- A plus a queue a burst can fill. 4 Mbit/s is above the largest class's
210
+ # mean offered rate (38 kB at 10 Hz is ~3.0 Mbit/s of payload) and below its
211
+ # instantaneous one, so a 38-fragment message meets a queue and a 1-fragment
212
+ # message does not. That is the burst-tilt candidate, isolated.
213
+ tilt-iid-queued:
214
+ uplink:
215
+ rate: 4mbit
216
+ delay: 25ms
217
+ jitter: 18ms
218
+ distribution: field-20260817
219
+ distribution_file: dist/field-20260817.dist
220
+ loss: 1%
221
+ downlink: { delay: 7ms, jitter: 5ms }
222
+
223
+ # B2 -- the boundary of the design rule. Same delay model, two per-fragment
224
+ # rates: the one the rule is applied at, and one twice as bad. The rule says
225
+ # what the size distribution does; it does not say what the link will be.
226
+ tilt-iid-worse:
227
+ uplink:
228
+ delay: 25ms
229
+ jitter: 18ms
230
+ distribution: field-20260817
231
+ distribution_file: dist/field-20260817.dist
232
+ loss: 2%
233
+ downlink: { delay: 7ms, jitter: 5ms }
234
+
235
+ # B4 -- a serialisation constraint tight enough that a burst cannot fit in
236
+ # its own send interval, which is the shape an EN-DC uplink on a TDD carrier
237
+ # would present from above: a small probe survives what a 38-fragment burst
238
+ # does not.
239
+ tilt-iid-tight:
240
+ uplink:
241
+ rate: 1.5mbit
242
+ delay: 25ms
243
+ jitter: 18ms
244
+ distribution: field-20260817
245
+ distribution_file: dist/field-20260817.dist
246
+ loss: 1%
247
+ downlink: { delay: 7ms, jitter: 5ms }
248
+
249
+ # B1-prime -- the two-state process with its chain rescaled per cell.
250
+ #
251
+ # netem advances a Gilbert-Elliott chain once per *packet*, so the fitted p
252
+ # and r describe a process in packets and not in time. At the drive's own
253
+ # 380 fragments/s they mean a bad run of about 105 ms; on a size ladder at a
254
+ # fixed 10 Hz the packet rate is N x 10, so the same p and r stretch the bad
255
+ # run by 380/(N x 10) and every cell meets a different link. Forcing the
256
+ # packet rate constant instead was tried and measured the wrong thing: the
257
+ # pipeline serves messages, not packets, and at 60 messages/s the depth-1 OTA
258
+ # queue overwrites its own backlog -- both loss processes then reported
259
+ # 10.7 % to two digits.
260
+ #
261
+ # So the chain is rescaled instead: p and r are multiplied by 380/(N x 10) in
262
+ # each cell, which leaves the stationary bad fraction at 3.92 % and the mean
263
+ # loss at 1 % while making the bad run 105 ms of wall clock everywhere. The
264
+ # comparison against `tilt-iid` is then a comparison of one thing.
265
+
266
+ bp-frag-one:
267
+ uplink:
268
+ delay: 25ms
269
+ jitter: 18ms
270
+ distribution: field-20260817
271
+ distribution_file: dist/field-20260817.dist
272
+ loss_gemodel: { p: 3.876%, r: 95%, loss_bad: 13.5%, loss_good: 0.49% }
273
+ downlink: { delay: 7ms, jitter: 5ms }
274
+
275
+ bp-frag-two:
276
+ uplink:
277
+ delay: 25ms
278
+ jitter: 18ms
279
+ distribution: field-20260817
280
+ distribution_file: dist/field-20260817.dist
281
+ loss_gemodel: { p: 1.938%, r: 47.5%, loss_bad: 13.5%, loss_good: 0.49% }
282
+ downlink: { delay: 7ms, jitter: 5ms }
283
+
284
+ bp-frag-four:
285
+ uplink:
286
+ delay: 25ms
287
+ jitter: 18ms
288
+ distribution: field-20260817
289
+ distribution_file: dist/field-20260817.dist
290
+ loss_gemodel: { p: 0.969%, r: 23.75%, loss_bad: 13.5%, loss_good: 0.49% }
291
+ downlink: { delay: 7ms, jitter: 5ms }
292
+
293
+ bp-frag-six:
294
+ uplink:
295
+ delay: 25ms
296
+ jitter: 18ms
297
+ distribution: field-20260817
298
+ distribution_file: dist/field-20260817.dist
299
+ loss_gemodel: { p: 0.646%, r: 15.83%, loss_bad: 13.5%, loss_good: 0.49% }
300
+ downlink: { delay: 7ms, jitter: 5ms }
301
+
302
+ bp-frag-twelve:
303
+ uplink:
304
+ delay: 25ms
305
+ jitter: 18ms
306
+ distribution: field-20260817
307
+ distribution_file: dist/field-20260817.dist
308
+ loss_gemodel: { p: 0.323%, r: 7.917%, loss_bad: 13.5%, loss_good: 0.49% }
309
+ downlink: { delay: 7ms, jitter: 5ms }
310
+
311
+ bp-frag-thirtyeight:
312
+ uplink:
313
+ delay: 25ms
314
+ jitter: 18ms
315
+ distribution: field-20260817
316
+ distribution_file: dist/field-20260817.dist
317
+ loss_gemodel: { p: 0.102%, r: 2.5%, loss_bad: 13.5%, loss_good: 0.49% }
318
+ downlink: { delay: 7ms, jitter: 5ms }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rosotacom-dev
3
- Version: 2.5.dev75
3
+ Version: 2.5.dev77
4
4
  Summary: Host CLI for ROS OTA communication sessions.
5
5
  Author: develNor
6
6
  License-Expression: BSD-3-Clause
@@ -63,6 +63,7 @@ docs/testing.md
63
63
  docs/work-items.md
64
64
  docs/findings/README.md
65
65
  docs/findings/a-fitted-delay-table-never-reached-the-shaper.md
66
+ docs/findings/a-shorter-group-does-not-lose-fewer-key-frames.md
66
67
  docs/findings/a-transport-element-doubles-every-fastdds-sample.md
67
68
  docs/findings/cyclone-fragment-equal-to-max-drops-fragmented-samples.md
68
69
  docs/findings/cyclone-spdp-discovery-bursts.md
@@ -74,10 +75,12 @@ docs/findings/jitter-loss-bandwidth-latency.md
74
75
  docs/findings/keyframe-loss-kills-the-next-deltas.md
75
76
  docs/findings/lifespan-is-enforced-by-one-reader-and-not-the-other.md
76
77
  docs/findings/lighter-message-loss.md
78
+ docs/findings/neither-a-queue-nor-a-burst-tilts-the-size-law.md
77
79
  docs/findings/one-domain-two-cyclone-configs-stop-interoperating.md
78
80
  docs/findings/oversubscription-queues-not-losses.md
79
81
  docs/findings/reorder-becomes-reader-loss.md
80
82
  docs/findings/sender-rows-make-a-dead-link-look-loss-free.md
83
+ docs/findings/the-size-law-belongs-to-the-transport-not-the-link.md
81
84
  docs/findings/zero-loss-boundaries-18kb-20hz.md
82
85
  docs/findings/repro/decode_chain_repro.py
83
86
  docs/findings/repro/reorder_drop_repro.py
@@ -47,6 +47,7 @@
47
47
  "docs/ffmpeg-keyframes.md",
48
48
  "docs/findings/README.md",
49
49
  "docs/findings/a-fitted-delay-table-never-reached-the-shaper.md",
50
+ "docs/findings/a-shorter-group-does-not-lose-fewer-key-frames.md",
50
51
  "docs/findings/a-transport-element-doubles-every-fastdds-sample.md",
51
52
  "docs/findings/cyclone-fragment-equal-to-max-drops-fragmented-samples.md",
52
53
  "docs/findings/cyclone-spdp-discovery-bursts.md",
@@ -58,12 +59,14 @@
58
59
  "docs/findings/keyframe-loss-kills-the-next-deltas.md",
59
60
  "docs/findings/lifespan-is-enforced-by-one-reader-and-not-the-other.md",
60
61
  "docs/findings/lighter-message-loss.md",
62
+ "docs/findings/neither-a-queue-nor-a-burst-tilts-the-size-law.md",
61
63
  "docs/findings/one-domain-two-cyclone-configs-stop-interoperating.md",
62
64
  "docs/findings/oversubscription-queues-not-losses.md",
63
65
  "docs/findings/reorder-becomes-reader-loss.md",
64
66
  "docs/findings/repro/decode_chain_repro.py",
65
67
  "docs/findings/repro/reorder_drop_repro.py",
66
68
  "docs/findings/sender-rows-make-a-dead-link-look-loss-free.md",
69
+ "docs/findings/the-size-law-belongs-to-the-transport-not-the-link.md",
67
70
  "docs/findings/zero-loss-boundaries-18kb-20hz.md",
68
71
  "docs/forensics-report.md",
69
72
  "docs/geo-link-map.md",