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.
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/.github/workflows/nightly-e2e.yml +1 -1
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/.github/workflows/pr-merge-gate.yml +12 -2
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/.github/workflows/release.yml +1 -1
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/PKG-INFO +1 -1
- rosotacom_dev-2.5.dev20/budgets.jsonl +7 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/docs/ci.md +65 -9
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/docs/performance-bands.md +25 -5
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/docs/rfcs/0007-regression-gate.md +55 -6
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/docs/testing.md +19 -5
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/justfile +9 -32
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/pyproject.toml +6 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/benched_set.py +164 -8
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/benchmark.py +52 -10
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/cli_benchmark.py +133 -20
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/benched-set.yaml +48 -24
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom_dev.egg-info/PKG-INFO +1 -1
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom_dev.egg-info/scm_version.json +2 -2
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/contract/test_benched_set_registry.py +53 -15
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/contract/test_security_maintenance_config.py +14 -3
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/contract/test_workflow_contracts.py +174 -19
- rosotacom_dev-2.5.dev20/tests/e2e/conftest.py +225 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/unit/test_benched_set.py +119 -8
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/unit/test_cli_benchmark.py +131 -0
- rosotacom_dev-2.5.dev17/budgets.jsonl +0 -15
- rosotacom_dev-2.5.dev17/tests/e2e/conftest.py +0 -14
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/.devcontainer/devcontainer.json.template +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/.devcontainer/re_generate_devcontainer_json.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/.github/CODEOWNERS +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/.github/ISSUE_TEMPLATE/documentation-audit.md +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/.github/ISSUE_TEMPLATE/implementation-cleanup.md +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/.github/ISSUE_TEMPLATE/quality-workflow.md +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/.github/ISSUE_TEMPLATE/redesign.md +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/.github/ISSUE_TEMPLATE/release-process.md +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/.github/ISSUE_TEMPLATE/repository-diagnosis.md +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/.github/ISSUE_TEMPLATE/test-ci-audit.md +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/.github/ISSUE_TEMPLATE/work-item.md +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/.github/dependabot.yml +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/.github/workflows/benchmark-calibrate.yml +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/.github/workflows/benchmark-gate.yml +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/.github/workflows/dev-release.yml +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/.github/workflows/image-scan.yml +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/.github/workflows/pr-lightweight.yml +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/.pre-commit-config.yaml +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/AGENTS.md +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/CONCURRENCY.md +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/CONTRIBUTING.md +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/DEVELOPMENT_PRINCIPLES.md +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/LICENSE.txt +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/MANIFEST.in +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/README.md +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/calibration/README.md +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/calibration/capacity-size-tight-cyclone.json +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/calibration/probe-loss-gop-tight-cyclone.json +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/calibration/probe-loss-nominal-cyclone.json +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/calibration/probe-loss-tight-cyclone.json +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/calibration/probe-loss-tight-fastdds.json +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/calibration/probe-loss-tight-zenoh.json +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/codecov.yml +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/deployment-configuration.md +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/docs/benchmark-ab.md +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/docs/benchmark-bag-as-load.md +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/docs/ffmpeg-keyframes.md +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/docs/findings/README.md +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/docs/findings/cyclone-spdp-discovery-bursts.md +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/docs/findings/delay-alone-no-loss.md +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/docs/findings/head-of-line-irregularity.md +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/docs/findings/jitter-loss-bandwidth-latency.md +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/docs/findings/lighter-message-loss.md +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/docs/findings/zero-loss-boundaries-18kb-20hz.md +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/docs/forensics-report.md +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/docs/geo-link-map.md +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/docs/github-repository-settings.md +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/docs/link-trace.md +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/docs/owner-runbook.md +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/docs/playbooks/README.md +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/docs/quality-model.md +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/docs/release-notes/TEMPLATE.md +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/docs/release-notes/v2.1.md +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/docs/release-notes/v2.2.md +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/docs/release-notes/v2.3.md +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/docs/release-notes/v2.4.md +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/docs/release.md +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/docs/rfcs/0001-expectation-driven-test-suite.md +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/docs/rfcs/0002-expectation-concepts.md +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/docs/rfcs/0003-metric-backbone.md +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/docs/rfcs/0004-network-profiles.md +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/docs/rfcs/0005-benchmark-genres-and-ci.md +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/docs/rfcs/0006-dynamic-qos.md +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/docs/rfcs/README.md +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/docs/work-items.md +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/install.sh +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/media/control_center.png +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/media/echo_test.png +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/media/forensics-report-example.png +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/media/host.png +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/media/vehicle.png +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/requirements.txt +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/rosotacom.yaml +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/run_session_in_container.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/session-configuration.md +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/setup.cfg +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/__init__.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/__main__.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/anonymize.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/bag_ground_truth.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/benchmark_delta.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/bundle_check.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/cli.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/deployment.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/ffmpeg_packet.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/forensics.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/geomap.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/network_profiles.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/network_shaper.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/plots.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/py.typed +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/.gitignore +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/README.md +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/__init__.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/bags/8_drop_reference/metadata.yaml +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/deployment.example.yaml +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/profiles.yaml +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/ros2docker.json +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/rosotacom.yaml +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/scenarios/2_native_chatter/scenario-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/scripts/1_heartbeat/run_machine_a.sh +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/scripts/1_heartbeat/run_machine_b.sh +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/sessions/10_restamp/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/sessions/11_trickle/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/sessions/12_content_integrity/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/sessions/13_link_latency/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/sessions/14_remote_assist_anonymized/session-definition.yaml +0 -0
- {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
- {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
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/sessions/17_synthetic_camera_quality/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/sessions/1_heartbeat/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/sessions/1_heartbeat_status/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/sessions/2_native_chatter/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/sessions/3_comp_occ_grid/session-definition.yaml +0 -0
- {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
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/sessions/5_sized_payload/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/sessions/6_sized_payload_zen/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/sessions/7_latched_static/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/sessions/8_drop/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/sessions/9_throttle/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/sessions/bench_1_1_capacity/session-definition.yaml +0 -0
- {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
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/sessions/bench_1_3_ramp/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/sessions/bench_1_4_recovery/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/examples/sessions/bench_1_5_camera/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ros2docker.json.example +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/.vscode/c_cpp_properties.json +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/.vscode/settings.json +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_easy_mode.xml.template +0 -0
- {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
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_v2.xml.template +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_v3.xml.template +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_v4.xml.template +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_v5.xml.template +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ota_configs/create_zenoh_json5.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ota_configs/cyclonedds_minimal.xml.template +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ota_configs/cyclonedds_tuned.xml.template +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ota_configs/fastdds_unicast.xml.template +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ota_configs/get_ota_xml.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ota_configs/utils.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ota_configs/zenoh.json5.template +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/.gitkeep +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_cpp/CMakeLists.txt +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_cpp/COLCON_IGNORE +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_cpp/LICENSE.txt +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_cpp/package.xml +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_cpp/src/hz_monitor.cpp +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_cpp/src/universal_compressor.cpp +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_cpp/src/universal_decompressor.cpp +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_msgs/CMakeLists.txt +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_msgs/LICENSE.txt +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_msgs/msg/CompressedData.msg +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_msgs/msg/EchoHeartbeat.msg +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_msgs/msg/OtaStamped.msg +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_msgs/msg/SizedPayload.msg +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_msgs/package.xml +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_py/LICENSE.txt +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_py/com_py/__init__.py +0 -0
- {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
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_py/com_py/bridge_in.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_py/com_py/bridge_out.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_py/com_py/heartbeat_echo.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_py/com_py/hz_monitor.py +0 -0
- {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
- {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
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_py/com_py/lanelet_saver.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_py/com_py/latch_relay.py +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_py/com_py/link_bytes.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_py/com_py/link_trace.py +0 -0
- {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
- {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
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_py/com_py/msg_transform.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_py/com_py/pair_management.py +0 -0
- {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
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_py/com_py/qos.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_py/com_py/relay_in.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_py/com_py/relay_out.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_py/com_py/restamp.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_py/com_py/sized_publisher.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_py/com_py/stage_latency.py +0 -0
- {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
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_py/com_py/status_overview.py +0 -0
- {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
- {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
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_py/com_py/topic_monitor.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_py/com_py/topic_resolution.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_py/com_py/trickle.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_py/com_py/universal_compressor.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_py/com_py/universal_decompressor.py +0 -0
- {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
- {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
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_py/package.xml +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_py/resource/com_py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_py/setup.cfg +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_py/setup.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_py/test/test_copyright.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_py/test/test_flake8.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/ros2src/com_py/test/test_pep257.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/session/content/base/session_plugin_base.yaml +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/session/content/network/up_connectivity.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/session/content/network/wifi_network_analysis_2.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/session/creation/anonymize_bag.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/session/creation/catmux_log_setup.sh +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/session/creation/create_session_yaml.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/session/creation/generate_session_files.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/session/creation/run_session.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/session/creation/run_session_in_external_terminal.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/resources/ws/session/creation/strip_ansi.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/status_eval.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/stream_stats.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/trace_profiles.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/transit.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom/video_quality.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom_dev.egg-info/SOURCES.txt +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom_dev.egg-info/dependency_links.txt +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom_dev.egg-info/entry_points.txt +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom_dev.egg-info/requires.txt +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom_dev.egg-info/scm_file_list.json +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/src/rosotacom_dev.egg-info/top_level.txt +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/stop_session_in_container.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/terminology.md +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/contract/test_findings.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/contract/test_markdown_links.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/contract/test_ota_source_bundle.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/contract/test_package_metadata.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/contract/test_packaged_resources.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/contract/test_profile_covers_generated_commands.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/contract/test_pytest_policy.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/contract/test_readme_examples.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/contract/test_session_configuration_doc.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/e2e/test_anonymize_e2e.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/e2e/test_benchmark_ab.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/e2e/test_benchmark_capacity.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/e2e/test_benchmark_replay.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/e2e/test_parallel_smoke.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/e2e/test_smoke.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/e2e/test_timeline_stepping.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/e2e/test_video_quality_e2e.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/sessions/generate_rmw_matrix.py +0 -0
- {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
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/sessions/rmw_matrix/1_heartbeat_cyclone-ota/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/sessions/rmw_matrix/1_heartbeat_cyclone-ota-tuned/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/sessions/rmw_matrix/1_heartbeat_fastdds/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/sessions/rmw_matrix/1_heartbeat_zen-endpoints/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/unit/test_anonymize.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/unit/test_bag_ground_truth.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/unit/test_benchmark.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/unit/test_benchmark_delta.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/unit/test_bundle_check.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/unit/test_cli.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/unit/test_concurrency.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/unit/test_deployment.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/unit/test_ffmpeg_packet.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/unit/test_forensics.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/unit/test_geomap.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/unit/test_link_bytes.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/unit/test_link_trace.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/unit/test_network_profiles.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/unit/test_network_shaper.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/unit/test_ota_xml.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/unit/test_plots.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/unit/test_stage_latency.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/unit/test_status_eval.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/unit/test_status_overview.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/unit/test_stream_stats.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/unit/test_trace_profiles.py +0 -0
- {rosotacom_dev-2.5.dev17 → rosotacom_dev-2.5.dev20}/tests/unit/test_transit.py +0 -0
- {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: [
|
|
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
|
-
|
|
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: [
|
|
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: [
|
|
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
|
|
@@ -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 (
|
|
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-
|
|
61
|
-
just test-e2e-
|
|
62
|
-
just test-e2e-
|
|
63
|
-
just test-e2e-
|
|
64
|
-
just test-e2e-
|
|
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,
|
|
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-
|
|
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` / `
|
|
99
|
-
bands, sha, runner fingerprint) for downstream tooling.
|
|
100
|
-
without blocking; `--no-compare` is for calibration
|
|
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-
|
|
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** —
|
|
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
|
|
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-
|
|
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,
|
|
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-
|
|
129
|
-
- `just test-e2e-
|
|
130
|
-
- `just test-e2e-
|
|
131
|
-
- `just test-e2e-
|
|
132
|
-
- `just test-e2e-
|
|
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-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
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
|
-
|
|
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"
|