AprilNEA/OpenLogi · error

no addressable physical device candidate was found

Error message

no addressable physical device candidate was found

What it means

`select_target` in the fixture tooling resolves the physical device a fixture operation should target from a candidate list. When the candidate list is empty there is nothing addressable to select, so it bails immediately before even consulting the query. It throws because fixture recording/verification is defined only against real, enumerable hardware candidates.

Solutions

  1. Plug in the Logitech device (or its Bolt/Unifying receiver) and rerun
  2. Verify enumeration works: `openlogi list` shows the device
  3. On macOS, grant Input Monitoring/Accessibility so device enumeration is not blocked
  4. If using agent-backed snapshots, ensure the agent is running with the device visible

Example fix

// before
$ openlogi fixture record --name case1   # no device attached
error: no addressable physical device candidate was found
// after
$ openlogi list        # confirm device present
$ openlogi fixture record --name case1
Defensive patterns

Strategy: fallback

Validate before calling

// shell pre-check: is there anything enumerable?
openlogi list || { echo "no devices visible; connect hardware or check permissions"; exit 2; }

Try / catch

match select_target(&candidates, query) {
    Ok(t) => proceed(t),
    Err(e) if e.to_string().contains("no addressable physical device candidate") => {
        eprintln!("Connect the device (or receiver), then retry.");
        Err(e)
    }
    other => other,
}

Prevention

When it happens

Trigger: Calling `select_target` with an empty `candidates` slice — e.g. running a fixture subcommand with no compatible Logitech device attached, no receiver plugged in, or enumeration returning nothing.

Common situations: Running fixture commands on a machine without the device plugged in; Bluetooth-direct device not paired; on macOS, missing Input Monitoring/permissions hiding devices; agent snapshot unavailable and direct enumeration finds nothing.

Understand the failure class

Background: EmptyResultError / "no results found": when an API or scraper succeeds but returns zero rows — this error's family across 9 libraries.

Related errors


AI-assisted analysis of AprilNEA/OpenLogi@e846e6f4b4 (2026-09-13). Data as JSON: /api/errors/a4701e1f470ec663. Report an issue: GitHub.

Appendix: source

Thrown at crates/openlogi-cli/src/cmd/fixture/target_selection.rs:15

//! Strict fixture target selection with privacy-safe diagnostics.

use std::fmt::Write as _;

use anyhow::{Result, anyhow, bail};
use openlogi_core::hid::DeviceRoute;

pub(super) trait FixtureTarget: Clone {
    fn route(&self) -> &DeviceRoute;
    fn display_name(&self) -> &str;
}

pub(super) fn select_target<T: FixtureTarget>(candidates: &[T], query: Option<&str>) -> Result<T> {
    if candidates.is_empty() {
        bail!("no addressable physical device candidate was found");
    }

    let mut matches = match query {
        Some(query) => candidates
            .iter()
            .filter(|candidate| {
                candidate.display_name().eq_ignore_ascii_case(query)
                    || candidate.route().to_string() == query
            })
            .cloned()
            .collect::<Vec<_>>(),
        None if candidates.len() == 1 => candidates.to_owned(),
        None => Vec::new(),
    };
    if matches.len() != 1 {
        let message = match (query, matches.len()) {
            (Some(_), 0) => "no candidate exactly matched --device",
            (Some(_), _) => "--device matched more than one candidate",

View on GitHub (pinned to e846e6f4b4)