Skip to content

[agent-request] get_ledger_status reports paired:true when WC session is dead at the relay #614

Description

@szhygulin

Description

Summary

get_ledger_status returns paired: true based on MCP-side cached WC client state (topic, expiresAt, accounts) without probing whether Ledger Live is still listening on that topic at the WC relay. The session can be dead Live-side (LL restarted, session pruned, user signed out) while the MCP's local view says alive. Subsequent send_transaction calls publish to a topic nobody's listening on, hang/time out, and surface as opaque [object Object] errors.

Repro

  1. Pair via pair_ledger_live. Confirm get_ledger_status returns paired: true with topic + expiresAt + accounts.
  2. Drop the LL-side session out-of-band (close LL, sign out, or wait long enough for LL to prune it). MCP-side cached state is unchanged — expiresAt is still in the future.
  3. prepare_swappreview_sendsend_transaction(confirmed:true).
  4. Observe: opaque [object Object] error. LL logs show no session_request for the MCP's topic. Pre-flight get_ledger_status continues reporting paired:true.

Expected

Either:

  • (a) get_ledger_status actively probes the relay (or pings Ledger Live via WC wc_session_ping) before claiming paired, returning paired: false or paired: "stale" if the round-trip fails. OR
  • (b) Add a liveness: "confirmed" | "unverified" | "failed" field with semantics, and have the agent surface it pre-send so the user knows whether the pin is fresh.

Actual

paired: true based purely on local cached topic / expiresAt. The agent has no signal that the relay is dead until the send fails opaquely.

Why it matters

  • Inv v0.2.1: publish to official MCP Registry #9 of the preflight skill instructs the user to confirm the topic suffix in LL → Settings → Connected Apps before the first send. That's a manual step. A live paired field would catch it programmatically.
  • The opaque [object Object] error makes diagnosis hard — the user has to dump LL logs and grep for missing session_request to figure out what happened.
  • Fix is small: one extra round-trip (wc_session_ping or equivalent) on the get_ledger_status hot path, optionally cached for a few seconds.

Evidence

Real session today (2026-04-30): MCP reported paired=true, topic `282be563ba359c9398b3d810a3c856967ebfb6c2515b69498679a7ae31060570`, expiresAt 1777973736000 (4 days out). Two `send_transaction` attempts on a stETH approve from `0xC0f5…4075` failed with `[object Object]`. LL logs covered the send-time window (last entry 18:41:59 UTC, sends were at ~18:40); no occurrence of `282be563` anywhere; the only successful sign_transaction in the window was an unrelated Safe `approveHash` from `0x4f51…F7CA` at 17:20:38 UTC, on a different WC session.

Category: `bug_report`

Context

  • Tool attempted: `send_transaction`
  • Chain: ethereum
  • Error observed:
    ```
    send_transaction returned opaque [object Object] error twice on the same handle (prepare_swap stETH→ETH approve step). Ledger Live logs (~85min window ending at 18:41:59 UTC) show NO sign_transaction event around the send time and no occurrence of the MCP-reported topic suffix `…31060570` anywhere — the relay round-trip was dead Live-side, but get_ledger_status had reported paired:true with expiresAt 4 days out.
    ```

Submitted via the `request_capability` tool in vaultpilot-mcp by an AI agent (Claude Code).

Metadata

Metadata

Assignees

No one assigned

    Labels

    agent-requestFiled by an AI agent via the request_capability toolbug_reportCategory: reports a bug surfaced via an agent's attempt at a capability

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions