checking system…
Docs / Arena Gallery
Per-arena breakdown — every agent, source, trigger, prompt, and how to configure each via the Setup tab.

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

  1. Agnostic target types — the framework is not ticker-only
  2. How to read this gallery
  3. Configuration — what you can change, and from where
  4. Arena directory
  5. Agnostic / routerintent_router ◆ free-text dispatch · sector_pulse ◆ multi-target
  6. Trading arenasmarket_pulse · trading_intelligence · alpaca_live · report_to_action
  7. Research arenasequity_research ★ vendored Anthropic-FS agents · research_debate
  8. Deliberation arenasmastermind · 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:

  1. Arena.run builds a Target from the input.
  2. 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.
  3. 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.


Each arena section has the same shape:

  • Purpose — what question this arena answers.
  • Target — what target_key it 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}#setupAgents section Yes — restart worker
Data sources (bindings, params, adapter) /arenas/{name}#setupData sources section Yes — restart worker
Phases (order, pattern, transitions) /arenas/{name}#setupPhases section Yes — restart worker
Smart triggers (auto-run rules) /arenas/{name}#setupSmart triggers section Yes — restart worker (or reload_config control command)
LLM tier mapping (quick → which model, deep → which model) config/default.yamlllm.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:

  1. Click Wizard in the top nav → describe the arena → LLM scaffolds a YAML in config/arenas/.
  2. Or drop a YAML in config/arenas/ yourself. Loader scans on startup (load_config).
  3. 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_types doesn'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 pulsekronos:forecasts:emitted when prob_up > 0.75 or prob_up < 0.25, cooldown 120s.
  • MiroFish multi-ticker sector hintmirofish:sims:emitted when tickers != [], 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 sentimenttrtools2:news when abs(sentiment) > 0.7, cooldown 120s.
  • fomo2 report propagationfomo2:reports whenever a new report lands, cooldown 60s.

Example output

Readable view
signalMIXED
confidence0.7
summaryFed signals Q4 cut — net positive for small-cap tech, negative for banks
impacted_tickers
[0]
tickerARKK
directionpositive
magnitudehigh
whysmall-cap growth benefits most from cost-of-capital relief
[1]
tickerJPM
directionnegative
magnitudemedium
whyNIM compression on lower rates
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 TradingAction envelope to maf: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 shiftkronos:forecasts:emitted when abs(prob_up_delta) > 0.15 or direction_flipped, cooldown 60s, mode semi.
  • trtools2 strategy eventtrtools2:strategy:events when action in {BUY, SELL}, cooldown 300s, mode semi.

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 tickersmirofish:sims:emitted, cooldown 180s.
  • Kronos 1h direction flipkronos:forecasts:emitted when timeframe == '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 callprob_up > 0.75 or prob_up < 0.25, cooldown 120s.
  • trtools2 strategy eventaction in {BUY, SELL}, cooldown 60s, mode semi.

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-researcher cookbook — three agents whose prompts are vendored verbatim from anthropics/financial-services. Produces a research-note-quality deliverable on a sector or theme. Publishes a GenericDecision to maf: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:

  • fomo2sector_graph (cached graph context).
  • trtools2snapshot, bars_history, latest_news.
  • EODHD MCPeodhd_fundamentals, eodhd_earnings_calendar, eodhd_eod, eodhd_resolve_ticker, eodhd_news.
  • Externalmacro_context (FRED), filings (SEC EDGAR), web (web_search).

Smart triggers

  • MiroFish high-impact crowd-sim mentions a sectormirofish:sims:emitted when tickers != [], 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 DecisionEnvelope with 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 CrowdPredictionEnvelope tagged with decision_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. Reads EODHD_API_KEY from 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 / .pptx files via the Office MCP. MAF agents emit a single structured AgentSignal JSON — no Office runtime required.
  • callable_agents handoff_request pattern — Anthropic's managed-agent runtime routes sub-agent delegation through handoff_request events. MAF's PhaseGraph already 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.