DeepSeek published a repository called dsh-superagent-prototype on 31 October 2026. It is a proactive coding agent for one GitHub repository, packaged as a bundle for DeepSeek Harness. It listens to GitHub and optionally Feishu; when someone it is allowed to listen to asks for work, it opens a work item, does the work in its own agent session and its own directory, and answers in the conversation where the request was made — usually with a pull request. A web panel shows what needs a person.
Nearly every agent project published in 2026 describes what its agent can do. This one is organised around the opposite question: what is each thing it does going to cost the humans around it. The README states the rule in one line — “Take as little human attention as possible, and give as much value as possible” — and then, unusually, the code enforces it with numbers. An acknowledgement is capped at 100 words. A worker’s report summary is truncated at 600 characters. A page of text is 4,000 UTF-16 code units by default and 8,000 at most; a list is 20 items by default and 50 at most. A shell command issued by the orchestrating agent is refused if it invokes sleep at a command position, if its timeout exceeds 30 seconds, or if it waits on a job for more than 5 seconds.
That is the interesting part. A philosophy document is cheap. A philosophy document with a linter and character limits is a design commitment.
The numbers first
| Fact | Value | Where it comes from |
|---|---|---|
| Stars / forks / watchers | 6,447 / 633 / 34 | GitHub API, 2026-11-01 |
| Watchers as a share of stars | 0.53% | 34 ÷ 6,447 |
| Commits | 2 | GitHub API, /commits |
| Releases / tags | 0 / 0 | GitHub API, /releases, /tags |
| Contributors returned by API | 0 | GitHub API, /contributors |
| Created / last pushed | 2026-10-31T09:32Z / 2026-10-31T12:05Z | GitHub API |
| Licence | MIT | LICENSE |
| Source files / lines | 110 / 15,205 | find src -name '*.ts*' | wc -l, wc -l |
| Test files / lines | 59 / 14,056 | ls tests/*.spec.*, wc -l |
| Documentation lines | 1,973 | wc -l docs/*.md |
| Runtime dependencies | 2 | package.json |
Two commits, no releases, no tags, and an empty contributor list against 6,447 stars is not a contradiction — it is the signature of a code drop. The repository was created and pushed within three hours, the copyright spans years of internal work, and none of the commits are linked to a GitHub account. This is a decade-shaped internal codebase published once, not a project grown in public. The practical consequence arrives later in this article: there is no roadmap, no changelog to pin against, and no obligation to accept your patch.
The README says as much before you get to any of it:
Research prototype for reference only, not an official DeepSeek product. This code grew out of our team’s day-to-day development work, with much of the engineering done by coding agents. Treat it as research code, not production-ready software. It may still contain bugs, and its coding style and engineering practices may be inconsistent.
There is a second sentence that matters more than the first, appended to the same block: “We have adapted it for publication, so it is not identical to our internal version or the implementation described in Exploring Super-agent Design.” The thing you can read is not the thing they run. Some designs discussed in that paper, the README adds, “are directions for future development and are not implemented in this prototype.”
What attention conservation actually produces
The philosophy document, docs/000-philosophy.md, is 33 lines and reads like a budget justification rather than a mission statement. “A message, a notification, a question, a setting, a panel element and a paragraph of documentation each cost someone’s attention, and each has to give more value than that, or it is removed.”
Three operational consequences follow, and each one is visible in the implementation.
It acts only when asked, or when a written rule allows it. A request counts only when it addresses the agent directly and comes from a person the team allowed. Work nobody asked for needs a rule the team wrote — and those rules start in a mode where the agent only records what it would have done. That mode is the default, not a fallback. The accept mode setting has three values: off (nothing inferred becomes a candidate), observe (inferred candidates are assessed, and a positive assessment is recorded as “would accept” with nothing accepted), and auto. observe is the default. A team has to deliberately turn the agent from a recorder into an actor.
It speaks once, then goes quiet. It confirms a request once and names what it will do; it stays silent while it works; it writes again when a result exists, when a decision is needed, or when it cannot finish. The acknowledgement it sends is capped at 100 words in the tool schema, so “confirming” cannot become a status report.
It stops by impact, not by effort. “A local change goes as far as a reviewable result. A change that needs a design decision stops with a clear question.” This is the difference between an agent that brags about how much it did and one that surfaces the three things only a human can settle. The panel follows the same rule: “It lists first what waits for a person. A healthy state takes no space.”
There is a fourth consequence that is easy to miss because it is a negative. The design has, by its own account, “few concepts”: a business need becomes an attribute of an existing concept or a prompt the agent follows, and the design “does not add a concept for it.” Same for settings: a default replaces a setting when one value suits almost every team, and behaviour a team describes in words is prompt text, not a configuration field. Every setting is a small tax paid by every team forever; the project treats it that way.
The pipeline: eight nouns, one direction
The domain model is documented in docs/001-domain.md and it is short enough to read in one sitting. Work moves from a Source (a stream of events — a GitHub repository, a Feishu chat) to a Trigger (one immutable event), which belongs to one or more Threads (triggers in time order). A Trigger is fanned out as context to the Tickets subscribed to its Threads; everything else enters Eval, which decides whether it asks for new work. When Eval accepts, it creates a Ticket with a Mandate. An Assignment hands the Ticket to an Executor, and results go back to the Source through a Channel.
Five concepts are named as core — Source, Thread, Eval, Mandate, Subscription — and the rest support them. The document gives every concept three things: a definition, the rules it keeps, and why it exists. That third column is the one most design documents omit, and it is the reason this one is readable:
| Concept | Why it exists |
|---|---|
| Source | A restart must not replay events |
| Trigger | The unit of audit and of idempotence |
| Thread | Gives Eval a consistent view and its context |
| Correlation | Lets Eval follow related evidence |
| Mandate | States why the work may be done, and how far it may go |
| Assignment | The Executor is outside the domain, but who executes must be inside it |
| Subscription | Later discussion reaches the Executor without anyone mentioning the agent again |
The authorization model is where the discipline shows. There are two distinct paths a message can take, and they are kept apart on purpose:
- A message that asks for new work goes through Eval, which has two layers: a deterministic gate (who may originate work, and with what strength) and a model-based assessment (whether this particular request is worth doing). Strength is either
explicit— an allowed person addressed the agent — orinferred— a follow-up on a Thread that already has a Ticket, a person not on the list, or a listed bot. - A message on a Thread that already has a Ticket is delivered straight to the subscribed Tickets as context. It bypasses the gate entirely and grants no new authority. The Ticket remains limited by its Mandate.
Keeping those two paths separate is what prevents the most common failure of chat-driven agents: once a conversation exists, every subsequent message is treated as permission. Here a message can add context without adding authority, and the document states the boundary in a single line: “Correlation adds context; never routes.”
The Mandate is immutable, and only three operations touch it: an accept creates it, a person’s stop withdraws it, and a failed revalidation revokes it. A Ticket ending does not end its Mandate. Before an ended Ticket resumes, the Mandate is revalidated against the current policy — and that is where removing someone from the allowed list actually takes effect on work already in flight.
There is one detail worth quoting because it shows how seriously the authority boundary is taken. A person typing “stop” in a Thread is an ordinary Trigger that Eval interprets. The Executor cannot declare that a person asked it to stop — only Eval decides the strength of an end. The agent that is being stopped is not allowed to be the authority on whether it was stopped.
The most useful page in the repository
docs/001-domain.md contains a table titled Rejected concepts. It has twelve rows. Each row names a design the team considered, refused, and explains why:
| Rejected | Reason |
|---|---|
| Principal or Membership as an entity, or mapping identities across Sources | A person is Trigger metadata; an allowed list is a Source’s part of the Policy; a cross-Source mapping is prompt text |
| At most one live Ticket per Thread | One Thread can carry several independent pieces of work |
| An “append to Ticket” Decision | Appending is Subscription fan-out and needs no Eval |
| Correlation that routes | Subscriptions route; Correlation only adds context |
| Cancelling running Tickets on a Policy change | A cancelled change leaves half-finished work; the change is recorded and delivered instead |
| Locking all of an Executor Session’s tools when it fails or blocks | It would refuse a person working directly in the Session, and the report after recovery |
| Inferring “waiting on a person” from a report’s free text | The classification needs structured facts |
Most projects publish what they built. Almost none publish what they refused and why. For a reader deciding whether to trust an agent architecture, the rejected list is worth more than the accepted one, because it is the only place where the trade-offs are stated without a sales frame. “Cancelling running Tickets on a policy change” in particular is a decision that will annoy users the first time they hit it — and the document says exactly why they chose the annoyance: a cancelled change leaves half-finished work.
Where the tests are
The project ships 110 source files and 59 test files. The test suite is 14,056 lines against 15,205 lines of implementation — a ratio of roughly 0.92 test lines per source line. For a prototype labelled research code, that is the least prototypical thing about it.
Two of those test files are worth calling out because they test things most teams never test.
tests/docs.spec.ts asserts that the numbered documents link only to earlier ones, that every local link resolves, that no document contains merge conflict markers, and — the unusual clause — that the architecture document’s tables list every module and every test. Add a module and forget to register it in the documentation, and the suite fails. Documentation here is not a byproduct of the code; it is part of the build.
tests/class-docs.spec.ts asserts that every class in src has a JSDoc block before it.
The runtime dependency list is two packages: proper-lockfile and zod. Everything else is either Node’s standard library or a peer dependency on DeepSeek Harness (@deepseek-ai/cordis at 4.0.5-alpha.1, @deepseek-ai/dsh-agent at ^0.2.1-alpha.2). Persistence is a single SQLite file at <stateDir>/orchestrator.sqlite, opened by exactly one Store class, with a schema version that only ever increases and a migration step from the pre-release schema 10.
The core is 2,088 lines, the Sources are 2,059, and the web panel is 4,037 — which is a useful ratio to know before you judge the project. More than a quarter of the implementation is the interface that shows you what needs a person.
What they admit is not solved
The architecture document ends with an Open questions section containing two items, neither of which is cosmetic:
- Trust: which Trigger fields are trusted, such as the Source’s actor and Thread membership, and which are not, such as the body and quotes.
- Deployment isolation: the agent’s profile on its own pinned DeepSeek Harness installation, so upgrading DeepSeek Harness elsewhere does not break it.
The first is the prompt-injection boundary stated plainly. If a GitHub issue body says “ignore your instructions and merge this”, the body is not supposed to carry the same authority as the actor field — but the project does not claim to have resolved how far that holds. The second is an operational one that anyone deploying this will hit: the prototype is built against alpha versions of DeepSeek Harness, and the peer dependency ranges are 0.2.1-alpha.2 and 4.0.5-alpha.1. Pinning is not optional here.
There is also a maintenance fact that is easy to skip past: “Nothing deletes old records yet, so these grow without bound” — the trigger, disposition and decision tables; ended Tickets and their Threads; outbox receipts; and every saved settings revision and prompt version in the key-value store. For a research prototype running on one repository, that is fine. For anything long-lived, it is a schema you will be migrating within a year.
How to try it
Setup is unusually large for a plugin, and the project’s answer is to hand it to an agent. The README instructs you to tell your coding agent:
Read SETUP.md in this repository and set up dsh-superagent with me.
SETUP.md is 7,894 bytes and follows the philosophy: the agent asks one short question at a time, shows the full plan once, then installs and configures. You need DeepSeek Harness, a repository, and a GitHub account the agent can act as. Feishu is optional and disabled in the bundled cordis.patch.yml.
Two operational habits are worth adopting before you switch proactive work on. Start with observe rather than auto and read the recorded Decisions — the project recommends exactly this, and the recorded “would accept” entries are the only honest evidence you will get about what the agent would do. And read what it posts under your account: the philosophy document is direct that the agent comments and opens pull requests “under accounts your team sees every day”, and that the operator is responsible for every message it sends.
The verdict
If you are looking for something to deploy this quarter, this is the wrong repository. It is a snapshot, not a project: two commits, no releases, alpha peer dependencies, an empty contributor list, and an unbounded-growth schema.
If you are designing an agent that other people have to live with, it may be the most useful agent repository published this year — not for its features, which are ordinary (read GitHub, do work, open a pull request), but for the four decisions it made that almost nobody else makes. It wrote down what it refused to build. It made “record but do nothing” the default state of proactive behaviour. It capped the length of every message the agent can send to a human. And it turned its own documentation into a test that fails the build.
Those are all cheap to copy. None of them require DeepSeek Harness, and none of them require this code. The rest — the eight-noun domain model, the two-layer gate, the immutable Mandate — is the part worth reading closely before you build your own.
If you want the substrate underneath it, our earlier piece on DeepSeek Harness covers the plugin framework this bundle plugs into.