Skip to main content
Glama

spawn_agent

Launch managed AI agents or terminals, or resume captured agents on fresh surfaces while preserving their IDs, with deterministic placement and evidence-backed boot receipts.

Instructions

Spawn a managed agent or terminal, or resume a captured agent on a fresh surface while preserving its ID. Placement is deterministic; boot_prompt_timeout_ms also bounds pane placement. Boot prompts return evidence-backed receipts. Successful receipts are lean by default; verbose=true restores full transport and diagnostic detail. Failures always keep full detail.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
cliNoCLI tool to launch
cwdNoInitial working directory for type=terminal
repoNoRepository name (e.g. 'brainlayer', 'golems')
roleNoAgent job function: implementor, reviewer, or gatherer. Legacy orchestrator/worker aliases remain accepted for compatibility. Claude requires this field explicitly.
typeNoSpawn an AI agent or a plain terminalagent
focusNoLeave focus on the created agent tab instead of restoring the exact origin after initialization.
forceNoWith resume_agent_id only: override missing or inconclusive proof that the old session is not running (no recorded pid, an unproven pid, an unreadable topology or process table) after the caller deliberately verifies the old agent is gone. Does not bypass session or terminal-state requirements.
modelNoOPTIONAL — leave UNSET so the launcher pins the top-tier model. For cli:'codex', an explicit model is checked against Codex's runtime model list before any worktree or surface is created, then passed through to the launcher. Never pass 'opus' for claude — the top Claude model is already the default.
titleNoThe caller-supplied agent pane title is applied verbatim (for example `cmuxlayer-WORKER · run1 name-the-tabs`); when omitted or blank, the existing agent-id/surface fallback is retained. Managed identity comes from the agent registry, not this display title (#479/#492).
effortNoRequired for codex new agent spawns: low, medium, high, xhigh, max, ultra. Choose deliberately: medium for well-specified lanes, high for security/open-ended; xhigh and above cost more. Omit on resume (the session keeps its effort) and for other CLIs (effort is invalid).
promptNoMax 2-3 short lines. Longer payloads BREAK the receiving pane — write the payload to a file and send one line: `Read and follow <path>`. Inline task prompt to send after the agent is ready. Capped at 500 inline UTF-8 bytes by default; use boot_prompt_path for larger prompts. Mutually exclusive with boot_prompt_path.
verboseNoReturn the full legacy spawn response instead of the lean default.
versionNoSpawnSpec schema version
worktreeNoWhen set, create or reuse a git worktree before launch. Pass a string such as "tool-usage" as the worktree name, true for a generated name, or an object with name, path, branch, base, create, and reuse. When repoGolem registers the repo with an absolute path, that path is the repo root; otherwise the root is resolved from CMUXLAYER_REPO_HOME, the running checkout, or ~/Gits. true uses <registered-root>/.worktrees/<generated-name> (legacy ~/Gits/<repo>.wt read-fallback until ~2026-09). If a later spawn step fails before a recoverable surface exists, a newly created worktree and branch are rolled back.
authorityNoAuthority axis, independent from job function and placement
force_newNoWhen true, suppress same repo/workspace/role duplicate-lane warnings. Default false so collab leads see reusable existing agents before spawning another lane.
placementNoPhysical placement axis: left or right. It must agree with authority (lead=left, worker=right). Legacy orchestrator/worker aliases remain accepted.
workspaceNoTarget workspace ref. Omit to use the caller/current workspace; pass only when intentionally spawning in a different workspace.
collab_pathNoLead coordination file; workers inherit their parent lead collab_path unless explicitly supplied.
mcp_profileNoMCP profile hint for worktree launches. Defaults to inherit. Use sterile/skill_eval or include/exclude lists for narrower evals.
report_pathNoOptional ABSOLUTE override for the engine-issued report path. Omit in almost all cases: the engine issues ~/.cmux/agents/<agent_id>/report.md, returns it here, and verifies closure against it. Pass a distinct FILE path per child (never a directory) to place a report somewhere you already watch. Check coordination_footer_delivered. For resume_agent_id calls, false means the pointer was deliberately not re-delivered: follow coordination_footer_note and relay only if the restored session lost its original context. For new spawns, if false and contract_path is present, folded pointer submission was queued or unverified. Inspect the pane, then relay with send_to({agent_id, text:"Read and follow <contract_path>", press_enter:true}); do not use raw cmux send/send-key. If false and contract_path is absent, inline mode is active or the contract file could not be written, so YOU must relay report_path and done_marker.
halt_escalationNoNotify the nearest live ancestor when this agent remains awaiting input, idle without done evidence, or wedged past its dwell threshold. Set false for deliberate debugging lanes.
parent_agent_idNoID of the parent agent for hierarchical spawning. Normally inferred from the managed caller surface; pass explicitly only when no managed caller supplies the hierarchy. Parent must exist.
resume_agent_idNoTHE way to revive an agent: resume this captured session on a fresh surface, keeping its public agent ID and re-issuing its coordination contract. cmuxlayer never revives a pane by itself (#492) -- a pane you close stays closed -- so a lead that wants an agent back asks here, by id. Refused with a reason when the session transcript is not on disk, rather than opening an empty pane. Mutually exclusive with new-spawn fields.
boot_prompt_pathNoOptional readable prompt-file path. Checked before spawning; multiline or over-cap files are submitted as one `Read and follow <path>` pointer and one final return after readiness. Mutually exclusive with prompt.
allow_long_inlineNoBypass the inline prompt length cap for a deliberate raw boot-prompt send. Prefer boot_prompt_path for large prompts.
max_cost_per_agentNoMaximum cost cap in USD for this agent
auto_archive_on_doneNoDeprecated compatibility flag. TASK_DONE updates agent state only; cmuxlayer does not auto-close panes.
boot_prompt_timeout_msNoOptional timeout override in milliseconds for pane placement, initial shell readiness, agent launch readiness, and the boot prompt. When omitted, each phase keeps its established default (45s placement, 10s shell, 15s launch, 60s boot prompt).

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
okYes
cwdNo
roleNo
typeNo
titleNo
versionNo
agent_idNo
surface_idNo
cwd_receiptNo
done_markerNo
next_actionNo
report_pathNo
retry_countYes
spawn_stateNo
workspace_idNo
contract_pathNo
delivered_charsNo
parent_agent_idNo
boot_prompt_bytesNo
boot_prompt_receiptNo
update_menu_skippedNo
boot_prompt_deliveredNo
update_menu_text_hashNo
coordination_footer_noteNo
coordination_footer_bytesNo
boot_prompt_submit_verifiedNo
coordination_footer_deliveredNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed4 schema fields changedv0.4.92
    • changedInput schema / properties / effort / description
      Previous value: -"Codex reasoning effort, passed to the repoGolem launcher. CHOOSE THIS DELIBERATELY PER MISSION — it is a cost decision, not a default to inherit. The installed launcher currently accepts: low, medium, high, xhigh, max, ultra. spawn_agent rejects other values before creating a worktree or surface. The live launcher defaults to HIGH when omitted (~/.config/ralphtools/golem-dispatch.zsh). Per /agent-routing, MEDIUM is the settled floor for well-specified implementation lanes — use it unless the task genuinely needs more; xhigh and above burn budget fast and are rarely warranted for a lane with a clear brief."New value: +"Required for codex new agent spawns: low, medium, high, xhigh, max, ultra. Choose deliberately: medium for well-specified lanes, high for security/open-ended; xhigh and above cost more. Omit on resume (the session keeps its effort) and for other CLIs (effort is invalid)."
    • changedInput schema / properties / effort / enum
      Previous value: -[
      -  "low",
      -  "medium",
      -  "high",
      -  "xhigh",
      -  "max",
      -  "ultra"
      -]New value: +[
      +  "low",
      +  "medium",
      +  "high",
      +  "xhigh",
      +  "max",
      +  "ultra",
      +  ""
      +]
    • changedInput schema / properties / force / description
      Previous value: -"With resume_agent_id only: override inconclusive recorded-process liveness after the caller deliberately verifies the old agent is gone. Does not bypass session or terminal-state requirements."New value: +"With resume_agent_id only: override missing or inconclusive proof that the old session is not running (no recorded pid, an unproven pid, an unreadable topology or process table) after the caller deliberately verifies the old agent is gone. Does not bypass session or terminal-state requirements."
    • changedInput schema / properties / report_path / description
      Previous value: -"Optional ABSOLUTE override for the engine-issued report path. Omit in almost all cases: the engine issues ~/.cmux/agents/<agent_id>/report.md, returns it here, and verifies closure against it. Pass a distinct FILE path per child (never a directory) to place a report somewhere you already watch. Check coordination_footer_delivered. For resume_agent_id calls, false means the pointer was deliberately not re-delivered: follow coordination_footer_note and relay only if the restored session lost its original context. For new spawns, if false and contract_path is present, folded pointer submission was queued or unverified, so YOU must relay contract_path, report_path, and done_marker. If false and contract_path is absent, inline mode is active or the contract file could not be written, so YOU must relay report_path and done_marker."New value: +"Optional ABSOLUTE override for the engine-issued report path. Omit in almost all cases: the engine issues ~/.cmux/agents/<agent_id>/report.md, returns it here, and verifies closure against it. Pass a distinct FILE path per child (never a directory) to place a report somewhere you already watch. Check coordination_footer_delivered. For resume_agent_id calls, false means the pointer was deliberately not re-delivered: follow coordination_footer_note and relay only if the restored session lost its original context. For new spawns, if false and contract_path is present, folded pointer submission was queued or unverified. Inspect the pane, then relay with send_to({agent_id, text:\"Read and follow <contract_path>\", press_enter:true}); do not use raw cmux send/send-key. If false and contract_path is absent, inline mode is active or the contract file could not be written, so YOU must relay report_path and done_marker."
  2. Changed29 schema fields changedv0.4.88
    • addedInput schema / properties / allow_long_inline
      Added value: +{
      +  "default": false,
      +  "description": "Bypass the inline prompt length cap for a deliberate raw boot-prompt send. Prefer boot_prompt_path for large prompts.",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / authority
      Added value: +{
      +  "description": "Authority axis, independent from job function and placement",
      +  "enum": [
      +    "lead",
      +    "worker"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / auto_archive_on_done
      Added value: +{
      +  "default": false,
      +  "description": "Deprecated compatibility flag. TASK_DONE updates agent state only; cmuxlayer does not auto-close panes.",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / boot_prompt_path
      Added value: +{
      +  "description": "Optional readable prompt-file path. Checked before spawning; multiline or over-cap files are submitted as one `Read and follow <path>` pointer and one final return after readiness. Mutually exclusive with prompt.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedInput schema / properties / boot_prompt_timeout_ms
      Added value: +{
      +  "description": "Optional timeout override in milliseconds for pane placement, initial shell readiness, agent launch readiness, and the boot prompt. When omitted, each phase keeps its established default (45s placement, 10s shell, 15s launch, 60s boot prompt).",
      +  "exclusiveMinimum": 0,
      +  "type": "integer"
      +}
    • addedInput schema / properties / collab_path
      Added value: +{
      +  "description": "Lead coordination file; workers inherit their parent lead collab_path unless explicitly supplied.",
      +  "minLength": 1,
      +  "type": "string"
      +}
    • addedInput schema / properties / cwd
      Added value: +{
      +  "description": "Initial working directory for type=terminal",
      +  "type": "string"
      +}
    • addedInput schema / properties / effort
      Added value: +{
      +  "description": "Codex reasoning effort, passed to the repoGolem launcher. CHOOSE THIS DELIBERATELY PER MISSION — it is a cost decision, not a default to inherit. The installed launcher currently accepts: low, medium, high, xhigh, max, ultra. spawn_agent rejects other values before creating a worktree or surface. The live launcher defaults to HIGH when omitted (~/.config/ralphtools/golem-dispatch.zsh). Per /agent-routing, MEDIUM is the settled floor for well-specified implementation lanes — use it unless the task genuinely needs more; xhigh and above burn budget fast and are rarely warranted for a lane with a clear brief.",
      +  "enum": [
      +    "low",
      +    "medium",
      +    "high",
      +    "xhigh",
      +    "max",
      +    "ultra"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / focus
      Added value: +{
      +  "default": false,
      +  "description": "Leave focus on the created agent tab instead of restoring the exact origin after initialization.",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / force
      Added value: +{
      +  "default": false,
      +  "description": "With resume_agent_id only: override inconclusive recorded-process liveness after the caller deliberately verifies the old agent is gone. Does not bypass session or terminal-state requirements.",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / force_new
      Added value: +{
      +  "default": false,
      +  "description": "When true, suppress same repo/workspace/role duplicate-lane warnings. Default false so collab leads see reusable existing agents before spawning another lane.",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / halt_escalation
      Added value: +{
      +  "default": true,
      +  "description": "Notify the nearest live ancestor when this agent remains awaiting input, idle without done evidence, or wedged past its dwell threshold. Set false for deliberate debugging lanes.",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / max_cost_per_agent
      Added value: +{
      +  "description": "Maximum cost cap in USD for this agent",
      +  "type": "number"
      +}
    • addedInput schema / properties / mcp_profile
      Added value: +{
      +  "anyOf": [
      +    {
      +      "enum": [
      +        "inherit",
      +        "sterile",
      +        "skill_eval"
      +      ],
      +      "type": "string"
      +    },
      +    {
      +      "additionalProperties": false,
      +      "properties": {
      +        "exclude": {
      +          "items": {
      +            "type": "string"
      +          },
      +          "type": "array"
      +        },
      +        "include": {
      +          "items": {
      +            "type": "string"
      +          },
      +          "type": "array"
      +        }
      +      },
      +      "type": "object"
      +    }
      +  ],
      +  "description": "MCP profile hint for worktree launches. Defaults to inherit. Use sterile/skill_eval or include/exclude lists for narrower evals."
      +}
    • changedInput schema / properties / model / description
      Previous value: -"Model name (e.g. 'sonnet', 'codex', 'opus')"New value: +"OPTIONAL — leave UNSET so the launcher pins the top-tier model. For cli:'codex', an explicit model is checked against Codex's runtime model list before any worktree or surface is created, then passed through to the launcher. Never pass 'opus' for claude — the top Claude model is already the default."
    • addedInput schema / properties / parent_agent_id
      Added value: +{
      +  "description": "ID of the parent agent for hierarchical spawning. Normally inferred from the managed caller surface; pass explicitly only when no managed caller supplies the hierarchy. Parent must exist.",
      +  "type": "string"
      +}
    • addedInput schema / properties / placement
      Added value: +{
      +  "description": "Physical placement axis: left or right. It must agree with authority (lead=left, worker=right). Legacy orchestrator/worker aliases remain accepted.",
      +  "enum": [
      +    "left",
      +    "right",
      +    "orchestrator",
      +    "worker"
      +  ],
      +  "type": "string"
      +}
    • changedInput schema / properties / prompt / description
      Previous value: -"Task prompt to send after agent is ready"New value: +"Max 2-3 short lines. Longer payloads BREAK the receiving pane — write the payload to a file and send one line: `Read and follow <path>`. Inline task prompt to send after the agent is ready. Capped at 500 inline UTF-8 bytes by default; use boot_prompt_path for larger prompts. Mutually exclusive with boot_prompt_path."
    • addedInput schema / properties / report_path
      Added value: +{
      +  "description": "Optional ABSOLUTE override for the engine-issued report path. Omit in almost all cases: the engine issues ~/.cmux/agents/<agent_id>/report.md, returns it here, and verifies closure against it. Pass a distinct FILE path per child (never a directory) to place a report somewhere you already watch. Check coordination_footer_delivered. For resume_agent_id calls, false means the pointer was deliberately not re-delivered: follow coordination_footer_note and relay only if the restored session lost its original context. For new spawns, if false and contract_path is present, folded pointer submission was queued or unverified, so YOU must relay contract_path, report_path, and done_marker. If false and contract_path is absent, inline mode is active or the contract file could not be written, so YOU must relay report_path and done_marker.",
      +  "type": "string"
      +}
    • addedInput schema / properties / resume_agent_id
      Added value: +{
      +  "description": "THE way to revive an agent: resume this captured session on a fresh surface, keeping its public agent ID and re-issuing its coordination contract. cmuxlayer never revives a pane by itself (#492) -- a pane you close stays closed -- so a lead that wants an agent back asks here, by id. Refused with a reason when the session transcript is not on disk, rather than opening an empty pane. Mutually exclusive with new-spawn fields.",
      +  "type": "string"
      +}
    • addedInput schema / properties / role
      Added value: +{
      +  "description": "Agent job function: implementor, reviewer, or gatherer. Legacy orchestrator/worker aliases remain accepted for compatibility. Claude requires this field explicitly.",
      +  "enum": [
      +    "orchestrator",
      +    "worker",
      +    "implementor",
      +    "reviewer",
      +    "gatherer"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / title
      Added value: +{
      +  "description": "The caller-supplied agent pane title is applied verbatim (for example `cmuxlayer-WORKER · run1 name-the-tabs`); when omitted or blank, the existing agent-id/surface fallback is retained. Managed identity comes from the agent registry, not this display title (#479/#492).",
      +  "type": "string"
      +}
    • addedInput schema / properties / type
      Added value: +{
      +  "default": "agent",
      +  "description": "Spawn an AI agent or a plain terminal",
      +  "enum": [
      +    "agent",
      +    "terminal"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / verbose
      Added value: +{
      +  "default": false,
      +  "description": "Return the full legacy spawn response instead of the lean default.",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / version
      Added value: +{
      +  "const": 1,
      +  "default": 1,
      +  "description": "SpawnSpec schema version",
      +  "type": "number"
      +}
    • changedInput schema / properties / workspace / description
      Previous value: -"Target workspace ref"New value: +"Target workspace ref. Omit to use the caller/current workspace; pass only when intentionally spawning in a different workspace."
    • addedInput schema / properties / worktree
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "boolean"
      +    },
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "additionalProperties": false,
      +      "properties": {
      +        "base": {
      +          "type": "string"
      +        },
      +        "branch": {
      +          "type": "string"
      +        },
      +        "create": {
      +          "type": "boolean"
      +        },
      +        "name": {
      +          "type": "string"
      +        },
      +        "path": {
      +          "type": "string"
      +        },
      +        "reuse": {
      +          "type": "boolean"
      +        }
      +      },
      +      "type": "object"
      +    }
      +  ],
      +  "description": "When set, create or reuse a git worktree before launch. Pass a string such as \"tool-usage\" as the worktree name, true for a generated name, or an object with name, path, branch, base, create, and reuse. When repoGolem registers the repo with an absolute path, that path is the repo root; otherwise the root is resolved from CMUXLAYER_REPO_HOME, the running checkout, or ~/Gits. true uses <registered-root>/.worktrees/<generated-name> (legacy ~/Gits/<repo>.wt read-fallback until ~2026-09). If a later spawn step fails before a recoverable surface exists, a newly created worktree and branch are rolled back."
      +}
    • removedInput schema / required
      Removed value: -[
      -  "repo",
      -  "model",
      -  "cli",
      -  "prompt"
      -]
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "$schema": "http://json-schema.org/draft-07/schema#",
      +  "additionalProperties": true,
      +  "properties": {
      +    "agent_id": {
      +      "type": "string"
      +    },
      +    "boot_prompt_bytes": {
      +      "minimum": 0,
      +      "type": "integer"
      +    },
      +    "boot_prompt_delivered": {
      +      "type": "boolean"
      +    },
      +    "boot_prompt_receipt": {
      +      "$ref": "#/properties/cwd_receipt"
      +    },
      +    "boot_prompt_submit_verified": {
      +      "type": [
      +        "boolean",
      +        "null"
      +      ]
      +    },
      +    "contract_path": {
      +      "type": "string"
      +    },
      +    "coordination_footer_bytes": {
      +      "minimum": 0,
      +      "type": "integer"
      +    },
      +    "coordination_footer_delivered": {
      +      "type": "boolean"
      +    },
      +    "coordination_footer_note": {
      +      "type": "string"
      +    },
      +    "cwd": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "cwd_receipt": {
      +      "additionalProperties": true,
      +      "properties": {
      +        "attention_reason": {
      +          "type": "string"
      +        },
      +        "bytes": {
      +          "minimum": 0,
      +          "type": "integer"
      +        },
      +        "delivered": {
      +          "type": "boolean"
      +        },
      +        "delivery": {
      +          "enum": [
      +            "submitted",
      +            "typed",
      +            "queued",
      +            "queued_followup",
      +            "rescued",
      +            "failed",
      +            "pending_verify",
      +            "failed_confirmed",
      +            "stalled_queue"
      +          ],
      +          "type": "string"
      +        },
      +        "delivery_id": {
      +          "type": "string"
      +        },
      +        "delivery_state": {
      +          "enum": [
      +            "submitted",
      +            "typed",
      +            "queued",
      +            "queued_followup",
      +            "rescued",
      +            "failed",
      +            "pending_verify",
      +            "failed_confirmed",
      +            "stalled_queue"
      +          ],
      +          "type": "string"
      +        },
      +        "duplicate_of": {
      +          "type": "string"
      +        },
      +        "needs_attention": {
      +          "type": "boolean"
      +        },
      +        "prompt_bytes": {
      +          "minimum": 0,
      +          "type": "integer"
      +        },
      +        "prompt_sha256": {
      +          "type": "string"
      +        },
      +        "prompt_warning": {
      +          "type": [
      +            "string",
      +            "null"
      +          ]
      +        },
      +        "rpc_methods": {
      +          "items": {
      +            "enum": [
      +              "surface.send_text",
      +              "surface.send_key"
      +            ],
      +            "type": "string"
      +          },
      +          "type": "array"
      +        },
      +        "submit_attempted": {
      +          "type": "boolean"
      +        },
      +        "submit_dispatched": {
      +          "type": "boolean"
      +        },
      +        "submit_evidence": {
      +          "anyOf": [
      +            {
      +              "enum": [
      +                "token_delta",
      +                "transcript_echo",
      +                "cleared_composer",
      +                "status_only"
      +              ],
      +              "type": "string"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        },
      +        "submit_verified": {
      +          "type": [
      +            "boolean",
      +            "null"
      +          ]
      +        },
      +        "terminal": {
      +          "type": "boolean"
      +        },
      +        "typed": {
      +          "type": "boolean"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "delivered_chars": {
      +      "minimum": 0,
      +      "type": "integer"
      +    },
      +    "done_marker": {
      +      "type": "string"
      +    },
      +    "next_action": {
      +      "type": "string"
      +    },
      +    "ok": {
      +      "type": "boolean"
      +    },
      +    "parent_agent_id": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "report_path": {
      +      "type": "string"
      +    },
      +    "retry_count": {
      +      "minimum": 0,
      +      "type": "integer"
      +    },
      +    "role": {
      +      "type": "string"
      +    },
      +    "spawn_state": {
      +      "enum": [
      +        "started",
      +        "boot_unsubmitted"
      +      ],
      +      "type": "string"
      +    },
      +    "surface_id": {
      +      "type": "string"
      +    },
      +    "title": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "type": {
      +      "enum": [
      +        "agent",
      +        "terminal"
      +      ],
      +      "type": "string"
      +    },
      +    "update_menu_skipped": {
      +      "type": "boolean"
      +    },
      +    "update_menu_text_hash": {
      +      "type": "string"
      +    },
      +    "version": {
      +      "const": 1,
      +      "type": "number"
      +    },
      +    "workspace_id": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    }
      +  },
      +  "required": [
      +    "ok",
      +    "retry_count"
      +  ],
      +  "type": "object"
      +}
  3. First observedv0.1.0

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare it is a non-read-only, non-destructive mutation. The description adds real value beyond them: deterministic placement, the timeout bounding placement, 'evidence-backed receipts', lean-by-default successful output with verbose=true restoring detail, and failures always retaining full detail. This is genuine return/behavior disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four dense sentences, front-loaded with the core capability and then behavioral/return traits. Every sentence contributes, though the receipt/verbose sentences are terse and pack multiple ideas.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 29-param spawn tool with an output schema and fully documented parameters, the description supplies the behavioral layer (placement determinism, receipt lean/verbose behavior) the annotations and schema don't. It is largely sufficient, with only minor usage-routing gaps left to the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all 29 parameters richly. The description only gestures at boot_prompt_timeout_ms and verbose, adding little beyond what the schema already states; baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States specific verbs and resources: 'Spawn a managed agent or terminal, or resume a captured agent on a fresh surface while preserving its ID.' This clearly distinguishes it from siblings like list_agents, send_to, and close_surface, which are about inspecting/messaging/terminating rather than creating.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Implies two modes (new spawn vs resume) but gives no explicit when-to-use/when-not guidance or naming of alternatives beyond the resume clause. The heavier routing guidance (resume_agent_id as 'THE way to revive', mutual exclusions) lives in the schema, not the description.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.