Capability-to-Test Matrix
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 .
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-capability
Test(s)
Tier
Strength
dora --help + per-subcommand --help
test job argparse block (ci.yml)
PR
Contract
dora validate (basic + --strict-types)
test job validate block
PR
Contract
dora expand, dora graph
test job CLI smoke block
PR
Contract
dora new templates (rust, python) on Linux + macOS
cli-* jobs (Linux + macOS; Windows is nightly-only)
PR
Smoke
dora new templates (c, cxx, cmake) on Linux
cli job (ci.yml)
PR
Smoke
dora run local mode, wide set of examples
examples-linux + examples-macos (Windows is nightly-only)
PR
Smoke
dora up/start/stop/down lifecycle
smoke_* in example-smoke.rs
Nightly
Smoke
dora run --stop-after contract on 4 examples
contract_* in example-smoke.rs
PR
Contract
dora self update --check-only (read-only path)
topic-and-top-smoke job
Nightly
Smoke
Known gap: dora self update destructive swap path (tracked in
#215 ).
Sub-capability
Test(s)
Tier
Strength
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)
Nightly
Smoke
Module expansion (module: inline inclusion)
smoke_module_dataflow, smoke_local_module_dataflow
Nightly
Smoke
Module loading from URL
smoke_rust_dataflow_url
Nightly
Smoke
Dynamic dataflow (dora run dynamic variant)
smoke_rust_dataflow_dynamic
Nightly
Smoke
Python builder API
no automated coverage
—
Gap
Service pattern (request / reply)
Sub-capability
Test(s)
Tier
Strength
request_id correlation, arithmetic contract
contract_service_example_correlates_requests_and_responses
PR
Contract
Two clients fan-in to one server
smoke_service_example, smoke_local_service_example
Nightly
Smoke
Timeout / retry paths
no automated coverage
—
Gap (#1630 follow-up)
Action pattern (goal / feedback / result)
Sub-capability
Test(s)
Tier
Strength
feedback precedes terminal succeeded
contract_action_example_feedback_precedes_success_result
PR
Contract
Two clients fan-in, countdown
smoke_action_example, smoke_local_action_example
Nightly
Smoke
Cancellation path
no automated coverage
—
Gap (#1630 follow-up)
Streaming pattern (session / segment / chunk)
Sub-capability
Test(s)
Tier
Strength
fin=true triggers session reassembly
contract_streaming_example_reassembles_session_on_fin
PR
Contract
Multi-session token streams
smoke_streaming_example, smoke_local_streaming_example
Nightly
Smoke
flush=true + interruption semantics
no automated coverage
—
Gap (#1630 follow-up)
Validated pipeline (deterministic source → transform → sink)
Sub-capability
Test(s)
Tier
Strength
Source emits 10, transform doubles, sink asserts match
contract_validated_pipeline_produces_exactly_ten_doubled_outputs
PR
Contract
Liveness smoke on same fixture
smoke_validated_pipeline, smoke_local_validated_pipeline
Nightly
Smoke
Topic / trace / top inspection
Sub-capability
Test(s)
Tier
Strength
dora top --once (JSON snapshot)
topic-and-top-smoke
Nightly
Contract
dora topic list --format json (NDJSON)
topic-and-top-smoke
Nightly
Contract
dora topic info --duration N (≥10 msgs on 10 Hz fixture)
topic-and-top-smoke
Nightly
Contract
dora topic echo --count N (N frames matched)
topic-and-top-smoke
Nightly
Contract
dora topic hz --duration N (≥10 samples on 10 Hz fixture)
topic-and-top-smoke
Nightly
Contract
dora topic pub --count N
topic-and-top-smoke
Nightly
Contract
dora trace list / trace view empty-state + prefix errors
topic-and-top-smoke
Nightly
Contract
dora top interactive TUI mode
no automated coverage
—
Gap (needs expect harness)
Sub-capability
Test(s)
Tier
Strength
WS protocol happy-path CRUD (SetParam, GetParam, GetParams, DeleteParam)
cli_param_set_get_list_delete in ws-cli-e2e.rs
PR
Contract
WS protocol JSON-type coverage (int, float, string, bool, array, object)
cli_param_set_json_types
PR
Contract
WS protocol error paths (unknown target, missing key)
cli_param_set_rejects_unknown_target, cli_param_get_nonexistent, cli_param_delete_rejects_unknown_target
PR
Contract
dora param CLI subprocess CRUD + output format
cli_param_crud_via_subprocess in ws-cli-e2e.rs::param_cli
PR
Contract
dora param set JSON parse-error path
cli_param_set_rejects_non_json_value
PR
Contract
Sub-capability
Test(s)
Tier
Strength
dora record → .drec file + dora replay round-trip (existence + size)
record-replay job
Nightly
Smoke
Semantic replay equivalence (validated-pipeline SUCCESS marker after record → replay round-trip)
contract_record_replay_reproduces_validated_pipeline
PR
Contract
Sub-capability
Test(s)
Tier
Strength
restart_policy: on-failure recovery
restart_recovers_from_failure
PR
Contract
max_restarts exhaustion marks node failed
max_restarts_exhaustion_marks_node_failed
PR
Contract
restart_policy: always re-spawns on clean exit
restart_policy_always_restarts_on_clean_exit
PR
Contract
restart_window counter reset
restart_window_resets_restart_counter
PR
Contract
input_timeout delivers InputClosed
input_timeout_delivers_input_closed_to_downstream
PR
Contract
health_check_timeout SIGKILLs unresponsive node
health_check_timeout_sigkills_unresponsive_node
PR
Contract
NodeRestarted delivery to downstream
node_restarted_is_delivered_to_downstream
PR
Contract
InputRecovered delivery after break
input_recovered_is_delivered_after_broken_input_receives_data
PR
Contract
Full kill→respawn→kill cycle under health check
no automated coverage
—
Gap (#1631 follow-up)
Sub-capability
Test(s)
Tier
Strength
dora cluster status (lists daemons + dataflows)
cluster-smoke
Nightly
Contract
dora cluster down tears everything cleanly
cluster-smoke
Nightly
Contract
dora cluster up (SSH-backed)
no automated coverage
—
Manual (infra-dependent)
dora cluster install/uninstall/upgrade
no automated coverage
—
Manual (systemd + SSH)
redb persistence & state reconstruction
Sub-capability
Test(s)
Tier
Strength
redb store writes dataflow record + survives coord restart
redb-backend-smoke
Nightly
Contract
Running → Recovering transition on coord restart
state-reconstruction-smoke
Nightly
Contract
Daemon auto-reconnect after coord freeze
daemon-reconnect-smoke (Linux only)
Nightly
Contract
Full reconciliation back to Running post-restart
no automated coverage
—
Gap (aspirational per state-reconstruction-smoke docstring)
Sub-capability
Test(s)
Tier
Strength
Rust → Python dataflow
smoke_cross_language_rust_to_python, smoke_local_cross_language_rust_to_python
Nightly
Smoke
Python → Rust dataflow
smoke_cross_language_python_to_rust, smoke_local_cross_language_python_to_rust
Nightly
Smoke
Semantic Rust → Python payload delivery (exact count + value validation)
contract_cross_language_rust_to_python_delivers_all_ten_values
PR
Contract
Semantic Python → Rust payload delivery (exact count + value validation)
contract_cross_language_python_to_rust_delivers_all_ten_values
PR
Contract
Sub-capability
Test(s)
Tier
Strength
Python node template + dora run
cli job (ci.yml)
PR
Smoke
Python async / drain / echo / log / multiple-arrays / concurrent-rw examples
smoke_python_* + smoke_local_python_*
Nightly
Smoke
Python operator hot reload
no automated coverage
—
Gap
Python builder API (programmatic dataflow construction → YAML)
examples/python-dataflow-builder/test_builder_api.py invoked by the cli job
PR
Contract
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-capability
Test(s)
Tier
Strength
dora new --lang c/cxx + CMake build (Linux)
cli job
PR
Smoke
c-dataflow, c++-dataflow examples (Linux)
examples job
PR
Smoke
c++-arrow-dataflow (Linux / macOS)
examples job
PR
Smoke
cmake-dataflow (Linux)
examples job
PR
Smoke
C/C++ on macOS / Windows
not covered
—
Gap — platform-parity policy in testing-matrix.md
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-capability
Test(s)
Tier
Strength
Rust ROS2 example
nightly ros2-bridge job (GitHub Actions)
Nightly
Smoke
Python ROS2 example
nightly ros2-bridge job
Nightly
Smoke
C++ ROS2 example
nightly ros2-bridge job
Nightly
Smoke
YAML bridge (topic / service / action)
manual QA (not run in CI)
Manual
Smoke
Soft real-time (--rt, SCHED_FIFO, mlock)
Sub-capability
Test(s)
Tier
Strength
cpu_affinity mask actually applied
cpu-affinity-smoke (Linux only)
Nightly
Contract
mlockall + SCHED_FIFO enforcement
no automated coverage
—
Manual — needs privileged execution (tracked in #256 )
Supply chain / repo invariants (structural)
Sub-capability
Test(s)
Tier
Strength
cargo-audit + cargo-deny (advisories, licenses, sources)
audit job
PR
Structural
Unwrap budget ratchet
unwrap-budget job
PR
Structural
cargo fmt --check
fmt job
PR
Structural
cargo clippy -D warnings
clippy job
PR
Structural
cargo-deny license check
audit job / check-license
PR
Structural
typos
typos job
PR
Structural
MSRV (workspace rust-version in Cargo.toml)
msrv job
PR
Structural
8 target triples compile
cross-check matrix
PR
Structural
Benchmark regression vs. cached baseline
bench job
PR
Structural
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).