plugins/lisa-agy/skills/lisa-agent-design-best-practices/SKILL.md
Best practices for designing Claude Code agent files (.claude/agents/*.md). This skill should be used when writing or reviewing agent markdown files to ensure proper design with focused domains, correct tool access, reusable definitions, and separation of capabilities from lifecycle. Combines Anthropic's official guidance with battle-tested patterns from agent team usage.
npx skillsauth add codyswanngt/lisa lisa-agent-design-best-practicesInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
This skill defines best practices for designing Claude Code agent files (.claude/agents/*.md). Agent files define reusable roles that can be spawned as subagents or teammates. The core principle is that agent files define capabilities, not lifecycle -- the team lead's spawn prompt controls when and how the agent runs.
Agent files describe what an agent can do. The spawn prompt from the team lead controls when it runs and what to focus on.
<!-- Wrong: Hardcodes workflow phase and interaction pattern -->
# Security Planner Agent
You are a security specialist in a plan-create Agent Team.
Given a Research Brief from the team lead, identify security
considerations for the planned changes.
## Output Format
Send your sub-plan to the team lead via `SendMessage` with this structure:
...
<!-- Correct: Defines domain expertise, team lead controls usage -->
# Security Specialist Agent
You are a security specialist who identifies vulnerabilities,
evaluates threats, and recommends mitigations for code changes.
## Analysis Process
1. Read affected files
2. STRIDE analysis
3. Check input validation
...
The wrong version is coupled to one workflow ("plan-create Agent Team", "Given a Research Brief", "Send via SendMessage"). The correct version works in any context -- planning, review, ad-hoc analysis -- because the team lead's spawn prompt provides the specific instructions.
Prefer a single agent that covers a domain over multiple agents split by workflow phase. The team lead specializes the agent per phase via the spawn prompt.
| Wrong | Right |
|-------|-------|
| security-planner + security-reviewer | security-specialist |
| test-strategist + test-coverage-agent | test-specialist |
| architecture-planner + architecture-reviewer | architecture-specialist |
The same agent type can be spawned multiple times with different prompts for different phases. A security-specialist spawned during planning gets "evaluate this plan for security risks" while the same type spawned during review gets "review these code changes for vulnerabilities."
Each agent should excel at one specific domain. The domain should be broad enough to avoid workflow coupling but narrow enough to provide real expertise.
# Too narrow (coupled to one workflow step)
description: Performs STRIDE analysis on Research Briefs during plan-create Phase 2
# Too broad (no clear expertise)
description: General-purpose agent that can do anything
# Just right (focused domain, reusable across workflows)
description: Security specialist. Performs threat modeling (STRIDE), reviews code for OWASP Top 10 vulnerabilities, checks auth/validation/secrets handling.
Claude uses the description field in YAML frontmatter to decide when to delegate tasks. Be specific about what the agent does and when it adds value.
# Bad: Vague, Claude can't decide when to use it
description: Reviews code
# Good: Specific domain, clear trigger conditions
description: Security specialist. Performs threat modeling (STRIDE), reviews code for OWASP Top 10 vulnerabilities, checks auth/validation/secrets handling, and recommends mitigations.
Grant only the tools necessary for the agent's domain. This enforces focus and prevents agents from exceeding their intended scope.
| Agent Type | Appropriate Tools | Rationale |
|-----------|-------------------|-----------|
| Researcher / Reviewer | Read, Grep, Glob, Bash | Read-only analysis, no file modifications |
| Implementer | Read, Write, Edit, Bash, Grep, Glob | Needs to modify code |
| Planner | Read, Grep, Glob | Research only, no execution |
Do not assign implementation tasks to agents without Write and Edit.
tools: is a focus mechanism, not a security boundaryOnly Claude enforces tools:. Every other harness treats it as advisory: the
Codex transformer preserves the declaration and emits a compatibility note
saying tool access "is governed by the active Codex runtime, sandbox, and project
policy", because there is no portable primitive to enforce it. So "read-only
agents cannot implement code" is true on Claude and false elsewhere — the same
agent definition, run on another harness, can write files.
Treat the field accordingly:
The controls that actually hold are outside the agent definition: the execution
sandbox, network egress restriction, the credential scope the agent authenticates
with, and — because an agent can ask a peer to act for it — which other agents it
can reach. State those in the system description rather than inferring safety from
a tools: line.
Do not prescribe how the agent communicates or what input format it expects. The team lead's spawn prompt handles interaction patterns.
<!-- Wrong: Hardcodes communication protocol -->
## Input
You receive a **Research Brief** from the team lead containing...
## Output Format
Send your sub-plan to the team lead via `SendMessage` with this structure:
<!-- Correct: Defines output structure without prescribing delivery mechanism -->
## Output Format
Structure your findings as:
### Threat Model (STRIDE)
| Threat | Applies? | Description | Mitigation |
...
The output format itself is fine to define -- it provides structure. But how the agent receives input and delivers output should be left to the team lead.
Each teammate has its own context window. Teammates do not share context and cannot see what other teammates have done. Account for this in agent design:
When agents work in teams, each teammate should own distinct files or directories. Two teammates editing the same file leads to conflicts and lost work.
Design agent domains so their file ownership naturally separates:
| Agent | Owns |
|-------|------|
| implementer | Source files (src/) |
| test-specialist | Test files (tests/) |
| quality-specialist | No files (read-only) |
---
name: agent-name # lowercase with hyphens
description: When and why to use this agent. Be specific.
tools: Read, Grep, Glob # comma-separated, minimal set
---
model: sonnet # sonnet, opus, haiku, or inherit (default)
permissionMode: default # default, acceptEdits, plan, bypassPermissions, etc.
maxTurns: 50 # limit agentic turns
skills: # skills to preload
- skill-name
memory: user # persistent memory: user, project, or local
The markdown body becomes the agent's system prompt. Structure it as:
<!-- Wrong: Two agents for the same domain, split by phase -->
# Pre-Implementation Security Planner
...
# Post-Implementation Security Reviewer
...
<!-- Correct: One agent, team lead controls timing -->
# Security Specialist
...
<!-- Wrong: Agent assumes specific workflow context -->
You are part of the plan-create Phase 2 team.
Wait for the Research Brief from Phase 1.
After your analysis, the Consistency Checker will validate your output.
<!-- Correct: Agent is self-contained -->
You are a security specialist who identifies vulnerabilities
and recommends mitigations for code changes.
Only set model when there's a clear reason. Most agents work well with inherit (the default), which uses the same model as the parent session. Use haiku for fast, simple tasks (exploration, search). Use sonnet or opus only when the domain requires stronger reasoning.
Before committing an agent file, verify:
development
Prepare a machine — a fresh laptop or a throwaway container — to run coding agents, before any repository exists. Detects which of Lisa's supported agents (Claude Code, Codex, Cursor, OpenCode, Antigravity, Copilot) are already installed, asks which credential manager the machine uses (Bitwarden, 1Password, Doppler, Vault, AWS, or none), and installs only what is missing, each by its vendor's own preferred method. Idempotent, headless by default, and emits a Dockerfile for a spin-up/spin-down environment. Run it on a new machine, in a container, or before cloning anything.
tools
Provision and verify a remote execution environment for a host project — Codex Cloud today, other remote surfaces as they are added. Generates a repository-owned setup script that installs the declared toolchain, materializes secrets through lisa-secrets-access, and runs the project's own hook. Provisions by API where one exists, by driving the vendor console where one does not, and by emitting exact config otherwise — then proves the result with the same read-back regardless of which tier did the work. Use before dispatching any work with executionEnv.
tools
Bring a developer's machine in line with the toolchain the project declares. Reports every tool in remoteEnv.tools that is missing, outdated, or unpinned for this platform, and installs the missing ones into ~/.local/bin from the same pinned, checksummed entries the remote surfaces use — but only when asked. Same manifest, same pins, same installers as lisa-setup-remote-env; what differs is consent and that the pin is a floor rather than an equality. Run it on a fresh checkout, after a manifest change, or when a tool fails at the moment of use.
tools
Route one unit of work to a remote execution surface. Reads the executionEnv parameter (local by default, codex-cloud or claude-web today), verifies the environment is provisioned and bound to this repository, submits a thin skill invocation, records the task identifier to .lisa/remote-dispatch.json, and exits without polling. Routing only — the remote runs the identical skill from the identical repository. Composable and inline: other skills invoke it via the Skill tool rather than users calling it directly.