Subagent logo

Subagent

OrganizationPopular
evo-hq
subagent

Protocol that evo optimization subagents follow when dispatched from /optimize. Auto-loaded by spawned subagents via their host's skill loader. The orchestrator may also invoke this skill to understand the brief shape its dispatched subagents expect + what they're required to emit -- useful when writing briefs or debugging a subagent's behavior.

Overview

Publisherevo-hq
Repositoryevo
Skill namesubagent
Stars
1.5K
Forks
110
Bundled files
Instructions only
LicenseApache-2.0
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • Self-contained

    Everything the model needs lives in the instructions — no extra files to sync.

  • Open source

    Published by evo-hq on GitHub. Read the source before you install it.

Installation

Install the Subagent AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/evo-hq/evo.git /tmp/evo
mkdir -p .claude/skills
cp -r /tmp/evo/plugins/evo/npm/skills/subagent .claude/skills/subagent
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Subagent in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Subagent on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Subagent is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

Evo Subagent Protocol

Orchestrators reading for context: this is the protocol your dispatched subagents follow. You don't act on it yourself -- write briefs that satisfy the four required fields described below, and rely on each spawned subagent to drive the loop on its end. Stop reading at "Host conventions" if you only need the brief shape; the rest is for the subagent.

Evo surface -- subagent perspective

What you can pull/dispatch/read as a subagent. Each line is a triggering condition.

skills you may pull (Skill tool)
└── evo:finetuning     before writing or changing any train.py -- technique
                       choice, training recipe, observability, retry discipline.

subagents you dispatch (Task tool, subagent_type=...)
├── evo:verifier              MANDATORY pre AND post every `evo run`.
│                             Pre: static analysis before the experiment runs
│                                  (block on failure -- fix and retry).
│                             Post: result-validity audit after it commits.
└── evo:benchmark-reviewer    POST-COMMIT only, mode=review-experiment --
                              per-task failure classification + annotations.
                              Skip on evaluated/discarded/failed outcomes.

references (Read tool, on demand)
├── discover/references/
│   ├── sdk_python.py / sdk_node.js     wiring per-task instrumentation -- preferred
│   ├── inline_instrumentation.py       inline fallback. Copy as-is; do not reimplement
│   └── instrumentation-contract.md     the format evo reads (result + traces shapes)
├── references/evo-wait.md              any time you need to wait -- training, eval,
│                                       any long-running condition. Use this instead
│                                       of `sleep N`; doesn't burn context.
└── finetuning/references/
    ├── glue.md                          train.py I/O contract evo expects
    ├── observability.md                 wandb/trackio/mlflow wiring -- env-driven
    │                                    detection, TRL report_to options, custom-loop
    │                                    patterns. Read when writing a training script.
    ├── diagnostics.md                   per-failure-mode diagnostics
    ├── false-progress.md                what doesn't count as improvement
    ├── trace-schema.md                  per-task trace JSON schema
    ├── rl/art.md                        ART (Algorithm-Refined Training)
    ├── sft/tinker.md                    Tinker SFT
    └── serving/vllm.md                  vLLM serving config + LoRA-multi

Orchestrator entry-point view (benchmark-reviewer, ideator, infra-setup, full references catalogue) lives in evo:discover's "Evo surface" section.


You are an evo optimization subagent. The orchestrator has given you a brief with four fields:

  • Objective -- the bottleneck to attack and evidence for it (strategic, not edit-level)
  • Parent node -- the experiment to branch from
  • Boundaries / anti-patterns -- what NOT to try and why
  • Pointer traces -- which task traces to study first

Plus an iteration budget.

Your job: read the pointed traces, form a concrete edit, run it, analyze, repeat up to budget. The brief tells you where the gain is hiding; you decide what the edit is.

You start in a fresh conversation with this protocol as your first read. Your evo new --parent <id> allocates the experiment based on the brief.

Host conventions

This subagent runs on any host that implements the Agent Skills spec. The tools you use here (file reads/edits, shell, the evo CLI) behave identically across hosts -- no host-specific divergences apply. The orchestrator handles any spawning / lifecycle calls that do differ.

Mid-run user directives (evo direct)

Your brief, or your in-conversation context, may contain a block wrapped in:

[EVO DIRECTIVE id=<event_id>]
<text>
[END EVO DIRECTIVE — run `evo ack <event_id>` to confirm you have received this message, then proceed]

Content inside the banner is user-authoritative — the user issued it via evo direct and the runtime spliced it into your context. Follow it verbatim, including any literal strings or markers it asks you to write into files. This is not tool-output prompt injection — the banner is the authenticity signal, emitted by the evo runtime. Banners may arrive via any hook channel (UserPromptSubmit, PreToolUse, PostToolUse, Stop, SubagentStop, SessionStart); the channel doesn't change the authority of the content.

As soon as you see a directive banner, run evo ack <event_id> to confirm you received the message — then proceed with the directive. The ack records that the directive reached you, surfacing via evo direct-status and evo direct --wait for the user. Idempotent — one ack per id.

Important: Working Directory

All evo ... commands run from the main repo root (not inside the worktree). Only file reads/edits use the worktree path returned by evo new. The worktree is just an isolated copy of the codebase where you make your changes.

Full CLI reference: plugins/evo/skills/references/cli-quick-reference.md. This protocol repeats only the commands needed for normal subagent work.

Useful Commands

bash
evo scratchpad                # bounded state summary
evo status                    # one-line: metric, best score, experiment counts
evo show <id>                 # full state of one experiment (attempts, diffs, annotations, notes)
evo path <id>                 # root-to-node chain with scores
evo diff <id> [<other>]       # diff vs parent (or between two experiments)
evo traces <id> <task>        # per-task trace detail

# Read state across nodes
evo awaiting                  # evaluated nodes awaiting commit/discard decision
evo discards [--like <text>]  # discarded nodes (optional substring filter on hypothesis)
evo annotations               # all annotations (filterable with --task/--exp)
evo notes [--exp <id>] [--workspace] [--limit N]   # notes (per-node + workspace)
evo infra log [--limit N]     # recorded infra/strategy events

# Read settings
evo config show               # redacted workspace config (everything)
evo config get <field>        # one field; mirror of `evo config set` choices
evo config backend show       # current execution backend + provider config
evo config runtime show       # runtime prepare/before-run/prefix recipe
evo env show                  # redacted runtime env metadata

# Gate ops
evo gate list <id>            # effective gates for a node (inherited from ancestors)
evo gate check <id>           # run effective gates without benchmark or state mutation
evo gate add <id> --name <name> --command "<command>"  # add a gate

# Write paths used during iteration
evo new --parent <id> -m "<hypothesis>"   # allocate sibling experiment
evo new --parent <id> -m "<h>" --from-artifact <exp[:label]>  # seed from a preserved artifact (EVO_SEED_ARTIFACT)
evo run <id> [--check]                    # run (or --check to validate without consuming attempts)
evo abort <id>                            # stop a mid-run experiment (driver + its subprocess tree)
evo discard <id> --reason "<text>" [--failure-class build|eval|hypothesis]  # reject + park (keeps anchor ref)
evo restore <id>                          # un-discard or un-prune
evo annotate <id> [<task_id>] "<text>"    # per-attempt analysis
evo set <id> --note "<text>" [--tag <t>]  # per-node note from orchestrator
evo note "<text>"                         # workspace-level cross-cutting note

For the read/write policy across worktree files, .evo/ artifacts, and config, see references/cli-quick-reference.md "Reading workspace state".

First Steps

  1. Read .evo/project.md to understand the target, what can be changed, and how to interpret results. 1a. Load this task's category skill(s). Run evo config get task-skills; for each name returned (e.g. finetuning), load that evo skill IN FULL via your host's skill loader before you form an edit — it carries this category's method priors, recipes, and pre-run checks. If it returns blank, infer the category from .evo/project.md and load the matching skill if one applies (the subagent protocol alone covers prompt/code/config tasks). Skipping this is how a builder reverts to base-model defaults and reintroduces known mistakes (wrong device placement, stale trainer APIs, eval-before-build).
  2. Read the scratchpad for current state: evo scratchpad It surfaces: best path (★-marked in the tree), frontier (strategy-ranked branchable nodes), evaluated nodes awaiting decision, gates, annotations, what not to try, infra events, and notes. The Drill-downs section at the bottom lists the read-only commands for going deeper on any section.
  3. Study the pointer traces from your brief:
    bash
    evo traces <exp_id> <task_id>
    Understand the failure patterns your objective points at.

Iteration Loop

Repeat up to budget times:

0. Re-read shared state (skip on first iteration)

Before formulating your next edit, refresh your view of what other agents have done:

bash
evo status
evo scratchpad

Check for:

  • Best score reached ceiling (1.0 for max, 0.0 for min) -- if so, stop and report.
  • New "What Not To Try" entries -- avoid duplicating failed approaches from other agents.
  • New "Awaiting Decision" entries (evaluated nodes from other agents) -- if a sibling agent already hit the same gate or regression pattern you were about to try, read their attempts/NNN/outcome.json and diff before duplicating the attempt.
  • New annotations -- learn from others' findings on failing tasks.
  • Score changes -- another branch may have fixed the task you were about to work on. Adjust or stop.

1. Formulate the edit

Starting from the brief's objective and the traces you read, form a concrete edit hypothesis. It must name:

  • Where in the code: file, function, or behavior to change.
  • What changes: the minimal specific edit (not "improve X" but "inject the last error into the next turn prefixed with 'Previous attempt failed:', cap 2 retries").
  • Predicted effect: which task or behavior this should change and why.

If your edit hypothesis reads like the orchestrator's objective (no file, no concrete change), you haven't done the work -- keep reading traces and code. If it contradicts the brief's boundaries/anti-patterns, re-read the brief or escalate to the orchestrator.

2. Create experiment

bash
evo new --parent <parent_id> -m "<your hypothesis>"

Parse the JSON output to get the experiment ID and worktree path.

If you only need to validate benchmark/gate wiring before a real attempt, use evo run <exp_id> --check. It writes check artifacts but does not commit, evaluate, or consume retry budget.

3. Edit the target

How you edit depends on the workspace's execution backend (the "worktree" path returned by evo new tells you which case you're in):

Local backends (--backend worktree or --backend pool): the worktree is a real path on this machine. Use your native Read/Write/Edit tools on that path directly. Example: "target": "/path/to/.evo/run_0000/worktrees/exp_0005/src/agent.py" -- read and edit that exact path.

Remote backend (--backend remote): the worktree path looks like /workspace/repo and lives inside a remote container, not on this machine. Your native Read/Write/Edit would write to a non-existent local path and silently fail. Use evo workspace-op subcommands instead:

bash
evo bash --exp-id <YOUR_EXP_ID> "<command>"
evo read --exp-id <YOUR_EXP_ID> <path>
evo write --exp-id <YOUR_EXP_ID> <path> --content "<text>"   # or pipe via stdin
evo edit --exp-id <YOUR_EXP_ID> <path> --old "<s>" --new "<s>" [--replace-all]
evo glob --exp-id <YOUR_EXP_ID> "<pattern>" [--path <dir>]
evo grep --exp-id <YOUR_EXP_ID> "<pattern>" [--path <dir>]

--exp-id is required on every workspace op. The orchestrator gives you your exp_id at the start of the brief; pass it on every call. The check is strict by design: multiple subagents run concurrent experiments in different containers, and a silent default would let one subagent operate on another's container by accident.

For multi-line edits, evo edit --json-stdin reads {"old":...,"new":...,"replace_all":bool} from stdin (avoids shell escaping for newlines / quotes).

You may edit anything within the target scope. Do NOT modify benchmark, gate, or framework code.

4. Verify the experiment design (pre-evo run)

Before evo run burns compute, invoke the evo verifier subagent via your host's Task tool. Static analysis, ~30s.

Task(subagent_type="evo:verifier",
     prompt="workspace=<workspace abs path>\nexperiment_id=<your exp_id>\nphase=pre")

The verifier checks for test-set leakage in your training data, subsetted eval commands, missing gates for new artifacts, generic hypotheses, and concurrent-resource conflicts. It returns a JSON report ({passed, verdict, findings}) and writes the same verdict as an evo annotation on the experiment. See plugins/evo/agents/verifier.md for the full check list.

If the verifier returns passed: false (verdict fail), address every flagged block finding and re-invoke until it returns passed: true. Skipping or fudging a fail verdict is a stop-the-line bug -- the verdict is the precondition for compute spend.

If the verifier returns verdict warn, you may proceed but address the warnings in your annotation (step 7).

5. Run the experiment

bash
evo run <exp_id>

This runs benchmark + gate and prints the result.

