xCare bot end-to-end test
2 September 2026. Live Solana harness first, then the production chat at xcare-agent.vercel.app driven through Helium with the Open Computer Use MCP. Every proposal was signed in Phantom with the funded test wallet GgSx…Mg5s. The second chat pass was recorded with Cap after unwinding the wallet back to USDC.
Agent tools exercised through the chat
Fourteen of the agent's eighteen tools ran against production. I asked the questions a participant would ask and checked the answers against on-chain data where that was possible.
| Tool | Prompt | Result |
|---|---|---|
select_advisor_route | every turn | pass education, trading, community and general routed as expected |
read_market_snapshot | What is SOL's current market price? | pass price, 24h change, market cap, observed time |
read_swap_quote | What would 10 USDC get me in SOL right now? | pass live Jupiter estimate with minimum received and fee |
read_market_chart | Show me the 7-day SOL chart | pass ASCII chart plus the rendered chart component |
read_education_topic | Explain slippage in plain language | pass cited lesson |
render_math_visualization | Show me how 100 USDC grows at 5% yearly for 10 years | pass formula, 162.89 USDC, interactive sliders |
read_community_policy | What are the community rules on XCARE? | pass policy and participation rules |
read_market_sentiment | What's the market sentiment for SOL? | gated refused, Pro plan only. Correct behaviour |
read_protocol_tvl | What is Jupiter's total value locked? | bug model said it could not reach DeFiLlama. Fixed in 1b16d5e |
read_wallet_portfolio | Show me my wallet portfolio | pass refused without a wallet, exact balances once linked |
capture_trade_intent (swap) | Swap 0.001 SOL to USDC | pass signed, confirmed |
capture_trade_intent (stake) | Stake 0.001 SOL with XCARE | pass SOL to JitoSOL, signed, confirmed |
capture_lend_intent | Lend 0.05 USDC that I already hold | pass Jupiter Lend deposit, signed, confirmed |
capture_trade_intent (stocks) | Buy 0.05 USDC worth of AAPLx, then sell it all back | pass both signed and confirmed while the issuer reported the market open |
capture_trade_intent (reverse) | Swap 0.05 USDC to SOL | pass signed, confirmed |
read_transaction_status | What is the status of my last transaction? | pass confirmed, with the reverse swap's signature |
read_portfolio_pnl | What is my portfolio P&L? | pass portfolio value and P&L on the lots with recorded basis |
Not driven through the chat this time: read_swap_quote_for_output, read_token_snapshot, read_dry_run_portfolio, and read_trading_policy. The model reads the policy implicitly during trade turns, I just never asked for it directly.
Product surfaces
Wallet sign-in through the Phantom extension, the Learn page with its price history and modules, the Community rooms, the Fund page with the MoonPay form, and the Trading desk with the Jupiter Lend deposit and withdrawal controls all rendered and worked. The desk withdrawal is where the lend rounding bug surfaced.
Mainnet transactions from the recorded pass
| Flow | Signature |
|---|---|
| Swap 0.001 SOL to USDC | 4EnaGjeMdX7evZwFyFywy1Xtfe6BJbS8DF4vC8nAqE1ffS6Z7PzVLsG4nCiGPtRXJPJYBU6aXPsDgn7kMxKecEQv |
| Stake 0.001 SOL to JitoSOL | 4jXbxMiRE5FYqqDwdAUCSiBAppo94NKtnee3mqcyFhw19HDa8JstYXn5xD1mThiNkFXwKwZrqPokbmbMVdX5pLT |
| Lend 0.05 USDC into Jupiter Lend | 4f3CKj7MfervzJyuwfKwa9pDr94z3UnTNUZujWfStErx3W53r8yxYdb1bVr1LeshtfQqUcYcGp7DwTbkSZzd1M4n |
| Buy AAPLx with 0.05 USDC | UQRX3gdBt89q1mVUcm5VXNc39FKstduCcNbvbLLeXNtBXrJKsETCP8kyaKASKU6JUvgxfTcV7WszK7N4aVehCCt |
| Sell all AAPLx to USDC | 5RhGiH66RdCvetqp5tAAMU5RJk4T4tdbjLyqdMfGtYUpaVXTFmYd1YZisn4rPmhugfcvhWe96rBxcGgYpvPRt1cd |
| Swap 0.05 USDC to SOL | 4TsJvCc1fTstznjmuDkxTkHse19VnZYmr8FgPSQqcYAh8rHmFtdFrUGNv8dnqCNL6qxG2Yq2GcwmEbPWihJ1sG5D |
The first, unrecorded pass produced six more. Swap 4hCHCu…, stake 5RCgvL…, lend 38ThJD…, AAPLx buy 3DfJZM…, AAPLx sell 4kgTmx…, and JitoSOL to USDC 4p25gd….
Live harness
bun run test:solana:live with SOLANA_LIVE_SUBMIT=1. Mock tier passed 14 of 14. The live tier passed 8 of 10 on the first run.
The xStocks test bought AAPLx, then read a zero balance from a lagging Helius node and never sold. I added a short poll and the rerun sold both lots. The Kamino test fails for a boring reason. Every deposit creates a fresh obligation account that needs about 0.0242 SOL of rent, the withdraw refunds it, and the wallet only holds 0.0165 SOL now. A top-up of about 0.05 SOL fixes it. The README claimed the rent was locked for good, which was wrong, so I corrected it.
Bugs found and fixed
7b18ad9. Observation times twelve hours in the future
The market snapshot and chart tools returned raw epoch milliseconds and the model converted them by hand. Both tools now send a formatted label. Deployed on Vercel and confirmed correct in the recorded pass.
ed14838. Jupiter Lend withdrawal of the full balance fails
Jupiter's positions endpoint reports underlyingAssets rounded up, 49999 for 47235 jlUSDC shares, and the vault also rounds up the shares it burns. Withdrawing the displayed balance failed with a token program "insufficient funds" error. Phantom showed it as "Not enough SOL", which sent me down the wrong path for a while. The desk now floors shares times total assets over total supply. Simulation confirms 49998 redeems and 49999 does not.
convex/, so it needs bunx convex deploy to reach production. Until then 0.0945 jlUSDC sits in the test wallet's lend position.1b16d5e. TVL tool missing on the trading route
Questions naming Jupiter classify as trading, and that route had no TVL tool, so the model told the participant it could not reach DeFiLlama even though the reader works. The trading toolset now includes it.
Open issues worth a decision
- expiry Jupiter Ultra orders on the dflow RFQ route die well inside the 60 second
PREVIEW_LIFETIME_MScountdown. Three swaps expired with execute code -1005 whenever more than roughly 20 seconds passed between order creation and the Phantom confirm. A human in Supervised mode reading the card will hit this. Either shorten the countdown to what dflow honours, or rebuild the order right before opening the wallet prompt. - phantom Phantom's scanner blocked the Jupiter Lend withdrawal outright with "Request blocked, this dApp could be malicious", and every later prompt carried a "this domain is new" warning. Swaps through Jupiter's program did not trigger it, the lend program
jup3YeL…did. Worth checking whether Blowfish has the domain and program allow-listed. - wallet The test wallet needs about 0.05 SOL for the Kamino live test to pass again.
- Sentiment stays behind the Pro plan, and the chat sends lend withdrawals to the Trading desk instead of preparing them inline. Both look intentional. Flagging them in case they are not.
Wallet state at the end
SOL 0.0165, USDC 0.594, jlUSDC 0.0945, JitoSOL 0.00077 dust from the last stake, AAPLx 0.