Crypto pack
The first vertical pack. Continuous crypto market intelligence — prices, TVL, narratives, sentiment, news, rug heuristics — refreshed every 5 minutes from nine source connectors. Voice: analyst-cool, exact numbers, inline [N] citations, no hype.
Identity
id: crypto
name: Cloven Mind — Crypto
version: 1.0.0
description: Continuous crypto market intelligence: prices, TVL, narratives,
sentiment, news, rug heuristics. Every 5 minutes from 9 multi-
source pulls.
refreshSeconds: 300 (state pulse cadence)
briefSeconds: 86_400 (brief regenerates daily)
iconPath: /packs/crypto.svgSources
Nine connectors fan out in parallel on each pulse. Each is graceful-degrade: source failure does not take the pack down — it flags source_status[id] = "stale" and the briefer explicitly notes the missing signal.
| Source | Public URL | Cadence | Auth |
|---|---|---|---|
coingecko | coingecko.com | 5 min | COINGECKO_API_KEY (optional, raises rate limits) |
defillama | defillama.com | 5 min | — |
geckoterminal | geckoterminal.com | 5 min | — |
dexscreener | dexscreener.com | 5 min (default) | — |
goplus | gopluslabs.io | on-demand | — |
cryptocompare_news | min-api.cryptocompare.com | 15 min | — (optional API key) |
fear_greed | alternative.me | 1 hr | — |
gdelt | gdeltproject.org | 30 min | — |
reddit | reddit.com | 15 min | — |
The goplus source is on-demand only: the pulse does not pre-fetch rug-audit data for every token; the cloven.crypto.rug_check(token, chain) pack-specific tool triggers a live call when invoked.
State schema (high level)
The full Zod schema lives in lib/packs/crypto/schema.ts. The fields a downstream agent will read most often:
{
generated_at: string, // ISO8601 of the compaction
top_movers: {
top_gainers: Mover[],
top_losers: Mover[],
},
protocol_tvl: ProtocolTvl[], // top 50 by TVL
trending_pools: TrendingPool[], // GeckoTerminal hot pools
sentiment: {
fear_greed_index: number, // 0–100
fear_greed_label: "extreme_fear" | "fear" | "neutral" | "greed" | "extreme_greed",
source_ref: number,
},
narratives: Narrative[], // tagged momentum buckets
risks: {
notable_red_flags: string[], // newly-surfaced risk signals
},
flags: Flag[], // unlock events, governance votes, regulator actions
source_status: Record<string, "ok" | "stale" | "error">,
}Each Mover carries symbol, price_usd, change_24h_pct, volume_24h_usd, mcap_usd, source_ref. Each Narrative carries tag, momentum_7d (hot | rising | cooling | cold | dead), evidence (short string list), and source_refs.
source_ref is the integer that resolves via the [N] citation system — source_ref = 1 matches pack.sources[0] (CoinGecko), etc.
Brief voice
The crypto brief is analyst-cool. Specific rules baked into the briefer prompt:
- Max 8 paragraphs.
- First paragraph = TL;DR, one-line market take.
- Last paragraph = explicit unknowns ("data missing on X due to source Y unavailable").
- Every numeric claim cites
[N]. - No hype words ("massive", "huge", "to the moon"). No exclamation marks. No emojis.
- Stale data flagged inline:
(last sync 12m ago).
Example (illustrative, not a live brief):
Bitcoin holds 96.4k after a 1.2% retrace [1]. ETH funding flipped negative on Binance and OKX [3], coinciding with a 4-hour cooldown in stablecoin minting [2]. Top-of-book depth in BTC pairs unchanged.
Three narratives moved: restaking is hot (8 of 12 active protocols seeing TVL inflows above 5% over 24h [2]), AI-token complex is cooling (median 24h change −3.2% across the 14 listed [1]), and prediction-market volume rose 18% week-on-week [4][8].
No regulator actions in the last 24h. No notable unlocks scheduled inside 72h [2]. CryptoCompare News rate-limited this pulse — headline scan incomplete; retry next cycle.
The brief regenerates once per day (86_400s cadence) — structured state advances every 5 minutes but the prose brief is intentionally less frequent to keep token costs sane and to give the agent something stable to attach to.
Pack-specific MCP tools
Three extras are planned for the crypto pack, currently scaffolded but inert in Phase 1.0:
cloven.crypto.rug_check(token, chain)— calls GoPlus on demand, returns the security audit (mint authority, ownership concentration, honeypot patterns).cloven.crypto.search_pool(query)— searches GeckoTerminal pools by token symbol or pool address.cloven.crypto.token_history(symbol, window)— returns a price + volume time-series for1h,24h, or7dwindows.
They are exposed via pack.extraTools when registered; until they are wired live, only the six common tools (fresh, brief, search, snapshot, subscribe, cite) are listed for the crypto pack.
Failure-mode behavior
If a source fails to fetch on a pulse:
- The compactor flags
source_status[id] = "stale"(or"error"). - Fields that depended on that source are omitted from the state — not faked.
- The brief explicitly notes "no signal from that source this sync."
- The pulse summary records the degraded state for the console health view.
- The cron retries the source on the next pulse.
If 3 or more sources are stale in the same pulse, the pulse is marked partial in pack:meta:crypto.errors and an alert fires (Slack webhook, manual Phase 1).
If Groq itself is down, the compactor returns the previous compacted state (with source_status retained), and the briefer step is skipped — the previous brief stays cached until Groq recovers.
Cost per pulse
Per pulse: ~9 HTTP fetches + 1 Groq compaction (llama-3.1-8b, ~3000 input tokens / 800 output tokens) + an optional Groq brief regeneration (llama-3.3-70b, daily). At current Groq pricing this lands at roughly $0.0008 per pulse — well inside the per-call billable price ($0.001 for fresh, $0.005 for brief).