How a card is made
Every card goes through the same four steps: measure the gap, take the costs off, pass the gates, emit. This page walks through all four with one real-shaped example: NVDA at 14:02:18 ET.
8 min read · Concept · Numbers are illustrative
01Two prices
GAUGE watches two prices for the same name:
- Cash mid. The Robinhood stock's mid price.
- Token per share. The Robinhood Chain stock token, priced per share. The token feed is multiplied by the token's multiplier so both prices are in the same unit.
The multiplier only touches the chain feed. The cash price is never adjusted.
| Leg | Source | NVDA |
|---|---|---|
| Cash mid | Robinhood quotes | $182.40 |
| Token per share | Chainlink · token × multiplier | $182.71 |
02The gap, in basis points
GAP
Basis points make every name comparable. A 31¢ gap on a $182 stock and a 53¢ gap on a $118 stock are very different trades, and bps shows it.
NVDA
The token is trading rich: above the cash price. A negative gap (token cheap) is measured the same way. GAUGE uses the absolute value.
03The haircut
A gap that looks good before costs isn't a gap. GAUGE takes three things off every time:
| Cost | What it is | NVDA |
|---|---|---|
| Fees | From the fee schedule. Same for every name. | −3.5 |
| Slippage | Estimated for this name. Thinner books cost more. | −2.1 |
| Buffer | Your safety margin. Set in Settings → Gates. | −2.0 |
NET
17.0 − 3.5 − 2.1 − 2.0 = 9.4 bps
- |gap|17.0
- − fees3.5
- − slippage2.1
- − buffer2.0
- NetFLOOR 2.09.4
04The four gates
Gates run in order. The first one that fails becomes the reason you see instead of a card.
| Gate | Passes when | NVDA |
|---|---|---|
| Feed | Both legs are younger than the max quote age (2.0 s) | 0.3 s ✓ |
| Session | The cash market is in regular hours, 09:30–16:00 ET | RTH ✓ |
| Depth | Top of book is at least $100k | $420k ✓ |
| Net gap | Net is at least the floor (2.0 bps) | 9.4 ✓ |
| Cap | You have had fewer than 3 cards today | 1/3 ✓ |
See Reason codes for what each failure means and what to do about it.
05Emit the card
When every gate passes, GAUGE emits one card and pushes it to you. For NVDA that happened at 14:02:18.412 ET. The card:
- lives for 75 seconds, then expires on its own;
- shows the net, both prices and the leg GAUGE would trade (cash equity only);
- counts toward your cap of 3 whether you take it, skip it or let it expire.
06Re-quote on confirm
The numbers on a card are never traded as-is. When you tap Do it, GAUGE holds the clock, fetches fresh prices for both legs and runs every gate again.
| At card | At confirm | |
|---|---|---|
| Cash mid | $182.40 | $182.41 |
| Token per share | $182.71 | $182.71 |
| Net | 9.4 bps | 8.9 bps · clears |
If the re-quote drops net under the floor, the card closes as RE-QUOTE FAIL and nothing is placed. Example from the ledger: META on Thu 25 Sep went from 4.6 at card to 1.4 at confirm.
The model does not place. In live mode a clear re-quote results in exactly one cash-equity order through the official Robinhood Trading MCP. In paper mode it fills at the confirm mid.
DEVSpecDRAFT
The same math as code. Names, types and field names are drafts until the engine API is published.
pub struct Costs { pub fees_bps: f64, pub slip_bps: f64, pub buffer_bps: f64 }
/// |token×mult − cash| / cash × 1e4. The multiplier only touches the chain leg.
pub fn gap_bps(cash_mid: f64, token: f64, mult: f64) -> f64 {
((token * mult - cash_mid) / cash_mid).abs() * 1e4
}
pub fn net_bps(gap: f64, c: &Costs) -> f64 {
gap - c.fees_bps - c.slip_bps - c.buffer_bps
}{
"type": "card",
"id": "card_7f3a91",
"sym": "NVDA",
"cash_mid": 182.40,
"token_per_share": 182.71,
"gap_bps": 17.0,
"costs": { "fees_bps": 3.5, "slip_bps": 2.1, "buffer_bps": 2.0 },
"net_bps": 9.4,
"gates": { "feed_age_s": 0.3, "session": "RTH", "depth_usd": 420000, "cap": "1/3" },
"leg": "cash_equity",
"emitted_at": "2026-09-26T14:02:18.412-04:00",
"expires_at": "2026-09-26T14:03:33.412-04:00",
"mode": "live"
}