Capability-to-Test Matrix

June 2, 2026 · View on GitHub

Where each Dora capability is covered, at what tier, and how strongly.

Answers three questions that the test-type-oriented testing-matrix.md and the command-oriented testing-guide.md leave implicit:

  • If I change this feature, what tests should I run?
  • Is this documented capability actually validated anywhere?
  • Where are the known coverage gaps?

Addresses #1633; parent #1628.


Legend

  • Tier: PR, Nightly, Manual — per testing-matrix.md's tier policy.
  • Strength:
    • Contract — asserts a specific behavioral outcome (exact markers, counts, orderings). A regression in the feature will fail the test.
    • Smoke — proves the code path ran to completion without an obvious error. A regression that silently changes behavior may still pass.
    • Structural — formatting / lint / supply chain / etc. Enforces repo invariants, not feature behavior.

CLI lifecycle & validation

Sub-capabilityTest(s)TierStrength
dora --help + per-subcommand --helptest job argparse block (ci.yml)PRContract
dora validate (basic + --strict-types)test job validate blockPRContract
dora expand, dora graphtest job CLI smoke blockPRContract
dora new templates (rust, python) on Linux + macOScli-* jobs (Linux + macOS; Windows is nightly-only)PRSmoke
dora new templates (c, cxx, cmake) on Linuxcli job (ci.yml)PRSmoke
dora run local mode, wide set of examplesexamples-linux + examples-macos (Windows is nightly-only)PRSmoke
dora up/start/stop/down lifecyclesmoke_* in example-smoke.rsNightlySmoke
dora run --stop-after contract on 4 examplescontract_* in example-smoke.rsPRContract
dora self update --check-only (read-only path)topic-and-top-smoke jobNightlySmoke

