The built-in roles
Neither can write, and that is structural rather than an instruction they are asked to follow.
Their tool set does not contain a write tool.
/explore <task> dispatches the explore agent immediately. /plan does not dispatch the plan
agent. That name is claimed by plan mode, so the plan agent is reached only
when the parent calls dispatch_subagents.
code, test and oracle are not seats. Those names stay reserved, so a file in .seri/agents/
cannot take them. Write a file under a new name if you want a similar job.
Running one
Two things work. You run it./explore where does the permission gate live dispatches immediately, with no
round trip through the main model to decide whether to. A file-defined agent works the same way.
/plan is plan mode, not this path.
The model runs it. Each agent’s description is what the model reads when it decides whether
to delegate, so “have someone check this before I push” can reach the right agent on its own.
Limits that are structural
- A subagent can never dispatch further subagents. The dispatch tool is not in any child’s tool set, so recursion is unrepresentable rather than forbidden.
- Three tasks per dispatch. Tasks past the third in one call come back as not-run rows, so the model can re-dispatch the rest deliberately.
- Twenty-five turns per child. A child does not inherit the session’s much larger
--max-turnsbudget, which would multiply tokens across three concurrent children. - A child runs at the parent’s permission mode. Its
bashre-enters the same gate you are sitting behind.
Writing your own
Drop a Markdown file in.seri/agents/ for this project, or in your profile root for every
project. seri picks it up at the next start. No source change, no registration step.
/reviewer grade the diff on this branch then runs it, and the model can reach it too.
The frontmatter rules
- Tool grant precedence. An explicit
toolslist wins. Otherwisereadonly: truegives the read-only set. Otherwise the agent gets every tool seri has. - Names. Lowercase letters, digits and
-. A file that takes the name of a slash command or of any routable role is skipped with a warning at startup rather than failing the session. That covers the two built-ins, the reserved namescode,testandoracle, andarchivist, which is a role you cannot dispatch but cannot shadow either. - Models.
inheritor a concrete catalog id. An id the catalog does not carry warns and inherits the session model rather than failing. - Unknown keys are ignored, so frontmatter written for another harness does not break here.
.cursor/agents/ or .claude/agents/ itself. An agent written
for another harness’s toolset auto-loading here is a surprise, not a convenience.
Where files live covers project scope against profile scope.
