The agent
How the resolver answers
A language model with a market API attached will answer anything, confidently, including the things it cannot know. sQuil Trade is built the other way around: a deterministic resolver layer holds the data, and the model is given reasoning over it rather than authority to produce it.
Provenance as an architecture, not a policy
The central guarantee is that every figure rendered on screen originates in a resolver call. Not as a guideline the model is asked to respect — as a property of how the interface is assembled. Numbers reach the display through structured tool results; the model’s prose stream reaches a different surface entirely.
This is why a resolver returns a rendered card and a structured payload from a single invocation. The card is what you see; the payload is what the model reasons over. They are the same data, produced once, so the interface and the analysis can never describe different markets.
get_listing_reference("AMZN")
│
├──▶ card ──▶ ledger Market cap $2.86T
│ Session notional $13.2B
│ Token premium −3.43%
│
└──▶ payload ──▶ model { market_cap_usd: 2863755162000,
session_notional_usd: 13190520598.9,
token_premium_pct: -3.4276,
pool_quote_unusable: false, … }The turn pipeline
A turn is a bounded loop, not an open-ended conversation. Each round the model may emit tool calls; the runtime executes them server-side, streams their results into the ledger, and feeds the structured payloads back. When a round emits no calls, that round’s prose is the answer.
→ meta resolver tier, online state → thinking reasoning tokens, streamed to the disclosure panel → tool market.quote state: running → tool market.quote state: done · 274 ms → tool reference.technicals state: done · 331 ms → chart drawn beneath the reply, bound to that call → reset answer column cleared for the final composition → token the reply, streamed → symbols instruments touched this turn
Two invariants fall out of that ordering, and both are structural rather than stylistic.
- Resolution precedes composition. Prose emitted before a tool call is, by definition, written without that call’s result. The runtime relocates it to the reasoning panel and clears the answer column, so a reader receives one complete reply rather than the opening of one spliced onto the body of another.
- The ledger carries the figures. Restating a table the reader is already looking at consumes an answer without adding to it. The model composes interpretation — what the numbers mean, what they do not support, what would change the reading — against cards that already hold the arithmetic.
The claim model
“A figure requires a source” is the narrow case of a broader type system. A comparison, a ranking and a tendency are all assertions about data, and each carries the same evidentiary requirement as a number.
| Assertion class | Admissible when |
|---|---|
| Scalar figure | A resolver returned it. Derived quantities — notional, day counts, indicator values — are computed in the resolver layer precisely so composition never becomes calculation. |
| Comparison or ranking | A resolver compared the instruments. Single-instrument reads cannot support a claim about the registry. |
| Tendency or regularity | A resolver measured the relationship across a sample. A single session is an observation, never a pattern. |
| Unavailability | The resolver that would carry it was called and returned nothing. Asserting absence without querying is the mirror image of asserting presence without data. |
| Interval-bound figure | The window is named exactly as the result labels it. A six-month change quoted as a one-year change is a wrong number read correctly. |
Runtime verification
Instruction alone is a probabilistic control. Where a guarantee has to hold deterministically, it is implemented as a runtime check rather than a request.
Render integrity
A reply that references a visualisation is checked against the turn’s actual render events. If the composition claims a chart is on screen and no chart-producing resolver executed in that turn, the runtime intercepts before the reply ships: the draft moves to the reasoning panel and the model is re-entered with the resolved state — draw the instrument, or ask which one was meant.
assert(claims_visualisation(reply) → chart_rendered_this_turn) violation → relocate draft · re-enter loop · single retry still violating → ship the bounded statement instead of the claim
The property this protects is narrow and important: a reader is never told to look at something that is not there.
Session isolation
Conversation history carries prose, not resolver payloads. A figure from an earlier turn is therefore text, not evidence — and re-quoting it would be an unsourced claim under the model above. The runtime treats a prior turn’s visualisations as expired for the same reason: state that is no longer on screen cannot be referenced as though it were.
Answer composition
In its default posture the resolver does not issue advice, price targets or directional recommendations. Declining the call is not declining the work — the analysis runs, and it is returned as a decision structure rather than a briefing.
- What the data supports, separated from what it cuts against.
- The conditions under which a position holds, and what in the data speaks to each.
- Which risks were measured, which were not, and which unmeasured one bears hardest at the size described.
- What evidence would change the reading, and where it would have to come from.
The case for doing nothing: last quarter beat estimates by 18%, and the next report is 80 days out — no imminent catalyst. The case for treating today as signal: the move was idiosyncratic against a flat market, and recent volatility is running above the year's baseline. Both readings are consistent with the data; the data does not arbitrate between them.