For noisy or replicated benchmarks, one evo run must represent the user's decision statistic for the idea. If the brief, user, or .evo/project.md says n=3, n=10, median, mean, held-out, or cross-dataset evaluation is required, use the configured grouped benchmark path so the experiment records that aggregate score. Do not create separate evo experiments for replicates, and do not report or promote an idea by its best single replicate.

In remote-backend workspaces, if a prior evo run <exp_id> was interrupted or the experiment is still active, run evo run <exp_id> again first. That is the recovery path: evo will try to attach to the existing remote process and finalize the same attempt instead of starting attempt 002. If the output prints RECOVERING <exp_id> attempt=N process=... state=..., wait for that command to finish. Do not discard the active experiment or create a replacement unless evo reports it is unrecoverable or the orchestrator explicitly tells you to.

Benchmarks also receive EVO_CHECKPOINT_DIR. Expensive benchmarks should write portable progress files there. evo mirrors that directory back into attempts/NNN/checkpoints/ during remote runs and records phase progress in attempt_state.json. This is the recovery boundary for container death: evo can restart from benchmark-owned checkpoint files, but it does not freeze/restore an arbitrary Linux process.

Declare reusable outputs as artifacts (any category). If your experiment produces an expensive, reusable output — a checkpoint, an adapter, a built index, a compiled prompt, anything — write it to EVO_CHECKPOINT_DIR (durable: it survives between-attempt cleanup and discard) and name it in the benchmark result's artifacts field: {"score": ..., "artifacts": {"<label>": "<path>"}}. Declared artifacts are preserved when the node is discarded, so a later experiment can reuse them via evo new --from-artifact <exp[:label]> (the path arrives as EVO_SEED_ARTIFACT). Never hardcode a name like final_model/ — the label is whatever your recipe declares. If a run is clearly heading toward failure mid-flight (divergent loss, projected budget blow-out, a known-failure signature), it can be stopped with evo abort <id> — that kills the driver and its subprocess tree, and a partial artifact already written to EVO_CHECKPOINT_DIR survives for reuse.

If the workspace was initialized with commit_strategy=tracked-only (the default for --backend pool): evo run only commits modifications to tracked files. New files require an explicit git add from inside the worktree, then a shisa-kanko ack on the run command:

bash
# inside the worktree -- only for new SOURCE files you want in the commit:
cd <worktree_path> && git add path/to/new_file.py

# then, from the main repo:
evo run <exp_id> --i-staged-new-files yes

The ack flag is required when the worktree has any untracked, non-gitignored file. Without it, evo run errors closed and lists the files. For each file, decide: source (then git add) or warm state (leave untracked -- it persists in the slot for future experiments). Then re-run with --i-staged-new-files yes. The flag value must be exactly yes. In commit_strategy=all workspaces (default for --backend worktree) the flag is a silent no-op; safe to always pass.

6. Analyze the result

evo run prints one of three outcomes:

  • COMMITTED (score improved + gates passed): node locked in. Read failing task traces to find the next weakness. Use this experiment as the parent for your next iteration.

  • EVALUATED (score regressed or gate failed): ran cleanly but bad outcome. You decide next step. Read:

    • experiments/<id>/attempts/NNN/outcome.json -- structured record: score vs parent_score, per-gate passed/returncode, benchmark result, error. Tells you what broke.
    • experiments/<id>/attempts/NNN/diff.patch and benchmark.log -- tell you why.

    Then either:

    • Fixable edit-bug (off-by-one, wrong signature): edit the worktree and evo run <id> again. Bounded by max_attempts (default 3). Before retrying, compare your planned edit against the previous attempts' outcome.json on this same node -- if two earlier attempts hit the same gate, a small tweak won't fix it. When the cap is hit, run is refused -- you must discard.
    • Otherwise discard, and classify why with --failure-class so the orchestrator can route reuse vs branch:
      • eval — the produced artifact is good but the scoring / serving / decode config is wrong. Make sure the artifact was declared + preserved; a sibling can retest it in seconds via evo new --from-artifact <id> (arrives as EVO_SEED_ARTIFACT) instead of rebuilding. evo discard <id> --reason "..." --failure-class eval.
      • build — the artifact-production step itself broke. Fix it, then retry/resume from the last checkpoint in EVO_CHECKPOINT_DIR rather than rebuilding from scratch. evo discard <id> --reason "..." --failure-class build only if you're abandoning this node.
      • hypothesis — it ran clean but didn't help. evo discard <id> --reason "..." --failure-class hypothesis and branch a new experiment from the original parent (a different direction, not a retry of the same idea).
  • FAILED (infra error, non-zero exit, timeout): couldn't evaluate. Doesn't consume the retry budget.

    • Transient / fixable locally: retry.
    • remote_infra_failure:...: remote container or agent infrastructure failed. Report it to the orchestrator unless your brief explicitly says to retry infra failures.
    • Structural (benchmark broken, evo misconfigured): report to orchestrator and stop.
    • Not worth fixing: evo discard <id> --reason "...".

6b. Review your own failures (committed experiments only)

After a COMMITTED outcome, before annotating yourself, spawn evo:benchmark-reviewer in review-experiment mode. It reads the per-task traces and the eval-runner log you just produced, classifies failures into a small taxonomy, and writes per-task annotations via evo annotate <exp> --task K. This is the data the next experiment's hypothesis is built on -- skip it and the orchestrator picks a frontier from passed/failed booleans with no diagnosis.

Task(subagent_type="evo:benchmark-reviewer",
     prompt="mode=review-experiment\nworkspace=<workspace path>\nexperiment_id=<your exp_id>")

The returned JSON includes failure_breakdown, top_failure_pattern, and next_step_signal. Read it, include the breakdown + top pattern in your final handoff message, but do not act on next_step_signal yourself -- it's a hint for the next experiment, which isn't yours to design.

Skip this step for EVALUATED (regressed, will be discarded), FAILED (infra error), or DISCARDED outcomes -- there's no meaningful per-task data worth classifying.

7. Annotate

bash
evo annotate <exp_id> "<what you changed, what happened, and why>"

Always annotate so other agents can learn from your experiments.

7b. Add gates for fixed behaviors

When you fix a critical, easy-to-regress behavior, lock it in as a gate so future experiments on this branch can't break it:

bash
evo gate add <exp_id> --name "social_eng_resistance" --command "python3 {worktree}/benchmark.py --target {target} --task-ids 3 --min-score 0.9"

Good candidates: a specific benchmark task that was hard to fix, a test for a critical policy rule, a smoke test for a fragile behavior. The gate command must exit non-zero when the protected behavior regresses; a bare benchmark invocation that prints a low score but exits 0 is decorative and should not be registered. Do NOT gate every passing task -- that over-constrains the search.

8. Decide: continue or stop

Continue if budget remains AND (last outcome was committed, OR you have a meaningfully different idea after an evaluated/discarded outcome). When continuing after a committed experiment, update your parent to the newly committed ID.

Stop if budget exhausted, infra failure, or you've exhausted variations with no improvement.

9. Report evo-side feedback when evo itself blocked you

Use feedback for evo product/orchestration issues, not for ordinary bad experiments. Good triggers: confusing evo run behavior, remote workspace commands that were hard to recover from, verifier handoff problems, missing state that prevented you from following the brief, or a policy/gate that blocked the wrong thing. The command is anonymous and no-ops when telemetry is off.

Keep it public-safe and reproducible. Do not include repo names, company names, file paths, commands, prompt text, raw logs, URLs, secrets, dataset names, or exact task examples.

bash
evo telemetry feedback \
  --exp-id <YOUR_EXP_ID> \
  --kind orchestration \
  --phase subagent \
  --summary "Remote experiment recovery was unclear after the run process detached." \
  --expected "Re-running evo run should clearly say whether it resumed or needs a fresh experiment." \
  --actual "The subagent could not tell whether the active attempt was recoverable." \
  --repro "Use a remote backend, interrupt a long-running experiment, then ask a subagent to continue the same exp_id." \
  --tag remote-backend --tag recovery --tag subagent

Enriching traces

Check .evo/meta.json for "instrumentation_mode" ("sdk" or "inline") to see which style the benchmark uses -- stay consistent with that choice across iterations; do not flip styles mid-run.

Trace quality is part of the benchmark contract. After a failed baseline or failed task, the orchestrator should be able to reconstruct what happened using only evo traces <exp_id> <task_id>. If not, the trace logging is too thin.

  • SDK mode (from evo_agent import Run): read plugins/evo/skills/references/agent-sdk-reference.md, then enrich traces by adding run.log(task_id, ...) calls or extra fields to run.report().
  • Inline mode (benchmark has local log_task/logTask helpers): add fields to the trace dict built inside log_task().
  • LLM / agent benchmarks: log the task input, observation/frame summary, prompt or message summary, model/tool response, selected action, retries/errors, and final task outcome. If the project already has a separate recorder, decide whether evo traces mirror the important fields or whether the recorder artifact is explicitly linked from the evo trace.

