Agent skill

Writing Agents

by xiaolai in xiaolai/nlpm

How to write Claude Code agents: example blocks, model choice, least-privilege tools.

ISCAuto-check passedAI & LLM Engineering

Install Writing Agents

skills CLI
$ npx skills add xiaolai/nlpm --skill writing-agents -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install xiaolai/nlpm writing-agents --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/xiaolai/nlpm.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/nlpm/writing-agents .claude/skills/writing-agents && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
writing-agents
GitHub stars
148
Token cost
~3k tokens
SKILL.md length
984 words
Files
1
Skills in repo
15
Repo updated
First seen
Licence
ISC

At a glance

How to write Claude Code agents: example blocks, model choice, least-privilege tools.

  • Works in 7 steps: Example Blocks Make or Break Triggering → Model Selection → Tool Least-Privilege → …
  • AI & LLM Engineering work in your project
  • SKILL.md covers 1. Example Blocks Make or…, 2. Model Selection, 3. Tool Least-Privilege and 4. Output Format, plus 3 more sections
  • Instructions only: no scripts, shell commands, URLs or credentials in SKILL.md

What it does

Writing Agents is an agent skill from xiaolai/nlpm. How to write Claude Code agents: example blocks, model choice, least-privilege tools.

Its SKILL.md is about 3k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in AI & LLM Engineering. The repository describes itself as: Natural-Language Programming Manager — scan, lint, and score NL artifacts with Claude-native quality scoring. The licence is ISC.

When your agent uses it

  • AI & LLM Engineering work in your project

Example prompts

  • “/writing-agents”

Workflow steps

7 steps, taken from the step headings in SKILL.md.

  1. Example Blocks Make or Break Triggering
  2. Model Selection
  3. Tool Least-Privilege
  4. Output Format
  5. System Prompt Structure
  6. Worked Example
  7. Common Mistakes

What it can do on your machine

Read from SKILL.md and the folder at commit 307328b. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    No scripts in the folder and no shell commands in SKILL.md (its code samples are markdown, xml and yaml).

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Writing Agents loads about 3k tokens when it runs. Until then it costs about 25 tokens; SKILL.md has 984 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~25
When it runs · the whole SKILL.md, loaded when a task matches
~3k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from xiaolai/nlpm at commit 307328b, republished under its ISC licence (© xiaolai). 984 words, ~3,012 tokens.

