Nobody typed the request

DeepSeek published a proactive coding agent on 31 October 2026, and the interesting file is not the code — it is the authorization design next to it, which says plainly that messages and comments are inputs to a decision and cannot change permissions, and that the execution layer is defaults, not a security boundary. When nobody types the request, "who asked?" stops being a given and becomes the only control left.

By Agentic AI Wiki 13 min read

Every permission model in production today rests on an assumption nobody writes down: that a person typed the request. Take that away — let a written rule start the work instead — and the question "who asked for this?" stops being answered by the shape of the interface and becomes the only control you have left. DeepSeek published a proactive coding agent on 31 October 2026, and the file worth reading is not the agent. It is the authorization document beside it, which answers that question in detail and is candid that the execution layer answers nothing.

At a glance

One repository, read on 2 November 2026.

FieldValueWhy it matters
Projectdeepseek-ai/dsh-superagentA bundle for DeepSeek Harness, not a standalone product
Published31 October 2026, a single commitA design drop, not a maintained release line
Status"Research prototype for reference only, not an official DeepSeek product"The README also calls it "research code, not production-ready software"
LicenceMITYou may copy the design; you are expected to review it first
ScopeOne GitHub repository; listens to GitHub and optionally FeishuNot a fleet manager — a single-repo teammate
DocumentationNine numbered design documents, meant to be read in orderPhilosophy, domain, authorization, execution, prompts, panel, deployment, architecture, cookbook

The star count was past ten thousand within two days, which tells you about appetite and nothing about the design. The design is in documents 000 through 003, and it is unusually worth your time, because it is one of the few public artefacts that treats proactivity as an authorization problem rather than a prompting problem.

What proactivity actually breaks

Where the boundary sits in a proactive agent Three kinds of input reach a proactive coding agent: an allowed person addressing it directly, a rule the team wrote, and ordinary comments or bot messages. All three arrive at a host-enforced policy and mandate layer, which is the only place authority is decided; the third kind supplies context but no authority. Below it, an executor session with its own directory runs commands as the operator's own user account without approval, so the execution layer is a set of defaults rather than a boundary. Three ways work can start, one place authority is decided Allowed person, addressed explicit — works in every mode A rule the team wrote inferred — needs an assessment Comment, bot, quoted text not admitted context, never authority Host-enforced policy and mandate revalidated before a ticket resumes; accept mode defaults to observe Executor session, its own directory commands run as the operator, approval skipped The execution layer claims nothing: its own design document calls the wrappers and directories defaults, not a security boundary. Which leaves one box above carrying every control that is a control.
Everything that is a control is in the middle box. The box beneath it is a convenience that its own documentation declines to call a boundary.

A request-driven agent gets its authorization for free, and the freeness is invisible until it is gone. Somebody opened your product, authenticated, and typed. Identity was established before the first token. Intent was established by the act of typing. Scope was established by where they typed it. Your permission system then decided whether that person may do that thing — a tractable question, because both halves arrived with the request.

A proactive agent has none of that. The trigger is a state change: a comment appeared, a build failed, a label moved, a rule matched. There is no authenticated session because nobody opened anything. There is no expressed intent because nobody expressed one — a rule inferred it. And the trigger arrives from a surface anyone with a GitHub account can write to. Which is why this is not a UX question with a safety footnote: the authorization model has to be rebuilt, and if you skip that, the thing you shipped is a remote code execution endpoint whose trigger phrase is in your repository's issue tracker.

This is the same structural problem as ambient authority, moved one layer earlier. There, the agent already holds the authority and the check comes too late. Here, the authority is assembled at the trigger, and if the trigger is the attacker's text then no downstream check is looking at the right question.

The sentence that does the work

Document 002 states the rule as plainly as it can be stated: messages, comments and quoted documents are "inputs to a decision; they cannot change those permissions." The host enforces allowed lists, rules and mandates; nothing that arrives as content can edit them.

