A methodology-driven research workspace, not a tipsheet. Every published Catalyst Runner idea passes a non-negotiable six-layer anti-hallucination verifier, and every fill on the public portfolio at /portfolio is real Alpaca paper-trade data with full agent attribution. This document is the methodology behind the surface.
Catalyst Runner is the first of seven specialist agents and the only one that trades the public paper-trading account. The agent runs against a narrow, audited tool allowlist:
lookup_ticker — resolves a ticker to a canonical company record via the ticker registry.get_catalysts — fetches upcoming and recent catalysts (earnings, FDA, Form 4, STOCK Act) for a ticker over the configured horizon.fetch_filing — pulls an EDGAR filing (10-K, 10-Q, 8-K, Form 4) by accession number for direct quotation in the thesis.propose_idea — emits a candidate Idea for the six-layer verifier to evaluate. Only verified ideas surface to you.Each user has a private memory namespace so prior research context informs subsequent prompts without leaking across accounts. The wire output is a single Idea shape with seven flat fields — ticker, catalyst_type, thesis, horizon, conviction, expected_30d_pnl, citation_count — wrapped in a CardCatalystSSEEvent envelope that carries the adapter attribution sha and an optional compliance flag.
Every candidate idea passes through six independent layers. A failure at any layer rejects the idea and it is never published. The layers are:
earnings, fda, form_4_cluster_buy, stock_act, options_flow_unusual, 13f_new_position, etc.). Rejects free-text "theme" labels the downstream systems cannot consume.A failed idea is never seen by you. The aggregate rejection rate is published at /methodology/verifier-log — refreshed every 30 minutes, prompt text is never exposed.
Factor agent is the second of seven specialist agents and the first signal-side agent to ship after Catalyst Runner. The agent runs against a narrow, audited tool allowlist:
get_factor_scores — fetches the day's composite decile and per-factor z-scores for a ticker from the internal factor-compute service.expose_factor_breakdown — returns the 9-factor per-stock breakdown for the cardFactor explainer drawer.Factor scores are computed nightly (Mon–Fri at 22:00 UTC, one hour after US market close) from source-of-truth feeds: the Fama–French 5-Factor Daily CSV from the Ken French Data Library (Tuck School of Business), plus daily and intraday price bars from multiple market-data sources. The score set is the FF5 triplet (market, size, value), the FF5 quality pair (profitability, investment), 12-2 price momentum, and the Asness–Frazzini–Pedersen Quality-Minus-Junk triplet (profitability, growth, safety). Before z-scoring, each characteristic is winsorized — clipped to its 1st-to-99th-percentile band within the day's universe — so a single extreme outlier among the broad set of names cannot inflate the cross-sectional spread and distort the published scores. The clipped characteristics are then z-scored within the day's eligible universe — a liquidity-screened set of US-listed names with >$100M 30-day average dollar volume — and the composite decile (1 through 10, 10 best) is the equal-weighted average of the 9 z-scores ranked into deciles.
Every cardFactor surfaced in chat carries the verifier envelope; the Factor agent's Idea outputs pass through the same six-layer anti-hallucination verifier as Catalyst Runner. The factor methodology is locked at services/factor-compute/methodology.yaml and pinned by version on every factor_scores_daily row — re-running the compute with a new methodology emits new rows under a new version without overwriting history. The full locked YAML is open-source — view methodology.yaml on GitHub.
Open-weight stack: Hermes-4-14B + SGLang. Apache 2.0 / Modified MIT only — no closed-weight providers.
The orchestration substrate is Nous Research's Hermes-Agent (Modified MIT, 2026). Inference runs on SGLang with HiP attention. Closed-weight providers — OpenAI, Anthropic, Google — are explicitly banned in production paths and enforced at the network boundary, where outbound traffic to closed-weight providers is blocked. The choice is ideological, economic, and audit-driven: the public paper portfolio must be reproducible from the model weights down, and that is only possible when every weight is open.
| Component | License | Version | Notes |
|---|---|---|---|
| Hermes-Agent | Modified MIT (2026) | 4-14B | Orchestration substrate (Nous Research). |
| SGLang | Apache 2.0 | latest | Inference runtime with HiP attention. |
| LoRA adapters | Apache 2.0 | per-agent | Catalyst Runner adapter trained on filings + catalysts. |
| Stack policy | n/a | n/a | Closed-weight providers blocked at the network boundary. |
The aggregate hallucination-rejection rate is public. Counts only, not prompt text. Refreshed every 30 minutes. Read the verifier log →
Per-event-type win rates on cardCatalyst describe the share of historical instances of the same event type that beat SPY over a 30-day window, not the share that simply went up. The excess-vs-SPY framing strips out market beta — a 62% absolute win rate during a bull-market window is not edge; a 62% win rate relative to SPY across the same window is.
Every edge claim on a published card carries a visible sample size n. When fewer than 30 historical instances of the event type are available, the card surfaces an EXPLORATORY chip instead of a win-rate claim. Thirty is the canonical floor for the Central Limit Theorem's normal approximation and the floor used in the post-earnings-announcement-drift literature (Chan, Jegadeesh, and Lakonishok, 1996).
Skalarity will tell the reader when it does not have an edge. Cards on cold-start event types — categories where the corpus is still accumulating — pass the verifier and reach the public portfolio, but they carry the exploratory chip and do not claim a win rate. When the corpus crosses 30 historical instances, the chip retires and the standard claim chrome takes its place.
| State | Card render |
|---|---|
| n=347, 62% | Normal: edge claim visible (CRWD · BUYBACK_ANNOUNCEMENT events beat SPY 62% over 30d) |
| n=42, 51% | REJECTED by verifier (no card published — win_rate_excess ≤ 0.50 with n ≥ 30 fails the published-edge floor: with a real sample, an idea must beat SPY more often than not) |
| n=12 | EXPLORATORY chip (no claim, no expand panel) |