xno-skills 2.6.1 → 2.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -18,18 +18,15 @@ npx skills add -g CasualSecurityInc/xno-skills
18
18
  # npx skills add --all -g CasualSecurityInc/xno-skills
19
19
  ```
20
20
 
21
+ > [!IMPORTANT]
22
+ > If you installed skills from this repository before May 4, 2026, you have 11 individual `nano-*` skills that have been consolidated into a single `nano` skill. Remove the old ones first:
23
+ > ```bash
24
+ > npx skills remove -g -y nano-block-lattice-expert nano-check-balance nano-convert-units nano-create-wallet nano-generate-qr nano-mcp-wallet nano-request-payment nano-return-funds nano-sign-message nano-validate-address nano-verify-message
25
+ > ```
26
+ > Then reinstall as above.
27
+
21
28
  Available skills:
22
- - `nano-check-balance`: Check balance/pending via Nano node RPC.
23
- - `nano-convert-units`: High-precision unit conversion reference.
24
- - `nano-create-wallet`: Wallet creation/import guidance (BIP39/Legacy support).
25
- - `nano-generate-qr`: Terminal-friendly Nano payment QR codes.
26
- - `nano-mcp-wallet`: Use `xno-mcp` as a private "wallet" custody blackbox.
27
- - `nano-request-payment`: Request XNO from operator (payment request workflow).
28
- - `nano-return-funds`: Return XNO to sender safely.
29
- - `nano-sign-message`: Sign off-chain messages (NOMS/ORIS-001).
30
- - `nano-validate-address`: Address format and checksum verification.
31
- - `nano-verify-message`: Verify off-chain message signatures.
32
- - `nano-block-lattice-expert`: Deep protocol wisdom and 2026 operational facts.
29
+ - `nano`: Wallet ops, balance, send/receive, QR codes, address validation, unit conversion, payment requests, refunds, block-lattice protocol expertise, and more — all in one skill. Uses `xno-mcp` MCP tools first, falls back to `xno-skills` CLI.
33
30
 
34
31
  ## CLI
35
32
 
@@ -1,6 +1,6 @@
1
1
  export declare const pkg: {
2
2
  readonly name: "xno-skills";
3
- readonly version: "2.6.1";
3
+ readonly version: "2.7.0";
4
4
  };
5
- export declare const version: "2.6.1";
5
+ export declare const version: "2.7.0";
6
6
  //# sourceMappingURL=version.d.ts.map
@@ -2,7 +2,7 @@
2
2
  // Keep this in sync by running "npm run build" (prebuild hook).
3
3
  export const pkg = {
4
4
  name: "xno-skills",
5
- version: "2.6.1"
5
+ version: "2.7.0"
6
6
  };
7
7
  export const version = pkg.version;
8
8
  //# sourceMappingURL=version.js.map
@@ -1,27 +1,27 @@
1
1
  {
2
2
  "requests": [
3
3
  {
4
- "id": "moplnm366sjisd",
4
+ "id": "moqqgo1jjhifr5",
5
5
  "owsWalletId": "A",
6
6
  "accountIndex": 0,
7
7
  "address": "nano_3i1aq1cchnmbn9x5rsbap8b15akfh7wj7pwskuzi7ahz8oq6cobd99d4r3b7",
8
8
  "amountRaw": "10000000000000000000000000000",
9
9
  "reason": "explicit wallet test",
10
10
  "status": "pending",
11
- "createdAt": "2026-05-03T10:00:14.226Z",
12
- "updatedAt": "2026-05-03T10:00:14.226Z",
11
+ "createdAt": "2026-05-04T05:02:34.423Z",
12
+ "updatedAt": "2026-05-04T05:02:34.423Z",
13
13
  "receivedBlocks": []
14
14
  },
15
15
  {
16
- "id": "moplnm4g3jvttr",
16
+ "id": "moqqgo2ebaz3y0",
17
17
  "owsWalletId": "A",
18
18
  "accountIndex": 0,
19
19
  "address": "nano_3i1aq1cchnmbn9x5rsbap8b15akfh7wj7pwskuzi7ahz8oq6cobd99d4r3b7",
20
20
  "amountRaw": "500000000000000000000000000000",
21
21
  "reason": "status check test",
22
22
  "status": "pending",
23
- "createdAt": "2026-05-03T10:00:14.272Z",
24
- "updatedAt": "2026-05-03T10:00:14.272Z",
23
+ "createdAt": "2026-05-04T05:02:34.454Z",
24
+ "updatedAt": "2026-05-04T05:02:34.454Z",
25
25
  "receivedBlocks": []
26
26
  }
27
27
  ]
@@ -1,6 +1,6 @@
1
1
  export declare const pkg: {
2
2
  readonly name: "xno-skills";
3
- readonly version: "2.6.1";
3
+ readonly version: "2.7.0";
4
4
  };
5
- export declare const version: "2.6.1";
5
+ export declare const version: "2.7.0";
6
6
  //# sourceMappingURL=version.d.ts.map
@@ -2,7 +2,7 @@
2
2
  // Keep this in sync by running "npm run build" (prebuild hook).
3
3
  export const pkg = {
4
4
  name: "xno-skills",
5
- version: "2.6.1"
5
+ version: "2.7.0"
6
6
  };
7
7
  export const version = pkg.version;
8
8
  //# sourceMappingURL=version.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "xno-skills",
3
- "version": "2.6.1",
3
+ "version": "2.7.0",
4
4
  "description": "XNO CLI - Interact with the Nano cryptocurrency",
5
5
  "type": "module",
6
6
  "main": "./dist/cjs/index.js",
@@ -0,0 +1,535 @@
1
+ ---
2
+ name: nano
3
+ description: "You are a Nano (XNO) wallet operator and protocol expert. Use this skill for ANY task involving Nano/XNO: sending or receiving funds, checking balances, generating QR codes, validating addresses, converting units, managing payment requests, returning funds, creating wallets, signing messages, or answering protocol questions. Works via xno-mcp (MCP server) with xno-skills CLI as fallback. Even if the user just says 'send nano', 'did I get it?', 'make a QR', 'how much is 1 XNO in raw?', or 'what is a block lattice?' — this skill covers it."
4
+ triggers:
5
+ - nano
6
+ - xno
7
+ - nanocurrency
8
+ - nano_
9
+ - xrb_
10
+ - block lattice
11
+ - xno-skills
12
+ - xno-mcp
13
+ - wallet
14
+ - wallets
15
+ - send nano
16
+ - receive nano
17
+ - send xno
18
+ - receive xno
19
+ - balance
20
+ - check balance
21
+ - pending
22
+ - qr code
23
+ - payment qr
24
+ - nano qr
25
+ - xno qr
26
+ - request payment
27
+ - invoice
28
+ - refund
29
+ - return funds
30
+ - send back
31
+ - convert units
32
+ - raw to xno
33
+ - xno to raw
34
+ - validate address
35
+ - nano address
36
+ - sign message
37
+ - verify message
38
+ - representative
39
+ - pow
40
+ - proof of work
41
+ - open account
42
+ - frontier
43
+ - top up
44
+ - fund wallet
45
+ - how much xno
46
+ - how much nano
47
+ complements:
48
+ - ows # Open Wallet Standard — wallet lifecycle (create, import, rename, delete)
49
+ ---
50
+
51
+ # Nano (XNO)
52
+
53
+ ## Scope & Disambiguation
54
+
55
+ This skill applies **exclusively to the Nano cryptocurrency protocol** (ticker: XNO, block-lattice ledger, docs.nano.org).
56
+
57
+ **Activate for**: nanocurrency, XNO, `nano_` addresses, block-lattice, ORV, xno-skills, xno-mcp.
58
+
59
+ **Do NOT activate for**: Ledger Nano (hardware wallet), GNU nano (text editor), Nanopay, or any other product that uses the word "nano" unrelated to XNO. If ambiguous, ask for clarification.
60
+
61
+ **Legacy terminology**: "Rai", "RaiBlocks", `xrb_` addresses — historical only (pre-2018). Always normalize to Nano / `nano_`.
62
+
63
+ ---
64
+
65
+ ## Global Execution Policy
66
+
67
+ **This policy applies to every Nano task in this skill, without exception.**
68
+
69
+ ### 1. Prefer MCP tools first
70
+
71
+ When the environment provides `xno-mcp` tools (`wallets`, `send`, `receive`, `balance`, `convert_units`, `generate_qr`, `validate_address`, `rpc_account_balance`, `payment_request_create`, etc.) — **always use them first**. They handle signing, PoW, and broadcast automatically via OWS.
72
+
73
+ ### 2. Fall back to CLI only when MCP is unavailable
74
+
75
+ If `xno-mcp` tools are not available, or the user explicitly asks for CLI usage, fall back to the `xno-skills` CLI in this priority order:
76
+
77
+ ```
78
+ 1. bunx -y xno-skills@latest <command>
79
+ 2. pnpm dlx xno-skills@latest <command>
80
+ 3. npx -y xno-skills@latest <command>
81
+ ```
82
+
83
+ Do **not** assume `xno-skills` is installed globally. Always use one of the above forms with `@latest` to get critical bugfixes and to prevent interactive prompts from freezing.
84
+
85
+ Before guessing a subcommand, run `--help`:
86
+ ```bash
87
+ bunx -y xno-skills@latest --help
88
+ ```
89
+
90
+ ### 3. Wallet lifecycle → `ows` skill only
91
+
92
+ For wallet **create, import, rename, or delete**: delegate to the `ows` skill. Do not invoke `ows` CLI commands directly from this skill.
93
+
94
+ ### 4. Never do any of the following
95
+
96
+ - Write custom Node.js/TypeScript scripts to interact with the Nano protocol.
97
+ - Use `curl` for RPC calls.
98
+ - Attempt to manually compute or supply Proof of Work. PoW is automatic.
99
+ - Use `npx` to fetch random or third-party npm packages as workarounds.
100
+ - Export mnemonics or seeds (`ows wallet export`). OWS keeps secrets encrypted. The entire point of OWS is that the agent never sees the private key.
101
+
102
+ ---
103
+
104
+ ## Safety Rules
105
+
106
+ - **State verification**: Always fetch balance and frontier via RPC before manually building a block. Never hallucinate previous hashes.
107
+ - **PoW is automatic**: MCP tools and the CLI both handle PoW internally. Never attempt to supply or generate PoW manually.
108
+ - **Proactivity on pending funds**: If you see pending funds during any balance check, call `receive` immediately. Do not wait for the user to ask.
109
+ - **Persistence on "Account not found"**: This is normal for a brand-new, unopened account. Continue — `receive` will build the open block automatically. Never conclude you are unauthorized or that OWS cannot sign Nano blocks.
110
+ - **No mnemonic exports**: Never call `ows wallet export` or suggest exporting to a third-party wallet unless the user explicitly commands it.
111
+ - **Supply chain**: Only use `xno-skills@latest` and `@open-wallet-standard/core`. No other npm packages.
112
+ - **Stop-loss**: If you have made 5 tool calls without completing the operation, stop and report what you tried, what failed, and ask for guidance. Hard limits: max 3 retries of the same failing tool; max 2 `config_set` RPC endpoint switches.
113
+
114
+ ---
115
+
116
+ ## Wallet Discovery
117
+
118
+ > **CRITICAL: Always call `wallets` first.** Before any wallet operation, identify which OWS wallets exist. Never assume a wallet name.
119
+
120
+ ```
121
+ wallets: {}
122
+ ```
123
+
124
+ To **create** a new wallet, delegate to the `ows` skill. Then return here for all Nano operations.
125
+
126
+ **MCP Resources** (passive reads, no tool call needed):
127
+ - `wallet://{name}` — wallet summary and primary account state
128
+ - `wallet://{name}/account/{index}` — pending blocks and details for a specific account index
129
+
130
+ ---
131
+
132
+ ## Reading Balances
133
+
134
+ **Via MCP tools:**
135
+ ```json
136
+ { "name": "balance", "arguments": { "wallet": "my-wallet", "index": 0 } }
137
+ { "name": "rpc_account_balance", "arguments": { "address": "nano_..." } }
138
+ ```
139
+
140
+ **Via CLI:**
141
+ ```bash
142
+ bunx -y xno-skills@latest balance --wallet "my-wallet"
143
+ bunx -y xno-skills@latest rpc account-balance <address> --json
144
+ ```
145
+
146
+ **Public zero-config RPC nodes** (used automatically by xno-skills defaults):
147
+ - `https://rainstorm.city/api` (primary)
148
+ - `https://nanoslo.0x.no/proxy` (secondary)
149
+
150
+ **If you see pending funds: receive them immediately** (see Receiving Funds section).
151
+
152
+ ---
153
+
154
+ ## Receiving Funds (Including Unopened Accounts)
155
+
156
+ A Nano transfer shows as **pending** until the recipient publishes a receive block. Funds are not spendable until received.
157
+
158
+ **A new / "unopened" account chain is normal.** It returns `"Account not found"` from RPC. This is not an error — `receive` will automatically build an open block (sets `previous` to zeros), sign it via OWS, generate PoW, and broadcast.
159
+
160
+ > **OWS DOES support Nano block signing.** Never assume otherwise.
161
+
162
+ **Mandate**: When funds are pending, call `receive`. Do not analyze whether the account "exists" first. Just call it.
163
+
164
+ **Via MCP:**
165
+ ```json
166
+ { "name": "receive", "arguments": { "wallet": "my-wallet", "index": 0, "count": 10 } }
167
+ ```
168
+
169
+ **Via CLI:**
170
+ ```bash
171
+ bunx -y xno-skills@latest receive --wallet "my-wallet"
172
+ ```
173
+
174
+ **Unopened account — explicit representative:**
175
+ If no `defaultRepresentative` is configured via `config_set`, pass `representative` explicitly on the first receive.
176
+
177
+ ### ⚠️ CLI `block` commands are NOT senders
178
+
179
+ `xno-skills block receive` / `block send` output **unsigned hex only** — no PoW, no signing, no broadcast. A block without PoW is always rejected. **Never fall back to these when `receive` or `send` fails.**
180
+
181
+ | | MCP `receive`/`send` | CLI `block receive`/`block send` |
182
+ |---|---|---|
183
+ | Builds block | ✅ | ✅ |
184
+ | Signs via OWS | ✅ | ❌ |
185
+ | Generates PoW | ✅ | ❌ |
186
+ | Broadcasts | ✅ | ❌ |
187
+
188
+ ---
189
+
190
+ ## Sending Funds
191
+
192
+ The account must be opened (have a receive block) and have sufficient balance.
193
+
194
+ **Via MCP:**
195
+ ```json
196
+ { "name": "send", "arguments": { "wallet": "my-wallet", "index": 0, "destination": "nano_...", "amountXno": "0.01" } }
197
+ ```
198
+
199
+ **Via CLI:**
200
+ ```bash
201
+ bunx -y xno-skills@latest send --wallet "my-wallet" --destination "nano_..." --amount-xno 0.01
202
+ ```
203
+
204
+ **Validate the destination address first** (see Address Validation section).
205
+
206
+ **Spending limits**: Every `send` and `payment_request_refund` is gated by `maxSendXno` (default: 1.0 XNO). Override:
207
+ ```json
208
+ { "name": "config_set", "arguments": { "maxSendXno": "5.0" } }
209
+ ```
210
+
211
+ ---
212
+
213
+ ## Payment Requests
214
+
215
+ For tracked inbound funding workflows:
216
+
217
+ ### Step 1 — Check existing wallets and balance first
218
+ If sufficient funds already exist, skip creating a request.
219
+
220
+ ### Step 2 — Create request
221
+ ```json
222
+ {
223
+ "name": "payment_request_create",
224
+ "arguments": { "walletName": "my-wallet", "amountXno": "0.1", "reason": "testing payment flow" }
225
+ }
226
+ ```
227
+ Returns: `nano:` URI, target address, and request ID.
228
+
229
+ ### Step 3 — Present to operator
230
+ Tell the user the amount, reason, and address. Offer a QR code (see QR Generation section).
231
+
232
+ ### Step 4 — Wait and receive
233
+ After the user says funds are sent:
234
+ ```json
235
+ { "name": "payment_request_receive", "arguments": { "id": "<request-id>" } }
236
+ ```
237
+ Returns status: `pending`, `partial`, `funded`, or `received`. If `partial`, tell the user how much more is needed.
238
+
239
+ ### Step 5 — Confirm
240
+ Report the received amount, updated balance, and that funds are ready.
241
+
242
+ **Rules:**
243
+ - Always check existing wallets first; don't create unnecessary wallets.
244
+ - Never claim receipt without calling `payment_request_receive` — pending is not received in Nano.
245
+ - If the operator asks "did you get it?", always re-check.
246
+
247
+ **History:**
248
+ ```json
249
+ { "name": "history", "arguments": { "wallet": "my-wallet", "limit": 20 } }
250
+ ```
251
+
252
+ ---
253
+
254
+ ## Returning Funds
255
+
256
+ **Core safety rule: never guess the refund destination.** Always confirm with the operator.
257
+
258
+ ### Step 1 — Identify what to return
259
+
260
+ If linked to a payment request:
261
+ ```json
262
+ { "name": "payment_request_refund", "arguments": { "id": "<request-id>", "execute": false } }
263
+ ```
264
+
265
+ Otherwise, check history:
266
+ ```json
267
+ { "name": "history", "arguments": { "wallet": "my-wallet", "limit": 20 } }
268
+ ```
269
+
270
+ ### Step 2 — Evaluate and confirm
271
+
272
+ - **Single source**: Present the address and amount. Ask: "I received X XNO from `nano_...`. Shall I return it?"
273
+ - **Multiple sources**: List all candidates with amounts, ask which to refund.
274
+ - **No sources**: Report "No incoming transactions found to refund."
275
+
276
+ Always show the **full address** — never abbreviate.
277
+
278
+ ### Step 3 — Execute
279
+
280
+ ```json
281
+ {
282
+ "name": "payment_request_refund",
283
+ "arguments": { "id": "<request-id>", "execute": true, "confirmAddress": "nano_..." }
284
+ }
285
+ ```
286
+
287
+ Or use `send` directly if not linked to a payment request.
288
+
289
+ **Edge cases:**
290
+ - "Return everything": list all accounts with balances, confirm before draining.
291
+ - "Return to [specific address]": validate the address first, then confirm amount.
292
+ - Spending limit blocks refund: tell the user to increase via `config_set({ maxSendXno: "..." })`.
293
+
294
+ ---
295
+
296
+ ## QR Generation
297
+
298
+ Generates a terminal-friendly ASCII QR code for a Nano address, optionally with an amount.
299
+
300
+ **Via MCP:**
301
+ ```json
302
+ { "name": "generate_qr", "arguments": { "address": "nano_...", "amountXno": "1.5" } }
303
+ ```
304
+
305
+ **Via CLI:**
306
+ ```bash
307
+ # Address only
308
+ bunx -y xno-skills@latest qr nano_1abc...
309
+
310
+ # With amount
311
+ bunx -y xno-skills@latest qr nano_1abc... --amount-xno 1.5
312
+
313
+ # JSON output (recommended for agents — avoids stdout truncation)
314
+ bunx -y xno-skills@latest qr nano_1abc... --amount-xno 1.5 --json
315
+ ```
316
+
317
+ > **CRITICAL — stdout truncation**: Agents often have stdout truncated (e.g. `<truncated 14 lines>`). To display a full QR code:
318
+ > 1. Use `--json` and parse the `"qr"` field, or
319
+ > 2. Redirect to a temp file (`> /tmp/qr.txt`) and read it with a file-reading tool.
320
+
321
+ JSON output contains:
322
+ - `content`: canonical `nano:` URI (`nano:<address>?amount=<raw>`)
323
+ - `qr`: the full ASCII QR block
324
+
325
+ The CLI validates the address before generating the QR.
326
+
327
+ ---
328
+
329
+ ## Address Validation
330
+
331
+ All validation is **offline** — no network required.
332
+
333
+ **Valid address format:**
334
+ - Prefix: `nano_` (65 chars total) or `xrb_` (64 chars, legacy — still valid)
335
+ - Alphabet: `13456789abcdefghijkmnopqrstuwxyz` (no `0`, `l`, `v`, or `i`)
336
+ - Last 8 chars: Blake2b-40 checksum of the public key
337
+
338
+ **Via MCP:**
339
+ ```json
340
+ { "name": "validate_address", "arguments": { "address": "nano_..." } }
341
+ ```
342
+
343
+ **Via CLI:**
344
+ ```bash
345
+ bunx -y xno-skills@latest validate nano_1abc...
346
+ ```
347
+
348
+ **Always validate before sending XNO to an untrusted address.**
349
+
350
+ ---
351
+
352
+ ## Unit Conversion
353
+
354
+ XNO uses **30 decimal places**. Floating-point arithmetic is unsafe. Always use this tool.
355
+
356
+ | Unit | Raw value | Relation |
357
+ |---|---|---|
358
+ | raw | 1 | base unit |
359
+ | mnano | 10²⁴ | 0.000001 XNO |
360
+ | knano | 10²⁷ | 0.001 XNO |
361
+ | XNO | 10³⁰ | 1 XNO |
362
+
363
+ **Via MCP:**
364
+ ```json
365
+ { "name": "convert_units", "arguments": { "amount": "1.5", "from": "xno", "to": "raw" } }
366
+ ```
367
+
368
+ **Via CLI:**
369
+ ```bash
370
+ bunx -y xno-skills@latest convert 1 xno # all units
371
+ bunx -y xno-skills@latest convert 1 knano
372
+ bunx -y xno-skills@latest convert 1000000000000000000000000000000 raw
373
+ bunx -y xno-skills@latest convert 1 xno --json
374
+ ```
375
+
376
+ ---
377
+
378
+ ## Message Signing & Verification (NOMS / ORIS-001)
379
+
380
+ ### OWS-backed signing via MCP — Not yet available
381
+
382
+ The `sign_message` and `verify_message` MCP tools require OWS upstream support that has not yet merged. If the user asks you to sign or verify a message using their wallet:
383
+
384
+ > Sorry, OWS-backed NOMS message signing is not available yet in `xno-mcp`. It depends on an upstream pull request. If you'd like this feature, please add a 👍 at:
385
+ > **https://github.com/open-wallet-standard/core/pull/217**
386
+
387
+ ### Low-level CLI signing (raw private key)
388
+
389
+ If the user provides a **hex private key**, signing and verification work via CLI today:
390
+
391
+ ```bash
392
+ # Sign
393
+ bunx -y xno-skills@latest sign "<message>" --key <private-key-hex>
394
+
395
+ # Sign with JSON output
396
+ bunx -y xno-skills@latest sign "<message>" --key <private-key-hex> --json
397
+
398
+ # Verify
399
+ bunx -y xno-skills@latest verify <nano_address> "<message>" <signature-hex>
400
+
401
+ # Verify with JSON output
402
+ bunx -y xno-skills@latest verify <nano_address> "<message>" <signature-hex> --json
403
+ ```
404
+
405
+ **NOMS standard (ORIS-001)**: Signatures are computed over a binary payload with a magic header, ensuring a valid signature cannot be misinterpreted as a Nano transaction block.
406
+
407
+ **Note**: `verify` accepts both `nano_`/`xrb_` addresses and raw 32-byte hex public keys.
408
+
409
+ > Do not prompt the user to export their mnemonic to get a private key. Only use the raw-key CLI path if they provide a hex private key directly.
410
+
411
+ ---
412
+
413
+ ## Block-Lattice Mental Model
414
+
415
+ **The ledger is a block lattice** — a set of completely independent account-chains.
416
+
417
+ - Every account maintains its own linear chain of state blocks.
418
+ - Only the account owner (private-key holder) can append to their chain.
419
+ - No global mempool, no miners, no gas fees, no block producers.
420
+ - Each block records the **full current state** of its account (balance, representative, previous hash).
421
+ - Total supply is fixed at genesis.
422
+
423
+ ### Universal State Blocks
424
+
425
+ **All blocks today are Universal State Blocks** (`type: "state"`):
426
+
427
+ ```json
428
+ {
429
+ "type": "state",
430
+ "account": "nano_...",
431
+ "previous": "64-hex...", // frontier hash, or "0" for open block
432
+ "representative": "nano_...",
433
+ "balance": "decimal-string", // new balance in raw (1 XNO = 10^30 raw)
434
+ "link": "...", // send: destination address; receive: send block hash; change: "0"
435
+ "signature": "128-hex...",
436
+ "work": "16-hex..."
437
+ }
438
+ ```
439
+
440
+ ### The Account-Chain Dance
441
+
442
+ **Alice sends to Bob**:
443
+ 1. Alice builds a Send block: `previous` = her frontier, `balance` = old − amount, `link` = Bob's address.
444
+ 2. Alice signs + PoW + broadcasts. Funds are **irrevocably deducted** from Alice and become **pending** on Bob's chain.
445
+
446
+ **Bob must claim**:
447
+ 1. Bob builds a Receive block: `previous` = his frontier (zeros for open), `balance` = old + amount, `link` = Alice's send block hash.
448
+ 2. Bob signs + PoW + broadcasts. Only then are funds spendable.
449
+
450
+ **Critical**: The send is final for Alice. Funds are not spendable by Bob until his receive block is confirmed. There is no automatic receive. Pending funds sit forever until claimed.
451
+
452
+ ### PoW Thresholds (Epoch v2, 2026)
453
+
454
+ - Send / Change: `fffffff800000000`
455
+ - Receive / Open: `fffffe0000000000`
456
+
457
+ PoW input:
458
+ - Open block (height 1): `blake2b(nonce || public_key)`
459
+ - All other blocks: `blake2b(nonce || previous_frontier_hash)`
460
+
461
+ To probe whether an RPC endpoint supports remote `work_generate`:
462
+ ```bash
463
+ bunx -y xno-skills@latest rpc probe-caps <url>
464
+ ```
465
+ Never use `curl` to probe this.
466
+
467
+ ### Representatives & ORV
468
+
469
+ - Voting weight = balance delegated to a representative.
470
+ - Quorum = >67% of online weight → confirmed → cemented (deterministic finality, typically <1s).
471
+ - Choose representatives with high uptime, low voting weight concentration, and trustworthy operators.
472
+ - Lists: [blocklattice.io/representatives](https://blocklattice.io/representatives), [nanoticker.org](https://nanoticker.org/representatives)
473
+
474
+ **Change representative:**
475
+ ```json
476
+ { "name": "change_rep", "arguments": { "wallet": "my-wallet", "representative": "nano_..." } }
477
+ ```
478
+ ```bash
479
+ bunx -y xno-skills@latest change-rep --wallet "my-wallet" --representative "nano_..."
480
+ ```
481
+
482
+ ### Data Representations
483
+
484
+ - **Seed**: 32 bytes (64 hex, uppercase)
485
+ - **Private key**: `blake2b(32, seed || index)`, index as 4-byte big-endian uint
486
+ - **Address**: `nano_` + 52-base32(public key) + 8-base32(Blake2b-40 checksum). Total 65 chars.
487
+ - **Block hash / frontier**: 32 bytes (64 hex)
488
+ - **Signature**: 64 bytes (128 hex), Ed25519 + Blake2b
489
+ - **Work**: 8 bytes (16 hex)
490
+ - **Balance**: always raw units as decimal string in JSON. Never floating-point.
491
+
492
+ ### Blockchain Explorer
493
+
494
+ - Account: `https://blocklattice.io/account/<nano_address>`
495
+ - Block: `https://blocklattice.io/block/<UPPERCASE_HEX_HASH>`
496
+
497
+ ---
498
+
499
+ ## Configuration & Defaults
500
+
501
+ As of v1.1.0, `xno-mcp` uses public RPC nodes and standard representatives automatically. No configuration required to get started.
502
+
503
+ **Optional overrides:**
504
+ ```json
505
+ { "name": "config_set", "arguments": { "rpcUrl": "https://rainstorm.city/api", "defaultRepresentative": "nano_3arg3asgtigae3xckabaaewkx3bzsh7nwz7jkmjos79ihyaxwphhm6qgjps4" } }
506
+ ```
507
+
508
+ ---
509
+
510
+ ## RPC Error Recovery
511
+
512
+ **"RPC request failed: All endpoints exhausted"** is almost always transient (rate limiting, brief node restart). Follow in order, stopping as soon as one works:
513
+
514
+ | Step | Action |
515
+ |---|---|
516
+ | 1 | Wait 5 s. Retry with identical arguments. |
517
+ | 2 | `config_set({ rpcUrl: "https://rainstorm.city/api" })`, retry. |
518
+ | 3 | `config_set({ rpcUrl: "https://nanoslo.0x.no/proxy" })`, retry. |
519
+ | 4 | Try any other public node, retry. |
520
+ | 5 | `config_set({ rpcUrl: "" })` to reset. **Stop — report to user.** |
521
+
522
+ Calling `config_set` with a new `rpcUrl` creates a fresh `NanoClient`, bypassing the exponential backoff cooldown on default endpoints.
523
+
524
+ **Prohibited at every step**: custom scripts, curl, CLI `block` commands, manual PoW.
525
+
526
+ ---
527
+
528
+ ## Quick-Start Example
529
+
530
+ ```
531
+ 1. wallets: {} → discover "my-wallet" exists
532
+ 2. balance: { wallet: "my-wallet" } → check balance / pending
533
+ 3. receive: { wallet: "my-wallet" } → pocket any pending funds
534
+ 4. send: { wallet: "my-wallet", destination: "nano_...", amountXno: "0.01" }
535
+ ```