In finance, the world model is the live thesis. A claim carries an explicit posterior that every filing, print, and headline strengthens, weakens, or contradicts, so the position tracks the evidence instead of the original pitch. A stale thesis is capital sized to a story the evidence stopped supporting. The pitch said margins would expand. Two quarters later a competitor cuts prices, an input shock lands, and the position is still carried at the original weight because nothing forced a rerate. A belief state that lives outside the model keeps the thesis live, so the analyst agent acts from where it stands today rather than where the pitch left it.
The world
The environment is the portfolio and the theses behind it: the names, the sectors they sit in, and the positions held against each view. Entities are companies and instruments. Relations are competes-with, supplies, and correlates-with. Ground truth is the public record (filings, prints, disclosures) and the market's own pricing.
What streams in
Observations are the raw material a thesis lives or dies on. The desk feeds in:
- 10-Qs, 10-Ks, 8-Ks, and the earnings-call transcript
- the print itself: revenue, gross margin, guidance, and the buy/sell-side reaction
- sell-side notes, downgrades, and headline flow on the name
- macro and rate prints, and regulatory changes that touch the sector
Each one moves the posterior on a specific claim, and the engine logs it as the evidence that moved it. The number always carries a receipt back to the line that produced it.
The belief state
A thesis here is not a static memo filed at initiation. It is a claim carrying an explicit posterior that moves as evidence arrives, with every step traceable to the event behind it.
1┌──────────────────────────────────────────────────────────────┐
2│ THESIS: GROSS-MARGIN EXPANSION │
3│ │
4│ Q1 Initiated at pitch margins 88% │ 2 sources │
5│ Q2 Competitor cuts list prices → 71% │ -17% │
6│ Q3 Input costs rise on the print → 58% │ -13% │
7│ Q4 Rule change favors incumbents → 67% │ +9% │
8│ │
9│ ● Each step records which filing or print moved the │
10│ posterior and by how much. The position traces to the │
11│ events that moved it, not to the day-one pitch. │
12└──────────────────────────────────────────────────────────────┘When a bullish sell-side note and a bearish 8-K land in the same week, the engine does not split the difference into a comfortable middle. It flags the contradiction and surfaces the two claims that conflict, so the PM adjudicates the disagreement rather than inheriting a blended number that buries it. Risk ratings carry an explicit decay schedule. A six-month-old credit or covenant read loses certainty on its own and starts pressuring a reassessment instead of riding forward unchallenged.
What we're after
The goal is plain: keep the position sized to what the evidence currently supports, not to the conviction the pitch started with. Success looks like a thesis that is current rather than remembered, risk that stays inside the mandate, and every move tracing back to a filing or a print. The limiting factor is the claim doing the most work with the least support behind it: the load-bearing assumption that, if it cracked, would force the whole position to rerate. The engine ranks the next move against that intent, not against raw uncertainty, so the desk spends its attention where being wrong costs the most rather than where the posterior happens to be widest.
| Goal | Position sized to what the evidence supports today. |
| Success | Thesis current, risk within mandate, every move traces to a filing or print. |
| Limiting factor | The least-supported claim the thesis leans on hardest. |
The policy
A portfolio runs under hard rules that outrank any single attractive narrative. You encode them as the structure the desk works within:
| Policy bucket | In a portfolio |
|---|---|
| Invariants | Stay within mandate and position limits. Respect compliance and disclosure constraints. |
| Source hierarchy | An audited filing ranks over news; news ranks over a rumor or a single-desk note. |
| Conventions | How the desk sizes positions, when a thesis goes "on watch." |
| Avoid | Letting a preference for a name inflate the posterior on its thesis. This is the is/ought firewall. |
The actions
Group what the agent may do by what it costs to be wrong:
| Action | Safety class | Effect |
|---|---|---|
run-scenario, screen, summarize-filing | info | Read-only analysis. |
flag-risk, update-thesis, set-watch | mutates | Changes the recorded view. |
rebalance, place-order | needs-approval | Gated on a human with the mandate. |
Today, policy and actions are a modeling lens you hold, not a contract the engine runs for you: you encode invariants, source hierarchy, and safety classes in how you observe and act, the engine doesn't yet take a registered policy, and a declarative config surface for this is on the roadmap. Read the tables as the contract your agent enforces. What the engine guarantees is the rest of the loop: it surfaces the picture and the trail, the agent reasons over it, and capital only moves with a human's sign-off.
Plan & act
1import Beliefs from 'beliefs'
2
3const beliefs = new Beliefs({
4 apiKey: process.env.BELIEFS_KEY,
5 agent: 'equity-research',
6 namespace: 'tech-sector-review',
7 writeScope: 'space',
8})
9
10// 1. Orient: read the current picture; the ranked next moves ride back on it
11const context = await beliefs.before('Is the margin-expansion thesis still intact?')
12const [move] = context.moves // top-ranked, already in hand; no extra call
13// → { action: 'gather_evidence', subType: 'confirm-margin-trend', valueOfInformation: 0.8, ... }
14
15// 2. Act: your agent dispatches the tool the move points to
16const filing = await runTool(move.subType) // 'confirm-margin-trend' → your filings fetcher
17
18// 3. Fold the result back in; it becomes the next observation
19await beliefs.after(filing.text, { source: 'Q3 10-Q' })Source hierarchy is policy, so the engine weighs the two notes rather than storing them side by side. The audited filing outweighs the bullish sell-side note, the thesis posterior moves, and the next ranked move is the one that most resolves what is left open. A memory store would hand you back both notes and leave you to reconcile them. Here every step of that reconciliation traces back to the exact line in the filing.
Emerging: plan several moves ahead
As a coverage universe builds history, the agent can forecast which research action most sharpens a thesis before doing the work: beliefs.forecast.predict(['read-10q', 'check-competitor-pricing', 'model-downside']). It reports low confidence until it has enough resolved history to calibrate, so a forecast is never mistaken for a track record.
