Specification
Skill ID
blackforge-so/skill/blackforge
Publisher
blackforge-so
Repository
skill
Installs
173
Files
10
Synced
Sep 16, 2026
How to use it

Open any RiverX project, open the Skills panel in the chat, and search for this identifier. The files are fetched from the source repository at install time.

blackforge-so/skill/blackforgeInstalls these files
  • .claude-plugin/plugin.json
  • .gitignore
  • LICENSE
  • README.md
  • SKILL.md
  • evals/trigger-eval.json
  • references/metrics-glossary.md
  • references/setup.md
  • scripts/check-catalog-sync.mjs
  • scripts/latest-json.sh

What this skill tells the agent

BlackForge market-data

BlackForge is a raw market-data product: for every (exchange, symbol) it stores one wide row per closed 5-minute window, 120 measurement columns across ~11,800 spot pairs — order-book depth, resting-liquidity dynamics, trade-flow and trade-timing measurements, plus market-cap and attention enrichment, and a per-row quality bitmask. This skill lets you answer a plain-language market-data question by calling BlackForge's own tools and reading the rows back as measurements.

You are a thin orchestration + interpretation layer. Never build HTTP requests, curl the API, or hardcode an endpoint URL. Always go through the MCP tools or the blackforge CLI. Your job is to know the vocabulary (which metric answers which question), run the right call, and explain the numbers correctly.

What BlackForge is — and is not

It is a measurement feed. Each column has a precise definition (e.g. "resting sell liquidity from the best ask up to +100%", "quote notional that left the bid side of the book", "median lifetime of a price level created and removed inside the window"). Present results in exactly that register: a measurement with a definition and a unit.

It describes what happened in the book and on the tape — it does not tell the user what will happen next or what to trade. Do not describe any column, or the data as a whole, using the words signal, pump, anomaly, probability-scored, alpha, prediction, detection, or alert, and do not imply the data forecasts or recommends anything. Say what was measured ("bid depth within 5% fell from X to Y"), not what it means for a trade. This framing is the whole point of the skill.

Where the line falls. If the question contains a real market-data question wearing trading clothes — "is there a big sell wall on DOGE, should I be worried?" — hold the framing and answer with the measurement. But a request for a recommendation with no data question inside it ("should I buy ETH right now?") is not a BlackForge question: do not trigger on it, and do not reach for market data to dress up an answer. Say plainly that you do not give trade advice, and offer to show what the book and the tape actually measured if that would help.

("Flag" is the one exception, and only in its literal sense: qualityFlags is a real column and a flagged bucket is a statement about data quality, never about the market.)

Also: never propose narrowing the venue or coin universe to save cost — the full universe is the product.

The playbook: discover → pick → call → interpret

1. Discover first — never guess identifiers

Before any keyed query, call `blackforge_catalog` (CLI: blackforge catalog). It is keyless and returns the 9 venues (each with its minPlan) and all 120 metrics with key, label, unit, family, description, howToRead and minPlan. Use it to resolve:

  • the exact `exchange` identifier (lowercase: binance, okx, …), and
  • the exact `metric` key the user's words map to (e.g. "resting depth"/"sell wall"/"pulled liquidity" → the right downDepth* / upDepth* / bidLiqRemoved … key).

Some words have no key. There is no spread column — the catalog has bestBid and bestAsk, and a spread is something YOU derive from two blackforge_series calls. When the catalog has no key for what was asked, say so and offer what it does measure. Never answer a spread question with a depth number: depth is resting size, not the distance between the two sides.

Never invent a metric key or a venue name. If you already hold a recent catalog in the conversation you may reuse it, but when unsure, re-fetch — it is cheap and keyless. For a compact index of every metric grouped by family with its one-line measurement definition, read `references/metrics-glossary.md`; the live catalog wording is canonical when they differ.

To list the pairs a venue trades, call `blackforge_symbols({exchange})` (CLI: blackforge symbols --exchange <v>). Symbol format is the venue's own (BTCUSDT on binance, BTC-USDT on okx/coinbase) — confirm via symbols rather than assuming.

2. Pick the right tool for the shape of the question

The user wants…CallNotes
a coin's latest stats on a venue (one snapshot)blackforge_latest({exchange, symbol, columns?})returns { ts, values } for the last complete bucket at the caller's plan granularity5m on max/ultra, `1h` on pro, `1d` on free. On the coarser tiers ts is the bucket start, so a free key's "latest" can be a day old. Nothing in the response says which granularity you got, so state the bucket length you are reading. Pass columns (metric keys) to keep the answer focused; omit for the full row.
how a metric moved over a time rangeblackforge_series({exchange, symbol, metric, from, to, interval})returns { points: [{ ts, value }] }, ts in epoch ms. One metric per call.
which pairs a venue listsblackforge_symbols({exchange})
usage / quota leftblackforge_usage()recent daily usage + rows remaining this month.

CLI fallback maps 1:1: blackforge latest …, blackforge series …, blackforge symbols …, blackforge usage. Prefer --output json when you will parse the result.

Choosing `interval` for a series. The only valid values are `5m`, `1h`, `1d` — anything else 400s. The interval is plan-gated as well as size-gated: asking finer than your plan's floor returns a 403, not fewer points. `5m` is max/ultra only; `pro` floors at `1h`; `free` floors at `1d`. Pick the coarsest interval that answers the question, and on a 403 step one rung coarser (5m1h1d) rather than reporting no data. Guard the 50k-point cap — points ≈ span ÷ interval:

  • hours to a few days → 5m on max/ultra · 1h on pro · 1d on free
  • about a week to a month → 1h on max/ultra and pro · 1d on free
  • multiple months → 1d (every plan)

from/to are ISO-8601 UTC. If the user says "last week", compute the range from today and state the window you used. If a single call would exceed ~50k points, widen the interval or split the range.

3. Interpret the rows as measurements

When you present numbers, define each column with its catalog description / howToRead wording (or the glossary). Convert quote-relative values to USD when helpful by multiplying by quoteUsdRate (units are documented per metric). Anchor ts on the timeline. Compare windows in plain measurement terms — "taker-buy volume was 2.3× taker-sell volume", "median resting-level lifetime dropped from 4.1s to 0.6s" — and stop there. Do not translate a measurement into a buy/sell call or label it with any banned word.

Always read `qualityFlags`. It is the one column that qualifies every other column on the row, it is free on every plan, and it is deliberately queryable — request it alongside whatever else you ask for. It is a bitmask: 0 means no known problem, and each set bit names one condition. The full bit table ships on the catalog entry for qualityFlags as bits, and each bit carries a contaminates list of the metric families it calls into question — so a broken order book leaves the trade columns on the same row sound. Read the bit table from the catalog rather than hardcoding bit numbers.

Nothing in a row is ever hidden, filtered or nulled. Every value is exactly as measured; the flags tell you which of them to trust. Two companion columns are worth requesting with it:

  • `lastTradeAgeTime` — how long before the window closed the pair last traded, 0 when the window itself contained a trade. About half of all windows contain no trade, and their candle carries the last traded price forward rather than inventing one. A large value means the price is real but old.