Skip to content

The five agents

Each news item that passes your watchlist filter is handed to five agents at once. They run in parallel (about 20–40 s end-to-end per item on the current setup) and their outputs are aggregated into the final signal you see on the dashboard.

Agent Icon What it focuses on
SignalScope 🌐 Primary news parsing — what happened, who's involved, ticker-level facts. Optionally runs a Tavily web search to cross-reference.
MacroMind 💰 Macroeconomic framing — does this tie to a rate decision, CPI print, FX shock, geopolitical event? Zero relevance is a valid answer.
SectorScan 🏭 Sector and supply-chain propagation — who else benefits or suffers? TSM → ASML → AMAT chain, upstream vs downstream.
SentimentPulse 💬 Retail sentiment — Reddit, StockTwits, YouTube. Detects mention volume surges or divergence between price and chatter.
PolicyRadar ⚖ Regulatory and policy — export controls, sanctions, agency actions, central-bank statements.

What each agent outputs

All five produce the same structured output:

{
  "agent_id": "sectorscan",
  "signal_type": "routine_news",
  "urgency": "ALERT",
  "impact_score": 0.72,
  "confidence_score": 0.84,
  "tickers_linked": [
    {"ticker": "NVDA", "impact_score": 0.80, "link_type": "direct"},
    {"ticker": "TSM",  "impact_score": 0.60, "link_type": "sector"}
  ],
  "summary_en": "...",
  "summary_zh": "...",
  "reasoning": "..."
}

signal_type vocabulary is deliberately narrow (routine_news / earnings / policy_change / supply_chain / macro_event / ...). If the agent's lane isn't relevant to the item, it's still expected to reply structurally — with impact_score low — rather than silently bail. This keeps the aggregation math clean.

Aggregation

The engine combines the five outputs as follows:

  • top_signal — the single row persisted to signals. Carries the highest-impact agent's summary as the headline, and the weighted-average impact across all successful agents. Reasoning is a concatenation of all agents' reasoning (so the dashboard card can show every agent's angle in a collapsible block).
  • tickers_linked — union across all agents, deduped, averaged per-ticker.
  • agents_breakdown — every agent's individual scores, latency, and error (if any) is kept on the signal row so you can inspect the breakdown in the dashboard's collapsible panel.

Why five and not one

Empirically, one big prompt that tries to judge "importance" for a financial news item drifts fast — different lanes (regulatory vs sentiment vs supply-chain) answer on different axes. Splitting the concern gives the UI something much richer to show (the agent-breakdown panel), gives us independent signals for Reflexion to critique, and means a single agent's outage or hallucination cannot swing the aggregate far.

See also

  • Scoring — how the urgency tier is derived from impact_score
  • Claw chat (RAG) — how agents' summaries become queryable knowledge