@oracle-agent/oracle 0.24.1 → 0.24.2

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.
Files changed (45) hide show
  1. package/dist/assets/skills/chain/SKILL.md +34 -0
  2. package/dist/assets/skills/chain-defi-ecosystem-analysis/SKILL.md +181 -0
  3. package/dist/assets/skills/chain-ecosystem-gap-analysis/SKILL.md +162 -0
  4. package/dist/assets/skills/cross-chain-twap-execution/SKILL.md +125 -0
  5. package/dist/assets/skills/defi-protocol-pmf-assessment/SKILL.md +332 -0
  6. package/dist/assets/skills/evm-contract-research.md +8 -3
  7. package/dist/assets/skills/multi-venue-prepare-only-ranking/SKILL.md +93 -0
  8. package/dist/assets/skills/oracle-access-control/SKILL.md +71 -0
  9. package/dist/assets/skills/oracle-action-arming/SKILL.md +99 -0
  10. package/dist/assets/skills/oracle-airdrop-calculator/SKILL.md +111 -0
  11. package/dist/assets/skills/oracle-desk-product/SKILL.md +341 -0
  12. package/dist/assets/skills/oracle-evm/SKILL.md +55 -0
  13. package/dist/assets/skills/oracle-harness/SKILL.md +41 -0
  14. package/dist/assets/skills/oracle-mcp-install/SKILL.md +140 -0
  15. package/dist/assets/skills/oracle-multichain-convert/SKILL.md +87 -0
  16. package/dist/assets/skills/oracle-native-harness/SKILL.md +32 -0
  17. package/dist/assets/skills/oracle-ownership-gate/SKILL.md +42 -0
  18. package/dist/assets/skills/oracle-public-product-ux/SKILL.md +114 -0
  19. package/dist/assets/skills/oracle-tailscale/SKILL.md +32 -0
  20. package/dist/assets/skills/oracle-thin-client/SKILL.md +47 -0
  21. package/dist/assets/skills/perp-venue-funding-research/SKILL.md +161 -0
  22. package/dist/assets/skills/polymarket/SKILL.md +160 -0
  23. package/dist/assets/skills/protocol-api-key-integration/SKILL.md +141 -0
  24. package/dist/assets/skills/self-custodial-onchain-execution/SKILL.md +1284 -0
  25. package/dist/assets/skills/setup/SKILL.md +40 -0
  26. package/dist/assets/skills/stable-launch-ops/SKILL.md +89 -0
  27. package/dist/assets/skills/trade-loop-circuit-breaker/SKILL.md +441 -0
  28. package/dist/assets/skills/venue-capability-boundaries/SKILL.md +32 -0
  29. package/dist/bin/desk-server.mjs +16 -16
  30. package/dist/bin/oracle-data-mcp.mjs +1 -1
  31. package/dist/bin/oracle-equities.mjs +1 -1
  32. package/dist/bin/oracle-init.mjs +9 -9
  33. package/dist/cli/commands/bootstrap.mjs +1 -1
  34. package/dist/cli/commands/chat.mjs +78 -77
  35. package/dist/cli/commands/doctor.mjs +8 -6
  36. package/dist/cli/commands/eval.mjs +1 -1
  37. package/dist/cli/commands/harness.mjs +6 -6
  38. package/dist/cli/commands/model.mjs +82 -81
  39. package/dist/cli/commands/receipt.mjs +5 -0
  40. package/dist/cli/commands/setup.mjs +1 -1
  41. package/dist/cli/commands/venues.mjs +3 -0
  42. package/dist/cli/commands/watch.mjs +16 -0
  43. package/dist/equities/index.mjs +1 -1
  44. package/dist/index.mjs +1 -1
  45. package/package.json +1 -1
