Loading repository data…
Loading repository data…
pedrobraiti / repository
Vizier - the decision-making brain of an agentic-trading stack. A Claude Code skill that researches, decides, remembers and orchestrates trades across US stocks/ETFs (IBKR) and crypto spot (CCXT), driving the Scout and Valet MCP servers it never modifies. Hybrid skill + deterministic safety core; paper-first.
A transparent discovery signal based on current public GitHub metadata.
This score does not audit code, security, maintainers, documentation quality, or suitability. Verify the repository and its current documentation before adoption.
Not financial advice. Vizier is a research-and-orchestration tool, not a guarantee of returns. It is paper-first / shadow-mode by default: out of the box it journals decisions or trades against a paper account / exchange testnet. Real-money autonomy is the last rung of a deliberate ladder (shadow → paper → live read-only → real money), gated behind a forward-test and a live read-only validation. Use at your own risk.
Vizier is the brain of a three-part split — a single, natural-language-driven Claude Code skill
(/vizier) that turns a request like "research the market and make 3 investments totaling $100" into
researched, risk-checked, journaled trades. It is the one component that touches both MCP servers:
| Layer | Project | Role |
|---|---|---|
| Senses | Scout | Gathers & structures market data — stateless, data-not-verdict, keyless (60+ tools). |
| Hands | Valet | Executes orders on IBKR (stocks/ETFs, 20 tools) and crypto exchanges (spot, CCXT, 16 tools). |
| Brain | Vizier (this repo) | Researches, decides, remembers, orchestrates. The only thing that touches both MCPs. |
The inviolable boundary. The MCPs are deliberately dumb (I/O without judgment). Vizier consumes them exactly as they are and modifies, adds to, or plugs logic into them. All intelligence, glue, state and decision lives in the skill. No MCP calls another; no MCP concludes.
/analyze vs /invest. Behavior is read from intent:
an empty/vague call → a read-only market sweep; "research MU" → a thesis, no execution; "buy $3 of
AAPL" → an order it just executes. It pauses to ask only on real ambiguity ("invest a little"), never
double-confirms the obvious, and treats "I think I should sell" as deliberation, not an order.core vs tactical tag so anti-churn applies correctly per horizon.ibkr server) and crypto spot (the crypto server), routed by
the asset; risk limits and NAV are kept strictly per-account / per-venue.Vizier is a hybrid: the judgment lives in the skill (SKILL.md + references/, loaded on demand),
while every money-sensitive calculation lives in a deterministic Python core the skill calls and reads
back as a {"ok": bool, "data": ...} envelope. Code does the math that must not be re-derived by an LLM
"in its head" between rounds — that is exactly the forget-between-rounds failure the split prevents.
flowchart LR
U["User request<br/>(natural language)"] --> V["VIZIER skill<br/>(judgment, orchestration)"]
V -->|reads data| S["Scout MCP<br/>(senses)"]
V -->|money-math, state| C["Deterministic core<br/>python -m vizier"]
V -->|places orders| X["Valet MCP<br/>(hands: ibkr / crypto)"]
C --> M["Private memory<br/>theses · decision log · NAV"]
The reasoning runs as a fan-out of subagents, adapting depth to the request:
flowchart LR
A["Analysts (parallel)<br/>Fundamental · Technical · News · Macro"] --> BB["Bull x Bear<br/>debate"]
BB --> T["Trader<br/>proposes thesis + trade<br/>(horizon tag, conviction 1-5)"]
T --> DS["Data-sufficiency gate<br/>proceed | downsize | abstain"]
DS --> R["Risk gate + PM<br/>sizing within limits"]
R --> PM["Pre-mortem / red-team<br/>why is THIS trade, NOW, wrong?"]
PM --> E["Execute via Valet"]
Research mode stops at "Trader proposes"; execution mode continues through the gates to Valet, then journals the thesis and the fills.
MODE: PAPER · venue: ibkr
TL;DR — Buy $60 NVDA (core) + $40 XLE (tactical); breaker clear, book has room in both.
By horizon
• Long — NVDA: datacenter capex still accelerating; quality metrics intact
• Short — NVDA: RSI 71, extended — divergence flagged: scale-in, don't chase
Action
• NVDA — ibkr, BUY $60, market (liquid large-cap) [EXECUTED — order id 1247]
• XLE — ibkr, BUY $40, limit 92.10 [EXECUTED — order id 1248]
Conviction — NVDA 4/5 (secular + earnings momentum) · XLE 3/5 (honest: a hedge, not a hero)
Scenarios + price target (NVDA)
• Bear $95 · Base $128 (analyst consensus relay, n=42) · Bull $150
(crude multiple cross-check flagged as crude — no independent valuation claimed)
Risks & caveats — news feed may be incomplete for corporate events (8-K check run: clean);
data-sufficiency on XLE: thin positioning data — annotated, amount honored
Pre-mortem — buying an extended name near an earnings window (checked: 24 days out)
Post-trade portfolio — NVDA 8.2% · XLE 5.5% · cash 22% · 6 positions
Sources — SEC filings (as_of 2026-05-28), FRED, IBKR quotes 14:31 ET
The full format (mandatory MODE banner, per-name [RECOMMENDATION]/[EXECUTED] tags, honest-caveat
rules) is specified in references/output-template.md.
"Is this actually working?" is answered by a deterministic scorecard, not by vibes. The skill
feeds it current prices and a benchmark price history (SPY for equities, BTC/USDT for crypto) and the
core computes, over every thesis (open marked-to-market + closed on recorded outcomes):
days_held reported so a 3-day tactical and a 6-month
core are weighed by the reader — no annualization (annualizing both into one number is nonsense).The honesty rules are the point: a thesis that can't be scored is named in skipped (never guessed),
an aggregate with no sample is null, not a fake zero, and a benchmark that doesn't cover the window
yields a null or annotated alpha with the reason attached. If the ideas are not beating the benchmark,
the scorecard says exactly that — that verdict is what the paper-first ladder exists to produce.
The money-safety rules are not prose the model is asked to remember — they are deterministic checks with
exact, self-latching arithmetic. A precise word on bindingness: these checks are advisory/bookkeeping
that bind when the skill calls them each candidate with an honest live NAV — Vizier holds no order pipe of
its own, so the one hard, code-enforced dollar backstop is the Valet's MAX_DAILY_VALUE (enforced at
the executor no matter what the skill does), which is why arming autonomy is forbidden until it is set. The
dangerous mode (autonomy) is guarded by four composed legs plus a re-arm guard — a backstop for the robot
running unattended, never a clamp on a human's confirmed explicit order:
/loops. A shrinking account never re-authorizes fresh slices — this is the
drain fix (a per-round cap alone does not stop a loop from emptying the account).arm-autonomy refuses while a window is still active (re-arming would reset the
baseline and wipe the day's spend — a drain vector); a legitimate re-arm requires an explicit disarm or
window expiry. No force-override.account_type before every order, re-check the circuit
breaker, reconcile against your own sent-order log ∪ broker positions (never lagged positions alone),
and run a mandatory data-sufficiency gate that downsizes or abstains when the evidence isn't there — even
under an explicit order.The Valet's own per-order guards (MAX_ORDER_VALUE, MAX_DAILY_VALUE, DUPLICATE_WINDOW_SECONDS) are set
as an independent second line when arming. Live execution is venue-s