rosotacom-dev 2.5.dev26__tar.gz → 2.5.dev27__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.dev27/.github/actions/setup-just/action.yml +34 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/.github/workflows/benchmark-calibrate.yml +11 -10
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/.github/workflows/benchmark-gate.yml +11 -10
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/.github/workflows/dev-release.yml +1 -3
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/.github/workflows/image-scan.yml +1 -3
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/.github/workflows/nightly-e2e.yml +18 -8
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/.github/workflows/pr-lightweight.yml +1 -3
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/.github/workflows/pr-merge-gate.yml +58 -49
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/.github/workflows/release.yml +11 -10
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/PKG-INFO +1 -1
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/docs/ci.md +44 -10
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom_dev.egg-info/PKG-INFO +1 -1
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom_dev.egg-info/SOURCES.txt +1 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom_dev.egg-info/scm_file_list.json +1 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom_dev.egg-info/scm_version.json +2 -2
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/tests/contract/test_security_maintenance_config.py +3 -3
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/tests/contract/test_workflow_contracts.py +54 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/tests/e2e/conftest.py +21 -16
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/.devcontainer/devcontainer.json.template +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/.devcontainer/re_generate_devcontainer_json.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/.github/CODEOWNERS +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/.github/ISSUE_TEMPLATE/documentation-audit.md +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/.github/ISSUE_TEMPLATE/implementation-cleanup.md +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/.github/ISSUE_TEMPLATE/quality-workflow.md +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/.github/ISSUE_TEMPLATE/redesign.md +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/.github/ISSUE_TEMPLATE/release-process.md +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/.github/ISSUE_TEMPLATE/repository-diagnosis.md +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/.github/ISSUE_TEMPLATE/test-ci-audit.md +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/.github/ISSUE_TEMPLATE/work-item.md +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/.github/dependabot.yml +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/.pre-commit-config.yaml +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/AGENTS.md +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/CONCURRENCY.md +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/CONTRIBUTING.md +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/DEVELOPMENT_PRINCIPLES.md +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/LICENSE.txt +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/MANIFEST.in +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/README.md +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/budgets.jsonl +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/calibration/README.md +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/calibration/capacity-size-tight-cyclone.json +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/calibration/probe-loss-gop-tight-cyclone.json +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/calibration/probe-loss-nominal-cyclone.json +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/calibration/probe-loss-tight-cyclone.json +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/calibration/probe-loss-tight-fastdds.json +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/calibration/probe-loss-tight-zenoh.json +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/codecov.yml +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/deployment-configuration.md +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/docs/benchmark-ab.md +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/docs/benchmark-bag-as-load.md +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/docs/ffmpeg-keyframes.md +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/docs/findings/README.md +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/docs/findings/cyclone-spdp-discovery-bursts.md +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/docs/findings/delay-alone-no-loss.md +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/docs/findings/head-of-line-irregularity.md +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/docs/findings/jitter-loss-bandwidth-latency.md +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/docs/findings/lighter-message-loss.md +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/docs/findings/zero-loss-boundaries-18kb-20hz.md +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/docs/forensics-report.md +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/docs/geo-link-map.md +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/docs/github-repository-settings.md +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/docs/link-trace.md +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/docs/owner-runbook.md +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/docs/performance-bands.md +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/docs/playbooks/README.md +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/docs/quality-model.md +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/docs/release-notes/TEMPLATE.md +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/docs/release-notes/v2.1.md +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/docs/release-notes/v2.2.md +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/docs/release-notes/v2.3.md +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/docs/release-notes/v2.4.md +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/docs/release.md +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/docs/rfcs/0001-expectation-driven-test-suite.md +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/docs/rfcs/0002-expectation-concepts.md +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/docs/rfcs/0003-metric-backbone.md +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/docs/rfcs/0004-network-profiles.md +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/docs/rfcs/0005-benchmark-genres-and-ci.md +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/docs/rfcs/0006-dynamic-qos.md +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/docs/rfcs/0007-regression-gate.md +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/docs/rfcs/README.md +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/docs/testing.md +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/docs/work-items.md +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/install.sh +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/justfile +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/media/control_center.png +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/media/echo_test.png +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/media/forensics-report-example.png +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/media/host.png +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/media/vehicle.png +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/pyproject.toml +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/requirements.txt +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/rosotacom.yaml +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/run_session_in_container.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/session-configuration.md +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/setup.cfg +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/__init__.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/__main__.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/anonymize.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/bag_ground_truth.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/benched_set.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/benchmark.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/benchmark_delta.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/bundle_check.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/cli.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/cli_benchmark.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/deployment.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/ffmpeg_packet.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/forensics.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/geomap.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/image_cache.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/network_profiles.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/network_shaper.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/plots.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/py.typed +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/benched-set.yaml +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/examples/.gitignore +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/examples/README.md +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/examples/__init__.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/examples/bags/8_drop_reference/metadata.yaml +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/examples/deployment.example.yaml +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/examples/profiles.yaml +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/examples/ros2docker.json +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/examples/rosotacom.yaml +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/examples/scenarios/2_native_chatter/scenario-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/examples/scripts/1_heartbeat/run_machine_a.sh +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/examples/scripts/1_heartbeat/run_machine_b.sh +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_a/external.ros2docker.json +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_a/run_communication.sh +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_a/run_external.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_a/wait_for_echo_topic.sh +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_b/external.ros2docker.json +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_b/run_communication.sh +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_b/run_external.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_a/external.ros2docker.json +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_a/external_session.yaml +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_a/foxglove.json +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_a/run_communication.sh +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_a/run_external.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_b/costmap_1second/costmap_1second_0.mcap +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_b/costmap_1second/metadata.yaml +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_b/external.ros2docker.json +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_b/run_communication.sh +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_b/run_external.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_a/external.ros2docker.json +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_a/external_session.yaml +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_a/foxglove.json +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_a/run_communication.sh +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_a/run_external.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_b/costmap_1second/costmap_1second_0.mcap +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_b/costmap_1second/metadata.yaml +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_b/external.ros2docker.json +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_b/run_communication.sh +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_b/run_external.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_a/external.ros2docker.json +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_a/external_session.yaml +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_a/run_communication.sh +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_a/run_external.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_b/external.ros2docker.json +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_b/external_session.yaml +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_b/run_communication.sh +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_b/run_external.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_a/external.ros2docker.json +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_a/external_session.yaml +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_a/run_communication.sh +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_a/run_external.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_b/external.ros2docker.json +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_b/external_session.yaml +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_b/run_communication.sh +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_b/run_external.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/examples/sessions/10_restamp/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/examples/sessions/11_trickle/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/examples/sessions/12_content_integrity/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/examples/sessions/13_link_latency/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/examples/sessions/14_remote_assist_anonymized/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/examples/sessions/15_remote_assist_anonymized_costmap/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/examples/sessions/16_remote_assist_anonymized_camera/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/examples/sessions/17_synthetic_camera_quality/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/examples/sessions/1_heartbeat/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/examples/sessions/1_heartbeat_status/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/examples/sessions/2_native_chatter/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/examples/sessions/3_comp_occ_grid/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/examples/sessions/4_comp_occ_grid_zen/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/examples/sessions/5_sized_payload/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/examples/sessions/6_sized_payload_zen/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/examples/sessions/7_latched_static/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/examples/sessions/8_drop/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/examples/sessions/9_throttle/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/examples/sessions/bench_1_1_capacity/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/examples/sessions/bench_1_2_load_sweep/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/examples/sessions/bench_1_3_ramp/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/examples/sessions/bench_1_4_recovery/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/examples/sessions/bench_1_5_camera/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ros2docker.json.example +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ws/.vscode/c_cpp_properties.json +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ws/.vscode/settings.json +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_easy_mode.xml.template +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_initial_peer_list.xml.template +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_v2.xml.template +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_v3.xml.template +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_v4.xml.template +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_v5.xml.template +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ws/ota_configs/create_zenoh_json5.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ws/ota_configs/cyclonedds_minimal.xml.template +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ws/ota_configs/cyclonedds_tuned.xml.template +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ws/ota_configs/fastdds_unicast.xml.template +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ws/ota_configs/get_ota_xml.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ws/ota_configs/utils.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ws/ota_configs/zenoh.json5.template +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ws/ros2src/.gitkeep +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ws/ros2src/com_cpp/CMakeLists.txt +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ws/ros2src/com_cpp/COLCON_IGNORE +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ws/ros2src/com_cpp/LICENSE.txt +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ws/ros2src/com_cpp/package.xml +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ws/ros2src/com_cpp/src/hz_monitor.cpp +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ws/ros2src/com_cpp/src/universal_compressor.cpp +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ws/ros2src/com_cpp/src/universal_decompressor.cpp +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ws/ros2src/com_msgs/CMakeLists.txt +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ws/ros2src/com_msgs/LICENSE.txt +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ws/ros2src/com_msgs/msg/CompressedData.msg +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ws/ros2src/com_msgs/msg/EchoHeartbeat.msg +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ws/ros2src/com_msgs/msg/OtaStamped.msg +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ws/ros2src/com_msgs/msg/SizedPayload.msg +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ws/ros2src/com_msgs/package.xml +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ws/ros2src/com_py/LICENSE.txt +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ws/ros2src/com_py/com_py/__init__.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ws/ros2src/com_py/com_py/base_bridge_relay.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ws/ros2src/com_py/com_py/bridge_in.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ws/ros2src/com_py/com_py/bridge_out.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ws/ros2src/com_py/com_py/heartbeat_echo.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ws/ros2src/com_py/com_py/hz_monitor.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ws/ros2src/com_py/com_py/image_bandwidth_reducer.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ws/ros2src/com_py/com_py/image_pixel_capper.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ws/ros2src/com_py/com_py/lanelet_saver.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ws/ros2src/com_py/com_py/latch_relay.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/costmap_remapper.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/marker_remapper.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/speed_test.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/tf_remapper.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/traffic_monitor.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/wifi_network_analysis_1.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ws/ros2src/com_py/com_py/link_bytes.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ws/ros2src/com_py/com_py/link_trace.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ws/ros2src/com_py/com_py/local_global_frame_bridge.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ws/ros2src/com_py/com_py/localization_map_split_reduce_saver.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ws/ros2src/com_py/com_py/msg_transform.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ws/ros2src/com_py/com_py/pair_management.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ws/ros2src/com_py/com_py/pub_sub_pair.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ws/ros2src/com_py/com_py/qos.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ws/ros2src/com_py/com_py/relay_in.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ws/ros2src/com_py/com_py/relay_out.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ws/ros2src/com_py/com_py/restamp.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ws/ros2src/com_py/com_py/sized_publisher.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ws/ros2src/com_py/com_py/stage_latency.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ws/ros2src/com_py/com_py/stage_latency_core.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ws/ros2src/com_py/com_py/status_overview.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ws/ros2src/com_py/com_py/status_overview_core.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ws/ros2src/com_py/com_py/tf_map_to_cart_saver.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ws/ros2src/com_py/com_py/topic_monitor.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ws/ros2src/com_py/com_py/topic_resolution.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ws/ros2src/com_py/com_py/trickle.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ws/ros2src/com_py/com_py/universal_compressor.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ws/ros2src/com_py/com_py/universal_decompressor.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ws/ros2src/com_py/com_py/universal_ota_unwrapper.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ws/ros2src/com_py/com_py/universal_ota_wrapper.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ws/ros2src/com_py/package.xml +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ws/ros2src/com_py/resource/com_py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ws/ros2src/com_py/setup.cfg +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ws/ros2src/com_py/setup.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ws/ros2src/com_py/test/test_copyright.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ws/ros2src/com_py/test/test_flake8.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ws/ros2src/com_py/test/test_pep257.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ws/session/content/base/session_plugin_base.yaml +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ws/session/content/network/up_connectivity.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ws/session/content/network/wifi_network_analysis_2.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ws/session/creation/anonymize_bag.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ws/session/creation/catmux_log_setup.sh +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ws/session/creation/create_session_yaml.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ws/session/creation/generate_session_files.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ws/session/creation/run_session.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ws/session/creation/run_session_in_external_terminal.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/resources/ws/session/creation/strip_ansi.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/status_eval.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/stream_stats.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/trace_profiles.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/transit.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom/video_quality.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom_dev.egg-info/dependency_links.txt +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom_dev.egg-info/entry_points.txt +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom_dev.egg-info/requires.txt +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom_dev.egg-info/top_level.txt +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/stop_session_in_container.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/terminology.md +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/tests/contract/test_benched_set_registry.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/tests/contract/test_findings.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/tests/contract/test_markdown_links.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/tests/contract/test_ota_source_bundle.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/tests/contract/test_package_metadata.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/tests/contract/test_packaged_resources.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/tests/contract/test_profile_covers_generated_commands.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/tests/contract/test_pytest_policy.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/tests/contract/test_readme_examples.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/tests/contract/test_session_configuration_doc.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/tests/e2e/test_anonymize_e2e.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/tests/e2e/test_benchmark_ab.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/tests/e2e/test_benchmark_capacity.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/tests/e2e/test_benchmark_replay.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/tests/e2e/test_parallel_smoke.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/tests/e2e/test_smoke.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/tests/e2e/test_timeline_stepping.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/tests/e2e/test_video_quality_e2e.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/tests/sessions/generate_rmw_matrix.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/tests/sessions/rmw_matrix/1_heartbeat_cyclone-local_zenoh-ros2dds-ota/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/tests/sessions/rmw_matrix/1_heartbeat_cyclone-ota/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/tests/sessions/rmw_matrix/1_heartbeat_cyclone-ota-tuned/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/tests/sessions/rmw_matrix/1_heartbeat_fastdds/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/tests/sessions/rmw_matrix/1_heartbeat_zen-endpoints/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/tests/unit/test_anonymize.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/tests/unit/test_bag_ground_truth.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/tests/unit/test_benched_set.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/tests/unit/test_benchmark.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/tests/unit/test_benchmark_delta.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/tests/unit/test_bundle_check.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/tests/unit/test_cli.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/tests/unit/test_cli_benchmark.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/tests/unit/test_concurrency.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/tests/unit/test_deployment.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/tests/unit/test_ffmpeg_packet.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/tests/unit/test_forensics.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/tests/unit/test_geomap.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/tests/unit/test_image_cache.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/tests/unit/test_link_bytes.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/tests/unit/test_link_trace.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/tests/unit/test_network_profiles.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/tests/unit/test_network_shaper.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/tests/unit/test_ota_xml.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/tests/unit/test_plots.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/tests/unit/test_stage_latency.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/tests/unit/test_status_eval.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/tests/unit/test_status_overview.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/tests/unit/test_stream_stats.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/tests/unit/test_trace_profiles.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/tests/unit/test_transit.py +0 -0
- {rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/tests/unit/test_video_quality.py +0 -0
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
name: Set up just
|
|
2
|
+
description: >
|
|
3
|
+
Install a pinned just release, verified by checksum.
|
|
4
|
+
|
|
5
|
+
Nineteen jobs used to reach it with `apt-get update && apt-get install -y
|
|
6
|
+
just`, and almost all of that step's 9-15s was the index refresh — in every
|
|
7
|
+
job, including all thirteen e2e slices, where it sat on the merge gate's
|
|
8
|
+
critical path. A release tarball is ~2s.
|
|
9
|
+
|
|
10
|
+
It also stops the CI toolchain drifting: apt gave whatever noble currently
|
|
11
|
+
ships (1.21.0 at the time of writing), which changes without anything here
|
|
12
|
+
saying so.
|
|
13
|
+
|
|
14
|
+
runs:
|
|
15
|
+
using: composite
|
|
16
|
+
steps:
|
|
17
|
+
- name: Install just
|
|
18
|
+
shell: bash
|
|
19
|
+
run: |
|
|
20
|
+
set -euo pipefail
|
|
21
|
+
JUST_VERSION="1.58.0"
|
|
22
|
+
CHECKSUM="4a5cc2f53e6f0f8c59092a6cc38291eb729d46a7dd95d3ae582008881b84931d"
|
|
23
|
+
URL="https://github.com/casey/just/releases/download/${JUST_VERSION}/just-${JUST_VERSION}-x86_64-unknown-linux-musl.tar.gz"
|
|
24
|
+
# Unpacked outside the checkout: a stray tarball in the working tree is
|
|
25
|
+
# a thing every later step has to not trip over.
|
|
26
|
+
workdir="$(mktemp -d)"
|
|
27
|
+
# --fail, or a transient HTTP error body is saved as the tarball and
|
|
28
|
+
# reported as a checksum mismatch, which reads like a tampered release.
|
|
29
|
+
curl -sSLf --retry 3 --retry-all-errors -o "$workdir/just.tar.gz" "$URL"
|
|
30
|
+
echo "${CHECKSUM} $workdir/just.tar.gz" | sha256sum --check
|
|
31
|
+
tar -xzf "$workdir/just.tar.gz" -C "$workdir" just
|
|
32
|
+
sudo mv "$workdir/just" /usr/local/bin/just
|
|
33
|
+
rm -rf "$workdir"
|
|
34
|
+
just --version
|
{rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/.github/workflows/benchmark-calibrate.yml
RENAMED
|
@@ -44,9 +44,7 @@ jobs:
|
|
|
44
44
|
cache: pip
|
|
45
45
|
|
|
46
46
|
- name: Install just
|
|
47
|
-
|
|
48
|
-
sudo apt-get update
|
|
49
|
-
sudo apt-get install -y just
|
|
47
|
+
uses: ./.github/actions/setup-just
|
|
50
48
|
|
|
51
49
|
- name: Set up local environment
|
|
52
50
|
run: just setup
|
|
@@ -87,10 +85,15 @@ jobs:
|
|
|
87
85
|
python-version: "3.12"
|
|
88
86
|
cache: pip
|
|
89
87
|
|
|
90
|
-
- name: Install just
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
88
|
+
- name: Install just
|
|
89
|
+
uses: ./.github/actions/setup-just
|
|
90
|
+
|
|
91
|
+
- name: Ensure tmux
|
|
92
|
+
# Preinstalled on the GitHub-hosted image, so this is a probe
|
|
93
|
+
# rather than an install — but the dependency is named, so a
|
|
94
|
+
# runner image that drops it fails here instead of inside a
|
|
95
|
+
# session.
|
|
96
|
+
run: command -v tmux >/dev/null || { sudo apt-get update && sudo apt-get install -y tmux; }
|
|
94
97
|
|
|
95
98
|
- name: Set up local environment
|
|
96
99
|
run: just setup
|
|
@@ -132,9 +135,7 @@ jobs:
|
|
|
132
135
|
cache: pip
|
|
133
136
|
|
|
134
137
|
- name: Install just
|
|
135
|
-
|
|
136
|
-
sudo apt-get update
|
|
137
|
-
sudo apt-get install -y just
|
|
138
|
+
uses: ./.github/actions/setup-just
|
|
138
139
|
|
|
139
140
|
- name: Set up local environment
|
|
140
141
|
run: just setup
|
|
@@ -50,9 +50,7 @@ jobs:
|
|
|
50
50
|
cache: pip
|
|
51
51
|
|
|
52
52
|
- name: Install just
|
|
53
|
-
|
|
54
|
-
sudo apt-get update
|
|
55
|
-
sudo apt-get install -y just
|
|
53
|
+
uses: ./.github/actions/setup-just
|
|
56
54
|
|
|
57
55
|
- name: Set up local environment
|
|
58
56
|
run: just setup
|
|
@@ -87,10 +85,15 @@ jobs:
|
|
|
87
85
|
python-version: "3.12"
|
|
88
86
|
cache: pip
|
|
89
87
|
|
|
90
|
-
- name: Install just
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
88
|
+
- name: Install just
|
|
89
|
+
uses: ./.github/actions/setup-just
|
|
90
|
+
|
|
91
|
+
- name: Ensure tmux
|
|
92
|
+
# Preinstalled on the GitHub-hosted image, so this is a probe
|
|
93
|
+
# rather than an install — but the dependency is named, so a
|
|
94
|
+
# runner image that drops it fails here instead of inside a
|
|
95
|
+
# session.
|
|
96
|
+
run: command -v tmux >/dev/null || { sudo apt-get update && sudo apt-get install -y tmux; }
|
|
94
97
|
|
|
95
98
|
- name: Set up local environment
|
|
96
99
|
run: just setup
|
|
@@ -142,9 +145,7 @@ jobs:
|
|
|
142
145
|
cache: pip
|
|
143
146
|
|
|
144
147
|
- name: Install just
|
|
145
|
-
|
|
146
|
-
sudo apt-get update
|
|
147
|
-
sudo apt-get install -y just
|
|
148
|
+
uses: ./.github/actions/setup-just
|
|
148
149
|
|
|
149
150
|
- name: Set up local environment
|
|
150
151
|
run: just setup
|
|
@@ -51,10 +51,15 @@ jobs:
|
|
|
51
51
|
python-version: "3.12"
|
|
52
52
|
cache: pip
|
|
53
53
|
|
|
54
|
-
- name: Install just
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
54
|
+
- name: Install just
|
|
55
|
+
uses: ./.github/actions/setup-just
|
|
56
|
+
|
|
57
|
+
- name: Ensure tmux
|
|
58
|
+
# Preinstalled on the GitHub-hosted image, so this is a probe
|
|
59
|
+
# rather than an install — but the dependency is named, so a
|
|
60
|
+
# runner image that drops it fails here instead of inside a
|
|
61
|
+
# session.
|
|
62
|
+
run: command -v tmux >/dev/null || { sudo apt-get update && sudo apt-get install -y tmux; }
|
|
58
63
|
|
|
59
64
|
- name: Set up local environment
|
|
60
65
|
run: just setup
|
|
@@ -98,10 +103,15 @@ jobs:
|
|
|
98
103
|
python-version: "3.12"
|
|
99
104
|
cache: pip
|
|
100
105
|
|
|
101
|
-
- name: Install just
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
106
|
+
- name: Install just
|
|
107
|
+
uses: ./.github/actions/setup-just
|
|
108
|
+
|
|
109
|
+
- name: Ensure tmux
|
|
110
|
+
# Preinstalled on the GitHub-hosted image, so this is a probe
|
|
111
|
+
# rather than an install — but the dependency is named, so a
|
|
112
|
+
# runner image that drops it fails here instead of inside a
|
|
113
|
+
# session.
|
|
114
|
+
run: command -v tmux >/dev/null || { sudo apt-get update && sudo apt-get install -y tmux; }
|
|
105
115
|
|
|
106
116
|
- name: Set up local environment
|
|
107
117
|
run: just setup
|
|
@@ -71,9 +71,7 @@ jobs:
|
|
|
71
71
|
cache: pip
|
|
72
72
|
|
|
73
73
|
- name: Install just
|
|
74
|
-
|
|
75
|
-
sudo apt-get update
|
|
76
|
-
sudo apt-get install -y just
|
|
74
|
+
uses: ./.github/actions/setup-just
|
|
77
75
|
|
|
78
76
|
- name: Set up local environment
|
|
79
77
|
run: just setup
|
|
@@ -102,9 +100,7 @@ jobs:
|
|
|
102
100
|
cache: pip
|
|
103
101
|
|
|
104
102
|
- name: Install just
|
|
105
|
-
|
|
106
|
-
sudo apt-get update
|
|
107
|
-
sudo apt-get install -y just
|
|
103
|
+
uses: ./.github/actions/setup-just
|
|
108
104
|
|
|
109
105
|
- name: Set up local environment
|
|
110
106
|
run: just setup
|
|
@@ -152,9 +148,7 @@ jobs:
|
|
|
152
148
|
cache: pip
|
|
153
149
|
|
|
154
150
|
- name: Install just
|
|
155
|
-
|
|
156
|
-
sudo apt-get update
|
|
157
|
-
sudo apt-get install -y just
|
|
151
|
+
uses: ./.github/actions/setup-just
|
|
158
152
|
|
|
159
153
|
- name: Set up local environment
|
|
160
154
|
run: just setup
|
|
@@ -162,35 +156,46 @@ jobs:
|
|
|
162
156
|
- name: Validate package
|
|
163
157
|
run: just package
|
|
164
158
|
|
|
165
|
-
|
|
166
|
-
|
|
159
|
+
quick-gate:
|
|
160
|
+
# Everything `e2e` waits for that is not the image, and deliberately no
|
|
161
|
+
# more. It exists to answer one question — is the tree obviously broken,
|
|
162
|
+
# such that thirteen slices would burn seventy runner-minutes to say so.
|
|
163
|
+
#
|
|
164
|
+
# It replaced a `needs: preflight-success` edge that made e2e wait for the
|
|
165
|
+
# whole five-version matrix. That barrier cost 2.15 min of every gate run
|
|
166
|
+
# and had fired once in sixty runs, on `workflow-lint`, which takes 0.12
|
|
167
|
+
# min; the 2.0 min of `merge-lightweight` that set its height has never
|
|
168
|
+
# stopped an e2e round, and its expensive part is `test-nondocker-cov`
|
|
169
|
+
# (38s of 45s), which is a test suite rather than a tripwire.
|
|
170
|
+
#
|
|
171
|
+
# `lint` and `typecheck` are 4s together. The rest of this job is the fixed
|
|
172
|
+
# cost every job pays, which is also what `image` pays — so sizing the
|
|
173
|
+
# tripwire this way makes it free: e2e could not start before `image`
|
|
174
|
+
# finished anyway. Nothing merges on a weaker check than before, because
|
|
175
|
+
# `ci-success` still requires every preflight job.
|
|
176
|
+
name: quick-gate
|
|
167
177
|
runs-on: ubuntu-latest
|
|
168
|
-
|
|
169
|
-
if: always() && (github.event_name != 'pull_request' || github.event.pull_request.draft == false)
|
|
178
|
+
if: github.event_name != 'pull_request' || github.event.pull_request.draft == false
|
|
170
179
|
steps:
|
|
171
|
-
- name: Check
|
|
180
|
+
- name: Check out repository
|
|
181
|
+
uses: actions/checkout@v6
|
|
182
|
+
|
|
183
|
+
- name: Set up Python
|
|
184
|
+
uses: actions/setup-python@v6
|
|
185
|
+
with:
|
|
186
|
+
python-version: "3.12"
|
|
187
|
+
cache: pip
|
|
188
|
+
|
|
189
|
+
- name: Install just
|
|
190
|
+
uses: ./.github/actions/setup-just
|
|
191
|
+
|
|
192
|
+
- name: Set up local environment
|
|
193
|
+
run: just setup
|
|
194
|
+
|
|
195
|
+
- name: Is the tree obviously broken
|
|
172
196
|
run: |
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
exit 1
|
|
176
|
-
fi
|
|
177
|
-
if [[ "${{ github.event_name }}" == "pull_request" && "${{ needs.dependency-review.result }}" != "success" ]]; then
|
|
178
|
-
echo "dependency-review failed: ${{ needs.dependency-review.result }}"
|
|
179
|
-
exit 1
|
|
180
|
-
fi
|
|
181
|
-
if [[ "${{ needs.build-lint.result }}" != "success" ]]; then
|
|
182
|
-
echo "build-lint failed: ${{ needs.build-lint.result }}"
|
|
183
|
-
exit 1
|
|
184
|
-
fi
|
|
185
|
-
if [[ "${{ needs.merge-lightweight.result }}" != "success" ]]; then
|
|
186
|
-
echo "merge-lightweight failed: ${{ needs.merge-lightweight.result }}"
|
|
187
|
-
exit 1
|
|
188
|
-
fi
|
|
189
|
-
if [[ "${{ needs.package.result }}" != "success" ]]; then
|
|
190
|
-
echo "package failed: ${{ needs.package.result }}"
|
|
191
|
-
exit 1
|
|
192
|
-
fi
|
|
193
|
-
echo "All preflight checks passed"
|
|
197
|
+
just lint
|
|
198
|
+
just typecheck
|
|
194
199
|
|
|
195
200
|
image:
|
|
196
201
|
# Publish the images the e2e suite builds, once per set of build inputs,
|
|
@@ -208,8 +213,9 @@ jobs:
|
|
|
208
213
|
# is stale" is not a state this can reach — which is the objection #226
|
|
209
214
|
# raised against caching the image inline.
|
|
210
215
|
#
|
|
211
|
-
# Runs beside preflight rather than after
|
|
212
|
-
# manifests and stops
|
|
216
|
+
# Runs beside the preflight jobs rather than after them: on a hit it
|
|
217
|
+
# inspects two manifests and stops. It is what sets when `e2e` can
|
|
218
|
+
# start, which is why `quick-gate` is sized to finish inside it.
|
|
213
219
|
name: image
|
|
214
220
|
runs-on: ubuntu-latest
|
|
215
221
|
timeout-minutes: 60
|
|
@@ -231,9 +237,7 @@ jobs:
|
|
|
231
237
|
cache: pip
|
|
232
238
|
|
|
233
239
|
- name: Install just
|
|
234
|
-
|
|
235
|
-
sudo apt-get update
|
|
236
|
-
sudo apt-get install -y just
|
|
240
|
+
uses: ./.github/actions/setup-just
|
|
237
241
|
|
|
238
242
|
- name: Set up local environment
|
|
239
243
|
run: just setup
|
|
@@ -300,8 +304,8 @@ jobs:
|
|
|
300
304
|
name: e2e-${{ matrix.slice }}
|
|
301
305
|
runs-on: ubuntu-latest
|
|
302
306
|
timeout-minutes: 90
|
|
303
|
-
needs: [
|
|
304
|
-
if: always() && !cancelled() && needs.
|
|
307
|
+
needs: [quick-gate, image]
|
|
308
|
+
if: always() && !cancelled() && needs.quick-gate.result == 'success' && needs.image.result == 'success'
|
|
305
309
|
permissions:
|
|
306
310
|
contents: read
|
|
307
311
|
packages: read
|
|
@@ -322,10 +326,15 @@ jobs:
|
|
|
322
326
|
python-version: "3.12"
|
|
323
327
|
cache: pip
|
|
324
328
|
|
|
325
|
-
- name: Install just
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
+
- name: Install just
|
|
330
|
+
uses: ./.github/actions/setup-just
|
|
331
|
+
|
|
332
|
+
- name: Ensure tmux
|
|
333
|
+
# Preinstalled on the GitHub-hosted image, so this is a probe
|
|
334
|
+
# rather than an install — but the dependency is named, so a
|
|
335
|
+
# runner image that drops it fails here instead of inside a
|
|
336
|
+
# session.
|
|
337
|
+
run: command -v tmux >/dev/null || { sudo apt-get update && sudo apt-get install -y tmux; }
|
|
329
338
|
|
|
330
339
|
- name: Set up local environment
|
|
331
340
|
run: just setup
|
|
@@ -364,7 +373,7 @@ jobs:
|
|
|
364
373
|
- build-lint
|
|
365
374
|
- merge-lightweight
|
|
366
375
|
- package
|
|
367
|
-
-
|
|
376
|
+
- quick-gate
|
|
368
377
|
- image
|
|
369
378
|
- e2e
|
|
370
379
|
if: always() && (github.event_name != 'pull_request' || github.event.pull_request.draft == false)
|
|
@@ -392,8 +401,8 @@ jobs:
|
|
|
392
401
|
echo "package failed or was skipped: ${{ needs.package.result }}"
|
|
393
402
|
exit 1
|
|
394
403
|
fi
|
|
395
|
-
if [[ "${{ needs.
|
|
396
|
-
echo "
|
|
404
|
+
if [[ "${{ needs.quick-gate.result }}" != "success" ]]; then
|
|
405
|
+
echo "quick-gate failed or was skipped: ${{ needs.quick-gate.result }}"
|
|
397
406
|
exit 1
|
|
398
407
|
fi
|
|
399
408
|
if [[ "${{ needs.image.result }}" != "success" ]]; then
|
|
@@ -35,9 +35,7 @@ jobs:
|
|
|
35
35
|
cache: pip
|
|
36
36
|
|
|
37
37
|
- name: Install just
|
|
38
|
-
|
|
39
|
-
sudo apt-get update
|
|
40
|
-
sudo apt-get install -y just
|
|
38
|
+
uses: ./.github/actions/setup-just
|
|
41
39
|
|
|
42
40
|
- name: Set up local environment
|
|
43
41
|
run: just setup
|
|
@@ -67,9 +65,7 @@ jobs:
|
|
|
67
65
|
cache: pip
|
|
68
66
|
|
|
69
67
|
- name: Install just
|
|
70
|
-
|
|
71
|
-
sudo apt-get update
|
|
72
|
-
sudo apt-get install -y just
|
|
68
|
+
uses: ./.github/actions/setup-just
|
|
73
69
|
|
|
74
70
|
- name: Set up local environment
|
|
75
71
|
run: just setup
|
|
@@ -139,10 +135,15 @@ jobs:
|
|
|
139
135
|
python-version: "3.12"
|
|
140
136
|
cache: pip
|
|
141
137
|
|
|
142
|
-
- name: Install just
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
138
|
+
- name: Install just
|
|
139
|
+
uses: ./.github/actions/setup-just
|
|
140
|
+
|
|
141
|
+
- name: Ensure tmux
|
|
142
|
+
# Preinstalled on the GitHub-hosted image, so this is a probe
|
|
143
|
+
# rather than an install — but the dependency is named, so a
|
|
144
|
+
# runner image that drops it fails here instead of inside a
|
|
145
|
+
# session.
|
|
146
|
+
run: command -v tmux >/dev/null || { sudo apt-get update && sudo apt-get install -y tmux; }
|
|
146
147
|
|
|
147
148
|
- name: Set up local environment
|
|
148
149
|
run: just setup
|
|
@@ -48,6 +48,31 @@ The merge gate runs workflow lint, dependency/security review, runtime/build ass
|
|
|
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.
|
|
50
50
|
|
|
51
|
+
### What the e2e slices wait for
|
|
52
|
+
|
|
53
|
+
Every job in the gate starts at once — there is no runner contention — so the
|
|
54
|
+
only thing that decides when the thirteen slices start is their `needs`. They
|
|
55
|
+
wait for exactly two jobs:
|
|
56
|
+
|
|
57
|
+
- **`image`**, because a slice adopts the published image rather than building
|
|
58
|
+
it, so it cannot start before that image is known to exist. On a hit this is
|
|
59
|
+
two manifest inspections, and it is what sets the floor.
|
|
60
|
+
- **`quick-gate`**, `just lint && just typecheck` on one interpreter: the
|
|
61
|
+
cheapest signal that the tree is not obviously broken, so thirteen runners do
|
|
62
|
+
not spend seventy minutes discovering a syntax error. Four seconds of work,
|
|
63
|
+
sized to finish inside `image` and therefore free.
|
|
64
|
+
|
|
65
|
+
They used to wait for `preflight-success`, which meant the whole five-version
|
|
66
|
+
`merge-lightweight` matrix, and that cost **2.15 min of every gate run**.
|
|
67
|
+
Measured against the sixty runs before #248, it had stopped an e2e round once,
|
|
68
|
+
on `workflow-lint` — 0.12 min of the 2.15. Nothing about what may merge
|
|
69
|
+
changed: `ci-success` still requires `workflow-lint`, `build-lint`,
|
|
70
|
+
`merge-lightweight`, `package`, `quick-gate`, `image`, and `e2e`, and it is the
|
|
71
|
+
only required check in branch protection.
|
|
72
|
+
|
|
73
|
+
`tests/contract/test_workflow_contracts.py::test_e2e_waits_only_for_the_cheap_gate_and_the_image`
|
|
74
|
+
keeps the barrier from growing back.
|
|
75
|
+
|
|
51
76
|
```bash
|
|
52
77
|
just lint-workflows
|
|
53
78
|
just lint-build
|
|
@@ -159,26 +184,35 @@ with a usage error, and a test owned twice fails
|
|
|
159
184
|
|
|
160
185
|
The costs are warm pytest `call` durations — medians over seven merge-gate runs
|
|
161
186
|
of 2026-08-11/12. On top of them each job pays a fixed
|
|
162
|
-
`RUNNER_SETUP_SECONDS + IMAGE_BUILD_SECONDS` (
|
|
187
|
+
`RUNNER_SETUP_SECONDS + IMAGE_BUILD_SECONDS` (1m19s: 46s outside the tests, then
|
|
163
188
|
the project image obtained inside whichever test runs first). Because that
|
|
164
189
|
constant is per job and not per test, balancing warm costs balances wall clock.
|
|
165
190
|
|
|
166
191
|
`IMAGE_BUILD_SECONDS` models the merge gate, where that image is pulled rather
|
|
167
192
|
than built (see above); the release and nightly lanes still build and pay the
|
|
168
|
-
older 154s.
|
|
169
|
-
|
|
170
|
-
|
|
193
|
+
older 154s. It has now been re-measured twice, because both changes that made
|
|
194
|
+
it smaller were changes to what a job moves rather than to what it runs: 154 →
|
|
195
|
+
70 when #236 replaced the build with a pull, and 70 → 33 when #245 rebased the
|
|
196
|
+
image on `ros-base` and the published project image went 1640 MB → 957 MB.
|
|
197
|
+
Runs 31681061779 and 31687149587 ran the same partition either side of that, so
|
|
198
|
+
the paired per-slice difference measures it directly: median −37.4s over all
|
|
199
|
+
thirteen.
|
|
171
200
|
|
|
172
201
|
### How many slices
|
|
173
202
|
|
|
174
203
|
`floor_seconds()` is `fixed + slowest single test` — the fastest any partition
|
|
175
204
|
of this suite could be, because one job has to run that test and pays the fixed
|
|
176
|
-
cost like every other. It is currently **
|
|
177
|
-
(7m56s before #236 published it instead of rebuilding it per job
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
205
|
+
cost like every other. It is currently **5m47s**, of which 33s is the image
|
|
206
|
+
(7m56s before #236 published it instead of rebuilding it per job, 6m32s before
|
|
207
|
+
#245 shrank it).
|
|
208
|
+
|
|
209
|
+
Thirteen slices sit at 6m26s, **1.12x** the floor. That is the point of choosing
|
|
210
|
+
N from the numbers rather than from taste: six balanced slices were 13m37s,
|
|
211
|
+
twelve reach the floor, and past twelve every extra job is pure cost. Note that
|
|
212
|
+
1.12x is now a partition problem rather than a count problem — thirteen slices
|
|
213
|
+
*can* reach 1.00x, and the current assignment does not, because `occupancy-grid`
|
|
214
|
+
holds two 150s tests. The fixed cost falling twice is what exposed it: the same
|
|
215
|
+
partition was 1.11x of a floor that was a minute and a half higher. The
|
|
182
216
|
contract test asserts distance to the floor rather than the spread between
|
|
183
217
|
slices — spread is compressed toward 1.0 by the fixed cost as N grows, so it
|
|
184
218
|
keeps reading fine while the gate stops improving.
|
|
@@ -31,6 +31,7 @@ terminology.md
|
|
|
31
31
|
.github/ISSUE_TEMPLATE/repository-diagnosis.md
|
|
32
32
|
.github/ISSUE_TEMPLATE/test-ci-audit.md
|
|
33
33
|
.github/ISSUE_TEMPLATE/work-item.md
|
|
34
|
+
.github/actions/setup-just/action.yml
|
|
34
35
|
.github/workflows/benchmark-calibrate.yml
|
|
35
36
|
.github/workflows/benchmark-gate.yml
|
|
36
37
|
.github/workflows/dev-release.yml
|
{rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/src/rosotacom_dev.egg-info/scm_file_list.json
RENAMED
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
".github/ISSUE_TEMPLATE/test-ci-audit.md",
|
|
13
13
|
".github/ISSUE_TEMPLATE/work-item.md",
|
|
14
14
|
".github/PULL_REQUEST_TEMPLATE.md",
|
|
15
|
+
".github/actions/setup-just/action.yml",
|
|
15
16
|
".github/dependabot.yml",
|
|
16
17
|
".github/workflows/benchmark-calibrate.yml",
|
|
17
18
|
".github/workflows/benchmark-gate.yml",
|
|
@@ -92,7 +92,7 @@ def test_merge_gate_requires_new_ci_jobs_and_no_masking() -> None:
|
|
|
92
92
|
"build-lint",
|
|
93
93
|
"merge-lightweight",
|
|
94
94
|
"package",
|
|
95
|
-
"
|
|
95
|
+
"quick-gate",
|
|
96
96
|
"image",
|
|
97
97
|
"e2e",
|
|
98
98
|
}
|
|
@@ -101,9 +101,9 @@ def test_merge_gate_requires_new_ci_jobs_and_no_masking() -> None:
|
|
|
101
101
|
# Both gates the e2e slices wait on have to be green before any slice runs,
|
|
102
102
|
# and the `if` has to say so job by job: `needs` alone does not stop a
|
|
103
103
|
# dependency's failure from reaching a job that runs with `always()`.
|
|
104
|
-
assert set(jobs["e2e"]["needs"]) == {"
|
|
104
|
+
assert set(jobs["e2e"]["needs"]) == {"quick-gate", "image"}
|
|
105
105
|
assert jobs["e2e"]["if"] == (
|
|
106
|
-
"always() && !cancelled() && needs.
|
|
106
|
+
"always() && !cancelled() && needs.quick-gate.result == 'success' && needs.image.result == 'success'"
|
|
107
107
|
)
|
|
108
108
|
|
|
109
109
|
# Every needed job's result must be turned into an exit code by hand,
|
{rosotacom_dev-2.5.dev26 → rosotacom_dev-2.5.dev27}/tests/contract/test_workflow_contracts.py
RENAMED
|
@@ -414,3 +414,57 @@ def test_an_unowned_e2e_test_fails_every_slice_job() -> None:
|
|
|
414
414
|
|
|
415
415
|
assert "test_a_test_nobody_assigned" in str(excinfo.value)
|
|
416
416
|
assert "E2E_SLICES" in str(excinfo.value)
|
|
417
|
+
|
|
418
|
+
|
|
419
|
+
def test_every_workflow_installs_just_the_same_pinned_way() -> None:
|
|
420
|
+
"""`apt-get update` cost 9-15s in nineteen jobs to install one binary.
|
|
421
|
+
|
|
422
|
+
It was also the only unpinned tool in CI: apt gave whatever noble shipped
|
|
423
|
+
that week, so the `just` the gate ran changed without any commit saying so.
|
|
424
|
+
Both are fixed by the shared action, and both come back the moment one
|
|
425
|
+
workflow reintroduces the apt line — which is what this asserts.
|
|
426
|
+
"""
|
|
427
|
+
offenders = [
|
|
428
|
+
path.name
|
|
429
|
+
for path in sorted(WORKFLOWS_DIR.glob("*.yml"))
|
|
430
|
+
if "install -y just" in path.read_text(encoding="utf-8")
|
|
431
|
+
]
|
|
432
|
+
assert not offenders, "these workflows install just from apt instead of ./.github/actions/setup-just: " + ", ".join(
|
|
433
|
+
offenders
|
|
434
|
+
)
|
|
435
|
+
|
|
436
|
+
action = PACKAGE_ROOT / ".github" / "actions" / "setup-just" / "action.yml"
|
|
437
|
+
assert action.is_file(), "the shared setup-just action every workflow refers to does not exist"
|
|
438
|
+
body = action.read_text(encoding="utf-8")
|
|
439
|
+
assert "sha256sum --check" in body, "setup-just must verify the release it downloads"
|
|
440
|
+
|
|
441
|
+
|
|
442
|
+
def test_e2e_waits_only_for_the_cheap_gate_and_the_image() -> None:
|
|
443
|
+
"""The barrier `e2e` waits on has to stay cheaper than the image it also
|
|
444
|
+
waits on, or it starts costing wall clock again.
|
|
445
|
+
|
|
446
|
+
`needs: preflight-success` made every gate run wait 2.15 min for the
|
|
447
|
+
five-version `merge-lightweight` matrix. It had stopped an e2e round once
|
|
448
|
+
in sixty runs — on `workflow-lint`, which takes 0.12 min. `ci-success`
|
|
449
|
+
still requires every preflight job, so this is a change to when thirteen
|
|
450
|
+
runners start, not to what may merge.
|
|
451
|
+
"""
|
|
452
|
+
workflow = yaml.safe_load((WORKFLOWS_DIR / "pr-merge-gate.yml").read_text(encoding="utf-8"))
|
|
453
|
+
jobs = workflow["jobs"]
|
|
454
|
+
|
|
455
|
+
assert set(jobs["e2e"]["needs"]) == {"quick-gate", "image"}, (
|
|
456
|
+
f"e2e must wait for the cheap tripwire and the image, and nothing else: {jobs['e2e']['needs']}"
|
|
457
|
+
)
|
|
458
|
+
|
|
459
|
+
quick_gate_work = "\n".join(_workflow_run_blocks(jobs["quick-gate"]))
|
|
460
|
+
expensive = [
|
|
461
|
+
recipe for recipe in ("test-nondocker-cov", "test", "docs", "package") if f"just {recipe}" in quick_gate_work
|
|
462
|
+
]
|
|
463
|
+
assert not expensive, "quick-gate exists to be cheaper than the image job, so it must not run: " + ", ".join(
|
|
464
|
+
expensive
|
|
465
|
+
)
|
|
466
|
+
|
|
467
|
+
# And the jobs it stopped gating are still required to merge.
|
|
468
|
+
ci_success = jobs["ci-success"]
|
|
469
|
+
for name in ("workflow-lint", "build-lint", "merge-lightweight", "package"):
|
|
470
|
+
assert name in ci_success["needs"], f"{name} no longer gates the merge at all"
|