Skip to content
sQuil Docs

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.

resolver contract · one call, two consumers
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.

turn · event stream
→ 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 classAdmissible when
Scalar figureA resolver returned it. Derived quantities — notional, day counts, indicator values — are computed in the resolver layer precisely so composition never becomes calculation.
Comparison or rankingA resolver compared the instruments. Single-instrument reads cannot support a claim about the registry.
Tendency or regularityA resolver measured the relationship across a sample. A single session is an observation, never a pattern.
UnavailabilityThe 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 figureThe 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.

invariant · render integrity
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.
composition · decision structure
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.