Docs menu

Reason codes

No gap, no card. When a name doesn't clear, GAUGE tells you why in one word. The word is the first gate that failed.

4 min read · Reference · Examples from the sample watchlist

At a glance

CodeGateFires whenDefault
STALEFeedEither price is older than the max quote age2.0 s
CLOSEDSessionThe cash market is outside regular hours09:30–16:00 ET
THINDepthTop of book is below the minimum size$100k
DUSTNet gapNet after fees, slippage and buffer is below the floor2.0 bps
ORDER

Gates run feed → session → depth → net. A name with an old price and a tiny gap shows STALE, not DUST. Fix the first failure and the next one may appear.

STALE

Feed gate

A price is too old to trust

Both legs have to be fresh at the same moment. If either the cash quote or the chain token price is older than your max quote age, the gap might not exist anymore, so GAUGE stays quiet.

What to do: usually nothing. It clears on the next fresh tick. If a name stays STALE, check Home → System health.

COIN · chain feed 3.8 s old · max 2.0 s → STALE
net would have been 3.4 bps, but the price was too old to use
CLOSED

Session gate

The cash market isn't in its session

Stock tokens can keep trading after hours. The cash leg can't be placed live outside regular hours, so GAUGE doesn't emit a card it can't act on.

What to do: wait for 09:30 ET. Cards resume at the open.

any name · 17:40 ET · after hours → CLOSED
the token may still tick; GAUGE waits for the cash market
THIN

Depth gate

Not enough size to fill

A wide gap on a thin book usually disappears the moment you trade into it. GAUGE needs at least your minimum depth at the top of the book before it believes the gap.

What to do: treat a big THIN gap as a warning, not a miss. You can lower min depth in Settings → Gates, at your own risk.

HOOD · |gap| 44.8 bps · depth $45k · min $100k → THIN
the biggest raw gap of the day, and the least fillable
DUST

Net gap gate

A gap, but not after costs

The prices differ, but once fees, slippage and your buffer are taken off, what's left is below the floor. This is the most common reason by far.

What to do: nothing. DUST is GAUGE working as intended.

META · |gap| 8.8 − costs 7.6 = net 1.2 · floor 2.0 → DUST

Not a reason code: re-quote fail

A card can pass every gate and still not trade. When you tap Do it, GAUGE re-quotes both legs and runs the gates again. If net has dropped below the floor, the card closes as RE-QUOTE FAIL and nothing is placed.

RE-QUOTE FAIL

META · Thu 25 Sep 15:21 · net 4.6 at card → 1.4 at confirm · floor 2.0 → no order

How often each one fires

On a normal session almost every evaluation ends in DUST. That's the point: GAUGE is built to say no.

■ DUST 71%■ THIN 12%■ STALE 9%■ CLOSED 8%illustrative

Reason eventDRAFT

Reasons are streamed like cards, one per name per state change. Field names are drafts.

gauge-engine / src/reason.rsDRAFT
/// First failing gate wins. Order matters.
pub enum Reason { Stale, Closed, Thin, Dust }

pub fn gate(q: &Quote, r: &Rules) -> Result<(), Reason> {
    if q.age_s > r.max_age_s          { return Err(Reason::Stale) }
    if !q.session.is_rth()             { return Err(Reason::Closed) }
    if q.depth_usd < r.min_depth_usd   { return Err(Reason::Thin) }
    if q.net_bps < r.floor_bps         { return Err(Reason::Dust) }
    Ok(())
}
event: reasonDRAFT
{
  "type": "reason",
  "sym": "HOOD",
  "code": "THIN",
  "gate": "depth",
  "observed": { "depth_usd": 45000, "gap_bps": 44.8 },
  "threshold": { "min_depth_usd": 100000 },
  "at": "2026-09-26T12:40:10-04:00"
}
esc