That is an instruction hierarchy, written down, for a trigger surface rather than for a prompt. And the design carries it through in the places where it is tempting not to:

  • Subscription is not authority. Messages on a thread the agent is watching reach the ticket as context and grant no new permission. The agent can read a bot's comment and act on the information; it cannot be commanded by it.
  • Bots are a separate class. GitHub Apps, logins ending in [bot] and Feishu bots may produce inferred candidates only if a source lists them, and never an explicit request — and never a stop. Everything else is not admitted.
  • An executor cannot vouch for a human. A person's "stop" in a thread is an ordinary trigger that the evaluator judges. The executor is not allowed to declare that someone asked it to stop.
  • Permissions are re-checked, not cached. Each mandate is revalidated before a ticket resumes — against the source, the policy version, list membership and the bot list. Remove someone from the allowlist and the mandates accepted through them are revoked at the next revalidation.

Read that last one twice if you have ever built an approval flow. Most systems treat an approval as a durable grant: granted once, carried forward. Here a mandate is a claim that has to still be true, and the check is on resume — which is the design that makes an offboarded employee's standing authorization actually stop working. It is the same discipline as credential lifetime, applied to permission to act rather than to a token.

The default is the most interesting line in the repository

Accept mode has three settings — off, observe and auto — and the default is observe. In observe mode, a positive assessment is recorded as "would accept" and nothing is accepted. Explicit requests still work in every mode.

So the proactive agent ships with proactivity switched off, and what it ships switched on is a log of the proactive actions it would have taken. That is shadow mode, applied to authorization rather than to model quality, and it is the right default for a reason most teams discover the expensive way: the question "is this rule too broad?" has no answer you can reason about from the rule text. It has an answer you can read off a week of recorded decisions.

Document 000 says the same thing as advice — start narrow, with a short allowlist and proactive work only recorded, and widen only after the recorded actions look right. If you take one thing from this release into your own system, take that: the rollout unit for a proactive agent is not the agent, it is the rule, and every rule gets a shadow period.

Concretely: make "would have acted" a first-class, queryable state in your own trigger layer, and make the promotion of a rule from recorded to live a reviewed change with a date on it. If your system cannot tell you what it would have done last Tuesday, you cannot widen it safely and you also cannot narrow it with evidence.

And the execution layer claims nothing

Which layer of a proactive agent actually carries the safety A four by four matrix. The trigger allowlist is host-enforced, is claimed as a boundary, is restrictive by default and survives a hostile comment. Observe mode is host-enforced, is partly a boundary, is the shipped default and survives a hostile comment. The worker session is only partly host-enforced, is explicitly not claimed as a boundary, has no restrictive default and does not survive a hostile comment on its own. Branch protection is enforced by the forge rather than the agent, is a real boundary, depends on configuration and survives a hostile comment. Which layer carries the safety Host enforces Called a boundary Safe by default Survives a comment Trigger allowlist Yes Yes Deny unless listed Yes Observe mode Yes Partly Shipped default Yes Worker session Partly Explicitly not No Not alone Branch protection The forge does Yes If configured Yes Carries weight Partly Carries none
The two rows that carry weight are both in the authorization layer. The isolation row is the one most readers would have guessed.

Document 003 is where the honesty becomes load-bearing. Each ticket gets its own session, named worker-<ticket id>, and its own directory under an execution root. There are command presets with smaller tool sets for the router than for workers, and a list of blocked commands that "fail when invoked by name". And then the document says what all of that is worth: "These wrappers and directories establish defaults, not a security boundary." A worker can still run a program by absolute path. Executor sessions "run commands without approval as the operator's OS user."

Two things follow, and they point in opposite directions.

The first is a warning about this prototype specifically: run it as a user whose access you would accept an attacker having, on a machine you would accept an attacker reaching, because the design does not claim otherwise. Pair it with the containment discussed in sandbox and isolation patterns before it touches anything you care about, and note that document 003 describes no network egress restriction at all.