Known gap: dora self update destructive swap path (tracked in #215).

Dataflow execution modes

Sub-capabilityTest(s)TierStrength
dora run (embedded coord + daemon)smoke_local_*, contract_*PR (contract) / Nightly (smoke)Contract + Smoke
dora up + dora start --detach (full network mode)smoke_* (networked siblings)NightlySmoke
Module expansion (module: inline inclusion)smoke_module_dataflow, smoke_local_module_dataflowNightlySmoke
Module loading from URLsmoke_rust_dataflow_urlNightlySmoke
Dynamic dataflow (dora run dynamic variant)smoke_rust_dataflow_dynamicNightlySmoke
Python builder APIno automated coverageGap

Service pattern (request / reply)

Sub-capabilityTest(s)TierStrength
request_id correlation, arithmetic contractcontract_service_example_correlates_requests_and_responsesPRContract
Two clients fan-in to one serversmoke_service_example, smoke_local_service_exampleNightlySmoke
Timeout / retry pathsno automated coverageGap (#1630 follow-up)

Action pattern (goal / feedback / result)

Sub-capabilityTest(s)TierStrength
feedback precedes terminal succeededcontract_action_example_feedback_precedes_success_resultPRContract
Two clients fan-in, countdownsmoke_action_example, smoke_local_action_exampleNightlySmoke
Cancellation pathno automated coverageGap (#1630 follow-up)

Streaming pattern (session / segment / chunk)

Sub-capabilityTest(s)TierStrength
fin=true triggers session reassemblycontract_streaming_example_reassembles_session_on_finPRContract
Multi-session token streamssmoke_streaming_example, smoke_local_streaming_exampleNightlySmoke
flush=true + interruption semanticsno automated coverageGap (#1630 follow-up)

Validated pipeline (deterministic source → transform → sink)

Sub-capabilityTest(s)TierStrength
Source emits 10, transform doubles, sink asserts matchcontract_validated_pipeline_produces_exactly_ten_doubled_outputsPRContract
Liveness smoke on same fixturesmoke_validated_pipeline, smoke_local_validated_pipelineNightlySmoke

Topic / trace / top inspection

Sub-capabilityTest(s)TierStrength
dora top --once (JSON snapshot)topic-and-top-smokeNightlyContract
dora topic list --format json (NDJSON)topic-and-top-smokeNightlyContract
dora topic info --duration N (≥10 msgs on 10 Hz fixture)topic-and-top-smokeNightlyContract
dora topic echo --count N (N frames matched)topic-and-top-smokeNightlyContract
dora topic hz --duration N (≥10 samples on 10 Hz fixture)topic-and-top-smokeNightlyContract
dora topic pub --count Ntopic-and-top-smokeNightlyContract
dora trace list / trace view empty-state + prefix errorstopic-and-top-smokeNightlyContract
dora top interactive TUI modeno automated coverageGap (needs expect harness)

Parameter operations

Sub-capabilityTest(s)TierStrength
WS protocol happy-path CRUD (SetParam, GetParam, GetParams, DeleteParam)cli_param_set_get_list_delete in ws-cli-e2e.rsPRContract
WS protocol JSON-type coverage (int, float, string, bool, array, object)cli_param_set_json_typesPRContract
WS protocol error paths (unknown target, missing key)cli_param_set_rejects_unknown_target, cli_param_get_nonexistent, cli_param_delete_rejects_unknown_targetPRContract
dora param CLI subprocess CRUD + output formatcli_param_crud_via_subprocess in ws-cli-e2e.rs::param_cliPRContract
dora param set JSON parse-error pathcli_param_set_rejects_non_json_valuePRContract

Record / replay

Sub-capabilityTest(s)TierStrength
dora record.drec file + dora replay round-trip (existence + size)record-replay jobNightlySmoke
Semantic replay equivalence (validated-pipeline SUCCESS marker after record → replay round-trip)contract_record_replay_reproduces_validated_pipelinePRContract

Fault tolerance

Sub-capabilityTest(s)TierStrength
restart_policy: on-failure recoveryrestart_recovers_from_failurePRContract
max_restarts exhaustion marks node failedmax_restarts_exhaustion_marks_node_failedPRContract
restart_policy: always re-spawns on clean exitrestart_policy_always_restarts_on_clean_exitPRContract
restart_window counter resetrestart_window_resets_restart_counterPRContract
input_timeout delivers InputClosedinput_timeout_delivers_input_closed_to_downstreamPRContract
health_check_timeout SIGKILLs unresponsive nodehealth_check_timeout_sigkills_unresponsive_nodePRContract
NodeRestarted delivery to downstreamnode_restarted_is_delivered_to_downstreamPRContract
InputRecovered delivery after breakinput_recovered_is_delivered_after_broken_input_receives_dataPRContract
Full kill→respawn→kill cycle under health checkno automated coverageGap (#1631 follow-up)

Cluster lifecycle

Sub-capabilityTest(s)TierStrength
dora cluster status (lists daemons + dataflows)cluster-smokeNightlyContract
dora cluster down tears everything cleanlycluster-smokeNightlyContract
dora cluster up (SSH-backed)no automated coverageManual (infra-dependent)
dora cluster install/uninstall/upgradeno automated coverageManual (systemd + SSH)

redb persistence & state reconstruction

Sub-capabilityTest(s)TierStrength
redb store writes dataflow record + survives coord restartredb-backend-smokeNightlyContract
Running → Recovering transition on coord restartstate-reconstruction-smokeNightlyContract
Daemon auto-reconnect after coord freezedaemon-reconnect-smoke (Linux only)NightlyContract
Full reconciliation back to Running post-restartno automated coverageGap (aspirational per state-reconstruction-smoke docstring)

Cross-language interop

Sub-capabilityTest(s)TierStrength
Rust → Python dataflowsmoke_cross_language_rust_to_python, smoke_local_cross_language_rust_to_pythonNightlySmoke
Python → Rust dataflowsmoke_cross_language_python_to_rust, smoke_local_cross_language_python_to_rustNightlySmoke
Semantic Rust → Python payload delivery (exact count + value validation)contract_cross_language_rust_to_python_delivers_all_ten_valuesPRContract
Semantic Python → Rust payload delivery (exact count + value validation)contract_cross_language_python_to_rust_delivers_all_ten_valuesPRContract

Python operator path

Sub-capabilityTest(s)TierStrength
Python node template + dora runcli job (ci.yml)PRSmoke
Python async / drain / echo / log / multiple-arrays / concurrent-rw examplessmoke_python_* + smoke_local_python_*NightlySmoke
Python operator hot reloadno automated coverageGap
Python builder API (programmatic dataflow construction → YAML)examples/python-dataflow-builder/test_builder_api.py invoked by the cli jobPRContract
Python builder API → build() + run() end-to-end with hub packages (simple_example.py)not covered — blocked on PyPI dora-rs 0.5.0 clobbering the local workspace install; re-enable after 1.0 PyPI publish (#1654)Gap (infrastructural)

C / C++ template & examples

Sub-capabilityTest(s)TierStrength
dora new --lang c/cxx + CMake build (Linux)cli jobPRSmoke
c-dataflow, c++-dataflow examples (Linux)examples jobPRSmoke
c++-arrow-dataflow (Linux / macOS)examples jobPRSmoke
cmake-dataflow (Linux)examples jobPRSmoke
C/C++ on macOS / Windowsnot coveredGap — platform-parity policy in testing-matrix.md

ROS2 bridge

Note

The ROS2 bridge is an optional extension. PR CI only compiles it (clippy/check build the bridge crates) — it is not run end-to-end on PRs or merges. Runtime coverage is the nightly ros2-bridge job (GitHub Actions, non-blocking); for local pre-release QA, run scripts/qa/ci-nightly-jobs.sh ros2-bridge on a Linux box with ROS2 Humble. Do not rely on per-PR runtime coverage for the bridge. The action examples are excluded from both nightly and that script (their deferred get_result round-trip is flaky in upstream ros2-client/rustdds, #1170); validate them with scripts/ros2dev.sh qa on x86 Linux before a release.

Sub-capabilityTest(s)TierStrength
Rust ROS2 examplenightly ros2-bridge job (GitHub Actions)NightlySmoke
Python ROS2 examplenightly ros2-bridge jobNightlySmoke
C++ ROS2 examplenightly ros2-bridge jobNightlySmoke
YAML bridge (topic / service / action)manual QA (not run in CI)ManualSmoke

Soft real-time (--rt, SCHED_FIFO, mlock)

Sub-capabilityTest(s)TierStrength
cpu_affinity mask actually appliedcpu-affinity-smoke (Linux only)NightlyContract
mlockall + SCHED_FIFO enforcementno automated coverageManual — needs privileged execution (tracked in #256)

Supply chain / repo invariants (structural)

Sub-capabilityTest(s)TierStrength
cargo-audit + cargo-deny (advisories, licenses, sources)audit jobPRStructural
Unwrap budget ratchetunwrap-budget jobPRStructural
cargo fmt --checkfmt jobPRStructural
cargo clippy -D warningsclippy jobPRStructural
cargo-deny license checkaudit job / check-licensePRStructural
typostypos jobPRStructural
MSRV (workspace rust-version in Cargo.toml)msrv jobPRStructural
8 target triples compilecross-check matrixPRStructural
Benchmark regression vs. cached baselinebench jobPRStructural

How to use this document

  • Before changing a feature: find its row, run the listed tests locally (cargo test --test <file> <name>).
  • Before merging a PR that touches a "Gap" row: decide whether to add coverage in this PR or file a follow-up issue and link it.
  • When adding a new capability: add a new row here in the same PR that ships the feature. Treat this file as a gate, not a wiki.
  • testing-matrix.md — tier-oriented view (what runs in PR CI vs nightly vs manual).
  • testing-guide.md — command-oriented reference (how to run each test locally).
  • qa-runbook.md — deep-gate investigation playbook (coverage, mutants, semver).

Open coverage gaps (quick index)

The rows labeled "Gap" are consolidated here so follow-up work can be filed and tracked:

  • Python builder build() + run() with hub packages — blocked on PyPI 1.0 publish; builder API itself is covered.
  • Service pattern: timeout / retry paths — #1630 follow-up.
  • Action pattern: cancellation — #1630 follow-up.
  • Streaming pattern: flush=true + interruption — #1630 follow-up.
  • dora top interactive TUI — needs expect harness (#215).
  • Fault tolerance: full kill→respawn→kill cycle under health check — #1631 follow-up.
  • dora cluster up (SSH) — manual, needs dedicated infra.
  • State reconstruction: full Recovering→Running reconciliation — aspirational per current docstring.
  • Python operator hot reload — no tests.
  • C/C++ on macOS/Windows — platform-parity policy.
  • mlockall / SCHED_FIFO — #256 (manual, privileged).