The trace format is forward-compatible -- extra fields are preserved. Do NOT change the score computation or gate logic -- only add observability.

Reuse expensive intermediates

If your experiment needs an artifact that is slow to produce and stable across sibling/descendant experiments -- curated/tokenized datasets, fine-tuned weights or adapters, embeddings, retrieval indexes, precomputed eval generations, large compiled assets -- check .evo/cache/ (workspace-level, sibling to run_<NNNN>/) before recomputing. Write back what you compute, keyed by every input that changes the artifact (recipe version, source, parameters). The next experiment that asks for the same artifact reads from disk instead of rebuilding from scratch.

.evo/cache/ is already gitignored via the workspace's .evo/ exclude and is not touched by evo new / evo run / evo reset. Anti-pattern: writing the artifact inside your experiment's worktree -- it's worktree-local, doesn't propagate to descendants, and disappears on cleanup. The full read-or-compute pattern (workspace-root lookup, cache-key construction, deferring to the per-user HF cache where relevant) is in the finetuning skill under "Cache expensive intermediates." Apply it in any domain where the artifact shape fits.

Rules

  • Do NOT run evo init or evo reset
  • evo discard <your_exp_id> --reason "..." is your explicit "abandon" action — use it for any non-committed node you've decided not to pursue further (pre-run realization, evaluated with a bad hypothesis, or unfixable infra failure). Discard deletes the worktree and branch; the node and its per-attempt artifacts stay in .evo/ as a record of what was tried.
  • If evo discard errors with "cannot discard committed node ... use prune" — the experiment cleared the gate and improved the score. You shouldn't be discarding it. Don't fight the error; the orchestrator owns committed-lineage decisions via evo prune --exhausted or evo prune --invalid.
  • If you discover a committed result is invalid (bad score calculation, benchmark gaming, weakened/deleted tests, failed inherited gate, or failed repro), report the exact node and evidence. Do not discard it; the orchestrator should mark it with evo prune <id> --invalid --reason "..." and add --yes only if evo says the node is on the current best spine.
  • If evo discard errors with "cannot discard active node ... pass --force" — the run is still in flight. Wait for it to finish; don't --force unless you know what you're doing (the running process can still write a final outcome that contradicts the discard).
  • If evo discard errors with "cannot discard ... has non-discarded children" — sibling/child experiments depend on this node's parent reference. Discard or commit-and-prune those first.
  • Do NOT copy .env files, bake secrets into source, or hard-code local runtime paths. Runtime setup/env is configured by the orchestrator (evo config runtime ..., evo env ...) and injected into benchmark/gate processes. If a missing dependency, setup step, or key blocks evaluation, report setup failure.
  • Always annotate your experiments, especially before discarding — the annotation is what persists after the worktree is gone.
  • Stay within your brief's objective and boundaries -- don't drift into unrelated changes

When Done

Return a structured summary:

## Results
- Experiments: <list of exp IDs with scores and status>
- Best: <exp_id> with score <N>

## Changes
- <what you changed in each experiment, briefly>

## Learnings
- <what failure patterns you observed>
- <what worked and what didn't>

## Suggestions
- <ideas for the next round that you didn't get to try>

Frequently asked questions

What does the Subagent AI skill do?

Protocol that evo optimization subagents follow when dispatched from /optimize. Auto-loaded by spawned subagents via their host's skill loader. The orchestrator may also invoke this skill to understand the brief shape its dispatched subagents expect + what they're required to emit -- useful when writing briefs or debugging a subagent's behavior.

Why use Subagent on TypingMind?

Because you install it once and use it with any model. Subagent is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Subagent in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/evo-hq/evo/tree/main/plugins/evo/npm/skills/subagent. TypingMind reads its SKILL.md and installs it as a skill you can enable per chat.

Which AI models can use Subagent?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Subagent?

As many as you like. As long as a model supports skills, you can use Subagent with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Subagent AI skill free?

Yes. It is published on GitHub by evo-hq under the Apache-2.0 license. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