Part 3 of a 5-part series on building production-grade skills for Claude

Previous: Part 2: Anatomy of a Skill | Next: Part 4: Skill Patterns That Work

The most effective skill creators start by doing the task manually with Claude, iterating until it works, and then extracting the winning approach into a skill rather than beginning with YAML. This part walks through that process.

Step 1: Start With Use Cases, Not Code

Before writing anything, identify 2 to 3 concrete use cases. A well-defined use case looks like this:

Use Case: Project Sprint Planning
Trigger: User says "help me plan this sprint" or "create sprint tasks"
Steps:
  1. Fetch current project status from Linear (via MCP, or Model Context Protocol)
  2. Analyze team velocity and capacity
  3. Suggest task prioritization
  4. Create tasks in Linear with proper labels and estimates
Result: Fully planned sprint with tasks created

Ask yourself four questions:

  • What does a user want to accomplish?
  • What multi-step workflow does this require?
  • Which tools are needed (built-in or MCP)?
  • What domain knowledge or best practices should be embedded?

Step 2: Iterate on a Single Task First

This is the most important advice in the entire guide: iterate on one challenging task until Claude succeeds, then extract the winning approach into a skill.

Open Claude.ai and manually work through your hardest use case, paying attention to where Claude needs guidance, where it makes wrong assumptions, and what instructions produce the best results. This leverages Claude’s in-context learning and gives you faster signal than writing a skill blind.

Once you have a conversation where Claude nails the workflow, you have your skill’s instruction set.

Step 3: Define Success Criteria

Before building, decide what “working” means. These are aspirational benchmarks rather than precise thresholds, and you should accept that there’s a vibes-based element to evaluation.

Quantitative targets:

MetricHow to Measure
Skill triggers on ~90% of relevant queriesRun 10 to 20 test queries, track auto-trigger rate
Completes workflow in X tool callsCompare same task with and without skill, count calls
0 failed API calls per workflowMonitor MCP server logs during test runs

Qualitative targets:

MetricHow to Assess
Users don’t need to prompt about next stepsNote how often you redirect or clarify during testing
Workflows complete without user correctionRun the same request 3–5 times, compare outputs
Consistent results across sessionsCan a new user accomplish the task on first try?

Step 4: Build the Skill

Now write it. Here’s a complete, minimal skill for a Django data pipeline setup:

django-pipeline-setup/
├── SKILL.md
└── scripts/
    └── validate_models.py

SKILL.md:

---
name: django-pipeline-setup
description: >
  Sets up Django data ingestion pipelines with models, management
  commands, and Celery tasks. Use when user asks to "create a pipeline",
  "set up data ingestion", "build a Django ETL (Extract, Transform, Load)", or mentions
  "management command" with data sources.
metadata:
  author: your-name
  version: 1.0.0
---

# Django Pipeline Setup

Creates production-ready data ingestion pipelines following
domain-driven design principles.

# Instructions

## Step 1: Define the Data Source
Ask the user for:
- Source name and type (API, CSV, S3, database)
- Update frequency (real-time, hourly, daily)
- Data schema or sample payload

## Step 2: Generate Models
Create Django models in the appropriate app:
- Use `TimeStampedModel` base class
- Add `source` and `ingestion_timestamp` fields
- Include proper indexes for query patterns
- Add `__str__` and `Meta.ordering`

Run validation:
```bash
python scripts/validate_models.py

Step 3: Create Management Command

Generate management/commands/ingest_{source_name}.py:

  • Idempotent execution (safe to re-run)
  • Proper logging with structlog
  • Error handling with retry logic
  • --dry-run flag support

Step 4: Set Up Celery Task

Create periodic task in tasks.py:

  • Match frequency to user’s requirements
  • Add @shared_task with bind=True for retries
  • Configure celery-beat schedule

Step 5: Verify

  • Run management command with --dry-run
  • Check model migrations generate cleanly
  • Verify Celery task registration

Examples

Example: CSV from S3

User says: “Set up a daily pipeline to ingest CSV files from S3”

Actions:

  1. Create DataSource model with S3 path field
  2. Create ingest_s3_csv management command using boto3
  3. Create Celery task scheduled for 2 AM daily
  4. Generate migration and verify

Troubleshooting

Models won’t migrate

Cause: Circular imports or missing app in INSTALLED_APPS Solution: Check import order, verify app registration

Celery task not discovered

Cause: Missing autodiscover_tasks() in celery.py Solution: Ensure app.autodiscover_tasks() is called in celery config


### Step 5: Use the Skill Creator

If you want to accelerate the process, the `skill-creator` skill is built into Claude.ai. Just say:

Use the skill-creator skill to help me build a skill for [your use case]


It will walk you through use case definition, generate properly formatted YAML frontmatter, suggest trigger phrases, and flag common issues. After building, you can ask it to review:

Review this skill and suggest improvements


The skill-creator helps you design and refine, but it doesn't run automated tests or produce quantitative evaluations, which is what we'll cover in the next step.

### Step 6: Upload and Test

**For Claude.ai:**
1. Zip your skill folder
2. Go to Settings → Capabilities → Skills
3. Click "Upload skill"
4. Select the zip file

**For Claude Code:**
Place the skill folder in the Claude Code skills directory.

**For API:**
Use the `/v1/skills` endpoint or add skills to Messages API requests via the `container.skills` parameter. Note: Skills in the API require the Code Execution Tool beta.

After upload, immediately test with your defined use cases. Start with the obvious triggers, then try paraphrased requests, then verify it doesn't fire on unrelated queries.

### Quick Debugging

If your skill doesn't trigger, ask Claude directly:

When would you use the [skill-name] skill?


Claude will quote the description back. This immediately reveals what's missing from your trigger phrases.