Resolvers and Probabilities
Fifty small opinions on one scale, composed into a stance; a separate engine that turns conditions into a scoreable probability; and a firm rule that neither may impersonate the other.
One scale for the whole system
A resolver answers "which way, and how strongly" about one subject — an instrument, a sector, a market, or the portfolio. Every resolver emits the same shape, so anything can be compared, aggregated, and scored against anything else: a score on −100 … +100, a band (the human label), a confidence on 0 … 100, an N-effective (the sample size behind it, with the probability engine's overlap discipline), a horizon from 1h to 252d, a snapshot of every input used, and flags such as LOW_SAMPLE, STALE_INPUT, CONFLICTED.
The engine computes in numbers and speaks in bands, because aggregation is arithmetic — you cannot average the word "bullish" — but config thresholds and journals need labels. The cuts live in StanceBandTypes as data, so re-cutting them after a quarter of real score distributions is an UPDATE, not a deploy.
| Band | Score range |
|---|---|
StrongBearish | −100 … −60 |
Bearish | −60 … −30 |
LeanBearish | −30 … −10 |
Neutral | −10 … +10 |
LeanBullish | +10 … +30 |
Bullish | +30 … +60 |
StrongBullish | +60 … +100 |
The Lean bands are a first-class outcome, not a rounding error. Most of the time, on most subjects, the honest answer is Lean-something or Neutral. A resolver that is rarely neutral is a resolver that is not thinking. And confidence is not score: −80 at confidence 20 and −30 at confidence 90 are different objects and must size differently. Sizing multiplies by confidence.
Stance is not probability
The distinction is load-bearing, and conflating the two is the classic way these systems produce confident garbage. A stance is a direction with magnitude. A probability is P(this precisely defined event resolves true), owned exclusively by the probability engine and scoreable by Brier score.
The two feed each other and never replace each other. A stance is a legitimate bucketed input to an estimator; a p-signal is a legitimate input to a composite resolver. A resolver may never publish a number as a probability, exactly as Claude may not. The gauntlet reflects the split: stances are consulted at the confirmation and veto stages, and the probability engine at the fourth stage, after direction has already been answered.
The probability engine's own posture is a disciplined frequency-counter with shrinkage, not a machine-learning platform. Every number it emits must be explainable as "in comparable historical conditions this happened X% of the time, blended toward the base rate in proportion to how thin the sample is." The resolution rule is part of the estimand — "SPY positive over 5 days" must say close-to-close, dividends excluded, from the first close after as_of, void on a data gap. What cannot be scored cannot ship.
Composition: how fifty opinions become one
Composition is hierarchical, not flat. An instrument stance is built from the technical, fundamental and news bundles, the positioning family, and a demand/supply router that carries a market stance into a name at a configured exposure weight. Instruments roll into sectors; sectors and the actual position weights roll into the portfolio stance, conditioned by the regime and overridden by stress.
Three disciplines sit inside that. Bundle weights are config with a calibration adjustment bounded by floors and ceilings, and shrinkage toward equal weight is mandatory. Dispersion discounts confidence: when the resolvers behind a composite disagree, the score may still be moderate but the confidence must fall, and sizing falls with it — the mechanism that stops the system betting hard on a +0.4 that is really +0.9 and −0.1 averaged. And weights are set per regime, on the same regime axis the backtester slices by.
Allan's own view enters as a desk signal and acts as a bounded tilt: Score = clamp(MachineScore + DeskTiltScore, −100, +100) with the tilt capped at 25 points. At that cap it can move a −45 Bearish to a −20 LeanBearish, never to bullish. The machine score stays in its own column, so it is always recoverable, and the tilt is scored on its own track record. If Allan's calls earn it, the cap rises through the same promotion ceremony as everything else.

The four tables
| Table | One row is |
|---|---|
Resolvers | One resolver version: code, family, which SignalSources it reads, its config document, its lifecycle status, its natural horizon. A registry, not storage — it holds no values. |
ResolverStances | One opinion: resolver × subject × as-of, with score, band, confidence, NEffective, horizon, FlagBits, and InputsBlobRef to the market state it was computed from. MachineScore and DeskTiltScore are kept apart. |
ResolverCompositionWeights | One weight: composite × component × regime, with its floor and ceiling. |
ResolverStanceOutcomes | One stance revisited at its horizon: WasDirectionallyRight, the subject's return versus SPY, the excess, and the stance's marginal contribution to the composite it fed. |
ResolverStances is the only large one: roughly 50 resolvers times 50 subjects, hourly where applicable, is about 150,000 rows and 40 MB a year. The probability side has the same pair — ProbabilitySignalDefs names an estimand and its estimator, ProbabilityEmissions holds each estimate with its interval and, later, its Resolution.
Three scorecards, never merged
A resolver is graded on direction: did a bullish stance precede positive excess return over its stated horizon, and does the rank correlation between score and subsequent return hold up per family and per regime? If high-confidence stances do not outperform low-confidence ones, the confidence output is noise and gets rebuilt. And a resolver that adds nothing after the others have spoken is redundancy, retired even if its solo record is fine.
A probability signal is graded on calibration: Brier score against the resolved events, nothing else. A decision is graded on outcome: expected versus actual, SPY over the same window, and the counterfactual of doing nothing.
These three are never combined. A resolver is not graded on P&L; a probability is not graded on direction. Every one of them climbs the same ladder — Draft, Shadow, Active, Retired — with a human approving each promotion, and a retired signal keeps its record forever so it is not rediscovered fresh every year.

- score — −100 … +100
- confidence — 0 … 100, same scale on purpose
- nEffective — the sample behind it
- horizon — 1h, 1d, 5d, 21d, 63d, 252d
- subject — instrument, sector, market, or PORTFOLIO
- desk tilt — at most 25 points, in its own column
- Resolves narrative: materiality, direction, tone, priced-in checks — one resolver among fifty, capped and scored
- Never emits a probability, sets a rating, sizes a position, or overrides a risk resolver
- The deterministic layers stay the spine: the system must answer "what would this have done in 2008" without an API key