rosotacom-dev 2.5.dev17__tar.gz → 2.5.dev20__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 (343) hide show
  1. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/.github/workflows/nightly-e2e.yml +1 -1
  2. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/.github/workflows/pr-merge-gate.yml +12 -2
  3. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/.github/workflows/release.yml +1 -1
  4. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/PKG-INFO +1 -1
  5. rosotacom_dev-2.5.dev20/budgets.jsonl +7 -0
  6. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/docs/ci.md +65 -9
  7. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/docs/performance-bands.md +25 -5
  8. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/docs/rfcs/0007-regression-gate.md +55 -6
  9. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/docs/testing.md +19 -5
  10. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/justfile +9 -32
  11. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/pyproject.toml +6 -0
  12. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/benched_set.py +164 -8
  13. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/benchmark.py +52 -10
  14. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/cli_benchmark.py +133 -20
  15. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/benched-set.yaml +48 -24
  16. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom_dev.egg-info/PKG-INFO +1 -1
  17. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom_dev.egg-info/scm_version.json +2 -2
  18. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/contract/test_benched_set_registry.py +53 -15
  19. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/contract/test_security_maintenance_config.py +14 -3
  20. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/contract/test_workflow_contracts.py +174 -19
  21. rosotacom_dev-2.5.dev20/tests/e2e/conftest.py +225 -0
  22. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/unit/test_benched_set.py +119 -8
  23. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/unit/test_cli_benchmark.py +131 -0
  24. rosotacom_dev-2.5.dev17/budgets.jsonl +0 -15
  25. rosotacom_dev-2.5.dev17/tests/e2e/conftest.py +0 -14
  26. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/.devcontainer/devcontainer.json.template +0 -0
  27. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/.devcontainer/re_generate_devcontainer_json.py +0 -0
  28. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/.github/CODEOWNERS +0 -0
  29. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/.github/ISSUE_TEMPLATE/documentation-audit.md +0 -0
  30. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/.github/ISSUE_TEMPLATE/implementation-cleanup.md +0 -0
  31. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/.github/ISSUE_TEMPLATE/quality-workflow.md +0 -0
  32. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/.github/ISSUE_TEMPLATE/redesign.md +0 -0
  33. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/.github/ISSUE_TEMPLATE/release-process.md +0 -0
  34. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/.github/ISSUE_TEMPLATE/repository-diagnosis.md +0 -0
  35. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/.github/ISSUE_TEMPLATE/test-ci-audit.md +0 -0
  36. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/.github/ISSUE_TEMPLATE/work-item.md +0 -0
  37. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  38. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/.github/dependabot.yml +0 -0
  39. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/.github/workflows/benchmark-calibrate.yml +0 -0
  40. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/.github/workflows/benchmark-gate.yml +0 -0
  41. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/.github/workflows/dev-release.yml +0 -0
  42. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/.github/workflows/image-scan.yml +0 -0
  43. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/.github/workflows/pr-lightweight.yml +0 -0
  44. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/.pre-commit-config.yaml +0 -0
  45. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/AGENTS.md +0 -0
  46. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/CONCURRENCY.md +0 -0
  47. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/CONTRIBUTING.md +0 -0
  48. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/DEVELOPMENT_PRINCIPLES.md +0 -0
  49. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/LICENSE.txt +0 -0
  50. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/MANIFEST.in +0 -0
  51. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/README.md +0 -0
  52. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/calibration/README.md +0 -0
  53. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/calibration/capacity-size-tight-cyclone.json +0 -0
  54. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/calibration/probe-loss-gop-tight-cyclone.json +0 -0
  55. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/calibration/probe-loss-nominal-cyclone.json +0 -0
  56. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/calibration/probe-loss-tight-cyclone.json +0 -0
  57. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/calibration/probe-loss-tight-fastdds.json +0 -0
  58. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/calibration/probe-loss-tight-zenoh.json +0 -0
  59. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/codecov.yml +0 -0
  60. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/deployment-configuration.md +0 -0
  61. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/docs/benchmark-ab.md +0 -0
  62. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/docs/benchmark-bag-as-load.md +0 -0
  63. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/docs/ffmpeg-keyframes.md +0 -0
  64. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/docs/findings/README.md +0 -0
  65. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/docs/findings/cyclone-spdp-discovery-bursts.md +0 -0
  66. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/docs/findings/delay-alone-no-loss.md +0 -0
  67. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/docs/findings/head-of-line-irregularity.md +0 -0
  68. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/docs/findings/jitter-loss-bandwidth-latency.md +0 -0
  69. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/docs/findings/lighter-message-loss.md +0 -0
  70. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/docs/findings/zero-loss-boundaries-18kb-20hz.md +0 -0
  71. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/docs/forensics-report.md +0 -0
  72. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/docs/geo-link-map.md +0 -0
  73. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/docs/github-repository-settings.md +0 -0
  74. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/docs/link-trace.md +0 -0
  75. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/docs/owner-runbook.md +0 -0
  76. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/docs/playbooks/README.md +0 -0
  77. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/docs/quality-model.md +0 -0
  78. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/docs/release-notes/TEMPLATE.md +0 -0
  79. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/docs/release-notes/v2.1.md +0 -0
  80. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/docs/release-notes/v2.2.md +0 -0
  81. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/docs/release-notes/v2.3.md +0 -0
  82. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/docs/release-notes/v2.4.md +0 -0
  83. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/docs/release.md +0 -0
  84. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/docs/rfcs/0001-expectation-driven-test-suite.md +0 -0
  85. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/docs/rfcs/0002-expectation-concepts.md +0 -0
  86. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/docs/rfcs/0003-metric-backbone.md +0 -0
  87. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/docs/rfcs/0004-network-profiles.md +0 -0
  88. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/docs/rfcs/0005-benchmark-genres-and-ci.md +0 -0
  89. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/docs/rfcs/0006-dynamic-qos.md +0 -0
  90. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/docs/rfcs/README.md +0 -0
  91. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/docs/work-items.md +0 -0
  92. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/install.sh +0 -0
  93. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/media/control_center.png +0 -0
  94. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/media/echo_test.png +0 -0
  95. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/media/forensics-report-example.png +0 -0
  96. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/media/host.png +0 -0
  97. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/media/vehicle.png +0 -0
  98. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/requirements.txt +0 -0
  99. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/rosotacom.yaml +0 -0
  100. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/run_session_in_container.py +0 -0
  101. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/session-configuration.md +0 -0
  102. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/setup.cfg +0 -0
  103. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/__init__.py +0 -0
  104. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/__main__.py +0 -0
  105. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/anonymize.py +0 -0
  106. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/bag_ground_truth.py +0 -0
  107. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/benchmark_delta.py +0 -0
  108. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/bundle_check.py +0 -0
  109. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/cli.py +0 -0
  110. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/deployment.py +0 -0
  111. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/ffmpeg_packet.py +0 -0
  112. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/forensics.py +0 -0
  113. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/geomap.py +0 -0
  114. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/network_profiles.py +0 -0
  115. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/network_shaper.py +0 -0
  116. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/plots.py +0 -0
  117. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/py.typed +0 -0
  118. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/.gitignore +0 -0
  119. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/README.md +0 -0
  120. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/__init__.py +0 -0
  121. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/bags/8_drop_reference/metadata.yaml +0 -0
  122. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/deployment.example.yaml +0 -0
  123. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/profiles.yaml +0 -0
  124. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/ros2docker.json +0 -0
  125. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/rosotacom.yaml +0 -0
  126. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/scenarios/2_native_chatter/scenario-definition.yaml +0 -0
  127. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/scripts/1_heartbeat/run_machine_a.sh +0 -0
  128. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/scripts/1_heartbeat/run_machine_b.sh +0 -0
  129. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_a/external.ros2docker.json +0 -0
  130. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_a/run_communication.sh +0 -0
  131. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_a/run_external.py +0 -0
  132. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_a/wait_for_echo_topic.sh +0 -0
  133. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_b/external.ros2docker.json +0 -0
  134. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_b/run_communication.sh +0 -0
  135. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_b/run_external.py +0 -0
  136. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_a/external.ros2docker.json +0 -0
  137. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_a/external_session.yaml +0 -0
  138. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_a/foxglove.json +0 -0
  139. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_a/run_communication.sh +0 -0
  140. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_a/run_external.py +0 -0
  141. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_b/costmap_1second/costmap_1second_0.mcap +0 -0
  142. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_b/costmap_1second/metadata.yaml +0 -0
  143. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_b/external.ros2docker.json +0 -0
  144. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_b/run_communication.sh +0 -0
  145. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_b/run_external.py +0 -0
  146. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_a/external.ros2docker.json +0 -0
  147. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_a/external_session.yaml +0 -0
  148. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_a/foxglove.json +0 -0
  149. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_a/run_communication.sh +0 -0
  150. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_a/run_external.py +0 -0
  151. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_b/costmap_1second/costmap_1second_0.mcap +0 -0
  152. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_b/costmap_1second/metadata.yaml +0 -0
  153. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_b/external.ros2docker.json +0 -0
  154. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_b/run_communication.sh +0 -0
  155. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_b/run_external.py +0 -0
  156. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_a/external.ros2docker.json +0 -0
  157. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_a/external_session.yaml +0 -0
  158. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_a/run_communication.sh +0 -0
  159. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_a/run_external.py +0 -0
  160. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_b/external.ros2docker.json +0 -0
  161. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_b/external_session.yaml +0 -0
  162. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_b/run_communication.sh +0 -0
  163. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_b/run_external.py +0 -0
  164. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_a/external.ros2docker.json +0 -0
  165. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_a/external_session.yaml +0 -0
  166. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_a/run_communication.sh +0 -0
  167. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_a/run_external.py +0 -0
  168. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_b/external.ros2docker.json +0 -0
  169. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_b/external_session.yaml +0 -0
  170. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_b/run_communication.sh +0 -0
  171. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_b/run_external.py +0 -0
  172. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/sessions/10_restamp/session-definition.yaml +0 -0
  173. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/sessions/11_trickle/session-definition.yaml +0 -0
  174. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/sessions/12_content_integrity/session-definition.yaml +0 -0
  175. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/sessions/13_link_latency/session-definition.yaml +0 -0
  176. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/sessions/14_remote_assist_anonymized/session-definition.yaml +0 -0
  177. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/sessions/15_remote_assist_anonymized_costmap/session-definition.yaml +0 -0
  178. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/sessions/16_remote_assist_anonymized_camera/session-definition.yaml +0 -0
  179. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/sessions/17_synthetic_camera_quality/session-definition.yaml +0 -0
  180. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/sessions/1_heartbeat/session-definition.yaml +0 -0
  181. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/sessions/1_heartbeat_status/session-definition.yaml +0 -0
  182. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/sessions/2_native_chatter/session-definition.yaml +0 -0
  183. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/sessions/3_comp_occ_grid/session-definition.yaml +0 -0
  184. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/sessions/4_comp_occ_grid_zen/session-definition.yaml +0 -0
  185. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/sessions/5_sized_payload/session-definition.yaml +0 -0
  186. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/sessions/6_sized_payload_zen/session-definition.yaml +0 -0
  187. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/sessions/7_latched_static/session-definition.yaml +0 -0
  188. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/sessions/8_drop/session-definition.yaml +0 -0
  189. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/sessions/9_throttle/session-definition.yaml +0 -0
  190. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/sessions/bench_1_1_capacity/session-definition.yaml +0 -0
  191. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/sessions/bench_1_2_load_sweep/session-definition.yaml +0 -0
  192. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/sessions/bench_1_3_ramp/session-definition.yaml +0 -0
  193. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/sessions/bench_1_4_recovery/session-definition.yaml +0 -0
  194. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/sessions/bench_1_5_camera/session-definition.yaml +0 -0
  195. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ros2docker.json.example +0 -0
  196. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/.vscode/c_cpp_properties.json +0 -0
  197. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/.vscode/settings.json +0 -0
  198. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_easy_mode.xml.template +0 -0
  199. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_initial_peer_list.xml.template +0 -0
  200. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_v2.xml.template +0 -0
  201. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_v3.xml.template +0 -0
  202. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_v4.xml.template +0 -0
  203. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_v5.xml.template +0 -0
  204. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ota_configs/create_zenoh_json5.py +0 -0
  205. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ota_configs/cyclonedds_minimal.xml.template +0 -0
  206. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ota_configs/cyclonedds_tuned.xml.template +0 -0
  207. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ota_configs/fastdds_unicast.xml.template +0 -0
  208. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ota_configs/get_ota_xml.py +0 -0
  209. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ota_configs/utils.py +0 -0
  210. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ota_configs/zenoh.json5.template +0 -0
  211. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/.gitkeep +0 -0
  212. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_cpp/CMakeLists.txt +0 -0
  213. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_cpp/COLCON_IGNORE +0 -0
  214. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_cpp/LICENSE.txt +0 -0
  215. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_cpp/package.xml +0 -0
  216. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_cpp/src/hz_monitor.cpp +0 -0
  217. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_cpp/src/universal_compressor.cpp +0 -0
  218. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_cpp/src/universal_decompressor.cpp +0 -0
  219. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_msgs/CMakeLists.txt +0 -0
  220. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_msgs/LICENSE.txt +0 -0
  221. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_msgs/msg/CompressedData.msg +0 -0
  222. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_msgs/msg/EchoHeartbeat.msg +0 -0
  223. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_msgs/msg/OtaStamped.msg +0 -0
  224. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_msgs/msg/SizedPayload.msg +0 -0
  225. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_msgs/package.xml +0 -0
  226. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_py/LICENSE.txt +0 -0
  227. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_py/com_py/__init__.py +0 -0
  228. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_py/com_py/base_bridge_relay.py +0 -0
  229. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_py/com_py/bridge_in.py +0 -0
  230. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_py/com_py/bridge_out.py +0 -0
  231. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_py/com_py/heartbeat_echo.py +0 -0
  232. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_py/com_py/hz_monitor.py +0 -0
  233. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_py/com_py/image_bandwidth_reducer.py +0 -0
  234. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_py/com_py/image_pixel_capper.py +0 -0
  235. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_py/com_py/lanelet_saver.py +0 -0
  236. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_py/com_py/latch_relay.py +0 -0
  237. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/costmap_remapper.py +0 -0
  238. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/marker_remapper.py +0 -0
  239. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/speed_test.py +0 -0
  240. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/tf_remapper.py +0 -0
  241. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/traffic_monitor.py +0 -0
  242. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/wifi_network_analysis_1.py +0 -0
  243. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_py/com_py/link_bytes.py +0 -0
  244. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_py/com_py/link_trace.py +0 -0
  245. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_py/com_py/local_global_frame_bridge.py +0 -0
  246. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_py/com_py/localization_map_split_reduce_saver.py +0 -0
  247. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_py/com_py/msg_transform.py +0 -0
  248. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_py/com_py/pair_management.py +0 -0
  249. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_py/com_py/pub_sub_pair.py +0 -0
  250. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_py/com_py/qos.py +0 -0
  251. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_py/com_py/relay_in.py +0 -0
  252. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_py/com_py/relay_out.py +0 -0
  253. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_py/com_py/restamp.py +0 -0
  254. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_py/com_py/sized_publisher.py +0 -0
  255. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_py/com_py/stage_latency.py +0 -0
  256. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_py/com_py/stage_latency_core.py +0 -0
  257. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_py/com_py/status_overview.py +0 -0
  258. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_py/com_py/status_overview_core.py +0 -0
  259. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_py/com_py/tf_map_to_cart_saver.py +0 -0
  260. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_py/com_py/topic_monitor.py +0 -0
  261. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_py/com_py/topic_resolution.py +0 -0
  262. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_py/com_py/trickle.py +0 -0
  263. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_py/com_py/universal_compressor.py +0 -0
  264. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_py/com_py/universal_decompressor.py +0 -0
  265. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_py/com_py/universal_ota_unwrapper.py +0 -0
  266. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_py/com_py/universal_ota_wrapper.py +0 -0
  267. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_py/package.xml +0 -0
  268. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_py/resource/com_py +0 -0
  269. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_py/setup.cfg +0 -0
  270. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_py/setup.py +0 -0
  271. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_py/test/test_copyright.py +0 -0
  272. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_py/test/test_flake8.py +0 -0
  273. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_py/test/test_pep257.py +0 -0
  274. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/session/content/base/session_plugin_base.yaml +0 -0
  275. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/session/content/network/up_connectivity.py +0 -0
  276. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/session/content/network/wifi_network_analysis_2.py +0 -0
  277. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/session/creation/anonymize_bag.py +0 -0
  278. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/session/creation/catmux_log_setup.sh +0 -0
  279. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/session/creation/create_session_yaml.py +0 -0
  280. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/session/creation/generate_session_files.py +0 -0
  281. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/session/creation/run_session.py +0 -0
  282. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/session/creation/run_session_in_external_terminal.py +0 -0
  283. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/session/creation/strip_ansi.py +0 -0
  284. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/status_eval.py +0 -0
  285. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/stream_stats.py +0 -0
  286. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/trace_profiles.py +0 -0
  287. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/transit.py +0 -0
  288. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/video_quality.py +0 -0
  289. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom_dev.egg-info/SOURCES.txt +0 -0
  290. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom_dev.egg-info/dependency_links.txt +0 -0
  291. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom_dev.egg-info/entry_points.txt +0 -0
  292. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom_dev.egg-info/requires.txt +0 -0
  293. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom_dev.egg-info/scm_file_list.json +0 -0
  294. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom_dev.egg-info/top_level.txt +0 -0
  295. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/stop_session_in_container.py +0 -0
  296. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/terminology.md +0 -0
  297. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/contract/test_findings.py +0 -0
  298. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/contract/test_markdown_links.py +0 -0
  299. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/contract/test_ota_source_bundle.py +0 -0
  300. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/contract/test_package_metadata.py +0 -0
  301. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/contract/test_packaged_resources.py +0 -0
  302. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/contract/test_profile_covers_generated_commands.py +0 -0
  303. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/contract/test_pytest_policy.py +0 -0
  304. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/contract/test_readme_examples.py +0 -0
  305. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/contract/test_session_configuration_doc.py +0 -0
  306. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/e2e/test_anonymize_e2e.py +0 -0
  307. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/e2e/test_benchmark_ab.py +0 -0
  308. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/e2e/test_benchmark_capacity.py +0 -0
  309. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/e2e/test_benchmark_replay.py +0 -0
  310. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/e2e/test_parallel_smoke.py +0 -0
  311. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/e2e/test_smoke.py +0 -0
  312. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/e2e/test_timeline_stepping.py +0 -0
  313. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/e2e/test_video_quality_e2e.py +0 -0
  314. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/sessions/generate_rmw_matrix.py +0 -0
  315. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/sessions/rmw_matrix/1_heartbeat_cyclone-local_zenoh-ros2dds-ota/session-definition.yaml +0 -0
  316. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/sessions/rmw_matrix/1_heartbeat_cyclone-ota/session-definition.yaml +0 -0
  317. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/sessions/rmw_matrix/1_heartbeat_cyclone-ota-tuned/session-definition.yaml +0 -0
  318. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/sessions/rmw_matrix/1_heartbeat_fastdds/session-definition.yaml +0 -0
  319. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/sessions/rmw_matrix/1_heartbeat_zen-endpoints/session-definition.yaml +0 -0
  320. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/unit/test_anonymize.py +0 -0
  321. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/unit/test_bag_ground_truth.py +0 -0
  322. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/unit/test_benchmark.py +0 -0
  323. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/unit/test_benchmark_delta.py +0 -0
  324. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/unit/test_bundle_check.py +0 -0
  325. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/unit/test_cli.py +0 -0
  326. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/unit/test_concurrency.py +0 -0
  327. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/unit/test_deployment.py +0 -0
  328. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/unit/test_ffmpeg_packet.py +0 -0
  329. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/unit/test_forensics.py +0 -0
  330. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/unit/test_geomap.py +0 -0
  331. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/unit/test_link_bytes.py +0 -0
  332. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/unit/test_link_trace.py +0 -0
  333. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/unit/test_network_profiles.py +0 -0
  334. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/unit/test_network_shaper.py +0 -0
  335. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/unit/test_ota_xml.py +0 -0
  336. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/unit/test_plots.py +0 -0
  337. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/unit/test_stage_latency.py +0 -0
  338. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/unit/test_status_eval.py +0 -0
  339. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/unit/test_status_overview.py +0 -0
  340. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/unit/test_stream_stats.py +0 -0
  341. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/unit/test_trace_profiles.py +0 -0
  342. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/unit/test_transit.py +0 -0
  343. {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/unit/test_video_quality.py +0 -0
@@ -37,7 +37,7 @@ jobs:
37
37
  strategy:
38
38
  fail-fast: false
39
39
  matrix:
40
- slice: [core, transforms, remote-assist, runtime-tools, concurrency, media]
40
+ slice: [heartbeat, chatter, occupancy-grid, sized-payload, remote-assist, remote-assist-streams, runtime-tools, media, concurrency, benchmark-ab, benchmark-replay, benchmark-capacity, benchmark-capacity-cases]
41
41
 
42
42
  steps:
43
43
  - name: Check out repository
@@ -27,7 +27,10 @@ jobs:
27
27
  ACTIONLINT_VERSION="1.7.12"
28
28
  CHECKSUM="8aca8db96f1b94770f1b0d72b6dddcb1ebb8123cb3712530b08cc387b349a3d8"
29
29
  URL="https://github.com/rhysd/actionlint/releases/download/v${ACTIONLINT_VERSION}/actionlint_${ACTIONLINT_VERSION}_linux_amd64.tar.gz"
30
- curl -sSL -o actionlint.tar.gz "$URL"
30
+ # --fail, or a transient HTTP error body is saved as the tarball and
31
+ # reported as "computed checksum did NOT match" — which reads like a
32
+ # tampered release. That cost this PR a full gate run.
33
+ curl -sSLf --retry 3 --retry-all-errors -o actionlint.tar.gz "$URL"
31
34
  echo "${CHECKSUM} actionlint.tar.gz" | sha256sum --check
32
35
  tar -xzf actionlint.tar.gz actionlint
33
36
  sudo mv actionlint /usr/local/bin/actionlint
@@ -197,6 +200,13 @@ jobs:
197
200
  # paragraph. The slice list is the same one release.yml expands, and
198
201
  # tests/contract/test_workflow_contracts.py keeps the three workflows and
199
202
  # the justfile agreeing.
203
+ #
204
+ # The slices are chosen by measured cost, not grouped by theme (#226):
205
+ # themed slices spanned 7m39s to 18m31s, and one test ran in two of them.
206
+ # Thirteen rather than six because the model that predicted the balanced
207
+ # six within 25s also says twelve reaches the floor and more buys nothing
208
+ # (#235). Which tests a slice owns and what each costs is E2E_SLICES in
209
+ # tests/e2e/conftest.py — change that, not this line, to move a test.
200
210
  name: e2e-${{ matrix.slice }}
201
211
  runs-on: ubuntu-latest
202
212
  timeout-minutes: 90
@@ -205,7 +215,7 @@ jobs:
205
215
  strategy:
206
216
  fail-fast: false
207
217
  matrix:
208
- slice: [core, transforms, remote-assist, runtime-tools, concurrency, media]
218
+ slice: [heartbeat, chatter, occupancy-grid, sized-payload, remote-assist, remote-assist-streams, runtime-tools, media, concurrency, benchmark-ab, benchmark-replay, benchmark-capacity, benchmark-capacity-cases]
209
219
 
210
220
  steps:
211
221
  - name: Check out repository
@@ -125,7 +125,7 @@ jobs:
125
125
  strategy:
126
126
  fail-fast: false
127
127
  matrix:
128
- slice: [core, transforms, remote-assist, runtime-tools, concurrency, media]
128
+ slice: [heartbeat, chatter, occupancy-grid, sized-payload, remote-assist, remote-assist-streams, runtime-tools, media, concurrency, benchmark-ab, benchmark-replay, benchmark-capacity, benchmark-capacity-cases]
129
129
 
130
130
  steps:
131
131
  - name: Check out repository
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rosotacom-dev
3
- Version: 2.5.dev17
3
+ Version: 2.5.dev20
4
4
  Summary: Host CLI for ROS OTA communication sessions.
5
5
  Author: develNor
6
6
  License-Expression: BSD-3-Clause
@@ -0,0 +1,7 @@
1
+ {"better": "lower", "hi": 0.5, "lo": -0.5, "metric": "loss_pct", "profile": "finding-3.2mbit", "provenance": {"fingerprint": "github-hosted-linux-x86_64", "floor": 0.5, "k": 3.0, "note": "boundary good-side seed from zero-loss-boundaries-18kb-20hz migrated evidence; ratchet after first nightly exercise", "ratcheted_at": "2026-07-09T00:00:00", "repeats": 9, "sigma": 0.0, "source_sha": "678be64", "window_s": 60.0}, "row": "boundary-loss-18kb20hz-bandwidth-cyclone", "schema": 2}
2
+ {"better": "higher", "hi": 6238.32, "lo": 5993.68, "metric": "capacity_size", "profile": "gate-tight", "provenance": {"fingerprint": "github-hosted-linux-x86_64", "floor": 122.32000000000001, "k": 3.0, "note": "runner-class calibration, K=5 independent GitHub-hosted runs", "ratcheted_at": "2026-07-08T15:14:07", "repeats": 5, "sigma": 4.8166378315169185, "source_sha": "8e1b41f", "window_s": 10.0}, "row": "capacity-size-tight-cyclone", "schema": 2}
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
+ {"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
+ {"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}
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}
@@ -43,7 +43,7 @@ check is:
43
43
  ci-success
44
44
  ```
45
45
 
46
- The merge gate runs workflow lint, dependency/security review, runtime/build asset lint, Python 3.10 through 3.14 non-Docker checks, package validation, and the Docker single-machine smoke matrix (divided into 5 parallel lanes):
46
+ The merge gate runs workflow lint, dependency/security review, runtime/build asset lint, Python 3.10 through 3.14 non-Docker checks, package validation, and the Docker single-machine smoke matrix (one matrix job per slice, thirteen in parallel):
47
47
 
48
48
  Python 3.10–3.14 are supported for the host CLI; Python 3.12 is the reference
49
49
  interpreter for packaging and Docker E2E jobs.
@@ -56,12 +56,20 @@ just typecheck
56
56
  just test-nondocker-cov
57
57
  just docs
58
58
  just package
59
- # Parallel E2E lanes:
60
- just test-e2e-core
61
- just test-e2e-transforms
62
- just test-e2e-remote-assist
63
- just test-e2e-runtime-tools
64
- just test-e2e-concurrency
59
+ # Parallel E2E lanes, one per slice:
60
+ just test-e2e-slice heartbeat
61
+ just test-e2e-slice chatter
62
+ just test-e2e-slice occupancy-grid
63
+ just test-e2e-slice sized-payload
64
+ just test-e2e-slice remote-assist
65
+ just test-e2e-slice remote-assist-streams
66
+ just test-e2e-slice runtime-tools
67
+ just test-e2e-slice media
68
+ just test-e2e-slice concurrency
69
+ just test-e2e-slice benchmark-ab
70
+ just test-e2e-slice benchmark-replay
71
+ just test-e2e-slice benchmark-capacity
72
+ just test-e2e-slice benchmark-capacity-cases
65
73
  ```
66
74
 
67
75
  The Python 3.12 leg uploads `coverage.xml` to Codecov with the `nondocker` flag.
@@ -69,18 +77,66 @@ Docker E2E is not collected for coverage.
69
77
 
70
78
  ## Docker E2E
71
79
 
72
- `just test-e2e-smoke` runs the entire local single-machine smoke matrix through Docker. In the CI merge gate, E2E testing is divided into parallel jobs (`e2e-core`, `e2e-transforms`, `e2e-remote-assist`, `e2e-runtime-tools`, `e2e-concurrency`) which run concurrently to minimize wall-clock time. Each smoke run writes generated
80
+ `just test-e2e-smoke` runs the entire local single-machine smoke matrix through Docker. In the CI merge gate, the same collection runs as thirteen parallel
81
+ jobs, one per slice, named `e2e-<slice>`. Each smoke run writes generated
73
82
  config, catmux pane logs, Docker logs when available, and the smoke verification
74
83
  log under `session-instances/`; collect that directory as the first debugging
75
84
  artifact when an E2E job fails.
76
85
 
86
+ ### Balancing the e2e slices
87
+
88
+ A slice is not its own pytest invocation. `just test-e2e-slice <name>` runs the
89
+ monolith's collection with `--e2e-slice=<name>`, and everything the named slice
90
+ does not own is deselected. Which tests a slice owns, and what each one costs,
91
+ is `E2E_SLICES` in `tests/e2e/conftest.py`; `just e2e-slice-costs` prints the
92
+ resulting balance. Moving a test between slices is one line there — the
93
+ workflow matrices only name slices.
94
+
95
+ That shape exists because the previous one, per-slice file lists and `-k`
96
+ filters, could not say what it ran. `-k "remote_assist"` silently missed the
97
+ `[remote-assist-anonymized-*]` parameters, and `-k "remote_assist"` and
98
+ `-k "anonymized"` silently *shared* one 262s test, which the gate therefore ran
99
+ twice a run. A partition can do neither: an unowned test fails every slice job
100
+ with a usage error, and a test owned twice fails
101
+ `test_e2e_slices_partition_the_whole_suite`.
102
+
103
+ The costs are warm pytest `call` durations — medians over seven merge-gate runs
104
+ of 2026-08-11/12. On top of them each job pays a fixed
105
+ `RUNNER_SETUP_SECONDS + IMAGE_BUILD_SECONDS` (3m29s: 55s of runner setup, then the
106
+ project image built inside whichever test runs first). Because that constant is
107
+ per job and not per test, balancing warm costs balances wall clock.
108
+
109
+ ### How many slices
110
+
111
+ `floor_seconds()` is `fixed + slowest single test` — the fastest any partition
112
+ of this suite could be, because one job has to run that test and pays the fixed
113
+ cost like every other. It is currently **7m56s**, of which 2m34s is the image
114
+ build (#236 is about removing it).
115
+
116
+ Thirteen slices sit at 8m38s, 1.09x the floor. That is the point of choosing N
117
+ from the numbers rather than from taste: six balanced slices were 13m37s,
118
+ twelve reach the floor, and past twelve every extra job is pure cost. The
119
+ contract test asserts distance to the floor rather than the spread between
120
+ slices — spread is compressed toward 1.0 by the fixed cost as N grows, so it
121
+ keeps reading fine while the gate stops improving.
122
+
123
+ Runner minutes are not the constraint here (this repository is public, so
124
+ standard GitHub-hosted runners are free); the concurrent-job cap is, and
125
+ thirteen stays under it.
126
+
127
+ To refresh the numbers, read a merge-gate run: every e2e invocation runs
128
+ `--durations=0`, so each job prints the cost of every test it ran. A test that
129
+ ran first in its job carries the image build and needs `IMAGE_BUILD_SECONDS`
130
+ subtracted. `tests/contract/test_workflow_contracts.py::test_e2e_slices_stay_close_to_the_floor`
131
+ fails when the slowest slice passes 1.25x the floor.
132
+
77
133
  ## Performance Regression Gate
78
134
 
79
135
  The deterministic benchmark rows gate against committed two-sided bands
80
136
  ([performance-bands.md](performance-bands.md), RFC 0007):
81
137
 
82
138
  - the `merge-gate` rows of the benched-set registry run inside the
83
- `e2e-runtime-tools` lane (band-asserted benchmark-capacity E2E);
139
+ `e2e-benchmark-capacity` lane (band-asserted benchmark-capacity E2E);
84
140
  - `.github/workflows/benchmark-gate.yml` runs the `nightly` rows on schedule
85
141
  and on manual dispatch. Its matrix comes from
86
142
  `rosotacom benchmark rows --format ids`; each row uploads `result.json` plus
@@ -74,6 +74,7 @@ rosotacom benchmark ratchet <run1> <run2> <run3> --budgets budgets.jsonl \
74
74
 
75
75
  Banded metrics today come from `probe` runs (`loss_pct`, plus
76
76
  `latency_p50_ms`/`latency_p95_ms` — monitor-only on shared runners),
77
+ `replay` runs (the probe set plus `delivered_count` and `delivered_hz`),
77
78
  `capacity` runs (`capacity_<knob>`) and `recovery` runs (`t_recover_s`,
78
79
  `t_steady_s`, `recovery_burst`, `lost_during_outage_total`).
79
80
 
@@ -95,16 +96,35 @@ rosotacom benchmark row <id> \
95
96
 
96
97
  `benchmark row` runs the row's genre with its committed parameters, gates the
97
98
  result against `budgets.jsonl`, and writes a machine-readable
98
- `verdict.json` (`WITHIN` / `REGRESSED` / `IMPROVED` / `REFUSED`, metrics,
99
- bands, sha, runner fingerprint) for downstream tooling. `--monitor` reports
100
- without blocking; `--no-compare` is for calibration repeats.
99
+ `verdict.json` (`WITHIN` / `REGRESSED` / `IMPROVED` / `EXPECT_FAILED` /
100
+ `REFUSED`, metrics, bands, sha, runner fingerprint) for downstream tooling.
101
+ `--monitor` reports without blocking; `--no-compare` is for calibration
102
+ repeats.
103
+
104
+ ### Replay rows: gated by the bag, not only by a band
105
+
106
+ A `genre: replay` row's load is not invented in the registry — every parameter
107
+ (cadence, mean payload, interval jitter, window) is a measurement of the
108
+ recording named in its `replay` block, and the loader refuses a row whose load
109
+ has drifted away from it. The bags stay in the operator harness; what is public
110
+ is their measured shape and the whole-bag `expect` fragment generated from them
111
+ (`rosotacom expect from-bag`), which `benchmark row` asserts on every gating
112
+ run: delivered count against `min_count`, delivered/expected against
113
+ `completeness_min_ratio`, and delivered rate against `vs_bag_ratio × native_hz`.
114
+ A run that misses any of them is `EXPECT_FAILED` and red, with the per-threshold
115
+ reasons in `verdict.json` under `replay_expect`.
116
+
117
+ That assertion is bag-derived rather than runner-derived, which is why replay is
118
+ the one genre allowed to land a row with no banded metrics at all: it gates from
119
+ the day it lands, and the bands follow from a calibration run on the runner
120
+ class. Every other genre still needs at least one banded metric.
101
121
 
102
122
  Lanes (RFC 0007 §4):
103
123
 
104
124
  - **merge gate** — the `merge-gate` rows run inside the benchmark-capacity E2E
105
125
  (`tests/e2e/test_benchmark_capacity.py::test_merge_gate_row_is_band_asserted`,
106
- lane `just test-e2e-runtime-tools`): minutes-scale, default RMW, one
107
- rate-limited profile.
126
+ lane `just test-e2e-slice benchmark-capacity`): minutes-scale, default RMW,
127
+ one rate-limited profile.
108
128
  - **nightly** — `.github/workflows/benchmark-gate.yml` runs every `nightly`
109
129
  row on schedule (and on dispatch), uploads per-row verdicts plus the
110
130
  aggregated `benchmark-gate-summary` artifact (`benchmark gate-summary`), and
@@ -123,7 +123,7 @@ links never gate; what changes is that deterministic rows now **block**:
123
123
  | Trigger | What runs | Verdict |
124
124
  |---|---|---|
125
125
  | per-PR (merge gate) | existing point-check suite **+ one minutes-scale regression row** (default RMW × one rate-limited profile, loss/capacity band) | **gate** |
126
- | nightly | the **regression matrix**: supported RMW variants × canonical profiles (nominal **and** tight) × loads (steady, GOP/a-b pattern, single-stream anonymized replay) + **boundary pairs** — all band-asserted | **gate** (red nightly = fix-first; promotion requires the candidate's nightly gate green) |
126
+ | nightly | the **regression matrix**: supported RMW variants × canonical profiles (nominal **and** tight) × loads (steady, GOP/a-b pattern, single-stream anonymized replay) + **boundary pairs** — band-asserted, except replay rows awaiting calibration, which assert their bag's whole-bag expect fragment instead | **gate** (red nightly = fix-first; promotion requires the candidate's nightly gate green) |
127
127
  | nightly | long sweeps, ramps, frontier searches | monitor (unchanged) |
128
128
  | on-demand | real WLAN/cellular characterization | monitor; calibrates the emulation (unchanged) |
129
129
 
@@ -255,7 +255,30 @@ slices these into issues.
255
255
  `benchmark gate-summary`; setup failure, `REGRESSED`, and unbanked
256
256
  `IMPROVED` are all red. S2 anonymized costmap/camera replay rows now cover
257
257
  nominal and tight profiles, carrying whole-bag expect fragments and GOP-aware
258
- metadata next to their committed bands.)*
258
+ metadata.)*
259
+ - [x] **Replay genre**: `genre: replay` for rows whose load is a measurement of
260
+ a recording rather than a chosen number — the registry checks the load against
261
+ that recording's provenance (cadence, window, mean payload, interval jitter),
262
+ `benchmark row` asserts the whole-bag `expect` fragment on every gating run,
263
+ and `delivered_count` / `delivered_hz` join the genre's metric set.
264
+ *(`benched_set.GENRES`/`_validate_replay_load_matches_bag`/
265
+ `replay_expect_failures`, `cli_benchmark.drive_replay` and the `EXPECT_FAILED`
266
+ verdict, `benchmark._replay_metrics_from_result`. The four public S2 rows are
267
+ `genre: replay`.)*
268
+ **Why it is not `probe` with extra fields:** as probe rows the provenance was
269
+ decoration — nothing checked the load against the bag, and the `expect`
270
+ fragment was never read by anything that runs. The genre is what makes both
271
+ assertions exist.
272
+ **Public limit (honest):** the anonymized S2 bags are not public, so a public
273
+ row replays the bag's *measured shape*, not its bytes. Byte-faithful replay
274
+ stays in the operator harness (`_run_private_replay_rows`, harness #34).
275
+ - [ ] **Replay row bands**: calibrate the four S2 rows on the runner class
276
+ (`.github/workflows/benchmark-calibrate.yml`, K repeats) and promote their
277
+ gated metrics out of `monitor` in the same change that commits the bands.
278
+ They land unbanded on purpose — a band is a measurement of the runner class
279
+ and must not be hand-written, while the bag-derived expect fragment gates from
280
+ day one. `tests/contract/test_benched_set_registry.py::test_public_s2_replay_rows_await_their_calibration`
281
+ fails the moment a band appears without the promotion.
259
282
  - [x] **Boundary must-fail rows**: oracle inversion (assert the failure
260
283
  signature) + happy-red messaging; seed with the documented 18 KB @ 20 Hz
261
284
  pairs. *(`GateRow.kind=boundary` + `benchmark row` now run good/bad sides,
@@ -303,7 +326,8 @@ slices these into issues.
303
326
  - [x] **Merge-gate row** — exercised by the merge gate itself (band-asserted
304
327
  benchmark-capacity E2E), runtime bounded by the workflow timeout.
305
328
  *(`test_benchmark_capacity.py::test_merge_gate_row_is_band_asserted` in the
306
- `e2e-runtime-tools` lane of `pr-merge-gate.yml`; a 60 s probe window plus
329
+ `e2e-benchmark-capacity` lane of `pr-merge-gate.yml` the `e2e-runtime-tools`
330
+ lane until #226 split the capacity probes out of it; a 60 s probe window plus
307
331
  session setup keeps it minutes-scale.)*
308
332
  - [x] **Nightly matrix** — one deliberately injected regression (canary
309
333
  branch) turns the lane red end-to-end; documented one-off exercise.
@@ -321,11 +345,36 @@ slices these into issues.
321
345
  which cannot run is red, not silently green.)*
322
346
  - [x] **S2 anonymized replay rows** — contract and unit tests pin the public
323
347
  costmap/camera rows in the nightly lane, their whole-bag expect fragments, GOP
324
- metadata, calibrated bands, and the probe metrics that turn replay loss into a
325
- canary failure.
348
+ metadata, and the delivery metrics that turn replay loss into a canary failure.
326
349
  *(`tests/contract/test_benched_set_registry.py::test_public_s2_replay_rows_carry_whole_bag_expect_metadata`,
327
- `tests/contract/test_benched_set_registry.py::test_every_gated_metric_has_a_calibrated_band`,
328
350
  `tests/unit/test_benchmark.py::test_probe_metrics_include_completeness_and_payload_bandwidth`.)*
351
+ - [x] **Replay load stays the bag's shape** — the registry refuses a replay row
352
+ whose cadence, window, mean payload or interval jitter has drifted from the
353
+ provenance it commits, and refuses an `expect.min_count` the bag's own message
354
+ count does not justify.
355
+ *(`tests/unit/test_benched_set.py::test_replay_load_must_stay_the_bag_shape`,
356
+ `::test_replay_expect_min_count_must_come_from_the_bag`,
357
+ `::test_replay_metadata_is_refused_on_a_synthetic_probe_row`.)*
358
+ - [x] **Replay expect gates without a band** — an unbanded replay row runs
359
+ against an empty band store instead of refusing, reports `WITHIN` when the
360
+ whole bag arrived, and `EXPECT_FAILED` (exit 1, per-threshold reasons in the
361
+ verdict) when it did not; `--monitor` reports the same verdict without
362
+ blocking.
363
+ *(`tests/unit/test_cli_benchmark.py::test_replay_row_gates_on_the_whole_bag_expect_without_any_band`,
364
+ `tests/unit/test_benched_set.py::test_replay_expect_names_every_threshold_that_did_not_hold`.
365
+ Exercised for real once against Docker on a dev laptop:
366
+ `replay-costmap-nominal-cyclone` on `gate-nominal` delivered 1386 msgs at
367
+ 9.9 Hz with 0 % loss and 674 kbit/s payload bandwidth → `WITHIN`, exit 0,
368
+ `bands: {}`; the same row pointed at a copy of the profile carrying netem
369
+ `loss 40%` delivered 28 msgs at 0.20 Hz → `EXPECT_FAILED`, exit 1, all three
370
+ thresholds named in the log and in `verdict.json`. That is the whole claim of
371
+ landing before calibration: the row is already a gate.)*
372
+ - [ ] **Replay bands reviewed** — the calibration evidence for the four S2 rows
373
+ (K repeats on the runner class) is reviewed and committed together with the
374
+ promotion out of `monitor`. Pending: no calibration run has been made for
375
+ them; `::test_public_s2_replay_rows_await_their_calibration` holds the step
376
+ open. The `--no-compare` + `benchmark calibrate` path they need is exercised
377
+ by `tests/unit/test_cli_benchmark.py::test_replay_calibration_run_reports_spread_for_the_metrics_a_band_would_take`.
329
378
  - [x] **Findings checker** — contract test: a finding without `Verification:`
330
379
  fails the ledger check.
331
380
  - [x] **Manual (explicit):** the first calibration is reviewed — band widths
@@ -125,12 +125,26 @@ from one-host smoke.
125
125
 
126
126
  `just test-e2e-smoke` runs the entire set of local-checkable curated examples. In CI and for local convenience, you can run specific E2E test slices or nodes:
127
127
 
128
- - `just test-e2e-core`: Runs core communication smoke tests.
129
- - `just test-e2e-transforms`: Runs transport transforms (compression, payload sizes).
130
- - `just test-e2e-remote-assist`: Runs anonymized remote assist streams.
131
- - `just test-e2e-runtime-tools`: Runs runtime utility/metrics E2E checks.
132
- - `just test-e2e-concurrency`: Runs concurrency/isolation gate checks.
128
+ - `just test-e2e-slice heartbeat`: the heartbeat matrix (and the opt-in RMW matrix).
129
+ - `just test-e2e-slice chatter`: the native chatter scenario, smoke, and debug rig.
130
+ - `just test-e2e-slice occupancy-grid`: compressed occupancy grid over both transports.
131
+ - `just test-e2e-slice sized-payload`: sized payload over both transports.
132
+ - `just test-e2e-slice remote-assist`: the full anonymized remote-assist rig.
133
+ - `just test-e2e-slice remote-assist-streams`: its costmap and camera single-stream cuts.
134
+ - `just test-e2e-slice runtime-tools`: link latency and live timeline stepping.
135
+ - `just test-e2e-slice media`: anonymization and video quality.
136
+ - `just test-e2e-slice concurrency`: the concurrency/isolation gate.
137
+ - `just test-e2e-slice benchmark-ab`: the A/B reliability verdict.
138
+ - `just test-e2e-slice benchmark-replay`: loss boundaries against costmap replay.
139
+ - `just test-e2e-slice benchmark-capacity`: the band-asserted capacity rows.
140
+ - `just test-e2e-slice benchmark-capacity-cases`: the capacity good/bad-case verdicts.
133
141
  - `just test-e2e-node <nodeid>`: Reruns a specific pytest node ID directly.
142
+ - `just e2e-slice-costs`: prints what each slice costs and how balanced the six are.
143
+
144
+ The slices are chosen by measured cost, and split where the tests already
145
+ differ so a red job names an area. `E2E_SLICES` in `tests/e2e/conftest.py`
146
+ decides which slice owns which test; see
147
+ [ci.md](ci.md#balancing-the-e2e-slices) before moving one.
134
148
 
135
149
  The generated RMW matrix is available as an opt-in full local slice:
136
150
 
@@ -42,39 +42,16 @@ test-e2e-smoke:
42
42
 
43
43
  test-e2e-fast: test-e2e-smoke
44
44
 
45
- test-e2e-core:
46
- ROSOTACOM_RUN_E2E=1 {{python}} -m pytest -q --durations=0 tests/e2e/test_smoke.py -k "heartbeat or chatter"
47
-
48
- test-e2e-transforms:
49
- ROSOTACOM_RUN_E2E=1 {{python}} -m pytest -q --durations=0 tests/e2e/test_smoke.py -k "occupancy_grid or sized_payload"
50
-
51
- test-e2e-remote-assist:
52
- ROSOTACOM_RUN_E2E=1 {{python}} -m pytest -q --durations=0 tests/e2e/test_smoke.py -k "remote_assist"
53
-
54
- # Two invocations on purpose: a shared `-k` filter would silently deselect
55
- # every test in the other files (contract-tested in test_benched_set_registry).
56
- test-e2e-runtime-tools:
57
- ROSOTACOM_RUN_E2E=1 {{python}} -m pytest -q --durations=0 tests/e2e/test_smoke.py -k "link_latency"
58
- ROSOTACOM_RUN_E2E=1 {{python}} -m pytest -q --durations=0 tests/e2e/test_timeline_stepping.py tests/e2e/test_benchmark_capacity.py tests/e2e/test_benchmark_ab.py tests/e2e/test_benchmark_replay.py
59
-
60
- # The remaining e2e files. Without this slice the partition is not one: the
61
- # monolithic `test-e2e-smoke` collects 28 tests, the other five collect 25, and
62
- # anonymization/video-quality/replay ran only in nightly and the release.
63
- test-e2e-media:
64
- ROSOTACOM_RUN_E2E=1 {{python}} -m pytest -q --durations=0 tests/e2e/test_anonymize_e2e.py tests/e2e/test_video_quality_e2e.py
65
- ROSOTACOM_RUN_E2E=1 {{python}} -m pytest -q --durations=0 tests/e2e/test_smoke.py -k "anonymized"
66
-
67
- test-e2e-concurrency:
68
- ROSOTACOM_RUN_E2E=1 {{python}} -m pytest -q --durations=0 tests/e2e/test_parallel_smoke.py
69
-
70
- # The five slices partition `test-e2e-smoke`; the merge gate and the release
71
- # both run them in parallel. This wrapper exists so a workflow matrix can select
72
- # a slice while the recipe name in the `run:` line stays a literal — a name
73
- # assembled by matrix interpolation is invisible to
74
- # tests/contract/test_workflow_contracts.py::test_referenced_just_recipes_exist.
75
- # Run one named slice of the e2e suite.
45
+ # Run one named slice of the e2e suite. Same collection as `test-e2e-smoke`,
46
+ # with everything the slice does not own deselected so a slice cannot miss a
47
+ # test or run one twice, which per-slice file lists and `-k` filters both did.
48
+ # Which tests a slice owns, and what each costs, is E2E_SLICES in
49
+ # tests/e2e/conftest.py; `just e2e-slice-costs` prints the balance.
76
50
  test-e2e-slice slice:
77
- just test-e2e-{{slice}}
51
+ ROSOTACOM_RUN_E2E=1 {{python}} -m pytest -q --durations=0 tests/e2e/ -m e2e --e2e-slice={{slice}}
52
+
53
+ e2e-slice-costs:
54
+ {{python}} tests/e2e/conftest.py
78
55
 
79
56
  test-e2e-node nodeid:
80
57
  ROSOTACOM_RUN_E2E=1 {{python}} -m pytest -q --durations=0 "{{nodeid}}"
@@ -103,6 +103,12 @@ select = ["B", "E", "F", "I", "UP"]
103
103
  [tool.ruff.lint.isort]
104
104
  known-first-party = ["rosotacom"]
105
105
 
106
+ [tool.ruff.lint.per-file-ignores]
107
+ # The e2e slice partition is a table of pytest node ids, which have to be
108
+ # verbatim to select anything and run past 120 characters on their own. Folding
109
+ # them would make the table neither readable nor greppable.
110
+ "tests/e2e/conftest.py" = ["E501"]
111
+
106
112
  [tool.mypy]
107
113
  python_version = "3.12"
108
114
  mypy_path = "src"