Three slash commands. They call the same tools, against the same data, in the same order. The difference is which number leads the report, what it gets compared against, and what the suggested next step is. Framing is the deliverable. The math is the same.
Notes from Surendra Singh.
/finance # auto-router — classifies intent, dispatches to the right tool /finance-analyst # equity-research lens — Sharpe-first, ticker-as-coverage /finance-pm # portfolio-manager lens — drawdown-first, ticker-as-position
Each command loads a SKILL.md prompt that frames the conversation. The skill defines the intent classifier, the lens, and the constraints (which numbers to lead with, which to suppress, what next-step suggestion to write). The MCP tools below it do not change. Three skills, one tool layer.
The default. Classifies the user's request into one of seven intents, then dispatches:
| Intent | Trigger phrases | Action |
|---|---|---|
| environment-check | "validate environment", "is everything installed" | validate_environment |
| health-check | "ping", "are you running" | ping |
| stock-analysis | "price chart", "show me [TICKER]" | analyze_stock |
| market-metrics | "Sharpe", "drawdown", "beta", "vol" | get_returns / get_volatility / get_risk_metrics |
| multi-ticker | "compare A vs B", "correlation" | compare_tickers / correlation_map |
| ml-liquidity | "liquidity model", "predict liquidity" | liquidity_predictor |
| ml-investor | "investor classifier", "segment investors" | investor_classifier |
If the intent is ambiguous, the skill instruction is to ask one clarifying question and wait. No code generation before clarification. This single rule prevents the most common failure mode of LLM tool-calling — confidently dispatching the wrong tool because the prompt was under-specified.
Frames every ticker as a security under research coverage. Optimized for buy-side and sell-side note consumers. The lens decides what gets the headline:
Risk-adjusted return is the universal coverage metric. Compare it to sector peers and to the index.
The reader does not own the book. Drawdowns are noted but not led; correlation maps are not the deliverable.
❯ /finance-analyst initiate coverage on NVDA
Frames every ticker as a holding in the book. Optimized for risk committee and LP reporting. The lens reorders the same numbers:
Worst-case loss already realized in the window — the number a risk committee actually asks about.
The reader owns the book. Sharpe is reported but not led; sector commentary lives in the analyst lens, not here.
❯ /finance-pm review risk on my holdings: AAPL, NVDA, JPM
The temptation, on a stack like this, is to ship a persona for every job title — analyst, PM, IB, FP&A, accounting, retail, advisor, family office, treasury. The temptation is wrong. Each persona is a maintenance surface; each new persona is a confusion vector for the user (which one do I pick?); and beyond two or three, the lenses stop being meaningfully different.
"Two professional lenses cover most of the value. The third — the auto-router — exists because users don't always know which lens they need."
The walkthroughs on the index page (Equity Research, Hedge Fund PM, Investment Banking, FP&A, Accounting) cover role-specific workflows on top of these two lenses. Workflows multiply. Lenses don't.