Skip to content

test(cli): add comprehensive integration tests for flightctl#71

Open
EffortlessSteven wants to merge 3 commits intomainfrom
feat/cli-tests
Open

test(cli): add comprehensive integration tests for flightctl#71
EffortlessSteven wants to merge 3 commits intomainfrom
feat/cli-tests

Conversation

@EffortlessSteven
Copy link
Member

Summary

Adds 113 new integration tests across 7 focused test files for the \ light-cli\ crate using \�ssert_cmd\ and \predicates.

Test Files

File Tests Coverage
\output_format.rs\ 13 JSON/human output formatting, overlay commands, contract stability
\�ersion_cmd.rs\ 9 --version\ flag, \�ersion\ subcommand, JSON fields, verbose mode
\help_completeness.rs\ 26 All 19 subcommands listed in help, descriptions verified, leaf command flags
\profile_cmd.rs\ 12 list, validate, apply, export, activate, show with temp dirs
\device_cmd.rs\ 12 list, info, dump, calibrate, test with flag acceptance
\diag_cmd.rs\ 17 bundle, health, metrics, trace, record, replay, export, status, stop
\�rror_handling.rs\ 24 invalid args, exit codes, missing required args, no-panic checks

Results

All 311 tests pass (137 unit + 174 integration). Zero warnings.

Changes

  • Added \�ssert_cmd\ and \predicates\ to workspace dependencies
  • Added dev-dependencies to \crates/flight-cli/Cargo.toml\
  • Created 7 new integration test files in \crates/flight-cli/tests/\
  • Existing \integration_tests.rs\ (61 tests) left untouched

Add 113 new integration tests across 7 focused test files using
assert_cmd and predicates, covering:

- output_format.rs (13 tests): JSON/human output, overlay commands
- version_cmd.rs (9 tests): --version flag, version subcommand
- help_completeness.rs (26 tests): all subcommands in help text
- profile_cmd.rs (12 tests): list, validate, apply, export
- device_cmd.rs (12 tests): list, info, dump, calibrate, test
- diag_cmd.rs (17 tests): bundle, health, metrics, trace, record
- error_handling.rs (24 tests): invalid args, exit codes, no-panic

All 311 tests pass (137 unit + 174 integration).

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot AI review requested due to automatic review settings March 1, 2026 05:52
@gemini-code-assist
Copy link

Warning

You have reached your daily quota limit. Please wait up to 24 hours and I will start processing your requests again!

@chatgpt-codex-connector
Copy link

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.
To continue using code reviews, add credits to your account and enable them for code reviews in your settings.

@qodo-free-for-open-source-projects

Review Summary by Qodo

Add comprehensive integration tests for flightctl CLI

🧪 Tests

Grey Divider

Walkthroughs

Description
• Add 113 new integration tests across 7 focused test files
• Cover output formatting, version commands, help completeness
• Test profile, device, and diagnostics subcommands
• Validate error handling, exit codes, and JSON contract stability
Diagram
flowchart LR
  A["Test Framework<br/>assert_cmd + predicates"] --> B["Output Format Tests<br/>JSON/human formatting"]
  A --> C["Version Command Tests<br/>--version flag"]
  A --> D["Help Completeness Tests<br/>All subcommands listed"]
  A --> E["Profile Command Tests<br/>list/validate/apply/export"]
  A --> F["Device Command Tests<br/>list/info/dump/calibrate"]
  A --> G["Diagnostics Tests<br/>bundle/health/metrics/trace"]
  A --> H["Error Handling Tests<br/>invalid args/exit codes"]
  B --> I["113 Integration Tests<br/>311 Total Tests Pass"]
  C --> I
  D --> I
  E --> I
  F --> I
  G --> I
  H --> I
Loading

Grey Divider

File Changes

1. crates/flight-cli/tests/output_format.rs 🧪 Tests +211/-0

JSON and human output formatting validation

crates/flight-cli/tests/output_format.rs


2. crates/flight-cli/tests/version_cmd.rs 🧪 Tests +134/-0

Version flag and subcommand tests

crates/flight-cli/tests/version_cmd.rs


3. crates/flight-cli/tests/help_completeness.rs 🧪 Tests +310/-0

Help text and subcommand listing verification

crates/flight-cli/tests/help_completeness.rs


View more (6)
4. crates/flight-cli/tests/profile_cmd.rs 🧪 Tests +190/-0

Profile management command integration tests

crates/flight-cli/tests/profile_cmd.rs


5. crates/flight-cli/tests/device_cmd.rs 🧪 Tests +176/-0

Device management command integration tests

crates/flight-cli/tests/device_cmd.rs


6. crates/flight-cli/tests/diag_cmd.rs 🧪 Tests +268/-0

Diagnostics and recording command tests

crates/flight-cli/tests/diag_cmd.rs


7. crates/flight-cli/tests/error_handling.rs 🧪 Tests +297/-0

Error handling, exit codes, and panic prevention

crates/flight-cli/tests/error_handling.rs


8. Cargo.toml Dependencies +2/-0

Add assert_cmd and predicates workspace dependencies

Cargo.toml


9. crates/flight-cli/Cargo.toml Dependencies +6/-0

Add dev-dependencies for integration testing

crates/flight-cli/Cargo.toml


Grey Divider

Qodo Logo

@qodo-free-for-open-source-projects
Copy link

qodo-free-for-open-source-projects bot commented Mar 1, 2026

Code Review by Qodo

🐞 Bugs (3) 📘 Rule violations (0) 📎 Requirement gaps (0)

Grey Divider


Remediation recommended

1. Daemon-dependent tests flaky🐞 Bug ⛯ Reliability
Description
Multiple new tests assert daemon-dependent commands must fail (or that service_status is
unreachable). They will fail on machines/CI where a Flight Hub daemon (or anything responding on the
hardcoded endpoint) is running, making the suite non-hermetic.
Code

crates/flight-cli/tests/device_cmd.rs[R15-20]

+fn devices_list_fails_gracefully_without_daemon() {
+    let output = cli().args(["devices", "list"]).output().unwrap();
+    assert!(!output.status.success());
+    // Should not panic (exit code 101)
+    assert_ne!(output.status.code(), Some(101));
+}
Evidence
The tests assert failure specifically due to “no daemon”. But the CLI always connects to a fixed
endpoint with no override, so the outcome depends on the external environment (whether something is
running on that endpoint).

crates/flight-cli/tests/device_cmd.rs[14-20]
crates/flight-cli/tests/version_cmd.rs[88-95]
crates/flight-cli/src/client_manager.rs[17-22]
crates/flight-ipc/src/client.rs[361-373]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
New integration tests assume the Flight Hub daemon is not running and assert failures/unreachable status. Because the CLI connects to a hardcoded endpoint, these tests become flaky on developer machines/CI where a daemon (or any service) is listening.
## Issue Context
`flight-cli` uses `ClientManager::get_client()` which calls `FlightClient::connect_with_config()`. `FlightClient::connect_with_config()` hardcodes `http://127.0.0.1:50051`, and there is no test-time override.
## Fix Focus Areas
- crates/flight-cli/src/client_manager.rs[17-22]
- crates/flight-ipc/src/client.rs[361-373]
- crates/flight-cli/tests/device_cmd.rs[14-20]
- crates/flight-cli/tests/version_cmd.rs[88-95]
### Suggested approach
1. Add a CLI flag (e.g., `--endpoint`) and/or env var (e.g., `FLIGHTCTL_ENDPOINT`) to override the default address.
2. In tests that require “no daemon”, set the endpoint to `http://127.0.0.1:0` (or pick a bound-but-not-listening random port) so connection deterministically fails.
3. Alternatively (less ideal), change tests to:
- If command succeeds: validate JSON schema/success payload.
- If command fails: validate JSON error schema.
This removes reliance on daemon absence but weakens the intent of some tests.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


2. Panic check misses abort 🐞 Bug ✓ Correctness
Description
New “no panic” assertions check for exit code 101, but the repo uses panic = "abort". Panics will
typically terminate via abort/signal (often status.code() == None on Unix), so these tests can
pass even if the CLI panics.
Code

crates/flight-cli/tests/error_handling.rs[R261-287]

