Blog

The chart in the reply

Some findings are a shape: sixteen numbers where four stand out, five versions of one line of UI. In Codecast an agent can put that shape in its reply as a chart, a table or a mockup, drawn right in the conversation, so you see it before you read the paragraph explaining it.

the codecast team5 min read

Sixteen cores in one picture

On October 5th the machine we build Codecast on was overloaded again, and we asked an agent to investigate and talk through the root cause with us. The session's first pass, run by Codex, put it down to too much independently launched work with no machine-wide budget. A session the Thursday before had blamed a low battery. Claude, which took over in the same session, measured the load on each core separately, and its reply led with this:

An agent's reply in codecast. Bold text: The root cause is a priority clamp, not too much work. Below it, a canvas titled Per-core load at 21:59, load average 124, with the caption The 4 efficiency cores are pegged while the 12 performance cores are 55-75% idle, and a bar chart of percent busy per core: four blue efficiency cores at 100 and twelve green performance cores between about 24 and 46
The reply as it appears in the conversation. The canvas has a title, and three controls on its header: source, copy, fullscreen.

You do not need the paragraph to get it. Four blue bars at 100 percent, twelve green bars well under half. The agent's reading: every agent on the machine was running at a throttled priority that macOS keeps on the four efficiency cores, so all the work queued there while the twelve performance cores sat mostly idle. The text under the chart carried the rest of the evidence: 680 processes at the clamped priority shared 2.6 cores, and the same busy loop got 0.44 seconds of CPU from an agent shell against 9.43 seconds as an unthrottled job, about twenty times more. The cause was one missing setting in the launch file of Codecast's background process.

The chart has one flaw, and we left it in. The agent wrote the core numbers as text, so the axis sorts them as text: 0, 1, 10, 11 and on to 15, then 2, 3. That is why two of the blue bars sit in the middle. The small warning sign in the corner is the chart library noticing the same thing: the values look like numbers but arrived as strings.

What the reply was for

The agent ended that reply with three choices about rollout and asked how to handle the restart. The answer came back in one line:

The end of the agent's reply: I saved this to memory so the next overload investigation starts with a per-core measurement. I haven't changed any code. How do you want to handle the restart? Below, a message from Ashot Petrosian on Oct 5: yes, build and validate e2e - unclamp, measure, then build a very liberal budget to start. Then Claude replies with a four step plan starting with adding ProcessType: Interactive to the daemon plist
The next message: approve the fix, measure, then build a budget. The agent's plan follows.

The fix shipped: the background process now launches at interactive priority, and existing installs rewrite their launch file automatically. Once it was live, the agent measured again and reported all sixteen cores busy instead of four. It also found that the fix removed only one of two causes, and the second became more work in the same session. The chart did its job either way. It turned a disputed diagnosis into something you could check at a glance, and the decision came right after it.

Five versions of one line

A canvas is just as useful when the question is how something should look. On October 1st we told an agent that the way Codecast prints a session's character name and title, as in Whisker : Team huddle observation, was subtly off. The usual move would be to change the component and check it in a browser, but the machine was at a load average of 275 and the agent's browser connection kept stalling. So it wrote: "Instead I'll lay the variants out side by side in a canvas."

A canvas titled Name : title separator variants with five rows, A to E, each showing Whisker and Team huddle observation with a different separator, and a note under each: A, the current spaced colon that reads like key : value; B, the colon hugging the name; C, no separator with a regular weight title; D, a middle dot, noting the app already uses it for metadata runs; E, B plus a regular weight title
A mockup drawn in the reply, with the agent's note under each option.

The rows are drawn with the app's own font and colors, so they look the way the real line would. The agent applied B, the smallest fix, and recommended E if that still felt flat. It also pointed out a cost of D: the app already uses a middle dot between pieces of metadata. We picked D anyway:

The agent's message: The canvas above has other directions in case the hug alone isn't enough, recommending E and describing C, then Tell me which way to push it. Below, a message from Ashot Petrosian on Oct 1: middle dot. Then Claude: The separator is now a middle dot (Whisker · Team huddle observation), with the change in components/identity/SessionIdentityLine.tsx and three test assertions updated; all 11 identity tests pass
Two words of feedback, because the options were already on screen with names.

Two words were enough because every option had a letter and a picture. The agent made the swap, updated the three test assertions that checked the old colon, and the middle dot is what the app shows today.

How a canvas behaves

A canvas sits in the conversation like any other part of the reply, with its title on a header strip and three controls. Show source flips it to the HTML the agent wrote, Copy HTML copies that, and Fullscreen opens it on its own over the app; Esc closes it. A tall canvas folds behind a fade with a control to show the rest.

The same per-core canvas with Show source toggled: a div with data-canvas-title, a paragraph styled with var(--sol-text-muted), and a div with class cast-chart and a data-spec attribute holding JSON marks of type barY with data entries such as c 0, v 100, k efficiency
The source view of the per-core chart. The chart is a short description of the data; Codecast draws it.

The source shows how little the agent writes for a chart: a title, a caption, and a description of the bars as data. Codecast draws the chart itself, so it uses the app's font, follows light and dark mode, and can show each value on hover. The same goes for tabs, sortable tables and tooltips. You can also see the cause of the odd axis order here: "c":"0" is a string.

Canvases are safe to show to anyone who can read the session. No script the agent writes ever runs: Codecast strips scripts and event handlers before drawing. A canvas also cannot load anything from outside. An image has to be embedded in the canvas or stored in Codecast, so viewing one never tells a third party you looked. The desktop app draws canvases the same way as the web app, and the phone app draws them too; an older phone build that predates the feature shows the source as a code block instead.

Agents do not need prompting to use this. The instructions Codecast installs for your agents tell them to reach for a canvas when structure or size carries the meaning (comparisons, flows, timelines, metrics) and to keep ordinary prose in markdown. The same applies to the questions agents put in your decision queue, where a canvas can lay the options side by side.

From a script

A canvas is a fenced block in the agent's markdown, so any agent that writes markdown can draw one, and so can you:

a canvas in a reply
$ ```cast-canvas
$ <div data-canvas-title="Shown in the header"> … </div>
$ ```
Codecast records every coding agent session you run, on any machine, and gives you one place to see them, steer them and answer them.

All five screenshots are the codecast web app on 2026-10-18, of two of codecast's own sessions from October 1 and October 5. Each is cropped to the conversation column: the sidebar, the top bar, the session header and the right rail are outside every crop, as is the strip that keeps the last user message pinned at the top while you scroll. The fourth screenshot starts at the canvas, below the agent's one-line lead-in quoted above it. Nothing was composited or retouched, and the chart's axis order and warning sign are as the agent drew them. The fullscreen view and the phone app are described, not pictured. No message was sent and no session was changed for this post.