Vizuara logoVizuara AI Labs

Explainer · AI agents

How DeepSeek’s Super-agent works

Why agent sessions now cap what we get done, and the five pieces of system design DeepSeek proposes to remove that cap, traced through one team’s morning

On 1 November 2026, the DeepSeek Harness team published a long design note titled Exploring Super-agent Design: Towards a More Autonomous Agent System. I read it, then spent about an hour working through it at a whiteboard, with a colleague asking questions along the way. This page is the written version of that session, with the drawings redone so that they can be read on their own.

The video The 56-minute whiteboard session this page is written from. Watch it on YouTube, where the description has chapters for every section below.

The note asks a question that anyone who works with coding agents will recognise. Agents now finish single tasks with little help. So why does a day of working with them still feel limited? DeepSeek’s answer is that the limit has moved. It is no longer mainly the model; it is the person who has to open, watch and remember every agent session. The rest of the note is a system design for taking that job away from people, and nearly every piece of it is borrowed from classic computer systems (Table 1).

Table 1 The questions this page answers, and what each section finds.
SectionThe questionWhat it finds
1Why do agents feel limited when single tasks work?you can follow 3 to 5 sessions
2What is a Super-agent?one continuous agent with four properties
3What does the whole design look like?five modules on one page
4Who talks to people, and who does the work?a light Router and isolated Workers
5Which events deserve attention?code first, then a model
6Must every event pass through the Router?no: Threads and pass-through
7What goes into a context window?Inline & Spill, Chain of Recall
8Can the agent start before anyone asks?yes, and drop what is not needed
9What if a tool takes twelve minutes?an asynchronous loop that never blocks
10How does it stay online when your laptop sleeps?separate compute, state and environment
11Who notices when it gets stuck?a Watchdog outside the system
12Does any of it help?DeepSeek’s early, synthetic numbers
13What is this, and what is still open?a design proposal, with four open problems

We follow one small, invented example through every section: a team of six building a mobile app, and seven events that reach their tools between 10:01 and 10:07 one morning. Each idea is shown twice. A drawing explains the mechanism, and a worked example shows what you would actually see: the WhatsApp group, the X post, the pull request, the email, and the text the model receives in its context window. Details from DeepSeek’s note that the story does not need, such as exact quotations and measured numbers, sit in boxes headed In DeepSeek’s note. Short clips from the video show the whiteboard being drawn at four times speed, and each one links to that moment in the video, where you can watch it at normal speed with sound. The page ends with a quiz.

1Where agents are stuck

Open a coding agent today and the unit of work is a session. You click the plus button, a new session starts, and you type a request into it. To work on three things at once, you open three sessions and switch between them. Each session knows only what was said inside it, so you also carry a map in your head: which session read the CI log, which one has the plan we agreed on, which one is waiting for an answer.

DeepSeek puts a number on how far this goes. In their experience a person can follow only 3 to 5 active sessions at once. Their summary of the situation is the sentence the rest of the note is built on: a single task is limited by model capability, but doing many tasks is limited by human attention (Figure 1).

Left, today: a person opens five agent sessions by hand and has to remember what each one knows; a person can follow about 3 to 5 at once. Right, a Super-agent: team chat, GitHub, email and the calendar feed events to one always-on agent, which opens and closes its own working sessions; the person is asked only for decisions and sign-off.
Figure 1 Today you open the sessions and keep track of what each one knows, and you can follow about 3 to 5 of them. In a Super-agent, events from your tools reach one always-on agent, which opens its own working sessions and asks you only for decisions and sign-off.

A natural first fix is to connect the agent you already have to more places: give it a CLI for GitHub, an MCP server for the team chat, a connector for email. Now it can receive outside messages. DeepSeek’s point is that the basic limits stay. The agent still runs one synchronous session that blocks during long operations, the contexts of different tasks get mixed together in it, and everything stops when the laptop goes offline. Someone also has to keep the whole arrangement running.

Here is the morning we will follow. None of these people or events is real; they are a small, concrete stand-in for the group chats and GitHub projects DeepSeek describes (Table 2).

Table 2 Seven events between 10:01 and 10:07, an invented example used on the rest of this page.
#TimeWhereWhat
110:01team chatRiya: “lunch at 1?”
210:02team chatPriya: “login fails on Android since yesterday’s release”
310:03GitHubpull request #412 opened: “Fix token refresh”
410:04team chatbuild-bot: “nightly build green”
510:05GitHubCI fails on #412
610:06GitHubAnkit reviews #412: “please add a test for expired tokens”
710:07team chatArjun: “@agent what changed in yesterday’s release?”

With a single-session agent, only event 7 reaches it, because only event 7 mentions it. Nobody tagged it on Priya’s bug report, so it never sees event 2. If someone wants help with the pull request, they open a session, paste in the CI log and the review comment, and then remember that this session is “the #412 one”. That remembering is the work DeepSeek wants to take away.

Team chat, a WhatsApp group

AT
App teamPriya, Arjun, Riya, Ankit, Meera, Agent
TODAY
Riya
lunch at 1?10:01
Priya
login fails on Android since yesterday’s release. iOS is fine10:02
nobody tagged the agent, so it never sees Priya’s report
Arjun
@Agent what changed in yesterday’s release?10:07
Agent
Yesterday’s release merged 9 pull requests: a new token refresh, a faster image cache, Android 15 fixes and 6 smaller ones.10:09

Your agent app, the same morning

Sessions + New session
Release notes for v2.8opened by you at 10:07
Review #412you pasted in the CI log and Ankit’s comment
Android login bug?you opened it after scrolling the group at 10:15
Flaky test investigationyesterday
Onboarding copyyesterday
“Which session has the CI log? Does the login one know about #412?”
Example 1 The morning as it looks today. The agent answers only the message that tags it, and you keep the map of which session knows what.
Whiteboard 1 The first board: sessions that a person opens, limited by attention, and then one agent that listens to Teams, GitHub, Notion and a CRM and opens sessions itself. A clip from the video at 0:46, sped up 4 times; follow the link to watch it at normal speed, with sound.

2What a Super-agent is

DeepSeek’s proposal is to decouple the agent from any single session that a person drives by hand. The agent becomes one continuous entity. It keeps its context across sessions and works on several complex tasks at once without the tasks interfering with each other. They call this kind of agent, and the system around it, a Super-agent.

They ask for four properties (Figure 2). It should be continuous: people talk to it where they already work, in chat or in GitHub comments, and it always feels like one agent. If Arjun asks for plan A in chat and later switches to plan B in a pull-request comment, it understands the change. It should be productive: several tasks in parallel, each to a high standard, and it takes the next instruction before the last one finishes. It should be proactive: it watches events, acts on anything worth handling and stays quiet otherwise. And it should be persistent: always online, connected to real working environments, and able to recover from failures on its own.

Four cards. Continuous: one agent across every channel, so a plan changed in GitHub updates what was asked in chat. Productive: several tasks in parallel, each done well, and a new instruction taken before the last one finishes. Proactive: it watches events and acts on what is worth handling without being tagged. Persistent: always online, and it recovers from failures on its own.
Figure 2 The four properties DeepSeek asks of a Super-agent, each with what it means for our team’s morning.

Continuity is the easiest property to see on a real screen. Arjun asks for release notes in the team chat, then changes his mind an hour later in a comment on the pull request. One agent sees both, so it knows the second request replaces the first (Example 2).

10:07, in the team chat

AT
App team6 members
Arjun
@Agent please also draft the v2.8 release notes, grouped by feature10:07
Agent
Will do. I’ll open a pull request with the draft.10:07

11:20, on the pull request

Release notes for v2.8 #415
OpenAgent wants to merge 1 commit
arjun commented at 11:20
Actually, group these by platform, Android first. Support reads them top down.
Agent commented at 11:22
Regrouped by platform, Android first. This replaces the by-feature grouping you asked for in the team chat at 10:07.
Example 2 A plan set in the team chat and changed on GitHub. Because it is one agent across both channels, it says which earlier request the change replaces.

No single ReAct loop gives all four at once, so they have to come from the system around the model. That is the claim that turns this from a product idea into a systems problem. DeepSeek also expects personal agents and agents for team work, such as software development, to end up with similar designs, because the constraints are the same: always online, and answering many events concurrently.

In DeepSeek’s noteThe instance they run

DeepSeek runs an internal Super-agent on DeepSeek Harness. It continues the same development task across their IM and GitHub. It also watches feedback in public group chats and, even when nobody @-mentions it, finds root causes on its own and opens pull requests to fix them. The note says it helps every day with reproducing and fixing issues, answering code reviews and developing DeepSeek Harness itself.

The note opens with a caution worth keeping in mind on every section here: it discusses architectural ideas and is not an introduction to existing DeepSeek Harness features.

3The design on one page

Before taking it apart, here is the whole design (Figure 3). Events from the places where work happens become Triggers. A filter removes noise. A long-lived Router talks to people and hands out tasks, and Workers do the tasks, each in its own context. Events on a conversation a Worker already follows skip the Router entirely. Underneath, sessions live in a database, the agent loop runs in the cloud and reaches machines like your laptop through a small daemon, and a Watchdog outside the system checks that everything is alive and moving. The numbered circles are the sections of this page where each piece is explained.

Events from team chat, GitHub, email and the calendar become Triggers. A filter (code first, then a model) drops noise. Events on a Thread that a Worker already follows pass straight through to that Worker; new ones go to the Router, a long-lived session that talks to people and dispatches tasks but runs no tools. Workers have their own context and tools and report back to the Router, which replies on each channel. Sessions live in a database; the agent loop runs in the cloud and reaches execution machines, such as your laptop, through a small daemon. A Watchdog outside the system checks liveness and progress. Animated: a chat message is dropped by the filter, a bug report and a new pull request go through the Router to Workers 2 and 1, and a CI result on that pull request passes straight to Worker 1.
Figure 3 The Super-agent design on one page. The moving dots are events from our morning: the lunch message (1) is dropped by the filter, the bug report (2) and the new pull request (3) go through the Router to Workers, and the CI failure on that pull request (5) passes straight through to its Worker.

On the whiteboard I drew it in the same order, starting from the event trigger and ending at the session database and the Watchdog.

Whiteboard 2 The architecture board being drawn: event trigger, two-stage filter, the global Router layer and the Worker sessions it dispatches to. A clip from the video at 10:35, sped up 4 times; follow the link to watch it at normal speed, with sound.

4Two levels: a Router and Workers

Start with the simplest design that could be continuous: send every event to one session. That session sees everything, so it never loses track of anything. But a ReAct loop works one step at a time, so one session can only do one thing at a time. On our morning, it would be halfway through reading the CI log for #412 when Arjun’s question arrives, and the details of three tasks would pile up in one context, which DeepSeek says makes the results worse.

Now try the opposite: start a new session for every event. All seven events run in parallel. But when tasks are not fully independent, nothing connects the results. Priya’s bug and pull request #412 turn out to be about the same token refresh code, and two separate sessions would never know it. Several sessions would also reply to the team separately, which is confusing. One design gives continuity, the other throughput, and each gives up the other (Figure 4).

Three ways to organise sessions for the same five events. One session for everything: continuous, but it works one step at a time and the tasks mix in one context. One new session per event: fast, but nothing connects the results and several sessions reply to people separately. Two levels: a Router keeps one continuous conversation with people while isolated Workers do the tasks in parallel.
Figure 4 Three ways to organise sessions for the same events. One session is continuous but slow; a session per event is fast but disconnected; two levels keep one continuous voice while the work runs in parallel. DeepSeek pays for this in tokens (section 12).

The way out is to give the two jobs to two layers. A long-lived Router handles all interaction with people and all global coordination, so it keeps the continuity. Context-isolated Workers do the tasks, so the work runs in parallel. On our morning, the Router starts Worker 1 for pull request #412, Worker 2 for Priya’s login bug and Worker 3 for Arjun’s question.

The Router is the system’s single global point: every cross-task fact and decision passes through it, so it serves as the place where events are put in order, where tasks are coordinated, and where memory lives. To keep one global node from becoming a bottleneck, it is designed not to do tasks itself. It only talks to people and dispatches work, and it can run without a Bash tool at all. Its job turns out to be simpler than you might expect, and DeepSeek finds that a lighter model usually gives both speed and quality there.My colleague asked at the board whether this is just a main agent with subagents. The difference is the same one DeepSeek draws with an Agent Team: a team lead usually breaks one complex task into tightly coupled steps and coordinates the members, which is heavy reasoning. The Router does not break tasks down; it dispatches separate tasks and tracks how they relate.

Workers are the opposite. Each has an isolated context and a full set of execution tools and is given one task, so each needs the most capable model. Workers never talk to people directly; their reasoning and tool calls stay out of the team chat. Each Worker reports to the Router, and the Router writes every reply. A Worker can itself start subagents or be an Agent Team, and the Router does not need to know.

Here is what that looks like from both sides. The team sees one agent answering in the group. Behind it, the Router has started three Workers in five minutes and posted nothing it did not need to (Example 3). Notice the last line of its reply: because the Router saw Priya’s report too, it can connect Arjun’s question to the bug.

What the team sees: one voice

AT
App team6 members
Arjun
@Agent what changed in yesterday’s release?10:07
Agent
On it, I’ll post a summary here in a few minutes.10:07
Agent
v2.8 merged 9 pull requests: a new token refresh, a faster image cache, Android 15 fixes and 6 smaller ones. The token refresh is the change behind Priya’s Android login report; I’m looking into it.10:12

Behind the scenes: the Router’s log

Router: dispatches only, runs no tools10:02 [T2] chat: login fails on Android → start W2 (login bug), policy: reproduce silently10:03 [T3] PR #412 opened → start W1 (review #412)10:05 [T5] CI failed on #412 → W1 follows it, skip10:06 [T6] review on #412 → W1 follows it, skip10:07 [T7] chat: @Agent what changed? → reply “On it”, start W3 (release summary)10:12 W3 reports → write the chat reply (52 words) and link it to W2’s task
Workers: strongest model, own tools, never postW1 review #412 git, CI logs workingW2 login bug git, emulator workingW3 release summary git log done 10:12
Example 3 One voice in the chat, three Workers behind it. The Router’s log shows each event it handled: start a Worker, skip because a Worker already follows it, or reply.

The consequence for the person is the point of the whole section. Nobody on the team opened a session this morning. Sessions have become an implementation detail of the system instead of something people manage, which DeepSeek describes as a habit carried over from low-level LLM APIs.

Can one Router keep up?

A single long-lived session sounds like the obvious bottleneck. Suppose events 2 and 3 arrive while the Router is still thinking about event 1. They wait, and in the Router’s next turn both go into the same model call. Because the Router only dispatches, that call has a long input and a short output. The long input is read in the prefill, which processes all its tokens in parallel, so two events cost much less than twice one event. The busier the Router gets, the more events share each call, and the less time each decision costs (Figure 5).

Left: a timeline of the Router session. Events 2 and 3 arrive while the Router is busy with an earlier turn, so they queue and go into the next model call together: one long input, one short output. Right: DeepSeek's stress test of the Router, at about 1 and about 40 decision-needing Triggers a minute. The average batch grew from 1.0 to 2.8 events, the time per request from 2.5 to 3.9 seconds, and the time per decision fell from 6.4 to 1.6 seconds.
Figure 5 Left: events that arrive while the Router is busy wait and ride together in its next model call. Right: DeepSeek’s stress test of the Router alone, at about 1 and about 40 decision-needing Triggers a minute. The time per request grows, but the time per decision falls from 6.4 to 1.6 seconds.
In DeepSeek’s noteThe Router stress test, and what happens at scale

They tested the Router on its own, calling a real model while the Workers used mock models, and raised the rate of Triggers that need a decision from about 1 to about 40 a minute. The average batch grew from 1.0 to 2.8 events and the time per request from 2.5 to 3.9 seconds, so the time per decision fell from 6.4 to 1.6 seconds. A decision can take several requests, because the Router may reason over a few steps or recall context first, which is why the time per decision can exceed the time per request.

The limit depends on the context length and on how many Triggers the model can handle accurately in one turn. If one Router session ever stops keeping up, the note suggests filtering in several stages inside the Router, or splitting it into shards. Both bring back the same trade-off as Figure 4: the finer the shards, the less context they share. For their team’s current size, one Router session is enough.

5Triggers, and which ones matter

With the two levels in place, look at what drives the system. A chat model is driven by prompts a person types. A Super-agent is driven by semi-structured events from the environment: chat messages, emails, calendar reminders, review comments, CI results. DeepSeek calls these Triggers. Because the agent listens for them, it no longer waits for a command before each run.

The trouble is volume. Connected to a real group chat and a real repository, the agent sees a noisy stream in which most messages need nothing from it. Asking a large model to judge every one from scratch would be slow and expensive. DeepSeek borrows the fast path and slow path from computer systems: frequent, well-defined judgments become plain code, which is fast and cheap, and only the cases that need understanding go to a model, which is flexible and expensive.

So filtering has two stages. First, code checks deterministic facts: the source, the group, allowlists of users and bots. Each source can be set to “respond only to explicit requests”, “treat as candidate events” or “ignore”. Then a model judges the candidates against policies written as prompts, which people can switch on or off, or add, at any time. Trace the morning through it (Figure 6). The build bot is on the ignore list, so code drops event 4 without calling a model. Event 7 tags the agent, so code admits it directly. Events 1, 2, 3, 5 and 6 come from sources set to “candidate”, so the model reads them; it drops “lunch at 1?” and admits the rest.

Seven events (an invented example). Code rules run first: the build bot's message is ignored by source, Arjun's message tags the agent so it is admitted directly, and the rest are candidates. A model then judges the candidates against policies written as prompts: "lunch at 1?" is dropped; the bug report, the new pull request, the CI failure and the review comment are admitted. Five events go on to routing.
Figure 6 The morning’s seven events through the two-stage filter. Code drops the build bot’s message and admits Arjun’s explicit request; the model drops “lunch at 1?” and admits the bug report, the pull request, the CI failure and the review. Five events go on to routing.

On a real screen, every message gets a verdict, and the verdicts come from rules and prompts that the team can read and change (Example 4). Two more events arrive here: Meera’s message about the same login problem, and a customer’s post on X. The model links both to the bug the agent already knows about.

The team chat, as the filter sees it

AT
App team6 members
Riya
lunch at 1?10:01code: candidatemodel: social chat, drop
Priya
login fails on Android since yesterday’s release. iOS is fine10:02code: candidatemodel: bug report, admit
build-bot
nightly build #8812 green10:04code: ignore list, drop
Arjun
@Agent what changed in yesterday’s release?10:07code: tags the agent, admit
Meera
anyone else seeing the login thing? my cousin says the app keeps logging her out10:09code: candidatemodel: same bug, admit

A customer, on X

C
A customer @customer_example · 10:11
@ourapp_example can’t log in on Android since yesterday’s update. tried reinstalling twice
code: mentions us, candidatemodel: matches the login bug, admit and link

The rules and policies behind those verdicts

agent config, invented for this example# code rules (fast path): no model is called
build-bot                    → ignore
group "App team"             → candidate
message tags @Agent          → admit
X post mentions us           → candidate

# policies (slow path): prompts a model applies,
# which anyone on the team can edit
1. Ignore social chat: lunch, greetings, thanks.
2. Silently reproduce and fix: when someone reports
   a bug, try to reproduce it in the background.
   Speak only after you have reproduced it and
   found a simple fix.
3. Customer reports on X: link them to an open bug
   Thread if one matches. Never reply in public
   without a person's approval.
Example 4 The verdicts on real messages, with the config behind them. Code rules decide what they can without a model; the policies are plain prompts. Policy 2 is DeepSeek’s own “silently reproduce and fix”; the others are invented for this example.
Whiteboard 3 The filtering board: a fast path for stable, deterministic judgments, and a slow path, a model, for everything that needs understanding. A clip from the video at 25:11, sped up 4 times; follow the link to watch it at normal speed, with sound.
In DeepSeek’s noteThere are two fast paths, not one

At the board we got briefly stuck on whether the fast path skips the model completely. Reading the note again, the confusion comes from the idea appearing twice. In filtering, the fast path is code deciding whether an event is ignored, admitted as an explicit request, or passed on as a candidate for the model. In routing, which the next section covers, the fast path is code passing a follow-up event straight to the Worker that already owns its conversation, so the Router does not have to forward it. Both apply the same principle: let code decide what code can decide reliably, and spend model calls only where judgment is needed.

