prompt-engineering
Core prompt engineering and context engineering best practices for Claude Code prompts.
Installation
Follow the repository instructions for this skill and your agent. Review the files and dependencies before adding it to your workflow.
View source ↗GuidesSkill instructions
<claude_code_prompts>
Claude Code Prompt Types
<command_type>
1. Commands
Purpose: Reusable instruction presets invoked by users with /command-name [args]
Structure:
-
Location:
.claude/commands/<command-name>.md -
Invocation:
/command-name [additional instructions] - Processing: Front matter excluded; body content passed as instructions
Front Matter:
---
description: 'Brief description (required, <80 chars, repository's primary language)'
allowed-tools: Bash(git, gh), Read(*), Edit(*.ts), Grep # optional but recommended
---
allowed-tools formats: ToolName(*), Bash(git), Bash(git, gh), Edit(*.ts), Write
- Multiple tools: comma+space separated
- Default-allowed tools (can omit):
TodoWrite,Task,Glob,Grep,Read
Audience: description → user (project language); body → LLM worker (English)
</command_type>
<agent_type>
2. Agents
Purpose: Specialized sub-agents invoked via Task tool or @agent-name
Structure:
-
Location:
.claude/agents/<agent-name>.md -
Invocation:
@agent-name [instructions]orTask(subagent_type="agent-name", ...) - Processing: Front matter excluded; body content passed as instructions
Front Matter:
---
name: agent-name # must match filename without .md
description: 'Brief agent description'
model: sonnet # or haiku, or inherit (use caller's model)
color: cyan # terminal display color
skills: # optional: auto-load skills when agent starts
- typescript
- react
---
skills field:
- Skills listed here are automatically loaded when the agent is invoked
- No need for manual
Skill(...)calls or "Enable the X skill" instructions in body - Use this for skills the agent ALWAYS needs (not conditionally)
- For dynamic/conditional skill loading, use
Skill(...)tool in the prompt body
Audience: Both caller (orchestrator LLM) and executor (sub-agent LLM) are LLMs
- Always English
- No orchestrator concerns (when to invoke, what to do with output)
- Focus on capability grant and input/output contract </agent_type>
<skill_type>
3. Skills
Purpose: Reusable knowledge/guidelines loaded into sessions
Structure:
-
Location:
.claude/skills/<skill-name>/SKILL.md - Invocation: Skill tool or auto-loaded based on description
- Processing: Front matter excluded; body injected into context
Front Matter:
---
name: skill-name # must match directory name
description: 'When this skill should be enabled'
---
Audience: Any LLM (main session, orchestrator, or sub-agent)
- Grant knowledge/capability, not orchestrate workflows
- Principles, best practices, rules (not "first do X, then Y")
- Reproducible, interpretation-stable content </skill_type>
<document_type>
4. Documents
Purpose: Standalone prompts not tied to command/agent system
Structure:
-
Location: User-specified (e.g.,
docs/prompts/<name>.md) - Invocation: Manual reference or inclusion
- Processing: No front matter; entire content is the prompt </document_type>
<context_files>
5. Context Files (CLAUDE.md, GEMINI.md, AGENTS.md, etc.)
Purpose: Project-wide or global context that is automatically loaded in every session
File Structure:
-
Location:
- Project:
.claude/CLAUDE.md,.gemini/GEMINI.md,.claude/AGENTS.md - Global:
~/.claude/CLAUDE.md,~/.gemini/GEMINI.md,~/.claude/AGENTS.md
- Project:
- Processing: Entire content is injected into every session's base context
- No front matter: Write content directly
Critical Characteristics:
- Always loaded: Read in every single session, regardless of task
- Maximum cost: Context tokens consumed in every interaction
- Minimum content: Only include what 80% of tasks need
IMPORTANT: These are guidelines, not absolute rules. Some projects have unique contexts that justify exceptions. Use judgment, but default to minimalism when uncertain.
Content Principles:
-
Index-first: Pointers to detailed docs, not exhaustive content
- ❌ "Use camelCase for variables, PascalCase for types..."
- ✅ "Coding conventions: docs/coding-style.md"
- Use direct content only if: cannot be discovered, critically affects every task, extremely concise (1-2 lines)
-
80% rule: Only information needed in 80% of tasks
- ✅ Repository structure, key conventions, critical constraints
- ❌ Deployment procedures, testing strategies, specific library usage
-
Abstract/navigational: Materials to find information, not exhaustive details
- ✅ "Database: alembic files in db/migrations/"
- ❌ "To create migration: alembic revision -m 'description'"
-
Command scrutiny: Only commands LLM runs autonomously in typical tasks
- ✅
pnpm build,pnpm test(LLM runs these) - ❌
pnpm dev,docker-compose up(user runs these)
- ✅
Good example:
# Project Context
## Architecture
- Monorepo: pnpm workspaces
- API: packages/api (NestJS), Frontend: packages/web (Next.js)
- Details: docs/architecture/README.md
## Key Conventions
- Branch naming: feature/*, bugfix/* (docs/git-workflow.md)
- Never modify: src/generated/* (auto-generated)
- Testing: Vitest/Playwright (docs/testing.md)
## Critical Constraints
- Database changes require migration (alembic)
- Public API changes require version bump (semver)
Bad example (avoid):
# Project Setup
## Installation
1. Install dependencies: `pnpm install`
2. Set up database: `pnpm db:setup`
...
[Detailed step-by-step procedures, exhaustive architecture details...]
</context_files> </claude_code_prompts>
<core_principles>
Core Principles
<single_responsibility>
Single Responsibility Principle
Like functions in programming - one clear purpose:
- Each prompt (especially agents) should have one well-defined responsibility
- Avoid mixing multiple concerns (e.g., don't mix "setup environment" with "implement code")
- Clear boundaries make prompts composable and maintainable
Example:
- ✅ Agent A: Environment setup only
- ✅ Agent B: Code implementation only
- ❌ Agent C: Setup, implement, review, and deploy (too many responsibilities) </single_responsibility>
<caller_independence>
Caller Independence
Prompts should not know about their caller's context:
- Don't reference "orchestrator", "parent task", or calling patterns
- Focus on: "What do I receive?" and "What do I produce?"
- Users and other agents should be able to invoke the same prompt
- Maximize reusability by keeping prompts context-free
Avoid:
- ❌ "You are invoked by the orchestrator with a task document path..."
- ❌ "After completion, report back to the orchestrator..."
- ❌ "Read the task document to understand what the parent wants..."
Prefer:
- ✅ "Analyze the provided code and identify issues..."
- ✅ "Based on the instructions, design an implementation approach..." </caller_independence>
Red flags:
- Detailed step-by-step procedures (trust the LLM)
- Repetitive examples for multiple languages (choose primary language)
- User-facing instructions (description field handles this)
- Implementation details that should be in CLAUDE.md
<orchestration_patterns>
Orchestration Patterns
When designing prompts for orchestrated workflows with subagents:
<prompt_templates>
Use Prompt Templates for Subagent Invocation
CRITICAL REQUIREMENT: Orchestrators MUST provide explicit invocation templates:
- Include complete prompt templates showing how to invoke subagents with all parameters
- Templates are NOT optional—they are essential for stable, reproducible orchestration
- Keep summaries minimal; let templates convey specifics through concrete examples
- Templates ensure consistency across multiple invocations and make maintenance easier
Why templates are essential:
- Consistency: Same invocation pattern every time, reducing variability
- Reproducibility: Future maintainers can see exact invocation structure
- Clarity: Makes the orchestration contract explicit, not implicit
- Maintainability: Single source of truth for how subagents should be invoked
- Discoverability: New users can understand the pattern immediately
Without templates (❌ Bad):
Invoke the engineer agent to implement the feature.
Problem: Orchestrator must guess parameter structure, leading to inconsistent invocations
With templates (✅ Good):
## Invoking the Implementation Agent
Use this template:
Task(
subagent_type="engineer",
prompt="""
Implement the following feature:
{feature_description}
Requirements:
{requirements}
Acceptance criteria:
{acceptance_criteria}
Follow project conventions and include tests.
""",
description="Implement {feature_name}"
)
</prompt_templates>
<responsibility_split>
Split Responsibilities Between Orchestrator and Subagent
Design principle: Subagents are single-purpose but reusable across many tasks. Task-specific context belongs in the orchestrator's template; responsibility-specific practices belong in the subagent.
Subagent prompt (responsibility-specific, reusable):
- Core practices always needed for this responsibility
- Domain-specific knowledge and constraints
- General workflow for this type of task
- Error handling patterns for this domain
- Quality standards for this responsibility
Orchestrator's invocation template (task-specific, contextual):
- Current task context and background
- Task-specific rules and constraints
- Specific focus areas or priorities for this task
- Integration requirements with other workflow steps
- Project-specific constraints not universally applicable
Example - Code Review Agent:
Subagent prompt (.claude/agents/reviewer.md):
Review code changes for quality and correctness.
Check for:
- Type safety and correctness
- Security vulnerabilities
- Performance issues
- Code style consistency
- Test coverage adequacy
Report issues with:
- Severity level (critical/moderate/minor)
- File path and line numbers
- Specific recommendations
- Priority order (critical first)
Orchestrator's template:
Task(
subagent_type="reviewer",
prompt="""
Review the authentication feature implementation.
Context: Healthcare application handling PHI data under HIPAA.
Additional requirements for this review:
- HIPAA compliance is critical (report violations as critical)
- All database queries must use parameterized statements
- Session tokens must expire within 15 minutes
- Password hashing must use bcrypt with cost factor ≥12
Files to review: src/auth/*.ts
Focus on security and compliance issues.
""",
description="Review auth implementation"
)
</responsibility_split>
<design_questions>
Design Questions for Responsibility Split
When designing orchestrated prompts, ask these questions:
Should this go in the subagent prompt?
- Is this practice always required for this type of task?
- Does this define the agent's core responsibility?
- Would this agent need this knowledge for ANY task it handles?
- Is this domain-specific expertise for this responsibility? → YES: Include in subagent prompt
Should this go in the orchestrator's template?
- Is this specific to the current task or project?
- Does this depend on previous steps in the workflow?
- Is this a temporary constraint or priority?
- Does this require context from the orchestration flow? → YES: Include in invocation template
Examples:
- ✅ Subagent: "Check for type errors and unused variables"
- ✅ Orchestrator: "Focus on the payment module we refactored in the previous step"
- ✅ Subagent: "Report security vulnerabilities with severity levels"
- ✅ Orchestrator: "This handles credit card data—PCI-DSS compliance is critical"
- ✅ Subagent: "Include test coverage for new functionality"
- ✅ Orchestrator: "We're under tight deadline—prioritize happy path tests" </design_questions>
Reusability: Subagents work across different tasks and projects without modification
Maintainability: Task-specific logic lives in one place (orchestrator), not scattered across agent prompts
Clarity: Clear separation makes it obvious what's universal vs. contextual
Consistency: Templates ensure subagents receive consistent, well-formed instructions
Testability: Subagents can be tested independently with different invocation parameters
<orchestration_anti_patterns>
Common Anti-Patterns in Orchestration
❌ Duplicating logic across orchestrator and subagent:
# Subagent prompt
- Follow project coding conventions
- Use TypeScript strict mode
- Never commit secrets
# Orchestrator template
Task(prompt="""
Follow project coding conventions.
Use TypeScript strict mode.
Never commit secrets.
Implement feature X...
""")
Problem: Maintenance burden, inconsistency risk
✅ Keep domain practices in subagent only:
# Subagent prompt
- Follow project coding conventions
- Use TypeScript strict mode
- Never commit secrets
# Orchestrator template
Task(prompt="""
Implement feature X with focus on payment processing logic.
Ensure PCI-DSS compliance for card data handling.
""")
❌ Making subagents too task-specific:
name: implement-user-authentication-with-jwt-and-oauth
Problem: Not reusable, violates single responsibility
✅ Keep subagents generic within their domain:
name: engineer
# Orchestrator specifies: "Implement user authentication using JWT and OAuth"
❌ Passing orchestration context to subagents:
Task(prompt="""
This is step 3 of 5 in the workflow.
After you finish, I will invoke the testing agent.
The architect agent already designed this in step 1.
""")
Problem: Violates caller independence, adds unnecessary context
✅ Provide only task-relevant information:
Task(prompt="""
Implement the authentication feature.
Architecture decisions: See attached design document.
Focus on token generation and validation logic.
""")
</orchestration_anti_patterns>
<orchestration_considerations>
Additional Considerations
Failure Handling:
- Orchestrators should handle subagent failures gracefully
- Define retry strategies for critical tasks
- Provide clear error reporting from subagents back to orchestrators
- Consider fallback strategies for non-critical failures
Template Maintenance:
- Keep invocation templates in one location for easy updates
- When subagent prompts change, review all orchestrator templates
- Document expected inputs/outputs for each subagent </orchestration_considerations> </orchestration_patterns> </core_principles>
<structure_and_clarity>
Structure and Clarity
<xml_tags>
XML Tag Utilization
Structure prompts with XML tags when multiple sections or concepts exist:
-
Recommended tags:
<role>,<scope>,<principles>,<error_handling>,<workflow> -
Attribute usage:
<step_1 name="descriptive_name">,<example type="good"> - Effect: Clear instruction boundaries improve LLM comprehension accuracy </xml_tags>
High cohesion example:
<workflow>
## Basic Flow
**1. Check prerequisites**:
- Verify git repository exists
- Confirm gh CLI is authenticated
- Error if not: Run `gh auth login`
**2. Proceed with task**:
...
</workflow>
Low cohesion example (avoid):
<prerequisites>Verify git repository</prerequisites>
<step_1>Check authentication</step_1>
<errors>If gh fails, run gh auth login</errors>
<information_design>
Information Design
<information_responsibility>
Responsibility Boundaries
What belongs in prompts vs. CLAUDE.md:
CLAUDE.md (project-level, always available):
- Overall architecture and tech stack
- File naming conventions (not just examples - actual rules)
- Project-wide coding standards
- Development workflows
- Tool configurations
Prompts (task-specific):
- Task-specific rules and knowledge
- Workflow for the specific responsibility
- Error handling for this specific task
- Task-specific constraints
Example:
- ❌ In agent: "Check CONTRIBUTING.md or docs/contributing.md for conventions"
- Problem: Guessing file locations is noisy
- Solution: CLAUDE.md should document where conventions are
- ✅ In agent: "Follow project conventions for branch naming"
- The agent trusts conventions are available in base context </information_responsibility>
<extended_thinking>
Extended Thinking Activation
Automatic activation via keywords:
- Use "think harder" for complex reasoning tasks
- Use "ultrathink" for very deep analysis
- Claude Code automatically enables extended thinking mode
- No need to instruct
<think>tag usage
Example:
Review the code changes carefully. Think harder about potential edge cases and security implications.
</extended_thinking>
<avoid_noise>
Avoid Noise
Common sources of noise:
- Multiple language examples (pick primary: Node.js > others for most projects)
- Hypothetical file paths without project confirmation (CONTRIBUTING.md, ARCHITECTURE.md)
- Generic architectural patterns (should be in CLAUDE.md if relevant)
- Detailed procedures the LLM can infer
Example of noisy content (avoid):
Install dependencies:
- Node.js: npm install OR yarn install OR pnpm install
- Python: pip install -r requirements.txt OR poetry install
- Ruby: bundle install
- Go: go mod download
Better (concise):
Install dependencies using project's package manager (detected from lock files).
</avoid_noise> </information_design>
<language_and_format>
Language and Format
<language_rule>
Language Usage Rules
- Prompt body: Write in English (for context efficiency)
-
descriptionfield (commands/agents): Match repository's primary language- Japanese project → Japanese
- English project → English </language_rule>
<format_rules>
Format Rules
-
No h1 headings: Never start with h1 (
#) title - Start prompt content immediately after front matter
- Specify appropriate language for code blocks </format_rules> </language_and_format>
<validation_checklist>
Validation Checklist
Verify before creation/update:
For all prompt types:
- Does not start with h1 heading (
#) - XML tags are properly closed (matching pairs)
- Prompt body is written in English (for context efficiency)
- Error handling is defined for expected failure cases
- Single responsibility: Prompt has one clear purpose
- Caller independent: No references to "orchestrator", "parent", calling context
- Concise: Only essential information included (typically 100-150 lines for agents)
- No noise: Removed redundant examples, hypothetical paths, generic patterns
For commands (.claude/commands/*.md):
- Front matter includes
descriptionfield -
allowed-toolsis defined with correct syntax (optional but recommended)
For agents (.claude/agents/*.md):
- Front matter includes
name,description,model,color -
namefield matches filename (without .md extension) - Appropriate model selected (
sonnetfor complex tasks,haikufor speed,inheritfor caller's model) -
skillsfield used for always-required skills (no manual "Enable X skill" in body) - No "invocation_context" or similar caller-specific sections
For orchestrator prompts (commands/agents that invoke subagents):
- Includes explicit invocation templates for all subagents used
- Templates show complete Task tool usage with all parameters
- Task-specific context is in templates, not duplicated in subagent prompts
- No orchestration workflow details passed to subagents (violates caller independence)
- Subagents are kept generic and reusable within their domain
For documents (custom paths):
- No front matter included (entire content is prompt)
- Location/path is clearly specified in user instructions
For context files (CLAUDE.md, AGENTS.md, GEMINI.md, etc.):
- No front matter included (entire content is context)
- 80% rule: Every piece of information is needed in 80% of tasks
- Index-first: Direct content minimized, pointers to detailed docs used instead
- Abstract/navigational: Provides materials to find information, not exhaustive details
- Command scrutiny: Only commands LLM autonomously runs in typical tasks
- No step-by-step procedures (e.g., "1. Install, 2. Setup, 3. Run...")
- No user-facing workflows (e.g., "Start dev server and open browser")
- Extremely concise (typically <100 lines for project context) </validation_checklist>
<anti_patterns>
Common Anti-Patterns to Avoid
❌ Caller coupling:
You are invoked by the orchestrator with a task document at `.cc-delegate/tasks/<id>.md`.
Read the task document to understand...
✅ Caller independence:
Design an implementation approach based on the provided requirements and context.
❌ Multiple responsibilities:
Agent: setup-and-implement
- Create branch
- Install dependencies
- Implement feature
- Run tests
- Create PR
✅ Single responsibility:
Agent: implement-feature
- Focus solely on implementation
- Assume environment is ready
- Produce working code with tests
❌ Noise and redundancy:
Install dependencies:
- pnpm-lock.yaml exists → run pnpm install
- package-lock.json exists → run npm install
- yarn.lock exists → run yarn install
- Pipfile exists → run pipenv install
- requirements.txt exists → run pip install
✅ Concise abstraction:
Install dependencies using detected package manager (from lock file).
❌ Hypothetical file paths:
Check CONTRIBUTING.md, CONTRIBUTING.txt, docs/CONTRIBUTING.md,
docs/contributing.md, or DEVELOPMENT.md for conventions.
✅ Trust base context:
Follow project conventions (documented in base context).
❌ Context file with exhaustive details:
# CLAUDE.md
## Coding Style
- Variables: camelCase (e.g., userName, itemCount)
- Types: PascalCase (e.g., UserProfile, ItemList)
- Files: kebab-case (e.g., user-profile.ts, item-list.tsx)
- Constants: UPPER_SNAKE_CASE (e.g., API_URL, MAX_ITEMS)
- Functions: camelCase with verb prefix (e.g., getUserName, calculateTotal)
...
[50 more lines of coding style]
✅ Context file with index:
# CLAUDE.md
## Coding Style
See docs/coding-style.md for naming conventions and formatting rules.
## Critical: Never modify src/generated/* (auto-generated)
❌ Context file with user-facing workflows:
## Development Setup
1. Install dependencies: `pnpm install`
2. Start database: `docker-compose up db`
3. Run migrations: `pnpm db:migrate`
4. Start dev server: `pnpm dev`
5. Open http://localhost:3000 in your browser
✅ Context file with LLM-relevant info:
## Development
- Package manager: pnpm (workspaces enabled)
- Database migrations: alembic (db/migrations/)
- Build: `pnpm build`, Test: `pnpm test`
</anti_patterns>
Examples
Read the usage examples in the source repository.
View source ↗Source history
- Indexed on
- 2026-01-20
- Index updated
- 2026-01-26
- Branch
- main
Index and sync dates describe this directory. View the source repository for code history.
GitHub ↗chat Comments (0)
Sign in to join the discussion and leave a comment.
No comments yet. Be the first to share your thoughts!