← Blog

What Is a Frame? The Chart-in-Text, Fully Specified

A Frame is a View materialized at one moment: a typed, attributed, watermarked chart-in-text sized for a context window, where the renderer never invents a value.

Answer card

A Frame is a View materialized at one moment: the typed bundle of values that make up the market picture at an instant, each value carrying its source. It is the chart in text, sized for a context window. The tape is vertical and append-only, one row per candle, newest last; candles are relative, printed in basis points versus the prior close, anchored by periodic keyframes. The renderer lays values out but can never invent one.

The terminal is live video; a Frame is one instant of it

If a Kestrel View is the standing definition of what should be seen (which panes, at what token budget), then a Frame is what you get when you press pause. The terminal is live video. A Frame is one fully-specified still. Replay is a sequence of Frames. Nothing in a Frame is decorative and nothing is approximate-by-accident: every number is typed, attributed (observed / calculated / model), and watermarked with the source it came from.

Two flavors exist. A full Frame is a keyframe: the OPEN screen, everything stamped from scratch. A delta frame carries only what changed since the author's last Frame: the WAKE screen. The distinction is not cosmetic; it is the mechanism that makes all-day perception cheap, which we get to below.

A sample Frame

Here is one Frame as an agent could receive it. Instruments are generic and illustrative; numbers are approximate, and the exact glyphs are measured per model tokenizer, never assumed.

KESTREL FRAME  shock · mode sim
wake: velocity(1m) > p99   why-now: +1.9% in 3 min on headline
SPX 5208 +4.5%d · velocity(1m) +0.64% = p99.9 · week −12%/5d · vix 52→44 ↓

tape 5m · candle = body Δbps vs prior close · wicks ↑↓ bps · anchor 5064 @ 13:04
13:04  ▲  +26  ↑6  ↓2   ▃
13:09  ▲  +12  ↑4  ↓5   ▃
13:14  ▲  +20  ↑4  ↓3   ▄
13:19  ▲ +128  ↑8  ↓4   █   ← headline
13:24  ▲  +97  ↑21 ↓6   █   ← now · HOD 5219 set 1m ago

levels  HOD 5219 · LOD 4915 · VWAP 4991 · prior close 4983
chain SPY 0dte  520C fair 1.84 (bid 1.70 / ask 2.05 · receipt ok)
kernel  positions none · resting none · budget 1.0R · wakes 3/12

Read it top to bottom. A kernel header states the session and why the agent is awake. A tape pane streams the candles. A levels pane holds the absolute anchors. A chain pane prices the instrument the agent could act in. A kernel footer states what is at stake right now. Each block is a pane: one named region of the View. A View selects panes; it never computes. Every value in every pane arrives already computed, in the Frame.

Why the tape is vertical and append-only

The tape flows down: one row per candle, time increasing, newest last. This is not a style choice; it is the streaming contract. The next bar is exactly one appended line. An agent that watches all day keeps its entire prior tape in KV cache and pays only for the new rows, so perception cost is O(new bars), not O(screen). A 2D price-by-time grid redraws its whole surface on every update, busting the cache each time; those layouts are reserved for one-shot keyframe orientation or for the human's HTML rendering of the same Frame. The vertical append-only tape is also the oldest idea in the room: the original ticker tape was an append-only stream.

Why candles are relative, in basis points

Each tape row is a relative candle: a direction glyph, the body in basis points versus the prior close, and wick extents up and down. The open is implied; a gap prints only when it is nonzero. Absolute four-digit prices on every row are tokenizer poison: digit strings fragment under byte-pair encoding, and every row re-spends the same high-order digits. Small signed integers tokenize cleanly and stay legible as arithmetic the model can actually reason over.

The absolute level is not lost; it lives in the periodic anchor, re-stamped like a video keyframe (anchor 5064 @ 13:04), and in the levels registry. It is stated once and never re-spent per row. This is why keyframes matter: they are where the Frame re-grounds itself in real price, so the cheap relative rows in between always have a true zero to measure from.

The renderer never invents a value

This is the load-bearing invariant. A rendering is one serialization of a Frame: it chooses glyphs, layout, and token spend, and nothing else. It has two parameters: a format (ascii | unicode | md | json | html) and the tokenizer its token costs are measured under. The agent's ASCII screen and your HTML chart are two renderings of one Frame: same numbers, different glyphs. A rendering can never introduce, drop, round-into-being, or alter a value. If a number appears, it was in the typed bundle, and it carries its watermark. When a value is a quote rather than a fair value, the Frame says so, because in Kestrel a quote is not a value.

This is what "fully specified" buys you: a claim a model can check beats one it must trust. Every number in a Frame is checkable against its own attribution and provenance stamp. There is no layer where a pretty picture and the underlying truth quietly diverge.

Where a Frame is not the whole story

A Frame is perception: it answers what should I see. It does not decide when to look (that is a Wake), what may execute (a Plan), or whether it worked (a Grade). And honesty about status: the renderer, the tournament that selects competing tape renderings on identical Frames, and the per-model glyph measurements are founding-stage work in active build; the format shown here is illustrative, not a shipping spec. What is settled is the shape of the contract: typed, attributed, watermarked, append-only, O(new bars).

The Interface Thesis holds that the two failures of LLM trading are perception and latency, not intelligence. The Frame is the whole of the perception answer: the chart is in text.

A Frame is one instant of the market fully specified in text: every number typed, attributed, and watermarked, laid out by a renderer that can never invent one.