| name | research-debate |
| description | Adversarial bull/bear review of a draft Atlas pick. Forks a bull researcher and bear researcher (configurable rounds), then a Research Manager synthesizes the debate into a structured 5-tier rating (Buy/Overweight/Hold/Underweight/Sell). Use when a pick needs stress-testing before CC commits capital — `python main.py picks "<query>" --debate N` triggers it. |
| triggers | ["debate","bull bear","adversarial review","stress test","devil's advocate","counterargument","second opinion","peer review","research debate"] |
| tier | research |
| dependencies | ["risk-debate","realised-return-reflection"] |
| origin | TauricResearch/TradingAgents (patterns) |
Research Debate — Bull vs Bear Adversarial Review
Purpose
Atlas's default stock_picker.py is single-pass — one Claude call drafts a thesis from assembled context. That's fast and usually right, but it skips the "what could go wrong" pressure test that real desks run before committing capital.
This skill adds a structured bull/bear debate on top of the draft thesis, then has a Research Manager synthesize the debate into a 5-tier rating. The pattern is lifted from TauricResearch/TradingAgents (tradingagents/agents/researchers/) and reimplemented in pure Python — no LangGraph dependency.
When to Trigger
- User says "/debate " or "stress test the pick" or "give me a bear case"
- Before committing real capital on a pick with conviction ≥ 7
- When a thesis depends on a single catalyst (consensus + risk both matter)
- When CC explicitly says "second opinion" or "peer review"
How It Works
Draft thesis (from StockPickerAgent)
│
▼
Bull researcher ◄──┐
│ │ N rounds
▼ │
Bear researcher ◄──┘
│
▼
Research Manager (deep_think tier)
│
▼
Rating + synthesis + lesson
Each round = one bull turn + one bear turn. Default max_rounds=1 (2 exchanges).
Higher counts produce diminishing returns and cost more.
Output Format
Structured triple:
- Rating — one of Buy / Overweight / Hold / Underweight / Sell
- Synthesis — 4-8 sentence prose explaining which side won and how the rating resolves
- Lesson — 1-2 sentences on what part of the draft thesis needed revision (gets fed into the next reflection)
The Pick dataclass picks up four new fields when debate runs:
pm_rating, bull_bear_synthesis, debate_lesson, plus the risk-debate output if run_risk_debate is chained.
Routing
CLI: python main.py picks "<query>" --debate N
Internal: StockPickerAgent.pick(debate_rounds=N, reflect=True)
Direct: from research.debate import run_bull_bear_debate
Cost Note
Bull + bear use the quick_think tier (Claude Haiku 4.5 default). Research Manager synthesizes via deep_think (Claude Opus 4.7 default). Per the model tier doctrine in brain/MODEL_CONFIG.md, this saves ~30% versus running all calls on the deep-think tier.
Internal References
- [[bull_researcher]] — bull persona prompt
- [[bear_researcher]] — bear persona prompt
- [[research_manager]] — synthesis prompt with 5-tier rating
- [[debate]] — Python orchestrator
- [[researcher-bull]] — agent file
- [[researcher-bear]] — agent file