Roby

Specification

What the agent
can and cannot do

A rule is a sentence that compiles to one condition and one action. A key is one signature that bounds every execution. The ledger is everything in between, including the silences. This page is generated from the tables the product runs on.

00 · What is listed

Robinhood Chain, chain 4663

The vault holds USDG (Global Dollar) as cash and the tokens below, each swapped against USDG on Uniswap v3. Nothing else can be traded — not BTC spot, not perpetuals, options, leverage or short positions. A value can still watch a symbol the agent cannot trade (BTC, HOOD, MSTR, INTC, any US ticker); the action has to land on a listed token.

01 · The rule grammar

Seven values, one comparator, one number, one action

The compiler is Claude, told exactly this page and the state of your account, and asked for the one typed rule the sentence means. If any part is missing or impossible it refuses and names the part. Numbers may be digits or words; company names map to tickers; other languages are fine.

price([X])

$

X's price in dollars. For a listed token it is the Uniswap pool's own price, 24/7.

from: the pool for listed tokens; the tape (Yahoo Finance) for other US tickers; Binance for BTC

says: trades above / below, hits, reaches, crosses, is at

drawdown([X] or [Account])

%

How far X sits below its highest high of the last 30 sessions, as a positive percentage that grows as the price falls. "Falls eight percent from its high" is drawdown ≥ 8, and the comparator is always ≥. For the account: below its highest value of the last 7 days.

from: 30 sessions of daily highs from the tape; the vault's own value history for the account

says: falls N% from its high, is N% off its high, draws down

ratio([A, B])

%

A's 30-session return minus B's, in percentage points — how far one leg has outrun the other. Two symbols.

from: 30 sessions of closes from the tape

says: outruns, outperforms, beats, is ahead of

spread([A, B])

%

The same divergence over 5 sessions. Two symbols.

from: 5 sessions of closes from the tape

says: spread, over the week

funding([BTC] or [ETH])

bp/h

A perpetual's funding rate, in basis points per hour. Watchable for BTC and ETH only. A rule may watch funding, but its action must trade a listed token (ETH), never a perpetual.

from: Binance futures

says: funding

volume([X])

M

Today's volume in millions: shares for stocks, quote-currency for crypto. "Falls under thirty million" is volume ≤ 30.

from: the tape; Binance for crypto

says: volume

clock([monday…friday] or [daily])

no unit

A schedule with no threshold: op ≥, value 0. Runs at the first evaluation after 16:00 New York on that weekday, or every weekday.

from: the calendar

says: every Friday, at the close, daily, each morning

Comparators

for above, over, past, exceeds, outruns, hits, reaches, by. for below, under, less than, falls, drops, narrows. A drawdown is a magnitude that rises as the price falls, so its comparator is always ≥, however the sentence phrases it.

Actions, and what they do when they run

close

Sells every named holding in full, to USDG.

args: ["pair"] when two legs were named, else ["position"]

says: close the pair, close the position, get out

sell

Sells that share of the named holding. "Half" is 50%, "everything" is 100%.

args: ["50%"], ["100%"], or the stated share

says: sell half, sell it all, trim a quarter

convert

Sells the named holdings — or, for the account, every holding — to USDG.

args: ["cash"]

says: move everything to cash, go to cash, hold the proceeds in cash

halt

Marks the token halted: no rule may buy it afterwards. Nothing is sold.

args: ["entries"]

says: stop adding, stop buying

ladder

Buys the token in equal tranches, one each time the condition is true, that many times. Without a budget each tranche is an equal share of the cash on hand.

args: ["3"] — the number of tranches — optionally with a budget: ["3", "$6000"]

says: buy in thirds, buy the dip in three tranches, ladder in

rebalance

Buys and sells to the weights between the two named holdings; if only one is named, that holding and cash; if none are named, the two largest holdings (or the one holding and cash). Unnamed legs are allowed — compile it, do not refuse for a missing subject; the account below says what the legs will be.

args: ["60/40"] — the weights

says: rebalance to sixty forty, hold 70/30

buy

Buys the token with that much USDG, never more than the cash on hand or the key's remaining cap.