6Threads and pass-through

Five events survive the filter. Should all of them go to the Router? Look at events 3, 5 and 6: a pull request opens, its CI fails, and a reviewer comments on it. They are one conversation. If the Router had to read and forward each follow-up, the single global node would do a lot of repetitive work and every reply would be slower.

DeepSeek calls such a stream of related events a Thread: consecutive events on the same pull request, chat topic or email chain. When the Router starts a Worker for the first event of a Thread, that Worker subscribes to the Thread. From then on, code passes the Thread’s follow-up events straight to the subscribed Worker. The Router still sees every event, so it can keep track of the whole picture, but it only evaluates and dispatches events that have no subscriber yet (Figure 7).

The five admitted events grouped into three Threads: the chat thread about the Android login bug (event 2), the GitHub thread of pull request 412 (events 3, 5 and 6) and Arjun's chat question (event 7). The first event of each Thread goes to the Router, which starts a Worker that subscribes to the Thread. Events 5 and 6 then pass straight through, by code, to Worker 1. Worker 2, chasing the login bug, later also subscribes to the pull request's Thread, so it sees events there too: subscriptions are many to many.
Figure 7 The five admitted events in three Threads. The first event of each Thread goes to the Router, which starts a Worker that subscribes to it. Events 5 and 6 then pass straight through to Worker 1 by code. When Worker 2 finds that Priya’s bug lives in the same token code, it also subscribes to the pull request’s Thread.

The pull request page makes the idea concrete. Everything on that page is one Thread, and the Router’s view of the same minutes shows how few decisions it has to make (Example 5).

The pull request: one Thread

Fix token refresh #412
Openmeera wants to merge 3 commits into main
meera opened this at 10:03
first event: Router starts W1, W1 subscribes
android-tests failed at 10:05 TokenRefreshTest.refresh_afterExpiry
passed straight to W1
ankit commented at 10:06
please add a test for expired tokens
passed straight to W1
Agent commented at 10:24
The Android login failure reported in the team chat comes from this code path: refresh() still sends the old token after it expires.
from W2, which now subscribes here too
Agent pushed 1 commit at 10:31 Add test for expired tokens

The same minutes, from the Router

Router: what it decides about each event[T5] gh-pr-412  CI failed
     subscribers [W1]       pass through, no decision
[T6] gh-pr-412  review by ankit
     subscribers [W1]       pass through, no decision
[T7] chat       @Agent what changed?
     subscribers none      decide: start W3
[T8] gh-pr-412  comment by W2
     subscribers [W1, W2]   pass through to both
[T9] chat       Meera: anyone else...?
     thread wa-login, subscribers [W2]
                          pass through
Example 5 Pull request #412 as one Thread, and the Router’s view of the same minutes. Only Arjun’s question needs a decision; every event with a subscriber passes through by code.

Subscriptions are many to many. A Worker can follow several Threads, and a Thread can have several Workers. That matters on our morning. Worker 2, chasing Priya’s login bug, finds that it comes from the same token refresh code that pull request #412 changes, and subscribes to the pull request’s Thread too. Now every new event there reaches both Workers at once, and each can see what the other is doing and avoid a conflict, without the Workers ever messaging each other. If a new event falls outside a Worker’s task, the Worker can unsubscribe or hand the event back to the Router.

Whiteboard 4 The routing board: a Thread with trigger 51 (pull request opened), 54 (CI status) and 58 (review comment), and why they should not all go through the Router. A clip from the video at 27:39, sped up 4 times; follow the link to watch it at normal speed, with sound.

7What goes into the context window

An event has now reached the right session. How much of the world should come with it? Here DeepSeek is blunt: wasting the context window is wasting the model’s intelligence. Inject too much and the window fills up and dilutes the model’s attention. Inject too little and the model has to call tools again and again just to read what it needs.

They treat the window as a cache and use two operations from compilers and systems. Inline puts information that is likely to be needed soon directly into the window, saving tool calls. Spill keeps the full information outside the window when it is too long or rarely used, and leaves only a reference or a summary inside, through which the model can read the rest on demand. Combined with locality, this gives three steps. Start minimal: the object’s ID and a summary. Then inline what is near, in space (the message it replies to, the other comments in the same review) and in time (what happened just before). Then cap long content: cut it and leave a pointer to the rest.

Here is what Worker 1 receives when Ankit’s review comment, event 6, arrives (Figure 8).

The context window treated as a cache. When the review comment (event 6) reaches Worker 1, the injection starts minimal: the event's ID and a summary. Related things are inlined by locality: in space, the event it replies to and its Thread; in time, the CI failure a minute earlier, both as IDs with short summaries. The long comment is cut at a small cap and the rest is spilled: it stays outside the window, and the cut leaves a pointer the model can follow with a tool call. The same goes for the full CI log.
Figure 8 Inline and Spill on event 6. The injection starts with the event’s ID and summary, inlines what is near it in space and time as IDs with short summaries, and cuts the long comment and the CI log, leaving pointers the model can follow with a tool call.

The easiest way to understand Inline & Spill is to put a real screen next to the text the model receives. Start with Priya’s message. Near it in space are the message it replies to and the one after it; near it in time are the pull request and the CI failure a few minutes later. The screen recording and the 12,481-line CI log are spilled: the model sees that they exist and how to read them, but they do not take up the window (Example 6).

In the team chat

AT
App team6 members
Meera
release went out last night btw09:58
Priya
Meera: release went out last night btw
login fails on Android since yesterday’s release. iOS is fine. screen recording attached10:02
Arjun
same on my Pixel10:03

And a CI run that just failed

android-tests, run 5521: 12,481 lines...
> Task :app:connectedDebugAndroidTest
TokenRefreshTest > refresh_afterExpiry FAILED
    AssertionError:
      expected:<200> but was:<401>
      at TokenRefresher.kt:88
214 tests completed, 1 failed

What Worker 2 receives

Worker 2’s context: one event, injectedEVENT [T2] wa:app-team  Priya  10:02
  "login fails on Android since yesterday's release. iOS is fine..."
  attachment [A7] screen-recording.mp4, 38 s  → read(A7)
NEAR IN SPACE
  replies to [T0] Meera 09:58 "release went out last night btw"
  next [T2b] Arjun 10:03 "same on my Pixel"
NEAR IN TIME
  [T3] gh-pr-412 opened 10:03 "Fix token refresh"
  [T5] gh-pr-412 CI failed 10:05:
     TokenRefreshTest.refresh_afterExpiry
     expected 200, was 401 at TokenRefresher.kt:88
     full log, 12,481 lines → read(T5.log)
THREAD [wa-login]  subscribers [W2]

purple: IDsblue: inlined by localityyellow: spilled, one tool call away

Example 6 Priya’s chat message as Worker 2 receives it. Neighbours in space and time are inlined; the attachment and the full CI log are spilled behind read() calls. Only the failing test and its error line are inlined from the log.

Now a long comment. Worker 1 receives the first part of Ankit’s review and a pointer. It reads the rest only because the first part is about the same bug it is working on (Example 7).

Ankit’s full review comment

Fix token refresh #412
ankit commented at 10:06
please add a test for expired tokens, and check the Android path where the refresh runs while the app is resuming from the background; that is where I saw the 401 last week. Also, refreshIfNeeded() is now called from two places, so it may run twice and the second call can still send the old token. Can we guard it, or move the call into the interceptor? Happy to pair on it after lunch.

What Worker 1 receives, then reads

Worker 1’s contextEVENT [T6] gh-pr-412  review comment  ankit  10:06
  "please add a test for expired tokens, and check the
   Android path where the refresh runs while the app is
   resuming from the backgro... [cut at 160 chars:
   rest → read(T6)]
NEAR  replies to [T3] PR opened by meera
      1 min before: [T5] CI failed, refresh_afterExpiry

# the model decides it needs the rest:
→ read("T6")
  "...und; that is where I saw the 401 last week. Also,
   refreshIfNeeded() is now called from two places, so it
   may run twice and the second call can still send the
   old token. Can we guard it, or move the call into the
   interceptor? Happy to pair on it after lunch."
Example 7 A long review comment, cut at a small cap with a pointer, and the one tool call that reads the rest when the model decides it needs it.

The same method works outside software. A personal agent that receives the ninth reply in an email thread does not need all nine bodies and two attachments in its window. It needs the new message in full, one line for each earlier message, and anything nearby in time, such as a calendar entry on one of the proposed dates (Example 8).

A personal agent: your inbox

Re: Team offsite, venue and dates (9)
Neha, you, Karan, Neha, Farah, ... latest 08:52

Neha, 08:52: Lake View can do 20 to 22 Nov for 14 people. They need a deposit by Friday. Contract and floor plan attached. Can you confirm the dates work for your team?

8 earlier messages, 2 attachments

What your agent receives

context: an email Thread of 9 messagesEVENT [M9] email  Neha  08:52  "Re: Team offsite..."
  "Lake View can do 20 to 22 Nov for 14 people. They
   need a deposit by Friday. ... Can you confirm the
   dates work for your team?"
  attachments [F1] contract.pdf, 6 pages  → read(F1)
              [F2] floorplan.png         → read(F2)
EARLIER IN THE THREAD, one line each
  [M1] you      "We need a place for ~14, late Nov"
  [M4] Karan    "Avoid 18 Nov, product review"
  [M7] Farah    "Budget cap is the same as last year"
  ... 5 more → read(thread=offsite)
NEAR IN TIME
  [C4] calendar: 21 Nov 10:00 board call (yours)
Example 8 An email thread of nine messages for a personal agent. The newest message is inlined in full, earlier ones as one line with an ID, and the contract and floor plan are spilled. The calendar clash on 21 Nov is inlined because it is near in time.

Notice that nothing has been thrown away. The full comment and the full CI log still exist; they are just one tool call away instead of filling the window. That is different from summarising old context and discarding the original.On the whiteboard I said that DeepSeek does not compact context at all. The note does not discuss compaction either way; what it describes is Spill, which keeps the full information outside the window behind a pointer. That is the accurate way to put it.

Chain of Recall

The Router has a context problem of its own. Follow-up events pass straight to Workers, and finished tasks pile up over days, so it cannot keep every task’s history in its window. Yet if someone brings up an old task in another channel, it has to recover that task’s context.

Apply Inline & Spill to every kind of object in the system, Triggers, Threads and Worker sessions alike, and give each one an ID. Whenever an object is injected, the IDs of its closest relatives are inlined with it. The IDs link everything into a reference graph, and each object read through a tool call inlines the IDs of the next hop. Starting from the current event, the model can follow these references as far as it needs. DeepSeek calls this Chain of Recall (Figure 9).

The next morning (an invented example), Priya asks in chat whether the Android login problem was fixed. The Router no longer holds that task's history, only the one line it kept when it dispatched it: an ID and a summary. Hop 1 reads Worker 2 by its ID; the result inlines the IDs of the next objects, including the pull request's Thread. Hop 2 reads that Thread and finds the fix merged. The Router replies in a few words.
Figure 9 The next morning, the Router answers a question about yesterday’s task in two hops: from the one line it kept about Worker 2, to Worker 2’s summary, to the pull request’s Thread.

Step through the same question as the Router does (Example 9). It never searches everything. It starts from the one line it kept, reads an object by ID, and lets each result tell it where to look next.

The next morning, in the team chat

AT
App team6 members
TODAY
Priya
@Agent did the Android login thing get fixed?09:14
Agent
Yes. It came from the token refresh change: after a token expired, refresh still sent the old one. The fix and a test went into #412, which Ankit merged yesterday at 15:20, and CI is green.09:14

How the Router got there

  1. The question arrives. Yesterday’s turns have been spilled, but each kept one line with an ID.

    EVENT [T41] wa:app-team  Priya  09:14
      "@Agent did the Android login thing get fixed?"
    FROM MY HISTORY
      [W2] "Android login bug", from [T2], reported done 10:41
  2. Hop 1: the Router reads Worker 2 by its ID. The result inlines the next IDs.

    → read("W2")
      reproduced on an Android 14 emulator; refresh() sent
      the expired token; fix + test pushed to #412
      threads [gh-pr-412] [wa-login]   commit a3f9c1e
  3. Hop 2: it follows the pull request’s ID to see what happened after.

    → read("gh-pr-412")
      merged by ankit, yesterday 15:20; CI passing
      last events [T52] merge  [T50] approval
  4. Two hops are enough. It writes a chat-sized reply, under 100 words.

Example 9 Chain of Recall, one step at a time: the question, the line the Router kept, two reads by ID, and a reply under 100 words.

A personal agent recalls across apps in the same way. Asked about a dentist appointment, it goes from a chat message, to the email it links to, to the calendar entry that email created (Example 10).

A personal agent, in a WhatsApp chat

A
Agentyour personal agent
what time did we fix the dentist for?19:40
Agent
Thursday 6 Nov at 5:30 pm. The clinic moved it from Wednesday in an email on 30 Oct, and your calendar has the new time.19:40

The hops, across three apps

  1. Chat: your own message from last week mentions the move.

    [M12] chat, 29 Oct: "dentist wants to move the appt"
      linked [E88] email "Re: your appointment"
  2. Email: the clinic’s reply has the new slot, and links the calendar entry it created.

    → read("E88")
      "...moved to Thursday 6 Nov, 17:30..."  linked [C31]
  3. Calendar: the event confirms the time before the agent answers.

    → read("C31")
      Dentist, Thu 6 Nov 17:30 to 18:00
Example 10 A personal agent recalls across three apps by following IDs: a chat message, the clinic’s email, and the calendar event.
Whiteboard 5 The context board: start with minimal information, the object’s ID and a summary, then inline progressively by locality in space and time. A clip from the video at 33:15, sped up 4 times; follow the link to watch it at normal speed, with sound.

8Acting ahead

Go back to Priya’s message at 10:02. Nobody asked the agent to do anything. A reactive agent would wait to be tagged. DeepSeek borrows one more idea from processors, speculative execution: based on signals in the environment, start work in the background before knowing whether the result will be used. Deliver what turns out to be useful, discard the rest. It spends extra background compute so that people wait less and step in less often.

Their internal user group runs a policy they call “silently reproduce and fix”. When someone reports an issue or discusses a change, the agent first tries in the background to reproduce the issue and find a fix. It speaks only after it has confirmed the issue and found a simple fix; otherwise it stays quiet the whole time. On our morning, that is Worker 2: started by the Router from event 2, it reproduces the Android login failure, traces it to the token refresh change, and only then says something in chat. The same idea works for personal agents. When a meeting invitation arrives, the agent can check the calendar, gather background and draft a reply, so the person only reads and sends.

Example 11 shows both outcomes of acting ahead on the same morning. Priya’s report is confirmed and fixed before anyone asks, and Riya’s vague complaint is checked and dropped without a word in the chat.

What the team sees

AT
App team6 members
Priya
login fails on Android since yesterday’s release. iOS is fine10:02
39 minutes of silence in the chat
Agent
Reproduced Priya’s Android login failure: after a token expires, the refresh still sends the old one. Fix and a test are pushed to #412. @Ankit can you review?10:41
Riya
settings page feels slow today11:15
nothing posted: it could not confirm the problem

Behind the scenes

W2, started from Priya’s message, policy: silent10:03 checkout main, build debug app10:09 install on Priya’s laptop emulator10:16 reproduced: login returns 401 after expiry10:24 cause: TokenRefresher.kt line 8810:33 fix + test pass10:41 confirmed and simple: report to Router
W4, started from Riya’s message, policy: silent11:16 load settings on 3 devices11:22 1.2 s today, 1.1 s last week11:23 not confirmed: discard, post nothing

The same idea for a personal agent

Re: Quarterly planning, Thu 10:00
draft, written before you opened the invite

Hi Sam, Thursday 10:00 clashes with a design review I have from 9:30 to 10:30. Could we start at 11:00? The notes from last quarter are attached.

Drafted by your agent: you only read it and press Send
Example 11 Acting ahead, both ways. Worker 2 confirms and fixes Priya’s bug before anyone asks; Worker 4 cannot confirm Riya’s complaint and posts nothing. A personal agent drafts the reply to an invitation before you open it.

9Never blocking, and speaking each channel’s language

Two more problems remain in day-to-day use: how the conversation works while long jobs run, and where and how replies are written.

In a classic ReAct loop, when the model calls a tool with a synchronous run(), the loop waits until the tool returns. Until then the session cannot respond to anything new. Suppose Worker 1 starts a test suite that takes twelve minutes, and at minute 3 Ankit asks it a question. In a turn-based, half-duplex loop, Ankit waits more than nine minutes for an answer to a question that needed a few seconds.

DeepSeek replaces the time-consuming calls with asynchronous start() and stop(). Calling start() returns “Started” at once and the loop carries on. When the tool finishes in the background, its result arrives in the session as a new event message, and the model can call stop() if a command runs too long. The conversation becomes full duplex: new input is handled as soon as the current inference step ends, not when the background tools finish (Figure 10).

Two timelines over 14 minutes (an invented example). Worker 1 runs a test suite that takes 12 minutes, and at minute 3 Ankit asks a question. Half duplex: run() blocks the loop, so the question waits 9 minutes until the tests finish. Full duplex: start() returns "Started" at once, the question is answered at minute 3, and when the tests finish their result arrives as a new event. Animated: a playhead sweeps both timelines.
Figure 10 Half duplex against full duplex, for a twelve-minute test run and a question that arrives at minute 3. With run(), the question waits until the tests finish; with start(), it is answered at once and the test result arrives later as an event.

On the pull request page the difference is easy to feel. With half duplex, Ankit’s quick question sits unanswered for nine minutes. With full duplex, it is answered at once, and the test result arrives later as its own event (Example 12).

Half duplex: run() blocks

Fix token refresh #412
ankit 10:20
@Agent run the full Android suite on this
ankit 10:23
while that runs: does this change touch iOS?
10:20 to 10:32: the agent’s loop waits on run()
Agent 10:32
Suite finished: 214 passed, 0 failed.
Agent 10:32
No, iOS is untouched.

Full duplex: start() returns at once

Fix token refresh #412
ankit 10:20
@Agent run the full Android suite on this
Agent 10:20
Started the full Android suite, about 12 minutes. I’ll post the result here.
ankit 10:23
while that runs: does this change touch iOS?
Agent 10:23
No. Only android/auth/TokenRefresher.kt and its test changed.
Agent 10:32
Suite finished: 214 passed, 0 failed.

The full-duplex loop, step by step

Worker 1’s loopmodel → start("gradlew connectedAndroidTest")
        ← "Started" [J3]          # returns at once
model → reply "Started the full Android suite..."
event   [T14] ankit: "does this change touch iOS?"
model → reply "No. Only android/auth/..."
        ... 9 minutes, nothing to do ...
event   [J3] finished, exit 0, 214 passed
        full output → read(J3.log)
model → reply "Suite finished: 214 passed, 0 failed."
# and if [J3] ran past an hour: model → stop(J3)
Example 12 The same twelve minutes on pull request #412, half duplex and full duplex, and the Worker’s loop behind the full-duplex version.
Whiteboard 6 The full-duplex board: the classic loop that waits on a synchronous tool, against an asynchronous loop that keeps taking messages while the tool runs. A clip from the video at 44:30, sped up 4 times; follow the link to watch it at normal speed, with sound.

The second problem is the channel. People write differently in a group chat, in email and on GitHub, and a reply that suits one is wrong for another. The two-level design already solves part of it, because a Worker’s long reasoning and tool logs never reach a channel. The rest is set with prompts per channel. In chat, keep it light: like a good colleague, interrupt only when a decision or sign-off is needed, ask direct questions and give short conclusions. DeepSeek has verified one simple hard rule: at most 100 words per reply. On GitHub, in email and in documents, be complete and structured: the background, the change, and how it was verified, in the project’s conventions (Figure 11).

The same finding about the Android login bug (an invented example) written twice. In team chat: a short conclusion and one direct question, under DeepSeek's verified cap of 100 words per reply. On the pull request: the full problem background, the change and how it was verified, following the project's conventions.
Figure 11 The same finding about the login bug, written twice: a short conclusion with one direct question in chat, and a structured description on the pull request.

One result usually has to go to several places, each in its own form (Example 13). The chat gets a conclusion and one question. GitHub gets the full record. The support lead gets the impact on customers. And a public reply on X waits for a person to approve it, because that is what the team’s policy says.

Team chat: short, one question

AT
App team6 members
Agent
Found it: the Android login failure comes from the token refresh change in #412. Fix pushed there, tests pass. @Ankit can you approve?10:41

X: a public reply, held for approval

O
Our App @ourapp_example · draft
@customer_example Sorry about this. A fix for the Android login problem is in today’s update, v2.8.1. Please update the app and sign in again.
waiting for a person’s approval, per policy 3

GitHub: complete, by the project’s convention

Fix token refresh #412
Agent updated the description

Problem

Login fails on Android after v2.8: when a token has expired, refresh() still sends the old one and the server returns 401.

Change

Refresh before expiry, and keep the old token only until the new one arrives. Guard refreshIfNeeded() against running twice.

Verification

Reproduced on an Android 14 emulator. New test refresh_afterExpiry passes; full suite 214 of 214.

Email to the support lead: impact first

Android login issue in v2.8: fixed in v2.8.1
from Agent, to Farah (Support)

Android users whose session expired were sent back to the login screen and could not sign in. iOS was not affected. The fix ships in v2.8.1 today. If customers write in, ask them to update and sign in again.

Example 13 One finding, four channels: a chat reply, a pull request description, an email to the support lead, and a reply on X held for a person’s approval.
In DeepSeek’s noteStatus of the asynchronous loop

The note says DeepSeek Harness already implements this asynchronous task mechanism, but that it is not yet enabled by default.

10Compute, state and environments

Persistence is next. A local agent ties three things to one machine: the compute that runs the agent loop, the session state that has to survive, and the execution environment, meaning the repository, the toolchain and the credentials. When the laptop sleeps, all three stop, and the agent cannot reach anything on other machines. DeepSeek takes them apart in two steps, borrowing compute and storage separation from systems design (Figure 12).

Step one separates compute from state. The agent loop does not need to keep anything, so it runs in stateless, elastic cloud containers that can scale, restart or be replaced, and the sessions live in a database. A laptop going to sleep no longer stops the agent.

Step two is harder. Once the loop is in the cloud, how does it reach the code it needs to work on? One option is to start a cloud sandbox, pull the code and rebuild the environment. But real environments contain uncommitted changes, private credentials, services that are only reachable inside the company network, and particular hardware, so copying them is expensive and easy to get wrong. Another option is to ask people to move their work to the cloud, which is too costly for many of them. DeepSeek’s answer is to leave each environment where it is. Every machine runs a lightweight daemon that keeps no session state and does only one thing: execute commands and return results. The agent reads context from the environment on demand.

Left, a local agent: the agent loop, the session state and the repository with its credentials all sit on one laptop, so when the laptop sleeps everything stops. Middle, step 1: the loop runs in stateless cloud containers that can restart or scale, and sessions live in a database. Right, step 2: execution environments stay where they are, the laptop with its uncommitted changes, a build box, an on-demand sandbox, each with a small daemon that only runs commands and returns results. A laptop that is offline makes its tasks wait until it reconnects.
Figure 12 A local agent keeps the loop, the state and the environment on one laptop. Step 1 moves the loop to stateless cloud containers and the sessions to a database. Step 2 leaves each environment in place behind a small daemon; a laptop that is offline makes only its own tasks wait.

They call this BYOM, bring your own machine. It also handles machines that are only sometimes online: when Priya’s laptop, with its Android emulator, reconnects, the cloud agent starts and finishes the tasks that need to run there.

On Priya’s laptop: a small daemon

priya-mbp, an illustrative daemon log$ agentd status
connected to the agent loop (cloud), keeps no session state

10:09 run  ./gradlew :app:installDebug           [W2]
10:10 run  adb shell am start -n app/.LoginActivity [W2]
10:16 run  ./gradlew connectedAndroidTest \
           --tests '*TokenRefresh*'               [W2]
10:19 exit 1, 3 tests, 1 failed, 41 KB returned
18:47 laptop asleep, disconnected
09:03 reconnected
09:04 run  ./gradlew connectedAndroidTest         [W2]
09:15 exit 0, 214 passed, 38 KB returned

Meanwhile, in the cloud

agent loop and session database18:52 W2 task “verify on a real device” needs priya-mbp: offline, waiting18:52 W1, W3 keep running on the build box02:10 a container restarts; sessions reload from the database, nothing lost09:03 priya-mbp back: W2 resumes its task
Example 14 What the separation looks like in practice. The daemon on Priya’s laptop runs commands and returns output. When the laptop sleeps, only the task that needs it waits; when a cloud container restarts, the sessions reload from the database.
Whiteboard 7 The separation board: run compute in stateless, elastic cloud containers, keep the session state in a database, and leave execution environments where they are. A clip from the video at 50:20, sped up 4 times; follow the link to watch it at normal speed, with sound.
In DeepSeek’s noteThe comparison with Anthropic’s design

The note points to Anthropic’s “Decoupling the brain from the hands”, which takes the same approach: a stateless harness, session logs stored outside it, and execution environments connected on demand through one interface. DeepSeek describes the difference as the target. Anthropic’s article is about a managed service, mostly sandboxes created on demand and resources inside customer networks. DeepSeek first needs to connect the personal machines people use every day, which hold uncommitted changes and local credentials and may be online only now and then. Their design also supports cloud machines and environments created on demand.

11The Watchdog

Staying online for weeks takes more than the separation above. A system that runs continuously needs a control loop outside itself. For an agent, the usual process checks are not enough, because many failures are not crashes. The process is running, but the model is stuck in an unproductive loop or has drifted from its goal. So the system has to watch the progress of tasks as well as whether the infrastructure is alive.

DeepSeek’s control loop is a separate Watchdog session, outside the main system and woken by scheduled messages. It handles infrastructure failures such as API errors and failed state recovery, and it uses the model to judge whether each Worker is making real progress or drifting. It fixes what it can and keeps rechecking transient outside failures until they clear (Figure 13). In our example, it notices that Worker 2 has re-run the same flaky test six times and steps in.

The main system (Router, Workers, session database) on the left. Outside it, a Watchdog session wakes on scheduled messages and asks two questions: is the system alive (API errors, failed state recovery), and is each Worker making real progress or drifting from its goal. In the invented example it finds Worker 2 re-running the same flaky test and steps in. Because the Watchdog is itself an agent with tools, a maintainer can ask it why something failed and have it adjust prompts or trigger rules.
Figure 13 The Watchdog sits outside the main system and asks two questions: is it alive, and is each Worker making progress? Because it is itself an agent with tools, a maintainer can ask it why something stalled and have it adjust prompts or trigger rules.

The maintainers’ chat

AM
Agent maintainersAnkit, Meera, Watchdog
Watchdog
Worker 2 has run refresh_afterExpiry 6 times in 14 minutes with the same failure and no code change. It looks stuck, so I asked it to stop retrying and read the device log first.10:30
why did it keep retrying?10:34
Watchdog
Its prompt says to rerun flaky tests up to 10 times. This failure is the same every time, so it is not flaky. I suggest at most 2 reruns when the stack traces are identical. Should I change the prompt?10:34
yes, do it10:35
Watchdog
Done. The Worker prompt now allows 2 reruns for identical failures.10:35

What the Watchdog checked at 10:30

Watchdog, woken by its scheduled messageinfrastructure
  model API          ok
  session database   ok
  state recovery     ok (last restart 02:10)
progress
  W1 review #412     moving, 2 commits since 10:05
  W2 login bug       stuck, 6 identical test runs
  W3 release notes   done
Example 15 The Watchdog in the maintainers’ chat: it notices a Worker repeating itself, explains why when asked, and changes a prompt with approval.

Because the Watchdog is itself an agent session with a full set of tools, maintainers can ask it in plain language why something failed, and can have it correct the running system, for example by adding or removing prompts or adjusting trigger rules.

12What the experiments show

DeepSeek ran two early experiments on the scheduling and routing design. The first ran four designs side by side on the same stream of group-chat and GitHub CI messages: about 300 messages per run, of which about 20 were work requests and the rest casual chat, follow-ups, cancellations and CI messages. Coding work was replaced by a tool that simply takes time, so the test measures scheduling and coordination, not how well tasks are done. Each design ran five times (Figure 14).

Numbers as reported in DeepSeek's note, from synthetic runs of about 300 messages with about 20 work requests, five runs per design. Left: task completion time. Super-agent: 12.4 minutes at p50 and 15.7 at p95. Single session with a subagent tool and a neutral prompt: 29.5 minutes at p95 (its p50 is not given in the text). Right: cache-read tokens per run, 23.2 million for Super-agent against 31.8 million without pass-through, about 37% more; without pass-through the Router also made about 30% more decisions.
Figure 14 DeepSeek’s reported numbers. Left: minutes from a work request to its result. Right: cache-read tokens per run with and without pass-through. Only the values given in the note’s text are drawn.

The Super-agent finished tasks in 12.4 minutes at the median and 15.7 at the 95th percentile. The comparison, a single session with a subagent tool, depended heavily on its prompt. With a neutral prompt (“use a subagent for a piece of work when appropriate”), the model never delegated in any of the five runs; all the work ran in the main session, new messages kept interrupting it, and the 95th percentile reached 29.5 minutes. With a prompt that pushed delegation first, it delegated in four of five runs and finished somewhat faster, though still slower overall than the Super-agent; in the fifth run it judged the work “small”, did it itself, and produced a long tail. A single session has to rely on prompting and the model’s judgment in the moment; the two-level design settles the question in the architecture, because the Router never does work itself.

The Super-agent is not free. Running several independent sessions, it read more cached tokens per run than the single-session designs: it trades tokens for shorter, steadier completion times. Pass-through earned its place in a different way. Without it, tasks finished in about the same time, but the Router made about 30% more decisions and cache-read tokens rose from 23.2 million to 31.8 million per run, about 37% more.

In DeepSeek’s noteHow much weight these numbers carry

The authors say plainly that the experiments use synthetic workloads and simplified environments, that parts of the setup could be more rigorous, and that the results are indicative only. The second experiment, the Router stress test, is the one in section 4.

13What this is, and what is still open

It is worth being clear about what DeepSeek published. It is a design note, not a product launch. The note says it discusses architectural ideas, not existing features, and that parts of the design are implemented in a prototype plugin, dsh-superagent-prototype, which is only for validating the approach and is not an official DeepSeek product. The experiments are small and synthetic. The authors also say the system can stay simple partly because they have simplified the engineering and the scenarios they support for now. They name four open problems, and each one is a real limit on using this today.

Scaling the two levels. One Router session, pass-through and no direct talk between Workers cover most of their daily work. For larger, tightly coupled tasks, it is not settled when to shard the Router, how finely, or when Workers should talk to each other. Training a model specifically for the Router’s work, judging events, dispatching in batches and recalling context, is one direction they suggest. Long-term memory is the other limit: Chain of Recall handles recent tasks, but over months, memory becomes the main bottleneck.

Working without sessions. If sessions are hidden, what should people see? DeepSeek suspects the chat window became the centre of interaction partly by path dependence, and that more interaction may move into domain tools, as their instance works inside GitHub issues and pull requests. They also want ways for people to step in partway through a background task without losing its efficiency.

Context boundaries and agent-to-agent work. Deciding which parts of an organisation share one Super-agent is deciding which context is shared and which is isolated. Where instances meet, for example a person’s own agent and the team’s, they need a secure way to work together across permission boundaries.

Security and privacy. This is the one I would read twice. An agent driven by events from many places takes in a lot of untrusted input. The cloud loop and the machines it reaches implicitly trust each other, yet the machines hold private code, sensitive data and credentials. If a server intrusion or a prompt injection compromised the agent loop, every connected machine could be taken over. Credentials can leak even without an attack, whenever they enter the model’s context, so the agent needs a way to use credentials without ever seeing them. Until these are solved, DeepSeek says, a Super-agent can only work within a small, trusted scope.

14Summary

15Quiz

8 questions on the design. Choose an answer to see whether it is right and why, or show the answer without choosing.

  1. DeepSeek says a single task is limited by model capability. What do they say limits doing many tasks at once?

  2. Why does the Router run on a lighter model and without a Bash tool?

  3. In DeepSeek's stress test, the time per request rose from 2.5 to 3.9 seconds as Triggers went from about 1 to about 40 a minute. Why did the time per decision fall from 6.4 to 1.6 seconds?

  4. On our morning, which event does code drop without calling any model?

  5. Event 5, a CI failure on pull request #412, arrives after Worker 1 has subscribed to that pull request's Thread. What happens?

  6. What does Spill do with the long review comment when it is injected into Worker 1's context?

  7. A Worker starts a twelve-minute test suite, and a question arrives at minute 3. What does full duplex change?

  8. Which statement about DeepSeek's note is accurate?

16Who wrote this

Vizuara logo

This page was written by Dr. Raj Dandekar and the team at Vizuara AI Labs, from a whiteboard session recorded on 2 November 2026. At Vizuara we teach AI from first principles, one worked example at a time, the way this page tries to.

As in the video, we teach with love, care and passion. If you liked the way this page explains things, our live cohort Agentic Systems Engineering goes much further: you build a production AI agent from scratch, from the LLM to retrieval, tools over MCP, the agent harness, workflows and evals, on a real business system.

The current cohort began in the last week of October 2026, and registrations are still open.