Agents
Every cents research call fans out to eight agents. Each one returns
an AgentResult containing an evidence list, a single conviction delta
(clamped to ±10 for individual agents, ±30 for the orchestrator’s
aggregate), per-dimension scores, and a human-readable summary. The
orchestrator aggregates them with confidence and age weighting.
Sample report
Section titled “Sample report”The static report below is rendered by cents research --export html and
embedded verbatim — same data, same dimension scores, same evidence rows.
Per-agent breakdown
Section titled “Per-agent breakdown”Fundamentals
Section titled “Fundamentals”- Source: Financial Modeling Prep (
/api/v3/ratios,/api/v3/key-metrics). - Evidence: P/E ratio, gross/operating/net margins, ROE, debt-to-equity, current ratio, analyst price-target spread.
- Dimension scores: primarily
valuationandquality; risk-adjacent metrics (debt, liquidity) feedrisk. - Logic: compares each ratio to the thesis’s stated valuation
(
undervalued/fair/overvalued) and emits supporting, contradicting, or neutral evidence accordingly.
Technical
Section titled “Technical”- Source: Alpaca market data (price bars, daily aggregates).
- Evidence: moving-average crossovers, momentum slope, 52-week range position, recent volume vs. trailing average.
- Dimension scores:
technical, with a smallriskcontribution when volatility is elevated. - Logic: classic trend-following heuristics anchored to the symbol’s own history; returns supporting evidence when the trend aligns with the thesis time horizon.
- Source: FRED (Fed funds rate, 10y-2y spread, VIX, unemployment).
- Evidence: rate regime, yield-curve shape, VIX percentile, employment trend.
- Dimension scores:
macro(andriskwhen stress signals fire). - Logic: evidence is contextual rather than directional — a steepening yield curve nudges conviction up for cyclicals, down for long-duration assets, framed by the thesis’s time horizon.
Sentiment
Section titled “Sentiment”- Source: NewsAPI headlines + Anthropic Claude for classification.
- Evidence: recent headline volume and per-headline sentiment scores.
- Dimension scores:
sentiment. - Logic: Claude classifies each headline as positive / negative /
neutral; the agent aggregates with a recency weighting. Falls back to a
keyword heuristic if
ANTHROPIC_API_KEYis missing, and to a no-op ifNEWS_API_KEYis missing.
- Source: FMP financials (multi-year ratios + segment data).
- Evidence: margin stability over 3-5 years, ROIC trend, gross-margin durability.
- Dimension scores:
moat, secondaryquality. - Logic: stable margins + rising ROIC = supporting moat evidence; compressing margins = contradicting. Avoids one-period snapshots.
Insider
Section titled “Insider”- Source: FMP insider-transaction endpoint.
- Evidence: net insider buying/selling, cluster activity (multiple insiders trading in the same direction within a window).
- Dimension scores: small contributions to
qualityandrisk. - Logic: cluster buying is treated as a stronger supporting signal than
isolated transactions; cluster selling registers as contradicting.
Trades are deduplicated per-insider before scoring (collapsed on
reportingName) so one insider filing five 10b5-1 sale slices doesn’t masquerade as cluster activity. When multiple rows collapse, the evidence text appends(across N filings, likely 10b5-1)so the scheduled-sale context is visible.
- Source: Federal Register API (executive orders,
rules, proposed rules) + Anthropic Claude for tagging against the
EVENT_TAGScontrolled vocabulary. - Evidence: recent policy events that match the thesis’s
premise_tags— surfaces in themacrodimension with the event’s polarity (bullish/bearish/neutral) feeding the conviction delta. - Dimension scores:
macro. - Logic: the agent has two responsibilities. (1) On
refresh(), pull new Federal Register documents, LLM-tag them, persist, and firePREMISE_INVALIDATIONalerts against open theses whosepremise_tagsintersect. (2) Onresearch(), return recent matching events as macro evidence for the thesis. When called against a symbol with no associated thesis (no-thesis research), untagged events are dropped from the result — they can’t intersect any premise by construction, so surfacing them only adds noise. They are still persisted and may match later. See Events & premise invalidation for the full picture.
Orchestrator (LLM arm)
Section titled “Orchestrator (LLM arm)”- Source: the seven agents above.
- Output: a single
AgentResultwhose evidence is the union of every child agent’s evidence and whose conviction delta is the weighted sum. - Weighting:
- Confidence weighting — each evidence item carries a
confidencein[0, 1]; the agent’s average evidence confidence scales its conviction delta before aggregation. - Age decay — evidence weight decays linearly from
1.0to0.1over a per-dimension TTL (technical/sentiment 7 days, macro/valuation/ risk 30 days, quality/moat 90 days). Old evidence is never fully discarded — it floors at0.1so historical context survives. - Clamping — every individual agent’s conviction delta is clamped
to ±10 (
MAX_CONVICTION_DELTA) so a single agent can’t dominate. The orchestrator’s own aggregated result has a higher cap of ±30 (MAX_AGGREGATE_CONVICTION_DELTA) so a strong-consensus signal isn’t quantized to ±10 by the per-agent clamp.
- Confidence weighting — each evidence item carries a
- Synthesis summary: human-readable string of the form
NVDA synthesis: fundamentals: +3.1 | technical: +1.8 | sentiment: +0.4 = +5.3 total (weighted).
RandomOrchestrator (control arm)
Section titled “RandomOrchestrator (control arm)”- Source: none — emits a uniform-random
conviction_deltain[-30, +30]with no LLM calls and no evidence rows. - Stamp: every thesis opened by this orchestrator gets
orchestrator_label = "random"(the LLM arm gets"llm"). - Why it exists: the paired-neutral cohort is a control for regime beta; the random arm is the matched-cadence control for signal value. Run it on the same universe at the same cadence as the LLM arm and the cohort spread between the two arms isolates whatever signal the LLM orchestrator actually contributed. See Operating principles.
- Invocation:
cents factory run --orchestrator random --orchestrator-seed 42(seed for reproducibility).
Reading the dimension scores
Section titled “Reading the dimension scores”The five dimensions — valuation, quality, moat, technical, risk,
plus secondary macro and sentiment — are independent axes. The
orchestrator sums per-agent dimension contributions, so a high overall
conviction delta with one badly negative dimension is a flag worth reading,
not just a number to act on.