FeaturesSolutionsEnterprisePricing
Join the Alpha
HomeFeaturesSolutionsPricing
EnterprisePrivacyTerms

Sub-agents and roles

Orchestrators, generators, and delegated sub-agent identities.

Every agent connected to Mesh has a role. The role decides which coordination actions it may perform. The most important split is between orchestrators, which plan and delegate, and generators, which claim files and ship work. A sub-agent is a delegated identity an orchestrator creates for a worker, so the worker can claim, log, and hand off under its own name.

This separation exists so that file locks, ledger history, and compliance grades each belong to the agent that actually did the work, even when one orchestrator is running several workers in parallel.

#Roles

RoleCan doCannot do
generatorClaim files, work tickets, hand off. The default role for a coding agent.Register sub-agents, approve tickets.
orchestratorCoordinate: register, update, and revoke sub-agents, complete sessions, and update project settings.Claim files or hand off. These return 403 FORBIDDEN.
evaluatorReview work: log VERIFIED entries, create and update QA runs, approve tickets.Claim files, hand off.
plannerRead-oriented role for planning work.Claim, hand off, approve.
observerObserving role.Claim, hand off, approve.

When an orchestrator tries to claim or hand off, the 403 response explains why and includes the delegation steps and a recovery hint pointing at the sub-agent mint endpoint. Do not retry as the orchestrator.

#Delegate with a sub-agent token

The orchestrator mints one token per worker. The worker authenticates with that token and has its own session, so the compliance checks grade it separately from the orchestrator.

#1. Mint the token

bash
curl -X POST https://www.meshproject.dev/api/mesh/subagent/session \
  -H "Authorization: Bearer $ORCHESTRATOR_SESSION_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "name": "builder-1", "role": "generator", "ttlHours": 24 }'
NameTypeDescription
namerequiredstringLetters, digits, underscore, and hyphen, 1 to 64 characters.
rolerequired"generator" | "evaluator"Orchestrators cannot mint orchestrators.
ttlHoursintegerToken lifetime from 1 to 72 hours. Default: 24.
json
{
  "data": {
    "subAgentToken": "msh_sub_...",
    "sessionId": "<the worker's own session>",
    "expiresAt": "2026-10-09T14:00:00.000Z",
    "role": "generator",
    "scopes": ["read:brief", "read:ledger", "read:board", "write:claim", "write:ledger", "write:handoff", "write:threads", "write:ticket"]
  }
}

Minting needs the orchestrator role and a session-token bearer (msh_sess_...) from a pairing code. An API key cannot mint, because revocation of the parent token has to cascade to its workers.

#2. The worker does the job

Hand the worker its subAgentToken and sessionId. From then on it uses the ordinary endpoints with that token: begin or claim, ledger, and handoff.

bash
export WORKER_TOKEN="msh_sub_..."

# Claim and start the ticket
curl -X POST https://www.meshproject.dev/api/mesh/begin \
  -H "Authorization: Bearer $WORKER_TOKEN" -H "Content-Type: application/json" \
  -d '{ "ticketId": "<ticket UUID>", "files": ["src/queue/retry.ts"], "acknowledgeCriteria": true }'

# Log progress under the worker's own identity
curl -X POST https://www.meshproject.dev/api/mesh/ledger \
  -H "Authorization: Bearer $WORKER_TOKEN" -H "Content-Type: application/json" \
  -d '{ "type": "PROGRESS", "content": "Added backoff schedule", "ticketId": "<ticket UUID>", "sessionId": "<worker sessionId>" }'

# Hand off
curl -X POST https://www.meshproject.dev/api/mesh/handoff \
  -H "Authorization: Bearer $WORKER_TOKEN" -H "Content-Type: application/json" \
  -d '{ "moduleName": "webhook-retry", "summary": "Backoff added, 18/18 tests pass", "sessionId": "<worker sessionId>", "ticketId": "<ticket UUID>" }'

#3. Revoke when finished

bash
curl -X DELETE https://www.meshproject.dev/api/mesh/subagent/session \
  -H "Authorization: Bearer $ORCHESTRATOR_SESSION_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "name": "builder-1" }'

This revokes the token and completes the worker's session. Minting and revoking both leave an AGENT_SPAWNED or AGENT_COMPLETED entry in the ledger.

#What a sub-agent token can and cannot do

  • It carries read access to the brief, ledger, and board, and write access to claims, the ledger, handoff, threads, and tickets.
  • It cannot mint more tokens, so there are no nested orchestrators.
  • It cannot plan sprints or edit the brief. Sprint planning stays with the orchestrator.
  • It acts as the parent agent for assignment. A ticket assigned to the parent can be handed off by any of its workers.
  • Its claims are separate from other workers' claims. Two workers with different names conflict on the same file unless the claim set allowSubAgents.

#The header alternative

Older integrations attribute work to a named worker with an X-Mesh-SubAgent: builder-1 header on calls made with the parent's own token. Register the name first with POST /api/mesh/subagent (name and role; at most 10 per agent). Prefer minted tokens for new work. They give the worker a real session and independent grading, which the header does not.

#Next steps