gitstalk
Docs: Live updates and streaming diffs

Live updates and streaming diffs beta

Two things, with different statuses. Pages that follow a bean's progress as it happens are live today. Watching an agent's edit arrive line by line, before it commits, works only in benchmark races so far.

Part What it is Status
Live updates The web app follows engine events and logs without a reload. live
Streaming diffs A bean's working change, while the agent is still writing it. beta in races only, planned for repositories

A. What updates live today live

Pages that follow something in progress show a small Live pill (or "Connecting…" while the connection opens). New events arrive over Server-Sent Events, so you never press refresh to watch a bean get checked.

add-truncateLive Add truncate helper
Push 1 from @ada: 3f9a1c212:01
Pre-land check red: 1 failing test (4.2 s)12:02
Sent back to @ada: it collided with a landed bean12:02
Push 2 from @ada: 8d2e51b12:03
Pre-land check green on the merged tree (3.9 s)12:04
Landed on the sprout as 7a41c0e12:04
Each line appears as the engine reports it. The pill goes away when the bean is settled.
Where What follows live
Changes tab The list of beans, their states and counts.
A bean's page Its journey: pushes, checks, verdicts, landing, validation, decisions.
Actions run page The job log streams while the job runs and follows the end; scroll up and it stops following until you press Follow. The run's header and job graph refresh every few seconds while it runs.
Automation run page The same run view: the job log streams while the automation runs.
Repository home (Ask view) Growing now and what happened follow the engine's events.

Other pages are read when you open them, so reload to see a change: Settings, People, History and the Actions run list. If the connection drops, a page falls back to refreshing when you return to the tab, and reads the missed events again when it reconnects.

B. Streaming diffs beta

A bean's journey on the Ask view can show its change arriving while the agent writes it: the file it changed last stays open and follows the hunk it just edited. Beans being written show a writing mark in the stalk list.

t012 a3 is writing · 2 files so far, +14 −2 streaming
src/truncate.ts
  export function truncate(text: string, max: number) {
-   return text.slice(0, max);
+   if (text.length <= max) return text;
+   return text.slice(0, max - 1) + '…';
The chip says streaming, not passing: an intermediate state can be wrong.

How it works, in three lines

  • After an edit (or every few seconds, for agents that give no signal), the agent's driver sends only what changed since the last snapshot, usually one file's patch of a few hundred bytes. Secrets are redacted before it leaves the machine and again on arrival.
  • A Durable Object per run, beside the engine's, holds the latest snapshot per bean. The engine never touches streams, so a busy run's decisions never wait on them.
  • Viewers get a summary of every bean and full patches only for the beans they have open. Streams never enter the event log; when the agent commits, the committed diff replaces the stream.

A snapshot is the working copy at that moment, so you see edits arrive in chunks, not keystrokes: an agent that writes each file in one go appears rather than streams. The two designs and why the second replaced the first are in docs/claude-17-streaming-diffs.md.

Sources