rosotacom-dev 2.5.dev13__tar.gz → 2.5.dev15__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.dev13 → rosotacom_dev-2.5.dev15}/.github/workflows/nightly-e2e.yml +20 -4
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/.github/workflows/pr-merge-gate.yml +19 -228
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/PKG-INFO +1 -1
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/justfile +10 -10
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/session-configuration.md +37 -1
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ws/session/creation/generate_session_files.py +22 -14
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom_dev.egg-info/PKG-INFO +1 -1
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom_dev.egg-info/SOURCES.txt +1 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom_dev.egg-info/scm_file_list.json +1 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom_dev.egg-info/scm_version.json +2 -2
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/tests/contract/test_security_maintenance_config.py +23 -24
- rosotacom_dev-2.5.dev15/tests/contract/test_session_configuration_doc.py +44 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/tests/contract/test_workflow_contracts.py +51 -2
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/.devcontainer/devcontainer.json.template +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/.devcontainer/re_generate_devcontainer_json.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/.github/CODEOWNERS +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/.github/ISSUE_TEMPLATE/documentation-audit.md +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/.github/ISSUE_TEMPLATE/implementation-cleanup.md +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/.github/ISSUE_TEMPLATE/quality-workflow.md +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/.github/ISSUE_TEMPLATE/redesign.md +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/.github/ISSUE_TEMPLATE/release-process.md +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/.github/ISSUE_TEMPLATE/repository-diagnosis.md +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/.github/ISSUE_TEMPLATE/test-ci-audit.md +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/.github/ISSUE_TEMPLATE/work-item.md +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/.github/dependabot.yml +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/.github/workflows/benchmark-calibrate.yml +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/.github/workflows/benchmark-gate.yml +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/.github/workflows/dev-release.yml +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/.github/workflows/image-scan.yml +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/.github/workflows/pr-lightweight.yml +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/.github/workflows/release.yml +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/.pre-commit-config.yaml +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/AGENTS.md +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/CONCURRENCY.md +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/CONTRIBUTING.md +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/DEVELOPMENT_PRINCIPLES.md +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/LICENSE.txt +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/MANIFEST.in +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/README.md +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/budgets.jsonl +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/calibration/README.md +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/calibration/capacity-size-tight-cyclone.json +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/calibration/probe-loss-gop-tight-cyclone.json +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/calibration/probe-loss-nominal-cyclone.json +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/calibration/probe-loss-tight-cyclone.json +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/calibration/probe-loss-tight-fastdds.json +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/calibration/probe-loss-tight-zenoh.json +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/codecov.yml +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/deployment-configuration.md +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/docs/benchmark-ab.md +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/docs/benchmark-bag-as-load.md +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/docs/ci.md +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/docs/ffmpeg-keyframes.md +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/docs/findings/README.md +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/docs/findings/cyclone-spdp-discovery-bursts.md +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/docs/findings/delay-alone-no-loss.md +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/docs/findings/head-of-line-irregularity.md +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/docs/findings/jitter-loss-bandwidth-latency.md +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/docs/findings/lighter-message-loss.md +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/docs/findings/zero-loss-boundaries-18kb-20hz.md +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/docs/forensics-report.md +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/docs/geo-link-map.md +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/docs/github-repository-settings.md +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/docs/link-trace.md +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/docs/owner-runbook.md +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/docs/performance-bands.md +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/docs/playbooks/README.md +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/docs/quality-model.md +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/docs/release-notes/TEMPLATE.md +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/docs/release-notes/v2.1.md +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/docs/release-notes/v2.2.md +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/docs/release-notes/v2.3.md +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/docs/release-notes/v2.4.md +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/docs/release.md +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/docs/rfcs/0001-expectation-driven-test-suite.md +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/docs/rfcs/0002-expectation-concepts.md +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/docs/rfcs/0003-metric-backbone.md +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/docs/rfcs/0004-network-profiles.md +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/docs/rfcs/0005-benchmark-genres-and-ci.md +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/docs/rfcs/0006-dynamic-qos.md +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/docs/rfcs/0007-regression-gate.md +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/docs/rfcs/README.md +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/docs/testing.md +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/docs/work-items.md +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/install.sh +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/media/control_center.png +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/media/echo_test.png +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/media/forensics-report-example.png +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/media/host.png +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/media/vehicle.png +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/pyproject.toml +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/requirements.txt +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/rosotacom.yaml +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/run_session_in_container.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/setup.cfg +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/__init__.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/__main__.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/anonymize.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/bag_ground_truth.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/benched_set.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/benchmark.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/bundle_check.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/cli.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/cli_benchmark.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/deployment.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/ffmpeg_packet.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/forensics.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/geomap.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/network_profiles.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/network_shaper.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/plots.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/py.typed +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/benched-set.yaml +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/examples/.gitignore +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/examples/README.md +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/examples/__init__.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/examples/bags/8_drop_reference/metadata.yaml +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/examples/deployment.example.yaml +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/examples/profiles.yaml +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/examples/ros2docker.json +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/examples/rosotacom.yaml +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/examples/scenarios/2_native_chatter/scenario-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/examples/scripts/1_heartbeat/run_machine_a.sh +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/examples/scripts/1_heartbeat/run_machine_b.sh +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_a/external.ros2docker.json +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_a/run_communication.sh +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_a/run_external.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_a/wait_for_echo_topic.sh +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_b/external.ros2docker.json +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_b/run_communication.sh +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_b/run_external.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_a/external.ros2docker.json +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_a/external_session.yaml +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_a/foxglove.json +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_a/run_communication.sh +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_a/run_external.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_b/costmap_1second/costmap_1second_0.mcap +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_b/costmap_1second/metadata.yaml +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_b/external.ros2docker.json +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_b/run_communication.sh +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_b/run_external.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_a/external.ros2docker.json +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_a/external_session.yaml +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_a/foxglove.json +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_a/run_communication.sh +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_a/run_external.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_b/costmap_1second/costmap_1second_0.mcap +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_b/costmap_1second/metadata.yaml +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_b/external.ros2docker.json +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_b/run_communication.sh +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_b/run_external.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_a/external.ros2docker.json +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_a/external_session.yaml +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_a/run_communication.sh +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_a/run_external.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_b/external.ros2docker.json +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_b/external_session.yaml +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_b/run_communication.sh +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_b/run_external.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_a/external.ros2docker.json +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_a/external_session.yaml +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_a/run_communication.sh +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_a/run_external.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_b/external.ros2docker.json +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_b/external_session.yaml +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_b/run_communication.sh +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_b/run_external.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/examples/sessions/10_restamp/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/examples/sessions/11_trickle/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/examples/sessions/12_content_integrity/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/examples/sessions/13_link_latency/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/examples/sessions/14_remote_assist_anonymized/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/examples/sessions/15_remote_assist_anonymized_costmap/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/examples/sessions/16_remote_assist_anonymized_camera/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/examples/sessions/17_synthetic_camera_quality/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/examples/sessions/1_heartbeat/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/examples/sessions/1_heartbeat_status/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/examples/sessions/2_native_chatter/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/examples/sessions/3_comp_occ_grid/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/examples/sessions/4_comp_occ_grid_zen/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/examples/sessions/5_sized_payload/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/examples/sessions/6_sized_payload_zen/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/examples/sessions/7_latched_static/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/examples/sessions/8_drop/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/examples/sessions/9_throttle/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/examples/sessions/bench_1_1_capacity/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/examples/sessions/bench_1_2_load_sweep/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/examples/sessions/bench_1_3_ramp/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/examples/sessions/bench_1_4_recovery/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/examples/sessions/bench_1_5_camera/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ros2docker.json.example +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ws/.vscode/c_cpp_properties.json +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ws/.vscode/settings.json +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_easy_mode.xml.template +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_initial_peer_list.xml.template +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_v2.xml.template +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_v3.xml.template +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_v4.xml.template +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_v5.xml.template +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ws/ota_configs/create_zenoh_json5.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ws/ota_configs/cyclonedds_minimal.xml.template +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ws/ota_configs/cyclonedds_tuned.xml.template +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ws/ota_configs/fastdds_unicast.xml.template +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ws/ota_configs/get_ota_xml.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ws/ota_configs/utils.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ws/ota_configs/zenoh.json5.template +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ws/ros2src/.gitkeep +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ws/ros2src/com_cpp/CMakeLists.txt +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ws/ros2src/com_cpp/COLCON_IGNORE +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ws/ros2src/com_cpp/LICENSE.txt +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ws/ros2src/com_cpp/package.xml +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ws/ros2src/com_cpp/src/hz_monitor.cpp +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ws/ros2src/com_cpp/src/universal_compressor.cpp +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ws/ros2src/com_cpp/src/universal_decompressor.cpp +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ws/ros2src/com_msgs/CMakeLists.txt +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ws/ros2src/com_msgs/LICENSE.txt +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ws/ros2src/com_msgs/msg/CompressedData.msg +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ws/ros2src/com_msgs/msg/EchoHeartbeat.msg +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ws/ros2src/com_msgs/msg/OtaStamped.msg +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ws/ros2src/com_msgs/msg/SizedPayload.msg +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ws/ros2src/com_msgs/package.xml +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ws/ros2src/com_py/LICENSE.txt +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ws/ros2src/com_py/com_py/__init__.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ws/ros2src/com_py/com_py/base_bridge_relay.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ws/ros2src/com_py/com_py/bridge_in.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ws/ros2src/com_py/com_py/bridge_out.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ws/ros2src/com_py/com_py/heartbeat_echo.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ws/ros2src/com_py/com_py/hz_monitor.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ws/ros2src/com_py/com_py/image_bandwidth_reducer.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ws/ros2src/com_py/com_py/image_pixel_capper.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ws/ros2src/com_py/com_py/lanelet_saver.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ws/ros2src/com_py/com_py/latch_relay.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/costmap_remapper.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/marker_remapper.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/speed_test.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/tf_remapper.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/traffic_monitor.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/wifi_network_analysis_1.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ws/ros2src/com_py/com_py/link_bytes.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ws/ros2src/com_py/com_py/link_trace.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ws/ros2src/com_py/com_py/local_global_frame_bridge.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ws/ros2src/com_py/com_py/localization_map_split_reduce_saver.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ws/ros2src/com_py/com_py/msg_transform.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ws/ros2src/com_py/com_py/pair_management.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ws/ros2src/com_py/com_py/pub_sub_pair.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ws/ros2src/com_py/com_py/qos.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ws/ros2src/com_py/com_py/relay_in.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ws/ros2src/com_py/com_py/relay_out.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ws/ros2src/com_py/com_py/restamp.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ws/ros2src/com_py/com_py/sized_publisher.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ws/ros2src/com_py/com_py/stage_latency.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ws/ros2src/com_py/com_py/stage_latency_core.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ws/ros2src/com_py/com_py/status_overview.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ws/ros2src/com_py/com_py/status_overview_core.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ws/ros2src/com_py/com_py/tf_map_to_cart_saver.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ws/ros2src/com_py/com_py/topic_monitor.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ws/ros2src/com_py/com_py/topic_resolution.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ws/ros2src/com_py/com_py/trickle.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ws/ros2src/com_py/com_py/universal_compressor.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ws/ros2src/com_py/com_py/universal_decompressor.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ws/ros2src/com_py/com_py/universal_ota_unwrapper.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ws/ros2src/com_py/com_py/universal_ota_wrapper.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ws/ros2src/com_py/package.xml +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ws/ros2src/com_py/resource/com_py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ws/ros2src/com_py/setup.cfg +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ws/ros2src/com_py/setup.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ws/ros2src/com_py/test/test_copyright.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ws/ros2src/com_py/test/test_flake8.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ws/ros2src/com_py/test/test_pep257.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ws/session/content/base/session_plugin_base.yaml +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ws/session/content/network/up_connectivity.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ws/session/content/network/wifi_network_analysis_2.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ws/session/creation/anonymize_bag.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ws/session/creation/catmux_log_setup.sh +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ws/session/creation/create_session_yaml.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ws/session/creation/run_session.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ws/session/creation/run_session_in_external_terminal.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/resources/ws/session/creation/strip_ansi.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/status_eval.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/stream_stats.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/trace_profiles.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/transit.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom/video_quality.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom_dev.egg-info/dependency_links.txt +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom_dev.egg-info/entry_points.txt +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom_dev.egg-info/requires.txt +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom_dev.egg-info/top_level.txt +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/stop_session_in_container.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/terminology.md +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/tests/contract/test_benched_set_registry.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/tests/contract/test_findings.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/tests/contract/test_markdown_links.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/tests/contract/test_ota_source_bundle.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/tests/contract/test_package_metadata.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/tests/contract/test_packaged_resources.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/tests/contract/test_profile_covers_generated_commands.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/tests/contract/test_pytest_policy.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/tests/contract/test_readme_examples.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/tests/e2e/conftest.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/tests/e2e/test_anonymize_e2e.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/tests/e2e/test_benchmark_ab.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/tests/e2e/test_benchmark_capacity.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/tests/e2e/test_benchmark_replay.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/tests/e2e/test_parallel_smoke.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/tests/e2e/test_smoke.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/tests/e2e/test_timeline_stepping.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/tests/e2e/test_video_quality_e2e.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/tests/sessions/generate_rmw_matrix.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/tests/sessions/rmw_matrix/1_heartbeat_cyclone-local_zenoh-ros2dds-ota/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/tests/sessions/rmw_matrix/1_heartbeat_cyclone-ota/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/tests/sessions/rmw_matrix/1_heartbeat_cyclone-ota-tuned/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/tests/sessions/rmw_matrix/1_heartbeat_fastdds/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/tests/sessions/rmw_matrix/1_heartbeat_zen-endpoints/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/tests/unit/test_anonymize.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/tests/unit/test_bag_ground_truth.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/tests/unit/test_benched_set.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/tests/unit/test_benchmark.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/tests/unit/test_bundle_check.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/tests/unit/test_cli.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/tests/unit/test_cli_benchmark.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/tests/unit/test_concurrency.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/tests/unit/test_deployment.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/tests/unit/test_ffmpeg_packet.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/tests/unit/test_forensics.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/tests/unit/test_geomap.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/tests/unit/test_link_bytes.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/tests/unit/test_link_trace.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/tests/unit/test_network_profiles.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/tests/unit/test_network_shaper.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/tests/unit/test_ota_xml.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/tests/unit/test_plots.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/tests/unit/test_stage_latency.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/tests/unit/test_status_eval.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/tests/unit/test_status_overview.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/tests/unit/test_stream_stats.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/tests/unit/test_trace_profiles.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/tests/unit/test_transit.py +0 -0
- {rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/tests/unit/test_video_quality.py +0 -0
|
@@ -19,9 +19,25 @@ concurrency:
|
|
|
19
19
|
|
|
20
20
|
jobs:
|
|
21
21
|
smoke-e2e:
|
|
22
|
-
|
|
22
|
+
# The same six slices the merge gate and the release run, instead of one
|
|
23
|
+
# sequential `just test-e2e-smoke` over the whole suite (#198). Keeping the
|
|
24
|
+
# monolith here was deliberate while the slices were hand-maintained `-k`
|
|
25
|
+
# expressions that had silently stopped covering three files; #197's
|
|
26
|
+
# test_e2e_slices_partition_the_whole_suite closed that, so the union is
|
|
27
|
+
# now guaranteed to be the monolith.
|
|
28
|
+
#
|
|
29
|
+
# The gain is diagnosis: a red monolith says "e2e broke", six slices say
|
|
30
|
+
# which area did. It also removes a load-induced flake. On 2026-08-11 the
|
|
31
|
+
# nightly failed with nine "Timed out waiting for container readiness"
|
|
32
|
+
# errors after 1h12m on one runner, while the same tests on the same commit
|
|
33
|
+
# passed in the merge gate — where they are spread over six.
|
|
34
|
+
name: smoke-e2e-${{ matrix.slice }}
|
|
23
35
|
runs-on: ubuntu-latest
|
|
24
36
|
timeout-minutes: 90
|
|
37
|
+
strategy:
|
|
38
|
+
fail-fast: false
|
|
39
|
+
matrix:
|
|
40
|
+
slice: [core, transforms, remote-assist, runtime-tools, concurrency, media]
|
|
25
41
|
|
|
26
42
|
steps:
|
|
27
43
|
- name: Check out repository
|
|
@@ -46,14 +62,14 @@ jobs:
|
|
|
46
62
|
- name: Show Docker environment
|
|
47
63
|
run: docker info
|
|
48
64
|
|
|
49
|
-
- name: Run
|
|
50
|
-
run: just test-e2e-
|
|
65
|
+
- name: Run E2E slice
|
|
66
|
+
run: just test-e2e-slice ${{ matrix.slice }}
|
|
51
67
|
|
|
52
68
|
- name: Upload smoke session artifacts
|
|
53
69
|
if: failure()
|
|
54
70
|
uses: actions/upload-artifact@v7
|
|
55
71
|
with:
|
|
56
|
-
name: session-instances-smoke
|
|
72
|
+
name: session-instances-smoke-${{ matrix.slice }}
|
|
57
73
|
path: session-instances/
|
|
58
74
|
if-no-files-found: ignore
|
|
59
75
|
|
|
@@ -189,212 +189,24 @@ jobs:
|
|
|
189
189
|
fi
|
|
190
190
|
echo "All preflight checks passed"
|
|
191
191
|
|
|
192
|
-
e2e
|
|
193
|
-
|
|
192
|
+
e2e:
|
|
193
|
+
# One matrix job, not six near-identical copies. The copies were how
|
|
194
|
+
# `e2e-media` ended up listed in ci-success's `needs` with no check on its
|
|
195
|
+
# result: a failing media slice did not fail the gate. A matrix has one
|
|
196
|
+
# result for all slices, so that hole cannot be reopened by forgetting a
|
|
197
|
+
# paragraph. The slice list is the same one release.yml expands, and
|
|
198
|
+
# tests/contract/test_workflow_contracts.py keeps the three workflows and
|
|
199
|
+
# the justfile agreeing.
|
|
200
|
+
name: e2e-${{ matrix.slice }}
|
|
194
201
|
runs-on: ubuntu-latest
|
|
195
202
|
timeout-minutes: 90
|
|
196
203
|
needs: preflight-success
|
|
197
204
|
if: always() && !cancelled() && needs.preflight-success.result == 'success'
|
|
198
|
-
|
|
199
|
-
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
fetch-depth: 0
|
|
203
|
-
|
|
204
|
-
- name: Set up Python
|
|
205
|
-
uses: actions/setup-python@v6
|
|
206
|
-
with:
|
|
207
|
-
python-version: "3.12"
|
|
208
|
-
cache: pip
|
|
209
|
-
|
|
210
|
-
- name: Install just and tmux
|
|
211
|
-
run: |
|
|
212
|
-
sudo apt-get update
|
|
213
|
-
sudo apt-get install -y just tmux
|
|
214
|
-
|
|
215
|
-
- name: Set up local environment
|
|
216
|
-
run: just setup
|
|
217
|
-
|
|
218
|
-
- name: Show Docker environment
|
|
219
|
-
run: docker info
|
|
220
|
-
|
|
221
|
-
- name: Run core E2E tests
|
|
222
|
-
run: just test-e2e-core
|
|
223
|
-
|
|
224
|
-
- name: Upload session artifacts
|
|
225
|
-
if: failure()
|
|
226
|
-
uses: actions/upload-artifact@v7
|
|
227
|
-
with:
|
|
228
|
-
name: session-instances-e2e-core
|
|
229
|
-
path: session-instances/
|
|
230
|
-
if-no-files-found: ignore
|
|
231
|
-
|
|
232
|
-
e2e-transforms:
|
|
233
|
-
name: e2e-transforms
|
|
234
|
-
runs-on: ubuntu-latest
|
|
235
|
-
timeout-minutes: 90
|
|
236
|
-
needs: preflight-success
|
|
237
|
-
if: always() && !cancelled() && needs.preflight-success.result == 'success'
|
|
238
|
-
steps:
|
|
239
|
-
- name: Check out repository
|
|
240
|
-
uses: actions/checkout@v6
|
|
241
|
-
with:
|
|
242
|
-
fetch-depth: 0
|
|
243
|
-
|
|
244
|
-
- name: Set up Python
|
|
245
|
-
uses: actions/setup-python@v6
|
|
246
|
-
with:
|
|
247
|
-
python-version: "3.12"
|
|
248
|
-
cache: pip
|
|
249
|
-
|
|
250
|
-
- name: Install just and tmux
|
|
251
|
-
run: |
|
|
252
|
-
sudo apt-get update
|
|
253
|
-
sudo apt-get install -y just tmux
|
|
254
|
-
|
|
255
|
-
- name: Set up local environment
|
|
256
|
-
run: just setup
|
|
257
|
-
|
|
258
|
-
- name: Show Docker environment
|
|
259
|
-
run: docker info
|
|
260
|
-
|
|
261
|
-
- name: Run transform E2E tests
|
|
262
|
-
run: just test-e2e-transforms
|
|
263
|
-
|
|
264
|
-
- name: Upload session artifacts
|
|
265
|
-
if: failure()
|
|
266
|
-
uses: actions/upload-artifact@v7
|
|
267
|
-
with:
|
|
268
|
-
name: session-instances-e2e-transforms
|
|
269
|
-
path: session-instances/
|
|
270
|
-
if-no-files-found: ignore
|
|
271
|
-
|
|
272
|
-
e2e-remote-assist:
|
|
273
|
-
name: e2e-remote-assist
|
|
274
|
-
runs-on: ubuntu-latest
|
|
275
|
-
timeout-minutes: 90
|
|
276
|
-
needs: preflight-success
|
|
277
|
-
if: always() && !cancelled() && needs.preflight-success.result == 'success'
|
|
278
|
-
steps:
|
|
279
|
-
- name: Check out repository
|
|
280
|
-
uses: actions/checkout@v6
|
|
281
|
-
with:
|
|
282
|
-
fetch-depth: 0
|
|
283
|
-
|
|
284
|
-
- name: Set up Python
|
|
285
|
-
uses: actions/setup-python@v6
|
|
286
|
-
with:
|
|
287
|
-
python-version: "3.12"
|
|
288
|
-
cache: pip
|
|
289
|
-
|
|
290
|
-
- name: Install just and tmux
|
|
291
|
-
run: |
|
|
292
|
-
sudo apt-get update
|
|
293
|
-
sudo apt-get install -y just tmux
|
|
294
|
-
|
|
295
|
-
- name: Set up local environment
|
|
296
|
-
run: just setup
|
|
297
|
-
|
|
298
|
-
- name: Show Docker environment
|
|
299
|
-
run: docker info
|
|
300
|
-
|
|
301
|
-
- name: Run remote assist E2E tests
|
|
302
|
-
run: just test-e2e-remote-assist
|
|
303
|
-
|
|
304
|
-
- name: Upload session artifacts
|
|
305
|
-
if: failure()
|
|
306
|
-
uses: actions/upload-artifact@v7
|
|
307
|
-
with:
|
|
308
|
-
name: session-instances-e2e-remote-assist
|
|
309
|
-
path: session-instances/
|
|
310
|
-
if-no-files-found: ignore
|
|
311
|
-
|
|
312
|
-
e2e-runtime-tools:
|
|
313
|
-
name: e2e-runtime-tools
|
|
314
|
-
runs-on: ubuntu-latest
|
|
315
|
-
timeout-minutes: 90
|
|
316
|
-
needs: preflight-success
|
|
317
|
-
if: always() && !cancelled() && needs.preflight-success.result == 'success'
|
|
318
|
-
steps:
|
|
319
|
-
- name: Check out repository
|
|
320
|
-
uses: actions/checkout@v6
|
|
321
|
-
with:
|
|
322
|
-
fetch-depth: 0
|
|
323
|
-
|
|
324
|
-
- name: Set up Python
|
|
325
|
-
uses: actions/setup-python@v6
|
|
326
|
-
with:
|
|
327
|
-
python-version: "3.12"
|
|
328
|
-
cache: pip
|
|
329
|
-
|
|
330
|
-
- name: Install just and tmux
|
|
331
|
-
run: |
|
|
332
|
-
sudo apt-get update
|
|
333
|
-
sudo apt-get install -y just tmux
|
|
334
|
-
|
|
335
|
-
- name: Set up local environment
|
|
336
|
-
run: just setup
|
|
337
|
-
|
|
338
|
-
- name: Show Docker environment
|
|
339
|
-
run: docker info
|
|
340
|
-
|
|
341
|
-
- name: Run runtime tools E2E tests
|
|
342
|
-
run: just test-e2e-runtime-tools
|
|
343
|
-
|
|
344
|
-
- name: Upload session artifacts
|
|
345
|
-
if: failure()
|
|
346
|
-
uses: actions/upload-artifact@v7
|
|
347
|
-
with:
|
|
348
|
-
name: session-instances-e2e-runtime-tools
|
|
349
|
-
path: session-instances/
|
|
350
|
-
if-no-files-found: ignore
|
|
351
|
-
|
|
352
|
-
e2e-concurrency:
|
|
353
|
-
name: e2e-concurrency
|
|
354
|
-
runs-on: ubuntu-latest
|
|
355
|
-
timeout-minutes: 90
|
|
356
|
-
needs: preflight-success
|
|
357
|
-
if: always() && !cancelled() && needs.preflight-success.result == 'success'
|
|
358
|
-
steps:
|
|
359
|
-
- name: Check out repository
|
|
360
|
-
uses: actions/checkout@v6
|
|
361
|
-
with:
|
|
362
|
-
fetch-depth: 0
|
|
363
|
-
|
|
364
|
-
- name: Set up Python
|
|
365
|
-
uses: actions/setup-python@v6
|
|
366
|
-
with:
|
|
367
|
-
python-version: "3.12"
|
|
368
|
-
cache: pip
|
|
369
|
-
|
|
370
|
-
- name: Install just and tmux
|
|
371
|
-
run: |
|
|
372
|
-
sudo apt-get update
|
|
373
|
-
sudo apt-get install -y just tmux
|
|
374
|
-
|
|
375
|
-
- name: Set up local environment
|
|
376
|
-
run: just setup
|
|
377
|
-
|
|
378
|
-
- name: Show Docker environment
|
|
379
|
-
run: docker info
|
|
380
|
-
|
|
381
|
-
- name: Run concurrency E2E tests
|
|
382
|
-
run: just test-e2e-concurrency
|
|
383
|
-
|
|
384
|
-
- name: Upload session artifacts
|
|
385
|
-
if: failure()
|
|
386
|
-
uses: actions/upload-artifact@v7
|
|
387
|
-
with:
|
|
388
|
-
name: session-instances-e2e-concurrency
|
|
389
|
-
path: session-instances/
|
|
390
|
-
if-no-files-found: ignore
|
|
205
|
+
strategy:
|
|
206
|
+
fail-fast: false
|
|
207
|
+
matrix:
|
|
208
|
+
slice: [core, transforms, remote-assist, runtime-tools, concurrency, media]
|
|
391
209
|
|
|
392
|
-
e2e-media:
|
|
393
|
-
name: e2e-media
|
|
394
|
-
runs-on: ubuntu-latest
|
|
395
|
-
timeout-minutes: 90
|
|
396
|
-
needs: preflight-success
|
|
397
|
-
if: always() && !cancelled() && needs.preflight-success.result == 'success'
|
|
398
210
|
steps:
|
|
399
211
|
- name: Check out repository
|
|
400
212
|
uses: actions/checkout@v6
|
|
@@ -418,14 +230,14 @@ jobs:
|
|
|
418
230
|
- name: Show Docker environment
|
|
419
231
|
run: docker info
|
|
420
232
|
|
|
421
|
-
- name: Run
|
|
422
|
-
run: just test-e2e-
|
|
233
|
+
- name: Run E2E slice
|
|
234
|
+
run: just test-e2e-slice ${{ matrix.slice }}
|
|
423
235
|
|
|
424
236
|
- name: Upload session artifacts
|
|
425
237
|
if: failure()
|
|
426
238
|
uses: actions/upload-artifact@v7
|
|
427
239
|
with:
|
|
428
|
-
name: session-instances-e2e
|
|
240
|
+
name: session-instances-e2e-${{ matrix.slice }}
|
|
429
241
|
path: session-instances/
|
|
430
242
|
if-no-files-found: ignore
|
|
431
243
|
|
|
@@ -439,12 +251,7 @@ jobs:
|
|
|
439
251
|
- merge-lightweight
|
|
440
252
|
- package
|
|
441
253
|
- preflight-success
|
|
442
|
-
- e2e
|
|
443
|
-
- e2e-transforms
|
|
444
|
-
- e2e-remote-assist
|
|
445
|
-
- e2e-runtime-tools
|
|
446
|
-
- e2e-concurrency
|
|
447
|
-
- e2e-media
|
|
254
|
+
- e2e
|
|
448
255
|
if: always() && (github.event_name != 'pull_request' || github.event.pull_request.draft == false)
|
|
449
256
|
|
|
450
257
|
steps:
|
|
@@ -474,24 +281,8 @@ jobs:
|
|
|
474
281
|
echo "preflight-success failed or was skipped: ${{ needs.preflight-success.result }}"
|
|
475
282
|
exit 1
|
|
476
283
|
fi
|
|
477
|
-
if [[ "${{ needs.e2e
|
|
478
|
-
echo "e2e
|
|
479
|
-
exit 1
|
|
480
|
-
fi
|
|
481
|
-
if [[ "${{ needs.e2e-transforms.result }}" != "success" ]]; then
|
|
482
|
-
echo "e2e-transforms failed or was skipped: ${{ needs.e2e-transforms.result }}"
|
|
483
|
-
exit 1
|
|
484
|
-
fi
|
|
485
|
-
if [[ "${{ needs.e2e-remote-assist.result }}" != "success" ]]; then
|
|
486
|
-
echo "e2e-remote-assist failed or was skipped: ${{ needs.e2e-remote-assist.result }}"
|
|
487
|
-
exit 1
|
|
488
|
-
fi
|
|
489
|
-
if [[ "${{ needs.e2e-runtime-tools.result }}" != "success" ]]; then
|
|
490
|
-
echo "e2e-runtime-tools failed or was skipped: ${{ needs.e2e-runtime-tools.result }}"
|
|
491
|
-
exit 1
|
|
492
|
-
fi
|
|
493
|
-
if [[ "${{ needs.e2e-concurrency.result }}" != "success" ]]; then
|
|
494
|
-
echo "e2e-concurrency failed or was skipped: ${{ needs.e2e-concurrency.result }}"
|
|
284
|
+
if [[ "${{ needs.e2e.result }}" != "success" ]]; then
|
|
285
|
+
echo "one or more e2e slices failed or were skipped: ${{ needs.e2e.result }}"
|
|
495
286
|
exit 1
|
|
496
287
|
fi
|
|
497
288
|
echo "ci-success passed"
|
|
@@ -38,34 +38,34 @@ test-nondocker-cov:
|
|
|
38
38
|
{{python}} -m pytest -q tests/unit tests/contract --cov=rosotacom --cov-report=term-missing --cov-report=xml:coverage.xml
|
|
39
39
|
|
|
40
40
|
test-e2e-smoke:
|
|
41
|
-
ROSOTACOM_RUN_E2E=1 {{python}} -m pytest -q tests/e2e/ -m e2e
|
|
41
|
+
ROSOTACOM_RUN_E2E=1 {{python}} -m pytest -q --durations=0 tests/e2e/ -m e2e
|
|
42
42
|
|
|
43
43
|
test-e2e-fast: test-e2e-smoke
|
|
44
44
|
|
|
45
45
|
test-e2e-core:
|
|
46
|
-
ROSOTACOM_RUN_E2E=1 {{python}} -m pytest -q tests/e2e/test_smoke.py -k "heartbeat or chatter"
|
|
46
|
+
ROSOTACOM_RUN_E2E=1 {{python}} -m pytest -q --durations=0 tests/e2e/test_smoke.py -k "heartbeat or chatter"
|
|
47
47
|
|
|
48
48
|
test-e2e-transforms:
|
|
49
|
-
ROSOTACOM_RUN_E2E=1 {{python}} -m pytest -q tests/e2e/test_smoke.py -k "occupancy_grid or sized_payload"
|
|
49
|
+
ROSOTACOM_RUN_E2E=1 {{python}} -m pytest -q --durations=0 tests/e2e/test_smoke.py -k "occupancy_grid or sized_payload"
|
|
50
50
|
|
|
51
51
|
test-e2e-remote-assist:
|
|
52
|
-
ROSOTACOM_RUN_E2E=1 {{python}} -m pytest -q tests/e2e/test_smoke.py -k "remote_assist"
|
|
52
|
+
ROSOTACOM_RUN_E2E=1 {{python}} -m pytest -q --durations=0 tests/e2e/test_smoke.py -k "remote_assist"
|
|
53
53
|
|
|
54
54
|
# Two invocations on purpose: a shared `-k` filter would silently deselect
|
|
55
55
|
# every test in the other files (contract-tested in test_benched_set_registry).
|
|
56
56
|
test-e2e-runtime-tools:
|
|
57
|
-
ROSOTACOM_RUN_E2E=1 {{python}} -m pytest -q tests/e2e/test_smoke.py -k "link_latency"
|
|
58
|
-
ROSOTACOM_RUN_E2E=1 {{python}} -m pytest -q tests/e2e/test_timeline_stepping.py tests/e2e/test_benchmark_capacity.py tests/e2e/test_benchmark_ab.py tests/e2e/test_benchmark_replay.py
|
|
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
59
|
|
|
60
60
|
# The remaining e2e files. Without this slice the partition is not one: the
|
|
61
61
|
# monolithic `test-e2e-smoke` collects 28 tests, the other five collect 25, and
|
|
62
62
|
# anonymization/video-quality/replay ran only in nightly and the release.
|
|
63
63
|
test-e2e-media:
|
|
64
|
-
ROSOTACOM_RUN_E2E=1 {{python}} -m pytest -q tests/e2e/test_anonymize_e2e.py tests/e2e/test_video_quality_e2e.py
|
|
65
|
-
ROSOTACOM_RUN_E2E=1 {{python}} -m pytest -q tests/e2e/test_smoke.py -k "anonymized"
|
|
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
66
|
|
|
67
67
|
test-e2e-concurrency:
|
|
68
|
-
ROSOTACOM_RUN_E2E=1 {{python}} -m pytest -q tests/e2e/test_parallel_smoke.py
|
|
68
|
+
ROSOTACOM_RUN_E2E=1 {{python}} -m pytest -q --durations=0 tests/e2e/test_parallel_smoke.py
|
|
69
69
|
|
|
70
70
|
# The five slices partition `test-e2e-smoke`; the merge gate and the release
|
|
71
71
|
# both run them in parallel. This wrapper exists so a workflow matrix can select
|
|
@@ -77,7 +77,7 @@ test-e2e-slice slice:
|
|
|
77
77
|
just test-e2e-{{slice}}
|
|
78
78
|
|
|
79
79
|
test-e2e-node nodeid:
|
|
80
|
-
ROSOTACOM_RUN_E2E=1 {{python}} -m pytest -q "{{nodeid}}"
|
|
80
|
+
ROSOTACOM_RUN_E2E=1 {{python}} -m pytest -q --durations=0 "{{nodeid}}"
|
|
81
81
|
|
|
82
82
|
test-e2e-rmw session:
|
|
83
83
|
ROSOTACOM_RUN_E2E=1 ROSOTACOM_RUN_FULL_E2E=1 {{python}} -m pytest -q "tests/e2e/test_smoke.py::test_full_rmw_heartbeat_smoke_matrix[{{session}}]"
|
|
@@ -417,17 +417,22 @@ message types for `/com/...` topics. For that reason, user-defined topic entries
|
|
|
417
417
|
The auto-generated heartbeat topic is the only exception because its type is known by the generator.
|
|
418
418
|
|
|
419
419
|
#### Allowed `processing` keys
|
|
420
|
-
Only these keys are allowed
|
|
420
|
+
Only these keys are allowed. The list is checked against the generator's
|
|
421
|
+
`KNOWN_PROCESSING_KEYS` by `tests/contract/test_session_configuration_doc.py`,
|
|
422
|
+
so a new knob cannot ship undocumented.
|
|
421
423
|
|
|
422
424
|
```yaml
|
|
423
425
|
processing:
|
|
424
426
|
restamp_if: true # bool OR common bool strings OR "<VAR_NAME>" (template param name)
|
|
427
|
+
latch: false # bool, re-publish on value change only
|
|
428
|
+
trickle_hz: 1 # number > 0, receiver-side periodic re-publish
|
|
425
429
|
drop: # optional, message drop configuration
|
|
426
430
|
drop_count: 2 # int >= 0, number of messages to drop
|
|
427
431
|
window_size: 3 # int > 0, window size (drop_count must be < window_size)
|
|
428
432
|
framebridge: local_to_global # local_to_global | global_to_local
|
|
429
433
|
normalize_on_target: false # bool
|
|
430
434
|
compress: false # bool
|
|
435
|
+
use_ota_wrapper: false # bool, wrap the payload for the OTA hop
|
|
431
436
|
throttle_hz: 10 # int > 0
|
|
432
437
|
pixel_cap_preset: "wsvga" # scalar, used as suffix only,
|
|
433
438
|
transport:
|
|
@@ -436,6 +441,37 @@ processing:
|
|
|
436
441
|
# plus type-specific params (see below)
|
|
437
442
|
```
|
|
438
443
|
|
|
444
|
+
##### `latch` and `trickle_hz`: two answers to "the value did not change"
|
|
445
|
+
|
|
446
|
+
Both address a topic that publishes rarely, and they sit on opposite ends of
|
|
447
|
+
the link:
|
|
448
|
+
|
|
449
|
+
- **`latch` is a sender-side filter.** The latch stage forwards a message only
|
|
450
|
+
when its value differs from the last one, to `<topic>{shared.processing_suffixes.latched}`
|
|
451
|
+
(default `/latched`). It saves OTA bandwidth on a state topic that repeats
|
|
452
|
+
itself. Its cost is that a receiver which subscribes *after* the last change
|
|
453
|
+
gets nothing — what the delivered value is then depends entirely on the OTA
|
|
454
|
+
QoS for the role (`depth`, `lifespan`, `durability`).
|
|
455
|
+
- **`trickle_hz` is a receiver-side re-publish.** A local timer republishes the
|
|
456
|
+
last *delivered* value to `<final>/trickle` at that rate, whether or not
|
|
457
|
+
anything new arrived. Nothing extra crosses the link: the trickle topic is
|
|
458
|
+
not in the OTA topic lists. It exists for consumers that expect a steady
|
|
459
|
+
stream — visualization, state diagrams, watchdogs — and would otherwise treat
|
|
460
|
+
an unchanged value as a dead one.
|
|
461
|
+
|
|
462
|
+
They compose: `latch: true` with `trickle_hz: 1` sends a message only on change
|
|
463
|
+
and still gives the receiving side a 1 Hz stream.
|
|
464
|
+
|
|
465
|
+
Because the trickle output is the real delivered topic, it is the monitored
|
|
466
|
+
`native_in` stage rather than the pre-trickle `final` — otherwise the
|
|
467
|
+
re-publish would be an observability blind spot whose rate no `expect` could
|
|
468
|
+
assert. `expect.hz` on such a topic therefore describes the trickle rate plus
|
|
469
|
+
whatever arrives over the link, which is why `examples/sessions/11_trickle`
|
|
470
|
+
asserts `hz: {min: 2, max: 8}` for a 1 Hz source at `trickle_hz: 4`.
|
|
471
|
+
|
|
472
|
+
`trickle_hz` must be greater than 0. It also sets the expected rate for a topic
|
|
473
|
+
that has no `throttle_hz`.
|
|
474
|
+
|
|
439
475
|
#### Processing pipeline order (exact)
|
|
440
476
|
Given a base topic like `/tf`, stages are applied in this order:
|
|
441
477
|
|
|
@@ -1574,6 +1574,27 @@ def _render_domain_bridge_yaml(name: str, topics: Dict[str, Dict[str, Any]]) ->
|
|
|
1574
1574
|
return _yaml_canonical_dump(cfg)
|
|
1575
1575
|
|
|
1576
1576
|
|
|
1577
|
+
#: Every key a topic's `processing:` mapping may carry. Module level because
|
|
1578
|
+
#: `session-configuration.md` claims to list exactly these, and
|
|
1579
|
+
#: tests/contract/test_session_configuration_doc.py compares the two: three
|
|
1580
|
+
#: keys (`latch`, `trickle_hz`, `use_ota_wrapper`) were live and undocumented,
|
|
1581
|
+
#: which is worse than undocumented — the reference says "Only these keys are
|
|
1582
|
+
#: allowed", so a reader had no reason to look further.
|
|
1583
|
+
KNOWN_PROCESSING_KEYS = {
|
|
1584
|
+
"restamp_if",
|
|
1585
|
+
"latch",
|
|
1586
|
+
"trickle_hz",
|
|
1587
|
+
"drop",
|
|
1588
|
+
"framebridge",
|
|
1589
|
+
"normalize_on_target",
|
|
1590
|
+
"compress",
|
|
1591
|
+
"use_ota_wrapper",
|
|
1592
|
+
"throttle_hz",
|
|
1593
|
+
"pixel_cap_preset",
|
|
1594
|
+
"transport",
|
|
1595
|
+
}
|
|
1596
|
+
|
|
1597
|
+
|
|
1577
1598
|
def _compute_pipeline(
|
|
1578
1599
|
entry: TopicEntry,
|
|
1579
1600
|
vars_map: Dict[str, Any],
|
|
@@ -1585,20 +1606,7 @@ def _compute_pipeline(
|
|
|
1585
1606
|
) -> Dict[str, Any]:
|
|
1586
1607
|
proc = entry.processing or {}
|
|
1587
1608
|
|
|
1588
|
-
|
|
1589
|
-
"restamp_if",
|
|
1590
|
-
"latch",
|
|
1591
|
-
"trickle_hz",
|
|
1592
|
-
"drop",
|
|
1593
|
-
"framebridge",
|
|
1594
|
-
"normalize_on_target",
|
|
1595
|
-
"compress",
|
|
1596
|
-
"use_ota_wrapper",
|
|
1597
|
-
"throttle_hz",
|
|
1598
|
-
"pixel_cap_preset",
|
|
1599
|
-
"transport",
|
|
1600
|
-
}
|
|
1601
|
-
unknown = set(proc.keys()) - known_keys
|
|
1609
|
+
unknown = set(proc.keys()) - KNOWN_PROCESSING_KEYS
|
|
1602
1610
|
if unknown:
|
|
1603
1611
|
raise ValueError(f"Unknown processing keys for topic '{entry.base}': {sorted(unknown)}")
|
|
1604
1612
|
|
|
@@ -293,6 +293,7 @@ tests/contract/test_profile_covers_generated_commands.py
|
|
|
293
293
|
tests/contract/test_pytest_policy.py
|
|
294
294
|
tests/contract/test_readme_examples.py
|
|
295
295
|
tests/contract/test_security_maintenance_config.py
|
|
296
|
+
tests/contract/test_session_configuration_doc.py
|
|
296
297
|
tests/contract/test_workflow_contracts.py
|
|
297
298
|
tests/e2e/conftest.py
|
|
298
299
|
tests/e2e/test_anonymize_e2e.py
|
{rosotacom_dev-2.5.dev13 → rosotacom_dev-2.5.dev15}/src/rosotacom_dev.egg-info/scm_file_list.json
RENAMED
|
@@ -288,6 +288,7 @@
|
|
|
288
288
|
"tests/contract/test_pytest_policy.py",
|
|
289
289
|
"tests/contract/test_readme_examples.py",
|
|
290
290
|
"tests/contract/test_security_maintenance_config.py",
|
|
291
|
+
"tests/contract/test_session_configuration_doc.py",
|
|
291
292
|
"tests/contract/test_workflow_contracts.py",
|
|
292
293
|
"tests/e2e/conftest.py",
|
|
293
294
|
"tests/e2e/test_anonymize_e2e.py",
|
|
@@ -46,15 +46,26 @@ def test_image_scan_is_advisory_and_not_a_pr_check() -> None:
|
|
|
46
46
|
|
|
47
47
|
def test_merge_gate_requires_non_docker_package_and_docker_smoke() -> None:
|
|
48
48
|
merge_gate = MERGE_GATE_PATH.read_text(encoding="utf-8")
|
|
49
|
+
jobs = yaml.safe_load(merge_gate)["jobs"]
|
|
49
50
|
|
|
50
51
|
assert "ci-success" in merge_gate
|
|
51
52
|
assert "just test-nondocker-cov" in merge_gate
|
|
52
53
|
assert "just package" in merge_gate
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
54
|
+
|
|
55
|
+
# The gate runs the e2e suite as one matrix over named slices rather than
|
|
56
|
+
# six copy-pasted jobs, so the slice names live in the matrix and the
|
|
57
|
+
# recipe name in the `run:` line is `test-e2e-slice`. Which slices those
|
|
58
|
+
# are, and that they add up to the whole suite, is
|
|
59
|
+
# tests/contract/test_workflow_contracts.py's job.
|
|
60
|
+
assert "just test-e2e-slice" in merge_gate
|
|
61
|
+
assert set(jobs["e2e"]["strategy"]["matrix"]["slice"]) >= {
|
|
62
|
+
"core",
|
|
63
|
+
"transforms",
|
|
64
|
+
"remote-assist",
|
|
65
|
+
"runtime-tools",
|
|
66
|
+
"concurrency",
|
|
67
|
+
"media",
|
|
68
|
+
}
|
|
58
69
|
|
|
59
70
|
|
|
60
71
|
def test_merge_gate_requires_new_ci_jobs_and_no_masking() -> None:
|
|
@@ -62,7 +73,6 @@ def test_merge_gate_requires_new_ci_jobs_and_no_masking() -> None:
|
|
|
62
73
|
data = yaml.safe_load(content)
|
|
63
74
|
jobs = data["jobs"]
|
|
64
75
|
|
|
65
|
-
# 1. ci-success depends on the new required jobs
|
|
66
76
|
ci_success = jobs["ci-success"]
|
|
67
77
|
needs = ci_success["needs"]
|
|
68
78
|
expected_jobs = {
|
|
@@ -72,29 +82,19 @@ def test_merge_gate_requires_new_ci_jobs_and_no_masking() -> None:
|
|
|
72
82
|
"merge-lightweight",
|
|
73
83
|
"package",
|
|
74
84
|
"preflight-success",
|
|
75
|
-
"e2e
|
|
76
|
-
"e2e-transforms",
|
|
77
|
-
"e2e-remote-assist",
|
|
78
|
-
"e2e-runtime-tools",
|
|
79
|
-
"e2e-concurrency",
|
|
80
|
-
}
|
|
81
|
-
e2e_jobs = {
|
|
82
|
-
"e2e-core",
|
|
83
|
-
"e2e-transforms",
|
|
84
|
-
"e2e-remote-assist",
|
|
85
|
-
"e2e-runtime-tools",
|
|
86
|
-
"e2e-concurrency",
|
|
85
|
+
"e2e",
|
|
87
86
|
}
|
|
88
87
|
assert expected_jobs.issubset(set(needs))
|
|
89
88
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
assert jobs[job]["if"] == "always() && !cancelled() && needs.preflight-success.result == 'success'"
|
|
89
|
+
assert jobs["e2e"]["needs"] == "preflight-success"
|
|
90
|
+
assert jobs["e2e"]["if"] == "always() && !cancelled() && needs.preflight-success.result == 'success'"
|
|
93
91
|
|
|
94
|
-
#
|
|
92
|
+
# Every needed job's result must be turned into an exit code by hand,
|
|
93
|
+
# because ci-success runs with `if: always()`. This used to list the e2e
|
|
94
|
+
# jobs one by one and missed `e2e-media` entirely.
|
|
95
95
|
check_step = next(step for step in ci_success["steps"] if step.get("name") == "Check required jobs")
|
|
96
96
|
run_script = check_step["run"]
|
|
97
|
-
for job in
|
|
97
|
+
for job in needs:
|
|
98
98
|
if job == "dependency-review":
|
|
99
99
|
assert f"needs.{job}.result" in run_script
|
|
100
100
|
else:
|
|
@@ -107,7 +107,6 @@ def test_merge_gate_requires_new_ci_jobs_and_no_masking() -> None:
|
|
|
107
107
|
for step in job.get("steps", []):
|
|
108
108
|
assert step.get("continue-on-error", False) is False
|
|
109
109
|
run_cmd = step.get("run", "")
|
|
110
|
-
# Ensure no masking with || true or || exit 0
|
|
111
110
|
assert "|| true" not in run_cmd
|
|
112
111
|
assert "|| exit 0" not in run_cmd
|
|
113
112
|
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"""`session-configuration.md` says "Only these keys are allowed". Make it true.
|
|
2
|
+
|
|
3
|
+
The reference listed eight `processing` keys while the generator accepted
|
|
4
|
+
eleven. `latch`, `trickle_hz` and `use_ota_wrapper` were live, used by real
|
|
5
|
+
sessions, and absent — which is worse than merely undocumented, because the
|
|
6
|
+
sentence above the list tells a reader there is nothing else to find.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
import re
|
|
12
|
+
from pathlib import Path
|
|
13
|
+
|
|
14
|
+
from rosotacom.resources.ws.session.creation.generate_session_files import KNOWN_PROCESSING_KEYS
|
|
15
|
+
|
|
16
|
+
PACKAGE_ROOT = Path(__file__).resolve().parents[2]
|
|
17
|
+
REFERENCE = PACKAGE_ROOT / "session-configuration.md"
|
|
18
|
+
|
|
19
|
+
#: The fenced block under the "Allowed `processing` keys" heading.
|
|
20
|
+
BLOCK = re.compile(
|
|
21
|
+
r"#### Allowed `processing` keys.*?```yaml\n(?P<body>.*?)```",
|
|
22
|
+
re.DOTALL,
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
#: A top-level key inside that block: two spaces of indent, then `name:`.
|
|
26
|
+
TOP_LEVEL_KEY = re.compile(r"^ ([A-Za-z_][A-Za-z0-9_]*):", re.MULTILINE)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def documented_processing_keys() -> set[str]:
|
|
30
|
+
match = BLOCK.search(REFERENCE.read_text(encoding="utf-8"))
|
|
31
|
+
assert match, "no fenced `processing` example under the allowed-keys heading"
|
|
32
|
+
return set(TOP_LEVEL_KEY.findall(match.group("body")))
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def test_documented_processing_keys_match_the_generator() -> None:
|
|
36
|
+
documented = documented_processing_keys()
|
|
37
|
+
|
|
38
|
+
undocumented = sorted(KNOWN_PROCESSING_KEYS - documented)
|
|
39
|
+
assert not undocumented, (
|
|
40
|
+
f"the generator accepts these `processing` keys and {REFERENCE.name} does not list them: {undocumented}"
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
invented = sorted(documented - KNOWN_PROCESSING_KEYS)
|
|
44
|
+
assert not invented, f"{REFERENCE.name} documents `processing` keys the generator rejects: {invented}"
|