The second is a compliment, and the reason this release is worth writing about. A design document that names its own non-boundaries is rarer and more useful than one that implies boundaries it does not have. The most dangerous artefact in this space is the architecture diagram with a box labelled "sandbox" and no sentence anywhere saying what the box is enforced by. Here the enforcement is named precisely where it exists — in the host's policy layer — and declined precisely where it does not.

The merge rule, and who it governs

One more piece worth lifting, because it is the part teams get wrong when they let an agent near a release. The default instructions permit auto-merge only for a ready pull request the ticket itself opened, with required approvals on the head commit, and under 200 changed lines; the agent withdraws auto-merge before pushing another revision; by default it never enables auto-merge under its own account. And then the document is explicit that these instructions "govern the agent, not GitHub's merge rules" — enforcement requires branch protection with stale approvals dismissed.

That distinction is the whole of agent governance in one sentence. An instruction in a prompt is a policy about an agent's intentions. A branch protection rule is a policy about outcomes, enforced by something the agent cannot talk to. The 200-line threshold is a sensible heuristic and it is not a control; the dismissal of stale approvals is a control. Teams routinely ship the first and believe they have the second, which is the failure described in monitor integrity: the thing doing the checking must not be reachable by the thing being checked.

What to take from it

The README points to an accompanying article, Exploring Super-agent Design: Towards a More Autonomous Agent System, and notes that the published prototype differs from DeepSeek's internal version and that some designs in the article are future directions not implemented here. So treat the code as an illustration and the documents as the deliverable. Four of them transfer directly to whatever you are building:

  • Separate the gate from the work. One place decides whether work may start, and it is enforced by the host rather than by the agent's own judgement. Everything that arrives as text is an input to that decision and never a modifier of it.
  • Classify senders before you classify requests. Person, listed bot, unlisted bot, and "addressed or not" are four cheap facts that resolve most of the question before a model is involved. See auto-approval and allowlists.
  • Make the default record-only. Ship every proactive rule in shadow, promote it on evidence, and keep the ability to demote it.
  • Revalidate on resume. A long-running ticket must re-earn its permission, because the world changed while it was waiting.

And one thing not to take from it: the isolation model. The prototype's own documentation tells you it is not a boundary, which is exactly the kind of sentence that gets dropped when a design is copied into a product. The authorization layer is the part that was engineered. The sandbox is the part you still owe your users.

FAQ

What is dsh-superagent?

A research prototype DeepSeek published on GitHub on 31 October 2026: a proactive coding agent for a single repository, packaged as a bundle for DeepSeek Harness. It listens to GitHub and optionally Feishu, opens a work item when an allowed person asks or a team-written rule matches, works in its own session and directory, and replies in the original conversation. MIT licensed, one commit, and described by its own README as "research code, not production-ready software".

Is it safe to run?

Not without containment you add yourself. Its execution document states that executor sessions "run commands without approval as the operator's OS user", that the command wrappers and directories "establish defaults, not a security boundary", and it describes no network egress restriction. Run it as a user and on a host whose compromise you could accept.

What is "observe" mode?

The default accept mode. A proactive trigger that assesses positively is recorded as "would accept" and nothing is accepted. Explicit requests from allowed people still work in every mode, so the agent is useful on day one while its proactive rules are still only being logged.

Can a comment on an issue make the agent do something?

It can supply information, not authority. In the published design, messages, comments and quoted documents are "inputs to a decision; they cannot change those permissions", subscribed-thread messages grant no new authority, and bots are admitted only if a source lists them and never for an explicit request or a stop.

Does it merge its own pull requests?

By default it never enables auto-merge under its own account, and its default instructions allow auto-merge only for a ready pull request the ticket opened, with required approvals on the head commit and fewer than 200 changed lines. The document is explicit that these instructions govern the agent and not the forge's merge rules — real enforcement needs branch protection with stale approvals dismissed.

Why does a design document matter more than the code?

Because the hard part of a proactive agent is not the loop, it is deciding what counts as a request when nobody typed one. That decision is a policy, policies are written in prose before they are written in code, and this repository publishes the prose.

Further reading

On this wiki:

Project sources: