The five agents¶
Each news item that passes your watchlist filter is handed to the agents at once: five, or four while SentimentPulse is switched off (below). 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 — the crowd tone an item reports, mention surges, divergence between price and chatter. Switched off for now: its Reddit, Stocktwits and YouTube lookups are all paused (see Paused sources), so it does not run and items get the other four agents. It runs again as soon as one of those sources is back. | |
| PolicyRadar | Regulatory and policy — export controls, sanctions, agency actions, central-bank statements. |
Which agents run: the orchestrator¶
Before the agents start, an orchestrator makes one short LLM call per item. It looks at the item, the current US market session (pre-market / regular / after-hours / closed, taken from the exchange calendar rather than the model), and your recent signals on the same tickers. Then it decides which agents have something to analyse. It returns only the agents' names: nothing is added to what the agents are given, so an agent sees the same item whether or not the orchestrator is in charge.
Guard rails:
- PolicyRadar runs on every item. The orchestrator chooses among the other four.
- Some sources always get a specific agent. Economic-calendar and official-data items always get MacroMind and SectorScan; RSS news always gets MacroMind; SEC filings, Yahoo Finance and press-wire items always get SectorScan. Reddit, Stocktwits and YouTube items (paused for now) always got SentimentPulse. The orchestrator can add agents to that set but never remove them.
- If the orchestrator fails or picks fewer than two agents in total, all agents that are switched on run.
The orchestrator currently runs in shadow mode. It records its choice, but every agent that is switched on still runs on every item, so its choices can be checked against what each agent actually found. It will only start skipping agents once that check shows that skipping would not have lowered any ALERT or FLASH signal. The check of October 2026 found that it would have: on Yahoo Finance news the orchestrator often left out MacroMind when MacroMind had set the score, so every agent that is switched on keeps running.
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"}
],
"reasoning": "... (at most 200 chars)"
}
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 outputs of the agents that ran as follows:
top_signal— the single row persisted tosignals. Its English and Chinese summary is written once per item, after aggregation, from the item, the combined result and the top agent's reasoning (the agents themselves no longer write summaries). It carries 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