@@ -0,0 +1,140 @@
1
+ ---
2
+ name: oracle-mcp-install
3
+ description: Use when installing Oracle as an MCP server in AI clients.
4
+ ---
5
+
6
+ > Oracle native tools: `oracle_cli` (read/prepare), `vault_status`, `signer_status`, `signer_execute` (needs human confirmationNonce), `skill_load`. No generic shell. No fleet SSH.
7
+
8
+
9
+ # Oracle MCP install
10
+
11
+ ## Quick start
12
+
13
+ ```bash
14
+ oracle bootstrap
15
+ oracle init --apply # generates wallet, starts services
16
+ oracle mcp install claude-code --with-soul
17
+ ```
18
+
19
+ Public MCP is **data + prepare** only:
20
+
21
+ | Server | Purpose |
22
+ |---|---|
23
+ | `oracle-data` | Read prices, quotes, routes, prepare unsigned tx |
24
+
25
+ Signing stays on the user's machine (`oracle sign` / loopback signer). Do not wire a remote control/exec MCP from this public skill.
26
+
27
+ `--with-soul` injects the Oracle SOUL.md as system instructions so Claude/Cursor/etc.
28
+ think like Oracle — same routing logic, chain laws, safety gates.
29
+
30
+ **Target-specific behavior:**
31
+
32
+ | Target | Method | File written |
33
+ |---|---|---|
34
+ | `claude-code` | Prepends SOUL before existing CLAUDE.md | `./CLAUDE.md` |
35
+ | `claude-desktop` | Prepends SOUL to customInstructions in config | `~/Library/Application Support/Claude/claude_desktop_config.json` |
36
+ | `cursor` | Prepends SOUL before existing .cursorrules | `./.cursorrules` |
37
+ | `vscode` | Writes SOUL to Copilot instructions | `./.vscode/instructions.md` |
38
+ | `codex` / `copilot` | Writes SOUL to Copilot instructions | `./.github/copilot-instructions.md` |
39
+ | `chatgpt` | Not supported (returns ok:false) | — |
40
+
41
+ All paths prepend the SOUL before existing content (preserves user's existing rules).
42
+ On dry-run (`--print`), shows the first 500 chars of what would be written.
43
+
44
+ ## Standalone gateway (no Hermes)
45
+
46
+ ```bash
47
+ oracle setup telegram # bot token → Grammy poller
48
+ oracle setup discord # bot token → discord.js
49
+ oracle setup whatsapp # QR code scan → whatsapp-web.js (auto-installs deps)
50
+ oracle setup signal # signal-cli (stub)
51
+ ```
52
+
53
+ Oracle polls messaging APIs directly — no Hermes gateway required. All platforms
54
+ share one process (`oracle gateway` on port 9270), using Oracle's own agent runtime.
55
+ Auto-detects Hermes/OpenClaw and uses whichever is available; falls back to
56
+ Oracle standalone polling if neither is present.
57
+
58
+ For WhatsApp: first run auto-installs `whatsapp-web.js` + `qrcode-terminal`,
59
+ shows a QR code for pairing. Session persists in `~/.config/oracle/.wwebjs_auth`.
60
+
61
+ ## Supported targets
62
+
63
+ | Command | Target config | Method |
64
+ |---|---|---|
65
+ | `oracle mcp install claude-code` | `~/.claude.json` | `claude mcp add-json` CLI, fallback: mergeMcpServers |
66
+ | `oracle mcp install claude-desktop` | Claude Desktop config | mergeMcpServers |
67
+ | `oracle mcp install chatgpt` | ChatGPT connector | Custom installer |
68
+ | `oracle mcp install codex` | OpenAI Codex CLI | Config file merge |
69
+ | `oracle mcp install copilot` | *(alias for codex)* | Same as codex |
70
+ | `oracle mcp install cursor` | `~/.config/cursor/mcp.json` | mergeMcpServers (Linux), platform-aware path |
71
+ | `oracle mcp install vscode` | `.vscode/mcp.json` or global | mergeMcpServers (`--project` for workspace) |
72
+
73
+ ## Flags
74
+
75
+ | Flag | Effect |
76
+ |---|---|
77
+ | `--with-soul` | Injects Oracle SOUL.md into the harness as system instructions |
78
+ | `--project` | VS Code: writes to workspace `.vscode/mcp.json` instead of global |
79
+ | `--print` | Dry-run: shows what would be written, makes no changes |
80
+ | `--json` | Machine-readable output for install results |
81
+
82
+ ## Watchdog
83
+
84
+ ```bash
85
+ oracle mcp watchdog # background: checks every 2m, warns if MCP servers down
86
+ oracle mcp watchdog --once # one-shot health check
87
+ ```
88
+
89
+ ## Wallet setup
90
+
91
+ ```bash
92
+ oracle init --apply # generates fresh wallet at ~/.config/oracle/keys/evm.json (0600)
93
+ oracle sign import # interactive: paste existing private key (hidden input)
94
+ oracle sign import --keyfile <path> # import from file (auto-shreds temp file after import)
95
+ ```
96
+
97
+ Both `oracle sign import` paths **auto-arm** — importing a key sets `ORACLE_EXEC_ENABLED=1`
98
+ in `~/.config/oracle/exec.env`. No separate `oracle exec arm` step needed.
99
+ The intent is the signal: pasting a private key means the user wants to trade immediately.
100
+
101
+ **Rationale:** The user explicitly chose to import their private key and wire the exec MCP.
102
+ Adding a mandatory \"arm\" step on top is unnecessary friction. Import = armed.
103
+
104
+ **Safety boundary:** The key never leaves the local machine. Oracle's wallet is like a
105
+ CLI-native MetaMask — key on disk at 0600, MCP process local to the machine, same trust model.
106
+
107
+ The interactive prompt reassures users:
108
+ ```
109
+ Your key stays local — Oracle never sends it anywhere.
110
+ Paste your EVM private key (0x...):
111
+ >
112
+ ```
113
+ Key goes to stdin, never to shell history. Saved at 0600 permissions.
114
+
115
+ Never use `echo "0xKEY"` or `--key 0x...` — private keys must never hit shell history.
116
+
117
+ ## Print mode
118
+ ```
119
+ oracle mcp print claude-code → shows JSON without writing
120
+ oracle mcp print --target cursor → same for any target
121
+ ```
122
+
123
+ ## Autofill behavior
124
+ Every target auto-detects the user's config, merges Oracle's MCP server specs
125
+ (`oracle-data`), backs up the original with
126
+ `.bak-oracle-<timestamp>`, and reports the result. No manual JSON required.
127
+
128
+ ## Adding a new target
129
+ 1. Create `src/cli/mcp-targets/<name>.mjs`
130
+ 2. Export `install<Name>({ oracleRoot, operator, withControl, project, printOnly, cwd })`
131
+ 3. Import `buildServerSpecs`, `mergeMcpServers`, `report` from `./shared.mjs`
132
+ 4. Import in `src/cli/commands/mcp.mjs`
133
+ 5. Add to the install switch and `usage()` text
134
+
135
+ ## Pitfalls
136
+ - `ORACLE_DESK_URL` is not used for MCP — the spec points at the local binary
137
+ - Cursor/VS Code paths differ by OS
138
+ - VS Code `--project` writes workspace `.vscode/mcp.json`, not global
139
+ - After adding a target, verify `oracle mcp print --target <name>` on the installed binary
140
+ - Signing is local. Do not document a remote control/exec MCP in the public pack
@@ -0,0 +1,87 @@
1
+ ---
2
+ name: oracle-multichain-convert
3
+ description: "Use for Oracle any-asset convert (ChangeNOW/deBridge)."
4
+ ---
5
+
6
+ > Oracle native tools: `oracle_cli` (read/prepare), `vault_status`, `signer_status`, `signer_execute` (needs human confirmationNonce), `skill_load`. No generic shell. No fleet SSH.
7
+
8
+
9
+ # Oracle multichain convert
10
+
11
+ User-facing and desk convert across **any asset** without agent custody.
12
+
13
+ ## When to load
14
+ - BTC → ETH / any CEXy pair
15
+ - SOL ↔ EVM
16
+ - “Is there an alternative to ChangeNOW?”
17
+ - Public Oracle convert product
18
+ - Wiring `CHANGENOW_API_KEY` or deBridge prepare
19
+
20
+ ## Rails (shipped in multiagent-desk)
21
+
22
+ | Rail | Best for | Key | User action |
23
+ |---|---|---|---|
24
+ | **deBridge DLN** | SOL↔EVM, EVM↔EVM | None | Sign unsigned tx |
25
+ | **ChangeNOW** | BTC L1, long-tail (~1.3k tickers) | Free partner key | Send to deposit address |
26
+ | **Desk DEX/bridges** | EVM already covered | Usually none | Sign/prepare per venue |
27
+
28
+ ## Convert router (single entry)
29
+ - Code: `src/router/convert-route.mjs`
30
+ - Desk: `data.oracle.routing.convert` / `convertQuote` / `convertPrepare`
31
+ - Prefer: BTC/long-tail → ChangeNOW; EVM/Sol → **deBridge**
32
+ - Always `executionReady: false`, public-safe
33
+ - Docs: `docs/CONVERT_ROUTER.md`
34
+ - Tests: `test/convert-route.test.mjs`
35
+
36
+ ```js
37
+ await data.oracle.routing.convertQuote({
38
+ from: { currency: "sol" },
39
+ to: { chainId: 8453, currency: "eth" },
40
+ amountBase: "100000000",
41
+ senderAddress: "<sol>",
42
+ toAddress: "0x...",
43
+ });
44
+ ```
45
+
46
+ ## deBridge notes
47
+ - Provider `debridge`; API `https://api.dln.trade/v1.0`
48
+ - Solana DLN chainId **`7565164`**; SOL mint `11111111111111111111111111111111`
49
+ - EVM native `0x0000…0000`
50
+ - create-tx: EVM `{to,data,value}` or Solana serialized `tx.data`
51
+ - Send real User-Agent (bare urllib may 403)
52
+ - Docs: `docs/DEBRIDGE_CONVERT.md`
53
+
54
+ ## ChangeNOW notes
55
+ - Provider `changenow`; prepare-only deposit exchange
56
+ - Currencies public; estimate/create need `CHANGENOW_API_KEY` header `x-changenow-api-key`
57
+ - **API key free** (partner signup, no monthly fee); fee in rate; optional ~0.4% partner cut
58
+ - Agent **cannot** create the key for DEMI — he must sign up and install env (0600)
59
+ - Never auto-fund deposit from agent without separate GO
60
+ - Docs: `docs/CHANGENOW_CONVERT.md`
61
+
62
+ ## Public product rules
63
+ - Server holds ChangeNOW key only
64
+ - No public agent/exec hot path for convert spend
65
+ - UI uses convert router, not a single hard-coded venue
66
+ - Copy: user sends/signs — Oracle does not hold bags
67
+
68
+ ## Not this skill
69
+ - Flash-loan MEV (Base/Arb shadows) → `oracle-mev-flashloan-plane`
70
+ - Executor gas hops (Arb→Base Relay) → `cross-chain-executor-funding`
71
+ - RH Chain 4663 trades → rhbot / RH skills
72
+
73
+ ## Pitfalls
74
+ - Claiming ChangeNOW is BTC-only — it includes SOL and long-tail
75
+ - Treating deBridge as BTC L1 solution — weak; use ChangeNOW
76
+ - Pasting API keys in chat
77
+ - Agent inventing a free anonymous key (estimate/create always 401 without partner key)
78
+ - Auto-broadcasting deBridge txs from agent without GO
79
+ - Confusing MEV “0 qualified opps” with convert product funding needs
80
+
81
+ ## Related
82
+ - Desk ops: `multichain-exec-desk`
83
+ - Keys: `protocol-api-key-integration`
84
+ - Public UX: `oracle-public-product`
85
+
86
+ ## References
87
+ - `references/pair-routing.md` — preference table and amounts
@@ -0,0 +1,32 @@
1
+ ---
2
+ name: oracle-native-harness
3
+ description: Use for Oracle's own agent loop. Crypto desk tools + skills, not Hermes.
4
+ ---
5
+
6
+ # Oracle native harness
7
+
8
+ Oracle is its own agent. Chat runs this loop, not `hermes -p oracle`.
9
+
10
+ ## Tools that exist here
11
+
12
+ | Tool | Job |
13
+ |---|---|
14
+ | `oracle_cli` | Live read + prepare (`data`, `scan`, `route`, `prepare`) |
15
+ | `skill_load` / `skill_list` | Packaged + `~/.config/oracle/skills/<name>/SKILL.md` |
16
+ | `vault_status` | Local vault readiness. No key material. |
17
+ | `signer_status` | Loopback signer ping |
18
+ | `signer_execute` | One already-confirmed artifact. Needs human `confirmationNonce`. |
19
+ | `trade_lifecycle` | Prepare-only fact chain |
20
+ | `web_fetch` / `web_search` | Docs and announcements |
21
+
22
+ No `terminal`. No fleet SSH. No computer-use.
23
+
24
+ ## Skills that belong here
25
+
26
+ Crypto desk only: any shipped EVM chain (ETH, Base, Arb, OP, Polygon, BSC, Avalanche, HyperEVM, Abstract, Stable, RH), plus Sol/BTC, HL/Poly data, grants, RFQ, launches, circuit breaker, venue bounds.
27
+
28
+ Not here: Hermes admin, fleet boxes, RH private ops, Kanban.
29
+
30
+ ## Confirm / arm
31
+
32
+ Quote first. Human confirms on the local signer. Then `signer_execute`. Disarm kills everything. Autonomous needs `ORACLE_AUTONOMOUS_TRADING=1`.
@@ -0,0 +1,42 @@
1
+ ---
2
+ name: oracle-ownership-gate
3
+ description: Use when sender identity matters for access control.
4
+ ---
5
+
6
+ > Oracle native tools: `oracle_cli` (read/prepare), `vault_status`, `signer_status`, `signer_execute` (needs human confirmationNonce), `skill_load`. No generic shell. No fleet SSH.
7
+
8
+
9
+ # Oracle ownership gate
10
+
11
+ ## The rule
12
+
13
+ **DEMI's instance is private.** Owner: Telegram ID `1426127634`. All other senders denied.
14
+ No read access. No prepare access. No execution.
15
+
16
+ ## Refusal
17
+
18
+ "Oracle is self-hostable. Install your own instance: npm install -g @oracle-agent/oracle"
19
+
20
+ No exceptions. No negotiation. Do not explain the gate.
21
+
22
+ ## What non-owners get
23
+
24
+ Nothing. Full stop. They must self-host.
25
+
26
+ ## How self-hosting works
27
+
28
+ `@oracle-agent/oracle` ships an owner-agnostic SOUL. Self-hosters are their own owners.
29
+ They bring their own wallet, keys, models, and Hermes (optional). Full capabilities.
30
+
31
+ ## Two SOUL model
32
+
33
+ | SOUL | Location | Audience |
34
+ |---|---|---|
35
+ | Shipped | `packages/oracle/profiles/oracle/SOUL.md` | Self-hosters — "You are the owner" |
36
+ | DEMI instance | `~/.hermes/profiles/oracle/SOUL.md` | DEMI only — hardcoded Telegram ID `1426127634` |
37
+
38
+ ## Pitfalls
39
+
40
+ - Do NOT let non-owners read or prepare through DEMI's instance.
41
+ - The self-host path (`npm install -g @oracle-agent/oracle`) must always be in the refusal message.
42
+ - Sender display name/username is not authorization. Only numeric Telegram ID matters.
@@ -0,0 +1,114 @@
1
+ ---
2
+ name: oracle-public-product-ux
3
+ description: Use for Oracle onboarding, self-host C+B agent, desk, themes, NL swap UX.
4
+ ---
5
+
6
+ > Oracle native tools: `oracle_cli` (read/prepare), `vault_status`, `signer_status`, `signer_execute` (needs human confirmationNonce), `skill_load`. No generic shell. No fleet SSH.
7
+
8
+
9
+ # Oracle public product UX
10
+
11
+ Class rules for how Oracle is presented and operated for DEMI + self-host downloaders.
12
+
13
+ ## Product law: C + B (decided 2026-08)
14
+
15
+ **Downloaders interact like the Hermes desk — self-hosted and local.**
16
+
17
+ | Layer | Meaning |
18
+ |---|---|
19
+ | **C · Custody** | Local agent key on **their** disk (`oracle sign init`). Never house cloud. **Never paste seed into app UI.** |
20
+ | **B · Rails** | `~/.config/oracle/agent-policy.json` — max $/trade, $/day, chains, slippage bps, session TTL, arm/disarm, **noLimits** (armed + all EVM + no caps; Disarm is the only block; DEMI's Mac runs this) |
21
+
22
+ - Chat: `swap 0.1 ETH to USDC on base` → quote → Confirm · agent (if policy ok) or Sign in wallet.
23
+ - APIs: `/api/oracle/trade/quote`, `/api/oracle/agent/policy`, `/api/oracle/selfhost/{status,init}`.
24
+ - Policy **before** agent sign. Block codes: `per_trade_cap`, `daily_cap`, `chain_blocked`, `disarmed`, `session_expired`.
25
+ - Settings: `AgentPolicySettings`. Desk/exec default copy = `127.0.0.1` for downloaders.
26
+ - Refs: `references/selfhost-c-plus-b-agent-policy.md`, `references/session-2026-08-c-plus-b-ship.md`.
27
+
28
+ ### Custody honesty (user correction)
29
+
30
+ - Never ask users to paste private key/seed into the Oracle **app UI**.
31
+ - Wallet path: injected provider → public address only → wallet popup signs.
32
+ - Agent path: CLI `oracle sign init` on **their** machine (self-custody operator).
33
+ - “Give Oracle your key” language is wrong for public product.
34
+
35
+ ## Onboarding (self-host local)
36
+
37
+ ```text
38
+ npm i -g @oracle-agent/oracle
39
+ oracle sign init # key ON THIS MACHINE only
40
+ oracle sign doctor
41
+ # app: POST /api/oracle/selfhost/init → 127.0.0.1 desk/data/exec
42
+ oracle data serve && oracle signer
43
+ ```
44
+
45
+ - App first-run `OnboardingGate`: checklist + local desk write + CLI steps + start with agent.
46
+ - Prompt: **Your machine. Your agent. Your keys.**
47
+ - Bare `oracle` opens the same chat as `oracle chat`.
48
+ - Optional wallet connect for view / Sign in wallet — not the primary agentic path.
49
+
50
+ ## Demo ≠ arm
51
+
52
+ | User says | Do |
53
+ |---|---|
54
+ | demo / show / prepare / what would this look like | Live reads + formatted card only |
55
+ | arm | `oracle_control_arm` for exact legs **and/or** policy Arm in Settings |
56
+ | confirm / execute / go | confirm pending ids / Confirm · agent inside policy |
57
+
58
+ If armed and they say “demo only / don’t arm” → **cancel every pending action**. Never leave execute arms after a demo correction.
59
+
60
+ ## One Oracle — two attach modes
61
+
62
+ | Who | Desk |
63
+ |---|---|
64
+ | **Downloaders (product default)** | Self-host `127.0.0.1` desk/data/exec on **their** machine |
65
+ | **DEMI thin-client (ops)** | Mac → Arch Tailscale `:8799`/`:8792` — not the public default |
66
+
67
+ Do not ship downloader copy that assumes Arch. DEMI fleet detail: `oracle-fleet-desk-wiring/references/mac-desktop-arch-desk.md`.
68
+
69
+ After desktop code change: rebuild, stage runtime, install `/Applications/Oracle.app`.
70
+
71
+ ## App chrome / themes
72
+
73
+ - Status chip: **Available** / **Unavailable** — never “Oracle available” next to the wordmark.
74
+ - Themes: **Oracle** + **Signal** only.
75
+ - **No CLI tab. No dedicated HL nav tab** — HL is a chain pick, not primary chrome.
76
+ - Composer **one flush line**: model · effort · chain · context · compress. Chain = **box menu** with logos; default = **unset**. HL≡HEVM; no chainId labels. `references/flush-composer-chain-default.md`.
77
+ - Shell: `references/chat-first-app-shell.md`. Config: `references/cli-app-config-sync.md`.
78
+ - Older session notes: `references/session-2026-08-product-ship.md`.
79
+
80
+ ## Portfolio + coin list
81
+
82
+ - Book headline = coins + NFT floors; **Partial total** when incomplete (`references/portfolio-unified-total.md`).
83
+ - **Your coins** list is primary: USD sort; **Swap/Send** prefills Prepare (`references/portfolio-coin-list-actions.md`).
84
+ - Stable ERC-20 (FEFER) often missing from native-only indexers — probe `watchTokens` + DexScreener (`references/stable-erc20-watch-probe.md`).
85
+ - Agent wallet from `exec.env`; Electron must set `ORACLE_REAL_HOME` so fake-home does not hide config (`references/agent-wallet-balance-and-tx.md`).
86
+
87
+ ## NL swap (desktop = desk)
88
+
89
+ - Unified `/api/oracle/trade/quote` (any taker). Agent execute: policy → prepare → sign → broadcast → spend ledger.
90
+ - `references/owner-chat-swap-agent-wallet.md`, `references/selfhost-c-plus-b-agent-policy.md`.
91
+
92
+ ## Hyperliquid
93
+
94
+ - Charts OK as evidence — not required primary tab. Not authorization.
95
+
96
+ ## Shipped / open
97
+
98
+ Shipped ✅: coin list Swap/Send · flush composer · chain logos + unset default · no HL tab · FEFER watch-probe · trade NL · **C+B agent policy (incl. noLimits preset)** · self-host init/status · onboarding · agent balance path · **conversational confirm/arm** (quote → reply confirm|arm|cancel; new quote supersedes) · **`oracle eval desk`** harness · **obsidian-glass premium chrome** (`px-*` CSS layer → superseded by Fable 5) · **Fable 5 engraved-ledger** (warm bone ink, bronze accents, physical depth, signal discipline) · **swap celebration** (particle burst + checkmark) · token logos on balances.
99
+
100
+ New refs: `references/agent-policy-rails-and-eval.md` (policy schema, enforcement point, eval command, parse grammar) · `references/premium-obsidian-glass.md` (px-* classes, deploy loop — superseded by Fable 5) · `references/fable-5-design-system.md` (CSS token system, color remap, theme triple-layer, celebration animation, chain logo sources, "looks like a website" fixes).
101
+
102
+ Still open: gas-from-USDC (Gelato/top-up) · WalletConnect mobile · app-spawn local signer/data · Settings OAuth · ensure desktop self-host does not force `ORACLE_EXECUTE_ENABLED=0` via fake-home.
103
+
104
+ ## HIP-4 / multi-venue honesty
105
+
106
+ - HIP-4 mainnet: price binaries live; multi-outcome stubs only.
107
+ - Geopolitics → Polymarket until HIP-4 lists events.
108
+ - `xyz:NVDA` = perp on TradeXYZ/HL HIP-3, not spot equity.
109
+
110
+ ## Related
111
+
112
+ - `oracle-fleet-desk-wiring` — Tailscale desk (DEMI ops)
113
+ - `oracle-agent-dev` — MCP install, publish
114
+ - `oracle-action-semantics` — arm/watch vocabulary (if user-owned, recommend `hermes curator adopt`)
@@ -0,0 +1,32 @@
1
+ ---
2
+ name: oracle-tailscale
3
+ description: Use when exposing an Oracle desk across the user's own Tailscale tailnet.
4
+ ---
5
+
6
+ > Oracle native tools: `oracle_cli`, `vault_status`, `signer_status`, `signer_execute`. Use YOUR tailnet only.
7
+
8
+ # Tailscale (your tailnet)
9
+
10
+ Use Tailscale so **your** machines reach **your** Oracle desk. Do not publish the desk to the public internet. Do not bind exec/signer to `0.0.0.0`.
11
+
12
+ ## Rules
13
+
14
+ 1. Use a MagicDNS name or the 100.x address of **this install's** node. Never paste a third-party 100.x.
15
+ 2. Data/public plane may listen on the tailnet IP if you want remote `oracle` reads.
16
+ 3. Local signer stays `127.0.0.1`. Vault keys do not ride the tailnet.
17
+ 4. Confirm `tailscale status` shows only nodes you own before opening ports.
18
+
19
+ ## Client env (placeholders)
20
+
21
+ ```bash
22
+ # ~/.config/oracle/env (0600)
23
+ ORACLE_DESK_URL=http://YOUR_NODE:8799
24
+ ORACLE_DATA_URL=http://YOUR_NODE:8799
25
+ ORACLE_PUBLIC_URL=http://YOUR_NODE:8799
26
+ ```
27
+
28
+ Replace `YOUR_NODE` with your MagicDNS hostname. Verify with `oracle doctor` / `oracle scan chains`.
29
+
30
+ ## Not this skill
31
+
32
+ Fleet boxes, someone else's Arch, shared operator wallets, GitHub admin packs.
@@ -0,0 +1,47 @@
1
+ ---
2
+ name: oracle-thin-client
3
+ description: Use when a laptop or desktop should attach to an Oracle desk the user hosts on their own network.
4
+ ---
5
+
6
+ > Oracle native tools: `oracle_cli`, `vault_status`, `signer_status`, `signer_execute`. No fleet SSH. No one else's box.
7
+
8
+ # Thin client (your desk, your machines)
9
+
10
+ A thin client is **your** laptop talking to **your** Oracle desk. It is not a shared house server and not someone else's Tailnet.
11
+
12
+ ## Default (no thin client)
13
+
14
+ ```text
15
+ oracle setup model
16
+ oracle chat
17
+ ```
18
+
19
+ Desk, vault, and signer stay on this machine (`127.0.0.1`).
20
+
21
+ ## Optional: desk on machine A, chat on machine B
22
+
23
+ Both machines must be yours. Keys stay on the signer host.
24
+
25
+ On the desk host, bind data/public only as far as you intend (loopback, LAN, or your tailnet). Never `0.0.0.0` for exec/signer.
26
+
27
+ On the client, point at **your** desk URLs — placeholders only:
28
+
29
+ ```json
30
+ {
31
+ "deskUrl": "http://YOUR_DESK_HOST:8799",
32
+ "dataUrl": "http://YOUR_DESK_HOST:8799",
33
+ "publicUrl": "http://YOUR_DESK_HOST:8799"
34
+ }
35
+ ```
36
+
37
+ Write that to `~/.config/oracle/desk.json` (mode 0600). Do not commit it. Do not copy another person's file.
38
+
39
+ `oracle doctor` must probe `/health` and `/public/health` on those URLs.
40
+
41
+ ## Signer
42
+
43
+ The loopback signer (`oracle signer`) stays on `127.0.0.1` on the machine that holds the vault. A thin client does not get a remote private key.
44
+
45
+ ## Related
46
+
47
+ `oracle-tailscale` · `oracle-native-harness` · `setup`
@@ -0,0 +1,161 @@
1
+ ---
2
+ name: perp-venue-funding-research
3
+ description: Validate a perp venue's funding before sizing a carry trade.
4
+ category: research
5
+ triggers:
6
+ - "funding rate"
7
+ - "funding arb"
8
+ - "basis trade"
9
+ - "carry vault"
10
+ - "new perp venue"
11
+ - "what's funding on"
12
+ - "perp market list"
13
+ - "is this strategy viable"
14
+ ---
15
+
16
+ > Oracle native tools: `oracle_cli` (read/prepare), `vault_status`, `signer_status`, `signer_execute` (needs human confirmationNonce), `skill_load`. No generic shell. No fleet SSH.
17
+
18
+
19
+ # Perp venue funding research
20
+
21
+ Task class: a venue (often brand new, often barely documented) is proposed as the home for a
22
+ carry / funding-basis / cash-and-carry strategy. Discover its public API from scratch, pull the
23
+ **real** market list with funding, and answer whether the edge actually exists.
24
+
25
+ The deliverable is never "here are the markets." It is **does the money-making mechanism the
26
+ thesis assumes actually operate on this venue.** Those are different questions, and the second
27
+ one is the one that protects capital.
28
+
29
+ ## When NOT to use
30
+ - Hyperliquid specifically → `hyperliquid` (its keyless recipes are already written)
31
+ - Chain-wide TVL / protocol census → `chain-defi-ecosystem-profiling`
32
+ - Enumerating a read-only analytics dashboard → `analytics-dashboard-recon`
33
+ - Actually executing/sizing once validated → `trade-loop-circuit-breaker`, `oracle-best-execution`
34
+
35
+ ## Step 1 — Find the real API (do not trust the given domain)
36
+
37
+ **Verify the domain resolves before anything else.** Task briefs routinely carry a wrong or dead
38
+ domain. A `curl` status of `000` means DNS failure, not a bad path — no amount of path-guessing fixes it.
39
+
40
+ ```bash
41
+ for h in example.com api.example.com indexer.example.com app.example.com; do
42
+ echo "=== $h"; getent hosts $h || echo "DNS FAIL"; done
43
+ ```
44
+
45
+ Then, cheapest-probe-first:
46
+
47
+ 1. `curl -s https://api.<domain>/` — a bare root often returns `{"status":"running","docs":...}` and
48
+ confirms the gateway exists even when every guessed path 404s.
49
+ 2. **`docs.<domain>/llms.txt`** — Mintlify/Docusaurus ship this by default. Flat machine-readable
50
+ index of every doc page with descriptions; for API-reference sites it names every endpoint family
51
+ in ONE fetch. Also `<docpage>.md` — Mintlify serves a clean markdown twin of any HTML page, far
52
+ cheaper to grep than a 250KB rendered SPA. Fetching `.md` concept pages is how you get the funding
53
+ formula without rendering anything.
54
+ 3. `/openapi.json`, `/swagger.json`, `/docs`, `/health`.
55
+ 4. **Grep the app JS bundle — the highest-yield probe.** Marketing sites are usually Framer/Webflow
56
+ with zero API references; the *app* subdomain has everything:
57
+ ```bash
58
+ curl -s https://app.example.com/ -o app.html
59
+ grep -oE '(src|href)="[^"]*\.js"' app.html # bundle chunks
60
+ curl -s https://app.example.com/assets/index-XXXX.js -o idx.js
61
+ grep -oE 'https://[a-zA-Z0-9.-]*example[a-zA-Z0-9.-]*' idx.js | sort -u # every API host
62
+ grep -oE '/v1/[a-zA-Z][a-zA-Z0-9/_-]*' idx.js | sort -u # every route path
63
+ ```
64
+ Surfaces hosts nothing links to — separate spot indexers, routers, staging/testnet — plus routes
65
+ absent from the docs.
66
+
67
+ **Do not assume the dYdX v4 scheme.** "Built by the dYdX team" does NOT mean `/v4/perpetualMarkets`.
68
+ Teams reuse people, not URL schemes. Probe, then read the bundle.
69
+
70
+ ## Step 2 — Pull the data
71
+
72
+ Prefer the one endpoint returning full per-market state (prices + funding + OI + volume + trading-hours
73
+ config) over stitching several. Note which params are mandatory — history endpoints commonly require an
74
+ explicit market and 400 without it, which reads like "broken" if you only tried the bare path.
75
+
76
+ Report raw strings from the response alongside derived figures. Never silently round a rate.
77
+
78
+ ## Step 3 — Nail the funding interval BEFORE quoting any APR
79
+
80
+ **Highest-consequence detail in the task.** An 8x error either way turns a dead trade into a great
81
+ one on paper.
82
+
83
+ Confirm the interval **three independent ways** and say so in the writeup:
84
+ 1. The schema/spec field description (`"Hourly funding rate"`).
85
+ 2. The prose docs ("funding is charged once an hour").
86
+ 3. **Empirically** — diff consecutive timestamps in the funding history. 3600s apart = hourly. The
87
+ only check that cannot be stale or wrong.
88
+
89
+ Beware the amortization convention: many venues quote an **hourly** rate that is 1/8th of a premium
90
+ "paid off over 8 hours." The quoted number is still hourly. Annualize `rate * 24 * 365`.
91
+
92
+ Sanity-check the base rate by reverse-solving it. If RWA funding sits at a constant, `rate * 360 * 24`
93
+ (ACT/360, the TradFi money-market daycount) should land on a recognizable benchmark + spread — that
94
+ confirms you understood the formula rather than pattern-matched a number.
95
+
96
+ ## Step 4 — Test the funding REGIME, not just the current spread ⚠️
97
+
98
+ **The load-bearing step. A snapshot of current funding cannot validate a carry thesis.**
99
+
100
+ Most carry theses assume funding *floats freely* and dislocates under some condition (weekends,
101
+ off-hours, volatility). Many venues explicitly engineer that away. Read the funding concept page for
102
+ regime language: *locked*, *fixed at the close*, *base rate*, *suspended*, *off-hours*, *dead-band*, *clamp*.
103
+
104
+ Then **prove the regime from history** — do not stop at the docs:
105
+
106
+ ```bash
107
+ # pull enough history to span the condition (a weekend, an overnight), then count distinct rates
108
+ curl -s "https://api.example.com/v1/fundingRates?market=NVDA-USD&limit=200"
109
+ ```
110
+ Bucket rows by the condition and count **distinct** values. Constant rate across the window = locked
111
+ regime = **no dislocation to harvest**.
112
+
113
+ **Always run a control.** Test crypto perps (or any market without the regime) over the *same* window.
114
+ If crypto varies and RWA is flat, the flatness is a real mechanism. If *everything* is flat, suspect
115
+ your query, the window, or a stale endpoint. Without the control you cannot distinguish "locked market"
116
+ from "broken pull" — and that mistake runs in both directions.
117
+
118
+ Run it across **all** markets in the class, not one sample — then you can state "28 of 28" rather than
119
+ "NVDA looked flat."
120
+
121
+ ## Step 5 — Report so it can kill the trade
122
+
123
+ Lead with the mechanism finding, not the market table. If the thesis is dead, say so in the first lines
124
+ and show the evidence that killed it.
125
+
126
+ Cover explicitly:
127
+ - **Funding sign + interval**, with the annualization arithmetic shown.
128
+ - **Regime**: when funding is live vs locked/fixed, with exact hours.
129
+ - **What's left**: if the assumed window is dead, name the window where variance *does* exist.
130
+ - **The other side of the trade**: locked funding usually coincides with *wider price bands and higher
131
+ margin requirements*. Directional gap risk with no funding compensation is strictly worse than the
132
+ thesis assumed — say that plainly.
133
+ - **Capacity**: OI notional and trades/24h per market. A venue can have a real edge and still be
134
+ untradeable at size. Flag markets with single-digit daily trades.
135
+ - **TVL ≠ OI.** Deposited collateral and position notional are different numbers; reconcile them
136
+ explicitly rather than letting a big TVL headline imply depth.
137
+
138
+ ## Pitfalls
139
+
140
+ - **The brief's domain may not exist.** Check DNS first; `curl` `000` = DNS, not routing.
141
+ - **Pedigree ≠ API shape.** Don't infer endpoints from who built it.
142
+ - **Marketing root has no API strings** — it's a site builder. Go to `app.`.
143
+ - **Bare history endpoints 400 without a required param.** Read the error body; it names the missing field.
144
+ - **A snapshot cannot prove a regime.** Only bucketed history plus a control can.
145
+ - **Fixed-rate off-hours is a *feature* venues advertise** as removing overnight/weekend funding
146
+ uncertainty. It is deliberately anti-dislocation. Assume it exists until history says otherwise.
147
+ - **Zero-fee claims are checkable** — asset/fee endpoints often expose `maker_fee`/`taker_fee` literally.
148
+ Verify rather than repeating marketing.
149
+ - **Markets listed but OFFLINE** return all-zero prices/OI. Filter on status before aggregating or your
150
+ totals and averages are silently wrong.
151
+ - Report `null`/zero marks as-is; a market quoting mark `0` against a live oracle is a real state worth
152
+ flagging, not a number to clean up.
153
+
154
+ ## Worked example
155
+ Arcus DEX on Robinhood Chain (4663) — full endpoint map, the RWA funding-lock finding that killed a
156
+ weekend funding-arb thesis, and the base-rate arithmetic: `references/arcus-robinhood-chain.md`
157
+
158
+ ## Cross-skill
159
+ - `hyperliquid` — equivalent recipes for HL, already keyless and written
160
+ - `analytics-dashboard-recon` — schema/bundle discovery for read-only dashboards
161
+ - `trade-loop-circuit-breaker` — guardrails before any of this touches capital