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.svg

Sources

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.

SourcePublic URLCadenceAuth
coingeckocoingecko.com5 minCOINGECKO_API_KEY (optional, raises rate limits)
defillamadefillama.com5 min
geckoterminalgeckoterminal.com5 min
dexscreenerdexscreener.com5 min (default)
goplusgopluslabs.ioon-demand
cryptocompare_newsmin-api.cryptocompare.com15 min— (optional API key)
fear_greedalternative.me1 hr
gdeltgdeltproject.org30 min
redditreddit.com15 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 for 1h, 24h, or 7d windows.

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:

  1. The compactor flags source_status[id] = "stale" (or "error").
  2. Fields that depended on that source are omitted from the state — not faked.
  3. The brief explicitly notes "no signal from that source this sync."
  4. The pulse summary records the degraded state for the console health view.
  5. 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).