rosotacom-dev 2.3__tar.gz → 2.5.dev1__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.dev1/.github/workflows/dev-release.yml +157 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/.github/workflows/release.yml +23 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/AGENTS.md +15 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/CONTRIBUTING.md +19 -6
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/PKG-INFO +37 -5
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/README.md +36 -4
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/docs/ci.md +6 -2
- rosotacom_dev-2.5.dev1/docs/github-repository-settings.md +81 -0
- rosotacom_dev-2.5.dev1/docs/release-notes/v2.3.md +34 -0
- rosotacom_dev-2.5.dev1/docs/release-notes/v2.4.md +46 -0
- rosotacom_dev-2.5.dev1/docs/release.md +110 -0
- rosotacom_dev-2.5.dev1/src/rosotacom/__init__.py +42 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/cli.py +307 -33
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom_dev.egg-info/PKG-INFO +37 -5
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom_dev.egg-info/SOURCES.txt +4 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom_dev.egg-info/scm_file_list.json +273 -269
- rosotacom_dev-2.5.dev1/src/rosotacom_dev.egg-info/scm_version.json +8 -0
- rosotacom_dev-2.5.dev1/tests/contract/test_ota_source_bundle.py +120 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/tests/unit/test_cli.py +115 -0
- rosotacom_dev-2.3/docs/github-repository-settings.md +0 -46
- rosotacom_dev-2.3/docs/release.md +0 -51
- rosotacom_dev-2.3/src/rosotacom/__init__.py +0 -32
- rosotacom_dev-2.3/src/rosotacom_dev.egg-info/scm_version.json +0 -8
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/.devcontainer/devcontainer.json.template +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/.devcontainer/re_generate_devcontainer_json.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/.github/CODEOWNERS +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/.github/ISSUE_TEMPLATE/documentation-audit.md +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/.github/ISSUE_TEMPLATE/implementation-cleanup.md +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/.github/ISSUE_TEMPLATE/quality-workflow.md +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/.github/ISSUE_TEMPLATE/redesign.md +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/.github/ISSUE_TEMPLATE/release-process.md +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/.github/ISSUE_TEMPLATE/repository-diagnosis.md +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/.github/ISSUE_TEMPLATE/test-ci-audit.md +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/.github/ISSUE_TEMPLATE/work-item.md +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/.github/dependabot.yml +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/.github/workflows/benchmark-calibrate.yml +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/.github/workflows/benchmark-gate.yml +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/.github/workflows/image-scan.yml +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/.github/workflows/nightly-e2e.yml +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/.github/workflows/pr-lightweight.yml +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/.github/workflows/pr-merge-gate.yml +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/.pre-commit-config.yaml +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/CONCURRENCY.md +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/DEVELOPMENT_PRINCIPLES.md +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/LICENSE.txt +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/MANIFEST.in +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/budgets.jsonl +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/calibration/README.md +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/calibration/capacity-size-tight-cyclone.json +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/calibration/probe-loss-gop-tight-cyclone.json +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/calibration/probe-loss-nominal-cyclone.json +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/calibration/probe-loss-tight-cyclone.json +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/calibration/probe-loss-tight-fastdds.json +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/calibration/probe-loss-tight-zenoh.json +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/codecov.yml +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/deployment-configuration.md +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/docs/benchmark-ab.md +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/docs/benchmark-bag-as-load.md +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/docs/ffmpeg-keyframes.md +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/docs/findings/README.md +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/docs/findings/cyclone-spdp-discovery-bursts.md +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/docs/findings/delay-alone-no-loss.md +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/docs/findings/head-of-line-irregularity.md +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/docs/findings/jitter-loss-bandwidth-latency.md +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/docs/findings/lighter-message-loss.md +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/docs/findings/zero-loss-boundaries-18kb-20hz.md +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/docs/forensics-report.md +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/docs/geo-link-map.md +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/docs/link-trace.md +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/docs/owner-runbook.md +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/docs/performance-bands.md +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/docs/playbooks/README.md +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/docs/quality-model.md +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/docs/release-notes/TEMPLATE.md +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/docs/release-notes/v2.1.md +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/docs/release-notes/v2.2.md +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/docs/rfcs/0001-expectation-driven-test-suite.md +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/docs/rfcs/0002-expectation-concepts.md +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/docs/rfcs/0003-metric-backbone.md +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/docs/rfcs/0004-network-profiles.md +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/docs/rfcs/0005-benchmark-genres-and-ci.md +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/docs/rfcs/0006-dynamic-qos.md +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/docs/rfcs/0007-regression-gate.md +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/docs/rfcs/README.md +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/docs/testing.md +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/docs/work-items.md +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/install.sh +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/justfile +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/media/control_center.png +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/media/echo_test.png +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/media/forensics-report-example.png +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/media/host.png +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/media/vehicle.png +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/pyproject.toml +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/requirements.txt +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/rosotacom.yaml +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/run_session_in_container.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/session-configuration.md +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/setup.cfg +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/__main__.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/anonymize.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/bag_ground_truth.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/benched_set.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/benchmark.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/bundle_check.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/cli_benchmark.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/deployment.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/ffmpeg_packet.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/forensics.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/geomap.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/network_profiles.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/network_shaper.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/plots.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/py.typed +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/benched-set.yaml +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/examples/.gitignore +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/examples/README.md +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/examples/__init__.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/examples/bags/8_drop_reference/metadata.yaml +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/examples/deployment.example.yaml +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/examples/profiles.yaml +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/examples/ros2docker.json +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/examples/rosotacom.yaml +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/examples/scenarios/2_native_chatter/scenario-definition.yaml +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/examples/scripts/1_heartbeat/run_machine_a.sh +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/examples/scripts/1_heartbeat/run_machine_b.sh +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_a/external.ros2docker.json +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_a/run_communication.sh +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_a/run_external.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_a/wait_for_echo_topic.sh +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_b/external.ros2docker.json +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_b/run_communication.sh +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_b/run_external.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_a/external.ros2docker.json +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_a/external_session.yaml +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_a/foxglove.json +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_a/run_communication.sh +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_a/run_external.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_b/costmap_1second/costmap_1second_0.mcap +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_b/costmap_1second/metadata.yaml +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_b/external.ros2docker.json +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_b/run_communication.sh +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_b/run_external.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_a/external.ros2docker.json +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_a/external_session.yaml +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_a/foxglove.json +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_a/run_communication.sh +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_a/run_external.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_b/costmap_1second/costmap_1second_0.mcap +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_b/costmap_1second/metadata.yaml +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_b/external.ros2docker.json +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_b/run_communication.sh +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_b/run_external.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_a/external.ros2docker.json +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_a/external_session.yaml +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_a/run_communication.sh +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_a/run_external.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_b/external.ros2docker.json +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_b/external_session.yaml +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_b/run_communication.sh +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_b/run_external.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_a/external.ros2docker.json +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_a/external_session.yaml +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_a/run_communication.sh +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_a/run_external.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_b/external.ros2docker.json +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_b/external_session.yaml +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_b/run_communication.sh +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_b/run_external.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/examples/sessions/10_restamp/session-definition.yaml +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/examples/sessions/11_trickle/session-definition.yaml +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/examples/sessions/12_content_integrity/session-definition.yaml +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/examples/sessions/13_link_latency/session-definition.yaml +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/examples/sessions/14_remote_assist_anonymized/session-definition.yaml +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/examples/sessions/15_remote_assist_anonymized_costmap/session-definition.yaml +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/examples/sessions/16_remote_assist_anonymized_camera/session-definition.yaml +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/examples/sessions/17_synthetic_camera_quality/session-definition.yaml +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/examples/sessions/1_heartbeat/session-definition.yaml +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/examples/sessions/1_heartbeat_status/session-definition.yaml +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/examples/sessions/2_native_chatter/session-definition.yaml +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/examples/sessions/3_comp_occ_grid/session-definition.yaml +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/examples/sessions/4_comp_occ_grid_zen/session-definition.yaml +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/examples/sessions/5_sized_payload/session-definition.yaml +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/examples/sessions/6_sized_payload_zen/session-definition.yaml +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/examples/sessions/7_latched_static/session-definition.yaml +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/examples/sessions/8_drop/session-definition.yaml +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/examples/sessions/9_throttle/session-definition.yaml +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/examples/sessions/bench_1_1_capacity/session-definition.yaml +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/examples/sessions/bench_1_2_load_sweep/session-definition.yaml +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/examples/sessions/bench_1_3_ramp/session-definition.yaml +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/examples/sessions/bench_1_4_recovery/session-definition.yaml +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/examples/sessions/bench_1_5_camera/session-definition.yaml +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ros2docker.json.example +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ws/.vscode/c_cpp_properties.json +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ws/.vscode/settings.json +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_easy_mode.xml.template +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_initial_peer_list.xml.template +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_v2.xml.template +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_v3.xml.template +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_v4.xml.template +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_v5.xml.template +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ws/ota_configs/create_zenoh_json5.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ws/ota_configs/cyclonedds_minimal.xml.template +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ws/ota_configs/cyclonedds_tuned.xml.template +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ws/ota_configs/fastdds_unicast.xml.template +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ws/ota_configs/get_ota_xml.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ws/ota_configs/utils.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ws/ota_configs/zenoh.json5.template +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ws/ros2src/.gitkeep +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ws/ros2src/com_cpp/CMakeLists.txt +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ws/ros2src/com_cpp/COLCON_IGNORE +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ws/ros2src/com_cpp/LICENSE.txt +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ws/ros2src/com_cpp/package.xml +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ws/ros2src/com_cpp/src/hz_monitor.cpp +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ws/ros2src/com_cpp/src/universal_compressor.cpp +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ws/ros2src/com_cpp/src/universal_decompressor.cpp +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ws/ros2src/com_msgs/CMakeLists.txt +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ws/ros2src/com_msgs/LICENSE.txt +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ws/ros2src/com_msgs/msg/CompressedData.msg +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ws/ros2src/com_msgs/msg/EchoHeartbeat.msg +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ws/ros2src/com_msgs/msg/OtaStamped.msg +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ws/ros2src/com_msgs/msg/SizedPayload.msg +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ws/ros2src/com_msgs/package.xml +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ws/ros2src/com_py/LICENSE.txt +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ws/ros2src/com_py/com_py/__init__.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ws/ros2src/com_py/com_py/base_bridge_relay.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ws/ros2src/com_py/com_py/bridge_in.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ws/ros2src/com_py/com_py/bridge_out.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ws/ros2src/com_py/com_py/heartbeat_echo.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ws/ros2src/com_py/com_py/hz_monitor.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ws/ros2src/com_py/com_py/image_bandwidth_reducer.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ws/ros2src/com_py/com_py/image_pixel_capper.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ws/ros2src/com_py/com_py/lanelet_saver.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ws/ros2src/com_py/com_py/latch_relay.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/costmap_remapper.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/marker_remapper.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/speed_test.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/tf_remapper.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/traffic_monitor.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/wifi_network_analysis_1.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ws/ros2src/com_py/com_py/link_bytes.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ws/ros2src/com_py/com_py/link_trace.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ws/ros2src/com_py/com_py/local_global_frame_bridge.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ws/ros2src/com_py/com_py/localization_map_split_reduce_saver.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ws/ros2src/com_py/com_py/msg_transform.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ws/ros2src/com_py/com_py/pair_management.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ws/ros2src/com_py/com_py/pub_sub_pair.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ws/ros2src/com_py/com_py/qos.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ws/ros2src/com_py/com_py/relay_in.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ws/ros2src/com_py/com_py/relay_out.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ws/ros2src/com_py/com_py/restamp.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ws/ros2src/com_py/com_py/sized_publisher.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ws/ros2src/com_py/com_py/stage_latency.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ws/ros2src/com_py/com_py/stage_latency_core.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ws/ros2src/com_py/com_py/status_overview.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ws/ros2src/com_py/com_py/status_overview_core.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ws/ros2src/com_py/com_py/tf_map_to_cart_saver.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ws/ros2src/com_py/com_py/topic_monitor.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ws/ros2src/com_py/com_py/topic_resolution.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ws/ros2src/com_py/com_py/trickle.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ws/ros2src/com_py/com_py/universal_compressor.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ws/ros2src/com_py/com_py/universal_decompressor.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ws/ros2src/com_py/com_py/universal_ota_unwrapper.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ws/ros2src/com_py/com_py/universal_ota_wrapper.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ws/ros2src/com_py/package.xml +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ws/ros2src/com_py/resource/com_py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ws/ros2src/com_py/setup.cfg +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ws/ros2src/com_py/setup.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ws/ros2src/com_py/test/test_copyright.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ws/ros2src/com_py/test/test_flake8.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ws/ros2src/com_py/test/test_pep257.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ws/session/content/base/session_plugin_base.yaml +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ws/session/content/network/up_connectivity.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ws/session/content/network/wifi_network_analysis_2.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ws/session/creation/anonymize_bag.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ws/session/creation/catmux_log_setup.sh +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ws/session/creation/create_session_yaml.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ws/session/creation/generate_session_files.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ws/session/creation/run_session.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ws/session/creation/run_session_in_external_terminal.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/resources/ws/session/creation/strip_ansi.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/status_eval.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/stream_stats.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/trace_profiles.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/transit.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom/video_quality.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom_dev.egg-info/dependency_links.txt +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom_dev.egg-info/entry_points.txt +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom_dev.egg-info/requires.txt +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/src/rosotacom_dev.egg-info/top_level.txt +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/stop_session_in_container.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/terminology.md +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/tests/contract/test_benched_set_registry.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/tests/contract/test_findings.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/tests/contract/test_markdown_links.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/tests/contract/test_package_metadata.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/tests/contract/test_packaged_resources.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/tests/contract/test_profile_covers_generated_commands.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/tests/contract/test_pytest_policy.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/tests/contract/test_readme_examples.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/tests/contract/test_security_maintenance_config.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/tests/contract/test_workflow_contracts.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/tests/e2e/conftest.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/tests/e2e/test_anonymize_e2e.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/tests/e2e/test_benchmark_ab.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/tests/e2e/test_benchmark_capacity.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/tests/e2e/test_benchmark_replay.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/tests/e2e/test_parallel_smoke.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/tests/e2e/test_smoke.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/tests/e2e/test_timeline_stepping.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/tests/e2e/test_video_quality_e2e.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/tests/sessions/generate_rmw_matrix.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/tests/sessions/rmw_matrix/1_heartbeat_cyclone-local_zenoh-ros2dds-ota/session-definition.yaml +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/tests/sessions/rmw_matrix/1_heartbeat_cyclone-ota/session-definition.yaml +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/tests/sessions/rmw_matrix/1_heartbeat_cyclone-ota-tuned/session-definition.yaml +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/tests/sessions/rmw_matrix/1_heartbeat_fastdds/session-definition.yaml +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/tests/sessions/rmw_matrix/1_heartbeat_zen-endpoints/session-definition.yaml +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/tests/unit/test_anonymize.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/tests/unit/test_bag_ground_truth.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/tests/unit/test_benched_set.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/tests/unit/test_benchmark.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/tests/unit/test_bundle_check.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/tests/unit/test_cli_benchmark.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/tests/unit/test_concurrency.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/tests/unit/test_deployment.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/tests/unit/test_ffmpeg_packet.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/tests/unit/test_forensics.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/tests/unit/test_geomap.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/tests/unit/test_link_bytes.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/tests/unit/test_link_trace.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/tests/unit/test_network_profiles.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/tests/unit/test_network_shaper.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/tests/unit/test_ota_xml.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/tests/unit/test_plots.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/tests/unit/test_stage_latency.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/tests/unit/test_status_eval.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/tests/unit/test_status_overview.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/tests/unit/test_stream_stats.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/tests/unit/test_trace_profiles.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/tests/unit/test_transit.py +0 -0
- {rosotacom_dev-2.3 → rosotacom_dev-2.5.dev1}/tests/unit/test_video_quality.py +0 -0
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
name: Dev release
|
|
2
|
+
|
|
3
|
+
# Every commit that lands on develop becomes an installable pre-release.
|
|
4
|
+
#
|
|
5
|
+
# Consuming this package should not mean consuming something days old. Without
|
|
6
|
+
# this, a downstream repository could only pin a version after someone decided
|
|
7
|
+
# to cut a release, so "always consume the package, never the checkout" cost a
|
|
8
|
+
# human decision per iteration — and the cheap way out was to stop consuming the
|
|
9
|
+
# package.
|
|
10
|
+
#
|
|
11
|
+
# setuptools-scm already derives X.Y.devN from the history; those wheels were
|
|
12
|
+
# built by CI and thrown away. This publishes them.
|
|
13
|
+
#
|
|
14
|
+
# `pip` does not resolve pre-releases unless asked, so the stable line is
|
|
15
|
+
# unaffected: nobody gets a dev version by accident, and anybody who wants one
|
|
16
|
+
# pins it exactly. Cutting a stable vX.Y stays a deliberate, human decision in
|
|
17
|
+
# release.yml.
|
|
18
|
+
#
|
|
19
|
+
# It runs on workflow_run rather than on push, so a commit whose CI failed is
|
|
20
|
+
# never published. workflow_run resolves this file from the default branch,
|
|
21
|
+
# which is develop — the branch it watches.
|
|
22
|
+
|
|
23
|
+
on:
|
|
24
|
+
workflow_run:
|
|
25
|
+
workflows: ["CI"]
|
|
26
|
+
types: [completed]
|
|
27
|
+
branches: [develop]
|
|
28
|
+
|
|
29
|
+
permissions:
|
|
30
|
+
contents: read
|
|
31
|
+
|
|
32
|
+
concurrency:
|
|
33
|
+
group: ${{ github.workflow }}-${{ github.event.workflow_run.head_sha }}
|
|
34
|
+
cancel-in-progress: false
|
|
35
|
+
|
|
36
|
+
jobs:
|
|
37
|
+
publish:
|
|
38
|
+
name: publish
|
|
39
|
+
runs-on: ubuntu-latest
|
|
40
|
+
# `event == 'push'` keeps pull-request CI runs out: only what actually
|
|
41
|
+
# landed on develop is published.
|
|
42
|
+
if: >-
|
|
43
|
+
github.event.workflow_run.conclusion == 'success'
|
|
44
|
+
&& github.event.workflow_run.event == 'push'
|
|
45
|
+
# Authorized by a Trusted Publisher registered with a blank environment. No
|
|
46
|
+
# token, no environment admin.
|
|
47
|
+
#
|
|
48
|
+
# PyPI matches the OIDC claims of the *workflow file*, so this needs its own
|
|
49
|
+
# registration for `dev-release.yml`; release.yml's does not cover it. Until
|
|
50
|
+
# that exists the build succeeds and the upload fails with
|
|
51
|
+
# `invalid-publisher`. See docs/github-repository-settings.md.
|
|
52
|
+
permissions:
|
|
53
|
+
id-token: write
|
|
54
|
+
|
|
55
|
+
steps:
|
|
56
|
+
- name: Check out the commit CI validated
|
|
57
|
+
uses: actions/checkout@v6
|
|
58
|
+
with:
|
|
59
|
+
# Pin to the validated commit: develop may have moved on since, and
|
|
60
|
+
# publishing a different tree than the one that passed would make the
|
|
61
|
+
# version meaningless.
|
|
62
|
+
ref: ${{ github.event.workflow_run.head_sha }}
|
|
63
|
+
# setuptools-scm needs the full history and the tags to derive the
|
|
64
|
+
# version; a shallow clone silently yields 0.1.dev1.
|
|
65
|
+
fetch-depth: 0
|
|
66
|
+
|
|
67
|
+
- name: Set up Python
|
|
68
|
+
uses: actions/setup-python@v6
|
|
69
|
+
with:
|
|
70
|
+
python-version: "3.12"
|
|
71
|
+
cache: pip
|
|
72
|
+
|
|
73
|
+
- name: Install just
|
|
74
|
+
run: |
|
|
75
|
+
sudo apt-get update
|
|
76
|
+
sudo apt-get install -y just
|
|
77
|
+
|
|
78
|
+
- name: Set up local environment
|
|
79
|
+
run: just setup
|
|
80
|
+
|
|
81
|
+
- name: Build and validate distributions
|
|
82
|
+
run: just package
|
|
83
|
+
|
|
84
|
+
- name: Require a pre-release version
|
|
85
|
+
id: version
|
|
86
|
+
run: |
|
|
87
|
+
set -euo pipefail
|
|
88
|
+
# A wheel filename is name-version-pytag-abitag-plattag.whl.
|
|
89
|
+
shopt -s nullglob
|
|
90
|
+
wheels=(dist/*.whl)
|
|
91
|
+
if [ "${#wheels[@]}" -ne 1 ]; then
|
|
92
|
+
echo "::error::expected exactly one wheel in dist/, found ${#wheels[@]}"
|
|
93
|
+
exit 1
|
|
94
|
+
fi
|
|
95
|
+
base="$(basename "${wheels[0]}" .whl)"
|
|
96
|
+
name="${base%%-*}"
|
|
97
|
+
rest="${base#*-}"
|
|
98
|
+
version="${rest%%-*}"
|
|
99
|
+
echo "distribution=${name//_/-}" >> "$GITHUB_OUTPUT"
|
|
100
|
+
echo "version=$version" >> "$GITHUB_OUTPUT"
|
|
101
|
+
echo "Built ${name//_/-} $version"
|
|
102
|
+
# A clean X.Y here means develop points at a tagged commit. That
|
|
103
|
+
# version belongs to the stable line and release.yml owns it, so skip
|
|
104
|
+
# rather than race it onto the index under a second identity.
|
|
105
|
+
if [ "${version#*.dev}" = "$version" ]; then
|
|
106
|
+
echo "::notice::$version is not a pre-release; the stable tag path owns it. Skipping."
|
|
107
|
+
echo "publish=false" >> "$GITHUB_OUTPUT"
|
|
108
|
+
else
|
|
109
|
+
echo "publish=true" >> "$GITHUB_OUTPUT"
|
|
110
|
+
fi
|
|
111
|
+
|
|
112
|
+
- name: Remove checksum sidecar
|
|
113
|
+
if: steps.version.outputs.publish == 'true'
|
|
114
|
+
run: rm -f dist/SHA256SUMS
|
|
115
|
+
|
|
116
|
+
- name: Verify configured publishing target
|
|
117
|
+
if: steps.version.outputs.publish == 'true'
|
|
118
|
+
env:
|
|
119
|
+
PYPI_PUBLISH_URL: ${{ vars.PYPI_PUBLISH_URL }}
|
|
120
|
+
run: |
|
|
121
|
+
if [ -z "$PYPI_PUBLISH_URL" ]; then
|
|
122
|
+
echo "::error::PYPI_PUBLISH_URL is not configured for this repository."
|
|
123
|
+
exit 1
|
|
124
|
+
fi
|
|
125
|
+
case "$PYPI_PUBLISH_URL" in
|
|
126
|
+
https://*) ;;
|
|
127
|
+
*)
|
|
128
|
+
echo "::error::PYPI_PUBLISH_URL must be an HTTPS endpoint (offending value: '$PYPI_PUBLISH_URL')."
|
|
129
|
+
exit 1
|
|
130
|
+
;;
|
|
131
|
+
esac
|
|
132
|
+
|
|
133
|
+
# No TestPyPI rehearsal here. The dev channel *is* the rehearsal, and a
|
|
134
|
+
# second upload per commit would double the noise for no extra signal.
|
|
135
|
+
- name: Publish pre-release
|
|
136
|
+
if: steps.version.outputs.publish == 'true'
|
|
137
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
138
|
+
with:
|
|
139
|
+
repository-url: ${{ vars.PYPI_PUBLISH_URL }}
|
|
140
|
+
skip-existing: true
|
|
141
|
+
|
|
142
|
+
- name: Summarise
|
|
143
|
+
if: steps.version.outputs.publish == 'true'
|
|
144
|
+
env:
|
|
145
|
+
DISTRIBUTION: ${{ steps.version.outputs.distribution }}
|
|
146
|
+
VERSION: ${{ steps.version.outputs.version }}
|
|
147
|
+
COMMIT: ${{ github.event.workflow_run.head_sha }}
|
|
148
|
+
run: |
|
|
149
|
+
# Markdown code block by indentation: no backticks, which shellcheck
|
|
150
|
+
# would read as command substitution.
|
|
151
|
+
{
|
|
152
|
+
echo "Published $VERSION from $COMMIT."
|
|
153
|
+
echo
|
|
154
|
+
echo "Consume it with:"
|
|
155
|
+
echo
|
|
156
|
+
echo " pipx install \"$DISTRIBUTION==$VERSION\""
|
|
157
|
+
} >> "$GITHUB_STEP_SUMMARY"
|
|
@@ -77,6 +77,29 @@ jobs:
|
|
|
77
77
|
- name: Build and validate distributions
|
|
78
78
|
run: just package
|
|
79
79
|
|
|
80
|
+
# The mirror of the dev channel's guard. A tag build must produce the
|
|
81
|
+
# clean version the tag names; a pre-release here means the tag is not on
|
|
82
|
+
# the commit being built (a dirty tree, or a tag pushed from the wrong
|
|
83
|
+
# place), and the release would silently publish something else.
|
|
84
|
+
- name: Require a stable version
|
|
85
|
+
if: startsWith(github.ref, 'refs/tags/v')
|
|
86
|
+
run: |
|
|
87
|
+
set -euo pipefail
|
|
88
|
+
shopt -s nullglob
|
|
89
|
+
wheels=(dist/*.whl)
|
|
90
|
+
if [ "${#wheels[@]}" -ne 1 ]; then
|
|
91
|
+
echo "::error::expected exactly one wheel in dist/, found ${#wheels[@]}"
|
|
92
|
+
exit 1
|
|
93
|
+
fi
|
|
94
|
+
base="$(basename "${wheels[0]}" .whl)"
|
|
95
|
+
rest="${base#*-}"
|
|
96
|
+
version="${rest%%-*}"
|
|
97
|
+
expected="${GITHUB_REF_NAME#v}"
|
|
98
|
+
if [ "$version" != "$expected" ]; then
|
|
99
|
+
echo "::error::tag $GITHUB_REF_NAME builds version $version, not $expected."
|
|
100
|
+
exit 1
|
|
101
|
+
fi
|
|
102
|
+
|
|
80
103
|
- name: Generate checksums
|
|
81
104
|
run: |
|
|
82
105
|
cd dist
|
|
@@ -43,6 +43,21 @@ Shared workflow:
|
|
|
43
43
|
is unavailable, record why in the PR and final status.
|
|
44
44
|
- Keep the PR description current with the issue link, validation commands,
|
|
45
45
|
important SHAs, CI status, and any dependency on another PR or harness MR.
|
|
46
|
+
|
|
47
|
+
Release autonomy — where the human decision actually is:
|
|
48
|
+
|
|
49
|
+
- Agents run a change to the end: branch, PR, CI, auto-merge. Merging publishes
|
|
50
|
+
a `X.Y.devN` pre-release automatically (`.github/workflows/dev-release.yml`),
|
|
51
|
+
so a downstream repository can pin the result immediately. Nothing about that
|
|
52
|
+
needs a human, and a merged change that nobody can consume is not finished.
|
|
53
|
+
- Cutting a stable `vX.Y.Z` tag is the one release step that is a decision, not
|
|
54
|
+
a consequence: the version is a promise to consumers and cannot be taken back
|
|
55
|
+
once it is on the index. Cut one only when the task says so.
|
|
56
|
+
- A stable tag needs `docs/release-notes/vX.Y.Z.md` **in the tagged commit**.
|
|
57
|
+
Add it in the PR that will be tagged; adding it afterwards leaves the release
|
|
58
|
+
job failing on a tag that cannot be moved.
|
|
59
|
+
- Never reuse or move a published version. If a release is wrong, supersede it
|
|
60
|
+
with the next one and say so in its notes.
|
|
46
61
|
- Before reporting completion, check the remote PR state and CI results with
|
|
47
62
|
`gh pr view` / `gh pr checks`; report the actual status, not just that a
|
|
48
63
|
branch was pushed.
|
|
@@ -112,17 +112,30 @@ repository settings that live outside git.
|
|
|
112
112
|
|
|
113
113
|
## Release Workflow
|
|
114
114
|
|
|
115
|
-
|
|
116
|
-
`docs/release-notes/vX.Y.Z.md`, copied from
|
|
117
|
-
[docs/release-notes/TEMPLATE.md](docs/release-notes/TEMPLATE.md).
|
|
115
|
+
Two channels, described in full in [docs/release.md](docs/release.md).
|
|
118
116
|
|
|
119
|
-
|
|
117
|
+
**Development channel.** Every commit that lands on the development branch with
|
|
118
|
+
green CI is published automatically as `X.Y.devN`. There is nothing to do and
|
|
119
|
+
nothing to decide: merging *is* releasing on this channel. Consume such a
|
|
120
|
+
version with an exact pin, which is how a downstream repository tracks work in
|
|
121
|
+
progress without reaching past the package boundary:
|
|
120
122
|
|
|
121
123
|
```bash
|
|
122
|
-
|
|
124
|
+
pipx install "rosotacom-dev==2.4.dev3"
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
**Stable release.** Built from tags in the form `vX.Y.Z`. Release PRs must
|
|
128
|
+
include `docs/release-notes/vX.Y.Z.md`, copied from
|
|
129
|
+
[docs/release-notes/TEMPLATE.md](docs/release-notes/TEMPLATE.md) — the tagged
|
|
130
|
+
commit has to contain its own notes, so the notes land in the PR, not after it.
|
|
131
|
+
|
|
132
|
+
After the release PR has merged, verify the exact commit and then:
|
|
133
|
+
|
|
134
|
+
```bash
|
|
135
|
+
git switch develop
|
|
123
136
|
git fetch --prune
|
|
124
137
|
git pull --ff-only
|
|
125
|
-
git tag vX.Y.Z
|
|
138
|
+
git tag -a vX.Y.Z -m "rosotacom vX.Y.Z"
|
|
126
139
|
git push origin vX.Y.Z
|
|
127
140
|
```
|
|
128
141
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: rosotacom-dev
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.5.dev1
|
|
4
4
|
Summary: Host CLI for ROS OTA communication sessions.
|
|
5
5
|
Author: develNor
|
|
6
6
|
License-Expression: BSD-3-Clause
|
|
@@ -98,6 +98,9 @@ pipx install rosotacom-dev # isolated, on PATH everywhere
|
|
|
98
98
|
on PyPI stays reserved for the FZI upstream. -->
|
|
99
99
|
# or: pip install --user rosotacom
|
|
100
100
|
|
|
101
|
+
# a specific development build (for consumers tracking work in progress)
|
|
102
|
+
pipx install "rosotacom-dev==2.4.dev3"
|
|
103
|
+
|
|
101
104
|
# from a source checkout (developers)
|
|
102
105
|
cd /path/to/ros_communication_devcontainer
|
|
103
106
|
./install.sh # builds a checkout-local .venv
|
|
@@ -109,6 +112,12 @@ python -m rosotacom --version
|
|
|
109
112
|
rosotacom doctor
|
|
110
113
|
```
|
|
111
114
|
|
|
115
|
+
Every commit that lands on the development branch with green CI is published as
|
|
116
|
+
a `X.Y.devN` pre-release, so a consumer never has to wait for a release decision
|
|
117
|
+
or reach past the package to a checkout. `pip` ignores pre-releases unless you
|
|
118
|
+
pin one exactly, so this cannot reach you by accident. See
|
|
119
|
+
[docs/release.md](docs/release.md).
|
|
120
|
+
|
|
112
121
|
For a source checkout, that single `source .venv/bin/activate` command also
|
|
113
122
|
enables completion. Nothing needs to be added to your shell configuration.
|
|
114
123
|
|
|
@@ -428,10 +437,10 @@ rosotacom ota-smoke 2_native_chatter \
|
|
|
428
437
|
--peer b=robot
|
|
429
438
|
```
|
|
430
439
|
|
|
431
|
-
`ota-smoke` accepts sessions and scenarios. It
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
440
|
+
`ota-smoke` accepts sessions and scenarios. It puts rosotacom on each peer,
|
|
441
|
+
stages the active project, runs delivery and isolation checks, collects
|
|
442
|
+
artifacts, stops the run, and removes the remote workdir. Add `--interactive`
|
|
443
|
+
for a local control tmux with
|
|
435
444
|
one attachable communication/catmux window per peer with a live status pane below
|
|
436
445
|
each one. Scenario targets also get one native application-container window per
|
|
437
446
|
scenario app. Stop an interactive run with `rosotacom ota-smoke TARGET
|
|
@@ -440,6 +449,29 @@ metadata is not available. Use `--keep-running` to leave components up,
|
|
|
440
449
|
`--keep-workdir` to retain staged files, or `--reuse` to reuse an existing
|
|
441
450
|
installation.
|
|
442
451
|
|
|
452
|
+
#### What the peers run: `--install-mode`
|
|
453
|
+
|
|
454
|
+
```bash
|
|
455
|
+
# default: stage and install what you are running, uncommitted changes included
|
|
456
|
+
rosotacom ota-smoke 2_native_chatter --peer a=workstation --peer b=robot
|
|
457
|
+
|
|
458
|
+
# rehearse a deployment: the peers install the published artefact
|
|
459
|
+
rosotacom ota-smoke 2_native_chatter --peer a=workstation --peer b=robot \
|
|
460
|
+
--install-mode pin # defaults to your own version
|
|
461
|
+
rosotacom ota-smoke 2_native_chatter --peer a=workstation --peer b=robot \
|
|
462
|
+
--install-mode pin --install-pin 2.4
|
|
463
|
+
```
|
|
464
|
+
|
|
465
|
+
`source` is right while iterating on rosotacom itself — the peers run the code
|
|
466
|
+
in front of you. `pin` is right when the run is meant to stand in for a real
|
|
467
|
+
deployment: the peers install from the index, so a packaging defect (a file
|
|
468
|
+
missing from the wheel, an undeclared dependency) fails in the rehearsal instead
|
|
469
|
+
of on the target machine. `source` cannot catch that class of defect by
|
|
470
|
+
construction, because it never builds the artefact that ships.
|
|
471
|
+
|
|
472
|
+
The run manifest records which mode and which version the peers ran, so a result
|
|
473
|
+
can be attributed to an artefact rather than to a working copy.
|
|
474
|
+
|
|
443
475
|
### Live status / debugging overview
|
|
444
476
|
|
|
445
477
|
Enable a continuously-updated, per-topic pipeline overview by setting
|
|
@@ -53,6 +53,9 @@ pipx install rosotacom-dev # isolated, on PATH everywhere
|
|
|
53
53
|
on PyPI stays reserved for the FZI upstream. -->
|
|
54
54
|
# or: pip install --user rosotacom
|
|
55
55
|
|
|
56
|
+
# a specific development build (for consumers tracking work in progress)
|
|
57
|
+
pipx install "rosotacom-dev==2.4.dev3"
|
|
58
|
+
|
|
56
59
|
# from a source checkout (developers)
|
|
57
60
|
cd /path/to/ros_communication_devcontainer
|
|
58
61
|
./install.sh # builds a checkout-local .venv
|
|
@@ -64,6 +67,12 @@ python -m rosotacom --version
|
|
|
64
67
|
rosotacom doctor
|
|
65
68
|
```
|
|
66
69
|
|
|
70
|
+
Every commit that lands on the development branch with green CI is published as
|
|
71
|
+
a `X.Y.devN` pre-release, so a consumer never has to wait for a release decision
|
|
72
|
+
or reach past the package to a checkout. `pip` ignores pre-releases unless you
|
|
73
|
+
pin one exactly, so this cannot reach you by accident. See
|
|
74
|
+
[docs/release.md](docs/release.md).
|
|
75
|
+
|
|
67
76
|
For a source checkout, that single `source .venv/bin/activate` command also
|
|
68
77
|
enables completion. Nothing needs to be added to your shell configuration.
|
|
69
78
|
|
|
@@ -383,10 +392,10 @@ rosotacom ota-smoke 2_native_chatter \
|
|
|
383
392
|
--peer b=robot
|
|
384
393
|
```
|
|
385
394
|
|
|
386
|
-
`ota-smoke` accepts sessions and scenarios. It
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
395
|
+
`ota-smoke` accepts sessions and scenarios. It puts rosotacom on each peer,
|
|
396
|
+
stages the active project, runs delivery and isolation checks, collects
|
|
397
|
+
artifacts, stops the run, and removes the remote workdir. Add `--interactive`
|
|
398
|
+
for a local control tmux with
|
|
390
399
|
one attachable communication/catmux window per peer with a live status pane below
|
|
391
400
|
each one. Scenario targets also get one native application-container window per
|
|
392
401
|
scenario app. Stop an interactive run with `rosotacom ota-smoke TARGET
|
|
@@ -395,6 +404,29 @@ metadata is not available. Use `--keep-running` to leave components up,
|
|
|
395
404
|
`--keep-workdir` to retain staged files, or `--reuse` to reuse an existing
|
|
396
405
|
installation.
|
|
397
406
|
|
|
407
|
+
#### What the peers run: `--install-mode`
|
|
408
|
+
|
|
409
|
+
```bash
|
|
410
|
+
# default: stage and install what you are running, uncommitted changes included
|
|
411
|
+
rosotacom ota-smoke 2_native_chatter --peer a=workstation --peer b=robot
|
|
412
|
+
|
|
413
|
+
# rehearse a deployment: the peers install the published artefact
|
|
414
|
+
rosotacom ota-smoke 2_native_chatter --peer a=workstation --peer b=robot \
|
|
415
|
+
--install-mode pin # defaults to your own version
|
|
416
|
+
rosotacom ota-smoke 2_native_chatter --peer a=workstation --peer b=robot \
|
|
417
|
+
--install-mode pin --install-pin 2.4
|
|
418
|
+
```
|
|
419
|
+
|
|
420
|
+
`source` is right while iterating on rosotacom itself — the peers run the code
|
|
421
|
+
in front of you. `pin` is right when the run is meant to stand in for a real
|
|
422
|
+
deployment: the peers install from the index, so a packaging defect (a file
|
|
423
|
+
missing from the wheel, an undeclared dependency) fails in the rehearsal instead
|
|
424
|
+
of on the target machine. `source` cannot catch that class of defect by
|
|
425
|
+
construction, because it never builds the artefact that ships.
|
|
426
|
+
|
|
427
|
+
The run manifest records which mode and which version the peers ran, so a result
|
|
428
|
+
can be attributed to an artefact rather than to a working copy.
|
|
429
|
+
|
|
398
430
|
### Live status / debugging overview
|
|
399
431
|
|
|
400
432
|
Enable a continuously-updated, per-topic pipeline overview by setting
|
|
@@ -11,10 +11,14 @@ but one stable release line:
|
|
|
11
11
|
|
|
12
12
|
- topic PRs are gated into the repository's active development branch by the
|
|
13
13
|
GitHub checks below;
|
|
14
|
-
-
|
|
14
|
+
- every commit that lands there with green CI is published as a `X.Y.devN`
|
|
15
|
+
pre-release, so any commit is consumable without a release decision;
|
|
16
|
+
- **`main`** is the stable line a repository synchronises upstream from;
|
|
15
17
|
- moving development work to `main` is a deliberate maintainer operation and
|
|
16
18
|
may require an external OTA gate;
|
|
17
|
-
- releases are tags `vX.Y.Z` cut from
|
|
19
|
+
- releases are tags `vX.Y.Z` cut from a validated commit on the release line —
|
|
20
|
+
in this repository `develop`, its default branch (see
|
|
21
|
+
[release.md](release.md)).
|
|
18
22
|
|
|
19
23
|
The OTA tier is not part of this repository's public CI. An operator-supplied
|
|
20
24
|
external runner provides it as a manual promotion gate, as described generically
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# GitHub Repository Settings
|
|
2
|
+
|
|
3
|
+
These settings live outside git and must be verified separately in every
|
|
4
|
+
repository using this shared codebase. The GitHub UI, CLI, and API remain the
|
|
5
|
+
live source of truth.
|
|
6
|
+
|
|
7
|
+
## Branch Protection
|
|
8
|
+
|
|
9
|
+
Expected shared state:
|
|
10
|
+
|
|
11
|
+
- `main` is the protected release line.
|
|
12
|
+
- The repository's active development/default branch is protected.
|
|
13
|
+
- Pull requests are required.
|
|
14
|
+
- The required status check is `ci-success`.
|
|
15
|
+
- Squash merges are allowed.
|
|
16
|
+
- CodeQL default setup is enabled for Actions and Python.
|
|
17
|
+
- The `release` environment and `PYPI_PUBLISH_URL` variable point at this
|
|
18
|
+
repository's intended package index.
|
|
19
|
+
|
|
20
|
+
Verify:
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
REPO="$(gh repo view --json nameWithOwner --jq .nameWithOwner)"
|
|
24
|
+
DEFAULT_BRANCH="$(gh repo view --repo "$REPO" --json defaultBranchRef --jq .defaultBranchRef.name)"
|
|
25
|
+
gh ruleset list --repo "$REPO" --parents
|
|
26
|
+
gh ruleset check "$DEFAULT_BRANCH" --repo "$REPO"
|
|
27
|
+
gh ruleset check main --repo "$REPO"
|
|
28
|
+
gh api "repos/$REPO/code-scanning/default-setup"
|
|
29
|
+
gh variable get PYPI_PUBLISH_URL --repo "$REPO"
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
`gh ruleset check` reports which rules apply, not which status checks they
|
|
33
|
+
require. A ruleset can be named for CI and still carry no
|
|
34
|
+
`required_status_checks` rule, in which case auto-merge will merge a pull
|
|
35
|
+
request whose checks are red. Read the rule types out directly:
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
gh api "repos/$REPO/rulesets" --jq '.[].id' \
|
|
39
|
+
| xargs -I{} gh api "repos/$REPO/rulesets/{}" \
|
|
40
|
+
--jq '{name, rules: [.rules[] | select(.type=="required_status_checks")
|
|
41
|
+
| .parameters.required_status_checks[].context]}'
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Expected output names `ci-success`. An empty list is the drift this section
|
|
45
|
+
exists to catch.
|
|
46
|
+
|
|
47
|
+
## Trusted Publishers
|
|
48
|
+
|
|
49
|
+
PyPI authorizes an upload by matching the OIDC claims of the *workflow file*
|
|
50
|
+
that requests it, so a publisher registration is per filename, not per
|
|
51
|
+
repository. This codebase publishes from two:
|
|
52
|
+
|
|
53
|
+
| Workflow | Publishes | Registration |
|
|
54
|
+
|---|---|---|
|
|
55
|
+
| `release.yml` | stable `vX.Y.Z` tags | required |
|
|
56
|
+
| `dev-release.yml` | `X.Y.devN` from the development branch | required for the development channel |
|
|
57
|
+
|
|
58
|
+
A missing registration fails at upload with `invalid-publisher: valid token, but
|
|
59
|
+
no corresponding publisher`, after a completely successful build. The message
|
|
60
|
+
prints the claims it presented; `workflow_ref` is the filename to register.
|
|
61
|
+
|
|
62
|
+
Register on PyPI under the project's *Publishing* settings: owner, repository,
|
|
63
|
+
the workflow filename, and an empty environment (this codebase deliberately uses
|
|
64
|
+
no GitHub environment, so that no repository sharing it needs environment-admin
|
|
65
|
+
rights).
|
|
66
|
+
|
|
67
|
+
## Repository Metadata
|
|
68
|
+
|
|
69
|
+
Expected topics include `ros2`, `docker`, `robotics`, `teleoperation`, and
|
|
70
|
+
`communication`.
|
|
71
|
+
|
|
72
|
+
Verify:
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
gh repo view --json description,homepageUrl,repositoryTopics
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
## Drift Handling
|
|
79
|
+
|
|
80
|
+
If GitHub state differs from this document, either update the live setting to
|
|
81
|
+
match the documented contract or update this document in a PR if policy changed.
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# v2.3
|
|
2
|
+
|
|
3
|
+
## Summary
|
|
4
|
+
|
|
5
|
+
- Add `rosotacom resources path <name>`: report the host path of a packaged
|
|
6
|
+
resource (`ws`, `com_msgs`) for tooling outside the installation. rosotacom
|
|
7
|
+
installs into an isolated environment (pipx, or a project venv), so a consumer
|
|
8
|
+
cannot `import rosotacom` to compute such a path; this command is the
|
|
9
|
+
supported lookup.
|
|
10
|
+
|
|
11
|
+
## Compatibility And Migration
|
|
12
|
+
|
|
13
|
+
- No breaking changes. Consumers that hardcoded a path into a rosotacom checkout
|
|
14
|
+
should switch to `rosotacom resources path com_msgs`.
|
|
15
|
+
|
|
16
|
+
## Known Issues
|
|
17
|
+
|
|
18
|
+
- An installed `rosotacom-dev` reports its version as `0+unknown`: the package
|
|
19
|
+
looked up the distribution name `rosotacom`, which the fork no longer uses.
|
|
20
|
+
A version check against a pin therefore never matches, and
|
|
21
|
+
`ota-smoke --install-mode source` started from an installation writes that
|
|
22
|
+
string into the source bundle it builds on each peer, where it is not a valid
|
|
23
|
+
PEP 440 version and the remote build fails. Fixed in 2.4; this release cannot
|
|
24
|
+
be replaced because a published version is immutable.
|
|
25
|
+
|
|
26
|
+
## Validation
|
|
27
|
+
|
|
28
|
+
- `just lint`
|
|
29
|
+
- `just typecheck`
|
|
30
|
+
- `just test-unit`
|
|
31
|
+
- `just test-contract`
|
|
32
|
+
- `just docs`
|
|
33
|
+
- `just package`
|
|
34
|
+
- `just test-e2e-smoke`
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# v2.4
|
|
2
|
+
|
|
3
|
+
## Summary
|
|
4
|
+
|
|
5
|
+
- **Fix the reported version.** An installed distribution is now looked up
|
|
6
|
+
rather than assumed, so `rosotacom --version` reports the real version under
|
|
7
|
+
both published names (`rosotacom-dev` from this fork, `rosotacom` upstream).
|
|
8
|
+
Up to 2.3 every installed `rosotacom-dev` reported `0+unknown`, which made a
|
|
9
|
+
version check against a pin impossible and produced an unbuildable OTA source
|
|
10
|
+
bundle.
|
|
11
|
+
- **Publish a development channel.** Every commit that lands on the development
|
|
12
|
+
branch with green CI is published as a `X.Y.devN` pre-release. Consuming this
|
|
13
|
+
package no longer means waiting for a release decision. `pip` ignores
|
|
14
|
+
pre-releases unless one is pinned exactly, so the stable line is unaffected.
|
|
15
|
+
- **Stop duplicating packaging metadata.** The source bundle `ota-smoke` builds
|
|
16
|
+
when it runs from an installation derives its name, version, dependencies and
|
|
17
|
+
entry points from the installed distribution. The hand-written copy it used
|
|
18
|
+
before had drifted: `mcap` and `Pillow` were missing, so a peer prepared this
|
|
19
|
+
way imported fine and then failed inside the first MCAP or image code path.
|
|
20
|
+
- **`ota-smoke --install-mode pin`.** Install a published release on each peer
|
|
21
|
+
instead of staging a source tree, so the rehearsal runs the artefact that
|
|
22
|
+
ships and can catch a packaging defect before a target machine does. The run
|
|
23
|
+
manifest records the mode and version the peers ran.
|
|
24
|
+
- **`rosotacom resources path` covers `package` and `examples`**, which is how
|
|
25
|
+
pin mode remaps project config roots onto the peer's installation.
|
|
26
|
+
|
|
27
|
+
## Compatibility And Migration
|
|
28
|
+
|
|
29
|
+
- `ota-smoke` behaves as before unless `--install-mode pin` is passed.
|
|
30
|
+
- The OTA deployment state file (`ota-deployment.yaml`) is now `schema_version:
|
|
31
|
+
2` and carries the install mode. State files written by an older version are
|
|
32
|
+
rejected; they are per-run artifacts, so start a new run.
|
|
33
|
+
- Consumers pinning `rosotacom-dev==2.3` should move to `2.4` to get a usable
|
|
34
|
+
`--version`.
|
|
35
|
+
|
|
36
|
+
## Validation
|
|
37
|
+
|
|
38
|
+
- `just lint`
|
|
39
|
+
- `just typecheck`
|
|
40
|
+
- `just test-unit`
|
|
41
|
+
- `just test-contract`
|
|
42
|
+
- `just docs`
|
|
43
|
+
- `just package`
|
|
44
|
+
- `just test-e2e-smoke`
|
|
45
|
+
- `tests/contract/test_ota_source_bundle.py` fails if the bundle metadata ever
|
|
46
|
+
diverges from `pyproject.toml` again.
|