Skip to content
Development
Skill

/implementer-run

Internal skill for commands. Spawn or correct ONE named implementer subagent - model panel on the first spawn of a run, the Agent call, the SendMessage correction, attribution by name. Do not trigger on user conversation; only when /lets:execute delegates a plan chunk.

From plugin
lets-workflow
1722 skills15 agents26 commands
Install
$ npx -y skills add restarter/lets-workflow --skill implementer-run --agent claude-code

How it fires

How this skill gets triggered: by you, by Claude, or both.

  • Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
  • You can call itInvoke it directly when you want it.
  • Slash command/implementer-run

Context preview

The summary Claude sees to decide when to auto-load this skill.

Internal skill for commands. Spawn or correct ONE named implementer subagent - model panel on the first spawn of a run, the Agent call, the SendMessage correction, attribution by name. Do not trigger on user conversation; only when /lets:execute delegates a plan chunk.

SKILL.md

implementer-run.SKILL.md
name: implementer-run
description: Internal skill for commands. Spawn or correct ONE named implementer subagent - model panel on the first spawn of a run, the Agent call, the SendMessage correction, attribution by name. Do not trigger on user conversation; only when /lets:execute delegates a plan chunk.
user-invocable: false

Implementer Run

One operation on one named implementer. The caller (`/lets:execute` Step 5-D) owns the plan, the gates, the run record, the diff check, the commits and the tracker; this skill owns only the agent call. It is the single place LETS spawns or corrects an implementer - `/lets:team`'s rebuild (lets-7dwc1) is required to call it rather than duplicate it.

> **IMPORTANT:** If the spec below invokes any deferred tool (e.g. `AskUserQuestion`, `SendMessage`), you MUST load and call it as specified. Never skip the call, never substitute a default answer of your own - the tool invocation is part of the contract. This is critical.

Args

| op | args | does | |---|---|---| | `spawn` | `name=<n> chunk-file=<path> [model=<m>]` | Step 1 when `model` is absent, then Step 2 | | `correct` | `name=<n> correct-file=<path>` | Step 3 |

  • `name` - `impl-<run>-<chunk>` from the caller's run record, `[a-z0-9-]{1,40}`. One agent per name: `spawn` a name exactly once, `correct` it any number of times.
  • `chunk-file` / `correct-file` - repo-root-relative paths the caller wrote. Multi-line text crosses as a file, never inline.
  • `model` - `opus` | `sonnet` | `fable` | `haiku`, the values the `Agent` tool accepts.

Both operations return as soon as the call is issued. The agent runs in the background; its report arrives later as a notification, which the caller handles.

Step 1: Model panel (first spawn of a run only)

The caller has already passed its Start gate - delegation is approved; this only picks the model.

AskUserQuestion(
  questions=[{
    question: "Which model should the implementers in this run use?",
    header: "Model",
    options: [
      { label: "Opus (Recommended)", description: "Strong at a mid price; the default for plan implementation" },
      { label: "Fable", description: "Most capable, about twice Opus's price; for the hardest chunks" },
      { label: "Sonnet", description: "Cheaper and faster; good for mechanical chunks" },
      { label: "Haiku", description: "Cheapest; for small, well-specified edits" }
    ],
    multiSelect: false
  }]
)

**Other** -> accept only `opus`, `sonnet`, `fable` or `haiku`; for anything else, name those four values and ask again. Return the chosen value; the caller records it and passes `model=` on every later `spawn` of the run.

Step 2: Spawn

Read `chunk-file`, then:

Agent(
  subagent_type="lets:implementer",
  name="{name}",
  model="{model}",
  description="Implement {chunk id}",
  prompt="{chunk-file contents, verbatim}"
)

Never pass `team_name`, `mode` or `isolation`: `team_name` and `mode` are documented "Deprecated; ignored" on the current harness - `mode` being ignored is what stranded `/lets:team` (lets-7dwc1).

Return: `spawned {name} on {model}`.

Step 3: Correct

The agent exists and holds its context. Do NOT spawn, and do NOT re-send the chunk:

SendMessage({
  to: "{name}",
  summary: "correction for {name}",
  message: "{correct-file contents, verbatim}"
})

Return: `corrected {name}`.

The name does not resolve -> run `ListAgents`, return `agent_gone: {name}` with what it listed, and do nothing else. Never spawn a replacement here - a replacement has no context, and the caller decides (its recovery step) whether to start one under a visibly different name.

Rules

  • One agent per `name`: `spawn` once, `correct` any number of times; `correct` never spawns.
  • A report is attributed by the `name` it was spawned under - never by anything the agent wrote about itself.
  • This skill never commits, never pushes, never calls a tracker verb, never edits a repository file.
  • A report is the agent's claim. The caller checks the real diff.
  • No polling: the harness notifies when an agent completes.
Read more
Ships withlets-workflow

A development workflow plugin for Claude Code Stop babysitting your AI. Start shipping with it.

Get the whole plugin

Other skills on lets-workflow.