+#[test]
+fn daemon_dependent_commands_do_not_panic() {
+    let commands: Vec<Vec<&str>> = vec![
+        vec!["status"],
+        vec!["info"],
+        vec!["devices", "list"],
+        vec!["diag", "health"],
+        vec!["safe-mode"],
+        vec!["diagnostics"],
+        vec!["adapters", "status"],
+        vec!["adapters", "enable", "msfs"],
+        vec!["adapters", "disable", "xplane"],
+        vec!["adapters", "reconnect", "dcs"],
+        vec!["devices", "calibrate", "test-dev"],
+        vec!["devices", "test", "test-dev"],
+        vec!["torque", "status"],
+    ];
+
+    for args in &commands {
+        let output = cli().args(args).output().unwrap();
+        assert_ne!(
+            output.status.code(),
+            Some(101),
+            "'flightctl {}' panicked",
+            args.join(" ")
+        );
+    }
Evidence
The tests equate “panic” with exit code 101, but Cargo profiles configure abort-on-panic. With
abort, there may be no numeric exit code at all, and the != Some(101) assertion will not detect
the panic.

crates/flight-cli/tests/error_handling.rs[261-287]
Cargo.toml[236-243]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
Tests intend to verify the CLI does not panic, but currently only check `exit code != 101`. The workspace sets `panic = &amp;amp;quot;abort&amp;amp;quot;`, so panics may not produce exit code 101 (and may produce no exit code at all).
## Issue Context
With `panic=abort`, a panic typically terminates the process via abort/signal. On Unix this often results in `ExitStatus::code() == None`, so `assert_ne!(None, Some(101))` passes.
## Fix Focus Areas
- Cargo.toml[236-243]
- crates/flight-cli/tests/device_cmd.rs[15-20]
- crates/flight-cli/tests/diag_cmd.rs[17-25]
- crates/flight-cli/tests/error_handling.rs[261-287]
### Suggested approach
- Replace checks like `assert_ne!(status.code(), Some(101))` with something that detects abnormal termination:
- `assert!(status.code().is_some(), &amp;amp;quot;process terminated abnormally (likely abort/panic)&amp;amp;quot;)`
- then optionally `assert_ne!(status.code(), Some(101))`
- (Optional, Unix-only) use `std::os::unix::process::ExitStatusExt` to assert `status.signal().is_none()`.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


3. Profile list non-hermetic 🐞 Bug ⛯ Reliability
Description
Profile integration tests call flightctl profile list and expect success without isolating the
config directory. The command reads the real user config directory via dirs::config_dir(), so
results and even success can vary by environment (missing HOME/config, permissions, existing
profiles).
Code

crates/flight-cli/tests/profile_cmd.rs[R16-35]

+#[test]
+fn profile_list_succeeds_without_daemon() {
+    cli().args(["profile", "list"]).assert().success();
+}
+
+#[test]
+fn profile_list_json_returns_array_data() {
+    let output = cli()
+        .args(["--json", "profile", "list"])
+        .output()
+        .unwrap();
+    assert!(output.status.success());
+
+    let stdout = String::from_utf8(output.stdout).unwrap();
+    let json: Value = parse_json_from(&stdout);
+
+    assert_eq!(json["success"], true);
+    assert!(json["data"].is_array());
+    assert!(json["total_count"].is_number());
+}
Evidence
profile list reads from dirs::config_dir()/OpenFlight/profiles and errors if no config dir is
available. The new tests do not set XDG_CONFIG_HOME/platform equivalents, so they depend on the
machine running the tests.

crates/flight-cli/tests/profile_cmd.rs[16-35]
crates/flight-cli/src/commands/profile.rs[152-156]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
`profile list` integration tests depend on the real user config directory. This can make tests nondeterministic or fail in minimal environments.
## Issue Context
`list_profiles()` uses `dirs::config_dir()` and errors if it can’t determine a config directory.
## Fix Focus Areas
- crates/flight-cli/src/commands/profile.rs[152-156]
- crates/flight-cli/tests/profile_cmd.rs[16-51]
### Suggested approach
- In tests, set env vars so `dirs::config_dir()` resolves into a temp directory:
- Unix: set `XDG_CONFIG_HOME` to a `TempDir` path.
- Windows: set `APPDATA` (and/or `LOCALAPPDATA`) to a `TempDir` path.
- Create `${config_dir}/OpenFlight/profiles/` under the temp dir.
- Then run `flightctl profile list` and assert results.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


Grey Divider

ⓘ The new review experience is currently in Beta. Learn more

Grey Divider

Qodo Logo

Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds a large set of new flightctl integration tests in crates/flight-cli/tests/ (using assert_cmd + predicates) to validate help text completeness, JSON/human output contracts, and a variety of subcommand behaviors, alongside wiring the needed test dependencies into the workspace and flight-cli crate.

Changes:

  • Adds 7 new integration test modules covering version/help/output formatting/devices/diag/profile/error handling.
  • Introduces assert_cmd and predicates as workspace dependencies and adds test-only deps to crates/flight-cli.
  • Expands CLI contract checking for JSON fields, help text content, and exit-code/error-code mapping.

Reviewed changes

Copilot reviewed 9 out of 9 changed files in this pull request and generated 8 comments.

Show a summary per file
File Description
Cargo.toml Adds assert_cmd and predicates to workspace dependency versions.
crates/flight-cli/Cargo.toml Adds dev-dependencies needed to compile/run the new integration tests.
crates/flight-cli/tests/version_cmd.rs Tests flightctl version / --version output and JSON schema expectations.
crates/flight-cli/tests/profile_cmd.rs Tests profile subcommands (list/validate/apply/etc.) including local-file failure cases.
crates/flight-cli/tests/output_format.rs Tests --json/--output formatting and overlay JSON outputs.
crates/flight-cli/tests/help_completeness.rs Verifies help output lists/describes expected commands and flags.
crates/flight-cli/tests/error_handling.rs Exercises invalid args, unknown flags, and IPC error exit-code/error-code mapping.
crates/flight-cli/tests/diag_cmd.rs Tests diagnostic subcommands and JSON error formatting for daemon-dependent paths.
crates/flight-cli/tests/device_cmd.rs Tests devices subcommands, required args, and daemon-down behavior.

Comment on lines +15 to +20
fn devices_list_fails_gracefully_without_daemon() {
let output = cli().args(["devices", "list"]).output().unwrap();
assert!(!output.status.success());
// Should not panic (exit code 101)
assert_ne!(output.status.code(), Some(101));
}
Copy link

Copilot AI Mar 1, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

devices list will succeed when flightd is running, but this test asserts it must fail. That makes the integration tests environment-dependent. Consider asserting “does not panic” and then branching: if it succeeds, validate the success output schema; if it fails, validate the error output schema / exit code.

Copilot uses AI. Check for mistakes.
Comment on lines +188 to +200
#[test]
fn connection_error_exit_code_in_valid_range() {
let output = cli().args(["info"]).output().unwrap();
assert!(!output.status.success());

let code = output.status.code().unwrap();
// Exit codes 1-7 are the defined error range
assert!(
(1..=7).contains(&code),
"exit code should be in mapped range 1-7, got {}",
code
);
}
Copy link

Copilot AI Mar 1, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These exit-code mapping assertions rely on flightctl info failing with an IPC error. If a daemon is running, the command may succeed and the test will fail for reasons unrelated to exit-code mapping. To keep the suite deterministic, gate the mapping assertions on the command actually failing (and otherwise validate the success output), or introduce a test-only way to force a connection failure.

Copilot uses AI. Check for mistakes.
Comment on lines +206 to +211
fn parse_json_from(text: &str) -> Value {
text.lines()
.find(|l| l.trim().starts_with('{'))
.and_then(|l| serde_json::from_str(l).ok())
.unwrap_or_else(|| panic!("No valid JSON line found in:\n{}", text))
}
Copy link

Copilot AI Mar 1, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

parse_json_from (and similar helpers) are duplicated across multiple new test files. Consider moving shared helpers like cli() and parse_json_from() into crates/flight-cli/tests/common/mod.rs (or a small test-support module) to reduce duplication and keep future JSON-parsing contract updates consistent.

Copilot uses AI. Check for mistakes.
Comment on lines +169 to +175
fn profile_show_without_name_returns_message() {
// When no profile name given and daemon is down, should still succeed with a message
let output = cli()
.args(["--json", "profile", "show"])
.output()
.unwrap();
assert!(output.status.success());
Copy link

Copilot AI Mar 1, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This comment says behavior depends on the daemon being down, but flightctl profile show (without a name) currently returns a local stub message without attempting a daemon connection. Consider updating the comment to match what the test is actually asserting (success response contains a message when no profile name is provided).

Copilot uses AI. Check for mistakes.
axum-test = "18.7.0"
filetime = "0.2.27"
x11rb = "0.13"
hidapi = { version = "2.6.3", default-features = false, features = ["linux-static-hidraw", "windows-native"] }
Copy link

Copilot AI Mar 1, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

assert_cmd and predicates are test-only utilities; placing them under the “Additional common dependencies” block makes the workspace dependency table harder to scan/maintain. Consider moving them into the existing “Testing and benchmarking utilities” section with the other test helpers.

Suggested change
hidapi = { version = "2.6.3", default-features = false, features = ["linux-static-hidraw", "windows-native"] }
hidapi = { version = "2.6.3", default-features = false, features = ["linux-static-hidraw", "windows-native"] }
# Testing and benchmarking utilities

Copilot uses AI. Check for mistakes.
Comment on lines +65 to +68
assert!(
data.get("service_status").is_some(),
"must have service_status"
);
Copy link

Copilot AI Mar 1, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

version_subcommand_json_has_all_required_fields assumes service_status is always present, but the current flightctl version implementation can omit service_status/service_version when the gRPC channel connects successfully and get_service_info() then fails (the Ok(client) / Err(info) path). Either make the command always populate these fields (e.g., default to null/unreachable before attempting RPCs) or relax this assertion so the test matches the actual contract.

Suggested change
assert!(
data.get("service_status").is_some(),
"must have service_status"
);

Copilot uses AI. Check for mistakes.
Comment on lines +89 to +94
fn version_subcommand_service_unreachable_without_daemon() {
let output = cli().args(["--json", "version"]).output().unwrap();
let stdout = String::from_utf8(output.stdout).unwrap();
let json: Value = parse_json_from(&stdout);

assert_eq!(json["data"]["service_status"], "unreachable");
Copy link

Copilot AI Mar 1, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This test hard-codes the environment assumption that the daemon is not running (expects service_status == "unreachable"). That makes the suite fail for developers who have flightd running locally. Consider making the assertion conditional (accept both reachable and unreachable states, validating the schema in each case) or adding a CLI/service address override specifically for tests so they can force an unreachable endpoint deterministically.

Suggested change
fn version_subcommand_service_unreachable_without_daemon() {
let output = cli().args(["--json", "version"]).output().unwrap();
let stdout = String::from_utf8(output.stdout).unwrap();
let json: Value = parse_json_from(&stdout);
assert_eq!(json["data"]["service_status"], "unreachable");
fn version_subcommand_reports_service_status() {
let output = cli().args(["--json", "version"]).output().unwrap();
let stdout = String::from_utf8(output.stdout).unwrap();
let json: Value = parse_json_from(&stdout);
let service_status = json["data"]["service_status"]
.as_str()
.unwrap_or_else(|| panic!("data.service_status should be a string in:\n{}", stdout));
assert!(
!service_status.is_empty(),
"data.service_status should be a non-empty string, got empty in:\n{}",
stdout
);

Copilot uses AI. Check for mistakes.
Comment on lines +27 to +33
assert!(!output.status.success());

let stderr = String::from_utf8(output.stderr).unwrap();
let json: Value = parse_json_from(&stderr);
assert_eq!(json["success"], false);
assert!(json["error"].is_string());
assert!(json["error_code"].is_string());
Copy link

Copilot AI Mar 1, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

flightctl info will succeed when a daemon is running, but this test assumes it always errors and emits JSON on stderr. To avoid environment-dependent failures, either (a) make the test accept both success (JSON on stdout) and failure (JSON on stderr) while validating the schema, or (b) provide a way for tests to force an unreachable service endpoint.

Suggested change
assert!(!output.status.success());
let stderr = String::from_utf8(output.stderr).unwrap();
let json: Value = parse_json_from(&stderr);
assert_eq!(json["success"], false);
assert!(json["error"].is_string());
assert!(json["error_code"].is_string());
// `flightctl info` may succeed (daemon running) or fail (daemon unreachable).
// On success it writes JSON to stdout; on failure it writes JSON to stderr.
let (raw, expect_success) = if output.status.success() {
(output.stdout, true)
} else {
(output.stderr, false)
};
let text = String::from_utf8(raw).unwrap();
let json: Value = parse_json_from(&text);
// In both cases we expect a well-formed JSON envelope with a `success` flag.
assert_eq!(json["success"], expect_success);
// On error, additional structured fields must be present.
if !expect_success {
assert!(json["error"].is_string());
assert!(json["error_code"].is_string());
}

Copilot uses AI. Check for mistakes.
EffortlessSteven and others added 2 commits March 1, 2026 01:04
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…lpers

- Make device_cmd tests accept both success and failure (daemon-agnostic)
- Gate exit-code mapping assertions on command actually failing
- Create shared common/mod.rs with cli() and parse_json_from() helpers
- Update profile_show comment to match actual local-stub behavior
- Move assert_cmd and predicates to Testing section in workspace Cargo.toml
- Make service_status assertion optional in version JSON test
- Accept both reachable/unreachable for service_status, validate non-empty
- Make flightctl info tests accept both success (stdout) and failure (stderr)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@qodo-free-for-open-source-projects

CI Feedback 🧐

A test triggered by this PR failed. Here is an AI-generated analysis of the failure:

Action: Test Suite (windows-latest, stable)

Failed stage: Run tests [❌]

Failed test name: test_performance_under_load

Failure summary:

The action failed during cargo test --all-features --workspace --lib --tests --exclude
flight-hub-examples because a workspace test panicked:
- Failing test: test_performance_under_load
in crates/flight-axis/tests/integration_tests.rs:509:5
- Reason: assertion left == right failed with
message Deadline misses detected! (observed left: 1, expected right: 0)
- This caused flight-axis
integration tests to report 25 passed; 1 failed and the job exited with code 101.

Relevant error logs:
1:  ##[group]Runner Image Provisioner
2:  Hosted Compute Agent
...

176:  RUST_BACKTRACE: 1
177:  targets: 
178:  components: rustfmt, clippy
179:  ##[endgroup]
180:  ##[group]Run : set $CARGO_HOME
181:  �[36;1m: set $CARGO_HOME�[0m
182:  �[36;1mecho CARGO_HOME=${CARGO_HOME:-"$USERPROFILE\.cargo"} >> $GITHUB_ENV�[0m
183:  shell: C:\Program Files\Git\bin\bash.EXE --noprofile --norc -e -o pipefail {0}
184:  env:
185:  CARGO_TERM_COLOR: always
186:  RUST_BACKTRACE: 1
187:  ##[endgroup]
188:  ##[group]Run : install rustup if needed on windows
189:  �[36;1m: install rustup if needed on windows�[0m
190:  �[36;1mif ! command -v rustup &>/dev/null; then�[0m
191:  �[36;1m  curl --proto '=https' --tlsv1.2 --retry 10 --retry-connrefused --location --silent --show-error --fail https://win.rustup.rs/x86_64 --output 'D:\a\_temp\rustup-init.exe'�[0m
192:  �[36;1m  'D:\a\_temp\rustup-init.exe' --default-toolchain none --no-modify-path -y�[0m
...

264:  �[36;1m  if rustc +stable --version --verbose | grep -q '^release: 1\.6[89]\.'; then�[0m
265:  �[36;1m    touch "D:\a\_temp"/.implicit_cargo_registries_crates_io_protocol || true�[0m
266:  �[36;1m    echo CARGO_REGISTRIES_CRATES_IO_PROTOCOL=sparse >> $GITHUB_ENV�[0m
267:  �[36;1m  elif rustc +stable --version --verbose | grep -q '^release: 1\.6[67]\.'; then�[0m
268:  �[36;1m    touch "D:\a\_temp"/.implicit_cargo_registries_crates_io_protocol || true�[0m
269:  �[36;1m    echo CARGO_REGISTRIES_CRATES_IO_PROTOCOL=git >> $GITHUB_ENV�[0m
270:  �[36;1m  fi�[0m
271:  �[36;1mfi�[0m
272:  shell: C:\Program Files\Git\bin\bash.EXE --noprofile --norc -e -o pipefail {0}
273:  env:
274:  CARGO_TERM_COLOR: always
275:  RUST_BACKTRACE: 1
276:  CARGO_HOME: C:\Users\runneradmin\.cargo
277:  CARGO_INCREMENTAL: 0
278:  ##[endgroup]
279:  ##[group]Run : work around spurious network errors in curl 8.0
280:  �[36;1m: work around spurious network errors in curl 8.0�[0m
281:  �[36;1m# https://rust-lang.zulipchat.com/#narrow/stream/246057-t-cargo/topic/timeout.20investigation�[0m
...

449:  - D:\a\OpenFlight\OpenFlight\examples\Cargo.toml
450:  - D:\a\OpenFlight\OpenFlight\installer\Cargo.toml
451:  - D:\a\OpenFlight\OpenFlight\specs\Cargo.toml
452:  - D:\a\OpenFlight\OpenFlight\xtask\Cargo.toml
453:  ##[endgroup]
454:  ... Restoring cache ...
455:  No cache found.
456:  ##[group]Run cargo fmt --all -- --check
457:  �[36;1mcargo fmt --all -- --check�[0m
458:  shell: C:\Program Files\Git\bin\bash.EXE --noprofile --norc -e -o pipefail {0}
459:  env:
460:  CARGO_TERM_COLOR: always
461:  RUST_BACKTRACE: 1
462:  CARGO_HOME: C:\Users\runneradmin\.cargo
463:  CARGO_INCREMENTAL: 0
464:  CACHE_ON_FAILURE: false
465:  ##[endgroup]
466:  ##[group]Run cargo clippy --workspace --all-features --lib --tests --exclude flight-hub-examples
467:  �[36;1mcargo clippy --workspace --all-features --lib --tests --exclude flight-hub-examples�[0m
468:  shell: C:\Program Files\Git\bin\bash.EXE --noprofile --norc -e -o pipefail {0}
469:  env:
470:  CARGO_TERM_COLOR: always
471:  RUST_BACKTRACE: 1
472:  CARGO_HOME: C:\Users\runneradmin\.cargo
473:  CARGO_INCREMENTAL: 0
474:  CACHE_ON_FAILURE: false
475:  ##[endgroup]
...

566:  �[1m�[92m  Downloaded�[0m tinytemplate v1.2.1
567:  �[1m�[92m  Downloaded�[0m tinystr v0.8.2
568:  �[1m�[92m  Downloaded�[0m time-core v0.1.8
569:  �[1m�[92m  Downloaded�[0m thread_local v1.1.9
570:  �[1m�[92m  Downloaded�[0m textwrap v0.16.2
571:  �[1m�[92m  Downloaded�[0m bstr v1.12.1
572:  �[1m�[92m  Downloaded�[0m windows-strings v0.5.1
573:  �[1m�[92m  Downloaded�[0m windows-interface v0.59.3
574:  �[1m�[92m  Downloaded�[0m windows-implement v0.60.2
575:  �[1m�[92m  Downloaded�[0m typenum v1.19.0
576:  �[1m�[92m  Downloaded�[0m tungstenite v0.28.0
577:  �[1m�[92m  Downloaded�[0m tokio-tungstenite v0.28.0
578:  �[1m�[92m  Downloaded�[0m tokio-test v0.4.5
579:  �[1m�[92m  Downloaded�[0m tokio-macros v2.6.0
580:  �[1m�[92m  Downloaded�[0m tinyvec_macros v0.1.1
581:  �[1m�[92m  Downloaded�[0m thiserror-impl v2.0.18
582:  �[1m�[92m  Downloaded�[0m thiserror v2.0.18
583:  �[1m�[92m  Downloaded�[0m termtree v0.5.1
...

628:  �[1m�[92m  Downloaded�[0m subtle v2.6.1
629:  �[1m�[92m  Downloaded�[0m spki v0.7.3
630:  �[1m�[92m  Downloaded�[0m spin v0.9.8
631:  �[1m�[92m  Downloaded�[0m smart-default v0.7.1
632:  �[1m�[92m  Downloaded�[0m smallvec v1.15.1
633:  �[1m�[92m  Downloaded�[0m slab v0.4.12
634:  �[1m�[92m  Downloaded�[0m similar v2.7.0
635:  �[1m�[92m  Downloaded�[0m simd-adler32 v0.3.8
636:  �[1m�[92m  Downloaded�[0m signature v2.2.0
637:  �[1m�[92m  Downloaded�[0m shlex v1.3.0
638:  �[1m�[92m  Downloaded�[0m sharded-slab v0.1.7
639:  �[1m�[92m  Downloaded�[0m sha2 v0.10.9
640:  �[1m�[92m  Downloaded�[0m windows-sys v0.60.2
641:  �[1m�[92m  Downloaded�[0m serde_spanned v1.0.4
642:  �[1m�[92m  Downloaded�[0m serde_spanned v0.6.9
643:  �[1m�[92m  Downloaded�[0m serde_path_to_error v0.1.20
644:  �[1m�[92m  Downloaded�[0m serde_derive v1.0.228
...

704:  �[1m�[92m  Downloaded�[0m hidapi v2.6.5
705:  �[1m�[92m  Downloaded�[0m hashbrown v0.16.1
706:  �[1m�[92m  Downloaded�[0m hashbrown v0.15.5
707:  �[1m�[92m  Downloaded�[0m h2 v0.4.13
708:  �[1m�[92m  Downloaded�[0m futures-util v0.3.32
709:  �[1m�[92m  Downloaded�[0m fancy-regex v0.17.0
710:  �[1m�[92m  Downloaded�[0m ed25519-dalek v2.2.0
711:  �[1m�[92m  Downloaded�[0m derive_more-impl v2.1.1
712:  �[1m�[92m  Downloaded�[0m derive_more v2.1.1
713:  �[1m�[92m  Downloaded�[0m der v0.7.10
714:  �[1m�[92m  Downloaded�[0m crossbeam-channel v0.5.15
715:  �[1m�[92m  Downloaded�[0m const-oid v0.9.6
716:  �[1m�[92m  Downloaded�[0m clap v4.5.60
717:  �[1m�[92m  Downloaded�[0m cc v1.2.56
718:  �[1m�[92m  Downloaded�[0m bytes v1.11.1
719:  �[1m�[92m  Downloaded�[0m quick-error v1.2.3
720:  �[1m�[92m  Downloaded�[0m protoc-bin-vendored v3.2.0
...

895:  �[1m�[92m  Downloaded�[0m hex v0.4.3
896:  �[1m�[92m  Downloaded�[0m generic-array v0.14.7
897:  �[1m�[92m  Downloaded�[0m ed25519 v2.2.3
898:  �[1m�[92m  Downloaded�[0m bytecount v0.6.9
899:  �[1m�[92m  Downloaded�[0m base64ct v1.8.3
900:  �[1m�[92m  Downloaded�[0m axum-core v0.5.6
901:  �[1m�[92m  Downloaded�[0m aws-lc-sys v0.37.1
902:  �[1m�[92m  Downloaded�[0m windows v0.62.2
903:  �[1m�[92m Downloading�[0m crates ...
904:  �[1m�[92m  Downloaded�[0m nix v0.31.2
905:  �[1m�[92m   Compiling�[0m proc-macro2 v1.0.106
906:  �[1m�[92m   Compiling�[0m quote v1.0.44
907:  �[1m�[92m   Compiling�[0m unicode-ident v1.0.24
908:  �[1m�[92m   Compiling�[0m serde_core v1.0.228
909:  �[1m�[92m   Compiling�[0m serde v1.0.228
910:  �[1m�[92m   Compiling�[0m thiserror v2.0.18
911:  �[1m�[92m   Compiling�[0m getrandom v0.3.4
...

925:  �[1m�[92m    Checking�[0m pin-project-lite v0.2.17
926:  �[1m�[92m   Compiling�[0m version_check v0.9.5
927:  �[1m�[92m    Checking�[0m log v0.4.29
928:  �[1m�[92m    Checking�[0m tracing-core v0.1.36
929:  �[1m�[92m   Compiling�[0m typenum v1.19.0
930:  �[1m�[92m    Checking�[0m regex-syntax v0.8.10
931:  �[1m�[92m   Compiling�[0m generic-array v0.14.7
932:  �[1m�[92m    Checking�[0m fnv v1.0.7
933:  �[1m�[92m    Checking�[0m rand_core v0.9.5
934:  �[1m�[92m    Checking�[0m fastrand v2.3.0
935:  �[1m�[92m    Checking�[0m bitflags v2.11.0
936:  �[1m�[92m    Checking�[0m memchr v2.8.0
937:  �[1m�[92m    Checking�[0m bit-vec v0.8.0
938:  �[1m�[92m    Checking�[0m bit-set v0.8.0
939:  �[1m�[92m    Checking�[0m wait-timeout v0.2.1
940:  �[1m�[92m    Checking�[0m quick-error v1.2.3
941:  �[1m�[92m    Checking�[0m rand_xorshift v0.4.0
942:  �[1m�[92m    Checking�[0m unarray v0.1.4
943:  �[1m�[92m    Checking�[0m itoa v1.0.17
944:  �[1m�[92m   Compiling�[0m anyhow v1.0.102
945:  �[1m�[92m   Compiling�[0m crossbeam-utils v0.8.21
946:  �[1m�[92m    Checking�[0m windows-targets v0.53.5
947:  �[1m�[92m    Checking�[0m windows-sys v0.60.2
948:  �[1m�[92m   Compiling�[0m semver v1.0.27
949:  �[1m�[92m    Checking�[0m bytes v1.11.1
950:  �[1m�[92m   Compiling�[0m rustc_version v0.4.1
951:  �[1m�[92m    Checking�[0m socket2 v0.6.2
952:  �[1m�[92m   Compiling�[0m heapless v0.7.17
953:  �[1m�[92m    Checking�[0m equivalent v1.0.2
954:  �[1m�[92m    Checking�[0m allocator-api2 v0.2.21
955:  �[1m�[92m    Checking�[0m foldhash v0.2.0
956:  �[1m�[92m   Compiling�[0m serde_derive v1.0.228
957:  �[1m�[92m   Compiling�[0m thiserror-impl v2.0.18
958:  �[1m�[92m   Compiling�[0m tracing-attributes v0.1.31
...

1169:  �[1m�[92m   Compiling�[0m protoc-bin-vendored-macos-x86_64 v3.2.0
1170:  �[1m�[92m   Compiling�[0m protoc-bin-vendored-linux-s390_64 v3.2.0
1171:  �[1m�[92m    Checking�[0m plotters-backend v0.3.7
1172:  �[1m�[92m   Compiling�[0m protoc-bin-vendored-linux-x86_64 v3.2.0
1173:  �[1m�[92m   Compiling�[0m protoc-bin-vendored-macos-aarch_64 v3.2.0
1174:  �[1m�[92m   Compiling�[0m protoc-bin-vendored-linux-ppcle_64 v3.2.0
1175:  �[1m�[92m    Checking�[0m ciborium-io v0.2.2
1176:  �[1m�[92m    Checking�[0m plotters-svg v0.3.7
1177:  �[1m�[92m    Checking�[0m ciborium-ll v0.2.2
1178:  �[1m�[92m   Compiling�[0m protoc-bin-vendored v3.2.0
1179:  �[1m�[92m   Compiling�[0m tonic-prost-build v0.14.5
1180:  �[1m�[92m    Checking�[0m tokio-tungstenite v0.28.0
1181:  �[1m�[92m    Checking�[0m axum-core v0.5.6
1182:  �[1m�[92m    Checking�[0m itertools v0.13.0
1183:  �[1m�[92m    Checking�[0m serde_urlencoded v0.7.1
1184:  �[1m�[92m    Checking�[0m serde_path_to_error v0.1.20
1185:  �[1m�[92m    Checking�[0m cast v0.3.0
...

1475:  �[1m�[96m--> �[0mcrates\flight-watchdog\src\lib.rs:1134:9
1476:  �[1m�[96m|�[0m
1477:  �[1m�[96m1134�[0m �[1m�[96m|�[0m         config.enable_nan_guards = true;
1478:  �[1m�[96m|�[0m         �[1m�[93m^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^�[0m
1479:  �[1m�[96m|�[0m
1480:  �[1m�[92mnote�[0m: consider initializing the variable with `WatchdogConfig { enable_nan_guards: true, ..Default::default() }` and removing relevant reassignments
1481:  �[1m�[96m--> �[0mcrates\flight-watchdog\src\lib.rs:1133:9
1482:  �[1m�[96m|�[0m
1483:  �[1m�[96m1133�[0m �[1m�[96m|�[0m         let mut config = WatchdogConfig::default();
1484:  �[1m�[96m|�[0m         �[1m�[92m^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^�[0m
1485:  �[1m�[96m= �[0m�[1m�[97mhelp�[0m: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.93.0/index.html#field_reassign_with_default
1486:  �[1m�[96m= �[0m�[1m�[97mnote�[0m: `#[warn(clippy::field_reassign_with_default)]` on by default
1487:  �[1m�[93mwarning�[0m�[1m�[97m: field assignment outside of initializer for an instance created with Default::default()�[0m
1488:  �[1m�[96m--> �[0mcrates\flight-watchdog\src\lib.rs:1158:9
1489:  �[1m�[96m|�[0m
1490:  �[1m�[96m1158�[0m �[1m�[96m|�[0m         config.max_consecutive_failures = 2; // Lower threshold for testing
1491:  �[1m�[96m|�[0m         �[1m�[93m^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^�[0m
1492:  �[1m�[96m|�[0m
1493:  �[1m�[92mnote�[0m: consider initializing the variable with `WatchdogConfig { max_consecutive_failures: 2, ..Default::default() }` and removing relevant reassignments
1494:  �[1m�[96m--> �[0mcrates\flight-watchdog\src\lib.rs:1157:9
...

1629:  �[1m�[93mwarning�[0m: `flight-axis` (test "detent_integration") generated 9 warnings
1630:  �[1m�[93mwarning[E0133]�[0m�[1m�[97m: call to unsafe function `flight_axis::Node::step_soa` is unsafe and requires unsafe block�[0m
1631:  �[1m�[96m--> �[0mcrates\flight-axis\tests\detent_tests.rs:25:5
1632:  �[1m�[96m|�[0m
1633:  �[1m�[96m25�[0m �[1m�[96m|�[0m     node.step_soa(frame, state_ptr);
1634:  �[1m�[96m|�[0m     �[1m�[93m^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^�[0m �[1m�[93mcall to unsafe function�[0m
1635:  �[1m�[96m|�[0m
1636:  �[1m�[96m= �[0m�[1m�[97mnote�[0m: for more information, see <https://doc.rust-lang.org/edition-guide/rust-2024/unsafe-op-in-unsafe-fn.html>
1637:  �[1m�[96m= �[0m�[1m�[97mnote�[0m: consult the function's documentation for information on how to avoid undefined behavior
1638:  �[1m�[92mnote�[0m: an unsafe function restricts its caller, but its body is safe by default
1639:  �[1m�[96m--> �[0mcrates\flight-axis\tests\detent_tests.rs:23:1
1640:  �[1m�[96m|�[0m
1641:  �[1m�[96m23�[0m �[1m�[96m|�[0m unsafe fn process_frame_soa(node: &DetentNode, frame: &mut AxisFrame, state: &mut DetentState) {
1642:  �[1m�[96m|�[0m �[1m�[92m^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^�[0m
1643:  �[1m�[96m= �[0m�[1m�[97mnote�[0m: `#[warn(unsafe_op_in_unsafe_fn)]` (part of `#[warn(rust_2024_compatibility)]`) on by default
1644:  �[1m�[97mFor more information about this error, try `rustc --explain E0133`.�[0m
1645:  �[1m�[93mwarning�[0m: `flight-axis` (test "detent_tests") generated 1 warning (run `cargo clippy --fix --test "detent_tests" -p flight-axis` to apply 1 suggestion)
...

1788:  �[1m�[96m--> �[0mcrates\flight-core\src\lib.rs:131:30
1789:  �[1m�[96m|�[0m
1790:  �[1m�[96m131�[0m �[1m�[96m|�[0m         let r: Result<u32> = Ok(42);
1791:  �[1m�[96m|�[0m                              �[1m�[96m^^^^^^�[0m
1792:  �[1m�[96m= �[0m�[1m�[97mhelp�[0m: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.93.0/index.html#unnecessary_literal_unwrap
1793:  �[1m�[96m= �[0m�[1m�[97mnote�[0m: `#[warn(clippy::unnecessary_literal_unwrap)]` on by default
1794:  �[1m�[93mwarning�[0m�[1m�[97m: used `unwrap_err()` on `Err` value�[0m
1795:  �[1m�[96m--> �[0mcrates\flight-core\src\lib.rs:136:17
1796:  �[1m�[96m|�[0m
1797:  �[1m�[96m136�[0m �[1m�[96m|�[0m         assert!(e.unwrap_err().to_string().contains("Rules validation"));
1798:  �[1m�[96m|�[0m                 �[1m�[93m^^^^^^^^^^^^^^�[0m
1799:  �[1m�[96m|�[0m
1800:  �[1m�[96mhelp�[0m: remove the `Err` and `unwrap_err()`
1801:  �[1m�[96m--> �[0mcrates\flight-core\src\lib.rs:134:30
1802:  �[1m�[96m|�[0m
1803:  �[1m�[96m134�[0m �[1m�[96m|�[0m         let e: Result<u32> = Err(FlightError::RulesValidation("bad rule".to_string()));
1804:  �[1m�[96m|�[0m                              �[1m�[96m^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^�[0m
...

2209:  �[36;1m# Apply strict warnings to core crates that must maintain high quality�[0m
2210:  �[36;1mcargo clippy -p flight-core --lib -- $STRICT_FLAGS�[0m
2211:  �[36;1mcargo clippy -p flight-axis --lib -- $STRICT_FLAGS�[0m
2212:  �[36;1mcargo clippy -p flight-bus --lib -- $STRICT_FLAGS�[0m
2213:  �[36;1mcargo clippy -p flight-hid --lib -- $STRICT_FLAGS�[0m
2214:  �[36;1mcargo clippy -p flight-ipc --lib -- $STRICT_FLAGS�[0m
2215:  �[36;1mcargo clippy -p flight-service --lib -- $STRICT_FLAGS�[0m
2216:  �[36;1mcargo clippy -p flight-simconnect --lib -- $STRICT_FLAGS�[0m
2217:  �[36;1mcargo clippy -p flight-panels --lib -- $STRICT_FLAGS�[0m
2218:  shell: C:\Program Files\Git\bin\bash.EXE --noprofile --norc -e -o pipefail {0}
2219:  env:
2220:  CARGO_TERM_COLOR: always
2221:  RUST_BACKTRACE: 1
2222:  CARGO_HOME: C:\Users\runneradmin\.cargo
2223:  CARGO_INCREMENTAL: 0
2224:  CACHE_ON_FAILURE: false
2225:  ##[endgroup]
...

2233:  �[1m�[92m   Compiling�[0m num-traits v0.2.19
2234:  �[1m�[92m    Checking�[0m crossbeam-epoch v0.9.18
2235:  �[1m�[92m    Checking�[0m aho-corasick v1.1.4
2236:  �[1m�[92m    Checking�[0m mio v1.1.1
2237:  �[1m�[92m    Checking�[0m hashbrown v0.16.1
2238:  �[1m�[92m    Checking�[0m regex-automata v0.4.14
2239:  �[1m�[92m    Checking�[0m indexmap v2.13.0
2240:  �[1m�[92m    Checking�[0m crossbeam-deque v0.8.6
2241:  �[1m�[92m    Checking�[0m crossbeam-queue v0.3.12
2242:  �[1m�[92m    Checking�[0m crossbeam-channel v0.5.15
2243:  �[1m�[92m    Checking�[0m tempfile v3.26.0
2244:  �[1m�[92m    Checking�[0m crossbeam v0.8.4
2245:  �[1m�[92m    Checking�[0m flight-metrics v0.1.0 (D:\a\OpenFlight\OpenFlight\crates\flight-metrics)
2246:  �[1m�[92m    Checking�[0m regex v1.12.3
2247:  �[1m�[92m   Compiling�[0m serde_derive v1.0.228
2248:  �[1m�[92m   Compiling�[0m thiserror-impl v2.0.18
2249:  �[1m�[92m   Compiling�[0m windows-implement v0.60.2
2250:  �[1m�[92m   Compiling�[0m windows-interface v0.59.3
2251:  �[1m�[92m   Compiling�[0m tracing-attributes v0.1.31
2252:  �[1m�[92m    Checking�[0m windows-core v0.62.2
2253:  �[1m�[92m   Compiling�[0m tokio-macros v2.6.0
2254:  �[1m�[92m    Checking�[0m thiserror v2.0.18
2255:  �[1m�[92m    Checking�[0m windows-numerics v0.3.1
...

2475:  �[1m�[92m    Checking�[0m flight-panels-cougar v0.1.0 (D:\a\OpenFlight\OpenFlight\crates\flight-panels-cougar)
2476:  �[1m�[92m    Checking�[0m flight-panels v0.1.0 (D:\a\OpenFlight\OpenFlight\crates\flight-panels)
2477:  �[1m�[92m    Finished�[0m `dev` profile [unoptimized + debuginfo] target(s) in 1.21s
2478:  ##[group]Run echo "🔍 Running file descriptor safety tests for public API crates..."
2479:  �[36;1mecho "🔍 Running file descriptor safety tests for public API crates..."�[0m
2480:  �[36;1m# Test that public API crates use typed file descriptors instead of RawFd�[0m
2481:  �[36;1mcargo test -p flight-hid fd_safety_tests�[0m
2482:  �[36;1mcargo test -p flight-ipc fd_safety_tests�[0m
2483:  �[36;1mcargo test -p flight-service fd_safety_tests�[0m
2484:  shell: C:\Program Files\Git\bin\bash.EXE --noprofile --norc -e -o pipefail {0}
2485:  env:
2486:  CARGO_TERM_COLOR: always
2487:  RUST_BACKTRACE: 1
2488:  CARGO_HOME: C:\Users\runneradmin\.cargo
2489:  CARGO_INCREMENTAL: 0
2490:  CACHE_ON_FAILURE: false
2491:  ##[endgroup]
2492:  🔍 Running file descriptor safety tests for public API crates...
2493:  �[1m�[92m   Compiling�[0m windows-link v0.2.1
2494:  �[1m�[92m   Compiling�[0m serde_core v1.0.228
2495:  �[1m�[92m   Compiling�[0m cfg-if v1.0.4
2496:  �[1m�[92m   Compiling�[0m once_cell v1.21.3
2497:  �[1m�[92m   Compiling�[0m windows-sys v0.61.2
2498:  �[1m�[92m   Compiling�[0m thiserror v2.0.18
2499:  �[1m�[92m   Compiling�[0m typenum v1.19.0
...

2567:  �[1m�[92m   Compiling�[0m ppv-lite86 v0.2.21
2568:  �[1m�[92m   Compiling�[0m flight-session v0.1.0 (D:\a\OpenFlight\OpenFlight\crates\flight-session)
2569:  �[1m�[92m   Compiling�[0m toml v0.8.23
2570:  �[1m�[92m   Compiling�[0m flight-blackbox v0.1.0 (D:\a\OpenFlight\OpenFlight\crates\flight-blackbox)
2571:  �[1m�[92m   Compiling�[0m flight-writers v0.1.0 (D:\a\OpenFlight\OpenFlight\crates\flight-writers)
2572:  �[1m�[92m   Compiling�[0m windows-sys v0.59.0
2573:  �[1m�[92m   Compiling�[0m flight-watchdog v0.1.0 (D:\a\OpenFlight\OpenFlight\crates\flight-watchdog)
2574:  �[1m�[92m   Compiling�[0m flight-rules v0.1.0 (D:\a\OpenFlight\OpenFlight\crates\flight-rules)
2575:  �[1m�[92m   Compiling�[0m flight-units v0.1.0 (D:\a\OpenFlight\OpenFlight\crates\flight-units)
2576:  �[1m�[92m   Compiling�[0m bit-vec v0.8.0
2577:  �[1m�[92m   Compiling�[0m encode_unicode v1.0.0
2578:  �[1m�[92m   Compiling�[0m wait-timeout v0.2.1
2579:  �[1m�[92m   Compiling�[0m flight-metrics v0.1.0 (D:\a\OpenFlight\OpenFlight\crates\flight-metrics)
2580:  �[1m�[92m   Compiling�[0m fnv v1.0.7
2581:  �[1m�[92m   Compiling�[0m flight-hid-types v0.1.0 (D:\a\OpenFlight\OpenFlight\crates\flight-hid-types)
2582:  �[1m�[92m   Compiling�[0m quick-error v1.2.3
2583:  �[1m�[92m   Compiling�[0m flight-hid-support v0.1.0 (D:\a\OpenFlight\OpenFlight\crates\flight-hid-support)
...

2588:  �[1m�[92m   Compiling�[0m hidapi v2.6.5
2589:  �[1m�[92m   Compiling�[0m rand_chacha v0.9.0
2590:  �[1m�[92m   Compiling�[0m rand_xorshift v0.4.0
2591:  �[1m�[92m   Compiling�[0m rand v0.9.2
2592:  �[1m�[92m   Compiling�[0m unarray v0.1.4
2593:  �[1m�[92m   Compiling�[0m similar v2.7.0
2594:  �[1m�[92m   Compiling�[0m bitflags v2.11.0
2595:  �[1m�[92m   Compiling�[0m proptest v1.10.0
2596:  �[1m�[92m   Compiling�[0m flight-hid v0.1.0 (D:\a\OpenFlight\OpenFlight\crates\flight-hid)
2597:  �[1m�[92m   Compiling�[0m insta v1.46.3
2598:  �[1m�[92m    Finished�[0m `test` profile [unoptimized + debuginfo] target(s) in 43.47s
2599:  �[1m�[92m     Running�[0m unittests src\lib.rs (target\debug\deps\flight_hid-792612c870e3f2a7.exe)
2600:  running 2 tests
2601:  test fd_safety_tests::clippy_config::test_fd_usage_examples ... ok
2602:  test fd_safety_tests::windows_tests::test_typed_handle_usage ... ok
2603:  test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 200 filtered out; finished in 0.00s
2604:  �[1m�[92m     Running�[0m tests\integration.rs (target\debug\deps\integration-ceeb865f425a7849.exe)
2605:  running 0 tests
2606:  test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 14 filtered out; finished in 0.00s
2607:  �[1m�[92m     Running�[0m tests\proptest_axis_calibration.rs (target\debug\deps\proptest_axis_calibration-d622df6fe5b9260f.exe)
2608:  running 0 tests
2609:  test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 13 filtered out; finished in 0.00s
2610:  �[1m�[92m     Running�[0m tests\snapshots.rs (target\debug\deps\snapshots-0e50c6c6cba33881.exe)
2611:  running 0 tests
2612:  test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 5 filtered out; finished in 0.00s
2613:  �[1m�[92m   Compiling�[0m windows-sys v0.61.2
...

2732:  �[1m�[92m   Compiling�[0m plotters v0.3.7
2733:  �[1m�[92m   Compiling�[0m matchers v0.2.0
2734:  �[1m�[92m   Compiling�[0m tinytemplate v1.2.1
2735:  �[1m�[92m   Compiling�[0m thread_local v1.1.9
2736:  �[1m�[92m   Compiling�[0m anes v0.1.6
2737:  �[1m�[92m   Compiling�[0m oorandom v11.1.5
2738:  �[1m�[92m   Compiling�[0m tracing-subscriber v0.3.22
2739:  �[1m�[92m   Compiling�[0m criterion v0.8.2
2740:  �[1m�[92m   Compiling�[0m proptest v1.10.0
2741:  �[1m�[92m   Compiling�[0m tokio-test v0.4.5
2742:  �[1m�[92m    Finished�[0m `test` profile [unoptimized + debuginfo] target(s) in 1m 31s
2743:  �[1m�[92m     Running�[0m unittests src\lib.rs (target\debug\deps\flight_ipc-74ce1c29e103cca3.exe)
2744:  running 2 tests
2745:  test fd_safety_tests::fd_usage_examples::test_ipc_fd_usage_examples ... ok
2746:  test fd_safety_tests::windows_tests::test_typed_handle_usage_ipc ... ok
2747:  test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 171 filtered out; finished in 0.00s
2748:  �[1m�[92m     Running�[0m tests\grpc_tests.rs (target\debug\deps\grpc_tests-266f830c155c7b5c.exe)
2749:  running 0 tests
2750:  test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 21 filtered out; finished in 0.00s
2751:  �[1m�[92m     Running�[0m tests\ipc_fuzz_tests.rs (target\debug\deps\ipc_fuzz_tests-ecd20f41a7f303f9.exe)
2752:  running 0 tests
2753:  test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 5 filtered out; finished in 0.00s
2754:  �[1m�[92m     Running�[0m tests\proto_tests.rs (target\debug\deps\proto_tests-63614f4c2286312e.exe)
2755:  running 0 tests
2756:  test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 25 filtered out; finished in 0.00s
2757:  �[1m�[92m   Compiling�[0m windows-link v0.2.1
...

2760:  �[1m�[92m   Compiling�[0m serde v1.0.228
2761:  �[1m�[92m   Compiling�[0m windows-sys v0.61.2
2762:  �[1m�[92m   Compiling�[0m cc v1.2.56
2763:  �[1m�[92m   Compiling�[0m pin-project-lite v0.2.17
2764:  �[1m�[92m   Compiling�[0m serde_core v1.0.228
2765:  �[1m�[92m   Compiling�[0m num-traits v0.2.19
2766:  �[1m�[92m   Compiling�[0m once_cell v1.21.3
2767:  �[1m�[92m   Compiling�[0m memchr v2.8.0
2768:  �[1m�[92m   Compiling�[0m bytes v1.11.1
2769:  �[1m�[92m   Compiling�[0m itoa v1.0.17
2770:  �[1m�[92m   Compiling�[0m tracing v0.1.44
2771:  �[1m�[92m   Compiling�[0m windows_x86_64_msvc v0.53.1
2772:  �[1m�[92m   Compiling�[0m windows-targets v0.53.5
2773:  �[1m�[92m   Compiling�[0m tracing-core v0.1.36
2774:  �[1m�[92m   Compiling�[0m windows-sys v0.60.2
2775:  �[1m�[92m   Compiling�[0m thiserror v2.0.18
2776:  �[1m�[92m   Compiling�[0m stable_deref_trait v1.2.1
...

2892:  �[1m�[92m   Compiling�[0m icu_normalizer_data v2.1.1
2893:  �[1m�[92m   Compiling�[0m icu_properties_data v2.1.2
2894:  �[1m�[92m   Compiling�[0m flight-simconnect-sys v0.1.0 (D:\a\OpenFlight\OpenFlight\crates\flight-simconnect-sys)
2895:  �[1m�[92m   Compiling�[0m untrusted v0.9.0
2896:  �[1m�[92m   Compiling�[0m ryu v1.0.23
2897:  �[1m�[92m   Compiling�[0m icu_properties v2.1.2
2898:  �[1m�[92m   Compiling�[0m icu_normalizer v2.1.1
2899:  �[1m�[92m   Compiling�[0m tonic-prost-build v0.14.5
2900:  �[1m�[92m   Compiling�[0m http-body-util v0.1.3
2901:  �[1m�[92m   Compiling�[0m subtle v2.6.1
2902:  �[1m�[92m   Compiling�[0m flight-ipc v0.1.0 (D:\a\OpenFlight\OpenFlight\crates\flight-ipc)
2903:  �[1m�[92m   Compiling�[0m idna_adapter v1.2.1
2904:  �[1m�[92m   Compiling�[0m serde_urlencoded v0.7.1
2905:  �[1m�[92m   Compiling�[0m axum-core v0.5.6
2906:  �[1m�[92m   Compiling�[0m num-integer v0.1.46
2907:  �[1m�[92m   Compiling�[0m serde_path_to_error v0.1.20
2908:  �[1m�[92m   Compiling�[0m utf8_iter v1.0.4
...

2984:  �[1m�[92m   Compiling�[0m flight-hotas-vkb v0.1.0 (D:\a\OpenFlight\OpenFlight\crates\flight-hotas-vkb)
2985:  �[1m�[92m   Compiling�[0m matchers v0.2.0
2986:  �[1m�[92m   Compiling�[0m thread_local v1.1.9
2987:  �[1m�[92m   Compiling�[0m reserve-port v2.3.0
2988:  �[1m�[92m   Compiling�[0m unsafe-libyaml v0.2.11
2989:  �[1m�[92m   Compiling�[0m bytesize v2.3.1
2990:  �[1m�[92m   Compiling�[0m axum-test v18.7.0
2991:  �[1m�[92m   Compiling�[0m serde_yaml_ng v0.10.0
2992:  �[1m�[92m   Compiling�[0m tokio-test v0.4.5
2993:  �[1m�[92m   Compiling�[0m flight-service v0.1.0 (D:\a\OpenFlight\OpenFlight\crates\flight-service)
2994:  �[1m�[92m    Finished�[0m `test` profile [unoptimized + debuginfo] target(s) in 3m 17s
2995:  �[1m�[92m     Running�[0m unittests src\lib.rs (target\debug\deps\flight_service-4ab2f4b8e4e41e8c.exe)
2996:  running 2 tests
2997:  test fd_safety_tests::fd_usage_examples::test_service_fd_usage_examples ... ok
2998:  test fd_safety_tests::windows_tests::test_service_system_handle_safety ... ok
2999:  test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 408 filtered out; finished in 0.00s
3000:  �[1m�[92m     Running�[0m unittests src\main.rs (target\debug\deps\flightd-f11122a588484984.exe)
3001:  running 0 tests
3002:  test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
3003:  �[1m�[92m     Running�[0m tests\service_integration.rs (target\debug\deps\service_integration-3c0df996be52184c.exe)
3004:  running 0 tests
3005:  test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 9 filtered out; finished in 0.00s
3006:  �[1m�[92m     Running�[0m tests\service_integration_tests.rs (target\debug\deps\service_integration_tests-c9478996da6b3000.exe)
3007:  running 0 tests
3008:  test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 11 filtered out; finished in 0.00s
3009:  ##[group]Run echo "🔍 Verifying critical patterns are fixed..."
...

3028:  �[36;1mfi�[0m
3029:  �[36;1m�[0m
3030:  �[36;1m# Check for criterion::black_box usage�[0m
3031:  �[36;1mif git grep -n "criterion::black_box" -- 'crates/' 'benches/'; then�[0m
3032:  �[36;1m  echo "❌ Found criterion::black_box - should be std::hint::black_box"�[0m
3033:  �[36;1m  exit 1�[0m
3034:  �[36;1mfi�[0m
3035:  �[36;1m�[0m
3036:  �[36;1mecho "✅ All critical patterns verified"�[0m
3037:  shell: C:\Program Files\Git\bin\bash.EXE --noprofile --norc -e -o pipefail {0}
3038:  env:
3039:  CARGO_TERM_COLOR: always
3040:  RUST_BACKTRACE: 1
3041:  CARGO_HOME: C:\Users\runneradmin\.cargo
3042:  CARGO_INCREMENTAL: 0
3043:  CACHE_ON_FAILURE: false
3044:  ##[endgroup]
3045:  🔍 Verifying critical patterns are fixed...
3046:  ✅ All critical patterns verified
3047:  ##[group]Run cargo test --all-features --workspace --lib --tests --exclude flight-hub-examples
3048:  �[36;1mcargo test --all-features --workspace --lib --tests --exclude flight-hub-examples�[0m
3049:  shell: C:\Program Files\Git\bin\bash.EXE --noprofile --norc -e -o pipefail {0}
3050:  env:
3051:  CARGO_TERM_COLOR: always
3052:  RUST_BACKTRACE: 1
3053:  CARGO_HOME: C:\Users\runneradmin\.cargo
3054:  CARGO_INCREMENTAL: 0
3055:  CACHE_ON_FAILURE: false
3056:  ##[endgroup]
...

3178:  �[1m�[92m   Compiling�[0m bit-vec v0.8.0
3179:  �[1m�[92m   Compiling�[0m bit-set v0.8.0
3180:  �[1m�[92m   Compiling�[0m rand_core v0.9.5
3181:  �[1m�[92m   Compiling�[0m flight-device-common v0.1.0 (D:\a\OpenFlight\OpenFlight\crates\flight-device-common)
3182:  �[1m�[92m   Compiling�[0m flight-xplane v0.1.0 (D:\a\OpenFlight\OpenFlight\crates\flight-xplane)
3183:  �[1m�[92m   Compiling�[0m crossbeam-utils v0.8.21
3184:  �[1m�[92m   Compiling�[0m flight-ac7-protocol v0.1.0 (D:\a\OpenFlight\OpenFlight\crates\flight-ac7-protocol)
3185:  �[1m�[92m   Compiling�[0m flight-ac7-telemetry v0.1.0 (D:\a\OpenFlight\OpenFlight\crates\flight-ac7-telemetry)
3186:  �[1m�[92m   Compiling�[0m crossbeam-epoch v0.9.18
3187:  �[1m�[92m   Compiling�[0m flight-hotas-winwing v0.1.0 (D:\a\OpenFlight\OpenFlight\crates\flight-hotas-winwing)
3188:  �[1m�[92m   Compiling�[0m crossbeam-deque v0.8.6
3189:  �[1m�[92m   Compiling�[0m flight-service v0.1.0 (D:\a\OpenFlight\OpenFlight\crates\flight-service)
3190:  �[1m�[92m   Compiling�[0m crossbeam-channel v0.5.15
3191:  �[1m�[92m   Compiling�[0m crossbeam-queue v0.3.12
3192:  �[1m�[92m   Compiling�[0m flight-test-helpers v0.1.0 (D:\a\OpenFlight\OpenFlight\crates\flight-test-helpers)
3193:  �[1m�[92m   Compiling�[0m quick-error v1.2.3
3194:  �[1m�[92m   Compiling�[0m wait-timeout v0.2.1
...

3434:  �[1m�[93mwarning�[0m: `flight-axis` (test "detent_integration") generated 9 warnings
3435:  �[1m�[93mwarning[E0133]�[0m�[1m�[97m: call to unsafe function `flight_axis::Node::step_soa` is unsafe and requires unsafe block�[0m
3436:  �[1m�[96m--> �[0mcrates\flight-axis\tests\detent_tests.rs:25:5
3437:  �[1m�[96m|�[0m
3438:  �[1m�[96m25�[0m �[1m�[96m|�[0m     node.step_soa(frame, state_ptr);
3439:  �[1m�[96m|�[0m     �[1m�[93m^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^�[0m �[1m�[93mcall to unsafe function�[0m
3440:  �[1m�[96m|�[0m
3441:  �[1m�[96m= �[0m�[1m�[97mnote�[0m: for more information, see <https://doc.rust-lang.org/edition-guide/rust-2024/unsafe-op-in-unsafe-fn.html>
3442:  �[1m�[96m= �[0m�[1m�[97mnote�[0m: consult the function's documentation for information on how to avoid undefined behavior
3443:  �[1m�[92mnote�[0m: an unsafe function restricts its caller, but its body is safe by default
3444:  �[1m�[96m--> �[0mcrates\flight-axis\tests\detent_tests.rs:23:1
3445:  �[1m�[96m|�[0m
3446:  �[1m�[96m23�[0m �[1m�[96m|�[0m unsafe fn process_frame_soa(node: &DetentNode, frame: &mut AxisFrame, state: &mut DetentState) {
3447:  �[1m�[96m|�[0m �[1m�[92m^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^�[0m
3448:  �[1m�[96m= �[0m�[1m�[97mnote�[0m: `#[warn(unsafe_op_in_unsafe_fn)]` (part of `#[warn(rust_2024_compatibility)]`) on by default
3449:  �[1m�[97mFor more information about this error, try `rustc --explain E0133`.�[0m
3450:  �[1m�[93mwarning�[0m: `flight-axis` (test "detent_tests") generated 1 warning (run `cargo fix --test "detent_tests" -p flight-axis` to apply 1 suggestion)
...

3490:  test tests::managed_block_is_idempotent ... ok
3491:  test tests::applies_profile_replaces_existing_managed_block ... ok
3492:  test tests::install_creates_dir_and_file ... ok
3493:  test tests::installs_with_backup ... ok
3494:  test tests::rc_mode_index_values ... ok
3495:  test tests::renders_all_rc_modes ... ok
3496:  test tests::renders_managed_block ... ok
3497:  test tests::steam_input_hint_is_nonempty ... ok
3498:  test tests::validates_empty_profile_name ... ok
3499:  test tests::validates_out_of_range_deadzone ... ok
3500:  test tests::validates_out_of_range_exponent ... ok
3501:  test tests::validates_out_of_range_scale ... ok
3502:  test tests::property_valid_deadzone_range_accepted ... ok
3503:  test tests::property_valid_exponent_range_accepted ... ok
3504:  test tests::property_valid_scale_range_accepted ... ok
3505:  test result: ok. 15 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.02s
3506:  �[1m�[92m     Running�[0m unittests src\lib.rs (target\debug\deps\flight_ac7_protocol-b6e863ecbbb0259d.exe)
3507:  running 13 tests
3508:  test tests::aircraft_label_trims_whitespace ... ok
3509:  test tests::parses_valid_packet ... ok
3510:  test tests::defaults_schema_and_label ... ok
3511:  test tests::json_round_trip ... ok
3512:  test tests::property_pitch_control_is_bounded ... ok
3513:  test tests::property_bounded_altitude_valid ... ok
3514:  test tests::rejects_invalid_json ... ok
3515:  test tests::rejects_negative_speed ... ok
3516:  test tests::property_out_of_bounds_throttle_rejected ... ok
3517:  test tests::rejects_out_of_range_control_value ... ok
3518:  test tests::property_all_bounded_controls_valid ... ok
3519:  test tests::rejects_out_of_range_altitude ... ok
3520:  test tests::rejects_wrong_schema ... ok
3521:  test result: ok. 13 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s
3522:  �[1m�[92m     Running�[0m unittests src\lib.rs (target\debug\deps\flight_ac7_telemetry-15e129c5b63bef41.exe)
3523:  running 10 tests
3524:  test tests::metrics_registry_tracks_config ... ok
3525:  test tests::adapter_initial_state_is_disconnected ... ok
3526:  test tests::snapshot_control_inputs_mapped ... ok
3527:  test tests::converts_packet_to_snapshot ... ok
3528:  test tests::snapshot_has_correct_sim_id ... ok
3529:  test tests::snapshot_validity_flags_set_from_full_packet ... ok
3530:  test tests::snapshot_validity_partial_packet ... ok
3531:  test tests::start_stop_cycle ... ok
3532:  test tests::udp_poll_receives_packet ... ok
3533:  test tests::poll_updates_source_addr ... ok
3534:  test result: ok. 10 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
3535:  �[1m�[92m     Running�[0m unittests src\lib.rs (target\debug\deps\flight_adapter_common-7bfc7ec097d45099.exe)
3536:  running 19 tests
3537:  test metrics::tests::test_record_aircraft_change ... ok
3538:  test reconnect_backoff::tests::test_first_delay_equals_initial ... ok
3539:  test metrics::tests::test_record_update_tracks_samples ... ok
3540:  test reconnect_backoff::tests::test_exponential_growth ... ok
3541:  test reconnect_backoff::tests::test_jitter_stays_within_bounds ... ok
3542:  test reconnect_backoff::tests::test_jitter_zero_means_no_jitter ... ok
3543:  test reconnect_backoff::tests::test_max_delay_cap ... ok
3544:  test reconnect_backoff::tests::test_reset_restarts_sequence ... ok
3545:  test reconnection::tests::test_backoff_progression ... ok
3546:  test reconnection::tests::test_should_retry ... ok
3547:  test tests::adapter_error_display_variants ... ok
3548:  test tests::adapter_metrics_summary_format ... ok
3549:  test tests::adapter_metrics_total_updates_increment ... ok
3550:  test tests::adapter_state_all_variants_debug ... ok
3551:  test tests::adapter_state_equality ... ok
3552:  test tests::reconnection_strategy_initial_backoff_on_first_attempt ... ok
3553:  test tests::reconnection_strategy_max_backoff_caps ... ok
3554:  test reconnect_backoff::tests::test_invalid_jitter_panics - should panic ... ok
3555:  test reconnect_backoff::tests::test_invalid_multiplier_panics - should panic ... ok
3556:  test result: ok. 19 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.09s
3557:  �[1m�[92m     Running�[0m unittests src\lib.rs (target\debug\deps\flight_aerofly-e63951766d3fdf31.exe)
3558:  running 36 tests
3559:  test tests::adapter_default_port ... ok
3560:  test tests::adapter_custom_port ... ok
3561:  test tests::adapter_no_telemetry_initially ... ok
3562:  test tests::adapter_process_datagram_updates_last ... ok
3563:  test tests::adapter_process_invalid_datagram_returns_error ... ok
3564:  test tests::adapter_process_json_updates_last ... ok
3565:  test tests::aircraft_type_case_insensitive ... ok
3566:  test tests::adapter_process_text_updates_last ... ok
3567:  test tests::aircraft_type_from_name ... ok
3568:  test tests::airspeed_conversion_knots_to_ms ... ok
3569:  test tests::altitude_conversion_ft_to_m ... ok
3570:  test tests::attitude_conversion_deg_to_rad ... ok
3571:  test tests::bad_magic_returns_error ... ok
3572:  test tests::flaps_ratio_clamped_below_zero ... ok
3573:  test tests::empty_frame_returns_error ... ok
3574:  test tests::frame_too_short_returns_error ... ok
3575:  test tests::gear_down_byte_nonzero ... ok
3576:  test tests::gear_up_byte_zero ... ok
3577:  test tests::invalid_json_returns_error ... ok
3578:  test tests::json_vspeed_defaults_to_zero_when_absent ... ok
3579:  test tests::parse_text_all_fields ... ok
3580:  test tests::parse_text_empty_returns_error ... ok
3581:  test tests::parse_text_gear_state_boundary ... ok
3582:  test tests::parse_text_invalid_numbers_default_to_zero ... ok
3583:  test tests::parse_text_negative_altitude ... ok
3584:  test tests::parse_text_partial_uses_defaults ... ok
3585:  test tests::parse_text_throttle_clamped ... ok
3586:  test tests::parse_text_unknown_keys_ignored ... ok
3587:  test tests::parse_text_whitespace_tolerance ... ok
3588:  test tests::parse_valid_binary_frame ... ok
3589:  test tests::parse_valid_json ... ok
3590:  test tests::telemetry_default_values ... ok
3591:  test tests::throttle_clamped_above_one ... ok
3592:  test tests::telemetry_serde_round_trip ... ok
3593:  test tests::vspeed_conversion_fpm_to_ms ... ok
3594:  test tests::zero_altitude_conversion ... ok
3595:  test result: ok. 36 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s
3596:  �[1m�[92m     Running�[0m tests\integration_tests.rs (target\debug\deps\integration_tests-aaf1054325880608.exe)
3597:  running 10 tests
3598:  test attitude_roll_pitch_heading_in_correct_units ... ok
3599:  test airspeed_and_vertical_state_fields_present ... ok
3600:  test adapter_processes_binary_and_json_paths ... ok
3601:  test coordinates_altitude_and_heading_decoded_correctly ... ok
3602:  test adapter_json_round_trip_preserves_all_fields ... ok
3603:  test unit_conversion_helpers_are_consistent ... ok
3604:  test text_format_parsed_and_all_three_paths_work ... ok
3605:  test missing_fields_in_json_returns_error_gracefully ... ok
3606:  test malformed_json_returns_error_not_panic ... ok
3607:  test valid_json_telemetry_packet_parsed ... ok
3608:  test result: ok. 10 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s
3609:  �[1m�[92m     Running�[0m unittests src\lib.rs (target\debug\deps\flight_axis-64a16df3df3ffffa.exe)
...

3616:  test accumulator::tests::test_reset_to_zero ... ok
3617:  test accumulator::tests::test_scale_factor ... ok
3618:  test accumulator::tests::test_wrap_negative ... ok
3619:  test accumulator::tests::test_wrap_positive ... ok
3620:  test blackbox::tests::test_annotator_creation ... ok
3621:  test blackbox::tests::test_buffer_flush ... ok
3622:  test blackbox::tests::test_conflict_data_conversion ... ok
3623:  test blackbox::tests::test_conflict_annotation ... ok
3624:  test blackbox::tests::test_disabled_annotation ... ok
3625:  test blackbox::tests::test_disabled_annotator ... ok
3626:  test blackbox::tests::test_resolution_annotation ... ok
3627:  test buttons::tests::test_axis_offset_action ... ok
3628:  test buttons::tests::test_axis_set_action ... ok
3629:  test buttons::tests::test_chord_partial_press_no_fire ... ok
3630:  test buttons::tests::test_chord_requires_all_buttons ... ok
3631:  test buttons::tests::test_chord_too_many_buttons_error ... ok
3632:  test buttons::tests::test_clear_removes_all_macros ... ok
3633:  test buttons::tests::test_duplicate_button_error ... ok
3634:  test buttons::tests::test_empty_chord_error ... ok
3635:  test buttons::tests::test_hold_fires_after_threshold ... ok
...

3658:  test calibration::tests::test_calbank_insert_and_get ... ok
3659:  test calibration::tests::test_calbank_unknown_axis_uses_default ... ok
3660:  test calibration::tests::test_normalize_8bit ... ok
3661:  test buttons::tests::proptest_output_count_never_exceeds_8 ... ok
3662:  test calibration::tests::test_normalize_above_deadband ... ok
3663:  test calibration::tests::test_normalize_center_is_zero ... ok
3664:  test calibration::tests::test_normalize_clamped_above_max ... ok
3665:  test calibration::tests::test_normalize_clamped_below_min ... ok
3666:  test calibration::tests::test_normalize_deadband_near_center ... ok
3667:  test calibration::tests::test_normalize_max_is_one ... ok
3668:  test calibration::tests::test_normalize_midpoint_above_center ... ok
3669:  test calibration::tests::test_normalize_midpoint_below_center ... ok
3670:  test calibration::tests::test_normalize_min_equals_max ... ok
3671:  test calibration::tests::test_normalize_min_is_neg_one ... ok
3672:  test calibration::tests::test_normalize_virpil_14bit ... ok
3673:  test calibration_wizard::tests::center_detection_noisy_fails ... ok
3674:  test calibration_wizard::tests::center_detection_stable_succeeds ... ok
3675:  test calibration_wizard::tests::complete_produces_result ... ok
3676:  test calibration_wizard::tests::deadzone_recommends_value ... ok
3677:  test calibration_wizard::tests::initial_state_is_not_started ... ok
3678:  test calibration_wizard::tests::progress_increases_through_steps ... ok
3679:  test calibration_wizard::tests::reset_returns_to_not_started ... ok
3680:  test calibration_wizard::tests::samples_ignored_in_terminal_states ... ok
3681:  test calibration_wizard::tests::start_transitions_to_center_detection ... ok
3682:  test calibration_wizard::tests::sweep_detects_full_range ... ok
3683:  test calibration_wizard::tests::sweep_insufficient_range_fails ... ok
3684:  test calibration_wizard::tests::timeout_fails_center_detection ... ok
3685:  test calibration_wizard::tests::verification_fails_non_monotonic ... ok
3686:  test calibration_wizard::tests::verification_passes_linear ... ok
...

3775:  test curve::tests::test_expo_negative_increases_center_sensitivity ... ok
3776:  test curve::tests::prop_output_always_in_range ... ok
3777:  test curve::tests::test_expo_one_input_maps_to_one ... ok
3778:  test curve::tests::test_expo_positive_reduces_center_sensitivity ... ok
3779:  test curve::tests::test_expo_zero_input_maps_to_zero ... ok
3780:  test curve::tests::test_expo_zero_is_linear ... ok
3781:  test curve::tests::test_is_monotone_identity ... ok
3782:  test curve::tests::test_linear_identity_constructor ... ok
3783:  test curve::tests::test_linear_identity_evaluates_x ... ok
3784:  test curve::tests::test_linear_identity_one ... ok
3785:  test curve::tests::test_linear_identity_zero ... ok
3786:  test curve::tests::test_linear_interpolation_midpoint ... ok
3787:  test curve::tests::test_monotone_cubic_identity ... ok
3788:  test curve::tests::test_standard_deadzone_expo_curve ... ok
3789:  test curve::tests::test_monotone_cubic_preserves_monotone ... ok
3790:  test curve::tests::test_too_few_points_error ... ok
3791:  test curve::tests::test_unsorted_points_error ... ok
3792:  test deadzone::tests::prop_antisymmetric ... ok
...

3798:  test deadzone::tests::test_asymmetric_negative_deadzone ... ok
3799:  test deadzone::tests::test_asymmetric_positive_deadzone ... ok
3800:  test deadzone::tests::test_asymmetric_symmetric_matches_center_only ... ok
3801:  test deadzone::tests::test_asymmetric_zero_positive_passes_positive ... ok
3802:  test deadzone::tests::test_bank_apply ... ok
3803:  test deadzone::tests::test_bank_set_config ... ok
3804:  test deadzone::tests::test_center_deadzone_full_deflection ... ok
3805:  test deadzone::tests::test_center_deadzone_negative ... ok
3806:  test deadzone::tests::test_center_deadzone_outside_zone ... ok
3807:  test deadzone::tests::test_center_deadzone_within_zone ... ok
3808:  test deadzone::tests::test_clamp_above_one ... ok
3809:  test deadzone::tests::test_clamp_below_neg_one ... ok
3810:  test deadzone::tests::test_combined_center_and_edge ... ok
3811:  test deadzone::tests::test_edge_deadzone_below ... ok
3812:  test deadzone::tests::test_edge_deadzone_saturation ... ok
3813:  test deadzone::tests::test_invalid_center_error ... ok
3814:  test deadzone::tests::test_overlap_error ... ok
3815:  test deadzone::tests::test_zero_deadzone_passthrough ... ok
...

3937:  test invert::tests::test_invert_disabled_passthrough ... ok
3938:  test invert::tests::test_invert_enabled_negates ... ok
3939:  test invert::tests::test_invert_negative_one ... ok
3940:  test invert::tests::test_invert_positive_one ... ok
3941:  test invert::tests::test_invert_toggle ... ok
3942:  test invert::tests::test_invert_zero_unchanged ... ok
3943:  test lag_compensator::tests::first_sample_passes_through ... ok
3944:  test lag_compensator::tests::max_prediction_clamped ... ok
3945:  test lag_compensator::tests::moving_axis_is_predicted_ahead ... ok
3946:  test lag_compensator::tests::nan_passes_through_unchanged ... ok
3947:  test lag_compensator::tests::negative_movement_predicts_backward ... ok
3948:  test lag_compensator::tests::output_is_clamped_to_valid_range ... ok
3949:  test lag_compensator::tests::reset_clears_initialized ... ok
3950:  test lag_compensator::tests::static_axis_unchanged ... ok
3951:  test lag_compensator::tests::zero_dt_uses_last_dt ... ok
3952:  test mixer::tests::add_input_beyond_max_fails ... ok
3953:  test mixer::tests::add_input_increments_count ... ok
...

4029:  test pid::tests::test_pid_bank_reset_not_needed ... ok
4030:  test pid::tests::test_pid_bank_update_known_axis ... ok
4031:  test pid::tests::test_pid_bank_update_unknown_axis ... ok
4032:  test pid::tests::test_pid_converges_step_response ... ok
4033:  test pid::tests::test_pid_derivative_on_step ... ok
4034:  test pid::tests::test_pid_derivative_zero_first_tick ... ok
4035:  test pid::tests::test_pid_integral_accumulates ... ok
4036:  test pid::tests::test_pid_integral_windup_limited ... ok
4037:  test pid::tests::test_pid_output_clamped_to_1 ... ok
4038:  test pid::tests::test_pid_output_clamped_to_neg1 ... ok
4039:  test pid::tests::test_pid_proportional_only ... ok
4040:  test pid::tests::test_pid_reset_clears_state ... ok
4041:  test pid::tests::test_pid_set_integral_clamped ... ok
4042:  test pid::tests::test_pid_setpoint_above_pv ... ok
4043:  test pid::tests::test_pid_setpoint_below_pv ... ok
4044:  test pid::tests::test_pid_zero_error ... ok
4045:  test pipeline::tests::test_alignment ... ok
...

4050:  test pipeline::tests::test_curve_stage_linear ... ok
4051:  test pipeline::tests::test_deadzone_stage_center ... ok
4052:  test pipeline::tests::test_deadzone_stage_full_deflection ... ok
4053:  test pipeline::tests::test_deadzone_stage_negative ... ok
4054:  test pipeline::tests::test_deadzone_stage_rescale ... ok
4055:  test pipeline::tests::test_default_pipeline_is_empty ... ok
4056:  test pipeline::tests::test_diagnostics_captures_per_stage_io ... ok
4057:  test pipeline::tests::test_diagnostics_respects_bypass ... ok
4058:  test pipeline::tests::test_empty_pipeline_passthrough ... ok
4059:  test pipeline::tests::test_enable_stage_after_bypass ... ok
4060:  test pipeline::tests::test_insert_stage_at_beginning ... ok
4061:  test pipeline::tests::test_insert_stage_at_end ... ok
4062:  test pipeline::tests::test_pipeline_multi_stage ... ok
4063:  test pipeline::tests::test_pipeline_state_creation ... ok
4064:  test pipeline::tests::test_remove_stage_out_of_bounds ... ok
4065:  test pid::tests::proptest_zero_error_zero_output ... ok
4066:  test pipeline::tests::test_remove_stage_returns_stage ... ok
...

4145:  test recording::tests::test_playback_advance_returns_samples_in_window ... ok
4146:  test recording::tests::test_playback_is_finished_at_end ... ok
4147:  test recording::tests::test_playback_looping_wraps_around ... ok
4148:  test recording::tests::test_playback_rewind ... ok
4149:  test recording::tests::test_record_multiple_samples ... ok
4150:  test recording::tests::test_record_single_sample ... ok
4151:  test recording::tests::test_recording_empty_by_default ... ok
4152:  test recording::tests::test_recording_duration ... ok
4153:  test recording::tests::test_samples_in_range ... ok
4154:  test scale::tests::test_bank_apply ... ok
4155:  test scale::tests::test_bank_set_scale ... ok
4156:  test scale::tests::test_scale_clamp_max ... ok
4157:  test scale::tests::test_scale_clamp_min ... ok
4158:  test scale::tests::test_scale_default_passthrough ... ok
4159:  test scale::tests::test_scale_factor_half ... ok
4160:  test scale::tests::test_scale_invalid_range_error ... ok
4161:  test scale::tests::test_scale_nan_factor_error ... ok
4162:  test scale::tests::test_scale_negative_factor ... ok
...

4281:  test stages::tests::very_large_values_handled ... ok
4282:  test throttle_zone::tests::prop_event_count_never_exceeds_4 ... ok
4283:  test throttle_zone::tests::test_afterburner_zone_event ... ok
4284:  test throttle_zone::tests::test_builder_pattern ... ok
4285:  test throttle_zone::tests::test_combined_cut_and_milpower ... ok
4286:  test throttle_zone::tests::prop_output_always_in_range ... ok
4287:  test throttle_zone::tests::test_cut_zone_above_threshold ... ok
4288:  test throttle_zone::tests::test_cut_zone_at_threshold ... ok
4289:  test throttle_zone::tests::test_cut_zone_below_threshold ... ok
4290:  test throttle_zone::tests::test_max_zone_below_threshold ... ok
4291:  test throttle_zone::tests::test_max_zone_saturation ... ok
4292:  test throttle_zone::tests::test_milpower_zone_event_on_entry ... ok
4293:  test throttle_zone::tests::test_milpower_zone_event_on_exit ... ok
4294:  test throttle_zone::tests::test_no_zones_passthrough ... ok
4295:  test throttle_zone::tests::test_process_clamped_input_above_one ... ok
4296:  test throttle_zone::tests::test_validate_cut_above_max_error ... ok
4297:  test throttle_zone::tests::test_validate_invalid_cut_threshold ... ok
...

4322:  test trim::tests::proptest_apply_output_bounded ... ok
4323:  test trim::tests::test_trimbank_apply_unknown_axis ... ok
4324:  test trim::tests::test_trimbank_get_or_insert ... ok
4325:  test trim::tests::test_trimbank_reset_all ... ok
4326:  test trim::tests::proptest_decrement_bounded ... ok
4327:  test velocity::tests::test_velocity_negative_movement ... ok
4328:  test velocity::tests::test_velocity_no_smoothing ... ok
4329:  test velocity::tests::test_velocity_positive_movement ... ok
4330:  test velocity::tests::test_velocity_reset ... ok
4331:  test velocity::tests::test_velocity_invalid_alpha_panics - should panic ... ok
4332:  test velocity::tests::test_velocity_smoothing ... ok
4333:  test velocity::tests::test_velocity_units ... ok
4334:  test velocity::tests::test_velocity_zero_at_rest ... ok
4335:  test velocity::tests::test_velocity_invalid_period_panics - should panic ... ok
4336:  test trim::tests::proptest_increment_bounded ... ok
4337:  test result: ok. 726 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.53s
4338:  �[1m�[92m     Running�[0m tests\detent_integration.rs (target\debug\deps\detent_integration-ed36fb410ff34c8f.exe)
4339:  running 8 tests
4340:  test test_detent_builder_api ... ok
4341:  test test_detent_hysteresis_with_slew ... ok
4342:  test test_detent_events_in_pipeline ... ok
4343:  test test_detent_in_complete_pipeline ... ok
4344:  test test_detent_output_snapping ... ok
4345:  test test_detent_with_curve_interaction ... ok
4346:  test test_multiple_detent_transitions ... ok
4347:  test test_detent_performance_in_pipeline ... ok
4348:  test result: ok. 8 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.63s
4349:  �[1m�[92m     Running�[0m tests\detent_tests.rs (target\debug\deps\detent_tests-097e8f83c9ceb2ac.exe)
4350:  running 13 tests
4351:  test test_detent_zone_clamping ... ok
4352:  test test_detent_zone_containment ... ok
4353:  test test_detent_role_names ... ok
4354:  test test_detent_zone_creation ... ok
4355:  test test_hysteresis_prevents_flapping ... ok
4356:  test test_multiple_detents_no_overlap ... ok
4357:  test test_no_snap_detent ... ok
4358:  test test_node_trait_implementation ... ok
4359:  test test_single_detent_entry_exit ... ok
4360:  test test_sweep_single_transitions ... ok
4361:  test test_zone_sorting ... ok
4362:  test test_hysteresis_stability ... ok
4363:  test test_deterministic_detent_behavior ... ok
4364:  test result: ok. 13 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.05s
4365:  �[1m�[92m     Running�[0m tests\filter_tests.rs (target\debug\deps\filter_tests-29d4f6e98fca602b.exe)
4366:  running 10 tests
4367:  test test_filter_alpha_zero_holds_initial_value ... ok
4368:  test test_filter_alpha_one_is_identity ... ok
4369:  test test_b104_spike_rejection_ignores_single_transient ... ok
4370:  test test_filter_ema_smoothing_on_step_input ... ok
4371:  test test_filter_converges_toward_constant_input ... ok
4372:  test test_filter_first_sample_passthrough ... ok
4373:  test test_filter_inf_does_not_panic ... ok
4374:  test test_filter_nan_does_not_panic ... ok
4375:  test test_filter_output_bounded_for_valid_inputs ... ok
4376:  test filter_output_in_range ... ok
4377:  test result: ok. 10 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s
4378:  �[1m�[92m     Running�[0m tests\integration_tests.rs (target\debug\deps\integration_tests-318cfa7058261877.exe)
4379:  running 26 tests
4380:  test test_allocation_guard ... ok
4381:  test test_axis_engine_creation ... ok
4382:  test test_axis_engine_process_without_pipeline ... ok
4383:  test test_atomic_pipeline_swap_with_ack ... ok
4384:  test test_axis_engine_with_config ... ok
4385:  test test_axis_frame_creation ... ok
4386:  test test_axis_frame_derivative_calculation ... ok
4387:  test test_compile_failure_safety ... ok
4388:  test test_curve_node_exponential ... ok
...

4390:  test test_deadzone_node_asymmetric ... ok
4391:  test test_deadzone_node_symmetric ... ok
4392:  test test_deterministic_processing ... ok
4393:  test test_node_type_identification ... ok
4394:  test test_node_state_sizes ... ok
4395:  test test_end_to_end_pipeline_processing ... ok
4396:  test test_performance_snapshot ... ok
4397:  test test_pipeline_builder ... ok
4398:  test test_pipeline_state_validation ... ok
4399:  test test_runtime_counters ... ok
4400:  test test_runtime_counters_averaging ... ok
4401:  test test_slew_node_rate_limiting ... ok
4402:  test test_zero_allocation_constraint_validation ... ok
4403:  test test_zero_allocation_guarantee ... ok
4404:  test test_processing_performance ... ok
4405:  test test_performance_under_load ... FAILED
4406:  failures:
4407:  ---- test_performance_under_load stdout ----
4408:  thread 'test_performance_under_load' (8236) panicked at crates\flight-axis\tests\integration_tests.rs:509:5:
4409:  assertion `left == right` failed: Deadline misses detected!
4410:  left: 1
4411:  right: 0
4412:  stack backtrace:
4413:  0: std::panicking::panic_handler
4414:  at /rustc/01f6ddf7588f42ae2d7eb0a2f21d44e8e96674cf/library\std\src\panicking.rs:689
4415:  1: core::panicking::panic_fmt
4416:  at /rustc/01f6ddf7588f42ae2d7eb0a2f21d44e8e96674cf/library\core\src\panicking.rs:80
4417:  2: core::panicking::assert_failed_inner
4418:  at /rustc/01f6ddf7588f42ae2d7eb0a2f21d44e8e96674cf/library\core\src\panicking.rs:434
4419:  3: core::panicking::assert_failed<u64,u64>
4420:  at /rustc/01f6ddf7588f42ae2d7eb0a2f21d44e8e96674cf/library\core\src\panicking.rs:394
4421:  4: integration_tests::test_performance_under_load
4422:  at .\tests\integration_tests.rs:509
4423:  5: integration_tests::test_performance_under_load::closure$0
4424:  at .\tests\integration_tests.rs:471
4425:  6: core::ops::function::FnOnce::call_once<integration_tests::test_performance_under_load::closure_env$0,tuple$<> >
4426:  at /rustc/01f6ddf7588f42ae2d7eb0a2f21d44e8e96674cf\library\core\src\ops\function.rs:250
4427:  7: core::ops::function::FnOnce::call_once
4428:  at /rustc/01f6ddf7588f42ae2d7eb0a2f21d44e8e96674cf/library\core\src\ops\function.rs:250
4429:  note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.
4430:  failures:
4431:  test_performance_under_load
4432:  test result: FAILED. 25 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 3.98s
4433:  �[1m�[91merror�[0m: test failed, to rerun pass `-p flight-axis --test integration_tests`
4434:  ##[error]Process completed with exit code 101.
4435:  Post job cleanup.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants