You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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
Pair via pair_ledger_live. Confirm get_ledger_status returns paired: true with topic + expiresAt + accounts.
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.
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).
Description
Summary
get_ledger_statusreturnspaired: truebased 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. Subsequentsend_transactioncalls publish to a topic nobody's listening on, hang/time out, and surface as opaque[object Object]errors.Repro
pair_ledger_live. Confirmget_ledger_statusreturnspaired: truewith topic + expiresAt + accounts.expiresAtis still in the future.prepare_swap→preview_send→send_transaction(confirmed:true).[object Object]error. LL logs show no session_request for the MCP's topic. Pre-flightget_ledger_statuscontinues reporting paired:true.Expected
Either:
get_ledger_statusactively probes the relay (or pings Ledger Live via WCwc_session_ping) before claiming paired, returningpaired: falseorpaired: "stale"if the round-trip fails. ORliveness: "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: truebased purely on local cachedtopic/expiresAt. The agent has no signal that the relay is dead until the send fails opaquely.Why it matters
pairedfield would catch it programmatically.[object Object]error makes diagnosis hard — the user has to dump LL logs and grep for missing session_request to figure out what happened.wc_session_pingor 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
```
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).