create-agent · git:20261026.06196ea · 2026-10-26 · sha256 efa0f2343b0aef96
create-agent git:20261026.06196eaA
Immutable. This exact content never changes and is served at /api/v1/blob/efa0f2343b0aef96.
--- name: create-agent description: Create or update a Harness Anything business Agent — a declared identity with its own instructions, prompts, skills, role, preset, runtime targets, and permission mode — instead of only naming a model. Use when a user asks to create an agent, define a new worker/commander/reviewer, give an agent its own job, or split one generic agent into business-specific ones. --- # Create an Agent An Agent is an **entity with a declaration**, not a model name. The model is one field. What makes it an Agent for a business is the rest of the declaration: what it is responsible for, what it reads, how it decides, which skills specialize it, which preset shapes its tasks, and where it must stop. Read the current contract before writing anything: ```bash ha agent --help ha agent inspect <existing-id> # a real declaration, including instructions and runtime targets ha agent list # every installed identity with role, preset and status ``` `packages/kernel/src/domain/agent-squad-schema.ts` (`agent-declaration/v1`) is the schema authority. Do not copy a declaration shape from documentation; copy it from the live `--help` output and a working declaration. ## Decide the job before the fields Answer these five before writing JSON. If any answer is "it depends", the split is wrong. 1. **Business result.** What outcome exists only because this Agent exists? Not "implements tasks" — every worker does that. 2. **Decision authority.** Which calls does it make alone, which does it escalate, and to whom? This becomes `role` plus the stop conditions in `instructions`. 3. **Read scope.** Which sources must it open to be right, and which are noise? Named paths become `skills`, read-set lines and prompts. 4. **Done evidence.** What proves its work is done? This must match the completion gates its `preset` will apply, or it will declare completion it cannot evidence. 5. **Failure shape.** What does it do when a premise is false, a tool is denied, or evidence is missing? "Ask the user" is not available in unattended dispatch; the answer belongs in `instructions` as a concrete action plus what it reports. Then check whether the Agent should exist at all: if the only difference from an existing Agent is the model, do not create it — select the model on the existing Agent's runtime target (`runtimes[].model`). Two identities with the same instructions and different models are a model matrix entry, not two Agents. ## Declaration fields and what each one really does | Field | Effect | Write it as | | --- | --- | --- | | `id` | Stable identity; appears in dispatch provenance and task records | lowercase entity slug; never renamed to rebrand, use `retire --successor` | | `name` | Display label | business name, not a model name | | `instructions` | Injected first, exactly as written, on every dispatch | the job, the authority boundary, the stop conditions, the output contract | | `role` | Selects the role baseline prompt (`worker` / `commander` / `reviewer`) | the actual discipline, not aspiration | | `runtimes` | Runtime kinds this Agent may run on, each with an optional `model` and `effort` | at least one installed kind; empty means any compatible kind | | `instance` | Node-local runtime instance pin | omit unless the Agent must run on one specific instance | | `permissionMode` | Unattended sandbox default; `read-only` also enables attach to a frozen submitted cut | `workspace-write` by default; `read-only` for reviewers and analysts | | `skills` | Skill directories resolved at spawn; a missing path fails the dispatch | project-relative paths to directories containing `SKILL.md` | | `prompts` | Extra prompt blocks appended after the role baseline | recurring read-sets and per-dispatch conventions, not the job | | `preset` | Task-shaping preset this Agent's tasks start from | a preset that exists on the target repository | Two constraints that bite: - **`skills[].path` is resolved on the serving node, not at authoring time.** A path that exists in your checkout but not on the node fails the dispatch with `agent_skill_not_found`. `ha agent validate --source <file>` resolves the same paths before install; run it. - **`instructions` is injected verbatim on every dispatch.** Length is a per-dispatch tax. Put durable judgment here, put reference detail in a skill, put per-task facts in the task plan. ## Authoring loop ```bash # 1. Write the declaration where the repository keeps its agents (harness/agents/<id>.json here). # Start from a working declaration, not from a schema sketch. ha agent inspect <closest-existing-agent> # 2. Validate before install: schema, runtime targets available on this node, skill paths resolve. ha agent validate --source harness/agents/<id>.json # 3. Preview, then install. --expected-version guards an update against a concurrent edit. ha agent install --source harness/agents/<id>.json --dry-run ha agent install --source harness/agents/<id>.json ha agent install --source harness/agents/<id>.json --expected-version <n> # 4. Prove it dispatches: a dry-run spawn assembles the real prompt without starting a runtime. ha agent run <id> --task <task-id> --dry-run ``` `--dry-run` on `agent run` is the cheapest proof that the declaration composes: it shows the identity prefix, instructions, role baseline, prompts, preset, resolved skill paths, and mission in the order the runtime would receive them. Read it; a declaration that validates can still assemble a prompt with the wrong emphasis. ## Leave an iteration path Give the Agent a way to improve itself instead of freezing the first draft: - Mount `self-iteration` in `skills` when the Agent should propose changes to its own declaration after a delivery. Without it, an unattended Agent has no channel to report that its instructions are wrong except a running commentary the owner never reads. - Keep `instructions` about judgment and `skills` about procedure, so a later proposal can change one without rewriting the other. - Do not paste a second copy of a skill's rules into `instructions`. Two sources drift, and the Agent will follow the wrong one. ## Updating, retiring, and what not to do ```bash ha agent inspect <id> # current declaration + expected-version ha agent install --source <file> --expected-version <n> # update in place ha agent retire <id> --reason "<why>" --successor <id> # keep history and deep links ha agent delete <id> --reason "<why>" --expected-version <n> ``` - **Never hand-edit the installed declaration store.** Updates go through `ha agent install`, which writes through the center single-write path and records a version. A hand edit has no version and no rollback. - **Never copy another Agent's declaration and change one field.** You inherit stop conditions and read scope that do not belong to the new job. Start from the job, then borrow the specific lines. - **Do not create an Agent to hold a permission.** Permissions come from the runtime and the task lease, not from an identity. - **Do not create an Agent per task.** If the identity would be used once, it is a task, not an Agent. ## Output contract Report: the declaration path, the five job answers in one line each, `ha agent validate` result, `ha agent install` receipt (version), the `--dry-run` prompt's section order, and any field left at its default with the reason.