rosotacom-dev 2.5.dev73__tar.gz → 2.5.dev74__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.dev73 → rosotacom_dev-2.5.dev74}/PKG-INFO +1 -1
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/docs/findings/README.md +1 -0
- rosotacom_dev-2.5.dev74/docs/findings/a-fitted-delay-table-never-reached-the-shaper.md +121 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/cli_benchmark.py +29 -11
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/network_profiles.py +38 -1
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom_dev.egg-info/PKG-INFO +1 -1
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom_dev.egg-info/SOURCES.txt +1 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom_dev.egg-info/scm_file_list.json +1 -0
- rosotacom_dev-2.5.dev74/src/rosotacom_dev.egg-info/scm_version.json +8 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/tests/unit/test_network_profiles.py +43 -0
- rosotacom_dev-2.5.dev73/src/rosotacom_dev.egg-info/scm_version.json +0 -8
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/.devcontainer/devcontainer.json.template +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/.devcontainer/re_generate_devcontainer_json.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/.github/CODEOWNERS +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/.github/ISSUE_TEMPLATE/documentation-audit.md +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/.github/ISSUE_TEMPLATE/implementation-cleanup.md +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/.github/ISSUE_TEMPLATE/quality-workflow.md +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/.github/ISSUE_TEMPLATE/redesign.md +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/.github/ISSUE_TEMPLATE/release-process.md +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/.github/ISSUE_TEMPLATE/repository-diagnosis.md +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/.github/ISSUE_TEMPLATE/test-ci-audit.md +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/.github/ISSUE_TEMPLATE/work-item.md +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/.github/actions/setup-just/action.yml +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/.github/dependabot.yml +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/.github/workflows/benchmark-calibrate.yml +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/.github/workflows/benchmark-gate.yml +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/.github/workflows/dev-release.yml +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/.github/workflows/image-scan.yml +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/.github/workflows/nightly-e2e.yml +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/.github/workflows/pr-lightweight.yml +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/.github/workflows/pr-merge-gate.yml +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/.github/workflows/release.yml +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/.pre-commit-config.yaml +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/AGENTS.md +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/CONCURRENCY.md +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/CONTRIBUTING.md +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/DEVELOPMENT_PRINCIPLES.md +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/LICENSE.txt +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/MANIFEST.in +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/README.md +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/budgets.jsonl +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/calibration/README.md +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/calibration/capacity-size-tight-cyclone.json +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/calibration/probe-loss-gop-tight-cyclone.json +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/calibration/probe-loss-nominal-cyclone.json +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/calibration/probe-loss-tight-cyclone.json +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/calibration/probe-loss-tight-fastdds.json +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/calibration/probe-loss-tight-zenoh.json +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/codecov.yml +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/deployment-configuration.md +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/docs/benchmark-ab.md +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/docs/benchmark-bag-as-load.md +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/docs/ci.md +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/docs/ffmpeg-keyframes.md +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/docs/findings/a-transport-element-doubles-every-fastdds-sample.md +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/docs/findings/cyclone-fragment-equal-to-max-drops-fragmented-samples.md +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/docs/findings/cyclone-spdp-discovery-bursts.md +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/docs/findings/delay-alone-no-loss.md +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/docs/findings/fastdds-datagram-cap-drops-large-samples.md +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/docs/findings/graph-derived-types-block-a-non-graph-transport.md +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/docs/findings/head-of-line-irregularity.md +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/docs/findings/jitter-loss-bandwidth-latency.md +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/docs/findings/keyframe-loss-kills-the-next-deltas.md +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/docs/findings/lifespan-is-enforced-by-one-reader-and-not-the-other.md +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/docs/findings/lighter-message-loss.md +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/docs/findings/one-domain-two-cyclone-configs-stop-interoperating.md +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/docs/findings/oversubscription-queues-not-losses.md +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/docs/findings/reorder-becomes-reader-loss.md +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/docs/findings/repro/decode_chain_repro.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/docs/findings/repro/reorder_drop_repro.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/docs/findings/sender-rows-make-a-dead-link-look-loss-free.md +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/docs/findings/zero-loss-boundaries-18kb-20hz.md +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/docs/forensics-report.md +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/docs/geo-link-map.md +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/docs/github-repository-settings.md +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/docs/link-bandwidth.md +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/docs/link-trace.md +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/docs/ota-pcap.md +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/docs/owner-runbook.md +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/docs/performance-bands.md +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/docs/playbooks/README.md +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/docs/quality-model.md +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/docs/release-notes/TEMPLATE.md +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/docs/release-notes/v2.1.md +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/docs/release-notes/v2.2.md +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/docs/release-notes/v2.3.md +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/docs/release-notes/v2.4.md +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/docs/release.md +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/docs/rfcs/0001-expectation-driven-test-suite.md +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/docs/rfcs/0002-expectation-concepts.md +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/docs/rfcs/0003-metric-backbone.md +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/docs/rfcs/0004-network-profiles.md +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/docs/rfcs/0005-benchmark-genres-and-ci.md +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/docs/rfcs/0006-dynamic-qos.md +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/docs/rfcs/0007-regression-gate.md +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/docs/rfcs/README.md +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/docs/testing.md +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/docs/work-items.md +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/install.sh +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/justfile +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/media/control_center.png +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/media/echo_test.png +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/media/forensics-report-example.png +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/media/host.png +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/media/vehicle.png +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/pyproject.toml +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/requirements.txt +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/rosotacom.yaml +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/session-configuration.md +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/setup.cfg +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/__init__.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/__main__.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/anonymize.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/bag_ground_truth.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/benched_set.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/benchmark.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/benchmark_delta.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/bundle_check.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/cli.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/deployment.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/ffmpeg_packet.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/forensics.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/geomap.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/image_cache.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/netem_dist.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/network_preflight.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/network_shaper.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/plots.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/py.typed +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/benched-set.yaml +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/examples/.gitignore +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/examples/README.md +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/examples/__init__.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/examples/bags/8_drop_reference/metadata.yaml +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/examples/deployment.example.yaml +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/examples/dist/field-20260817.dist +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/examples/profiles.yaml +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/examples/ros2docker.json +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/examples/ros2docker.lyrical.json +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/examples/rosotacom.yaml +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/examples/scenarios/2_native_chatter/scenario-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/examples/scripts/1_heartbeat/run_machine_a.sh +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/examples/scripts/1_heartbeat/run_machine_b.sh +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_a/external.lyrical.ros2docker.json +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_a/external.ros2docker.json +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_a/run_communication.sh +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_a/run_external.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_a/wait_for_echo_topic.sh +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_b/external.lyrical.ros2docker.json +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_b/external.ros2docker.json +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_b/run_communication.sh +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_b/run_external.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_a/external.ros2docker.json +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_a/external_session.yaml +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_a/foxglove.json +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_a/run_communication.sh +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_a/run_external.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_b/costmap_1second/costmap_1second_0.mcap +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_b/costmap_1second/metadata.yaml +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_b/external.ros2docker.json +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_b/run_communication.sh +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_b/run_external.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_a/external.ros2docker.json +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_a/external_session.yaml +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_a/foxglove.json +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_a/run_communication.sh +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_a/run_external.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_b/costmap_1second/costmap_1second_0.mcap +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_b/costmap_1second/metadata.yaml +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_b/external.ros2docker.json +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_b/run_communication.sh +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_b/run_external.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_a/external.ros2docker.json +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_a/external_session.yaml +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_a/run_communication.sh +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_a/run_external.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_b/external.ros2docker.json +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_b/external_session.yaml +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_b/run_communication.sh +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_b/run_external.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_a/external.ros2docker.json +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_a/external_session.yaml +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_a/run_communication.sh +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_a/run_external.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_b/external.ros2docker.json +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_b/external_session.yaml +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_b/run_communication.sh +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_b/run_external.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/examples/sessions/10_restamp/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/examples/sessions/11_trickle/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/examples/sessions/12_content_integrity/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/examples/sessions/13_link_latency/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/examples/sessions/14_remote_assist_anonymized/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/examples/sessions/15_remote_assist_anonymized_costmap/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/examples/sessions/16_remote_assist_anonymized_camera/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/examples/sessions/17_synthetic_camera_quality/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/examples/sessions/1_heartbeat/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/examples/sessions/1_heartbeat_status/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/examples/sessions/2_native_chatter/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/examples/sessions/3_comp_occ_grid/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/examples/sessions/4_comp_occ_grid_zen/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/examples/sessions/5_sized_payload/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/examples/sessions/6_sized_payload_zen/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/examples/sessions/7_latched_static/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/examples/sessions/8_drop/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/examples/sessions/9_throttle/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/examples/sessions/bench_1_1_capacity/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/examples/sessions/bench_1_2_load_sweep/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/examples/sessions/bench_1_3_ramp/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/examples/sessions/bench_1_4_recovery/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/examples/sessions/bench_1_5_camera/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ros2docker.json.example +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ros2docker.lyrical.json.example +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/.vscode/c_cpp_properties.json +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/.vscode/settings.json +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_easy_mode.xml.template +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_initial_peer_list.xml.template +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_v2.xml.template +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_v3.xml.template +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_v4.xml.template +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_v5.xml.template +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/ota_configs/create_zenoh_json5.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/ota_configs/cyclonedds_local_participants.xml.template +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/ota_configs/cyclonedds_minimal.xml.template +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/ota_configs/cyclonedds_scoped.xml.template +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/ota_configs/cyclonedds_tuned.xml.template +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/ota_configs/fastdds_easy_mode.xml.template +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/ota_configs/fastdds_local.xml.template +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/ota_configs/fastdds_tuned.xml.template +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/ota_configs/fastdds_unicast.xml.template +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/ota_configs/get_ota_xml.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/ota_configs/utils.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/ota_configs/zenoh.json5.template +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/ros2src/.gitkeep +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/ros2src/com_cpp/CMakeLists.txt +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/ros2src/com_cpp/COLCON_IGNORE +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/ros2src/com_cpp/LICENSE.txt +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/ros2src/com_cpp/package.xml +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/ros2src/com_cpp/src/hz_monitor.cpp +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/ros2src/com_cpp/src/universal_compressor.cpp +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/ros2src/com_cpp/src/universal_decompressor.cpp +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/ros2src/com_msgs/CMakeLists.txt +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/ros2src/com_msgs/LICENSE.txt +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/ros2src/com_msgs/msg/CompressedData.msg +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/ros2src/com_msgs/msg/EchoHeartbeat.msg +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/ros2src/com_msgs/msg/OtaStamped.msg +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/ros2src/com_msgs/msg/SizedPayload.msg +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/ros2src/com_msgs/package.xml +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/ros2src/com_py/LICENSE.txt +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/ros2src/com_py/com_py/__init__.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/ros2src/com_py/com_py/base_bridge_relay.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/ros2src/com_py/com_py/bridge_in.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/ros2src/com_py/com_py/bridge_out.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/ros2src/com_py/com_py/ffmpeg_flags.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/ros2src/com_py/com_py/heartbeat_echo.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/ros2src/com_py/com_py/hz_monitor.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/ros2src/com_py/com_py/image_bandwidth_reducer.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/ros2src/com_py/com_py/image_pixel_capper.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/ros2src/com_py/com_py/lanelet_saver.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/ros2src/com_py/com_py/latch_relay.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/costmap_remapper.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/marker_remapper.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/speed_test.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/tf_remapper.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/traffic_monitor.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/wifi_network_analysis_1.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/ros2src/com_py/com_py/link_bytes.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/ros2src/com_py/com_py/link_trace.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/ros2src/com_py/com_py/local_global_frame_bridge.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/ros2src/com_py/com_py/localization_map_split_reduce_saver.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/ros2src/com_py/com_py/msg_transform.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/ros2src/com_py/com_py/ota_pcap.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/ros2src/com_py/com_py/pair_management.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/ros2src/com_py/com_py/playout_pacer.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/ros2src/com_py/com_py/playout_pacer_core.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/ros2src/com_py/com_py/pub_sub_pair.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/ros2src/com_py/com_py/qos.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/ros2src/com_py/com_py/relay_in.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/ros2src/com_py/com_py/relay_out.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/ros2src/com_py/com_py/restamp.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/ros2src/com_py/com_py/sized_publisher.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/ros2src/com_py/com_py/stage_latency.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/ros2src/com_py/com_py/stage_latency_core.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/ros2src/com_py/com_py/status_overview.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/ros2src/com_py/com_py/status_overview_core.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/ros2src/com_py/com_py/tf_map_to_cart_saver.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/ros2src/com_py/com_py/topic_monitor.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/ros2src/com_py/com_py/topic_resolution.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/ros2src/com_py/com_py/trickle.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/ros2src/com_py/com_py/universal_compressor.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/ros2src/com_py/com_py/universal_decompressor.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/ros2src/com_py/com_py/universal_ota_unwrapper.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/ros2src/com_py/com_py/universal_ota_wrapper.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/ros2src/com_py/package.xml +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/ros2src/com_py/resource/com_py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/ros2src/com_py/setup.cfg +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/ros2src/com_py/setup.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/ros2src/com_py/test/test_copyright.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/ros2src/com_py/test/test_flake8.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/ros2src/com_py/test/test_pep257.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/session/content/base/session_plugin_base.yaml +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/session/content/network/up_connectivity.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/session/content/network/wifi_network_analysis_2.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/session/creation/anonymize_bag.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/session/creation/catmux_log_setup.sh +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/session/creation/create_session_yaml.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/session/creation/generate_session_files.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/session/creation/run_session.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/session/creation/run_session_in_external_terminal.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/resources/ws/session/creation/strip_ansi.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/status_eval.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/stream_stats.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/trace_profiles.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/transit.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom/video_quality.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom_dev.egg-info/dependency_links.txt +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom_dev.egg-info/entry_points.txt +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom_dev.egg-info/requires.txt +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom_dev.egg-info/top_level.txt +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/terminology.md +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/tests/contract/test_benched_set_registry.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/tests/contract/test_findings.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/tests/contract/test_generated_topics_have_a_producer.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/tests/contract/test_lyrical_runtime_compat.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/tests/contract/test_markdown_links.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/tests/contract/test_ota_source_bundle.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/tests/contract/test_package_metadata.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/tests/contract/test_packaged_resources.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/tests/contract/test_profile_covers_generated_commands.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/tests/contract/test_pytest_policy.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/tests/contract/test_readme_examples.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/tests/contract/test_security_maintenance_config.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/tests/contract/test_session_configuration_doc.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/tests/contract/test_session_template_substitution.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/tests/contract/test_workflow_contracts.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/tests/e2e/conftest.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/tests/e2e/test_anonymize_e2e.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/tests/e2e/test_benchmark_ab.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/tests/e2e/test_benchmark_capacity.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/tests/e2e/test_benchmark_replay.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/tests/e2e/test_parallel_smoke.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/tests/e2e/test_smoke.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/tests/e2e/test_timeline_stepping.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/tests/e2e/test_video_quality_e2e.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/tests/sessions/generate_rmw_matrix.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/tests/sessions/rmw_matrix/1_heartbeat_cyclone-local_zenoh-ros2dds-ota/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/tests/sessions/rmw_matrix/1_heartbeat_cyclone-ota/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/tests/sessions/rmw_matrix/1_heartbeat_cyclone-ota-tuned/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/tests/sessions/rmw_matrix/1_heartbeat_fastdds/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/tests/sessions/rmw_matrix/1_heartbeat_fastdds-default/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/tests/sessions/rmw_matrix/1_heartbeat_zen-endpoints/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/tests/unit/test_anonymize.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/tests/unit/test_bag_ground_truth.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/tests/unit/test_benched_set.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/tests/unit/test_benchmark.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/tests/unit/test_benchmark_delta.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/tests/unit/test_bundle_check.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/tests/unit/test_catmux_pane_logging.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/tests/unit/test_cli.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/tests/unit/test_cli_benchmark.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/tests/unit/test_concurrency.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/tests/unit/test_container_shaping.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/tests/unit/test_deployment.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/tests/unit/test_ffmpeg_flags.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/tests/unit/test_ffmpeg_packet.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/tests/unit/test_field_profiles.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/tests/unit/test_forensics.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/tests/unit/test_geomap.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/tests/unit/test_image_cache.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/tests/unit/test_link_bytes.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/tests/unit/test_link_trace.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/tests/unit/test_netem_dist.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/tests/unit/test_network_preflight.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/tests/unit/test_network_shaper.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/tests/unit/test_ota_link_configs.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/tests/unit/test_ota_pcap.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/tests/unit/test_ota_unwrapper.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/tests/unit/test_ota_wrapper.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/tests/unit/test_ota_xml.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/tests/unit/test_playout_pacer.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/tests/unit/test_plots.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/tests/unit/test_pub_sub_pair_types.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/tests/unit/test_qos_fallback_logging.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/tests/unit/test_relay_optional_parameters.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/tests/unit/test_ros_node_entity_ownership.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/tests/unit/test_session_pipeline.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/tests/unit/test_stage_latency.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/tests/unit/test_status_eval.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/tests/unit/test_status_overview.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/tests/unit/test_status_overview_observer.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/tests/unit/test_stream_stats.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/tests/unit/test_terminology_stage_ownership.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/tests/unit/test_trace_profiles.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/tests/unit/test_transit.py +0 -0
- {rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/tests/unit/test_video_quality.py +0 -0
|
@@ -28,6 +28,7 @@ living verification hook.
|
|
|
28
28
|
|
|
29
29
|
## Findings
|
|
30
30
|
|
|
31
|
+
- [A fitted delay table never reached the shaper](a-fitted-delay-table-never-reached-the-shaper.md) - every profile carrying a custom netem distribution failed at arming: the table was installed as `/usr/lib/tc/<name>.dist` while iproute2 on a multiarch image reads `/usr/lib/<triplet>/tc`, so the drive-fitted delay tail was never actually in use.
|
|
31
32
|
- [Sender-side transit rows made a dead link report zero loss](sender-rows-make-a-dead-link-look-loss-free.md) - `delivered = rows - lost` counted the sender's own `sent` rows as deliveries, so a topic the receiver never saw summarised as `delivered == expected` at 0.0% loss, with the publisher's timer reported as arrival spacing.
|
|
32
33
|
- [A bridge that learns types from the graph cannot use a transport that does not carry the graph](graph-derived-types-block-a-non-graph-transport.md) - over `zenoh_ros2dds` the payload topic never arrived in either run: the bridge routes a topic once a local reader exists and the reader waited for the bridge, leaving only `Pending=1` in a log.
|
|
33
34
|
- [A Fast DDS datagram cap stops every message larger than it](fastdds-datagram-cap-drops-large-samples.md) - copying CycloneDDS's 1200 B fragment size into the Fast DDS OTA profile makes every sample above the cap never arrive, at 1200 B and at 8192 B, sync and async — while the 84 B heartbeat keeps flowing at 10 Hz.
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
# A Fitted Delay Table Never Reached The Shaper
|
|
2
|
+
|
|
3
|
+
## Claim
|
|
4
|
+
|
|
5
|
+
Every profile carrying a custom netem delay distribution failed at arming time,
|
|
6
|
+
on every image this project ships, since the feature was added. The runner
|
|
7
|
+
installed the table as `/usr/lib/tc/<name>.dist`; iproute2 compiles its library
|
|
8
|
+
directory in, and on a multiarch Debian or Ubuntu build that directory is
|
|
9
|
+
`/usr/lib/<triplet>/tc`. `/usr/lib/tc` does not exist there at all, so the copy
|
|
10
|
+
created it, succeeded, and put the file where nothing reads it:
|
|
11
|
+
|
|
12
|
+
```
|
|
13
|
+
rosotacom: error: network shaping command failed in …_com_to_b:
|
|
14
|
+
tc qdisc replace dev eth0 root handle 10: netem delay 25ms 18ms
|
|
15
|
+
distribution field-20260817 loss gemodel 0.102% 2.5% 2.7% 0.098%
|
|
16
|
+
-> No distribution data for field-20260817
|
|
17
|
+
(/usr/lib/x86_64-linux-gnu/tc//field-20260817.dist: No such file or directory)
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
The error names the directory `tc` wanted, one line after the runner printed
|
|
21
|
+
that it had installed the table somewhere else, and the two paths were never
|
|
22
|
+
compared. What made it survive is that no committed finding needed the table:
|
|
23
|
+
`field-20260817-case3-delay-jam`, the one field profile a published run used,
|
|
24
|
+
carries `rate` and `delay` and no `distribution`. The three profiles that do
|
|
25
|
+
carry one — `-steady`, `-events`, `-soggy` — are exactly the ones nothing had
|
|
26
|
+
run end to end.
|
|
27
|
+
|
|
28
|
+
The consequence is not a wrong number anywhere. It is that the drive-derived
|
|
29
|
+
delay distribution, whose whole purpose is that a normal jitter model
|
|
30
|
+
under-tails this link by about a factor of two, could not be used, so every
|
|
31
|
+
replay of the 2026-08-17 link either omitted its tail or fell back to a builtin
|
|
32
|
+
shape.
|
|
33
|
+
|
|
34
|
+
## Setup
|
|
35
|
+
|
|
36
|
+
- Host pair / topology: one host, the packaged local benchmark rig — two
|
|
37
|
+
communication containers on their own Docker network, `tc` applied inside
|
|
38
|
+
each container's own netns (`--sudo-mode container`), no host privileges.
|
|
39
|
+
- Session: `bench_1_1_capacity` from the packaged example project, one
|
|
40
|
+
`a->b:/bench_capacity` stream at 12000 B and 10 Hz.
|
|
41
|
+
- rosotacom SHA: present up to `25251cb`, fixed in this commit. The defect
|
|
42
|
+
reaches back to the commit that introduced custom distribution tables.
|
|
43
|
+
- Profile: `field-20260817-events` from the packaged example set — the one that
|
|
44
|
+
names `distribution: field-20260817` with
|
|
45
|
+
`distribution_file: dist/field-20260817.dist`.
|
|
46
|
+
- Seed policy: not applicable — the failure is present/absent at arming time,
|
|
47
|
+
before any traffic is offered.
|
|
48
|
+
|
|
49
|
+
## Evidence
|
|
50
|
+
|
|
51
|
+
Evidence grade: reproduction on packaged material, plus the image's own answer
|
|
52
|
+
about where its `tc` looks.
|
|
53
|
+
|
|
54
|
+
The image is asked rather than assumed:
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
docker run --rm --entrypoint sh <communication image> -c \
|
|
58
|
+
'tc -V; ls -d /usr/lib/tc /usr/lib/*-linux-gnu*/tc; strings $(command -v tc) | grep /tc/$'
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
```
|
|
62
|
+
tc utility, iproute2-6.1.0, libbpf 1.3.0
|
|
63
|
+
ls: cannot access '/usr/lib/tc': No such file or directory
|
|
64
|
+
/usr/lib/x86_64-linux-gnu/tc
|
|
65
|
+
/usr/lib/x86_64-linux-gnu/tc/
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
The directory the runner wrote to did not exist before the runner created it;
|
|
69
|
+
the directory `tc` reads already held iproute2's own `normal.dist` and
|
|
70
|
+
`pareto.dist`. That asymmetry is the fix: the directory holding those tables is
|
|
71
|
+
proof, where a triplet derived from the host would be a guess — the containers
|
|
72
|
+
need not share the host's architecture.
|
|
73
|
+
|
|
74
|
+
Before and after, same command, same profile:
|
|
75
|
+
|
|
76
|
+
| | arming | 30 s probe at 12 kB / 10 Hz |
|
|
77
|
+
|---|---|---|
|
|
78
|
+
| before | `No distribution data for field-20260817` | run aborted |
|
|
79
|
+
| after | table installed in `/usr/lib/x86_64-linux-gnu/tc` | 300 of 306 delivered, 1.96 % loss, p50 55.4 ms, p95 102.5 ms |
|
|
80
|
+
|
|
81
|
+
The delivered numbers are the second half of the evidence: 1.96 % against the
|
|
82
|
+
fitted drive's own 1.9–2.7 %, and a p95 the builtin `normal` distribution does
|
|
83
|
+
not produce at this mean and standard deviation.
|
|
84
|
+
|
|
85
|
+
Verification: automated:
|
|
86
|
+
`pytest tests/unit/test_network_profiles.py -k tc_lib_dir` builds the resolver's
|
|
87
|
+
shell program against a temporary root and asserts all three rungs — a directory
|
|
88
|
+
carrying iproute2's own tables wins over one that merely exists, and an image
|
|
89
|
+
with neither gets `/usr/lib/tc` created. Manual, for the effect itself: run
|
|
90
|
+
`rosotacom benchmark probe --profile field-20260817-events --size 12000
|
|
91
|
+
--rate-hz 10 --duration 30 --sudo-mode container` from the packaged example
|
|
92
|
+
project; the run must reach a delivery figure rather than fail at arming, and
|
|
93
|
+
the line it prints must name the directory that already holds `normal.dist`.
|
|
94
|
+
|
|
95
|
+
## Status
|
|
96
|
+
|
|
97
|
+
confirmed, 2026-08-30.
|
|
98
|
+
|
|
99
|
+
Fixed by resolving the directory inside the container instead of hard-coding
|
|
100
|
+
it, in three rungs: a candidate that already carries one of iproute2's own
|
|
101
|
+
tables, a candidate that merely exists, and finally `/usr/lib/tc`, created, for
|
|
102
|
+
an image that has neither.
|
|
103
|
+
|
|
104
|
+
## Publication notes
|
|
105
|
+
|
|
106
|
+
Two things are worth reporting, and the smaller one is the bug.
|
|
107
|
+
|
|
108
|
+
The first is about what a green run proves. Every layer here reported success —
|
|
109
|
+
the copy succeeded, the directory was created, the runner printed the path it
|
|
110
|
+
had written to — and the only component that knew the path was wrong was the
|
|
111
|
+
one that read it, one line later, in a message nobody was comparing against the
|
|
112
|
+
line above it. An installation step that does not verify against the consumer's
|
|
113
|
+
own view of where it looks is not an installation step.
|
|
114
|
+
|
|
115
|
+
The second is for anyone replaying a cellular trace through `netem`. The reason
|
|
116
|
+
this defect matters is that the builtin `normal` distribution is the wrong
|
|
117
|
+
shape for this link: at the 2026-08-17 drive's mean and standard deviation it
|
|
118
|
+
predicts a p99 about half of what was measured, which is the half a deadline
|
|
119
|
+
cares about. A trace-driven emulation that reports its delay model as
|
|
120
|
+
"delay X ± Y, normal" is therefore not reproducing the tail it was fitted to,
|
|
121
|
+
and the table that would have fixed it was, here, silently not in use.
|
|
@@ -5614,22 +5614,40 @@ def _make_live_run_point(args: argparse.Namespace, session_name: str) -> RunPoin
|
|
|
5614
5614
|
dist_installs = required_dist_installs(profile_obj)
|
|
5615
5615
|
if dist_installs:
|
|
5616
5616
|
# Custom delay-distribution tables must exist inside the
|
|
5617
|
-
# shaping netns before netem references them by name
|
|
5617
|
+
# shaping netns before netem references them by name, and
|
|
5618
|
+
# in the directory this image's `tc` was compiled to read
|
|
5619
|
+
# -- see tc_lib_dir_probe for why that is not a constant.
|
|
5620
|
+
from .network_profiles import tc_lib_dir_probe
|
|
5621
|
+
|
|
5618
5622
|
for dist_container in (a_container, b_container):
|
|
5619
5623
|
if not dist_container:
|
|
5620
5624
|
continue
|
|
5625
|
+
probe = subprocess.run(
|
|
5626
|
+
["docker", "exec", "-u", "root", dist_container, "sh", "-c", tc_lib_dir_probe()],
|
|
5627
|
+
capture_output=True,
|
|
5628
|
+
text=True,
|
|
5629
|
+
check=False,
|
|
5630
|
+
)
|
|
5631
|
+
tc_lib_dir = probe.stdout.strip()
|
|
5632
|
+
if probe.returncode != 0 or not tc_lib_dir.startswith("/"):
|
|
5633
|
+
raise RuntimeError(
|
|
5634
|
+
f"could not locate the tc library directory in {dist_container}: "
|
|
5635
|
+
f"{probe.stderr or probe.stdout}"
|
|
5636
|
+
)
|
|
5621
5637
|
for table_name, file_path in dist_installs:
|
|
5622
|
-
dist_target = f"/
|
|
5623
|
-
|
|
5624
|
-
["docker", "exec", "-u", "root", dist_container, "mkdir", "-p", "/usr/lib/tc"],
|
|
5638
|
+
dist_target = f"{tc_lib_dir}/{table_name}.dist"
|
|
5639
|
+
res = subprocess.run(
|
|
5625
5640
|
["docker", "cp", file_path, f"{dist_container}:{dist_target}"],
|
|
5626
|
-
|
|
5627
|
-
|
|
5628
|
-
|
|
5629
|
-
|
|
5630
|
-
|
|
5631
|
-
|
|
5632
|
-
|
|
5641
|
+
capture_output=True,
|
|
5642
|
+
text=True,
|
|
5643
|
+
check=False,
|
|
5644
|
+
)
|
|
5645
|
+
if res.returncode != 0:
|
|
5646
|
+
raise RuntimeError(
|
|
5647
|
+
f"failed to install netem distribution table {table_name!r} in "
|
|
5648
|
+
f"{dist_container}: {file_path} -> {dist_target}: "
|
|
5649
|
+
f"{res.stderr or res.stdout}"
|
|
5650
|
+
)
|
|
5633
5651
|
print(
|
|
5634
5652
|
f" netem distribution {table_name!r} installed in {dist_container}: {dist_target}"
|
|
5635
5653
|
)
|
|
@@ -440,9 +440,46 @@ def _resolve_distribution_files(profile: Profile, base: Path) -> Profile:
|
|
|
440
440
|
return replace(profile, uplink=fix(profile.uplink), downlink=fix(profile.downlink))
|
|
441
441
|
|
|
442
442
|
|
|
443
|
+
#: Where `tc` looks for a delay-distribution table, in the order to try.
|
|
444
|
+
#: iproute2 compiles the directory in (``LIBDIR "/tc"``), so on a multiarch
|
|
445
|
+
#: Debian or Ubuntu build it is ``/usr/lib/<triplet>/tc`` and ``/usr/lib/tc``
|
|
446
|
+
#: does not exist at all. A table written to the latter is then invisible with
|
|
447
|
+
#: no error of its own: netem answers ``No distribution data for <name>`` and
|
|
448
|
+
#: the run dies at arming time, which is what every profile carrying a fitted
|
|
449
|
+
#: table did until this was found. The directory holding iproute2's own tables
|
|
450
|
+
#: is the one it reads, so that is the evidence to look for rather than a
|
|
451
|
+
#: guessed triplet.
|
|
452
|
+
TC_LIB_DIR_CANDIDATES = ("/usr/lib/*-linux-gnu*/tc", "/usr/lib/tc")
|
|
453
|
+
|
|
454
|
+
#: A table iproute2 ships, used as the marker for "this is the directory".
|
|
455
|
+
TC_LIB_DIR_MARKERS = ("normal.dist", "pareto.dist")
|
|
456
|
+
|
|
457
|
+
|
|
458
|
+
def tc_lib_dir_probe(root: str = "") -> str:
|
|
459
|
+
"""A ``sh -c`` program that prints the directory ``tc`` reads tables from.
|
|
460
|
+
|
|
461
|
+
Three rungs, in order: a candidate that already holds one of iproute2's own
|
|
462
|
+
tables (proof, not inference); a candidate that merely exists; and finally
|
|
463
|
+
``/usr/lib/tc``, created, for an image that has neither. `root` exists so
|
|
464
|
+
the rungs are testable without a container.
|
|
465
|
+
"""
|
|
466
|
+
cands = " ".join(f"{root}{c}" for c in TC_LIB_DIR_CANDIDATES)
|
|
467
|
+
marker = " || ".join(f'[ -f "$d/{m}" ]' for m in TC_LIB_DIR_MARKERS)
|
|
468
|
+
fallback = f"{root}/usr/lib/tc"
|
|
469
|
+
return (
|
|
470
|
+
f"for d in {cands}; do "
|
|
471
|
+
f' if {marker}; then printf %s "$d"; exit 0; fi; '
|
|
472
|
+
f"done; "
|
|
473
|
+
f"for d in {cands}; do "
|
|
474
|
+
f' if [ -d "$d" ]; then printf %s "$d"; exit 0; fi; '
|
|
475
|
+
f"done; "
|
|
476
|
+
f"mkdir -p {fallback} && printf %s {fallback}"
|
|
477
|
+
)
|
|
478
|
+
|
|
479
|
+
|
|
443
480
|
def required_dist_installs(profile: Profile) -> list[tuple[str, str]]:
|
|
444
481
|
"""``(table_name, file_path)`` pairs a runner must install as
|
|
445
|
-
|
|
482
|
+
``<tc lib dir>/<table_name>.dist`` inside the shaping netns before arming.
|
|
446
483
|
|
|
447
484
|
Builtin distributions need nothing; duplicates collapse; conflicting files
|
|
448
485
|
for one name are an error (two segments must mean the same table).
|
|
@@ -62,6 +62,7 @@ docs/release.md
|
|
|
62
62
|
docs/testing.md
|
|
63
63
|
docs/work-items.md
|
|
64
64
|
docs/findings/README.md
|
|
65
|
+
docs/findings/a-fitted-delay-table-never-reached-the-shaper.md
|
|
65
66
|
docs/findings/a-transport-element-doubles-every-fastdds-sample.md
|
|
66
67
|
docs/findings/cyclone-fragment-equal-to-max-drops-fragmented-samples.md
|
|
67
68
|
docs/findings/cyclone-spdp-discovery-bursts.md
|
{rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/src/rosotacom_dev.egg-info/scm_file_list.json
RENAMED
|
@@ -46,6 +46,7 @@
|
|
|
46
46
|
"docs/ci.md",
|
|
47
47
|
"docs/ffmpeg-keyframes.md",
|
|
48
48
|
"docs/findings/README.md",
|
|
49
|
+
"docs/findings/a-fitted-delay-table-never-reached-the-shaper.md",
|
|
49
50
|
"docs/findings/a-transport-element-doubles-every-fastdds-sample.md",
|
|
50
51
|
"docs/findings/cyclone-fragment-equal-to-max-drops-fragmented-samples.md",
|
|
51
52
|
"docs/findings/cyclone-spdp-discovery-bursts.md",
|
|
@@ -3,6 +3,8 @@
|
|
|
3
3
|
|
|
4
4
|
from __future__ import annotations
|
|
5
5
|
|
|
6
|
+
import subprocess
|
|
7
|
+
|
|
6
8
|
import pytest
|
|
7
9
|
|
|
8
10
|
from rosotacom.network_profiles import (
|
|
@@ -25,6 +27,7 @@ from rosotacom.network_profiles import (
|
|
|
25
27
|
required_dist_installs,
|
|
26
28
|
resolve_profile_selection,
|
|
27
29
|
shaping_commands,
|
|
30
|
+
tc_lib_dir_probe,
|
|
28
31
|
teardown_command,
|
|
29
32
|
)
|
|
30
33
|
|
|
@@ -518,3 +521,43 @@ def test_load_profiles_file_resolves_distribution_files_and_lists_installs(tmp_p
|
|
|
518
521
|
)
|
|
519
522
|
== []
|
|
520
523
|
)
|
|
524
|
+
|
|
525
|
+
|
|
526
|
+
def _probe(root) -> str:
|
|
527
|
+
return subprocess.run(
|
|
528
|
+
["sh", "-c", tc_lib_dir_probe(str(root))],
|
|
529
|
+
capture_output=True,
|
|
530
|
+
text=True,
|
|
531
|
+
check=True,
|
|
532
|
+
).stdout
|
|
533
|
+
|
|
534
|
+
|
|
535
|
+
def test_the_distribution_table_goes_where_tc_reads_it(tmp_path):
|
|
536
|
+
"""A table installed into `/usr/lib/tc` on a multiarch image is invisible.
|
|
537
|
+
|
|
538
|
+
iproute2 compiles its library directory in, so a Debian or Ubuntu build
|
|
539
|
+
reads `/usr/lib/<triplet>/tc` and never looks at `/usr/lib/tc`. netem then
|
|
540
|
+
fails at arming time with "No distribution data", which reads like a broken
|
|
541
|
+
profile rather than a misplaced file -- so the directory is resolved from
|
|
542
|
+
the image instead of assumed.
|
|
543
|
+
"""
|
|
544
|
+
multiarch = tmp_path / "usr/lib/x86_64-linux-gnu/tc"
|
|
545
|
+
multiarch.mkdir(parents=True)
|
|
546
|
+
(multiarch / "normal.dist").write_text("0\n", encoding="utf-8")
|
|
547
|
+
(tmp_path / "usr/lib/tc").mkdir(parents=True)
|
|
548
|
+
|
|
549
|
+
# Both exist; the one carrying iproute2's own table is the one tc reads.
|
|
550
|
+
assert _probe(tmp_path) == str(multiarch)
|
|
551
|
+
|
|
552
|
+
|
|
553
|
+
def test_a_directory_that_merely_exists_is_the_second_choice(tmp_path):
|
|
554
|
+
multiarch = tmp_path / "usr/lib/aarch64-linux-gnu/tc"
|
|
555
|
+
multiarch.mkdir(parents=True)
|
|
556
|
+
assert _probe(tmp_path) == str(multiarch)
|
|
557
|
+
|
|
558
|
+
|
|
559
|
+
def test_an_image_with_neither_gets_one_created(tmp_path):
|
|
560
|
+
(tmp_path / "usr/lib").mkdir(parents=True)
|
|
561
|
+
out = _probe(tmp_path)
|
|
562
|
+
assert out == str(tmp_path / "usr/lib/tc")
|
|
563
|
+
assert (tmp_path / "usr/lib/tc").is_dir()
|
{rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/.devcontainer/devcontainer.json.template
RENAMED
|
File without changes
|
{rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/.devcontainer/re_generate_devcontainer_json.py
RENAMED
|
File without changes
|
|
File without changes
|
{rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/.github/ISSUE_TEMPLATE/documentation-audit.md
RENAMED
|
File without changes
|
{rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/.github/ISSUE_TEMPLATE/implementation-cleanup.md
RENAMED
|
File without changes
|
{rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/.github/ISSUE_TEMPLATE/quality-workflow.md
RENAMED
|
File without changes
|
|
File without changes
|
{rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/.github/ISSUE_TEMPLATE/release-process.md
RENAMED
|
File without changes
|
{rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/.github/ISSUE_TEMPLATE/repository-diagnosis.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/.github/workflows/benchmark-calibrate.yml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/calibration/capacity-size-tight-cyclone.json
RENAMED
|
File without changes
|
{rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/calibration/probe-loss-gop-tight-cyclone.json
RENAMED
|
File without changes
|
{rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/calibration/probe-loss-nominal-cyclone.json
RENAMED
|
File without changes
|
{rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/calibration/probe-loss-tight-cyclone.json
RENAMED
|
File without changes
|
{rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/calibration/probe-loss-tight-fastdds.json
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/docs/findings/cyclone-spdp-discovery-bursts.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/docs/findings/head-of-line-irregularity.md
RENAMED
|
File without changes
|
{rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/docs/findings/jitter-loss-bandwidth-latency.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/docs/findings/reorder-becomes-reader-loss.md
RENAMED
|
File without changes
|
{rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/docs/findings/repro/decode_chain_repro.py
RENAMED
|
File without changes
|
{rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/docs/findings/repro/reorder_drop_repro.py
RENAMED
|
File without changes
|
|
File without changes
|
{rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/docs/findings/zero-loss-boundaries-18kb-20hz.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/docs/rfcs/0001-expectation-driven-test-suite.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{rosotacom_dev-2.5.dev73 → rosotacom_dev-2.5.dev74}/docs/rfcs/0005-benchmark-genres-and-ci.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|