rosotacom-dev 2.5.dev74__tar.gz → 2.5.dev76__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.dev74 → rosotacom_dev-2.5.dev76}/PKG-INFO +1 -1
  2. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/budgets.jsonl +1 -1
  3. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/docs/findings/README.md +3 -0
  4. rosotacom_dev-2.5.dev76/docs/findings/a-shorter-group-does-not-lose-fewer-key-frames.md +116 -0
  5. rosotacom_dev-2.5.dev76/docs/findings/neither-a-queue-nor-a-burst-tilts-the-size-law.md +139 -0
  6. rosotacom_dev-2.5.dev76/docs/findings/the-size-law-belongs-to-the-transport-not-the-link.md +140 -0
  7. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/examples/profiles.yaml +76 -0
  8. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom_dev.egg-info/PKG-INFO +1 -1
  9. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom_dev.egg-info/SOURCES.txt +3 -0
  10. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom_dev.egg-info/scm_file_list.json +3 -0
  11. rosotacom_dev-2.5.dev76/src/rosotacom_dev.egg-info/scm_version.json +8 -0
  12. rosotacom_dev-2.5.dev74/src/rosotacom_dev.egg-info/scm_version.json +0 -8
  13. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/.devcontainer/devcontainer.json.template +0 -0
  14. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/.devcontainer/re_generate_devcontainer_json.py +0 -0
  15. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/.github/CODEOWNERS +0 -0
  16. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/.github/ISSUE_TEMPLATE/documentation-audit.md +0 -0
  17. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/.github/ISSUE_TEMPLATE/implementation-cleanup.md +0 -0
  18. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/.github/ISSUE_TEMPLATE/quality-workflow.md +0 -0
  19. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/.github/ISSUE_TEMPLATE/redesign.md +0 -0
  20. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/.github/ISSUE_TEMPLATE/release-process.md +0 -0
  21. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/.github/ISSUE_TEMPLATE/repository-diagnosis.md +0 -0
  22. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/.github/ISSUE_TEMPLATE/test-ci-audit.md +0 -0
  23. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/.github/ISSUE_TEMPLATE/work-item.md +0 -0
  24. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  25. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/.github/actions/setup-just/action.yml +0 -0
  26. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/.github/dependabot.yml +0 -0
  27. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/.github/workflows/benchmark-calibrate.yml +0 -0
  28. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/.github/workflows/benchmark-gate.yml +0 -0
  29. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/.github/workflows/dev-release.yml +0 -0
  30. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/.github/workflows/image-scan.yml +0 -0
  31. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/.github/workflows/nightly-e2e.yml +0 -0
  32. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/.github/workflows/pr-lightweight.yml +0 -0
  33. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/.github/workflows/pr-merge-gate.yml +0 -0
  34. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/.github/workflows/release.yml +0 -0
  35. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/.pre-commit-config.yaml +0 -0
  36. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/AGENTS.md +0 -0
  37. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/CONCURRENCY.md +0 -0
  38. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/CONTRIBUTING.md +0 -0
  39. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/DEVELOPMENT_PRINCIPLES.md +0 -0
  40. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/LICENSE.txt +0 -0
  41. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/MANIFEST.in +0 -0
  42. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/README.md +0 -0
  43. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/calibration/README.md +0 -0
  44. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/calibration/capacity-size-tight-cyclone.json +0 -0
  45. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/calibration/probe-loss-gop-tight-cyclone.json +0 -0
  46. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/calibration/probe-loss-nominal-cyclone.json +0 -0
  47. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/calibration/probe-loss-tight-cyclone.json +0 -0
  48. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/calibration/probe-loss-tight-fastdds.json +0 -0
  49. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/calibration/probe-loss-tight-zenoh.json +0 -0
  50. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/codecov.yml +0 -0
  51. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/deployment-configuration.md +0 -0
  52. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/docs/benchmark-ab.md +0 -0
  53. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/docs/benchmark-bag-as-load.md +0 -0
  54. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/docs/ci.md +0 -0
  55. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/docs/ffmpeg-keyframes.md +0 -0
  56. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/docs/findings/a-fitted-delay-table-never-reached-the-shaper.md +0 -0
  57. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/docs/findings/a-transport-element-doubles-every-fastdds-sample.md +0 -0
  58. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/docs/findings/cyclone-fragment-equal-to-max-drops-fragmented-samples.md +0 -0
  59. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/docs/findings/cyclone-spdp-discovery-bursts.md +0 -0
  60. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/docs/findings/delay-alone-no-loss.md +0 -0
  61. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/docs/findings/fastdds-datagram-cap-drops-large-samples.md +0 -0
  62. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/docs/findings/graph-derived-types-block-a-non-graph-transport.md +0 -0
  63. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/docs/findings/head-of-line-irregularity.md +0 -0
  64. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/docs/findings/jitter-loss-bandwidth-latency.md +0 -0
  65. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/docs/findings/keyframe-loss-kills-the-next-deltas.md +0 -0
  66. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/docs/findings/lifespan-is-enforced-by-one-reader-and-not-the-other.md +0 -0
  67. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/docs/findings/lighter-message-loss.md +0 -0
  68. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/docs/findings/one-domain-two-cyclone-configs-stop-interoperating.md +0 -0
  69. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/docs/findings/oversubscription-queues-not-losses.md +0 -0
  70. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/docs/findings/reorder-becomes-reader-loss.md +0 -0
  71. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/docs/findings/repro/decode_chain_repro.py +0 -0
  72. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/docs/findings/repro/reorder_drop_repro.py +0 -0
  73. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/docs/findings/sender-rows-make-a-dead-link-look-loss-free.md +0 -0
  74. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/docs/findings/zero-loss-boundaries-18kb-20hz.md +0 -0
  75. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/docs/forensics-report.md +0 -0
  76. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/docs/geo-link-map.md +0 -0
  77. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/docs/github-repository-settings.md +0 -0
  78. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/docs/link-bandwidth.md +0 -0
  79. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/docs/link-trace.md +0 -0
  80. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/docs/ota-pcap.md +0 -0
  81. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/docs/owner-runbook.md +0 -0
  82. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/docs/performance-bands.md +0 -0
  83. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/docs/playbooks/README.md +0 -0
  84. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/docs/quality-model.md +0 -0
  85. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/docs/release-notes/TEMPLATE.md +0 -0
  86. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/docs/release-notes/v2.1.md +0 -0
  87. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/docs/release-notes/v2.2.md +0 -0
  88. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/docs/release-notes/v2.3.md +0 -0
  89. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/docs/release-notes/v2.4.md +0 -0
  90. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/docs/release.md +0 -0
  91. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/docs/rfcs/0001-expectation-driven-test-suite.md +0 -0
  92. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/docs/rfcs/0002-expectation-concepts.md +0 -0
  93. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/docs/rfcs/0003-metric-backbone.md +0 -0
  94. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/docs/rfcs/0004-network-profiles.md +0 -0
  95. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/docs/rfcs/0005-benchmark-genres-and-ci.md +0 -0
  96. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/docs/rfcs/0006-dynamic-qos.md +0 -0
  97. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/docs/rfcs/0007-regression-gate.md +0 -0
  98. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/docs/rfcs/README.md +0 -0
  99. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/docs/testing.md +0 -0
  100. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/docs/work-items.md +0 -0
  101. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/install.sh +0 -0
  102. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/justfile +0 -0
  103. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/media/control_center.png +0 -0
  104. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/media/echo_test.png +0 -0
  105. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/media/forensics-report-example.png +0 -0
  106. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/media/host.png +0 -0
  107. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/media/vehicle.png +0 -0
  108. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/pyproject.toml +0 -0
  109. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/requirements.txt +0 -0
  110. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/rosotacom.yaml +0 -0
  111. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/session-configuration.md +0 -0
  112. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/setup.cfg +0 -0
  113. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/__init__.py +0 -0
  114. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/__main__.py +0 -0
  115. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/anonymize.py +0 -0
  116. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/bag_ground_truth.py +0 -0
  117. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/benched_set.py +0 -0
  118. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/benchmark.py +0 -0
  119. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/benchmark_delta.py +0 -0
  120. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/bundle_check.py +0 -0
  121. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/cli.py +0 -0
  122. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/cli_benchmark.py +0 -0
  123. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/deployment.py +0 -0
  124. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/ffmpeg_packet.py +0 -0
  125. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/forensics.py +0 -0
  126. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/geomap.py +0 -0
  127. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/image_cache.py +0 -0
  128. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/netem_dist.py +0 -0
  129. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/network_preflight.py +0 -0
  130. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/network_profiles.py +0 -0
  131. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/network_shaper.py +0 -0
  132. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/plots.py +0 -0
  133. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/py.typed +0 -0
  134. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/benched-set.yaml +0 -0
  135. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/examples/.gitignore +0 -0
  136. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/examples/README.md +0 -0
  137. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/examples/__init__.py +0 -0
  138. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/examples/bags/8_drop_reference/metadata.yaml +0 -0
  139. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/examples/deployment.example.yaml +0 -0
  140. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/examples/dist/field-20260817.dist +0 -0
  141. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/examples/ros2docker.json +0 -0
  142. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/examples/ros2docker.lyrical.json +0 -0
  143. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/examples/rosotacom.yaml +0 -0
  144. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/examples/scenarios/2_native_chatter/scenario-definition.yaml +0 -0
  145. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/examples/scripts/1_heartbeat/run_machine_a.sh +0 -0
  146. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/examples/scripts/1_heartbeat/run_machine_b.sh +0 -0
  147. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_a/external.lyrical.ros2docker.json +0 -0
  148. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_a/external.ros2docker.json +0 -0
  149. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_a/run_communication.sh +0 -0
  150. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_a/run_external.py +0 -0
  151. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_a/wait_for_echo_topic.sh +0 -0
  152. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_b/external.lyrical.ros2docker.json +0 -0
  153. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_b/external.ros2docker.json +0 -0
  154. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_b/run_communication.sh +0 -0
  155. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_b/run_external.py +0 -0
  156. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_a/external.ros2docker.json +0 -0
  157. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_a/external_session.yaml +0 -0
  158. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_a/foxglove.json +0 -0
  159. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_a/run_communication.sh +0 -0
  160. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_a/run_external.py +0 -0
  161. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_b/costmap_1second/costmap_1second_0.mcap +0 -0
  162. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_b/costmap_1second/metadata.yaml +0 -0
  163. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_b/external.ros2docker.json +0 -0
  164. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_b/run_communication.sh +0 -0
  165. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_b/run_external.py +0 -0
  166. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_a/external.ros2docker.json +0 -0
  167. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_a/external_session.yaml +0 -0
  168. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_a/foxglove.json +0 -0
  169. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_a/run_communication.sh +0 -0
  170. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_a/run_external.py +0 -0
  171. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/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.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_b/costmap_1second/metadata.yaml +0 -0
  173. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_b/external.ros2docker.json +0 -0
  174. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_b/run_communication.sh +0 -0
  175. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_b/run_external.py +0 -0
  176. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_a/external.ros2docker.json +0 -0
  177. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_a/external_session.yaml +0 -0
  178. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_a/run_communication.sh +0 -0
  179. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_a/run_external.py +0 -0
  180. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_b/external.ros2docker.json +0 -0
  181. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_b/external_session.yaml +0 -0
  182. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_b/run_communication.sh +0 -0
  183. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_b/run_external.py +0 -0
  184. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_a/external.ros2docker.json +0 -0
  185. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_a/external_session.yaml +0 -0
  186. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_a/run_communication.sh +0 -0
  187. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_a/run_external.py +0 -0
  188. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_b/external.ros2docker.json +0 -0
  189. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_b/external_session.yaml +0 -0
  190. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_b/run_communication.sh +0 -0
  191. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_b/run_external.py +0 -0
  192. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/examples/sessions/10_restamp/session-definition.yaml +0 -0
  193. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/examples/sessions/11_trickle/session-definition.yaml +0 -0
  194. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/examples/sessions/12_content_integrity/session-definition.yaml +0 -0
  195. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/examples/sessions/13_link_latency/session-definition.yaml +0 -0
  196. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/examples/sessions/14_remote_assist_anonymized/session-definition.yaml +0 -0
  197. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/examples/sessions/15_remote_assist_anonymized_costmap/session-definition.yaml +0 -0
  198. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/examples/sessions/16_remote_assist_anonymized_camera/session-definition.yaml +0 -0
  199. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/examples/sessions/17_synthetic_camera_quality/session-definition.yaml +0 -0
  200. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/examples/sessions/1_heartbeat/session-definition.yaml +0 -0
  201. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/examples/sessions/1_heartbeat_status/session-definition.yaml +0 -0
  202. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/examples/sessions/2_native_chatter/session-definition.yaml +0 -0
  203. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/examples/sessions/3_comp_occ_grid/session-definition.yaml +0 -0
  204. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/examples/sessions/4_comp_occ_grid_zen/session-definition.yaml +0 -0
  205. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/examples/sessions/5_sized_payload/session-definition.yaml +0 -0
  206. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/examples/sessions/6_sized_payload_zen/session-definition.yaml +0 -0
  207. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/examples/sessions/7_latched_static/session-definition.yaml +0 -0
  208. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/examples/sessions/8_drop/session-definition.yaml +0 -0
  209. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/examples/sessions/9_throttle/session-definition.yaml +0 -0
  210. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/examples/sessions/bench_1_1_capacity/session-definition.yaml +0 -0
  211. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/examples/sessions/bench_1_2_load_sweep/session-definition.yaml +0 -0
  212. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/examples/sessions/bench_1_3_ramp/session-definition.yaml +0 -0
  213. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/examples/sessions/bench_1_4_recovery/session-definition.yaml +0 -0
  214. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/examples/sessions/bench_1_5_camera/session-definition.yaml +0 -0
  215. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ros2docker.json.example +0 -0
  216. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ros2docker.lyrical.json.example +0 -0
  217. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/.vscode/c_cpp_properties.json +0 -0
  218. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/.vscode/settings.json +0 -0
  219. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_easy_mode.xml.template +0 -0
  220. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_initial_peer_list.xml.template +0 -0
  221. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_v2.xml.template +0 -0
  222. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_v3.xml.template +0 -0
  223. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_v4.xml.template +0 -0
  224. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_v5.xml.template +0 -0
  225. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/ota_configs/create_zenoh_json5.py +0 -0
  226. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/ota_configs/cyclonedds_local_participants.xml.template +0 -0
  227. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/ota_configs/cyclonedds_minimal.xml.template +0 -0
  228. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/ota_configs/cyclonedds_scoped.xml.template +0 -0
  229. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/ota_configs/cyclonedds_tuned.xml.template +0 -0
  230. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/ota_configs/fastdds_easy_mode.xml.template +0 -0
  231. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/ota_configs/fastdds_local.xml.template +0 -0
  232. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/ota_configs/fastdds_tuned.xml.template +0 -0
  233. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/ota_configs/fastdds_unicast.xml.template +0 -0
  234. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/ota_configs/get_ota_xml.py +0 -0
  235. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/ota_configs/utils.py +0 -0
  236. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/ota_configs/zenoh.json5.template +0 -0
  237. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/ros2src/.gitkeep +0 -0
  238. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/ros2src/com_cpp/CMakeLists.txt +0 -0
  239. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/ros2src/com_cpp/COLCON_IGNORE +0 -0
  240. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/ros2src/com_cpp/LICENSE.txt +0 -0
  241. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/ros2src/com_cpp/package.xml +0 -0
  242. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/ros2src/com_cpp/src/hz_monitor.cpp +0 -0
  243. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/ros2src/com_cpp/src/universal_compressor.cpp +0 -0
  244. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/ros2src/com_cpp/src/universal_decompressor.cpp +0 -0
  245. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/ros2src/com_msgs/CMakeLists.txt +0 -0
  246. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/ros2src/com_msgs/LICENSE.txt +0 -0
  247. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/ros2src/com_msgs/msg/CompressedData.msg +0 -0
  248. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/ros2src/com_msgs/msg/EchoHeartbeat.msg +0 -0
  249. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/ros2src/com_msgs/msg/OtaStamped.msg +0 -0
  250. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/ros2src/com_msgs/msg/SizedPayload.msg +0 -0
  251. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/ros2src/com_msgs/package.xml +0 -0
  252. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/ros2src/com_py/LICENSE.txt +0 -0
  253. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/ros2src/com_py/com_py/__init__.py +0 -0
  254. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/ros2src/com_py/com_py/base_bridge_relay.py +0 -0
  255. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/ros2src/com_py/com_py/bridge_in.py +0 -0
  256. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/ros2src/com_py/com_py/bridge_out.py +0 -0
  257. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/ros2src/com_py/com_py/ffmpeg_flags.py +0 -0
  258. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/ros2src/com_py/com_py/heartbeat_echo.py +0 -0
  259. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/ros2src/com_py/com_py/hz_monitor.py +0 -0
  260. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/ros2src/com_py/com_py/image_bandwidth_reducer.py +0 -0
  261. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/ros2src/com_py/com_py/image_pixel_capper.py +0 -0
  262. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/ros2src/com_py/com_py/lanelet_saver.py +0 -0
  263. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/ros2src/com_py/com_py/latch_relay.py +0 -0
  264. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/costmap_remapper.py +0 -0
  265. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/marker_remapper.py +0 -0
  266. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/speed_test.py +0 -0
  267. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/tf_remapper.py +0 -0
  268. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/traffic_monitor.py +0 -0
  269. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/wifi_network_analysis_1.py +0 -0
  270. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/ros2src/com_py/com_py/link_bytes.py +0 -0
  271. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/ros2src/com_py/com_py/link_trace.py +0 -0
  272. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/ros2src/com_py/com_py/local_global_frame_bridge.py +0 -0
  273. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/ros2src/com_py/com_py/localization_map_split_reduce_saver.py +0 -0
  274. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/ros2src/com_py/com_py/msg_transform.py +0 -0
  275. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/ros2src/com_py/com_py/ota_pcap.py +0 -0
  276. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/ros2src/com_py/com_py/pair_management.py +0 -0
  277. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/ros2src/com_py/com_py/playout_pacer.py +0 -0
  278. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/ros2src/com_py/com_py/playout_pacer_core.py +0 -0
  279. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/ros2src/com_py/com_py/pub_sub_pair.py +0 -0
  280. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/ros2src/com_py/com_py/qos.py +0 -0
  281. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/ros2src/com_py/com_py/relay_in.py +0 -0
  282. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/ros2src/com_py/com_py/relay_out.py +0 -0
  283. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/ros2src/com_py/com_py/restamp.py +0 -0
  284. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/ros2src/com_py/com_py/sized_publisher.py +0 -0
  285. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/ros2src/com_py/com_py/stage_latency.py +0 -0
  286. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/ros2src/com_py/com_py/stage_latency_core.py +0 -0
  287. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/ros2src/com_py/com_py/status_overview.py +0 -0
  288. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/ros2src/com_py/com_py/status_overview_core.py +0 -0
  289. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/ros2src/com_py/com_py/tf_map_to_cart_saver.py +0 -0
  290. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/ros2src/com_py/com_py/topic_monitor.py +0 -0
  291. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/ros2src/com_py/com_py/topic_resolution.py +0 -0
  292. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/ros2src/com_py/com_py/trickle.py +0 -0
  293. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/ros2src/com_py/com_py/universal_compressor.py +0 -0
  294. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/ros2src/com_py/com_py/universal_decompressor.py +0 -0
  295. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/ros2src/com_py/com_py/universal_ota_unwrapper.py +0 -0
  296. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/ros2src/com_py/com_py/universal_ota_wrapper.py +0 -0
  297. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/ros2src/com_py/package.xml +0 -0
  298. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/ros2src/com_py/resource/com_py +0 -0
  299. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/ros2src/com_py/setup.cfg +0 -0
  300. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/ros2src/com_py/setup.py +0 -0
  301. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/ros2src/com_py/test/test_copyright.py +0 -0
  302. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/ros2src/com_py/test/test_flake8.py +0 -0
  303. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/ros2src/com_py/test/test_pep257.py +0 -0
  304. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/session/content/base/session_plugin_base.yaml +0 -0
  305. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/session/content/network/up_connectivity.py +0 -0
  306. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/session/content/network/wifi_network_analysis_2.py +0 -0
  307. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/session/creation/anonymize_bag.py +0 -0
  308. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/session/creation/catmux_log_setup.sh +0 -0
  309. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/session/creation/create_session_yaml.py +0 -0
  310. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/session/creation/generate_session_files.py +0 -0
  311. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/session/creation/run_session.py +0 -0
  312. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/session/creation/run_session_in_external_terminal.py +0 -0
  313. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/resources/ws/session/creation/strip_ansi.py +0 -0
  314. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/status_eval.py +0 -0
  315. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/stream_stats.py +0 -0
  316. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/trace_profiles.py +0 -0
  317. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/transit.py +0 -0
  318. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom/video_quality.py +0 -0
  319. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom_dev.egg-info/dependency_links.txt +0 -0
  320. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom_dev.egg-info/entry_points.txt +0 -0
  321. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom_dev.egg-info/requires.txt +0 -0
  322. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/src/rosotacom_dev.egg-info/top_level.txt +0 -0
  323. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/terminology.md +0 -0
  324. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/tests/contract/test_benched_set_registry.py +0 -0
  325. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/tests/contract/test_findings.py +0 -0
  326. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/tests/contract/test_generated_topics_have_a_producer.py +0 -0
  327. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/tests/contract/test_lyrical_runtime_compat.py +0 -0
  328. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/tests/contract/test_markdown_links.py +0 -0
  329. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/tests/contract/test_ota_source_bundle.py +0 -0
  330. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/tests/contract/test_package_metadata.py +0 -0
  331. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/tests/contract/test_packaged_resources.py +0 -0
  332. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/tests/contract/test_profile_covers_generated_commands.py +0 -0
  333. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/tests/contract/test_pytest_policy.py +0 -0
  334. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/tests/contract/test_readme_examples.py +0 -0
  335. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/tests/contract/test_security_maintenance_config.py +0 -0
  336. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/tests/contract/test_session_configuration_doc.py +0 -0
  337. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/tests/contract/test_session_template_substitution.py +0 -0
  338. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/tests/contract/test_workflow_contracts.py +0 -0
  339. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/tests/e2e/conftest.py +0 -0
  340. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/tests/e2e/test_anonymize_e2e.py +0 -0
  341. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/tests/e2e/test_benchmark_ab.py +0 -0
  342. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/tests/e2e/test_benchmark_capacity.py +0 -0
  343. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/tests/e2e/test_benchmark_replay.py +0 -0
  344. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/tests/e2e/test_parallel_smoke.py +0 -0
  345. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/tests/e2e/test_smoke.py +0 -0
  346. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/tests/e2e/test_timeline_stepping.py +0 -0
  347. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/tests/e2e/test_video_quality_e2e.py +0 -0
  348. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/tests/sessions/generate_rmw_matrix.py +0 -0
  349. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/tests/sessions/rmw_matrix/1_heartbeat_cyclone-local_zenoh-ros2dds-ota/session-definition.yaml +0 -0
  350. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/tests/sessions/rmw_matrix/1_heartbeat_cyclone-ota/session-definition.yaml +0 -0
  351. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/tests/sessions/rmw_matrix/1_heartbeat_cyclone-ota-tuned/session-definition.yaml +0 -0
  352. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/tests/sessions/rmw_matrix/1_heartbeat_fastdds/session-definition.yaml +0 -0
  353. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/tests/sessions/rmw_matrix/1_heartbeat_fastdds-default/session-definition.yaml +0 -0
  354. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/tests/sessions/rmw_matrix/1_heartbeat_zen-endpoints/session-definition.yaml +0 -0
  355. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/tests/unit/test_anonymize.py +0 -0
  356. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/tests/unit/test_bag_ground_truth.py +0 -0
  357. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/tests/unit/test_benched_set.py +0 -0
  358. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/tests/unit/test_benchmark.py +0 -0
  359. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/tests/unit/test_benchmark_delta.py +0 -0
  360. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/tests/unit/test_bundle_check.py +0 -0
  361. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/tests/unit/test_catmux_pane_logging.py +0 -0
  362. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/tests/unit/test_cli.py +0 -0
  363. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/tests/unit/test_cli_benchmark.py +0 -0
  364. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/tests/unit/test_concurrency.py +0 -0
  365. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/tests/unit/test_container_shaping.py +0 -0
  366. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/tests/unit/test_deployment.py +0 -0
  367. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/tests/unit/test_ffmpeg_flags.py +0 -0
  368. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/tests/unit/test_ffmpeg_packet.py +0 -0
  369. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/tests/unit/test_field_profiles.py +0 -0
  370. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/tests/unit/test_forensics.py +0 -0
  371. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/tests/unit/test_geomap.py +0 -0
  372. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/tests/unit/test_image_cache.py +0 -0
  373. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/tests/unit/test_link_bytes.py +0 -0
  374. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/tests/unit/test_link_trace.py +0 -0
  375. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/tests/unit/test_netem_dist.py +0 -0
  376. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/tests/unit/test_network_preflight.py +0 -0
  377. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/tests/unit/test_network_profiles.py +0 -0
  378. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/tests/unit/test_network_shaper.py +0 -0
  379. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/tests/unit/test_ota_link_configs.py +0 -0
  380. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/tests/unit/test_ota_pcap.py +0 -0
  381. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/tests/unit/test_ota_unwrapper.py +0 -0
  382. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/tests/unit/test_ota_wrapper.py +0 -0
  383. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/tests/unit/test_ota_xml.py +0 -0
  384. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/tests/unit/test_playout_pacer.py +0 -0
  385. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/tests/unit/test_plots.py +0 -0
  386. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/tests/unit/test_pub_sub_pair_types.py +0 -0
  387. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/tests/unit/test_qos_fallback_logging.py +0 -0
  388. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/tests/unit/test_relay_optional_parameters.py +0 -0
  389. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/tests/unit/test_ros_node_entity_ownership.py +0 -0
  390. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/tests/unit/test_session_pipeline.py +0 -0
  391. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/tests/unit/test_stage_latency.py +0 -0
  392. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/tests/unit/test_status_eval.py +0 -0
  393. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/tests/unit/test_status_overview.py +0 -0
  394. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/tests/unit/test_status_overview_observer.py +0 -0
  395. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/tests/unit/test_stream_stats.py +0 -0
  396. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/tests/unit/test_terminology_stage_ownership.py +0 -0
  397. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/tests/unit/test_trace_profiles.py +0 -0
  398. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/tests/unit/test_transit.py +0 -0
  399. {rosotacom_dev-2.5.dev74 → rosotacom_dev-2.5.dev76}/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.dev74
3
+ Version: 2.5.dev76
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,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,139 @@
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 token bucket a burst can fill (4 Mbit/s) | 1.14 % | 1.33 % | 2.57 % | 4.99 % | 13.43 % | 32.92 % |
14
+ | a serialisation constraint (1.5 Mbit/s) | — | 1.62 % | — | — | 11.60 % | **97.54 %** |
15
+
16
+ - **The chain is not the cause.** Under independent per-packet loss the fitted
17
+ law is reproduced with residuals of 1.20, 0.85, 1.01, 1.06, 0.97 and 1.00 —
18
+ flat over three decades of size. Whatever tilts the field, it is not the
19
+ wrapper, the join, or the way the fit is taken.
20
+ - **A burst meeting a queue is not the cause.** A token bucket at 4 Mbit/s —
21
+ above the largest class's mean offered rate of 3.0 Mbit/s and far below its
22
+ instantaneous one, so a 38-packet message meets a queue and a 1-packet
23
+ message does not — changes nothing systematic: 1.09, 0.90, 0.74, 0.80, 1.20,
24
+ 1.03 against the unqueued arm. The queue defers rather than drops, which is
25
+ the same statement as
26
+ [oversubscription queues, it does not lose](oversubscription-queues-not-losses.md),
27
+ seen per size.
28
+ - **A serialisation constraint does not tilt it either — it removes the class.**
29
+ At 1.5 Mbit/s the one-packet message pays 10 % more than unshaped and the
30
+ 13-packet message 3 % more, while the 38-packet message goes from 31.9 % to
31
+ **97.5 %**. That is not a slope, it is a threshold: below the constraint
32
+ nothing changes, above it the stream is gone.
33
+
34
+ The last row is worth naming for what it is *shaped* like. A link whose
35
+ transmission opportunities are a fraction of the wall clock presents from above
36
+ as exactly this — a small probe crossing unharmed while a large burst does not
37
+ — which is the signature an uplink moved onto a duty-cycled carrier would leave
38
+ in an application's own numbers. This reproduces the signature; it does not
39
+ demonstrate the mechanism, because a sustained rate cap and a duty cycle are
40
+ not the same thing and this cell is oversubscribed on the mean as well as on
41
+ the burst.
42
+
43
+ ## Setup
44
+
45
+ - Host pair / topology: one host, the packaged local benchmark rig — two
46
+ communication containers on their own Docker network, `tc` inside each
47
+ container's own netns (`--sudo-mode container`).
48
+ - Session: `bench_1_1_capacity` from the packaged example project, one
49
+ `a->b:/bench_capacity` stream at 10 Hz, CycloneDDS, OTA QoS best_effort /
50
+ KEEP_LAST depth 1.
51
+ - rosotacom SHA: measured at `7bb420c`; needs 2.5.dev74 or later for the fitted
52
+ delay table to arm at all.
53
+ - Profiles: `tilt-iid`, `tilt-iid-queued` and `tilt-iid-tight` in
54
+ [`src/rosotacom/resources/examples/profiles.yaml`](../../src/rosotacom/resources/examples/profiles.yaml).
55
+ All three carry the 2026-08-17 drive's own delay table at 25 ms ± 18 ms and
56
+ 1 % independent per-packet loss; they differ only in the rate cap in front of
57
+ it — none, 4 Mbit/s, 1.5 Mbit/s.
58
+ - Seed policy: netem `loss` is unseeded, `n=1` per cell, about 2100 messages
59
+ inside the measured window of each.
60
+
61
+ ## Evidence
62
+
63
+ Evidence grade: per-message counts from the receiving peer's own RFC 0003
64
+ transit records, windowed in sequence numbers (first 300 and last 50 dropped)
65
+ so that the unshaped messages before the shaper is armed leave both the
66
+ delivered and the lost class at once.
67
+
68
+ The independent arm, with one `(p, F)` fitted by maximum likelihood over the
69
+ whole ladder (`p = 0.870 %` per packet, `F = 872 B`):
70
+
71
+ | wrapped | N | offered | lost | observed | 95 % CI | obs/pred |
72
+ |---:|---:|---:|---:|---:|---:|---:|
73
+ | 300 B | 1 | 2101 | 22 | 1.047 % | 0.69–1.58 | 1.20 |
74
+ | 1.1 kB | 2 | 2102 | 31 | 1.475 % | 1.04–2.09 | 0.85 |
75
+ | 3.1 kB | 4 | 2105 | 73 | 3.468 % | 2.77–4.34 | 1.01 |
76
+ | 6.1 kB | 7 | 2103 | 132 | 6.277 % | 5.32–7.40 | 1.06 |
77
+ | 12.1 kB | 14 | 2102 | 236 | 11.227 % | 9.95–12.65 | 0.97 |
78
+ | 38.1 kB | 44 | 2102 | 671 | 31.922 % | 29.96–33.95 | 1.00 |
79
+
80
+ The queued arm on the same ladder: 24, 28, 54, 105, 283 and 693 losses of about
81
+ 2100 offered, giving the second row of the claim table. The tight arm: 34 of
82
+ 2104, 244 of 2103, and 1826 of 1872.
83
+
84
+ **A two-state loss process could not be measured on this ladder, and the reason
85
+ is worth recording.** `netem`'s Gilbert–Elliott model advances its chain once
86
+ per *packet*, not once per second, so a size ladder at a fixed message rate runs
87
+ the chain at a different speed in every cell — 10 packets/s for a one-fragment
88
+ message against 380 for a 38-fragment one. The cells then do not share a loss
89
+ process and cannot be compared; the arm measured at a fixed 10 Hz duly reported
90
+ a per-packet mean of 0.33 % in its smallest cell and 0.69 % fitted over the
91
+ ladder, against a stationary 1.00 %, because the small cells never sampled
92
+ enough of the chain. Holding the offered *packet* rate constant is what makes
93
+ such a ladder one experiment, and the profiles file says so beside the fitted
94
+ parameters.
95
+
96
+ Verification: manual, from a source checkout with Docker:
97
+
98
+ ```bash
99
+ for prof in tilt-iid tilt-iid-queued; do
100
+ for size in 200 1000 3000 6000 12000 38000; do
101
+ rosotacom benchmark probe \
102
+ --project src/rosotacom/resources/examples/rosotacom.yaml \
103
+ --profile "$prof" --size "$size" --rate-hz 10 --duration 240 \
104
+ --repeats 1 --sudo-mode container --no-plot
105
+ done
106
+ done
107
+ rosotacom benchmark probe --project src/rosotacom/resources/examples/rosotacom.yaml \
108
+ --profile tilt-iid-tight --size 38000 --rate-hz 10 --duration 240 \
109
+ --repeats 1 --sudo-mode container --no-plot
110
+ ```
111
+
112
+ The independent ladder must fit one `(p, F)` to within about ten per cent at
113
+ every point; the queued ladder must not differ from it systematically; and the
114
+ tight cell at 38 kB must be near-total loss while its 1 kB cell is not.
115
+
116
+ ## Status
117
+
118
+ confirmed, 2026-08-31.
119
+
120
+ ## Publication notes
121
+
122
+ This is a set of negative results and the negative is the point: a residual
123
+ that survives three plausible explanations is worth more than one that has not
124
+ been attacked. What it licenses is a narrower claim than "we do not know why" —
125
+ the tilt is not an artefact of the accounting, it is not what a queue does to a
126
+ burst, and it is not a serialisation limit, because a serialisation limit does
127
+ not tilt a curve, it truncates it.
128
+
129
+ What is left to attack is correlation *inside* one message's own burst on a
130
+ real radio — loss events shorter than the time a large message spends on the
131
+ wire, which `netem`'s per-packet chain cannot express at all. The
132
+ Gilbert–Elliott note above is the reason: the tool models a process in packets,
133
+ and the candidate mechanism lives in milliseconds.
134
+
135
+ The serialisation row deserves one sentence wherever a duty-cycled uplink is
136
+ discussed. It shows that the observable signature of such a link — small
137
+ messages unaffected, large messages gone, round-trip time unchanged — is
138
+ reproducible from a rate constraint alone, which means the signature on its own
139
+ 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,79 @@ 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 }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rosotacom-dev
3
- Version: 2.5.dev74
3
+ Version: 2.5.dev76
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",
@@ -0,0 +1,8 @@
1
+ {
2
+ "tag": "2.4",
3
+ "distance": 76,
4
+ "node": "g2bb535f400eb45c6e3f97c716b76011465cf144f",
5
+ "dirty": false,
6
+ "branch": "HEAD",
7
+ "node_date": "2026-08-31"
8
+ }
@@ -1,8 +0,0 @@
1
- {
2
- "tag": "2.4",
3
- "distance": 74,
4
- "node": "gb0fa038b84a614450fb24c09bd27fb8358d8b7ec",
5
- "dirty": false,
6
- "branch": "HEAD",
7
- "node_date": "2026-08-30"
8
- }