MAF — Arena Gallery
Every arena shipped today, what it does, what agents and data sources it uses, and how to configure it.
For the "how arenas work in general" view see Architecture → Arenas. For the structured editor that lets you change any of this without touching YAML see Configuring an arena in the manual.
Table of contents
- Agnostic target types — the framework is not ticker-only
- How to read this gallery
- Configuration — what you can change, and from where
- Arena directory
- Agnostic / router —
intent_router◆ free-text dispatch ·sector_pulse◆ multi-target - Trading arenas —
market_pulse·trading_intelligence·alpaca_live·report_to_action - Research arenas —
equity_research★ vendored Anthropic-FS agents ·research_debate - Deliberation arenas —
mastermind·crowd_simulation
Agnostic target types — the framework is not ticker-only
MAF arenas operate on a typed Target, not just a ticker. The target shape:
class Target:
type: str # ticker | sector | tickers | question | event | document | deal | free_text
primary_id: str # main identifier (NVDA / "AI semis" / question_id / …)
secondary_ids: list[str] # peers in a sector, related entities
metadata: dict # angle, date, mode, …
Target.from_dict infers the type from any legacy target dict ({ticker: ...} → ticker, {sector, tickers} → sector, {question_id} → question, etc.).
Auto-prune
Agents, sources, and arenas declare which target types they apply to via
applicable_target_types: [...]. At every run:
Arena.runbuilds aTargetfrom the input.- If any agent or source has filters set,
_build_graph(target_type=...)prunes the phase graph — agents whose list doesn't include the current target type are skipped. - Agents with empty
applicable_target_types(the default) apply to everything — backwards-compatible.
Tests: test_target_autoprune.py.
Prognosis envelope
Every arena run can emit a unified Prognosis envelope that carries either a structured trade verdict (BUY / SELL / HOLD) or a free-form statement, plus key factors, ideas shortlist, alternatives considered, data quality, citations. The dashboard reads this single shape across all arenas. TradingAction and GenericDecision wire shapes are preserved on the existing streams for back-compat.
Where to start as a non-trading user
Open the intent_router arena: type a free-text question and let MAF pick the right downstream arena automatically. Examples below.
How to read this gallery
Each arena section has the same shape:
- Purpose — what question this arena answers.
- Target — what
target_keyit expects and what the run dialog asks for. - Output — which Redis stream verdicts publish to + envelope type.
- Loop / prediction type — synchronous one-shot vs. replan loop; what kind of verdict (BUY/HOLD/SELL, research note, decision envelope, …).
- LLMs — model tier per agent (
quick/deep) and what the picker maps each to. - Agents — table of every agent in every phase, with role, sources bound, and prompt file.
- Data sources — every binding, what adapter, what it returns.
- Smart triggers — declarative rules that auto-fire the arena.
- Configure — direct link to the Setup tab on the dashboard.
Configuration — what you can change, and from where
| You want to change | Where | Reload required? |
|---|---|---|
| Agents (add/remove/edit prompt/sources/role/tier/max steps) | /arenas/{name}#setup → Agents section |
Yes — restart worker |
| Data sources (bindings, params, adapter) | /arenas/{name}#setup → Data sources section |
Yes — restart worker |
| Phases (order, pattern, transitions) | /arenas/{name}#setup → Phases section |
Yes — restart worker |
| Smart triggers (auto-run rules) | /arenas/{name}#setup → Smart triggers section |
Yes — restart worker (or reload_config control command) |
LLM tier mapping (quick → which model, deep → which model) |
config/default.yaml → llm.providers.<provider> |
Yes |
| Watched symbols (drives Kronos refresher + Mirofish refresher) | POST /api/watch or /api/watch UI |
No — TTL-based |
| Adapter availability (enable/disable a data module) | /modules page or PUT /api/modules/{name} |
Yes |
| Model picker behaviour | MAF_USE_RANKINGS=1 env var → consult RankingsCache |
Yes |
Adding a new arena from scratch:
- Click Wizard in the top nav → describe the arena → LLM scaffolds a YAML in
config/arenas/. - Or drop a YAML in
config/arenas/yourself. Loader scans on startup (load_config). - Refine via the Setup tab once the worker has loaded it.
Adding new prediction types / loops: the arena's phase graph drives it. Three patterns are built in:
- parallel — every agent runs in its own deep-copied state, results merged. Used for fan-out specialists.
- sequential — agents run one after the other, each sees the latest state.
- debate — N-way round-robin between debater agents for
max_rounds, then a judge synthesises.
For loop-back ("re-run with more data if confidence too low"), set max_iterations > 1 and add a replan agent — it inspects the synthesis output, checks for gap markers (stale_*, no_*), and bumps the state back to the analysis phase up to max_iterations times.
Arena directory
| Arena | Target types | Output | Triggers | Vendored prompts |
|---|---|---|---|---|
intent_router ◆ |
free_text + all |
router-only | — | classifier (MAF-native) |
sector_pulse ◆ |
ticker, sector, tickers |
unified Prognosis |
2 | Anthropic FS sector_reader, comps_spreader |
news_event ◆ |
event, free_text |
unified Prognosis |
2 | impact analyst (MAF-native) |
ad_hoc_question ◆ |
question, free_text |
unified Prognosis |
— | general analyst (MAF-native) |
market_pulse |
ticker |
maf:actions:out |
2 | — |
trading_intelligence |
ticker |
maf:actions:out |
2 | — |
alpaca_live |
ticker |
maf:actions:out |
2 | — |
report_to_action |
ticker |
maf:actions:out |
— | Anthropic FS earnings_reviewer |
equity_research |
sector, tickers |
maf:decisions:out |
1 | Anthropic FS sector_reader, comps_spreader, note_writer |
research_debate |
question, document |
maf:decisions:out |
— | — |
mastermind |
any | maf:arena:mastermind:output |
— | — |
crowd_simulation |
event, document |
maf:arena:crowd_simulation:output |
— | — |
◆ = added in the agnostic-target rework. ★ = vendored Anthropic-FS prompts.
intent_router
Purpose. Free-text in → classify target_type + extract entities → dispatch to the right downstream arena. The agnostic entry point that makes MAF feel less ticker-centric. Users (or upstream callers) submit any natural-language request and the router picks the arena.
| Field | Value |
|---|---|
| Source | config/arenas/intent_router.yaml |
| target_key | text (free-form request body) |
| Applicable target types | all 8 (free_text, question, ticker, sector, tickers, event, document, deal) |
| Run-dialog input | Free-text request — e.g. "Should I buy NVDA?", "Walk me through the AI semis sector", "Review this RFC" |
| Output | maf:arena:intent_router:output — Prognosis envelope summarising the routing decision |
| Configure | Setup tab |
Phase graph
classify (sequential, 1 specialist)
→ synthesis (sequential, 1 synthesis agent that packages the routing prognosis)
→ END
Agents
| Phase | Agent | Role | Tier | Sources | Prompt |
|---|---|---|---|---|---|
| classify | intent_classifier |
specialist | deep | web, resolve_ticker |
intent_classifier.md |
| synthesis | synthesis_agent |
synthesis | quick | — | synthesis_agent.txt |
The classifier emits a structured route with arena + target + action_mode. The synthesis agent packages it as the final Prognosis (verdict=None, statement = one-line routing decision, key_factors = extracted entities).
Data sources
| Name | Adapter | Purpose |
|---|---|---|
web |
web_search |
Verify a sector/company name when ambiguous |
resolve_ticker |
eodhd (tool: resolve_ticker) |
Translate "Nvidia" → NVDA.US, ISIN → symbol |
Example traces
| User input | Classified | Routed to |
|---|---|---|
| "Should I buy NVDA right now?" | ticker / NVDA / intent=trade / horizon=intraday |
market_pulse |
| "Walk me through the AI semis sector" | sector / AI semis |
equity_research |
| "Is this RFC safe for our portfolio?" | question / + document attached |
research_debate |
| "How does the Fed announcement affect us?" | event |
crowd_simulation |
| "Compare NVDA AMD AVGO" | tickers / NVDA + peers |
sector_pulse |
| "What's the general market doing today?" | free_text |
mastermind |
sector_pulse
Purpose. Agnostic pulse arena demonstrating the auto-prune pattern. Works on a single ticker OR a sector OR a basket of tickers — agents whose
applicable_target_typesdoesn't include the active target type are pruned out of the phase graph at run time.
| Field | Value |
|---|---|
| Source | config/arenas/sector_pulse.yaml |
| target_key | inferred — ticker / sector / tickers |
| Applicable target types | ticker, sector, tickers |
| Run-dialog input | {ticker: NVDA} OR {sector: "AI semis", tickers: [...]} OR {tickers: [...]} |
| Output | unified Prognosis to maf:arena:sector_pulse:output |
| Configure | Setup tab |
Phase graph
analysis (parallel, up to 6 specialists — auto-pruned per target type)
→ synthesis (sequential, 1 synthesis agent)
→ END
Agents — auto-prune in action
| Phase | Agent | Tier | Sources | Active for target type |
|---|---|---|---|---|
| analysis | price_pulse |
quick | bars_1m, indicators, kronos_forecast_1m | ticker only |
| analysis | kronos_specialist |
quick | kronos_forecast_1m | ticker only |
| analysis | crowd_proxy |
quick | mirofish_crowd | ticker only |
| analysis | sector_reader ★ |
deep | latest_news, sector_graph, macro_context, eodhd_news | sector / tickers |
| analysis | comps_spreader ★ |
quick | peer_snapshot, peer_bars_history, eodhd_fundamentals | sector / tickers |
| analysis | news_analyst |
quick | latest_news, eodhd_news, eodhd_fundamentals | all |
| synthesis | synthesis_agent |
deep | — | all |
★ = vendored Anthropic-FS prompt.
What runs per target type
| Run | Active agents | Active sources |
|---|---|---|
target={ticker: NVDA} |
price_pulse + kronos_specialist + crowd_proxy + news_analyst + synthesis_agent | bars_1m, indicators, kronos_forecast_1m, mirofish_crowd, latest_news, eodhd_* |
target={sector: "AI semis", tickers: [...]} |
sector_reader + comps_spreader + news_analyst + synthesis_agent | peer_snapshot, peer_bars_history, macro_context, sector_graph, latest_news, eodhd_* |
target={tickers: ["NVDA","AMD"]} |
comps_spreader + news_analyst + synthesis_agent | peer_snapshot, peer_bars_history, macro_context, latest_news, eodhd_* |
Same arena config, three different effective phase graphs — no special-casing in the runtime.
Smart triggers
- Kronos high-confidence ticker pulse —
kronos:forecasts:emittedwhenprob_up > 0.75 or prob_up < 0.25, cooldown 120s. - MiroFish multi-ticker sector hint —
mirofish:sims:emittedwhentickers != [], cooldown 300s.
news_event
Purpose. Map a news headline / event → impacted tickers ranked by direction and magnitude. Lightweight (one analyst, one synthesis) — designed to be auto-fired off triggers when a high-impact wire item lands.
| Field | Value |
|---|---|
| Source | config/arenas/news_event.yaml |
| target_key | event_id |
| Applicable target types | event, free_text |
| Run-dialog input | {event_id, text} or {text} |
| Output | unified Prognosis (no BUY/SELL — impacted_tickers carried in Prognosis.ideas) |
| Configure | Setup tab |
Phase graph
analysis (sequential, 1 event_impact_analyst)
→ synthesis (sequential, packages impacted_tickers as Prognosis ideas)
→ END
Agents
| Phase | Agent | Role | Tier | Sources | Prompt |
|---|---|---|---|---|---|
| analysis | event_impact_analyst |
specialist | deep | latest_news, knowledge_base, macro_context, web, eodhd_news, eodhd_resolve_ticker |
event_impact_analyst.md (MAF-native) |
| synthesis | synthesis_agent |
synthesis | quick | — | synthesis_agent.txt |
Data sources
| Name | Adapter | Purpose |
|---|---|---|
latest_news |
trtools2_news |
Recent wire context — what else is happening |
knowledge_base |
fomo2_knowledge |
Entity graph — Fed → rates → banks → tech cascade |
macro_context |
fred_api |
Macro indicators (rates, CPI, GDP) when event is macro |
web |
web_search |
Expand event text when only an ID is given |
eodhd_news |
eodhd (tool: get_news) |
Broader institutional wire coverage |
eodhd_resolve_ticker |
eodhd (tool: resolve_ticker) |
Company name → SYMBOL.EXCHANGE |
Smart triggers
- High-impact news sentiment —
trtools2:newswhenabs(sentiment) > 0.7, cooldown 120s. - fomo2 report propagation —
fomo2:reportswhenever a new report lands, cooldown 60s.
Example output
Show raw JSON
{
"signal": "MIXED",
"confidence": 0.7,
"summary": "Fed signals Q4 cut — net positive for small-cap tech, negative for banks",
"impacted_tickers": [
{"ticker": "ARKK", "direction": "positive", "magnitude": "high",
"why": "small-cap growth benefits most from cost-of-capital relief"},
{"ticker": "JPM", "direction": "negative", "magnitude": "medium",
"why": "NIM compression on lower rates"}
]
}ad_hoc_question
Purpose. Lightweight Q&A for free-form finance/markets questions. Faster than
mastermind(one analyst, one synthesis, no graph_query/memory/debate phases) but with web + knowledge graph + macro grounding so the answer is sourced, not hallucinated.
| Field | Value |
|---|---|
| Source | config/arenas/ad_hoc_question.yaml |
| target_key | question |
| Applicable target types | question, free_text |
| Run-dialog input | Free-text question — {question: "What's the impact of higher rates on small-cap tech?"} |
| Output | unified Prognosis (no BUY/SELL — answer in statement, counter-view in alternatives_considered) |
| Configure | Setup tab |
Phase graph
research (sequential, 1 general_analyst)
→ synthesis (sequential, packages answer + counter_view as Prognosis)
→ END
Agents
| Phase | Agent | Role | Tier | Sources | Prompt |
|---|---|---|---|---|---|
| research | general_analyst |
specialist | deep | web, knowledge_base, latest_news, eodhd_news, macro_context, filings |
general_analyst.md (MAF-native) |
| synthesis | synthesis_agent |
synthesis | quick | — | synthesis_agent.txt |
Data sources
| Name | Adapter | Purpose |
|---|---|---|
web |
web_search |
Current news, analyst commentary, definitions |
knowledge_base |
fomo2_knowledge |
Cached graph relations |
latest_news |
trtools2_news |
Recent ticker-tagged news |
eodhd_news |
eodhd (tool: get_news) |
Broader institutional wire |
macro_context |
fred_api |
Macro indicators (rates, CPI, GDP) |
filings |
sec_filings |
Primary-source company text |
When to use what
| User intent | Arena |
|---|---|
| "What is X?" / "Explain X" / "Compare X and Y" | ad_hoc_question |
| Same but needs memory of prior decisions / multiple stakeholders | mastermind |
| "Should we approve this RFC?" | research_debate |
| Ticker-specific trade question ("Should I buy X?") | market_pulse or intent_router |
market_pulse
Purpose. 1-minute pulse on a watched symbol. Light, fast, replan-aware. Fanned-out specialists vote on a near-term direction; the synthesis weighs them; the replan controller decides whether to re-run with extra sources or commit. Publishes a
TradingActionenvelope tomaf:actions:out.
| Field | Value |
|---|---|
| Source | config/arenas/market_pulse.yaml |
| target_key | ticker |
| Run-dialog input | Ticker symbol |
| Output | maf:actions:out (TradingAction) + maf:arena:market_pulse:output |
| Loop | max_iterations: 3 — replan can re-run analysis up to 2 more times with extra sources |
| Verdict vocabulary | BUY / HOLD / SELL |
| Configure | Setup tab |
Phase graph
analysis (parallel, 4 specialists)
→ synthesis (sequential, 1 synthesis agent)
→ replan_check (sequential, 1 replan agent)
→ emit (sequential)
Agents
| Phase | Agent | Role | Tier | Sources | Prompt |
|---|---|---|---|---|---|
| analysis | price_analyst |
specialist | quick | bars_1m_target, indicators_target, strategy_events |
price_analyst.txt |
| analysis | news_analyst |
specialist | quick | news_recent |
news_analyst.txt |
| analysis | vol_regime_analyst |
specialist | quick | bars_1m_vix, indicators_target |
vol_regime_analyst.txt |
| analysis | kronos_specialist |
specialist | quick | kronos_forecast_1m |
kronos_specialist.txt |
| synthesis | synthesis_agent |
synthesis | deep | (reads upstream signals) | synthesis_agent.txt |
| replan_check | replan_controller |
replan | deep | (reads synthesis + gap markers) | default ReplanAgent |
| emit | (no agent — publish phase) | — | — | — | — |
Data sources
| Name | Adapter | What it returns |
|---|---|---|
bars_1m_target |
trtools2_bars |
1m OHLCV stream tail for the target ticker |
bars_1m_vix |
trtools2_bars |
1m bars for ^VIX — feeds vol regime analyst |
indicators_target |
trtools2_indicators |
Pre-computed RSI/EMA/MACD etc. for target |
news_recent |
trtools2_news |
Last N news items tagged with target |
strategy_events |
trtools2_strategy_events |
Strategy engine BUY/SELL events |
kronos_forecast_1m |
kronos_forecast |
Cached Kronos 1m direction prob (refresher-fed) |
fomo2_deep_news |
fomo2_request |
On-demand deep news pull when shallow news is thin |
fomo2_knowledge |
fomo2_knowledge |
Cached graph context (entities, relations) |
macro_context |
fred_api |
Rates, VIX, fear-greed for macro framing |
enriched_items |
fomo2_items |
NLP-enriched items from fomo2 |
Smart triggers
- Kronos prob shift —
kronos:forecasts:emittedwhenabs(prob_up_delta) > 0.15 or direction_flipped, cooldown 60s, modesemi. - trtools2 strategy event —
trtools2:strategy:eventswhenaction in {BUY, SELL}, cooldown 300s, modesemi.
trading_intelligence
Purpose. Full multi-source deliberation for higher-conviction trading calls. Eight specialists fan out across price, sentiment, on-chain, macro, risk, committee (TradingAgents committee), Kronos forecast, and the MiroFish crowd-sim proxy. One synthesis agent reconciles. Publishes to
maf:actions:out.
| Field | Value |
|---|---|
| Source | config/arenas/trading_intelligence.yaml |
| target_key | ticker |
| Run-dialog input | Ticker symbol + optional trade date |
| Output | maf:actions:out + maf:arena:trading_intelligence:output (TradingIntelligenceEnvelope) |
| Schedule | 1h (cron) — runs hourly on the watch list |
| Loop | max_iterations: 1 — no replan, one-shot deliberation |
| Verdict vocabulary | BUY / HOLD / SELL with confidence |
| Configure | Setup tab |
Phase graph
analysis (parallel, 8 specialists)
→ synthesis (sequential, 1 synthesis agent)
→ END
Agents
| Phase | Agent | Role | Tier | Sources |
|---|---|---|---|---|
| analysis | price_analyst |
specialist | quick | yahoo_quote, market_overview, market_bars, indicators, live_bars, strategy_signals |
| analysis | sentiment_analyst |
specialist | quick | newsapi_headlines, yahoo_news, news_digest, news_items, social_sentiment, nlp_enrichment, knowledge_base |
| analysis | onchain_analyst |
specialist | quick | coingecko_market, coingecko_global, yahoo_quote, market_bars, social_sentiment |
| analysis | macro_analyst |
specialist | quick | fred_macro, fred_fear_greed, market_overview, news_digest, investing_analysis |
| analysis | risk_analyst |
specialist | quick | yahoo_quote, market_bars, market_overview, indicators, insider_transactions |
| analysis | committee_analyst |
specialist | quick | committee (TradingAgents sidecar) |
| analysis | kronos_specialist |
specialist | quick | kronos_forecast_1h |
| analysis | crowd_proxy |
specialist | quick | crowd_sim (MiroFish) |
| synthesis | synthesis_agent |
synthesis | deep | (reads all 8 signals) |
All prompts under src/maf/arenas/trading_intelligence/prompts/.
Data sources
25 bindings — full list in the YAML. Notable groups:
- Price/volume — yahoo_finance, questdb (bars + quotes), trtools2_live, technical indicators.
- News/sentiment — newsapi, yahoo, fomo2 (analysis, items, stream, enrichment, knowledge).
- On-chain — coingecko (market, global).
- Macro — FRED (rates, fear/greed), market_overview.
- Filings — sec_filings (insider transactions).
- Predictions — Kronos 1h forecast, MiroFish crowd-sim, TradingAgents committee.
Smart triggers
- MiroFish crowd-sim mentions tickers —
mirofish:sims:emitted, cooldown 180s. - Kronos 1h direction flip —
kronos:forecasts:emittedwhentimeframe == '1h' and direction_flipped, cooldown 300s.
alpaca_live
Purpose. Trading arena fed by Alpaca data via trtools2 (live Redis streams + HTTP API) — MAF never calls Alpaca directly. Lean: one analyst + synthesis. Demonstrates the trtools2-as-source-of-truth pattern.
| Field | Value |
|---|---|
| Source | config/arenas/alpaca_live.yaml |
| target_key | ticker |
| Output | maf:actions:out + maf:arena:alpaca_live:output |
| Loop | max_iterations: 1 |
| Configure | Setup tab |
Phase graph
analysis (parallel, 1 specialist)
→ synthesis (sequential, 1 synthesis agent)
→ END
Agents
| Phase | Agent | Role | Tier | Sources |
|---|---|---|---|---|
| analysis | trtools2_analyst |
specialist | quick | all 7 trtools2 sources (hot + warm) |
| synthesis | synthesis_agent |
synthesis | deep | (reads analyst signal) |
Data sources
| Name | Adapter | Path |
|---|---|---|
bars_1m, bars_1h |
trtools2_bars |
Hot — Redis Streams populated by trtools2's feed engine |
news_live |
trtools2_news |
Hot — Redis Stream |
strategy_events |
trtools2_strategy_events |
Hot — Redis Stream |
history_bars, snapshot, feed_health |
trtools2_api |
Warm — HTTP API at port 8888 (requires TT2_API_KEY) |
Smart triggers
- Kronos high-confidence directional call —
prob_up > 0.75 or prob_up < 0.25, cooldown 120s. - trtools2 strategy event —
action in {BUY, SELL}, cooldown 60s, modesemi.
report_to_action
Purpose. Fast-path arena: takes a fomo2 markdown report and condenses it to one tradeable BUY/HOLD/SELL action. The earnings_reviewer specialist (★ vendored from Anthropic Financial Services) gives the arena a senior-equity-research view when the report covers an earnings event.
| Field | Value |
|---|---|
| Source | config/arenas/report_to_action.yaml |
| target_key | ticker |
| Output | maf:actions:out + maf:arena:report_to_action:output |
| Configure | Setup tab |
Phase graph
analysis (parallel, 4 specialists — including the vendored Anthropic-FS earnings_reviewer)
→ synthesis (sequential, 1 synthesis agent with bm25 memory)
→ END
Agents
| Phase | Agent | Role | Tier | Sources | Prompt |
|---|---|---|---|---|---|
| analysis | signal_analyst |
specialist | quick | report, indicators, strategy_events |
market_analyst.txt |
| analysis | sentiment_analyst |
specialist | quick | latest_news, enriched_items, deep_data_request |
news_analyst.txt |
| analysis | risk_analyst |
specialist | quick | indicators, strategy_events |
risk_analyst.txt |
| analysis ★ | earnings_reviewer |
specialist | deep | latest_news, deep_data_request, indicators, eodhd_fundamentals, eodhd_earnings_calendar, eodhd_news |
earnings_reviewer.md ★ vendored from Anthropic FS |
| synthesis | synthesis_agent (memory: synthesis_bm25) |
synthesis | deep | — | synthesis_agent.txt |
Data sources
| Name | Adapter | Notes |
|---|---|---|
report |
fomo2_report |
The fomo2 markdown report being condensed |
latest_news |
trtools2_news |
Recent news tagged with ticker |
indicators |
trtools2_indicators |
Pre-computed indicators |
strategy_events |
trtools2_strategy_events |
Strategy engine signals |
enriched_items |
fomo2_items |
NLP-enriched items |
deep_data_request |
fomo2_request |
On-demand deep pull |
★ eodhd_fundamentals |
eodhd |
EODHD MCP — institutional fundamentals + consensus |
★ eodhd_earnings_calendar |
eodhd |
EODHD MCP — reporting dates + analyst estimates |
★ eodhd_news |
eodhd |
EODHD MCP — institutional wire news |
Requires EODHD_API_KEY in .env for the EODHD sources; arena degrades gracefully when missing.
Smart triggers
None configured by default — wire to fomo2:reports if you want auto-fire on new fomo2 reports.
equity_research ★ vendored Anthropic-FS agents
Purpose. Sector / thematic research. Adapted from Anthropic Cowork's
market-researchercookbook — three agents whose prompts are vendored verbatim fromanthropics/financial-services. Produces a research-note-quality deliverable on a sector or theme. Publishes aGenericDecisiontomaf:decisions:out(research, not trading).
| Field | Value |
|---|---|
| Source | config/arenas/equity_research.yaml |
| target_key | sector_id |
| Run-dialog input | Free-text: {sector, angle, tickers: ["NVDA", "AMD", ...]} |
| Output | maf:decisions:out (GenericDecision) + maf:arena:equity_research:output |
| Loop | max_iterations: 1 |
| Verdict vocabulary | BULLISH / BEARISH / NEUTRAL + ideas shortlist |
| Configure | Setup tab |
Phase graph
research (parallel, 2 specialists)
→ synthesis (sequential, 1 note_writer)
→ END
Agents
| Phase | Agent | Role | Tier | Sources | Prompt (vendored ★) |
|---|---|---|---|---|---|
| research ★ | sector_reader |
specialist | deep | latest_news, sector_graph, filings, web, macro_context, eodhd_news, eodhd_resolve_ticker |
sector_reader.md |
| research ★ | comps_spreader |
specialist | quick | snapshot, bars_history, eodhd_fundamentals, eodhd_eod, eodhd_earnings_calendar |
comps_spreader.md |
| synthesis ★ | note_writer |
synthesis | deep | (reads upstream signals) | note_writer.md |
All prompts vendored from upstream plugins/agent-plugins/market-researcher/ with Anthropic-MCP tool refs translated to MAF source bindings per MAF_TOOL_TRANSLATION.md.
Data sources
12 bindings — three data backbones:
- fomo2 —
sector_graph(cached graph context). - trtools2 —
snapshot,bars_history,latest_news. - EODHD MCP —
eodhd_fundamentals,eodhd_earnings_calendar,eodhd_eod,eodhd_resolve_ticker,eodhd_news. - External —
macro_context(FRED),filings(SEC EDGAR),web(web_search).
Smart triggers
- MiroFish high-impact crowd-sim mentions a sector —
mirofish:sims:emittedwhentickers != [], cooldown 1800s.
research_debate
Purpose. Multi-stakeholder deliberation on a free-text question. Three personas (engineering, legal, business) read the proposal, a chair synthesises. Optional replan if confidence is low.
| Field | Value |
|---|---|
| Source | config/arenas/research_debate.yaml |
| target_key | question_id |
| Run-dialog input | Free-text proposal / RFC + optional title |
| Output | maf:decisions:out |
| Loop | max_iterations: 2 — replan can re-run with extra sources |
| Verdict vocabulary | Free-form (e.g. approve / needs_revision) |
| Configure | Setup tab |
Phase graph
analysis (parallel, 3 personas)
→ synthesis (sequential, chair)
→ replan_check (sequential)
→ emit (sequential)
Agents
| Phase | Agent | Role | Tier | Sources | Prompt |
|---|---|---|---|---|---|
| analysis | engineering |
specialist | quick | knowledge_base |
engineering_persona.txt |
| analysis | legal |
specialist | quick | knowledge_base |
legal_persona.txt |
| analysis | business |
specialist | quick | knowledge_base, crowd_sim |
business_persona.txt |
| synthesis | chair |
synthesis | deep | — | synthesis_persona.txt |
| replan_check | replan_controller |
replan | deep | — | default ReplanAgent |
Data sources
| Name | Adapter | Purpose |
|---|---|---|
knowledge_base |
fomo2_knowledge |
Graph context for all personas |
crowd_sim |
mirofish_sim |
MiroFish crowd-sim (consulted by the business persona) |
mastermind
Purpose. Open-ended deliberation arena. Seven-phase pipeline: frame the question → gather across multiple arenas in parallel → query graph → retrieve from memory → debate → judge → emit. Produces a
DecisionEnvelopewith argument tree, arena votes, memory citations, graph citations.
| Field | Value |
|---|---|
| Source | config/arenas/mastermind.yaml |
| target_key | ticker (despite the name — the arena is generic but ticker-keyed by default) |
| Output | maf:arena:mastermind:output (specialised stream) |
| Loop | max_iterations: 1 — internal multi-phase pipeline does the heavy lifting |
| Configure | Setup tab |
Phase graph
frame → gather (parallel) → graph_query → memory_retrieve → debate → judge → emit
Agents
| Phase | Agent | Role | Tier |
|---|---|---|---|
| judge | judge |
judge | deep |
(other phases use built-in mastermind machinery — see mastermind/ module) |
Memory + outcomes
Mastermind decisions are persisted into a DecisionMemory (BM25 + ChromaDB). When the engine fills/closes a position, the ExecutionHarvester correlates it back via arena_id and backfills outcome + lesson. The next run's recall pass finds the outcome — feedback loop closed.
crowd_simulation
Purpose. Wraps the MiroFish crowd-simulation oracle into an MAF arena. Five-phase pipeline: ingest input → run mirofish sim → aggregate personas → synthesise → emit. Produces a
CrowdPredictionEnvelopetagged withdecision_kind(polymarket_side / fomo2_signal / oddsoddy_multiplier).
| Field | Value |
|---|---|
| Source | config/arenas/crowd_simulation.yaml |
| target_key | ticker |
| Output | maf:arena:crowd_simulation:output (specialised stream) |
| Configure | Setup tab |
Phase graph
ingest_input → run_mirofish_sim → aggregate_personas → synthesize → emit
The arena delegates most work to the mirofish-svc sidecar — see mirofish.md for the 5-stage flow.
Data sources
| Name | Adapter | Purpose |
|---|---|---|
crowd_sim |
mirofish_crowd |
Direct HTTP call to mirofish-svc |
Did I integrate Anthropic's financial agents? — yes
| Vendored prompt | Where it runs | Upstream source |
|---|---|---|
earnings_reviewer.md |
report_to_action arena, earnings_reviewer specialist |
plugins/agent-plugins/earnings-reviewer/agents/earnings-reviewer.md |
market_researcher.md |
(available — not currently wired; can be used as a top-level prompt for any new sector-research arena) | plugins/agent-plugins/market-researcher/agents/market-researcher.md |
sector_reader.md |
equity_research, sector_reader specialist |
managed-agent-cookbooks/market-researcher/subagents/sector-reader.yaml |
comps_spreader.md |
equity_research, comps_spreader specialist |
managed-agent-cookbooks/market-researcher/subagents/comps-spreader.yaml |
note_writer.md |
equity_research, note_writer synthesis |
managed-agent-cookbooks/market-researcher/subagents/note-writer.yaml |
earnings_analysis.md |
Skill — referenced from earnings_reviewer prompt |
plugins/vertical-plugins/equity-research/skills/earnings-analysis/SKILL.md |
sector_overview.md |
Skill — referenced from sector_reader + market_researcher prompts |
plugins/vertical-plugins/equity-research/skills/sector-overview/SKILL.md |
Plus two new adapters that give every agent access to EODHD's MCP server (77 institutional-data tools — fundamentals, earnings calendar, news, EOD bars, ticker resolution, …):
MCPSource— generic, wraps any MCP server URL.EODHDSource— subclass pinned to EODHD's hosted server. ReadsEODHD_API_KEYfrom env.
See MAF_TOOL_TRANSLATION.md for the full translation of upstream mcp__* tool refs into MAF source bindings.
What's NOT vendored (and why)
- Back-office agents (
kyc-screener,gl-reconciler,month-end-closer,statement-auditor) — these are back-office workflows that don't strengthen MAF's trading/research focus. They exist upstream and can be vendored later if a use case shows up. - Office-tooling skills (
pptx-author,docx-author) — upstream agents write.docx/.pptxfiles via the Office MCP. MAF agents emit a single structuredAgentSignalJSON — no Office runtime required. callable_agentshandoff_request pattern — Anthropic's managed-agent runtime routes sub-agent delegation throughhandoff_requestevents. MAF'sPhaseGraphalready handles this cleaner with direct phase transitions + replan loops.
If you want any other Anthropic-FS agent vendored in, ping me with the slug — it's a 10-minute vendor-in: copy the prompt, translate tool refs, add an agent entry to the relevant arena YAML.