Download SKILL.mdSave it as .claude/skills/writing-agents/SKILL.md (or your agent's skills folder).
name
writing-agents
description
How to write Claude Code agents: example blocks, model choice, least-privilege tools.
version
0.2.0
user-invocable
false

Writing Agents

Scope: covers Claude Code agent .md file authoring (Markdown + frontmatter at .claude/agents/). Codex CLI defines agents differently — as [agents.<name>] TOML tables in .codex/config.toml; see [[nlpm:conventions-codex]]. Antigravity subagents are under-documented at this writing; see [[nlpm:conventions-antigravity]]. For multi-agent orchestration, see [[orchestration]]. For plugin architecture, see [[writing-plugins]].

1. Example Blocks Make or Break Triggering

Without <example> blocks, Claude guesses when to dispatch your agent. With them, it pattern-matches against real scenarios.

Target: 1 well-chosen example + 1 "Not for …" sentence, whole description ≤1,200 characters.

The description sits in the Agent tool's text on every turn and is the only thing Claude sees when choosing an agent. Examples therefore stay in the description -- moved into the body, they are invisible to routing -- but every extra example is always-on context. One example that shows the main positive trigger, trigger phrases in the prose, and an explicit exclusion carry the routing signal at a fraction of the tokens.

Example Block Anatomy
xml
<example>
Context: [what the user is doing -- not just "user needs help"]
user: "[realistic user message that should trigger this agent]"
assistant: "[what Claude says when dispatching -- shows the decision logic]"
</example>
Bad Example (too vague -- 40% trigger accuracy)
xml
<example>
Context: User needs code review
user: "review my code"
assistant: "I'll use the reviewer agent."
</example>

Problems: generic context, generic query, no decision logic shown.

Good Example (specific scenario -- 92% trigger accuracy)
xml
<example>
Context: User just pushed changes to the authentication module and wants feedback before merging
user: "Can you check if the auth changes look good before I create the PR?"
assistant: "I'll dispatch the security-reviewer agent to check the auth changes for vulnerabilities, token handling, and session management best practices."
</example>

Why it works: specific context (auth module, pre-PR), realistic query (how users actually talk), decision logic visible (what the agent will check).

One Example, Prose Triggers, One Exclusion
PartPurposeWhat it carries
Prose trigger phrasesBreadthObvious, edge-case and non-obvious triggers, one short phrase each
1 <example>AnchorThe main positive trigger: user asks, assistant dispatches
"Not for …" sentenceBoundaryThe adjacent request that belongs to a sibling agent or to no agent

Example for a "performance-profiler" agent:

yaml
description: |
  Profiles slow endpoints, memory growth and query plans. Use when a request is
  slow, memory climbs over time (possible leak), or the user is choosing between
  two implementations on speed. Not for fixing the code it measures; it reports
  hot spots only.

  <example>
  Context: User wants to profile their API
  user: "Profile the /api/users endpoint, it's slow"
  assistant: "I'll dispatch the performance-profiler to trace the /api/users endpoint..."
  </example>

A second example is allowed when a distinct trigger cannot be said in prose, but it costs context on every turn; nlpm's R09 gives full credit for one.

2. Model Selection

Task typeModelSignal words in bodyExamples
Mechanical / parsing / formatting / countinghaikucount, list, extract, format, parse, scanscanner, parser, formatter, counter, lister
Analysis / reasoning / moderate judgmentsonnetanalyze, review, evaluate, summarize, comparelinter, reviewer, extractor, summarizer
Complex judgment / orchestration / multi-agentopuscoordinate, decide, assess, synthesize, architectQC coordinator, architect, strategy planner
Quick Heuristic

Count the instruction lines in your agent body. Then check for judgment words.

< 20 instruction lines AND no judgment words → haiku
20-50 instruction lines OR judgment words → sonnet
> 50 instruction lines OR coordination logic → opus

Judgment words: evaluate, decide, assess, determine, weigh, prioritize, recommend, judge, infer, synthesize.

Cost Impact
ModelRelative costWhen to upgrade
haiku1xAgent produces wrong output on edge cases
sonnet10xAgent produces wrong output on easy cases
opus30xAgent coordinates other agents or makes architectural decisions

Rule: start with haiku, upgrade only when output quality requires it.

3. Tool Least-Privilege

Only list tools the agent body actually references. Every extra tool is a potential misuse vector.

Common Mistakes
Agent typeCommon over-grantCorrect tools
Audit/review agentWrite, Edit, BashRead, Glob, Grep
Code generatorRead, Grep (unused)Write, Edit, Bash
OrchestratorRead, Write (does no IO)Task
ScannerBash (uses grep)Grep, Glob, Read
Tool Reference
ToolWhen to include
ReadAgent reads file contents
WriteAgent creates new files
EditAgent modifies existing files
GlobAgent searches for files by pattern
GrepAgent searches file contents
BashAgent runs shell commands (linters, tests, builds)
TaskAgent dispatches sub-agents
WebFetchAgent fetches a URL

4. Output Format

Every agent MUST define its output format in the body. Without it, output varies between invocations -- making results unparseable by parent agents.

Pattern: Structured Report
markdown
## Output Format

### {Section Title}
| Column1 | Column2 | Column3 |
|---------|---------|---------|
| ...     | ...     | ...     |

### Summary
- Total items: {N}
- Issues found: {N}
- Pass/Fail: {verdict}
Pattern: Severity-Tagged Findings
markdown
## Output Format

For each finding, output:

**[SEVERITY] Finding title**
- File: `path/to/file`
- Line: {N}
- Finding: {description}
- Fix: {concrete suggestion}

Severity levels: CRITICAL > HIGH > MEDIUM > LOW > INFO
Pattern: Pass/Fail Gate
markdown
## Output Format

Final line must be exactly one of:
- `PASS: All checks passed`
- `WARN: {N} warnings found (see above)`
- `FAIL: {N} errors found (see above)`

5. System Prompt Structure

Order matters. Claude reads top-to-bottom and front-loads early instructions.

The Five Sections
markdown
## Mission
[1-2 sentences: what this agent does and WHY it exists]

## Instructions
1. [First step]
2. [Second step]
3. [Third step]
...

## Boundaries
- Do NOT [thing that would be harmful]
- Do NOT [thing that's out of scope]
- If [ambiguous situation], then [explicit resolution]

## Output Format
[Exact template -- see section 4 above]

## Error Handling
- If no files found: report "No matching files" and exit
- If tool fails: report the error and continue with remaining work
- If scope is unclear: analyze the narrower interpretation
Show full SKILL.md (411 more words)Show less
Section Sizing
SectionTarget linesOver-budget signal
Mission2-3More than one paragraph
Instructions5-15More than 20 numbered steps
Boundaries3-7More than 10 "Do NOT" items
Output Format5-15Defining more than 3 output sections
Error Handling3-5More than 5 error cases

Total agent body: aim for 25-45 lines. Over 60 lines means the agent is doing too much -- split it.

6. Worked Example

Before (score 43/100)
yaml
---
name: code-checker
description: Check code
model: opus
tools: [Read, Write, Edit, Bash, Grep, Glob, Task]
---
markdown
You are a code checker. Check the user's code for issues.
Look at the files and find problems. Report what you find.

Problems (each scored line is a row in the nlpm:scoring Agents table):

  • R09 -- zero <example> blocks in the description: unreliable triggering (-15)
  • R09 -- no "Not for" clause: nothing tells routing what to rule out (-5)
  • R10 -- opus for a review task that sonnet handles (-5)
  • R11 -- Write, Edit, Bash, Task declared but no body step uses them (-3 each, -12)
  • R11 -- a review agent declares Write and Edit (-10)
  • R12 -- no output format: inconsistent results (-10)
  • Description has 0 trigger phrases and no "Use when..." (not scored for agents; R04 is a skills row, but routing still suffers)
  • No boundaries and no error handling (not scored; they cause scope creep and silent failures)

Total: -57, so 100 - 57 = 43.

After (score 100/100)
yaml
---
name: code-checker
description: |
  Static analysis agent — checks code for bugs, type errors, and anti-patterns.
  Use when reviewing code quality, running pre-commit checks, validating changes
  before PR, or scanning a module suspected of a production defect. Not for style
  issues (defer to the linter) or for fixing code; it reports only.

  <example>
  Context: User just finished implementing a new feature and wants a quality check
  user: "Check the auth module for any bugs before I push"
  assistant: "I'll dispatch the code-checker agent to analyze src/auth/ for bugs, type errors, and anti-patterns."
  </example>
model: sonnet
tools: [Read, Glob, Grep]
---
markdown
## Mission
Analyze source code files for bugs, type errors, and anti-patterns.
Produce a structured report with severity-tagged findings.

## Instructions
1. Use Glob to discover files matching the target pattern
2. Use Read to examine each file
3. Use Grep to cross-reference imports and usage patterns
4. For each finding, classify severity and provide a concrete fix
5. Produce the output report

## Boundaries
- Do NOT modify any files (read-only analysis)
- Do NOT run shell commands
- Do NOT report style issues (defer to linter)
- If no target pattern specified, analyze all files in src/

## Output Format

For each finding:

**[SEVERITY] Finding title**
- File: `path/to/file`
- Line: {N}
- Finding: {description}
- Fix: {concrete fix}

Final line:
- `PASS: No issues found`
- `WARN: {N} warnings found`
- `FAIL: {N} errors found`

## Error Handling
- If no files match the pattern: report "No matching files for pattern: {X}"
- If a file cannot be read: skip it and note in the report

Changes made (one per problem above):

  1. R09: added 1 <example> block in the description (+15)
  2. R09: added a "Not for" clause -- style issues and fixing code (+5)
  3. R10: opus -> sonnet (analysis-tier task: reasoning, not orchestration) (+5)
  4. R11: tools 7 -> 3; Glob, Read and Grep are each named by an instruction step (+12)
  5. R11: dropped Write and Edit from a read-only review agent (+10)
  6. R12: defined the output format (+10)
  7. Description: 0 -> 6 trigger phrases and a "Use when" sentence (not scored)
  8. Added boundaries and error handling (not scored)

Total: +57, so 43 + 57 = 100.

7. Common Mistakes

MistakeImpactFix
No examples40% trigger accuracyAdd 1 specific scenario example + a "Not for" sentence
3-4 examples in the descriptionAlways-on context on every turnKeep the best one; move trigger phrases into the prose
Opus for mechanical work30x cost for same resultUse haiku for parsing, sonnet for analysis
All tools grantedAgent writes when it should only readList only tools the body references
No output formatDifferent format each runDefine exact output template
Body over 60 linesAgent is doing too muchSplit into focused sub-agents
"Be thorough" in bodyMeaningless fillerReplace with specific instructions
No error handlingSilent failuresAdd 3-5 error cases with resolution

© xiaolai, ISC. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in skills/nlpm/writing-agents of xiaolai/nlpm.

Open the folder on GitHubat commit 307328b

Compare with similar skills

Writing Agents next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Writing Agents compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Writing Agents this skillxiaolai/nlpm148—~3kAutomated safety check: PassISC
Agent BuildershareAI-lab/learn-claude-code78k5 repos~1.2kAutomated safety check: PassMIT
Add Uint Supportpytorch/pytorch104k2 repos~2.3kAutomated safety check: PassCustom licence
LLM Benchmarking with lm-evaluation-harnessOrchestra-Research/AI-Research-SKILLs13k8 repos~3kAutomated safety check: PassMIT
Segment Anything Model GuideOrchestra-Research/AI-Research-SKILLs13k8 repos~3.3kAutomated safety check: PassMIT
1passwordtrpc-group/trpc-agent-go1.9k14 repos~656Automated safety check: PassApache-2.0

Similar skills

  • Agent Builder

    shareAI-lab/learn-claude-code

    Design and build AI agents for any domain. An agent skill from shareAI-lab/learn-claude-code.

    78k GitHub starsUsed in 5 repos~1.2k tokens
    AI & LLM EngineeringAuto-check passed
  • Add Uint Support

    pytorch/pytorch

    Add unsigned integer (uint) type support to PyTorch operators by updating ATDISPATCH macros.

    104k GitHub starsUsed in 2 repos~2.3k tokens
    AI & LLM EngineeringAuto-check passed
  • LLM Benchmarking with lm-evaluation-harness

    Orchestra-Research/AI-Research-SKILLs

    Runs lm-evaluation-harness to benchmark language models on academic suites such as MMLU, GSM8K and HumanEval, compare models and track training checkpoints.

    13k GitHub starsUsed in 8 repos~3k tokens
    AI & LLM EngineeringAuto-check passed
  • Segment Anything Model Guide

    Orchestra-Research/AI-Research-SKILLs

    Guide to using Meta's Segment Anything Model for zero-shot image segmentation with point, box or mask prompts, or automatic mask generation.

    13k GitHub starsUsed in 8 repos~3.3k tokens
    AI & LLM EngineeringAuto-check passed
  • 1password

    trpc-group/trpc-agent-go

    Set up and use 1Password CLI (op). An agent skill from trpc-group/trpc-agent-go.

    1.9k GitHub starsUsed in 14 repos~656 tokens
    AI & LLM EngineeringAuto-check passed
  • Planning With Files

    jarrodwatts/claude-code-config

    Transforms workflow to use Manus-style persistent markdown files for planning, progress tracking, and knowledge storage.

    1.1k GitHub starsUsed in 5 repos~967 tokens
    AI & LLM EngineeringAuto-check passed

More from xiaolai/nlpm

All 15 skills in this repo
  • Conventions

    xiaolai/nlpm

    Universal NL conventions: SKILL.md open spec, AGENTS.md, vague quantifiers, naming.

    148 GitHub stars~3.6k tokensUpdated today
    Auto-check passed
  • Antigravity and Gemini CLI artifact schemas: .gemini/ paths, extensions, hooks.

    148 GitHub stars~3.1k tokensUpdated today
    Auto-check passed
  • Conventions Codex

    xiaolai/nlpm

    Codex CLI artifact schemas: config.toml, .codex-plugin, skills, hooks, AGENTS.md.

    148 GitHub stars~4.9k tokensUpdated today
    Auto-check passed
  • Orchestration

    xiaolai/nlpm

    Multi-agent workflow patterns: parallel dispatch, pipelines, QC gates, retries.

    148 GitHub stars~3k tokensUpdated today
    Auto-check passed
  • Patterns

    xiaolai/nlpm

    NL artifact anti-patterns: vague quantifiers, bare prohibitions, oversized skills.

    148 GitHub stars~3.9k tokensUpdated today
    Auto-check passed
  • Scoring

    xiaolai/nlpm

    100-point NL artifact rubric: penalty tables per artifact type, calibration cases.

    148 GitHub stars~5.3k tokensUpdated today
    Auto-check passed

Questions about Writing Agents

What does Writing Agents do?

How to write Claude Code agents: example blocks, model choice, least-privilege tools. Writing Agents is an agent skill from xiaolai/nlpm. How to write Claude Code agents: example blocks, model choice, least-privilege tools.

When should I use Writing Agents?

Writing Agents fits situations like: AI & LLM Engineering work in your project.

How do I install Writing Agents in Claude Code?

Run `npx skills add xiaolai/nlpm --skill writing-agents -a claude-code`. Or copy the skill folder (skills/nlpm/writing-agents in xiaolai/nlpm) into .claude/skills/writing-agents in your project. Claude Code loads it when a task matches its description.

How do I install Writing Agents in Codex?

Run `npx skills add xiaolai/nlpm --skill writing-agents -a codex`. Or copy the skill folder (skills/nlpm/writing-agents in xiaolai/nlpm) into .agents/skills/writing-agents in your project. Codex loads it when a task matches its description.

Can I use Writing Agents in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add xiaolai/nlpm --skill writing-agents -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/writing-agents, .gemini/skills/writing-agents, .github/skills/writing-agents and .opencode/skills/writing-agents in your project.

What does Writing Agents need to run?

SKILL.md names no scripts, command-line tools or credentials: Writing Agents is instructions for the agent only.

Does Writing Agents access the network?

SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.

Is Writing Agents safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Writing Agents use?

Writing Agents is published under the ISC licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Writing Agents use?

About 3k tokens (SKILL.md is roughly 12k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Writing Agents?

Skills that share tags, products or a category with Writing Agents: Agent Builder (shareAI-lab/learn-claude-code, 78k stars), Add Uint Support (pytorch/pytorch, 104k stars), LLM Benchmarking with lm-evaluation-harness (Orchestra-Research/AI-Research-SKILLs, 13k stars) and Segment Anything Model Guide (Orchestra-Research/AI-Research-SKILLs, 13k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Writing Agents?

xiaolai (a GitHub user) maintains it in xiaolai/nlpm, which has 148 GitHub stars. The repository holds 15 skills in this directory. The repository was last updated on October 9, 2026.

Source: xiaolai/nlpm on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.