AprilNEA/OpenLogi · error

a retained HID++ route has no captured capability facts…

Error message

a retained HID++ route has no captured capability facts; refusing to guess setting support (no profile was written)

What it means

Raised in `capture_hidpp_settings` when the retained device's `capabilities` field is `None`. The capture refuses to guess which settings (DPI, wheel, lighting) a device supports: without the agent's captured capability facts it cannot decide between Supported/Unsupported/Unavailable, so it aborts without writing a profile. Capability facts come from the agent's probe; their absence means the device was never probed or the facts were dropped.

Solutions

  1. Wait for the agent to finish probing the device (open the GUI or run `openlogi list` and confirm capability details appear), then retry the capture.
  2. Reconnect the device so the agent re-probes it.
  3. Restart the agent to force a full re-enumeration.
  4. If capabilities never appear, the device's HID++ probe is failing — check agent logs and file a device-support issue.

Example fix

// confirm capabilities exist before recording
openlogi list --verbose   # device shows capability facts
openlogi fixture record profile --id my-mouse --name "My Mouse" --output mouse.json
Defensive patterns

Strategy: validation

Validate before calling

// pre-check: device must have probed capability facts
let ready = |snap: &AgentSnapshot, sel: &str| snap.inventory.iter()
    .flat_map(|inv| inv.paired.iter())
    .any(|d| d.capabilities.is_some());
if !ready(&snapshot, selector) { eprintln!("device not yet probed; wait or reconnect"); }

Type guard

fn has_capabilities(d: &PairedDevice) -> bool { d.capabilities.is_some() }

Try / catch

// abort cleanly and prompt a probe wait
match capture_hidpp_settings(...).await {
    Err(e) if e.to_string().contains("no captured capability facts") => {
        eprintln!("device not probed yet; reconnect and retry");
    }
    other => other,
}

Prevention

When it happens

Trigger: Recording a profile for an inventory device that the running agent has not probed — `PairedDevice.capabilities` is `None` in the snapshot, e.g. a freshly paired or half-enumerated device.

Common situations: Device just plugged/paired and the agent hasn't finished its probe; device in a degraded state where probing failed at agent startup; snapshot served by the mock or an older agent that omits capabilities.

Related errors


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

Appendix: source

Thrown at crates/openlogi-cli/src/cmd/fixture/record_profile.rs:277

    let mut settings = Vec::with_capacity(retained.paired.len());
    for ((source_route, profile_route), device) in source_routes
        .iter()
        .zip(profile_routes)
        .zip(&retained.paired)
    {
        settings.push(capture_hidpp_settings(client, source_route, profile_route, device).await?);
    }
    Ok((vec![retained], Vec::new(), settings, selected_route))
}

async fn capture_hidpp_settings(
    client: &AgentClient,
    source_route: &DeviceRoute,
    profile_route: DeviceRoute,
    device: &PairedDevice,
) -> Result<ProfileDeviceSettings> {
    let capabilities = device.capabilities.ok_or_else(|| {
        anyhow!(
            "a retained HID++ route has no captured capability facts; refusing to guess setting \
             support (no profile was written)"
        )
    })?;

    let dpi = match capability_setting(device.online, capabilities.pointer) {
        Some(setting) => setting,
        None => {
            semantic_read(
                "DPI",
                client.read_dpi(context::current(), source_route.clone()),
            )
            .await?
        }
    };
    let smartshift = if device.online {
        semantic_read(
            "SmartShift",

View on GitHub (pinned to e846e6f4b4)