Prediction Mind is a small autonomous agent that forecasts financial markets; an earlier article described its three-system architecture. This one descends into the observation layer: how the deliberative system's world model represents the world as a field of differences — velocity and acceleration, each measured against a series' own history — rather than as a vector of levels, and what happened when the design was audited against its own principle. Three gaps surfaced: a surprise component still watching levels, a regime filter blind to the second derivative, and a measurement model that graded itself every night but never learned from the grade. Closing them produced a world model that observes differences all the way down — and modifies itself only on prequential proof. 2026-07-15.
Levels lie by omission
A 5% unemployment rate is bullish coming from 6% and bearish coming from 4%. The level is the same number in both worlds; everything an investor cares about lives in the derivative. This is not a peculiarity of unemployment. Markets price surprises, and a surprise is by definition a change relative to what was — which makes a world model built on levels a model of almost nothing.
Three arguments push a forecasting agent toward representing change rather than state:
- Markets price changes. The information content of an observation is its deviation from the trajectory, not its coordinate.
- Regime turns live in the second derivative. Inflation still high but decelerating; money supply still contracting but the contraction easing; a rally still rising but losing speed. Every macro turning point announces itself in the change-of-change before the level — or even the change — flips sign.
- Self-normalization makes everything commensurable. A 0.3pp CPI surprise, a 40bp high-yield spread widening, and a news-tone jump have incomparable units. Measured against each series' own history of changes, they all become the same question: how many typical changes was that? One attention ranking can then span single stocks and the entire macro landscape.
The state tuple
Every tracked series — per-stock reflex factors (news tone, momentum, the reflex's own conviction) and roughly forty market and macro series — is represented not by its value but by a state tuple:
( level, vel = Δx, acc = Δ²x, vel_z, acc_z, events[] )
The level is kept as an anchor and demoted from signal to context. Velocity is the first difference per native time step — with a per-series transform, because "difference" means different things for different objects: log-differences for price-like and stock-flow series (so velocity is the growth rate), simple differences for rates and spreads (so velocity is basis points of impulse). For observations $(t_i, x_i)$ after transform:
$$v_i = \frac{y_i - y_{i-1}}{g_i}, \qquad a_i = \frac{v_i - v_{i-1}}{g_i}$$
where $g_i$ is the gap in native steps, floored at 1 (same-day duplicates) and capped (a data outage must not crush a genuine jump into a near-zero velocity).
The normalization is where the representation earns its keep. Each latest velocity and acceleration is scored against the series' own trailing history $H$ — excluding the value being scored:
$$z = \frac{v_{\text{latest}} - \operatorname{med}(H)}{1.4826 \cdot \operatorname{MAD}(H)}$$
Median and MAD rather than mean and standard deviation, so a single crash day in the window does not permanently inflate the yardstick; clipped at $\pm 6$; and defined as exactly $0$ until the series has accumulated a minimum history — cold start must not alarm. The $z$ answers the only question attention needs: is this change unusual for this series? A 2% day is nothing for Bitcoin and an event for the 10-year yield.
One worked example. CPI's level (321.4) tells you nothing actionable. Its velocity — $\Delta \log$ per month — is the monthly inflation rate. Its acceleration is the disinflation signal: visible while the level is still making all-time highs and the velocity is still positive. A system watching levels sees "inflation at record highs." A system watching the tuple sees "inflation positive, decelerating unusually fast for this series" — a different world, and the true one.
From the tuple, the system names discrete change events: spike (unusually large move), inflection (noise-gated sign flip), accelerating and exhaustion (second derivative confirming or fighting the first), divergence (two series racing in opposite directions, both unusually), and — worth singling out — revision: the observation store is append-only and first-seen, so when a data provider silently rewrites history, the old value is kept, the new one appended, and the delta surfaces as an event. The data changing under you is itself a change worth looking at.
Attention is a function of unusual change
The tuples feed a composite attention score per entity:
$$\text{attention} = \max_f\, w_f\,|z^{v}_f| \;+\; \tfrac{1}{2}\,\max_f\, w_f\,|z^{a}_f| \;+\; \min\!\big(1.5,\; 0.5 \cdot \#\text{event types}\big)$$
Max, not mean — one regime break must not be diluted by four quiet factors. Acceleration at half weight — second differences are noisier. The event bonus bounded — events tilt, never dominate. This score is what decides where the agent spends its strictly budgeted nightly deliberation (a single expensive LLM call, per the architecture article): the agent does not think because it can; it thinks because something changed unusually.
Difference-based observation has a known blind spot, and the design says so out loud: a robust z with an adaptive baseline neutralizes steady drift. A series that grinds the same direction every day becomes its own normal and scores neutral forever. A separate LLM-free scanner covers exactly what the self-normalization suppresses — among its detectors, a persistent drift rule: at least 80% same-sign velocities over the window and a cumulative move at least $3\times$ the series' own typical step. A representation should know its own failure modes and compensate for them mechanically.
The world model proper: a Bayes filter over regimes
Above the per-series tuples sits the world model in the probabilistic-robotics sense: a belief state — a probability distribution over nine named macro regime scenarios (goldilocks, reflation, tightening squeeze, stagflation, growth scare, credit stress, melt-up, energy shock, calm) — updated by the classic predict → correct cycle, once per observation date.
The crucial design choice: each scenario is a template of expected velocity-z signs over composite macro dimensions (equities, rates, inflation, energy, dollar, credit, volatility) — direction of change, not level. The filter's measurements are the dimension composites: the median of member series' rolling velocity-z, each point scored only against history available at that date. Prediction is a sticky transition kernel (regimes persist, occasionally jump); correction is a Gaussian likelihood of the day's composite z's under each template.
And — this being a self-auditing agent — the filter is graded before it is corrected. Each day, the prior's predictive log-likelihood of the incoming observation is scored against a uniform-belief baseline:
$$\text{skill}_t = \log p(o_t \mid b_{t^-}) - \log p(o_t \mid \text{uniform})$$
Positive skill means the carried belief predicted today's measurements better than knowing nothing. The posterior reaches the deliberation prompt as one bounded line, labelled measured context, not instruction.
Auditing the design against its own principle
The principle — observe differences, everywhere — is simple enough to be checked mechanically against the implementation. The audit found three places it didn't hold:
- One surprise component still watched levels. The scan that allocates deliberation scores candidates on several z-scored components; the conflict component fired when news tone and price momentum had opposite level signs — a relic of the pre-change-view design that the concept document itself had already described as superseded.
- The world model never saw the second derivative. The tuples compute acceleration for every series, but the worldline composites the regime filter observes were built from velocity only. The design argues that turns live in acceleration — and then fed its regime detector nothing but velocity, guaranteeing it sees turns late.
- The measurement model never learned. The filter grades its own predictive skill every single step — and nothing consumed the grade. The observation noise was a hand-written constant. Everywhere else in the agent, measured records gate adoption; the world model was the one component exempt from its own standard.
The rest of this article is the closing of those three gaps.
Finishing the migration: conflict in change space
Two series can agree on level and still be racing in opposite directions — and can disagree on level while converging. The level-sign rule misses both. Conflict is now a continuous change-space measure over the same two factors:
$$\text{conflict} = \begin{cases} \min\!\big(|z^{v}_{\text{tone}}|,\; |z^{v}_{\text{mom}}|\big) & \text{if } \operatorname{sign}(v_{\text{tone}}) \neq \operatorname{sign}(v_{\text{mom}}) \\[4pt] 0 & \text{otherwise} \end{cases}$$
The narrative and the price disagreeing in change space — graded by the weaker leg, because a divergence is only as unusual as its less-unusual side. The behavioral consequence is deliberate: a brand-new entity with no factor history now scores zero conflict on day one. Under the old rule it could alarm immediately on two level signs; under the new one it must first earn a history against which its changes can be unusual.
Turns live in the second derivative — so let the world model see it
With velocity-only observation, the regime filter cannot begin moving probability mass toward the next regime until velocity itself flips sign. Everything the change view knows about early turns — the rally decelerating, credit stress building speed — was invisible to exactly the component whose job is regime inference.
The obvious fix — hand-writing acceleration expectations into all nine scenario templates — would have added sixty-three more unearned constants. Instead, the acceleration channel is conditional on what velocity already says. Under scenario $s$, velocity is modeled as relaxing toward the scenario's template, so the expected acceleration points from the observed velocity toward that template:
$$a_d \,\big|\, v_d, s \;\sim\; \mathcal{N}\!\big(\kappa \, (\mu_{s,d} - v_d),\; \sigma_a\big)$$
By the chain rule this composes cleanly with the existing velocity term, $p(v, a \mid s) = p(v \mid s)\, p(a \mid v, s)$, and it adds exactly two scalars — the pull rate $\kappa$ and a noise width — while the scenario library stays as authored. The effect is the one the design doctrine promises: when equities are still rising but decelerating hard while credit stress accelerates, the credit-stress scenario gains likelihood before any velocity has flipped. The scenario the world is turning toward collects evidence from the turn itself.
One honest caveat, documented in the code rather than hidden: the observed acceleration is a robust-z against its own history, while the channel's mean mixes template and velocity z-units. The model is a heuristic in z-space, not a calibrated physical law. Which is exactly why it ships disabled — and is only ever enabled by the mechanism in the next section, on proof.
No self-modification without proof
The agent's standing invariant is that nothing adopts itself on plausibility. The confidence-correction channel adopts only after a prequential replay shows it would have lowered Brier; candidate reflex parameters adopt only after an out-of-sample backtest. The measurement model now meets the same bar.
Nightly, after the belief step, a calibration pass rebuilds a point-in-time observation sequence (every composite z computed only from history available at its date), then replays the entire filter from a uniform prior over that sequence for each candidate measurement model — a grid over the observation noise $\sigma_{\text{obs}}$ and the acceleration channel's on/off and parameters. The replay is prequential by construction: every step is scored on the prior, before that observation corrects the belief,
$$\text{score}(\theta) = \frac{1}{T}\sum_{t=1}^{T} \log p\big(o_t \,\big|\, b_{t^-},\, \theta\big)$$
so no candidate ever benefits from information it would not have had live.
A subtlety worth recording: candidates are compared on mean predictive log-density, not on the skill-vs-uniform delta used for the live grading display. Log-density is a proper scoring rule and comparable across noise models; the skill delta is not a valid selection criterion here, because changing $\sigma$ moves both sides of the subtraction — a degenerate, very wide noise model flattens prior and uniform alike and games the delta while predicting nothing.
The adopt-guard then applies the house rules: the static baseline — the original filter, exactly — is always in the race; a candidate is adopted only with at least 40 replay steps and an edge of at least $0.02$ nats/step over that baseline; the verdict is re-evaluated every night, so de-adoption is automatic the moment the record stops supporting the deviation; and every flip lands in the same append-only findings ledger as every other detected change — the system's own learning is just another observed event.
Until the guard is satisfied, live behavior is byte-identical to the original filter. The acceleration channel, the tuned noise — all of it is potential energy behind a proof obligation.
The invariants, again
The earlier article closed on three recurring invariants: budgeted inference, health that is observed rather than asserted, and proof-gated self-modification. This work is those invariants applied one level deeper — to the observation layer itself:
- Observation is difference. Levels anchor; velocities and accelerations signal; every signal is measured against the observer's own history of that signal. Even data revisions are observations of change.
- The representation knows its blind spots. Self-normalization buys comparability and pays with drift-blindness; a dedicated detector covers the debt explicitly.
- The world model observes what the doctrine claims matters. If turns live in the second derivative, the regime filter must see the second derivative — conditionally, cheaply, and off-by-default.
- The observer is graded, and the grade is consumed. A measurement model that scores its own predictions every night and never updates was a quiet contradiction; now the grade feeds a prequential adopt-guard with the same discipline as every other learning channel in the agent.
An agent that watches the world through differences — and watches its own watching the same way.