args: ["$5000"] a dollar amount, ["25%"] a share of the cash on hand, or ["all"]. Default ["25%"] when the sentence names no size.

says: buy, buy the dip, add, put $2,000 into

Refusals

value

no measurable value named ("looks toppy", "feels weak")

subject

no market named, or a ratio/spread with one leg

comparator

no direction

number

no threshold

action

nothing to do

venue

the action would trade something not listed (BTC spot, HOOD, a perpetual, options, shorting, leverage, a limit order)

scope

no live key covers the tokens it trades — name the key and its scope so a wider one can be signed

holding

the action needs a holding or cash the vault does not have (selling what is not held, buying with no USDG)

meaning

not a rule about this account, two rules in one sentence, a question to Roby, or a sentence that cannot be read without guessing

question

the sentence is a rule, but one thing is genuinely open — which two legs, which of two holdings, whether 'half' means the position or the cash — and the person can settle it in a word. Ask one short question instead of guessing or refusing; their next message answers it and the rule compiles then

Cadence and fills

Every armed rule is evaluated once a minute for as long as its key verifies. A listed token’s price is read from its pool; tape values are re-read at most every thirty seconds. A fill is a Uniswap v3 swap against USDG, routed across the fee tiers that have liquidity and measured against a small probe at the same instant; an order that would move the pool past the impact cap is cut to the slice that fits and the rest is worked a minute at a time. Every leg carries slippage protection; the pool’s fee applies.

Dry run

Any sentence that compiles can be run against the last 180 sessions before it is signed. The same value is computed for each day from daily history and tested against the same comparator; the dates it would have fired are reported into the conversation, and nothing is signed.

02 · The session key

One signature, three limits, enforced by a contract

Every account owns a vault contract on Robinhood Chain (RobyVault.sol). The server generates a fresh keypair for the agent; the account signs the vault’s EIP-712 Grant naming that agent’s address, the token scope, the cap in USDG and the expiry; a relayer submits it and pays the gas. The vault stores the grant. Every execution is an Instruction signed by the agent that the vault verifies against scope, cap and expiry before it calls Uniswap — the agent never holds funds and cannot widen a limit it does not control. Sign-in is a separate Sign-In-With-Ethereum message from the same account key.

{
  "domain": {
    "name": "RobyVault",
    "version": "1",
    "chainId": 4663,
    "verifyingContract": "<the account's vault>"
  },
  "primaryType": "Grant",
  "types": {
    "Grant": [
      {
        "name": "agent",
        "type": "address"
      },
      {
        "name": "scope",
        "type": "address[]"
      },
      {
        "name": "cap",
        "type": "uint128"
      },
      {
        "name": "expiry",
        "type": "uint64"
      },
      {
        "name": "nonce",
        "type": "uint256"
      },
      {
        "name": "deadline",
        "type": "uint64"
      }
    ]
  }
}

Scope

Every token an order touches must be in the key's scope. A token outside it cannot be quoted, let alone traded.

Cap

The USDG moved by every fill under the key is summed, on buys and sells alike. An execution that would push the sum past the cap reverts on chain.

Clock

A key past its expiry, or revoked, stops verifying. Every rule under it pauses, mid-sentence.

Balance

A sell needs the tokens; a buy needs the USDG. The vault is never short, and only the owner can withdraw.

Re-signing a key signs a new expiry over the same agent address; rules it had paused for expiry resume. Revoking it is immediate and one-way. The account’s own key is never sent to the server: a key made or imported in the browser stays in that browser, and a wallet keeps its own.

03 · The ledger

Every action, and every non-action, on the record

check

Every evaluation: the value read, and idle, fired, refused or error.

receipt

Every execution: the fills, prices and notional, and the Robinhood Chain transaction hash of each swap.

transfer

Every deposit noticed on chain and every withdrawal signed, with the counterparty address and transaction hash.

turn

What Roby said, and when — including the hourly line that nothing happened.

Checks are kept for thirty days; receipts and transfers are kept for the life of the account. The whole ledger exports as one CSV from the desk’s Wallet tab. A refusal is written in the same place as a fill, with the clause that refused it. Every fill and every transfer links to its transaction on Blockscout.